at.spardat.xma.gui.mapper.WidgetTreeProvider.java Source code

Java tutorial

Introduction

Here is the source code for at.spardat.xma.gui.mapper.WidgetTreeProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     s IT Solutions AT Spardat GmbH - initial API and implementation
 *******************************************************************************/

// @(#) $Id: WidgetTreeProvider.java 2715 2008-09-11 12:51:34Z s1462 $
package at.spardat.xma.gui.mapper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;

import at.spardat.xma.guidesign.CheckButton;
import at.spardat.xma.guidesign.DatePicker;
import at.spardat.xma.guidesign.HiddenWidget;
import at.spardat.xma.guidesign.IBDAttachable;
import at.spardat.xma.guidesign.NotebookPage;
import at.spardat.xma.guidesign.PageComposite;
import at.spardat.xma.guidesign.PushButton;
import at.spardat.xma.guidesign.RadioButton;
import at.spardat.xma.guidesign.XMACombo;
import at.spardat.xma.guidesign.XMAComponent;
import at.spardat.xma.guidesign.XMAComposite;
import at.spardat.xma.guidesign.XMAGroup;
import at.spardat.xma.guidesign.XMALabel;
import at.spardat.xma.guidesign.XMAList;
import at.spardat.xma.guidesign.XMAPage;
import at.spardat.xma.guidesign.XMASashForm;
import at.spardat.xma.guidesign.XMAScrolledComposite;
import at.spardat.xma.guidesign.XMASeperator;
import at.spardat.xma.guidesign.XMATabFolder;
import at.spardat.xma.guidesign.XMATable;
import at.spardat.xma.guidesign.XMATableColumn;
import at.spardat.xma.guidesign.XMAText;
import at.spardat.xma.guidesign.XMATree;
import at.spardat.xma.guidesign.XMAWidget;
import at.spardat.xma.guidesign.flex.IGeneratable;

/**
 * Implements Label- and ContentProvider for the widget tree viewer in the
 * <tt>MapperDialog</tt>.
 *
 * @author YSD, 12.07.2003 23:38:06
 */
public class WidgetTreeProvider extends LabelProvider implements ITreeContentProvider {

    private static boolean showLeftAttachSep = false;

    public static void setShowLeftAttachSep(boolean showLeftAttachSep_) {
        showLeftAttachSep = showLeftAttachSep_;
    }

    /**
     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
     */
    public Image getImage(Object element) {
        for (int i = 0; i < providers_.length; i++) {
            ClassBasedProv prov = providers_[i];
            if (prov.clazz_.isAssignableFrom(element.getClass()) && prov.imageName_ != null) {
                return MapperPlugin.getImage(prov.imageName_);
            }
        }
        return null;
    }

    /**
     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
     */
    public String getText(Object element) {
        for (int i = 0; i < providers_.length; i++) {
            ClassBasedProv prov = providers_[i];
            if (prov.clazz_.isAssignableFrom(element.getClass()) && prov.lProv_ != null) {
                return prov.lProv_.getLabel(element);
            }
        }
        return "";
    }

    /**
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
     */
    public void dispose() {
    }

    /**
     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
     */
    public Object[] getElements(Object inputElement) {
        return getChildren(inputElement);
    }

    /**
     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
     */
    public Object[] getChildren(Object parentElement) {
        for (int i = 0; i < navProviders_.length; i++) {
            NavProv np = navProviders_[i];
            if (np.clazz_.isAssignableFrom(parentElement.getClass())) {
                return np.getChilds(parentElement);
            }
        }
        return new Object[0];
    }

    /**
     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
     */
    public Object getParent(Object element) {
        return null;
    }

    /**
     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
     */
    public boolean hasChildren(Object element) {
        return getChildren(element).length > 0;
    }

