Java tutorial
/******************************************************************************* * 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()]); } }