Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcletavernie2013-05-06 13:13:53 +0000
committercletavernie2013-05-06 13:13:53 +0000
commitb0192cf001b008abd876f1a082a656a392abdd3c (patch)
treef5ebd7f49f3c4deeb3f67613186c7d424e63299c /plugins/views
parent81634042582c88ef2b37e65fe06644f61f438030 (diff)
downloadorg.eclipse.papyrus-b0192cf001b008abd876f1a082a656a392abdd3c.tar.gz
org.eclipse.papyrus-b0192cf001b008abd876f1a082a656a392abdd3c.tar.xz
org.eclipse.papyrus-b0192cf001b008abd876f1a082a656a392abdd3c.zip
399855: [Comments] Papyrus shall enable to reference model elements within free-text of comments.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=399855 Improve the reference widget: add a dialog to browse existing elements and easily insert new references
Diffstat (limited to 'plugins/views')
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringEditorWithReferences.java166
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringMultilineWithReferences.java32
2 files changed, 196 insertions, 2 deletions
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringEditorWithReferences.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringEditorWithReferences.java
new file mode 100644
index 00000000000..2e48091d310
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringEditorWithReferences.java
@@ -0,0 +1,166 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ *
+ * 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:
+ * Camille Letavernier (camille.letavernier@cea.fr) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.views.properties.widgets;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.papyrus.infra.emf.utils.TextReferencesHelper;
+import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog;
+import org.eclipse.papyrus.infra.widgets.providers.EmptyContentProvider;
+import org.eclipse.papyrus.infra.widgets.providers.EncapsulatedContentProvider;
+import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider;
+import org.eclipse.papyrus.views.properties.Activator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A StringEditor with support for inserting references to EObjects (Via a TextReferenceHelper)
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class StringEditorWithReferences extends org.eclipse.papyrus.infra.widgets.editors.StringEditor implements SelectionListener {
+
+ protected Composite buttonsBar;
+
+ protected Button insertReferenceButton;
+
+ protected IStaticContentProvider referenceContentProvider = EmptyContentProvider.instance;
+
+ protected ILabelProvider labelProvider = new LabelProvider();
+
+ protected TextReferencesHelper referenceHelper;
+
+ public StringEditorWithReferences(Composite parent, int style) {
+ super(parent, style | SWT.MULTI);
+ setLayout(new GridLayout(2, false));
+ createButtonsBar(this);
+ }
+
+ @Override
+ protected GridData getDefaultLayoutData() {
+ GridData defaultData = super.getDefaultLayoutData();
+ defaultData.horizontalSpan = 2;
+ return defaultData;
+ }
+
+ protected void createButtonsBar(Composite wrapper) {
+ buttonsBar = new Composite(wrapper, SWT.NONE);
+ GridLayout buttonsBarLayout = new GridLayout(1, true);
+
+ buttonsBarLayout.marginWidth = 0;
+ buttonsBarLayout.marginHeight = 0;
+
+ buttonsBar.setLayout(buttonsBarLayout);
+ buttonsBar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
+ buttonsBar.moveAbove(label);
+ createButtons(buttonsBar);
+ }
+
+ protected void createButtons(Composite buttonsBar) {
+ createInsertReferenceButton(buttonsBar);
+ }
+
+ protected void createInsertReferenceButton(Composite buttonsBar) {
+ insertReferenceButton = new Button(buttonsBar, SWT.PUSH);
+ insertReferenceButton.setToolTipText("Insert a dynamic reference to an Element");
+ insertReferenceButton.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/hyperlink_16x16.gif")); //$NON-NLS-1$
+ insertReferenceButton.addSelectionListener(this);
+ insertReferenceButton.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
+ }
+
+ public void setReferenceBrowserContentProvider(IStaticContentProvider provider) {
+ this.referenceContentProvider = provider;
+ }
+
+ public void setTextReferencesHelper(TextReferencesHelper helper) {
+ this.referenceHelper = helper;
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ if(e.widget == insertReferenceButton) {
+ insertReferenceAction();
+ }
+ }
+
+ protected void insertReferenceAction() {
+ if(referenceHelper == null) {
+ //The widget is not properly set. We cannot handle references
+ Activator.log.warn("This widget is not properly configured. It cannot handle reference insertion");
+ return;
+ }
+
+ TreeSelectorDialog dialog = new TreeSelectorDialog(getShell());
+
+ dialog.setContentProvider(new EncapsulatedContentProvider(referenceContentProvider));
+ dialog.setLabelProvider(labelProvider);
+
+ if(dialog.open() == Window.OK) {
+ Object[] result = dialog.getResult();
+ if(result.length == 0) {
+ return;
+ }
+
+ Object resultElement = result[0];
+ if(!(resultElement instanceof EObject)) {
+ return;
+ }
+
+ EObject objectToReference = (EObject)resultElement;
+
+ String currentText = text.getText();
+ int caretPosition = text.getCaretPosition();
+
+ String newText = referenceHelper.insertReference(objectToReference, currentText, caretPosition);
+ if(newText.length() == currentText.length()) {
+ return;
+ }
+
+ int caretShift = newText.length() - currentText.length();
+ int newCaretPosition = caretPosition + caretShift;
+
+ //This should not happen with the standard ReferenceHelper as it is supposed to insert additional text into the current text
+ //However, some ReferenceHelper implementations might replace the current text
+ if(newCaretPosition < 0) {
+ newCaretPosition = 0;
+ }
+
+ if(newCaretPosition > newText.length()) {
+ newCaretPosition = newText.length();
+ }
+
+ text.setText(newText);
+ text.setFocus();
+ text.setSelection(newCaretPosition);
+ commit();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ //Nothing
+ }
+
+ public void setLabelProvider(ILabelProvider labelProvider) {
+ this.labelProvider = labelProvider;
+ }
+
+
+}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringMultilineWithReferences.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringMultilineWithReferences.java
index 489bf7b9a39..13160ad96f4 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringMultilineWithReferences.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/StringMultilineWithReferences.java
@@ -17,10 +17,13 @@ import java.util.Iterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.infra.emf.utils.TextReferencesHelper;
+import org.eclipse.papyrus.infra.widgets.editors.ICommitListener;
+import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
@@ -37,17 +40,34 @@ import org.eclipse.swt.widgets.Text;
*
* @see {@link org.eclipse.papyrus.infra.emf.utils.TextReferencesHelper}
*/
-public class StringMultilineWithReferences extends StringMultiline {
+public class StringMultilineWithReferences extends AbstractPropertyEditor {
protected TextReferencesHelper textReferencesHelper;
+ protected StringEditorWithReferences editor;
+
public void setTextReferencesHelper(TextReferencesHelper helper) {
this.textReferencesHelper = helper;
+ editor.setTextReferencesHelper(helper);
installDropListener();
}
+ @Override
+ protected void doBinding() {
+ super.doBinding();
+ IStaticContentProvider provider = input.getContentProvider(propertyPath);
+ if(provider != null) {
+ editor.setReferenceBrowserContentProvider(provider);
+ }
+
+ if(getInputObservableValue() instanceof ICommitListener) {
+ editor.addCommitListener((ICommitListener)getInputObservableValue());
+ }
+ }
+
public StringMultilineWithReferences(Composite parent, int style) {
- super(parent, style);
+ super();
+ setEditor(editor = new StringEditorWithReferences(parent, style));
}
protected void installDropListener() {
@@ -152,4 +172,12 @@ public class StringMultilineWithReferences extends StringMultiline {
protected org.eclipse.papyrus.infra.widgets.editors.StringEditor getStringEditor() {
return (org.eclipse.papyrus.infra.widgets.editors.StringEditor)valueEditor;
}
+
+ protected void setContentProvider(IStaticContentProvider provider) {
+ editor.setReferenceBrowserContentProvider(provider);
+ }
+
+ protected void setLabelProvider(ILabelProvider labelProvider) {
+ editor.setLabelProvider(labelProvider);
+ }
}

Back to the top