    /**
     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }

    private static final Object[] EMPTY_OA = new Object[0];

    /**
     * Provides label and image information for the widget tree
     */
    private static ClassBasedProv[] providers_ = { new ClassBasedProv(XMAText.class, "text.gif", null),
            new ClassBasedProv(XMALabel.class, "label.gif", null),
            new ClassBasedProv(XMACombo.class, "combo.gif", null),
            new ClassBasedProv(CheckButton.class, "check.gif", null),
            new ClassBasedProv(DatePicker.class, "DatePicker.gif", null),
            new ClassBasedProv(PushButton.class, "pushButton.gif", null),
            new ClassBasedProv(RadioButton.class, "radio.gif", null),
            new ClassBasedProv(XMAGroup.class, "group.gif", null),
            new ClassBasedProv(XMAList.class, "list.gif", null),
            new ClassBasedProv(XMASeperator.class, "separator.gif", null),
            new ClassBasedProv(XMATable.class, "table.gif", null),
            new ClassBasedProv(XMATableColumn.class, "tableCol.gif", new LabelProv() {
                protected String provideLabel(Object o) {
                    return ((XMATableColumn) o).getNamInstance();
                }
            }), new ClassBasedProv(XMATree.class, "tree.gif", null),
            new ClassBasedProv(PageComposite.class, "page.gif", new LabelProv() {
                protected String provideLabel(Object o) {
                    return ((PageComposite) o).getPage().getNamInstance();
                }
            }), new ClassBasedProv(XMATabFolder.class, "tabFolder.gif", null),
            new ClassBasedProv(XMAWidget.class, null, new LabelProv() {
                protected String provideLabel(Object o) {
                    return ((XMAWidget) o).getNamInstance();
                }
            }), new ClassBasedProv(Object.class, "unknownWidget.gif", new LabelProv() {
                protected String provideLabel(Object o) {
                    return null;
                }
            }) };

    static {
        for (int i = 0; i < providers_.length; i++) {
            String image = providers_[i].imageName_;
            if (image != null) {
                MapperPlugin.registerImage(image, ImageDescriptor.createFromFile(WidgetTreeProvider.class, image));
            }
        }
    }

    private static class ClassBasedProv {
        public ClassBasedProv(Class clazz, String imageName, LabelProv lProv) {
            clazz_ = clazz;
            imageName_ = imageName;
            lProv_ = lProv;
        }

        public Class clazz_; // the class for which a label/image is to be provided
        public String imageName_; // optional name of an image
        public LabelProv lProv_; // returns a Label for a class
    }

    private static abstract class LabelProv {
        protected abstract String provideLabel(Object o);

        public String getLabel(Object o) {
            String result = null;
            String clName = o.getClass().getName();
            int lastPoint = clName.lastIndexOf('.');
            if (lastPoint >= 0)
                clName = clName.substring(lastPoint + 1);
            if (clName.endsWith("Impl"))
                clName = clName.substring(0, clName.length() - 4);
            if (clName.startsWith("XMA"))
                clName = clName.substring(3);
            String label = provideLabel(o);
            if (label == null || label.length() == 0) {
                result = "a " + clName;
            } else {
                result = label + "  :  " + clName;
            }
            if (showLeftAttachSep && o instanceof XMAWidget && !(o instanceof HiddenWidget)
                    && !(o instanceof XMAComposite)) {
                XMAWidget w = (XMAWidget) o;
                result += getSeperatorName(w);
                return result;

            }
            return result;
        }
    }

    private static String getSeperatorName(XMAWidget w) {
        String def = " <-Sep:";
        if (w.getFormData() != null && w.getFormData().getLeftAttach() != null
                && w.getFormData().getLeftAttach().getAttachElement() != null
                && w.getFormData().getLeftAttach().getAttachElement() instanceof XMASeperator && AttachHelper
                        .isLayoutSeparator((XMASeperator) w.getFormData().getLeftAttach().getAttachElement())) {
            XMASeperator sep = (XMASeperator) w.getFormData().getLeftAttach().getAttachElement();
            return def + sep.getNamInstance();
        }
        return def + "none";
    }

