Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/internal/security/ui/editor/AbstractDetailsPage.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/internal/security/ui/editor/AbstractDetailsPage.java383
1 files changed, 383 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/internal/security/ui/editor/AbstractDetailsPage.java b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/internal/security/ui/editor/AbstractDetailsPage.java
new file mode 100644
index 0000000000..0959bd302e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/internal/security/ui/editor/AbstractDetailsPage.java
@@ -0,0 +1,383 @@
+/*
+ * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
+ * 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:
+ * Christian W. Damus (CEA LIST) - initial API and implementation
+ */
+package org.eclipse.emf.cdo.internal.security.ui.editor;
+
+import org.eclipse.emf.cdo.internal.security.ui.bundle.OM;
+import org.eclipse.emf.cdo.internal.security.ui.messages.Messages;
+import org.eclipse.emf.cdo.internal.security.ui.util.ObjectExistsConverter;
+import org.eclipse.emf.cdo.internal.security.ui.util.OneToManyBlock;
+import org.eclipse.emf.cdo.internal.security.ui.util.OneToManyTableBlock;
+import org.eclipse.emf.cdo.security.provider.SecurityEditPlugin;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.databinding.edit.EMFEditObservables;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.jface.databinding.viewers.ViewersObservables;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.IFilter;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Text;
+import org.eclipse.ui.forms.IDetailsPage;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+
+/**
+ *
+ */
+public abstract class AbstractDetailsPage<T extends EObject> extends AbstractSectionPart<T> implements IDetailsPage
+{
+
+ public AbstractDetailsPage(Class<T> elementType, EClass elementEClass, EditingDomain domain,
+ AdapterFactory adapterFactory)
+ {
+ super(elementType, elementEClass, domain, adapterFactory);
+ }
+
+ @Override
+ protected String getTitle()
+ {
+ return NLS.bind(Messages.AbstractDetailsPage_0,
+ SecurityEditPlugin.INSTANCE.getString(String.format("_UI_%s_type", getInputEClass().getName()))); //$NON-NLS-1$
+ }
+
+ @Override
+ public void createContents(Composite parent)
+ {
+ GridLayout layout = new GridLayout();
+ parent.setLayout(layout);
+
+ super.createContents(parent);
+ }
+
+ @Override
+ protected void createContents(Composite parent, FormToolkit toolkit)
+ {
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ parent.setLayout(layout);
+ }
+
+ protected void execute(Command command)
+ {
+ if (command.canExecute())
+ {
+ getEditingDomain().getCommandStack().execute(command);
+ }
+ }
+
+ protected Text text(Composite parent, FormToolkit toolkit, String label, EAttribute attribute)
+ {
+ toolkit.createLabel(parent, label);
+ Text result = toolkit.createText(
+ createDecorationComposite(parent, toolkit, layoutData(parent, SWT.FILL, false, 1)), ""); //$NON-NLS-1$
+ getContext().bindValue(observeText(result),
+ EMFEditObservables.observeDetailValue(getRealm(), getEditingDomain(), getValue(), attribute));
+ getContext().bindValue(SWTObservables.observeEnabled(result), getValue(), null,
+ ObjectExistsConverter.createUpdateValueStrategy());
+
+ addRevertDecoration(result, attribute);
+
+ return result;
+ }
+
+ private static GridData horzAlign(GridData gridData, int align, boolean grab, int span)
+ {
+ gridData.horizontalAlignment = align;
+ gridData.grabExcessHorizontalSpace = grab;
+ gridData.horizontalSpan = span;
+ return gridData;
+ }
+
+ private static GridData vertAlign(GridData gridData, int align, boolean grab, int span)
+ {
+ gridData.verticalAlignment = align;
+ gridData.grabExcessVerticalSpace = grab;
+ gridData.verticalSpan = span;
+ return gridData;
+ }
+
+ private static TableWrapData horzAlign(TableWrapData tableData, int align, boolean grab, int span)
+ {
+ int tableWrapAlign = 0;
+ switch (align)
+ {
+ case SWT.LEFT:
+ tableWrapAlign = TableWrapData.LEFT;
+ break;
+ case SWT.CENTER:
+ tableWrapAlign = TableWrapData.CENTER;
+ break;
+ case SWT.RIGHT:
+ tableWrapAlign = TableWrapData.RIGHT;
+ break;
+ case SWT.FILL:
+ tableWrapAlign = TableWrapData.FILL;
+ break;
+ }
+
+ tableData.align = tableWrapAlign;
+ tableData.grabHorizontal = grab;
+ tableData.colspan = span;
+ return tableData;
+ }
+
+ private static TableWrapData vertAlign(TableWrapData tableData, int align, boolean grab, int span)
+ {
+ int tableWrapAlign = 0;
+ switch (align)
+ {
+ case SWT.TOP:
+ tableWrapAlign = TableWrapData.TOP;
+ break;
+ case SWT.CENTER:
+ tableWrapAlign = TableWrapData.MIDDLE;
+ break;
+ case SWT.BOTTOM:
+ tableWrapAlign = TableWrapData.BOTTOM;
+ break;
+ case SWT.FILL:
+ tableWrapAlign = TableWrapData.FILL;
+ break;
+ }
+
+ tableData.valign = tableWrapAlign;
+ tableData.grabVertical = grab;
+ tableData.rowspan = span;
+ return tableData;
+ }
+
+ protected static Object layoutData(Composite parent, int horzAlign, boolean horzGrab, int horzSpan)
+ {
+ Object result;
+
+ if (parent.getLayout() instanceof GridLayout)
+ {
+ result = horzAlign(new GridData(), horzAlign, horzGrab, horzSpan);
+ }
+ else
+ {
+ result = horzAlign(new TableWrapData(), horzAlign, horzGrab, horzSpan);
+ }
+
+ return result;
+ }
+
+ protected static Object layoutData(Composite parent, int horzAlign, boolean horzGrab, int horzSpan, int vertAlign,
+ boolean vertGrab, int vertSpan)
+ {
+ Object result;
+
+ if (parent.getLayout() instanceof GridLayout)
+ {
+ result = vertAlign(horzAlign(new GridData(), horzAlign, horzGrab, horzSpan), vertAlign, vertGrab, vertSpan);
+ }
+ else
+ {
+ result = vertAlign(horzAlign(new TableWrapData(), horzAlign, horzGrab, horzSpan), vertAlign, vertGrab, vertSpan);
+ }
+
+ return result;
+ }
+
+ protected static <T> T heightHint(T layoutData, int hint)
+ {
+ if (layoutData instanceof GridData)
+ {
+ ((GridData)layoutData).heightHint = hint;
+ }
+ else
+ {
+ ((TableWrapData)layoutData).heightHint = hint;
+ }
+
+ return layoutData;
+ }
+
+ protected Control space(Composite parent, FormToolkit toolkit)
+ {
+ Control result = toolkit.createComposite(parent);
+ result.setLayoutData(heightHint(layoutData(parent, SWT.FILL, false, 2), 15));
+ return result;
+ }
+
+ protected OneToManyBlock oneToMany(Composite parent, FormToolkit toolkit, String label, EReference reference)
+ {
+ return oneToMany(parent, toolkit, label, reference, reference.getEReferenceType());
+ }
+
+ protected OneToManyBlock oneToMany(Composite parent, FormToolkit toolkit, String label, EReference reference,
+ EClass itemType)
+ {
+ return oneToMany(parent, toolkit, label, reference, itemType, null);
+ }
+
+ protected OneToManyBlock oneToMany(Composite parent, FormToolkit toolkit, String label, EReference reference,
+ EClass itemType, IFilter itemFilter)
+ {
+ toolkit.createLabel(parent, label).setLayoutData(layoutData(parent, SWT.LEFT, false, 2));
+ Composite blockParent = toolkit.createComposite(parent);
+ blockParent.setLayoutData(layoutData(parent, SWT.FILL, true, 2, SWT.FILL, true, 1));
+
+ OneToManyBlock result = new OneToManyBlock(getContext(), getEditingDomain(), getAdapterFactory(),
+ new OneToManyBlock.OneToManyConfiguration(reference, itemType, itemFilter));
+
+ result.setEditorActionBars(getEditorActionBars());
+ result.setInput(getValue());
+ result.createControl(blockParent, toolkit);
+ return result;
+ }
+
+ protected OneToManyTableBlock table(Composite parent, FormToolkit toolkit, String label,
+ OneToManyTableBlock.ITableConfiguration config)
+ {
+ toolkit.createLabel(parent, label).setLayoutData(layoutData(parent, SWT.LEFT, false, 2));
+ Composite blockParent = toolkit.createComposite(parent);
+ blockParent.setLayoutData(layoutData(parent, SWT.FILL, true, 2, SWT.FILL, true, 1));
+
+ OneToManyTableBlock result = new OneToManyTableBlock(getContext(), getEditingDomain(), getAdapterFactory(), config);
+
+ result.setEditorActionBars(getEditorActionBars());
+ result.setInput(getValue());
+ result.createControl(blockParent, toolkit);
+ return result;
+ }
+
+ protected Button checkbox(Composite parent, FormToolkit toolkit, String label, EAttribute attribute)
+ {
+ Button result = toolkit.createButton(
+ createDecorationComposite(parent, toolkit, layoutData(parent, SWT.LEFT, false, 2)), label, SWT.CHECK);
+ getContext().bindValue(SWTObservables.observeSelection(result),
+ EMFEditObservables.observeDetailValue(getRealm(), getEditingDomain(), getValue(), attribute));
+ getContext().bindValue(SWTObservables.observeEnabled(result), getValue(), null,
+ ObjectExistsConverter.createUpdateValueStrategy());
+
+ addRevertDecoration(result, attribute);
+
+ return result;
+ }
+
+ protected ComboViewer combo(Composite parent, FormToolkit toolkit, String label, EAttribute attribute)
+ {
+ toolkit.createLabel(parent, label);
+ ComboViewer result = new ComboViewer(createDecorationComposite(parent, toolkit,
+ layoutData(parent, SWT.LEFT, false, 1)), SWT.READ_ONLY | SWT.DROP_DOWN);
+ result.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory()));
+ result.setContentProvider(new ArrayContentProvider());
+ result.setInput(attribute.getEAttributeType().getInstanceClass().getEnumConstants());
+
+ getContext().bindValue(ViewersObservables.observeSingleSelection(result),
+ EMFEditObservables.observeDetailValue(getRealm(), getEditingDomain(), getValue(), attribute));
+ getContext().bindValue(SWTObservables.observeEnabled(result.getControl()), getValue(), null,
+ ObjectExistsConverter.createUpdateValueStrategy());
+
+ addRevertDecoration(result.getControl(), attribute);
+
+ return result;
+ }
+
+ protected Composite createDecorationComposite(Composite parent, FormToolkit toolkit, Object layoutData)
+ {
+ Composite result = toolkit.createComposite(parent);
+ result.setLayoutData(layoutData);
+
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginRight = 18; // 16 for image and 2 for offset
+ result.setLayout(layout);
+
+ return result;
+ }
+
+ protected void addRevertDecoration(final Control control, final EStructuralFeature feature)
+ {
+ final ControlDecoration decoration = new ControlDecoration(control, SWT.RIGHT | SWT.CENTER);
+ decoration.hide();
+ decoration.setDescriptionText(Messages.AbstractDetailsPage_3);
+ decoration.setImage(ExtendedImageRegistry.getInstance().getImage(
+ URI.createPlatformPluginURI(OM.BUNDLE_ID + "/icons/full/elcl16/revert.gif", true))); //$NON-NLS-1$
+ decoration.setMarginWidth(2);
+
+ decoration.addSelectionListener(new SelectionAdapter()
+ {
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ Command command = SetCommand.create(getEditingDomain(), getInput(), feature, SetCommand.UNSET_VALUE);
+ if (command.canExecute())
+ {
+ getEditingDomain().getCommandStack().execute(command);
+ }
+ }
+ });
+
+ control.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ // show the decoration when the user hovers over the control and auto-hide after leaving the control
+ MouseTrackListener showHideListener = new MouseTrackAdapter()
+ {
+ private Runnable hideRunnable;
+
+ @Override
+ public void mouseHover(MouseEvent e)
+ {
+ hideRunnable = null;
+ decoration.show();
+ }
+
+ @Override
+ public void mouseExit(MouseEvent e)
+ {
+ hideRunnable = new Runnable()
+ {
+
+ public void run()
+ {
+ if (hideRunnable == this)
+ {
+ hideRunnable = null;
+ decoration.hide();
+ }
+ }
+ };
+ control.getDisplay().timerExec(1000, hideRunnable);
+ }
+ };
+ control.addMouseTrackListener(showHideListener);
+ control.getParent().addMouseTrackListener(showHideListener);
+ }
+
+}

Back to the top