emf forms framework reworked to be compatible with Eclipse 3.4
diff --git a/modeling/features/org.eclipse.pde.ds-feature/feature.xml b/modeling/features/org.eclipse.pde.ds-feature/feature.xml
index e721799..158be64 100644
--- a/modeling/features/org.eclipse.pde.ds-feature/feature.xml
+++ b/modeling/features/org.eclipse.pde.ds-feature/feature.xml
@@ -74,4 +74,11 @@
version="0.0.0"
unpack="false"/>
+ <plugin
+ id="org.eclipse.pde.emfforms.validation_35"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
</feature>
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/.project b/modeling/plugins/org.eclipse.pde.emfforms/.project
index 6702fec..c861388 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/.project
+++ b/modeling/plugins/org.eclipse.pde.emfforms/.project
@@ -25,6 +25,11 @@
<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
index 3589335..f73d918 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
+++ b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
@@ -16,7 +16,10 @@
Bundle-Localization: plugin
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.pde.emfforms.editor,
+ org.eclipse.pde.emfforms.editor.actions,
org.eclipse.pde.emfforms.internal;x-internal:=true,
+ org.eclipse.pde.emfforms.internal.actions;x-internal:=true,
org.eclipse.pde.emfforms.internal.editor;x-internal:=true,
org.eclipse.pde.emfforms.internal.validation;x-internal:=true
Import-Package: org.eclipse.core.resources
+Service-Component: OSGI-INF/*.xml
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml b/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml
new file mode 100644
index 0000000..5f3ead7
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0" immediate="true" name="org.eclipse.pde.emfforms.validation_34">
+ <implementation class="org.eclipse.pde.emfforms.internal.validation.ValidatingService34"/>
+ <service>
+ <provide interface="org.eclipse.pde.emfforms.editor.ValidatingService"/>
+ </service>
+ <property name="service.ranking" type="Integer" value="10"/>
+</scr:component>
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/build.properties b/modeling/plugins/org.eclipse.pde.emfforms/build.properties
index d14ceee..e44c086 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/build.properties
+++ b/modeling/plugins/org.eclipse.pde.emfforms/build.properties
@@ -1,8 +1,8 @@
-source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.properties,\
icons/,\
- plugin.xml
-
\ No newline at end of file
+ plugin.xml,\
+ OSGI-INF/
+source.. = src/
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
index 5960900..80d4a04 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
@@ -8,7 +8,7 @@
* Contributors:
* Anyware Technologies - initial API and implementation
*
- * $Id: EmfFormEditor.java,v 1.15 2009/07/18 14:42:27 bcabe Exp $
+ * $Id: EmfFormEditor.java,v 1.16 2009/07/18 20:27:34 bcabe Exp $
*/
package org.eclipse.pde.emfforms.editor;
@@ -700,6 +700,7 @@
// Select the root object in the view.
contentOutlineViewer.setSelection(new StructuredSelection(getEditingDomain().getResourceSet().getResources().get(0)), true);
}
+
}
@Override
@@ -723,7 +724,14 @@
contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
// This ensures that we handle selections correctly.
public void selectionChanged(SelectionChangedEvent event) {
- handleContentOutlineSelection(event.getSelection());
+ handleContentOutlineSelection(event.getSelection(), getViewer());
+ }
+ });
+
+ addSelectionChangedListener(new ISelectionChangedListener() {
+ // This ensures that we handle selections correctly.
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleContentOutlineSelection(event.getSelection(), contentOutlineViewer);
}
});
}
@@ -734,24 +742,10 @@
/**
* This deals with how we want selection in the outline to affect the other views.
*/
- public void handleContentOutlineSelection(ISelection selection) {
- if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
- Iterator<?> selectedElements = ((IStructuredSelection) selection).iterator();
- if (selectedElements.hasNext()) {
- // Get the first selected element.
- Object selectedElement = selectedElements.next();
-
- // If it's the selection viewer, then we want it to select the same selection as this selection.
- if (getViewer() != null) {
- ArrayList<Object> selectionList = new ArrayList<Object>();
- selectionList.add(selectedElement);
- while (selectedElements.hasNext()) {
- selectionList.add(selectedElements.next());
- }
-
- // Set the selection to the widget.
- getViewer().setSelection(new StructuredSelection(selectionList));
- }
+ public void handleContentOutlineSelection(ISelection selection, Viewer viewerToSnych) {
+ if (!selection.isEmpty() && selection instanceof IStructuredSelection && viewerToSnych != null) {
+ if (((IStructuredSelection) selection).getFirstElement() != ((IStructuredSelection) viewerToSnych.getSelection()).getFirstElement()) {
+ viewerToSnych.setSelection(new StructuredSelection(((IStructuredSelection) selection).getFirstElement()));
}
}
}
@@ -848,7 +842,7 @@
if (eObject != null && (getEditingDomain() instanceof AdapterFactoryEditingDomain)) {
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditingDomain();
if (getViewer() != null) {
- getViewer().setSelection(new StructuredSelection(Collections.singleton(AdapterFactoryEditingDomain.getWrapper(eObject, editingDomain)).toArray()));
+ getViewer().setSelection(new StructuredSelection(Collections.singleton(editingDomain.getWrapper(eObject)).toArray()));
}
}
}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
index dd57271..0cffd66 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
@@ -8,20 +8,30 @@
* Contributors:
* Anyware Technologies - initial API and implementation
*
- * $Id: EmfMasterDetailBlock.java,v 1.10 2009/07/18 20:26:56 bcabe Exp $
+ * $Id: EmfMasterDetailBlock.java,v 1.11 2009/07/28 16:19:11 bcabe Exp $
*/
package org.eclipse.pde.emfforms.editor;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.observable.value.IValueChangeListener;
+import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
+import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.ui.dnd.*;
import org.eclipse.emf.edit.ui.provider.*;
import org.eclipse.jface.action.*;
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.*;
+import org.eclipse.pde.emfforms.internal.actions.RemoveAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IEditorActionBarContributor;
@@ -35,12 +45,16 @@
public abstract class EmfMasterDetailBlock extends MasterDetailsBlock implements IDetailsPageProvider, IMenuListener {
protected EmfFormEditor<?> parentEditor;
- protected boolean useGenericAddButton = true;
+ protected boolean useGenericButton = false;
+ protected boolean useGenericSectionToolBar = true;
+
private String title;
private TreeViewer treeViewer;
private Button addButton;
private Button removeButton;
+ private ToolBarManager toolBarManager;
+
public EmfMasterDetailBlock(EmfFormEditor<?> editor, String title) {
this.title = title;
this.parentEditor = editor;
@@ -58,22 +72,37 @@
section.marginHeight = 5;
Composite client = toolkit.createComposite(section, SWT.WRAP);
- GridLayoutFactory.fillDefaults().numColumns(2).applyTo(client);
+ GridLayoutFactory.fillDefaults().numColumns(useGenericButton ? 2 : 1).applyTo(client);
- FilteredTree ft = new FilteredTree(client, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter(), true);
+ FilteredTree ft = new FilteredTree(client, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter());
treeViewer = ft.getViewer();
- Composite buttonComposite = new Composite(client, SWT.NONE);
- GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttonComposite);
+ //Buttons
+ if (useGenericButton) {
+ Composite buttonComposite = new Composite(client, SWT.NONE);
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttonComposite);
- if (useGenericAddButton)
- addButton = createButton(buttonComposite, "Add...");
+ addButton = createButton(buttonComposite, "Add"); //$NON-NLS-1$
+ removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
- createCustomAddButtons(buttonComposite);
+ createCustomButtons(buttonComposite);
+ GridDataFactory.fillDefaults().grab(false, false).applyTo(buttonComposite);
+ }
- removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
+ //SectionToolBar
+ final RemoveAction removeAction = new RemoveAction(this);
- GridDataFactory.fillDefaults().grab(false, false).applyTo(buttonComposite);
+ if (useGenericSectionToolBar) {
+ toolBarManager = PDEFormToolkit.createSectionToolBarManager(section);
+ Action addAction = createCustomToolbarAddAction();
+ if (addAction != null) {
+ toolBarManager.add(addAction);
+ }
+
+ toolBarManager.add(removeAction);
+ toolBarManager.update(true);
+ section.setTextClient(toolBarManager.getControl());
+ }
treeViewer.setContentProvider(new AdapterFactoryContentProvider(parentEditor.getAdapterFactory()));
treeViewer.setLabelProvider(new DecoratingLabelProvider(new AdapterFactoryLabelProvider(parentEditor.getAdapterFactory()), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
@@ -99,11 +128,68 @@
}
});
+ // add +/- key shortcuts
+ treeViewer.getTree().addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == Action.findKeyCode("DELETE")) { //$NON-NLS-1$
+ removeAction.run();
+ }
+ }
+ });
+
+ if (useGenericButton) {
+
+ DataBindingContext bindingContext = new DataBindingContext();
+
+ //Enable button when the tree selection is not empty
+ bindingContext.bindValue(ViewersObservables.observeSingleSelection(getTreeViewer()), SWTObservables.observeEnabled(getRemoveButton()), new EMFUpdateValueStrategy() {
+ /**
+ * @see org.eclipse.core.databinding.UpdateValueStrategy#convert(java.lang.Object)
+ */
+ @Override
+ public Object convert(Object value) {
+ return !(getTreeViewer().getSelection().isEmpty());
+ }
+ }, null);
+
+ //Generic action for remove button
+ getRemoveButton().addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Object sel = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
+ if (sel != null) {
+ Command c = RemoveCommand.create(getEditor().getEditingDomain(), sel);
+ getEditor().getEditingDomain().getCommandStack().execute(c);
+ }
+ }
+ });
+ }
+
+ if (useGenericSectionToolBar) {
+
+ //Enable action when the tree selection is not empty
+ ViewersObservables.observeSingleSelection(getTreeViewer()).addValueChangeListener(new IValueChangeListener() {
+ public void handleValueChange(ValueChangeEvent event) {
+ boolean bool = !(getTreeViewer().getSelection().isEmpty());
+ removeAction.setEnabled(bool);
+ }
+ });
+
+ }
+
createContextMenuFor(treeViewer);
+ //update Editor selection
+ getEditor().addViewerToListenTo(getTreeViewer());
+
section.setClient(client);
}
+ protected Action createCustomToolbarAddAction() {
+ // Subclass may override this method
+ return null;
+ }
+
protected Button createButton(Composite parent, String btnText) {
Button btn = new Button(parent, SWT.FLAT | SWT.PUSH);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, false).applyTo(btn);
@@ -138,13 +224,13 @@
}
/**
- * @return The "Add..." button that can be used to hook an element creation wizard, or <code>null</code> if the {@link EmfMasterDetailBlock#useGenericAddButton} flag is set to <code>false</code>
+ * @return The "Add..." button that can be used to hook an element creation wizard, or <code>null</code> if the {@link EmfMasterDetailBlock#useGenericButton} flag is set to <code>false</code>
*/
public Button getGenericAddButton() {
return addButton;
}
- protected void createCustomAddButtons(Composite parent) {
+ protected void createCustomButtons(Composite parent) {
// Should be overriden by clients wanting to contribute their own "add" button(s)
}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java
new file mode 100644
index 0000000..2867109
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java
@@ -0,0 +1,32 @@
+package org.eclipse.pde.emfforms.editor;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.ui.forms.IMessageManager;
+
+public interface ValidatingService {
+
+ public static final KeyMap keyMap = new KeyMap();
+
+ static class KeyMap {
+ private Map<Integer, Integer> keymap = new HashMap<Integer, Integer>();
+
+ protected KeyMap() {
+ keymap.put(Integer.valueOf(IStatus.ERROR), Integer.valueOf(IMessageProvider.ERROR));
+ keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.WARNING));
+ keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.INFORMATION));
+ keymap.put(Integer.valueOf(IStatus.OK), Integer.valueOf(IMessageProvider.NONE));
+ keymap.put(Integer.valueOf(IStatus.CANCEL), Integer.valueOf(IMessageProvider.INFORMATION));
+ }
+
+ public int getMessageProviderKey(int iStatusKey) {
+ return keymap.get(Integer.valueOf(iStatusKey)).intValue();
+ }
+ }
+
+ void analyzeDiagnostic(DataBindingContext dataBindingContext, Diagnostic diagnostic, IMessageManager messageManager);
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java
new file mode 100644
index 0000000..435a4e8
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java
@@ -0,0 +1,46 @@
+package org.eclipse.pde.emfforms.editor.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
+import org.eclipse.pde.emfforms.internal.Activator;
+import org.eclipse.pde.emfforms.internal.editor.IEmfFormsImages;
+
+public abstract class AbstractAddAction extends Action {
+
+ protected EmfMasterDetailBlock masterDetail;
+
+ public AbstractAddAction(EmfMasterDetailBlock masterDetail) {
+ super();
+ this.masterDetail = masterDetail;
+ setText("Add");
+ setToolTipText("Add a element to current model");
+ }
+
+ @Override
+ public void run() {
+
+ Object createdObject = createNewObject(masterDetail);
+
+ // select the created method
+ masterDetail.getTreeViewer().refresh();
+ masterDetail.getTreeViewer().setSelection(new StructuredSelection(createdObject), true);
+ masterDetail.getTreeViewer().getTree().setFocus();
+
+ }
+
+ /**
+ * Create and return the new object to add to the masterDetail. The new object will be selected in the tree.
+ *
+ * @param masterDetail where the new object will be add
+ * @return the created object
+ */
+ protected abstract Object createNewObject(EmfMasterDetailBlock masterDetail);
+
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ return ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource(IEmfFormsImages.ADD_TOOLBAR_BUTTON)); //$NON-NLS-1$
+ }
+
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java
new file mode 100644
index 0000000..742c4ec
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java
@@ -0,0 +1,69 @@
+package org.eclipse.pde.emfforms.internal.actions;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
+import org.eclipse.pde.emfforms.internal.Activator;
+import org.eclipse.pde.emfforms.internal.editor.IEmfFormsImages;
+import org.eclipse.ui.PlatformUI;
+
+public class RemoveAction extends Action {
+
+ private EmfMasterDetailBlock masterDetail;
+
+ public RemoveAction(EmfMasterDetailBlock masterDetail) {
+ super();
+ this.masterDetail = masterDetail;
+ setText("Remove");
+ setToolTipText("Remove selected element");
+ }
+
+ public void run() {
+ TreeViewer treeViewer = masterDetail.getTreeViewer();
+
+ if (!treeViewer.getSelection().isEmpty()) {
+
+ int selIndex = treeViewer.getTree().indexOf(treeViewer.getTree().getSelection()[0]);
+
+ EObject sel = (EObject) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(masterDetail.getEditor().getAdapterFactory());
+
+ // -- Confirmation Dialog
+ String title = "Delete the current selection"; //$NON-NLS-1$
+ String message = "Do you really want to delete '" + labelProvider.getText(sel) + "' ?"; //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message)) {
+ EditingDomain editingDomain = masterDetail.getEditor().getEditingDomain();
+ // perform add method
+ Command c = RemoveCommand.create(editingDomain, sel);
+ editingDomain.getCommandStack().execute(c);
+
+ treeViewer.refresh();
+ if (treeViewer.getTree().getItemCount() > 0) {
+
+ // if we delete the last line, select the new last
+ // line
+ if (selIndex >= treeViewer.getTree().getItemCount())
+ selIndex = selIndex - 1;
+
+ treeViewer.getTree().setSelection(treeViewer.getTree().getItem(selIndex));
+ treeViewer.getTree().setFocus();
+ }
+ }
+ }
+ }
+
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ return ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource(IEmfFormsImages.REMOVE_TOOLBAR_BUTTON));
+ }
+
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
index e16cd26..35b0e6d 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
@@ -1,22 +1,19 @@
package org.eclipse.pde.emfforms.internal.validation;
-import java.util.*;
-import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.databinding.IEMFObservable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.pde.emfforms.editor.EmfFormEditor;
-import org.eclipse.swt.widgets.Control;
+import org.eclipse.pde.emfforms.editor.ValidatingService;
+import org.eclipse.pde.emfforms.internal.Activator;
import org.eclipse.ui.forms.IMessageManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
public class ValidatingEContentAdapter extends EContentAdapter {
private DataBindingContext _dataBindingContext;
@@ -24,7 +21,7 @@
private IObservableValue _observedValue;
private Diagnostician _diagnostician;
- private static final KeyMap keyMap = new KeyMap();
+ private ValidatingService validatingService;
public ValidatingEContentAdapter(IObservableValue observedValue, DataBindingContext dataBindingContext, EmfFormEditor<?> formEditor) {
_formEditor = formEditor;
@@ -51,8 +48,9 @@
@Override
public void notifyChanged(Notification notification) {
- if (notification.getEventType() != Notification.REMOVING_ADAPTER)
+ if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
validate();
+ }
}
public void validate() {
@@ -63,71 +61,19 @@
Diagnostic diagnostics = _diagnostician.validate((EObject) _observedValue.getValue());
for (Diagnostic diagnostic : diagnostics.getChildren()) {
- analyzeDiagnostic(diagnostic, messageManager);
+ getValidatorService().analyzeDiagnostic(_dataBindingContext, diagnostic, messageManager);
}
messageManager.update();
}
- private void analyzeDiagnostic(Diagnostic diagnostic, IMessageManager messageManager) {
- boolean atLeastOneErroneousBinding = false;
- for (Object o : _dataBindingContext.getBindings()) {
- Binding binding = (Binding) o;
- IEMFObservable emfObservable = null;
- ISWTObservable swtObservable = null;
- if (binding.getModel() instanceof IEMFObservable && binding.getTarget() instanceof ISWTObservable) {
- emfObservable = (IEMFObservable) binding.getModel();
- swtObservable = (ISWTObservable) binding.getTarget();
- } else if (binding.getTarget() instanceof IEMFObservable && binding.getModel() instanceof ISWTObservable) {
- swtObservable = (ISWTObservable) binding.getModel();
- emfObservable = (IEMFObservable) binding.getTarget();
- }
-
- if (emfObservable != null && swtObservable != null)
- if (checkBinding(emfObservable, swtObservable, diagnostic, messageManager))
- atLeastOneErroneousBinding = true;
+ private ValidatingService getValidatorService() {
+ BundleContext context = Activator.getDefault().getBundle().getBundleContext();
+ if (validatingService == null) {
+ ServiceReference validatingServiceRef = context.getServiceReference(ValidatingService.class.getName());
+ validatingService = (ValidatingService) context.getService(validatingServiceRef);
}
- if (!atLeastOneErroneousBinding) {
- // add an error message anyways
- messageManager.addMessage(diagnostic, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
- }
- }
-
- private boolean checkBinding(IEMFObservable emfObservable, ISWTObservable swtObservable, Diagnostic diagnostic, IMessageManager messageManager) {
- List<?> diagnosticData = diagnostic.getData();
- if (diagnosticData.size() >= 2) {
- if (diagnosticData.get(0) == emfObservable.getObserved()) {
- if (diagnosticData.get(1) == emfObservable.getStructuralFeature()) {
- if (swtObservable.getWidget() instanceof Control) {
- Control control = (Control) swtObservable.getWidget();
-
- if (true || control.isVisible())
- messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
- else
- messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
-
- return true;
- }
- }
- }
- }
- return false;
- }
-
- protected static class KeyMap {
- private Map<Integer, Integer> keymap = new HashMap<Integer, Integer>();
-
- protected KeyMap() {
- keymap.put(Integer.valueOf(IStatus.ERROR), Integer.valueOf(IMessageProvider.ERROR));
- keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.WARNING));
- keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.INFORMATION));
- keymap.put(Integer.valueOf(IStatus.OK), Integer.valueOf(IMessageProvider.NONE));
- keymap.put(Integer.valueOf(IStatus.CANCEL), Integer.valueOf(IMessageProvider.INFORMATION));
- }
-
- protected int getMessageProviderKey(int iStatusKey) {
- return keymap.get(Integer.valueOf(iStatusKey)).intValue();
- }
+ return validatingService;
}
}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
new file mode 100644
index 0000000..9a7f158
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
@@ -0,0 +1,60 @@
+package org.eclipse.pde.emfforms.internal.validation;
+
+import java.util.List;
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.jface.databinding.swt.ISWTObservable;
+import org.eclipse.pde.emfforms.editor.ValidatingService;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.IMessageManager;
+
+public class ValidatingService34 implements ValidatingService {
+
+ public void analyzeDiagnostic(DataBindingContext dataBindingContext, Diagnostic diagnostic, IMessageManager messageManager) {
+ boolean atLeastOneErroneousBinding = false;
+ for (Object o : dataBindingContext.getBindings()) {
+ Binding binding = (Binding) o;
+ DetailObservableValue emfObservable = null;
+ ISWTObservable swtObservable = null;
+ if (binding.getModel() instanceof DetailObservableValue && binding.getTarget() instanceof ISWTObservable) {
+ emfObservable = (DetailObservableValue) binding.getModel();
+ swtObservable = (ISWTObservable) binding.getTarget();
+ } else if (binding.getTarget() instanceof DetailObservableValue && binding.getModel() instanceof ISWTObservable) {
+ swtObservable = (ISWTObservable) binding.getModel();
+ emfObservable = (DetailObservableValue) binding.getTarget();
+ }
+
+ if (emfObservable != null && swtObservable != null)
+ if (checkBindingFor34(emfObservable, swtObservable, diagnostic, messageManager))
+ atLeastOneErroneousBinding = true;
+ }
+ if (!atLeastOneErroneousBinding) {
+ // add an error message anyways
+ messageManager.addMessage(diagnostic, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
+ }
+ }
+
+ private boolean checkBindingFor34(DetailObservableValue emfObservable, ISWTObservable swtObservable, Diagnostic diagnostic, IMessageManager messageManager) {
+ List<?> diagnosticData = diagnostic.getData();
+ if (diagnosticData.size() >= 2) {
+ if (diagnosticData.get(0) == emfObservable.getObserved()) {
+ if (diagnosticData.get(1) == emfObservable.getValueType()) {
+ if (swtObservable.getWidget() instanceof Control) {
+ Control control = (Control) swtObservable.getWidget();
+
+ if (true || control.isVisible())
+ messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
+ else
+ messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
+
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map b/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
index e915cf9..daef214 100644
--- a/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
+++ b/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
@@ -1,4 +1,5 @@
plugin@org.eclipse.pde.emfforms=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.emfforms
+bundle@org.eclipse.pde.emfforms.validation_35=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.emfforms.validation_35
plugin@org.eclipse.pde.ds=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.ds
plugin@org.eclipse.pde.ds.builder=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.ds.builder