at.spardat.xma.guidesign.presentation.XMAPropertyDescriptor.java Source code

Java tutorial

Introduction

Here is the source code for at.spardat.xma.guidesign.presentation.XMAPropertyDescriptor.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: XMAPropertyDescriptor.java 6948 2010-12-03 17:53:48Z laslovd $
 *
 *
 *
 *
 *
 */
package at.spardat.xma.guidesign.presentation;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.tools.ant.types.resources.Files;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.ui.celleditor.ExtendedComboBoxCellEditor;
import org.eclipse.emf.common.ui.celleditor.ExtendedDialogCellEditor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog;
import org.eclipse.emf.edit.ui.provider.PropertyDescriptor;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;

import at.spardat.xma.guidesign.CustomStylesCollection;
import at.spardat.xma.guidesign.EmbeddedPage;
import at.spardat.xma.guidesign.IImageUrl;
import at.spardat.xma.guidesign.IWidgetWithLabel;
import at.spardat.xma.guidesign.NotebookPage;
import at.spardat.xma.guidesign.PageComposite;
import at.spardat.xma.guidesign.PushButton;
import at.spardat.xma.guidesign.ValidInState;
import at.spardat.xma.guidesign.XMAComponent;
import at.spardat.xma.guidesign.XMAComposite;
import at.spardat.xma.guidesign.XMAContainer;
import at.spardat.xma.guidesign.XMADialogPage;
import at.spardat.xma.guidesign.XMAFormData;
import at.spardat.xma.guidesign.XMAGroup;
import at.spardat.xma.guidesign.XMALabel;
import at.spardat.xma.guidesign.XMAPage;
import at.spardat.xma.guidesign.XMAPagingControl;
import at.spardat.xma.guidesign.XMATable;
import at.spardat.xma.guidesign.XMAWidget;
import at.spardat.xma.guidesign.plugin.GUIDesignerPlugin;
import at.spardat.xma.guidesign.presentation.dialog.customstyle.CustomStyleDialog;
import at.spardat.xma.guidesign.presentation.dialog.formdata.FormDataDialog;
import at.spardat.xma.guidesign.presentation.dialog.validator.ValidatorDialog;

/**
 *
 *
 * @author S1462
 * @since guidesign.editor 1.0
 */
public class XMAPropertyDescriptor extends PropertyDescriptor {
    /**
     * This keeps track of the editing domain that is used to track all changes to the model.
     */
    //private AdapterFactoryEditingDomain editingDomain;

    /**
     * This is the one adapter factory used for providing views of the model.
     */
    //private ComposedAdapterFactory adapterFactory;

    /**
     * Holds a reference to the active editor
     */
    private GuidesignEditor editor;

    /**
     *
     * @param _editor
     */
    public void setEditor(GuidesignEditor _editor) {
        editor = _editor;
    }

    /**
     *
     * @param _editingDomain
     */
    //    public void setEditingDomain (AdapterFactoryEditingDomain _editingDomain) {
    ////        editingDomain = _editingDomain;
    //    }

    /**
     *
     * @param adapterFactory
     */
    //    public void setAdapterFactory (ComposedAdapterFactory _adapterFactory) {
    ////        adapterFactory = _adapterFactory;
    //    }

    /**
     * @param object
     * @param itemPropertyDescriptor
     */
    public XMAPropertyDescriptor(Object object, IItemPropertyDescriptor itemPropertyDescriptor) {
        super(object, itemPropertyDescriptor);
    }

