diff options
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 |