Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Schindl2014-10-29 11:32:59 +0000
committerTom Schindl2014-10-29 11:32:59 +0000
commita9c3370e352cef1f41b668f0be6c2fc11444649c (patch)
tree0d3f60254300b328486f128dba5acaf69ffea17c
parentb9d6a7dd08d66a5fa14ec59890c281a335f4534a (diff)
downloadorg.eclipse.efxclipse-a9c3370e352cef1f41b668f0be6c2fc11444649c.tar.gz
org.eclipse.efxclipse-a9c3370e352cef1f41b668f0be6c2fc11444649c.tar.xz
org.eclipse.efxclipse-a9c3370e352cef1f41b668f0be6c2fc11444649c.zip
Bug 444426 - [FXML] Add wizard to generate Controller from FXML-Files
-rwxr-xr-xbundles/tooling/org.eclipse.fx.ide.fxml/plugin.xml29
-rw-r--r--bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/ControllerGenerator.xtend68
-rw-r--r--bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/GenerateController.java372
-rwxr-xr-xbundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/editors/Util.java10
-rw-r--r--bundles/tooling/org.eclipse.fx.ide.ui/src/org/eclipse/fx/ide/ui/wizards/JDTElementFactory.java192
5 files changed, 666 insertions, 5 deletions
diff --git a/bundles/tooling/org.eclipse.fx.ide.fxml/plugin.xml b/bundles/tooling/org.eclipse.fx.ide.fxml/plugin.xml
index 4a05af117..c11159e81 100755
--- a/bundles/tooling/org.eclipse.fx.ide.fxml/plugin.xml
+++ b/bundles/tooling/org.eclipse.fx.ide.fxml/plugin.xml
@@ -111,4 +111,33 @@
<managedMarker markerType="org.eclipse.jdt.apt.core.compile.problem"/>
</compilationParticipant>
</extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:sourcePopupMenuId?after=sourceBegin">
+ <command
+ commandId="org.eclipse.fx.ide.fxml.generatecontroller"
+ label="Generate Controller"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="activeEditor">
+ <instanceof
+ value="org.eclipse.fx.ide.fxml.editors.FXMLEditor">
+ </instanceof>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.fx.ide.fxml.command.GenerateController"
+ id="org.eclipse.fx.ide.fxml.generatecontroller"
+ name="Generate a controller">
+ </command>
+ </extension>
</plugin>
diff --git a/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/ControllerGenerator.xtend b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/ControllerGenerator.xtend
new file mode 100644
index 000000000..9330cb946
--- /dev/null
+++ b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/ControllerGenerator.xtend
@@ -0,0 +1,68 @@
+package org.eclipse.fx.ide.fxml.command
+
+import org.eclipse.fx.ide.fxml.command.GenerateController.ControllerJDTElement
+import org.eclipse.fx.ide.model.IFXClass
+import java.util.HashSet
+import org.eclipse.fx.ide.model.IFXEventHandlerProperty
+import java.util.Map
+import java.util.HashMap
+
+class ControllerGenerator {
+ ControllerJDTElement d;
+ Map<String,String> abbrev = new HashMap
+
+ new(ControllerJDTElement d) {
+ this.d = d;
+ }
+
+ def generate() '''
+ package «d.packageFragment.elementName»;
+
+ import javafx.fxml.FXML;
+ «FOR e : d.entries.fold(new HashSet,[s,e|
+ var String fqn;
+ var String simple;
+
+ if( e.type instanceof IFXClass ) {
+ fqn = (e.type as IFXClass).FQN
+ simple = (e.type as IFXClass).simpleName
+ } else {
+ fqn = (e.type as IFXEventHandlerProperty).getEventTypeAsString(true)
+ simple = (e.type as IFXEventHandlerProperty).getEventTypeAsString(false)
+ }
+
+ if( ! abbrev.containsKey(fqn) ) {
+ if( ! abbrev.containsValue(simple) ) {
+ s.add(fqn)
+ }
+
+ abbrev.put(fqn,simple)
+ }
+
+
+ return s
+ ])»
+
+ import «e»;
+ «ENDFOR»
+
+ public class «d.name» {
+ «FOR f : d.entries.filter[e|e.type instanceof IFXClass]»
+ @FXML
+ private «abbrev.get((f.type as IFXClass).FQN)» «f.name»;
+ «ENDFOR»
+
+ «FOR f : d.entries.filter[e|e.type instanceof IFXEventHandlerProperty]»
+ «IF f.ownerId != null»
+ // Event Listener on «f.owner.simpleName»[#«f.ownerId»].«(f.type as IFXEventHandlerProperty).name»
+ «ELSE»
+ // Event Listener on «f.owner.simpleName».«(f.type as IFXEventHandlerProperty).name»
+ «ENDIF»
+ @FXML
+ public void «f.name.substring(1)»(«abbrev.get((f.type as IFXEventHandlerProperty).getEventTypeAsString(true))» event) {
+ // TODO Autogenerated
+ }
+ «ENDFOR»
+ }
+ '''
+} \ No newline at end of file
diff --git a/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/GenerateController.java b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/GenerateController.java
new file mode 100644
index 000000000..c9b87c592
--- /dev/null
+++ b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/command/GenerateController.java
@@ -0,0 +1,372 @@
+package org.eclipse.fx.ide.fxml.command;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.beans.BeanProperties;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.fx.ide.fxml.editors.Util;
+import org.eclipse.fx.ide.model.FXPlugin;
+import org.eclipse.fx.ide.model.IFXClass;
+import org.eclipse.fx.ide.model.IFXEventHandlerProperty;
+import org.eclipse.fx.ide.model.IFXProperty;
+import org.eclipse.fx.ide.ui.wizards.JDTElementFactory;
+import org.eclipse.fx.ide.ui.wizards.template.JDTElement;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jface.databinding.swt.IWidgetValueProperty;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * Handler to generate controller
+ */
+@SuppressWarnings("restriction")
+public class GenerateController extends AbstractHandler {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart editor = HandlerUtil.getActiveEditor(event);
+ ITextEditor textEditor = null;
+ if (editor instanceof ITextEditor)
+ textEditor = (ITextEditor) editor;
+ else {
+ Object o = editor.getAdapter(ITextEditor.class);
+ if (o != null)
+ textEditor = (ITextEditor) o;
+ }
+ if (textEditor != null) {
+ IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+ if (document != null && document instanceof IStructuredDocument) {
+ openDialog(textEditor, (IStructuredDocument) document);
+ }
+ }
+ return null;
+ }
+
+ private static void openDialog(ITextEditor arg0, IStructuredDocument document) {
+ List<ControllerEntry<IFXClass>> fields = new ArrayList<>();
+ List<ControllerEntry<IFXEventHandlerProperty>> methods = new ArrayList<>();
+
+ for (IStructuredDocumentRegion region : document.getStructuredDocumentRegions()) {
+ ITextRegionList textRegions = region.getRegions();
+
+ for (int i = 0; i < textRegions.size(); i++) {
+ ITextRegion textRegion = textRegions.get(i);
+ if (textRegion.getType() == DOMRegionContext.XML_TAG_OPEN) {
+ IndexedRegion treeNode = getNode(document, region.getStartOffset(textRegion));
+ if (treeNode == null) {
+ return;
+ }
+
+ IDOMNode node = (IDOMNode) treeNode;
+
+ IFXClass e = computeTagNameHelp(node);
+ if (e != null) {
+ NamedNodeMap nnm = node.getAttributes();
+ Map<String, IFXProperty> props = e.getAllProperties();
+ for (int j = 0; j < nnm.getLength(); j++) {
+ Node attribute = nnm.item(j);
+ if (attribute.getNodeName().equals("fx:id")) { //$NON-NLS-1$
+ fields.add(new ControllerEntry<>(attribute.getNodeValue(), e, e, attribute.getNodeValue()));
+ } else {
+ IFXProperty p = props.get(attribute.getNodeName());
+ if (p instanceof IFXEventHandlerProperty) {
+ String id = nnm.getNamedItem("fx:id") == null ? null : nnm.getNamedItem("fx:id").getNodeValue(); //$NON-NLS-1$//$NON-NLS-2$
+ methods.add(new ControllerEntry<>(id, e, (IFXEventHandlerProperty) p, attribute.getNodeValue()));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ControllerJDTElement clazz = new ControllerJDTElement();
+ if( arg0.getEditorInput() instanceof FileEditorInput ) {
+ FileEditorInput fi = (FileEditorInput) arg0.getEditorInput();
+ IFile file = fi.getFile();
+ IJavaProject jp = JavaCore.create(file.getProject());
+ try {
+ for( IPackageFragmentRoot r : jp.getPackageFragmentRoots() ) {
+ if( file.getFullPath().toString().startsWith(r.getPath().toString())) {
+ clazz.setFragmentRoot(r);
+ break;
+ }
+ }
+ } catch (JavaModelException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ try {
+ clazz.setPackageFragment(jp.findPackageFragment(file.getParent().getFullPath()));
+ } catch (JavaModelException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ clazz.setName(fi.getName().replace(".fxml", "")+"Controller"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ }
+
+ CreationDialog d = new CreationDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),clazz,fields,methods);
+ if( d.open() == Window.OK ) {
+ if( clazz.getFragmentRoot() != null ) {
+ IFile file = createFile(clazz);
+ if( ! file.exists() ) {
+ try( ByteArrayInputStream in = new ByteArrayInputStream(new ControllerGenerator(clazz).generate().toString().getBytes()) ) {
+ file.create(in, true, null);
+ } catch (Exception e) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Failed to create file", "Failure while create the controller file '"+e.getMessage()+"'");
+ }
+ } else {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "File already exists", "The controller file already exists. Updateing existing controllers is not supported!");
+ }
+ }
+ }
+ }
+
+ private static IFile createFile(ControllerJDTElement clazz) {
+ IPackageFragment fragment = clazz.getPackageFragment();
+ if (fragment != null) {
+ String cuName = clazz.getName() + ".java";
+ ICompilationUnit unit = fragment.getCompilationUnit(cuName);
+ IResource resource = unit.getResource();
+ return (IFile) resource;
+ } else {
+ String cuName = clazz.getName() + ".java";
+ IFolder p = (IFolder) clazz.getFragmentRoot().getResource();
+ return p.getFile(cuName);
+ }
+ }
+
+ static class CreationDialog extends TitleAreaDialog {
+ final List<ControllerEntry<IFXClass>> fields;
+ final List<ControllerEntry<IFXEventHandlerProperty>> methods;
+ final ControllerJDTElement clazz;
+
+ Image privateField = JavaPluginImages.DESC_FIELD_PRIVATE.createImage();
+ Image publicMethod = JavaPluginImages.DESC_MISC_PUBLIC.createImage();
+ private CheckboxTableViewer viewer;
+
+ public CreationDialog(Shell parentShell, ControllerJDTElement clazz, List<ControllerEntry<IFXClass>> fields, List<ControllerEntry<IFXEventHandlerProperty>> methods) {
+ super(parentShell);
+ this.clazz = clazz;
+ this.fields = fields;
+ this.methods = methods;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite container = (Composite) super.createDialogArea(parent);
+
+ Composite area = new Composite(container, SWT.NONE);
+ area.setLayoutData(new GridData(GridData.FILL_BOTH));
+ area.setLayout(new GridLayout(3, false));
+
+ DataBindingContext dbc = new DataBindingContext();
+
+ {
+ JDTElementFactory.createSourceFolderElement(area, dbc, this.clazz, ResourcesPlugin.getWorkspace().getRoot());
+ }
+
+ {
+ JDTElementFactory.createPackageElement(area, dbc, this.clazz);
+ }
+
+ {
+ Label l = new Label(area, SWT.NONE);
+ l.setText("Name:");
+
+ IWidgetValueProperty textProp = WidgetProperties.text(SWT.Modify);
+ Text t = new Text(area, SWT.BORDER);
+ t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ dbc.bindValue(textProp.observe(t), BeanProperties.value("name", String.class).observe(this.clazz)); //$NON-NLS-1$
+
+ @SuppressWarnings("unused")
+ Label label = new Label(area, SWT.NONE);
+ }
+
+ {
+ Label l = new Label(area, SWT.NONE);
+ l.setText("Fields && Methods");
+ l.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+ this.viewer = new CheckboxTableViewer(new Table(area, SWT.FULL_SELECTION|SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL|SWT.CHECK));
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint=200;
+ this.viewer.getTable().setLayoutData(gd);
+ this.viewer.setContentProvider(ArrayContentProvider.getInstance());
+ this.viewer.setLabelProvider(new StyledCellLabelProvider() {
+ @Override
+ public void update(ViewerCell cell) {
+ ControllerEntry<?> e = (ControllerEntry<?>) cell.getElement();
+ if( e.type instanceof IFXClass ) {
+ IFXClass c = ((IFXClass)e.type);
+ StyledString s = new StyledString(e.name);
+ s.append(" : "+ c.getSimpleName(), StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
+ cell.setText(s.getString());
+ cell.setStyleRanges(s.getStyleRanges());
+ cell.setImage(CreationDialog.this.privateField);
+ } else {
+ IFXEventHandlerProperty p = (IFXEventHandlerProperty) e.type;
+
+ StyledString s = new StyledString(e.name.substring(1));
+ s.append(" : " + e.owner.getSimpleName() + ( e.ownerId != null ? " [#" + e.ownerId + "]" : "" ) + " - " + p.getName() + "(" + p.getEventTypeAsString(false)+")", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+ cell.setText(s.getString());
+ cell.setStyleRanges(s.getStyleRanges());
+ cell.setImage(CreationDialog.this.publicMethod);
+ }
+ super.update(cell);
+ }
+ });
+
+ ArrayList<Object> combined = new ArrayList<>();
+ combined.addAll(this.fields);
+ combined.addAll(this.methods);
+ this.viewer.setInput(combined);
+ this.viewer.setAllChecked(true);
+ }
+
+ return container;
+ }
+
+ @Override
+ protected void okPressed() {
+ for( Object o : this.viewer.getCheckedElements() ) {
+ this.clazz.getEntries().add((ControllerEntry<?>) o);
+ }
+ super.okPressed();
+ }
+
+ @Override
+ public boolean close() {
+ this.privateField.dispose();
+ this.publicMethod.dispose();
+ return super.close();
+ }
+ }
+
+ static class ControllerEntry<T> {
+ final IFXClass owner;
+ final String ownerId;
+
+ final T type;
+ final String name;
+
+ public ControllerEntry(String ownerId, IFXClass owner,T type, String name) {
+ this.type = type;
+ this.owner = owner;
+ this.ownerId = ownerId;
+ this.name = name;
+ }
+ }
+
+ static class ControllerJDTElement extends JDTElement {
+ private List<ControllerEntry<?>> entries = new ArrayList<>();
+
+ public List<ControllerEntry<?>> getEntries() {
+ return this.entries;
+ }
+ }
+
+ private static IndexedRegion getNode(IDocument document, int documentOffset) {
+ IndexedRegion node = null;
+ IModelManager mm = StructuredModelManager.getModelManager();
+ IStructuredModel model = null;
+ if (mm != null)
+ model = mm.getExistingModelForRead(document);
+ try {
+ if (model != null) {
+ int lastOffset = documentOffset;
+ node = model.getIndexedRegion(documentOffset);
+ while (node == null && lastOffset >= 0) {
+ lastOffset--;
+ node = model.getIndexedRegion(lastOffset);
+ }
+ }
+ } finally {
+ if (model != null)
+ model.releaseFromRead();
+ }
+ return node;
+ }
+
+ private static IFXClass computeTagNameHelp(IDOMNode xmlnode) {
+ if (!Character.isLowerCase(xmlnode.getNodeName().charAt(0))) {
+ if (xmlnode.getNodeName().contains(".")) { //$NON-NLS-1$
+ String[] parts = xmlnode.getNodeName().split("\\."); //$NON-NLS-1$
+ IType ownerType = Util.findType(parts[0], xmlnode.getOwnerDocument());
+ if (ownerType != null) {
+ return FXPlugin.getClassmodel().findClass(ownerType.getJavaProject(), ownerType);
+
+ }
+ } else {
+ IType ownerType = Util.findType(xmlnode.getNodeName(), xmlnode.getOwnerDocument());
+ if (ownerType != null) {
+ return FXPlugin.getClassmodel().findClass(ownerType.getJavaProject(), ownerType);
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/editors/Util.java b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/editors/Util.java
index 28be47284..9289969d6 100755
--- a/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/editors/Util.java
+++ b/bundles/tooling/org.eclipse.fx.ide.fxml/src/org/eclipse/fx/ide/fxml/editors/Util.java
@@ -35,7 +35,7 @@ import org.w3c.dom.ProcessingInstruction;
public class Util {
private static final String FXML_NAMESPACE = "http://javafx.com/fxml";
private static final String FXML_NAMESPACE_1 = "http://javafx.com/fxml/1";
-
+
/**
* Check if the namespace in FXML
* @param value the namespace value
@@ -44,7 +44,7 @@ public class Util {
public static final boolean isFXMLNamespace(String value) {
return FXML_NAMESPACE.equals(value) || FXML_NAMESPACE_1.equals(value);
}
-
+
public static Attr getFXMLAttribute(Element e, String localName) {
Attr attribute = e.getAttributeNodeNS(FXML_NAMESPACE, localName);
if( attribute == null ) {
@@ -52,7 +52,7 @@ public class Util {
}
return attribute;
}
-
+
static IJavaProject findProject(Document xmlDoc) {
String baseLocation = ((IDOMNode) xmlDoc).getModel().getBaseLocation();
IFile f = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(baseLocation));
@@ -61,7 +61,7 @@ public class Util {
/**
* Get all imported types
- *
+ *
* @param xmlDoc
* the document
* @return list of imports
@@ -83,7 +83,7 @@ public class Util {
return imports;
}
- static IType findType(String name, Document xmlDoc) {
+ public static IType findType(String name, Document xmlDoc) {
IJavaProject jpProject = findProject(xmlDoc);
if (name.contains(".")) { //$NON-NLS-1$
diff --git a/bundles/tooling/org.eclipse.fx.ide.ui/src/org/eclipse/fx/ide/ui/wizards/JDTElementFactory.java b/bundles/tooling/org.eclipse.fx.ide.ui/src/org/eclipse/fx/ide/ui/wizards/JDTElementFactory.java
new file mode 100644
index 000000000..d7a24e894
--- /dev/null
+++ b/bundles/tooling/org.eclipse.fx.ide.ui/src/org/eclipse/fx/ide/ui/wizards/JDTElementFactory.java
@@ -0,0 +1,192 @@
+package org.eclipse.fx.ide.ui.wizards;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.UpdateValueStrategy;
+import org.eclipse.core.databinding.beans.BeanProperties;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.fx.ide.ui.wizards.AbstractJDTElementPage.PackageFragmentRootToStringConverter;
+import org.eclipse.fx.ide.ui.wizards.AbstractJDTElementPage.PackageFragmentToStringConverter;
+import org.eclipse.fx.ide.ui.wizards.template.JDTElement;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaModel;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
+import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
+import org.eclipse.jdt.ui.JavaElementComparator;
+import org.eclipse.jdt.ui.JavaElementLabelProvider;
+import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+
+public class JDTElementFactory {
+ public static void createSourceFolderElement(Composite parent, DataBindingContext dbc, JDTElement clazz, IWorkspaceRoot fWorkspaceRoot) {
+ Label l = new Label(parent, SWT.NONE);
+ l.setText("Source folder");
+
+ Text t = new Text(parent, SWT.BORDER);
+ t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ t.setEditable(false);
+ final Binding bd = dbc.bindValue(
+ WidgetProperties.text().observe(t),
+ BeanProperties.value("fragmentRoot").observe(clazz),
+ new UpdateValueStrategy(),
+ new UpdateValueStrategy().setConverter(new PackageFragmentRootToStringConverter())
+ );
+
+ Button b = new Button(parent, SWT.PUSH);
+ b.setText("Browse ...");
+ b.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IPackageFragmentRoot root = choosePackageRoot(parent.getShell(),clazz,fWorkspaceRoot);
+ if( root != null ) {
+ clazz.setFragmentRoot(root);
+ }
+ bd.updateModelToTarget(); //TODO Find out why this is needed
+ }
+ });
+ }
+
+ public static void createPackageElement(Composite parent, DataBindingContext dbc, JDTElement clazz) {
+ Label l = new Label(parent, SWT.NONE);
+ l.setText("Package");
+
+ Text t = new Text(parent, SWT.BORDER);
+ t.setEditable(false);
+ t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ final Binding bd = dbc.bindValue(
+ WidgetProperties.text().observe(t),
+ BeanProperties.value("packageFragment").observe(clazz),
+ new UpdateValueStrategy(),
+ new UpdateValueStrategy().setConverter(new PackageFragmentToStringConverter())
+ );
+
+ Button b = new Button(parent, SWT.PUSH);
+ b.setText("Browse ...");
+ b.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IPackageFragment fragment = choosePackage(parent.getShell(),clazz);
+ if( fragment != null ) {
+ clazz.setPackageFragment(fragment);
+ }
+ bd.updateModelToTarget(); //TODO Find out why this is needed
+ }
+ });
+ }
+
+ private static IPackageFragment choosePackage(Shell s, JDTElement clazz) {
+ IJavaElement[] packages= null;
+ try {
+ if (clazz.getFragmentRoot() != null && clazz.getFragmentRoot().exists()) {
+ packages= clazz.getFragmentRoot().getChildren();
+ }
+ } catch (JavaModelException e) {
+ e.printStackTrace();
+ }
+ if (packages == null) {
+ packages= new IJavaElement[0];
+ }
+
+ ElementListSelectionDialog dialog= new ElementListSelectionDialog(s, new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));
+ dialog.setIgnoreCase(false);
+ dialog.setTitle("Choose Package");
+ dialog.setMessage("Choose a Package");
+ dialog.setEmptyListMessage("You need to select a package");
+ dialog.setElements(packages);
+ dialog.setHelpAvailable(false);
+
+ IPackageFragment pack= clazz.getPackageFragment();
+ if (pack != null) {
+ dialog.setInitialSelections(new Object[] { pack });
+ }
+
+ if (dialog.open() == Window.OK) {
+ return (IPackageFragment) dialog.getFirstResult();
+ }
+ return null;
+ }
+
+ private static IPackageFragmentRoot choosePackageRoot(Shell shell, JDTElement clazz, IWorkspaceRoot fWorkspaceRoot) {
+ IJavaElement initElement= clazz.getFragmentRoot();
+ Class<?>[] acceptedClasses= new Class<?>[] { IPackageFragmentRoot.class, IJavaProject.class };
+ TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, false) {
+ public boolean isSelectedValid(Object element) {
+ try {
+ if (element instanceof IJavaProject) {
+ IJavaProject jproject= (IJavaProject)element;
+ IPath path= jproject.getProject().getFullPath();
+ return (jproject.findPackageFragmentRoot(path) != null);
+ } else if (element instanceof IPackageFragmentRoot) {
+ return (((IPackageFragmentRoot)element).getKind() == IPackageFragmentRoot.K_SOURCE);
+ }
+ return true;
+ } catch (JavaModelException e) {
+ JavaPlugin.log(e.getStatus()); // just log, no UI in validation
+ }
+ return false;
+ }
+ };
+
+ acceptedClasses= new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class };
+ ViewerFilter filter= new TypedViewerFilter(acceptedClasses) {
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (element instanceof IPackageFragmentRoot) {
+ try {
+ return (((IPackageFragmentRoot)element).getKind() == IPackageFragmentRoot.K_SOURCE);
+ } catch (JavaModelException e) {
+ JavaPlugin.log(e.getStatus()); // just log, no UI in validation
+ return false;
+ }
+ }
+ return super.select(viewer, parent, element);
+ }
+ };
+
+ StandardJavaElementContentProvider provider= new StandardJavaElementContentProvider();
+ ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
+ ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(shell, labelProvider, provider);
+ dialog.setValidator(validator);
+ dialog.setComparator(new JavaElementComparator());
+ dialog.setTitle(NewWizardMessages.NewContainerWizardPage_ChooseSourceContainerDialog_title);
+ dialog.setMessage(NewWizardMessages.NewContainerWizardPage_ChooseSourceContainerDialog_description);
+ dialog.addFilter(filter);
+ dialog.setInput(JavaCore.create(fWorkspaceRoot));
+ dialog.setInitialSelection(initElement);
+ dialog.setHelpAvailable(false);
+
+ if (dialog.open() == Window.OK) {
+ Object element= dialog.getFirstResult();
+ if (element instanceof IJavaProject) {
+ IJavaProject jproject= (IJavaProject)element;
+ return jproject.getPackageFragmentRoot(jproject.getProject());
+ } else if (element instanceof IPackageFragmentRoot) {
+ return (IPackageFragmentRoot)element;
+ }
+ return null;
+ }
+ return null;
+ }
+}

Back to the top