    /**
     * Provides navigational information for the widget tree
     */
    static NavProv[] navProviders_ = {

            // XMAComponent
            new NavProv(XMAComponent.class) {
                protected Collection provideChilds(Object o) {
                    Iterator pageIter = ((XMAComponent) o).getPage().iterator();
                    ArrayList pageComposites = new ArrayList();
                    while (pageIter.hasNext()) {
                        XMAPage p = (XMAPage) pageIter.next();
                        //xma flex: don't show simple layouts
                        if (p.getComposite() != null && !p.getComposite().isYnSimpleLayout())
                            pageComposites.add(p.getComposite());
                    }
                    return pageComposites;
                }
            },

            //        // XMAPage
            //        new NavProv (XMAPage.class) {
            //            protected Collection provideChilds(Object o) {
            //                XMAPage         p = ((XMAPage)o);
            //                PageComposite   pc = p.getComposite();
            //                if (pc == null) return null;
            //                return pc.getControls();
            //            }
            //        },

            // XMAComposite
            new NavProv(XMAComposite.class) {
                protected Collection provideChilds(Object o) {
                    ArrayList controls = new ArrayList();
                    XMAComposite c = ((XMAComposite) o);
                    Iterator cIter = c.getControls().iterator();
                    while (cIter.hasNext()) {
                        Object control = cIter.next();
                        // ignore labels and separators
                        if (control instanceof XMALabel || control instanceof XMASeperator)
                            continue;
                        //                  xma flex: don't show simple layouts
                        if (control instanceof XMAComposite && ((XMAComposite) control).isYnSimpleLayout())
                            continue;
                        // xma flex ignore flex generated controls
                        if (control instanceof IGeneratable && ((IGeneratable) control).isYnGenerated())
                            continue;
                        // xma flex ignore controls which are mapped to generated bd
                        if (control instanceof IBDAttachable && ((IBDAttachable) control).getDataAttribute() != null
                                && ((IBDAttachable) control).getDataAttribute().getBdObject().isYnGenerated())
                            continue;
                        // if the control is an XMAScrolledComposite, take the inner composite
                        if (control instanceof XMAScrolledComposite) {
                            XMAScrolledComposite sc = (XMAScrolledComposite) control;
                            XMAComposite comp = sc.getInnerComp();
                            if (comp != null)
                                controls.add(comp);
                        } else {
                            controls.add(control);
                        }
                    }
                    //if you want to sort the control lecically ordered from start
                    //Collections.sort(controls, new WidgetComparator());
                    return controls;
                }
            },

            // XMATable
            new NavProv(XMATable.class) {
                protected Collection provideChilds(Object o) {
                    XMATable t = (XMATable) o;
                    ArrayList controls = new ArrayList(t.getColumn().size());
                    Iterator cIter = t.getColumn().iterator();
                    while (cIter.hasNext()) {
                        Object control = cIter.next();
                        // xma flex ignore controls which are mapped to generated bd
                        if (control instanceof IBDAttachable && ((IBDAttachable) control).getDataAttribute() != null
                                && ((IBDAttachable) control).getDataAttribute().getBdObject().isYnGenerated())
                            continue;
                        controls.add(control);
                    }
                    return controls;
                }
            },

            // XMASashForm
            new NavProv(XMASashForm.class) {
                protected Collection provideChilds(Object o) {
                    XMASashForm s = ((XMASashForm) o);
                    ArrayList leftAndRight = new ArrayList();
                    if (s.getLeftEl() != null)
                        leftAndRight.add(s.getLeftEl());
                    if (s.getRightEl() != null)
                        leftAndRight.add(s.getRightEl());
                    return leftAndRight;
                }
            },

            // XMATabFolder
            new NavProv(XMATabFolder.class) {
                protected Collection provideChilds(Object o) {
                    ArrayList pageComposites = new ArrayList();
                    XMATabFolder t = ((XMATabFolder) o);
                    Iterator iter = t.getNbPage().iterator();
                    while (iter.hasNext()) {
                        NotebookPage page = (NotebookPage) iter.next();
                        if (page.getComposite() != null && !page.getComposite().isYnSimpleLayout())
                            pageComposites.add(page.getComposite());
                    }
                    return pageComposites;
                }
            },

    };

    private static abstract class NavProv {
        public Class clazz_;

        public NavProv(Class clazz) {
            clazz_ = clazz;
        }

        protected abstract Collection provideChilds(Object o);

        public Object[] getChilds(Object o) {
            Collection childs = provideChilds(o);
            if (childs == null || childs.size() == 0)
                return EMPTY_OA;
            Object[] result = new Object[childs.size()];
            childs.toArray(result);
            return result;
        }
    }

    /**
     * Orders XMAWidgets
     *
     * @author YSD, 05.02.2004
     */
    private static class WidgetComparator implements Comparator {
        /**
         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
         */
        public int compare(Object o1, Object o2) {
            XMAWidget w1 = (XMAWidget) o1;
            XMAWidget w2 = (XMAWidget) o2;
            String w1Name = w1.getNamInstance();
            String w2Name = w2.getNamInstance();
            if (w1Name == null)
                w1Name = "";
            if (w2Name == null)
                w2Name = "";
            return w1Name.compareToIgnoreCase(w2Name);
        }

    }

}