diff --git a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java index 9dbc8f428a8..26ec01f03b9 100644 --- a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java +++ b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java @@ -24,7 +24,10 @@ import java.util.List; import java.util.Objects; +import org.eclipse.core.databinding.UpdateValueStrategy; +import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.list.IObservableList; +import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.databinding.property.value.IValueProperty; import org.eclipse.core.resources.IProject; @@ -42,6 +45,7 @@ import org.eclipse.e4.tools.services.IResourcePool; import org.eclipse.e4.tools.services.impl.ResourceBundleTranslationProvider; import org.eclipse.e4.ui.model.application.MApplicationElement; +import org.eclipse.e4.ui.model.application.commands.MCommand; import org.eclipse.e4.ui.model.application.ui.MUIElement; import org.eclipse.e4.ui.model.application.ui.MUILabel; import org.eclipse.emf.databinding.EMFDataBindingContext; @@ -51,6 +55,8 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.action.Action; +import org.eclipse.jface.databinding.swt.ISWTObservableValue; +import org.eclipse.jface.databinding.swt.typed.WidgetProperties; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; @@ -59,12 +65,14 @@ import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; 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.Link; import jakarta.annotation.PreDestroy; import jakarta.inject.Inject; @@ -499,6 +507,41 @@ protected void enableIdGenerator(EAttribute attSource, EAttribute attId, Control } } + /** + * Creates a {@link Link} linking to the {@link MCommand} observed by the given + * observable. If a command is present, the given text is displayed as a + * hyperlink. + * + * @param parent the parent composite + * @param text the text to display + * @param commandObservable the command observable + * @param context the data binding context + * @return the created link widget + */ + protected Link createCommandLink(Composite parent, String text, IObservableValue commandObservable, + EMFDataBindingContext context) { + Link link = new Link(parent, SWT.NONE); + link.setText(text); + ISWTObservableValue textObservable = WidgetProperties.text().observeDelayed(200, link); + context.bindValue(textObservable, commandObservable, new UpdateValueStrategy<>(), + UpdateValueStrategy.create(new Converter<>(MCommand.class, String.class) { + @Override + public String convert(MCommand command) { + if (command != null) { + return "" + text + ""; //$NON-NLS-1$ //$NON-NLS-2$ + } + return text; + } + })); + link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> { + MCommand command = commandObservable.getValue(); + if (command != null) { + getEditor().gotoEObject(ModelEditor.TAB_FORM, (EObject) command); + } + })); + return link; + } + @PreDestroy public void dispose() { createdImages.stream().filter(Objects::nonNull).filter(i -> !i.isDisposed()).forEach(Image::dispose); diff --git a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java index 96f2ebe809e..43f1baf1b7f 100644 --- a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java +++ b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java @@ -36,7 +36,7 @@ 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.Link; import org.eclipse.swt.widgets.Text; import jakarta.inject.Inject; @@ -72,8 +72,8 @@ protected void createFormSubTypeForm(Composite parent, EMFDataBindingContext con // ------------------------------------------------------------ { - final Label l = new Label(parent, SWT.NONE); - l.setText(Messages.HandledMenuItemEditor_Command); + final Link l = createCommandLink(parent, Messages.HandledMenuItemEditor_Command, + E4Properties.itemCommand(getEditingDomain()).observeDetail(master), context); l.setLayoutData(new GridData()); final Text t = new Text(parent, SWT.BORDER); diff --git a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java index 17d5f0de895..fc8800e000d 100644 --- a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java +++ b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java @@ -35,7 +35,7 @@ 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.Link; import org.eclipse.swt.widgets.Text; import jakarta.inject.Inject; @@ -60,8 +60,8 @@ protected void createSubTypeFormElements(Composite parent, EMFDataBindingContext final IWidgetValueProperty textProp = WidgetProperties.text(SWT.Modify); { - final Label l = new Label(parent, SWT.NONE); - l.setText(Messages.HandledToolItemEditor_Command); + final Link l = createCommandLink(parent, Messages.HandledToolItemEditor_Command, + E4Properties.itemCommand(getEditingDomain()).observeDetail(master), context); l.setLayoutData(new GridData()); final Text t = new Text(parent, SWT.BORDER); diff --git a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandlerEditor.java b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandlerEditor.java index 42914f52a87..32881bff5cd 100644 --- a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandlerEditor.java +++ b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandlerEditor.java @@ -54,7 +54,7 @@ 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.Link; import org.eclipse.swt.widgets.Text; import jakarta.inject.Inject; @@ -154,8 +154,8 @@ private Composite createForm(Composite parent, EMFDataBindingContext context, IO // ------------------------------------------------------------ { - final Label l = new Label(parent, SWT.NONE); - l.setText(Messages.HandlerEditor_Command); + final Link l = createCommandLink(parent, Messages.HandlerEditor_Command, + E4Properties.command(getEditingDomain()).observeDetail(master), context); l.setLayoutData(new GridData()); final Text t = new Text(parent, SWT.BORDER); diff --git a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java index ef05cd04224..983a3ff2aec 100644 --- a/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java +++ b/e4tools/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java @@ -66,6 +66,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Text; import jakarta.annotation.PostConstruct; @@ -188,8 +189,8 @@ private Composite createForm(Composite parent, EMFDataBindingContext context, IO // ------------------------------------------------------------ { - final Label l = new Label(parent, SWT.NONE); - l.setText(Messages.KeyBindingEditor_Command); + final Link l = createCommandLink(parent, Messages.KeyBindingEditor_Command, + E4Properties.keyBindingCommand(getEditingDomain()).observeDetail(master), context); l.setLayoutData(new GridData()); final Text t = new Text(parent, SWT.BORDER);