Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java7
-rw-r--r--bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties7
-rw-r--r--bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java40
-rw-r--r--bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/MenuIdDialog.java189
4 files changed, 239 insertions, 4 deletions
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
index e27edb7e..8a78ad12 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
@@ -7,7 +7,7 @@
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- * Marco Descher <marco@descher.at> - Bug 395982
+ * Marco Descher <marco@descher.at> - Bug 395982, Bug 396975
******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal;
@@ -585,6 +585,11 @@ public class Messages {
public String ExpressionIdDialog_DialogMessage;
public String ExpressionIdDialog_Id;
+ public String MenuIdDialog_ShellTitle;
+ public String MenuIdDialog_DialogTitle;
+ public String MenuIdDialog_DialogMessage;
+ public String MenuIdDialog_Id;
+
public String CommandToStringConverter_None;
public String VRootBindingContexts_AddContext;
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
index 402fef08..2395d438 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
@@ -8,7 +8,7 @@
# * Contributors:
# * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
# * Sopot Cela <sopotcela@gmail.com> - enhancements
-# * Marco Descher <marco@descher.at> - Bug 395982
+# * Marco Descher <marco@descher.at> - Bug 395982, Bug 396975
# ******************************************************************************
ModelTooling_Common_Up=Up
ModelTooling_Common_Down=Down
@@ -588,6 +588,11 @@ ExpressionIdDialog_DialogMessage=Find the expression ID defined through the 'org
ExpressionIdDialog_Id=ID
CommandToStringConverter_None=<None>
+MenuIdDialog_ShellTitle=Find Parent Menu Id
+MenuIdDialog_DialogTitle=Find Parent Menu Id
+MenuIdDialog_DialogMessage=Find the menu id to be used as parent (in fragment finds the imported menus only)
+MenuIdDialog_Id=Parent Id
+
VRootBindingContexts_AddContext=Binding Context
VRootBindingContexts_TreeLabel=Binding Context
VRootBindingContexts_TreeLabelDescription=Binding Context Bla Bla Bla
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
index 506f3f03..98dabb40 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
@@ -7,7 +7,7 @@
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- * Marco Descher <marco@descher.at> - Bug 397650, Bug 395982
+ * Marco Descher <marco@descher.at> - Bug 397650, Bug 395982, Bug 396975
******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.common.component;
@@ -19,16 +19,21 @@ import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.e4.tools.emf.ui.common.EStackLayout;
+import org.eclipse.e4.tools.emf.ui.common.IModelResource;
import org.eclipse.e4.tools.emf.ui.common.Util;
import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
import org.eclipse.e4.tools.emf.ui.internal.common.ComponentLabelProvider;
+import org.eclipse.e4.tools.emf.ui.internal.common.component.ControlFactory.TextPasteHandler;
+import org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs.MenuIdDialog;
import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.impl.UiPackageImpl;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuPackageImpl;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFProperties;
@@ -63,6 +68,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
public class MenuContributionEditor extends AbstractComponentEditor {
private Composite composite;
@@ -72,6 +78,12 @@ public class MenuContributionEditor extends AbstractComponentEditor {
private EStackLayout stackLayout;
private List<Action> actions = new ArrayList<Action>();
+ @Inject
+ private IModelResource resource;
+
+ @Inject
+ private EModelService modelService;
+
private static class Struct {
private final String label;
private final EClass eClass;
@@ -207,7 +219,31 @@ public class MenuContributionEditor extends AbstractComponentEditor {
ControlFactory.createTextField(parent, Messages.ModelTooling_Common_Id, master, context, textProp, EMFEditProperties.value(getEditingDomain(), ApplicationPackageImpl.Literals.APPLICATION_ELEMENT__ELEMENT_ID));
ControlFactory.createTextField(parent, Messages.ModelTooling_UIElement_AccessibilityPhrase, getMaster(), context, textProp, EMFEditProperties.value(getEditingDomain(), UiPackageImpl.Literals.UI_ELEMENT__ACCESSIBILITY_PHRASE));
- ControlFactory.createTextField(parent, Messages.MenuContributionEditor_ParentId, master, context, textProp, EMFEditProperties.value(getEditingDomain(), MenuPackageImpl.Literals.MENU_CONTRIBUTION__PARENT_ID));
+
+ {
+ Label l = new Label(parent, SWT.NONE);
+ l.setText(Messages.MenuContributionEditor_ParentId);
+ l.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ final Text t = new Text(parent, SWT.BORDER);
+ TextPasteHandler.createFor(t);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ t.setLayoutData(gd);
+ context.bindValue(textProp.observeDelayed(200, t), EMFEditProperties.value(getEditingDomain(), MenuPackageImpl.Literals.MENU_CONTRIBUTION__PARENT_ID).observeDetail(getMaster()));
+
+ Button b = new Button(parent, SWT.PUSH | SWT.FLAT);
+ b.setText(Messages.ModelTooling_Common_FindEllipsis);
+ b.setImage(createImage(ResourceProvider.IMG_Obj16_zoom));
+ b.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ MenuIdDialog dialog = new MenuIdDialog(t.getShell(), resource, (MMenuContribution) getMaster().getValue(), getEditingDomain(), modelService, Messages);
+ dialog.open();
+ }
+ });
+
+ }
+
ControlFactory.createTextField(parent, Messages.MenuContributionEditor_Position, master, context, textProp, EMFEditProperties.value(getEditingDomain(), MenuPackageImpl.Literals.MENU_CONTRIBUTION__POSITION_IN_PARENT));
// ------------------------------------------------------------
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/MenuIdDialog.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/MenuIdDialog.java
new file mode 100644
index 00000000..d5b12265
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/MenuIdDialog.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2013 MEDEVIT, FHV 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:
+ * Marco Descher <marco@descher.at> - initial implementation (Bug 396975)
+ *******************************************************************************/
+package org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.e4.tools.emf.ui.common.IModelResource;
+import org.eclipse.e4.tools.emf.ui.internal.Messages;
+import org.eclipse.e4.tools.emf.ui.internal.PatternFilter;
+import org.eclipse.e4.tools.emf.ui.internal.common.component.ControlFactory;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.MApplicationElement;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
+import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuPackageImpl;
+import org.eclipse.e4.ui.model.fragment.MModelFragments;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+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.Text;
+
+public class MenuIdDialog extends TitleAreaDialog {
+
+ private EModelService modelService;
+ private TableViewer viewer;
+ private EditingDomain domain;
+ private IModelResource resource;
+ private MMenuContribution menuContribution;
+ private Messages messages;
+
+ public MenuIdDialog(Shell parentShell, IModelResource resource, MMenuContribution menuContribution, EditingDomain domain, EModelService modelService, Messages Messages) {
+ super(parentShell);
+ this.resource = resource;
+ this.modelService = modelService;
+ this.messages = Messages;
+ this.domain = domain;
+ this.menuContribution = menuContribution;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText(messages.MenuIdDialog_ShellTitle);
+ setTitle(messages.MenuIdDialog_DialogTitle);
+ setMessage(messages.MenuIdDialog_DialogMessage);
+ Composite comp = (Composite) super.createDialogArea(parent);
+ Composite container = new Composite(comp, SWT.NONE);
+ container.setLayoutData(new GridData(GridData.FILL_BOTH));
+ container.setLayout(new GridLayout(2, false));
+
+ Label l = new Label(container, SWT.NONE);
+ l.setText(messages.MenuIdDialog_Id);
+
+ Text idField = new Text(container, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH);
+ idField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ final PatternFilter filter = new PatternFilter() {
+ @Override
+ protected boolean isParentMatch(Viewer viewer, Object element) {
+ return viewer instanceof AbstractTreeViewer && super.isParentMatch(viewer, element);
+ }
+ };
+
+ l = new Label(container, SWT.NONE);
+ viewer = new TableViewer(container);
+ viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+ viewer.setContentProvider(new ArrayContentProvider());
+ viewer.setLabelProvider(new LabelProviderImpl());
+ viewer.addFilter(filter);
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+
+ public void doubleClick(DoubleClickEvent event) {
+ okPressed();
+ }
+ });
+
+ ControlFactory.attachFiltering(idField, viewer, filter);
+
+ if (resource.getRoot().get(0) instanceof MApplication) {
+ List<MMenu> list = new ArrayList<MMenu>();
+ // include Window main-menu instances
+ MApplication ma = ((MApplication) resource.getRoot().get(0));
+ for (MWindow m : ma.getChildren()) {
+ list.add(m.getMainMenu());
+ }
+ // include menu elements located within parts
+ List<MPart> mp = modelService.findElements(ma, null, MPart.class, null);
+ for (MPart mPart : mp) {
+ list.addAll(mPart.getMenus());
+ }
+ // include menu elements carried by tool items
+ List<MToolItem> mt = modelService.findElements(ma, null, MToolItem.class, null);
+ for (MToolItem mToolItem : mt) {
+ if (mToolItem.getMenu() != null)
+ list.add(mToolItem.getMenu());
+ }
+
+ for (MMenu mMenuEntry : list.toArray(new MMenu[] {})) {
+ performRecursiveCheck(mMenuEntry, list);
+ }
+
+ viewer.setInput(list);
+
+ } else if (resource.getRoot().get(0) instanceof MModelFragments) {
+ List<MApplicationElement> list = new ArrayList<MApplicationElement>();
+ for (MApplicationElement f : ((MModelFragments) resource.getRoot().get(0)).getImports()) {
+ if (f instanceof MMenu) {
+ list.add(f);
+ }
+ }
+ viewer.setInput(list);
+
+ }
+
+ return comp;
+ }
+
+ /**
+ * A menu may contain another {@link MMenu} as a child; we want them to be
+ * shown as an additional entry, so we recursively dive into these elements
+ *
+ * @param mMenu
+ * @param list
+ */
+ private void performRecursiveCheck(MMenu mMenu, List<MMenu> list) {
+ List<MMenuElement> children = mMenu.getChildren();
+ for (MMenuElement child : children) {
+ if (child instanceof MMenu) {
+ MMenu mMenuChild = (MMenu) child;
+ list.add(mMenuChild);
+ performRecursiveCheck(mMenuChild, list);
+ }
+ }
+ }
+
+ @Override
+ protected void okPressed() {
+ if (!viewer.getSelection().isEmpty()) {
+ MMenu el = (MMenu) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+ Command cmd = SetCommand.create(domain, menuContribution, MenuPackageImpl.Literals.MENU_CONTRIBUTION__PARENT_ID, el.getElementId());
+ if (cmd.canExecute()) {
+ domain.getCommandStack().execute(cmd);
+ super.okPressed();
+ }
+ }
+ }
+
+ static class LabelProviderImpl extends StyledCellLabelProvider {
+ @Override
+ public void update(ViewerCell cell) {
+ MMenu el = (MMenu) cell.getElement();
+ String elementId = (el.getElementId() != null) ? el.getElementId() : "(Id missing)";
+ StyledString str = new StyledString(elementId);
+ str.append(" - " + el.getLabel(), StyledString.DECORATIONS_STYLER); //$NON-NLS-1$
+ cell.setText(str.getString());
+ cell.setStyleRanges(str.getStyleRanges());
+ }
+ }
+} \ No newline at end of file

Back to the top