    /**
     * copied from org.eclipse.emf.edit.ui.provider.PropertyDescriptor and adapted to xma
     * needs.
     * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
     */
    public CellEditor createPropertyEditor(Composite composite) {
        if (!itemPropertyDescriptor.canSetProperty(object)) {
            //an editor is only for setable features needed
            return null;
        }
        CellEditor result = null;
        final Object genericFeature = itemPropertyDescriptor.getFeature(object);
        if (genericFeature instanceof EReference) {
            //case of 1:1 references
            final EReference eOpRef = ((EReference) genericFeature).getEOpposite();
            if (eOpRef != null && eOpRef.getUpperBound() == 1) {
                //handle special references with special editors
                final EReference eRef = (EReference) genericFeature;
                if (eOpRef.getContainerClass().isAssignableFrom(XMAFormData.class)) {
                    // FormData Dialog attribute is selected
                    result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                        protected Object openDialogBox(Control cellEditorWindow) {
                            FormDataDialog dialog = new FormDataDialog(cellEditorWindow.getShell(),
                                    (EObject) object, eRef, getDisplayName(), editor);
                            dialog.open();
                            return dialog.getResult();
                        }
                    };
                    return result;
                }
                if (eOpRef.getContainerClass().isAssignableFrom(ValidInState.class)) {
                    // Validator in State Dialog attribute is selected
                    result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                        protected Object openDialogBox(Control cellEditorWindow) {
                            ValidatorDialog dialog = new ValidatorDialog(cellEditorWindow.getShell(),
                                    (EObject) object, eRef, getDisplayName(), editor);
                            dialog.open();
                            return dialog.getResult();
                        }
                    };
                    return result;
                } else if (eOpRef.getContainerClass().isAssignableFrom(CustomStylesCollection.class)) {
                    // Custom Styles in State Dialog attribute is selected
                    result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                        protected Object openDialogBox(Control cellEditorWindow) {
                            CustomStyleDialog dialog = new CustomStyleDialog(cellEditorWindow.getShell(),
                                    (EObject) object, eRef, getDisplayName(), editor);
                            dialog.open();
                            return dialog.getResult();
                        }
                    };
                    return result;
                }
            }
        }
        if (genericFeature instanceof EReference[]) {
            // don't know what case this is --> is generated
            result = new ExtendedComboBoxCellEditor(composite,
                    new ArrayList(itemPropertyDescriptor.getChoiceOfValues(object)), getLabelProvider(), true);
        } else if (genericFeature instanceof EStructuralFeature) {
            //case for attributes and references
            final EStructuralFeature feature = (EStructuralFeature) genericFeature;
            final EClassifier eType = ((EStructuralFeature) feature).getEType();
            final Collection choiceOfValues = getChoiceOfValues(feature);
            if (choiceOfValues != null) {
                //there a selection list available (f.e. enums)
                if (feature.isMany() && object instanceof EObject) {
                    //for multivalued references
                    boolean valid = true;
                    for (Iterator i = choiceOfValues.iterator(); i.hasNext();) {
                        Object choice = i.next();
                        if (!eType.isInstance(choice)) {
                            // --> from the original code ...
                            valid = false;
                            break;
                        }
                    }
                    if (valid) {
                        result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                            protected Object openDialogBox(Control cellEditorWindow) {
                                FeatureEditorDialog dialog = new FeatureEditorDialog(cellEditorWindow.getShell(),
                                        getLabelProvider(), (EObject) object, feature, getDisplayName(),
                                        new ArrayList(choiceOfValues));
                                dialog.open();
                                return dialog.getResult();
                            }
                        };
                    }
                }

                if (result == null) {
                    //editor for an enum or reference selections
                    result = new ExtendedComboBoxCellEditor(composite, new ArrayList(choiceOfValues),
                            getLabelProvider(), true);
                }
                //choice of values is null
            } else if (eType instanceof EDataType) {
                //an attribute in the model with a DataType
                EDataType eDataType = (EDataType) eType;
                if (eDataType.isSerializable()) {
                    //to show the value in the property sheet
                    if (feature.isMany() && object instanceof EObject) {
                        //editor for multivalued attributes
                        result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                            protected Object openDialogBox(Control cellEditorWindow) {
                                FeatureEditorDialog dialog = new FeatureEditorDialog(cellEditorWindow.getShell(),
                                        getLabelProvider(), (EObject) object, feature, getDisplayName(), null);
                                dialog.open();
                                return dialog.getResult();
                            }
                        };
                    } else if (feature.getName().equals("uriImage")) {
                        //editor for Image Uris
                        result = new ExtendedDialogCellEditor(composite, getLabelProvider()) {
                            protected Object openDialogBox(Control cellEditorWindow) {
                                FileDialog dialog = new FileDialog(cellEditorWindow.getShell(), SWT.OPEN);
                                String[] filter = new String[] { "*.gif", "*.png", "*.bmp", "*.jpg", "*.jpeg" };
                                dialog.setFilterExtensions(filter);
                                final String uriImage = ((IImageUrl) object).getUriImage();
                                if (uriImage != null && !uriImage.equals("")) {
                                    String path = searchUirInSourceFolders(uriImage);
                                    File file = new File(path);
                                    if (file.exists()) {
                                        URI uri = URI.createFileURI(path);
                                        dialog.setFilterPath(path);
                                        dialog.setFileName(uri.lastSegment());
                                    }
                                } else {
                                    dialog.setFilterPath(getResourceSourceFolder());
                                }
                                String dialogResult = dialog.open();
                                if (dialogResult != null) {
                                    //files of an open dialog have to exist!
                                    //calculate the lenght of the projectpath
                                    String retValue = mkClasspathUri(dialogResult);
                                    return retValue;
                                }
                                //null will not be delegated through the framework's DialogCellEditor
                                // it is the only possibility to remove an entry
                                return uriImage;
                            }

                        };
                        return result;
                    } else if (eDataType == EcorePackage.eINSTANCE.getEBoolean()
                            || eDataType == EcorePackage.eINSTANCE.getEBooleanObject()) {
                        //editor for boolean attribute
                        result = new ExtendendCheckboxCellEditor(composite);
                    } else if (eDataType == EcorePackage.eINSTANCE.getEInt()
                            || eDataType == EcorePackage.eINSTANCE.getEIntegerObject()) {
                        //editor for integer attribute
                        result = new ExtendedIntegerCellEditor(composite, editor);
                    } else {
                        //editor for other datatypes
                        result = new ExtendedEDataTypeCellEditor(eDataType, composite);
                    }
                }
            }
        }
        return result;
    }

    /**
     * Calculates a selection list for a combo cell dependend of the selected
     * property
     * @param feature of the property
     * @return a collection of selectionvalues
     */
    private Collection getChoiceOfValues(EStructuralFeature feature) {
        if (object instanceof XMALabel && feature.getName().equals("labelWidget")) {
            return calcWidgetWithLabels(((XMALabel) object).getParentcomp().getControls());
        }
        if (object instanceof IWidgetWithLabel && feature.getName().equals("label")) {
            return calcLabels(((IWidgetWithLabel) object).getParentcomp().getControls());
        }
        if (object instanceof XMADialogPage && feature.getName().equals("initFocusEl")) {
            PageComposite comp = ((XMAPage) object).getComposite();
            if (comp != null) {
                return calcControls(comp.getControls());
            } else {
                return Collections.EMPTY_LIST;
            }
        }
        if (object instanceof NotebookPage && feature.getName().equals("defaultButton")) {
            PageComposite comp = ((XMAPage) object).getComposite();
            if (comp != null) {
                return calcPushButtons(comp.getControls());
            } else {
                return Collections.EMPTY_LIST;
            }
        }
        if (object instanceof XMAContainer && feature.getName().equals("embeddedPage")) {
            XMAComponent comp = ((XMAContainer) object).getComponent();
            EList pages = comp.getPage();
            return calcEmbeddedPages(pages);
        }
        if (object instanceof XMAPagingControl && feature.getName().equals("table")) {
            XMAPagingControl pgCtrl = (XMAPagingControl) object;
            return calcContainedTables(pgCtrl.getDialogPage().getComposite().getControls());
        }
        return itemPropertyDescriptor.getChoiceOfValues(object);
    }

    private List<XMATable> calcContainedTables(EList eList) {
        List<XMATable> returnList = new ArrayList<XMATable>(1);
        for (Object object : eList) {
            if (object instanceof XMATable) {
                returnList.add((XMATable) object);
            } else if (object instanceof XMAComposite) {
                List<XMATable> subList = calcContainedTables(((XMAComposite) object).getControls());
                returnList.addAll(subList);
            } else if (object instanceof XMAGroup) {
                List<XMATable> subList = calcContainedTables(((XMAGroup) object).getControls());
                returnList.addAll(subList);
            }
        }
        return returnList;
    }

    /**
     * calculates all embedded pages
     * @param container
     * @return a list of embedde pages of the actual component
     */
    private Collection calcEmbeddedPages(EList list) {
        List returnList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            XMAPage page = (XMAPage) iter.next();
            if (page instanceof EmbeddedPage) {
                returnList.add(page);
            }
        }
        return returnList;
    }

    /**
     * calculates recursively all widgets
     * @param list
     * @return
     */
    private Collection calcControls(EList list) {
        List returnList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            XMAWidget widget = (XMAWidget) iter.next();
            if (widget instanceof XMAComposite) {
                Collection compCol = calcControls(((XMAComposite) widget).getControls());
                if (compCol != null) {
                    returnList.addAll(compCol);
                }
            } else {
                returnList.add(widget);
            }
        }
        return returnList;
    }

    /**
     * calculates recursively all buttons
     * @param list
     * @return
     */
    private Collection calcWidgetWithLabels(EList list) {
        List returnList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            XMAWidget widget = (XMAWidget) iter.next();
            if (widget instanceof XMAComposite) {
                Collection compCol = calcWidgetWithLabels(((XMAComposite) widget).getControls());
                if (compCol != null) {
                    returnList.addAll(compCol);
                }
            } else if (widget instanceof IWidgetWithLabel) {
                returnList.add(widget);
            }
        }
        return returnList;
    }

    /**
     * calculates recursively all buttons
     * @param list
     * @return
     */
    private Collection calcLabels(EList list) {
        List returnList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            XMAWidget widget = (XMAWidget) iter.next();
            if (widget instanceof XMAComposite) {
                Collection compCol = calcLabels(((XMAComposite) widget).getControls());
                if (compCol != null) {
                    returnList.addAll(compCol);
                }
            } else if (widget instanceof XMALabel) {
                returnList.add(widget);
            }
        }
        return returnList;
    }

    /**
     * calculates recursively all buttons
     * @param list
     * @return
     */
    private Collection calcPushButtons(EList list) {
        List returnList = new ArrayList();
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            XMAWidget widget = (XMAWidget) iter.next();
            if (widget instanceof XMAComposite) {
                Collection compCol = calcPushButtons(((XMAComposite) widget).getControls());
                if (compCol != null) {
                    returnList.addAll(compCol);
                }
            } else if (widget instanceof PushButton) {
                returnList.add(widget);
            }
        }
        return returnList;
    }

    private String mkClasspathUri(String path) {
        String pathFS = new File(path).getAbsolutePath();
        String[] sourceFolders = getSourceFolderStrings();
        for (String srcFolder : sourceFolders) {
            srcFolder = new File(srcFolder).getAbsolutePath();
            if (pathFS.startsWith(srcFolder)) {
                pathFS = pathFS.substring(srcFolder.length() + 1);
                pathFS = pathFS.replace('\\', '/');
                return pathFS;
            }
        }
        return path.replace('\\', '/');
    }

    private String getResourceSourceFolder() {
        return getResourceSourceFolder(getSourceFolderStrings());
    }

    private String getResourceSourceFolder(String[] sourceFolders) {
        String srcMainResources = null;
        String srcMainJava = null;
        String src = null;
        for (String srcFolder : sourceFolders) {
            String s = srcFolder.replace('\\', '/');
            s = s.toLowerCase();
            if (s.endsWith("src/main/resources")) {
                srcMainResources = srcFolder;
            } else if (s.endsWith("src/main/java")) {
                srcMainJava = srcFolder;
            } else if (s.endsWith("src")) {
                src = srcFolder;
            }
        }
        if (srcMainResources != null)
            return srcMainResources;
        if (srcMainJava != null)
            return srcMainJava;
        if (src != null)
            return src;
        return File.listRoots()[0].getAbsolutePath();
    }

    private String searchUirInSourceFolders(String uriImage) {
        String[] sourceFolders = getSourceFolderStrings();
        for (String srcFolder : sourceFolders) {
            File f = new File(srcFolder, uriImage);
            if (f.exists())
                return f.getAbsolutePath();
        }
        return new File(getResourceSourceFolder(sourceFolders), uriImage).getAbsolutePath();
    }

    private String[] getSourceFolderStrings() {
        IProject project = editor.getResourceFile().getProject();
        File workspaceLocation = project.getWorkspace().getRoot().getLocation().toFile();
        IJavaProject jp = JavaCore.create(project);
        IClasspathEntry[] javacp;
        try {
            javacp = jp.getResolvedClasspath(true);
        } catch (JavaModelException e) {
            GUIDesignerPlugin.INSTANCE.log(e);
            return new String[] { project.getLocation().toString() + "/src" };
        }
        ArrayList<String> result = new ArrayList<String>();
        for (IClasspathEntry classpathEntry : javacp) {
            if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                File f = new File(workspaceLocation, classpathEntry.getPath().toString());
                String s = f.getAbsolutePath();
                result.add(s);
            }
        }
        return result.toArray(new String[result.size()]);
    }
}