[510040] Merge representation and viewpoint blocks
- Merged functionality of viewpoint selection block into the
representation.
- The activation is now handled by a double click on the viewpoint item
instead of checking checkbox.
- Double click on representation descriptor now opens the representation
creation wizard with the representation descriptor selected.
Bug: 510040
Change-Id: I2d4d5ca92ea7e8e345f4f0b6be45e94a241a1abd
Signed-off-by: pguilet <pierre.guilet@obeo.fr>
diff --git a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
index 6dd73e1..35f2ccc 100644
--- a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
@@ -40,4 +40,5 @@
Export-Package: org.eclipse.sirius.ui.editor;version="5.0.0",
org.eclipse.sirius.ui.editor.internal.graphicalcomponents;version="5.0.0";x-internal:=true,
org.eclipse.sirius.ui.editor.internal.pages;version="5.0.0";x-internal:=true,
- org.eclipse.sirius.ui.editor.internal.preferences;version="5.0.0";x-internal:=true
+ org.eclipse.sirius.ui.editor.internal.preferences;version="5.0.0";x-internal:=true,
+ org.eclipse.sirius.ui.editor.provider;version="5.0.0"
diff --git a/plugins/org.eclipse.sirius.ui.editor/plugin.properties b/plugins/org.eclipse.sirius.ui.editor/plugin.properties
index c6e83e3..e635183 100644
--- a/plugins/org.eclipse.sirius.ui.editor/plugin.properties
+++ b/plugins/org.eclipse.sirius.ui.editor/plugin.properties
@@ -25,4 +25,7 @@
UI_SessionEditor_representation_title=Representations
UI_SessionEditor_representation_button_newRepresentation=New...
UI_SessionEditor_representation_button_removeRepresentation=Remove
-UI_SessionEditor_inputNotHandled_error_message=The aird editor handles only FileEditorInput and URIEditorInput. The following input is not handled: {0}
\ No newline at end of file
+UI_SessionEditor_inputNotHandled_error_message=The aird editor handles only FileEditorInput and URIEditorInput. The following input is not handled: {0}
+GraphicalRepresentationHandler_missingDependencies_requirements=Viewpoint ''{0}'' requires viewpoint(s) which are not enabled: {1}
+GraphicalRepresentationHandler_disabledViewpoint_label=disabled
+GraphicalRepresentationHandler_representationNumber_label=\u0020({0} representations)
\ No newline at end of file
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
index 1497d63..8206331 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
@@ -67,6 +67,15 @@
@TranslatableMessage
public static String UI_SessionEditor_inputNotHandled_error_message;
+ @TranslatableMessage
+ public static String GraphicalRepresentationHandler_missingDependencies_requirements;
+
+ @TranslatableMessage
+ public static String GraphicalRepresentationHandler_disabledViewpoint_label;
+
+ @TranslatableMessage
+ public static String GraphicalRepresentationHandler_representationNumber_label;
+
// CHECKSTYLE:ON
private Messages() {
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
index 4079bee..106cad7 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
@@ -10,9 +10,15 @@
*******************************************************************************/
package org.eclipse.sirius.ui.editor.internal.graphicalcomponents;
-import java.util.Arrays;
+import java.text.MessageFormat;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.SortedMap;
import java.util.stream.Collectors;
import org.eclipse.jface.action.Action;
@@ -20,26 +26,34 @@
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.business.api.session.SessionListener;
import org.eclipse.sirius.business.api.session.SessionManager;
import org.eclipse.sirius.business.api.session.SessionManagerListener;
-import org.eclipse.sirius.common.ui.tools.api.navigator.GroupingContentProvider;
+import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
-import org.eclipse.sirius.common.ui.tools.api.util.TreeItemWrapperContentProvider;
+import org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection;
import org.eclipse.sirius.ui.editor.Messages;
-import org.eclipse.sirius.ui.tools.api.views.common.item.ViewpointsFolderItem;
+import org.eclipse.sirius.ui.editor.provider.SiriusRepresentationLabelProvider;
+import org.eclipse.sirius.ui.tools.internal.viewpoint.ViewpointHelper;
+import org.eclipse.sirius.ui.tools.internal.viewpoint.ViewpointsSelectionGraphicalHandler;
import org.eclipse.sirius.ui.tools.internal.views.common.action.DeleteRepresentationAction;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.ViewpointItemImpl;
import org.eclipse.sirius.ui.tools.internal.views.common.navigator.ManageSessionActionProvider;
import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider;
-import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonLabelProvider;
import org.eclipse.sirius.ui.tools.internal.views.common.navigator.sorter.CommonItemSorter;
import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.DeleteActionHandler;
import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.RenameActionHandler;
@@ -53,27 +67,159 @@
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.forms.widgets.FormToolkit;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
/**
* This graphical component provides a {@link TreeViewer} showing all
- * representations belonging to the given session under corresponding viewpoints
- * objects. It also provides buttons to add or remove external semantic model
- * dependency to the session. This component also reacts to external session
- * changes regarding loading semantic models or selected viewpoints to always
- * display representations available to use from the session.
+ * representations belonging to the given session under corresponding
+ * representation descriptors under corresponding viewpoints objects.
+ *
+ * It also provides addition and removal representations functionalities.
+ *
+ * It also have capabilities to activate/deactivate the viewpoints.
+ *
+ * This component also reacts to external session changes regarding loading
+ * semantic models or selected viewpoints to always display representations
+ * available to use from the session.
*
* @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
*
*/
public class GraphicalRepresentationHandler implements SessionManagerListener {
/**
+ * Double click listener activating/deactivating viewpoints from viewpoints
+ * item and launching representation creation wizard from representation
+ * descriptor.
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+ private final class ViewpointActivationAndRepresentationCreationDoubleClickListener implements IDoubleClickListener {
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+ if (event.getSelection() instanceof StructuredSelection) {
+ StructuredSelection selection = (StructuredSelection) event.getSelection();
+
+ if (selection.getFirstElement() instanceof ViewpointItemImpl) {
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) selection.getFirstElement();
+ Viewpoint changedViewpoint = viewpointItem.getViewpoint();
+ boolean activateViewpoint = !viewpointItem.isViewpointEnabledInSession();
+ Set<Viewpoint> selectedViewpoints = getSelectedViewpoints();
+ if (activateViewpoint) {
+ String errorMessage = null;
+
+ errorMessage = getMissingDependencyErrorMessage(changedViewpoint, selectedViewpoints);
+ if (errorMessage == null) {
+ viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
+ handleViewpointActivation(viewpointItem, changedViewpoint, selectedViewpoints, activateViewpoint);
+ } else {
+ viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
+ }
+ } else {
+ handleViewpointActivation(viewpointItem, changedViewpoint, selectedViewpoints, activateViewpoint);
+ }
+
+ } else if (selection.getFirstElement() instanceof RepresentationDescriptionItemImpl) {
+ RepresentationDescriptionItemImpl representationDescriptionItem = (RepresentationDescriptionItemImpl) selection.getFirstElement();
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) representationDescriptionItem.getParent();
+ boolean viewpointParentActivated = viewpointItem.isViewpointEnabledInSession();
+ Set<Viewpoint> selectedViewpoints = getSelectedViewpoints();
+ if (!viewpointParentActivated) {
+ // We activate the viewpoint if it is not the case.
+ handleViewpointActivation(viewpointItem, viewpointItem.getViewpoint(), selectedViewpoints, true);
+ }
+
+ treeViewer.getTree().setRedraw(false);
+ CreateRepresentationWizard wizard = new CreateRepresentationWizard(session, representationDescriptionItem);
+ wizard.init();
+ final WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), wizard);
+ dialog.create();
+ dialog.getShell().setText("Create Representation Wizard"); //$NON-NLS-1$
+ dialog.open();
+ treeViewer.getTree().setRedraw(true);
+
+ if (wizard.isCreationCancelled() && !viewpointParentActivated) {
+ // we deactivate the viewpoint if it was its status
+ // before cancellation of representation creation.
+ selectedViewpoints = getSelectedViewpoints();
+ handleViewpointActivation(viewpointItem, viewpointItem.getViewpoint(), selectedViewpoints, false);
+ } else {
+ treeViewer.refresh();
+ treeViewer.setSelection(new StructuredSelection(viewpointItem));
+ }
+ }
+ }
+
+ }
+ }
+
+ /**
+ * This listener takes care of enabling/disabling buttons handling
+ * representations. It also update the browser description regarding the
+ * viewpoint of the selected item.
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+ private final class UpdateButtonsAndBrowserAtSelectionChangeListener implements ISelectionChangedListener {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (event.getSelection().isEmpty()) {
+ removeSemanticModelOrRepresentationButton.setEnabled(false);
+ deleteActionHandler.setEnabled(false);
+ renameActionHandler.setEnabled(false);
+ } else if (event.getSelection() instanceof TreeSelection) {
+ TreeSelection selection = (TreeSelection) event.getSelection();
+
+ // update browser
+ viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
+ Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+ if (firstElement instanceof ViewpointItemImpl) {
+ viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) firstElement).getViewpoint());
+ } else if (firstElement instanceof RepresentationDescriptionItemImpl) {
+ RepresentationDescriptionItemImpl representationDescriptionItemImpl = (RepresentationDescriptionItemImpl) firstElement;
+ viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) representationDescriptionItemImpl.getParent()).getViewpoint());
+ } else if (firstElement instanceof RepresentationItemImpl) {
+ RepresentationItemImpl representationItem = (RepresentationItemImpl) firstElement;
+ RepresentationDescriptionItemImpl representationDescriptionItemImpl = (RepresentationDescriptionItemImpl) representationItem.getParent();
+ viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) representationDescriptionItemImpl.getParent()).getViewpoint());
+ }
+
+ // update buttons
+ Iterator<?> selectionIte = selection.iterator();
+ boolean allRepresentationItem = true;
+ while (selectionIte.hasNext() && allRepresentationItem) {
+ Object object = selectionIte.next();
+ if (!(object instanceof RepresentationItemImpl)) {
+ allRepresentationItem = false;
+ }
+ }
+ if (allRepresentationItem) {
+ removeSemanticModelOrRepresentationButton.setEnabled(true);
+ deleteActionHandler.setEnabled(true);
+ renameActionHandler.setEnabled(true);
+ } else {
+ removeSemanticModelOrRepresentationButton.setEnabled(false);
+ deleteActionHandler.setEnabled(false);
+ renameActionHandler.setEnabled(false);
+ }
+ }
+ }
+ }
+
+ /**
* Session from which representations are handled.
*/
private Session session;
@@ -128,6 +274,12 @@
private Action renameActionHandler;
/**
+ * The graphic component contains the browser used to show information about
+ * viewpoints.
+ */
+ private ViewpointsSelectionGraphicalHandler viewpointsSelectionGraphicalHandler;
+
+ /**
* Initialize the component with the given session.
*
* @param theSession
@@ -139,6 +291,7 @@
public GraphicalRepresentationHandler(Session theSession, FormToolkit toolkit) {
this.session = theSession;
this.toolkit = toolkit;
+ viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
}
/**
@@ -183,22 +336,44 @@
* the composite to be attached to.
*/
public void createControl(Composite parentComposite) {
- treeViewer = createRepresentationExplorerNavigator(parentComposite);
- createRepresentationExplorerButton(parentComposite, treeViewer);
+ viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
+ Composite rootComposite = new Composite(parentComposite, SWT.NONE);
+ GridLayout rootGridLayout = GridLayoutFactory.swtDefaults().numColumns(3).equalWidth(false).create();
+ rootComposite.setLayout(rootGridLayout);
+ GridData rootLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ rootComposite.setLayoutData(rootLayoutData);
+ treeViewer = createRepresentationExplorerNavigator(rootComposite);
+ GridData layoutData = (GridData) treeViewer.getTree().getLayoutData();
+ // setting height hint avoids the composite to grow outside visible
+ // port when too much item are present.
+ layoutData.heightHint = 50;
+ viewpointsSelectionGraphicalHandler.createBrowser(rootComposite);
+ viewpointsSelectionGraphicalHandler.setBrowserMinWidth(200);
+ updateViewerInput(treeViewer);
SessionManager.INSTANCE.addSessionsListener(this);
+
}
/**
* Update the representations viewer with the representation currently
- * available in the session.
+ * available in the session and expand items to level 2 and set selection to
+ * the first item.
*
* @param theTreeViewer
* the viewer to update.
*/
protected void updateViewerInput(TreeViewer theTreeViewer) {
- Object[] children = siriusCommonContentProvider.getChildren(session);
- theTreeViewer.setInput(Arrays.stream(children).filter(child -> child instanceof ViewpointsFolderItem).findFirst().get());
+ List<Object> viewpointItemList = new ArrayList<>();
+ Collection<Viewpoint> availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
+ for (Viewpoint viewpoint : availableViewpoints) {
+ viewpointItemList.add(new ViewpointItemImpl(session, viewpoint, this));
+ }
+ theTreeViewer.setInput(viewpointItemList);
theTreeViewer.expandToLevel(2);
+ if (!availableViewpoints.isEmpty()) {
+ theTreeViewer.setSelection(new StructuredSelection(theTreeViewer.getTree().getItem(0).getData()));
+ }
+
}
/**
@@ -210,72 +385,161 @@
*/
private TreeViewer createRepresentationExplorerNavigator(Composite parent) {
Composite subComposite = toolkit.createComposite(parent, SWT.NONE);
- subComposite.setLayout(GridLayoutFactory.fillDefaults().create());
- subComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
- representationTree = SWTUtil.createFilteredTree(subComposite, SWT.BORDER, new org.eclipse.ui.dialogs.PatternFilter());
- TreeViewer theTreeViewer = representationTree.getViewer();
+ subComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
+ GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ layoutData.widthHint = 350;
+ subComposite.setLayoutData(layoutData);
+ representationTree = SWTUtil.createFilteredTree(subComposite, SWT.BORDER | SWT.MULTI, new org.eclipse.ui.dialogs.PatternFilter());
+ treeViewer = representationTree.getViewer();
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.minimumHeight = 200;
- theTreeViewer.getControl().setLayoutData(gridData);
- theTreeViewer.getTree().setHeaderVisible(false);
- theTreeViewer.getTree().setLinesVisible(false);
- final ITreeContentProvider contentProvider = new GroupingContentProvider(new TreeItemWrapperContentProvider());
- theTreeViewer.setContentProvider(contentProvider);
+ treeViewer.getControl().setLayoutData(gridData);
+ treeViewer.getTree().setHeaderVisible(false);
+ treeViewer.getTree().setLinesVisible(false);
siriusCommonContentProvider = new SiriusCommonContentProvider();
- theTreeViewer.setContentProvider(siriusCommonContentProvider);
- theTreeViewer.setLabelProvider(new SiriusCommonLabelProvider());
+ treeViewer.setContentProvider(siriusCommonContentProvider);
+ treeViewer.setLabelProvider(new SiriusRepresentationLabelProvider());
+ treeViewer.setSorter(new CommonItemSorter());
- updateViewerInput(theTreeViewer);
+ bindKeyToActions();
+ initializeMenusAndActions();
- deleteActionHandler = new DeleteActionHandler(theTreeViewer);
- renameActionHandler = new RenameActionHandler(theTreeViewer);
+ treeViewer.addDoubleClickListener(new ViewpointActivationAndRepresentationCreationDoubleClickListener());
+ createRepresentationExplorerButton(subComposite, treeViewer);
+ treeViewer.addSelectionChangedListener(new UpdateButtonsAndBrowserAtSelectionChangeListener());
- theTreeViewer.addSelectionChangedListener((event) -> {
- if (event.getSelection().isEmpty()) {
- removeSemanticModelOrRepresentationButton.setEnabled(false);
- deleteActionHandler.setEnabled(false);
- renameActionHandler.setEnabled(false);
- } else {
- TreeSelection selection = (TreeSelection) event.getSelection();
- // The tree allows only single selections so we pick the
- // first element.
- Object firstElement = selection.getFirstElement();
- if (firstElement instanceof RepresentationItemImpl) {
- removeSemanticModelOrRepresentationButton.setEnabled(true);
- deleteActionHandler.setEnabled(true);
- renameActionHandler.setEnabled(true);
- } else {
- removeSemanticModelOrRepresentationButton.setEnabled(false);
- deleteActionHandler.setEnabled(false);
- renameActionHandler.setEnabled(false);
- }
- }
- });
+ return treeViewer;
+ }
- theTreeViewer.setSorter(new CommonItemSorter());
-
- menuManager = new MenuManager();
- menuManager.addMenuListener(new IMenuListener() {
-
- @Override
- public void menuAboutToShow(IMenuManager manager) {
- manageSessionActionProvider.setContext(new ActionContext(theTreeViewer.getSelection()));
- manageSessionActionProvider.fillContextMenu(menuManager);
- }
-
- });
- Menu menu = menuManager.createContextMenu(theTreeViewer.getControl());
- manageSessionActionProvider = new ManageSessionActionProvider();
- manageSessionActionProvider.initFromViewer(theTreeViewer);
- theTreeViewer.getControl().setMenu(menu);
- theTreeViewer.getControl().addKeyListener(new KeyAdapter() {
+ /**
+ * Bind DEL and F2 keys to delete and rename actions.
+ */
+ private void bindKeyToActions() {
+ deleteActionHandler = new DeleteActionHandler(treeViewer);
+ renameActionHandler = new RenameActionHandler(treeViewer);
+ treeViewer.getControl().addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent event) {
handleKeyReleased(event);
}
});
+ }
- return theTreeViewer;
+ /**
+ * Initializes all menus and actions for representation blocks.
+ */
+ private void initializeMenusAndActions() {
+ menuManager = new MenuManager();
+ menuManager.addMenuListener(new IMenuListener() {
+
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ manageSessionActionProvider.setContext(new ActionContext(treeViewer.getSelection()));
+ manageSessionActionProvider.fillContextMenu(menuManager);
+ }
+
+ });
+ Menu menu = menuManager.createContextMenu(treeViewer.getControl());
+ menuManager.setRemoveAllWhenShown(true);
+ manageSessionActionProvider = new ManageSessionActionProvider();
+ manageSessionActionProvider.initFromViewer(treeViewer);
+ treeViewer.getControl().setMenu(menu);
+ }
+
+ /**
+ * Activate or deactivate the viewpoint of the given
+ * {@link ViewpointItemImpl} regarding the activation parameter.
+ *
+ * @param viewpointItem
+ * the {@link ViewpointItemImpl} from which the viewpoint should
+ * be activated or deactivated.
+ * @param changedViewpoint
+ * the viewpoint that will be deactivated or activated.
+ * @param selectedViewpoints
+ * the viewpoint that are currently selected in the session.
+ * @param activateViewpoint
+ * true if the viewpoint should be activated. False otherwise.
+ */
+ private void handleViewpointActivation(ViewpointItemImpl viewpointItem, Viewpoint changedViewpoint, Set<Viewpoint> selectedViewpoints, boolean activateViewpoint) {
+ treeViewer.getTree().setRedraw(false);
+ final SortedMap<Viewpoint, Boolean> originalViewpointsMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
+ Collection<Viewpoint> availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
+ for (final Viewpoint viewpoint : availableViewpoints) {
+ boolean selected = false;
+
+ for (Viewpoint selectedViewpoint : selectedViewpoints) {
+ if (EqualityHelper.areEquals(selectedViewpoint, viewpoint)) {
+ selected = true;
+ break;
+ }
+ }
+ originalViewpointsMap.put(viewpoint, Boolean.valueOf(selected));
+ }
+ SortedMap<Viewpoint, Boolean> newViewpointToSelectionStateMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
+ newViewpointToSelectionStateMap.putAll(originalViewpointsMap);
+ newViewpointToSelectionStateMap.put(changedViewpoint, !viewpointItem.isViewpointEnabledInSession());
+
+ // we also deselect viewpoint that will be missing a
+ // dependency if such element exists.
+ Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper
+ .getViewpointsMissingDependencies(newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
+ for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
+ newViewpointToSelectionStateMap.put(viewpointsMissingDependency, false);
+ }
+
+ ViewpointHelper.applyNewViewpointSelection(originalViewpointsMap, newViewpointToSelectionStateMap, session, true);
+
+ // if deactivation has been cancelled by user because an editor is
+ // currently open with one of the viewpoint representations, then we
+ // rollback all deactivation.
+ if ((activateViewpoint && !viewpointItem.isViewpointEnabledInSession()) || (!activateViewpoint && viewpointItem.isViewpointEnabledInSession())) {
+ ViewpointHelper.applyNewViewpointSelection(newViewpointToSelectionStateMap, originalViewpointsMap, session, false);
+ }
+ treeViewer.getTree().setRedraw(true);
+ treeViewer.refresh();
+ treeViewer.setSelection(new StructuredSelection(viewpointItem));
+ }
+
+ /**
+ * Returns the viewpoint that are currently selected in the session.
+ *
+ * @return the viewpoint that are currently selected in the session.
+ */
+ private Set<Viewpoint> getSelectedViewpoints() {
+ Set<Viewpoint> selectedViewpoints = new HashSet<>();
+ for (int i = 0; i < treeViewer.getTree().getItemCount(); i++) {
+ TreeItem treeItem = treeViewer.getTree().getItem(i);
+ if (treeItem.getData() instanceof ViewpointItemImpl) {
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) treeItem.getData();
+ if (viewpointItem.isViewpointEnabledInSession()) {
+ selectedViewpoints.add(viewpointItem.getViewpoint());
+ }
+ }
+ }
+ return selectedViewpoints;
+ }
+
+ /**
+ * Return an error message referencing all missing dependencies for the
+ * given viewpoint or null if no missing dependencies exists.
+ *
+ * @param viewpoint
+ * the viewpoint from which we check if it has missing
+ * dependencies among activated viewpoints.
+ * @param selectedViewpoints
+ * the current activated viewpoints.
+ * @return an error message referencing all missing dependencies for the
+ * given viewpoint or null if no missing dependencies exists.
+ */
+ protected String getMissingDependencyErrorMessage(Viewpoint viewpoint, Set<Viewpoint> selectedViewpoints) {
+ Set<Viewpoint> viewpoints = Sets.newHashSet(selectedViewpoints);
+ viewpoints.add(viewpoint);
+ Map<String, Collection<String>> missingDependencies = ViewpointSelection.getMissingDependencies(viewpoints);
+ if (missingDependencies != null && missingDependencies.get(viewpoint.getName()) != null) {
+ return MessageFormat.format(Messages.GraphicalRepresentationHandler_missingDependencies_requirements, viewpoint.getName(),
+ missingDependencies.get(viewpoint.getName()).stream().collect(Collectors.joining(", "))); //$NON-NLS-1$
+ }
+ return null;
}
/**
@@ -287,7 +551,9 @@
private void createRepresentationExplorerButton(Composite parent, final TreeViewer theTreeViewer) {
Composite subComposite = toolkit.createComposite(parent, SWT.NONE);
subComposite.setLayout(GridLayoutFactory.fillDefaults().margins(0, 0).create());
- subComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+ GridData layoutData = new GridData(SWT.LEFT, SWT.TOP, false, false);
+ layoutData.widthHint = 70;
+ subComposite.setLayoutData(layoutData);
Composite buttonsComposite = toolkit.createComposite(subComposite, SWT.NONE);
FillLayout buttonsLayout = new FillLayout(SWT.BEGINNING);
buttonsLayout.spacing = 5;
@@ -385,8 +651,7 @@
if (!representationTree.isDisposed()) {
updateViewerInput(treeViewer);
// we reset the selection to update the button
- // activated
- // state if needed.
+ // activated state if needed.
ISelection selection = treeViewer.getSelection();
treeViewer.setSelection(selection);
}
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
index 9f964d0..9bf6b09 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
@@ -26,7 +26,6 @@
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
@@ -35,9 +34,7 @@
import org.eclipse.sirius.business.api.session.SessionListener;
import org.eclipse.sirius.business.api.session.SessionManager;
import org.eclipse.sirius.business.api.session.SessionManagerListener;
-import org.eclipse.sirius.common.ui.tools.api.navigator.GroupingContentProvider;
import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
-import org.eclipse.sirius.common.ui.tools.api.util.TreeItemWrapperContentProvider;
import org.eclipse.sirius.ui.editor.Messages;
import org.eclipse.sirius.ui.tools.api.views.common.item.ProjectDependenciesItem;
import org.eclipse.sirius.ui.tools.internal.actions.analysis.AddModelDependencyAction;
@@ -280,12 +277,10 @@
modelTree = SWTUtil.createFilteredTree(parent, SWT.BORDER, new org.eclipse.ui.dialogs.PatternFilter());
TreeViewer theTreeViewer = modelTree.getViewer();
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
- gridData.widthHint = 450;
+ gridData.widthHint = 300;
theTreeViewer.getControl().setLayoutData(gridData);
theTreeViewer.getTree().setHeaderVisible(false);
theTreeViewer.getTree().setLinesVisible(false);
- final ITreeContentProvider contentProvider = new GroupingContentProvider(new TreeItemWrapperContentProvider());
- theTreeViewer.setContentProvider(contentProvider);
siriusCommonContentModelProvider = new SiriusCommonContentProvider();
theTreeViewer.setContentProvider(siriusCommonContentModelProvider);
theTreeViewer.setLabelProvider(new SiriusCommonLabelProvider());
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
index 8765294..d542668 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
@@ -26,10 +26,8 @@
import org.eclipse.sirius.ui.editor.SessionEditorPlugin;
import org.eclipse.sirius.ui.editor.internal.graphicalcomponents.GraphicalRepresentationHandler;
import org.eclipse.sirius.ui.editor.internal.graphicalcomponents.GraphicalSemanticModelsHandler;
-import org.eclipse.sirius.ui.tools.internal.viewpoint.DynamicViewpointsSelectionComponent;
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.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
@@ -37,7 +35,6 @@
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
@@ -68,8 +65,6 @@
*/
private Session session;
- private DynamicViewpointsSelectionComponent dynamicViewpointsSelectionComponent;
-
/**
* Label used to provides information regarding editor's context.
*/
@@ -116,17 +111,19 @@
body.setLayout(GridLayoutFactory.swtDefaults().create());
informativeLabel = toolkit.createFormText(body, false);
- informativeLabel.setText("<form><p>This editor is a work in progress, currently in alpha state. See <a href='https://wiki.eclipse.org/Sirius/SessionEditor'>the wiki</a> for more details and how to provide feedback.</p></form>", true, true); //$NON-NLS-1$
+ informativeLabel.setText(
+ "<form><p>This editor is a work in progress, currently in alpha state. See <a href='https://wiki.eclipse.org/Sirius/SessionEditor'>the wiki</a> for more details and how to provide feedback.</p></form>", //$NON-NLS-1$
+ true, true);
informativeLabel.addHyperlinkListener(new IHyperlinkListener() {
-
+
@Override
public void linkExited(HyperlinkEvent e) {
}
-
+
@Override
public void linkEntered(HyperlinkEvent e) {
}
-
+
@Override
public void linkActivated(HyperlinkEvent e) {
try {
@@ -148,7 +145,6 @@
rightComposite.setLayout(GridLayoutFactory.swtDefaults().margins(5, 0).create());
rightComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
- createViewpointSelectionControl(toolkit, rightComposite, scrolledForm);
createRepresentationsControl(toolkit, rightComposite);
session.addListener(this);
@@ -175,7 +171,7 @@
Composite modelSectionClient = toolkit.createComposite(modelSection, SWT.NONE);
modelSectionClient.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
- modelSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ modelSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
modelSection.setClient(modelSectionClient);
graphicalModelingHandler = new GraphicalSemanticModelsHandler(session, toolkit);
@@ -209,36 +205,6 @@
}
- /**
- * Create the control allowing to select/unselect active viewpoints of the
- * session.
- *
- * @param toolkit
- * the tool allowing to create form UI component.
- * @param rightComposite
- * the composite containing the viewpoint selection control.
- * @param scrolledForm
- * dd.
- */
- protected void createViewpointSelectionControl(FormToolkit toolkit, Composite rightComposite, ScrolledForm scrolledForm) {
- Composite bottomComposite = toolkit.createComposite(rightComposite);
- bottomComposite.setLayout(GridLayoutFactory.fillDefaults().create());
- bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
- final Section viewpointSection = toolkit.createSection(bottomComposite,
- Section.DESCRIPTION | Section.TITLE_BAR | ExpandableComposite.COMPACT | ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE);
- viewpointSection.setLayout(GridLayoutFactory.fillDefaults().create());
- viewpointSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
- viewpointSection.setText(Messages.UI_SessionEditor_viewpoints_title);
-
- Composite viewpointSectionClient = toolkit.createComposite(viewpointSection, SWT.NONE);
- GridLayout newLayout = GridLayoutFactory.fillDefaults().create();
- viewpointSectionClient.setLayout(newLayout);
- viewpointSection.setClient(viewpointSectionClient);
-
- dynamicViewpointsSelectionComponent = new DynamicViewpointsSelectionComponent(session);
- dynamicViewpointsSelectionComponent.createControl(viewpointSectionClient);
- }
-
@Override
public void doSave(IProgressMonitor monitor) {
if (session != null) {
@@ -288,10 +254,6 @@
session.removeListener(this);
session = null;
}
- if (dynamicViewpointsSelectionComponent != null) {
- dynamicViewpointsSelectionComponent.dispose();
- dynamicViewpointsSelectionComponent = null;
- }
if (graphicalModelingHandler != null) {
graphicalModelingHandler.dispose();
graphicalModelingHandler = null;
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java
new file mode 100644
index 0000000..0d872d7
--- /dev/null
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.ui.editor.provider;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
+import org.eclipse.sirius.ui.editor.Messages;
+import org.eclipse.sirius.ui.tools.api.color.VisualBindingManager;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.ViewpointItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonLabelProvider;
+import org.eclipse.sirius.viewpoint.description.Viewpoint;
+import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * This label provider is used to provides labels, images and foreground for
+ * items of the block showing representations and viewpoint on the same viewer.
+ *
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+public class SiriusRepresentationLabelProvider extends SiriusCommonLabelProvider {
+
+ @Override
+ public Color getForeground(Object element) {
+ // we show a gray out the item if it is a viewpoint item not enabled in
+ // the session of the current opened editor.
+ Color result = null;
+ if (element instanceof ViewpointItemImpl) {
+
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+
+ if (!viewpointItem.isViewpointEnabledInSession()) {
+ result = VisualBindingManager.getDefault().getColorFromName("gray"); //$NON-NLS-1$
+ }
+ }
+ if (result == null) {
+ result = super.getForeground(element);
+ }
+ return result;
+ }
+
+ @Override
+ public String getText(Object element) {
+ // We add a disabled label to the viewpoint item label if it is not
+ // enabled in the session of the current opened editor.
+ String text = super.getText(element);
+ if (element instanceof ViewpointItemImpl) {
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+
+ if (!viewpointItem.isViewpointEnabledInSession()) {
+ text += " (" + Messages.GraphicalRepresentationHandler_disabledViewpoint_label + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else if (element instanceof RepresentationDescriptionItemImpl) {
+ RepresentationDescriptionItemImpl descriptionItem = (RepresentationDescriptionItemImpl) element;
+ text += MessageFormat.format(Messages.GraphicalRepresentationHandler_representationNumber_label, descriptionItem.getChildren().size()); // $NON-NLS-1$
+ }
+ return text;
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ Image image = null;
+ // For viewpoint item we show as icon the one corresponding to the
+ // status of the viewpoint (coming from a plugin in the runtime context
+ // or in the workspace).
+ if (element instanceof ViewpointItemImpl) {
+ ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+ final Viewpoint vp = viewpointItem.getViewpoint();
+ if (vp.getIcon() != null && vp.getIcon().length() > 0) {
+ final ImageDescriptor desc = SiriusEditPlugin.Implementation.findImageDescriptor(vp.getIcon());
+ if (desc != null) {
+ image = SiriusEditPlugin.getPlugin().getImage(desc);
+ image = getEnhancedImage(image, vp);
+ }
+ }
+ if (image == null) {
+ image = SiriusEditPlugin.getPlugin().getImage(SiriusEditPlugin.getPlugin().getItemImageDescriptor(vp));
+ image = getEnhancedImage(image, vp);
+ }
+ } else {
+ image = super.getImage(element);
+ }
+ return image;
+ }
+
+ /**
+ * Return a composition of the viewpoint item image with the viewpoint image
+ * and a folder image as an overlay.
+ *
+ * @param image
+ * the viewpoint image.
+ * @param viewpoint
+ * the viewpoint from which we want the composed image.
+ * @return a composition of the viewpoint item image with the viewpoint
+ * image as an overlay and a folder image.
+ */
+ private Image getEnhancedImage(final Image image, final Viewpoint viewpoint) {
+ // Add decorator if the viewpoint comes from workspace
+ if (!ViewpointRegistry.getInstance().isFromPlugin(viewpoint) && image != null) {
+ return SiriusEditPlugin.getPlugin().getImage(getOverlayedDescriptor(image, "icons/full/decorator/folder_close.gif")); //$NON-NLS-1$
+ }
+ return image;
+ }
+
+ /**
+ * Returns an image descriptor of the folder image as overlay of the
+ * viewpoint image.
+ *
+ * @param baseImage
+ * viewpoint image
+ * @param decoratorPath
+ * path to the folder image.
+ * @return an image descriptor of the folder image as overlay of the
+ * viewpoint image.
+ */
+ private ImageDescriptor getOverlayedDescriptor(final Image baseImage, final String decoratorPath) {
+ final ImageDescriptor decoratorDescriptor = SiriusEditPlugin.Implementation.getBundledImageDescriptor(decoratorPath);
+ return new DecorationOverlayIcon(baseImage, decoratorDescriptor, IDecoration.BOTTOM_LEFT);
+ }
+
+}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java
deleted file mode 100644
index 565e80d..0000000
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Obeo.
- * 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:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.ui.tools.internal.viewpoint;
-
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.stream.Collectors;
-
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
-import org.eclipse.sirius.business.api.session.Session;
-import org.eclipse.sirius.business.api.session.SessionListener;
-import org.eclipse.sirius.business.internal.metamodel.description.spec.ViewpointSpec;
-import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
-import org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection;
-import org.eclipse.sirius.ui.tools.internal.wizards.pages.IViewpointStateListener;
-import org.eclipse.sirius.ui.tools.internal.wizards.pages.ViewpointStateChangeEvent;
-import org.eclipse.sirius.viewpoint.description.Viewpoint;
-import org.eclipse.sirius.viewpoint.provider.Messages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-/**
- * Component providing dynamic activation/deactivation behavior for the graphic component
- * {@link ViewpointsSelectionGraphicalHandler} and session synchronization. I.e any viewpoint check state change from
- * graphical component and triggered by user will be feed through to the session. And in the other way any change of
- * viewpoint activation/deactivation or presence change in the session will be feed through to the graphic component to
- * update viewpoints available and their check state status.
- *
- * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
- *
- */
-public class DynamicViewpointsSelectionComponent {
-
- /**
- * The session from which viewpoint will be available for activation/deactivation.
- */
- private Session session;
-
- /**
- * Contains all viewpoints available in the current runtime registry.
- */
- private Collection<Viewpoint> availableViewpoints;
-
- /**
- * Listen to any change regarding viewpoints or semantic models available to the session and refresh the list of
- * viewpoint available in the graphic component with their check status if needed.
- */
- private SessionChangeListener sessionChangelistener;
-
- /**
- * The graphic component containing checkbox for each viewpoint activable/deactivable and a browser allowing to see
- * a description for each.
- */
- private ViewpointsSelectionGraphicalHandler viewpointsSelectionGraphicalHandler;
-
- /**
- * Listener updating the session accordingly to changes triggered by user when checking /unchecking viewpoint from
- * graphical component {@link ViewpointsSelectionGraphicalHandler}.
- */
- private DefaultViewpointStateListener viewpointStateListener;
-
- /**
- * The last viewpoints activation status for the current editor session.
- */
- private Set<Viewpoint> lastSelectedViewpoints;
-
- /**
- * Listener delegating to the {@link DefaultViewpointStateListener} listener when a check state change occurs (I.e a
- * viewpoint has been checked or unchecked).
- */
- private ICheckStateListener checkStateListener;
-
- /**
- * Check if selected viewpoint is missing dependencies to be activated. If so it show an error message above the
- * viewpoint description browser.
- */
- private ISelectionChangedListener selectionListener;
-
- /**
- * This listener allows viewpoint activation/deactivation by a double click.
- */
- private IDoubleClickListener doubleClickListener;
-
- /**
- * Listener updating the session accordingly to changes triggered by user when checking /unchecking viewpoint from
- * graphical component {@link ViewpointsSelectionGraphicalHandler}.
- *
- * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
- *
- */
- private class DefaultViewpointStateListener implements IViewpointStateListener {
-
- @Override
- public void viewpointStateChange(ViewpointStateChangeEvent viewpointStateChangeEvent) {
- final SortedMap<Viewpoint, Boolean> originalViewpointsMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
- for (final Viewpoint viewpoint : availableViewpoints) {
- boolean selected = false;
-
- for (Viewpoint selectedViewpoint : lastSelectedViewpoints) {
- if (EqualityHelper.areEquals(selectedViewpoint, viewpoint)) {
- selected = true;
- break;
- }
- }
- originalViewpointsMap.put(viewpoint, Boolean.valueOf(selected));
- }
- SortedMap<Viewpoint, Boolean> newViewpointToSelectionStateMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
- newViewpointToSelectionStateMap.putAll(originalViewpointsMap);
- newViewpointToSelectionStateMap.put(viewpointStateChangeEvent.getViewpoint(), viewpointStateChangeEvent.shouldBeActivated());
-
- // we also deselect viewpoint that will be missing a dependency if such element exists.
- Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper.getViewpointsMissingDependencies(
- newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
- for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
- newViewpointToSelectionStateMap.put(viewpointsMissingDependency, false);
- }
-
- ViewpointHelper.applyNewViewpointSelection(originalViewpointsMap, newViewpointToSelectionStateMap, session, true);
-
- // If deselection has been cancelled we update the last selected viewpoints set to reflect this deselection
- // in the cache.
- boolean viewpointSelected = session.getSelectedViewpoints(true).stream().anyMatch(viewpoint -> EqualityHelper.areEquals(viewpointStateChangeEvent.getViewpoint(), viewpoint));
- newViewpointToSelectionStateMap.put(viewpointStateChangeEvent.getViewpoint(), viewpointSelected);
- for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
- viewpointSelected = session.getSelectedViewpoints(true).stream().anyMatch(viewpoint -> EqualityHelper.areEquals(viewpointsMissingDependency, viewpoint));
- newViewpointToSelectionStateMap.put(viewpointsMissingDependency, viewpointSelected);
- }
-
- lastSelectedViewpoints = new HashSet<Viewpoint>(
- newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
- viewpointsSelectionGraphicalHandler.getViewer().setCheckedElements(lastSelectedViewpoints.toArray(new Object[0]));
- viewpointsSelectionGraphicalHandler.getViewer().setSelection(new StructuredSelection(viewpointStateChangeEvent.getViewpoint()));
-
- updateGrayedOutElement();
- viewpointsSelectionGraphicalHandler.getViewer().refresh();
- }
-
- }
-
- /**
- * Create an instance of a graphic component allowing to activate/deactivate viewpoint from a session.
- *
- * @param theSession
- * the session from which viewpoint will be available for activation/deactivation.
- */
- public DynamicViewpointsSelectionComponent(final Session theSession) {
- this.session = theSession;
- viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
- availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(theSession);
- viewpointStateListener = new DefaultViewpointStateListener();
- lastSelectedViewpoints = new HashSet<Viewpoint>();
- }
-
- private void updateGrayedOutElement() {
- for (Viewpoint viewpoint : availableViewpoints) {
- String missingDependencyErrorMessage = getMissingDependencyErrorMessage(viewpoint, lastSelectedViewpoints);
- if (missingDependencyErrorMessage != null) {
- viewpointsSelectionGraphicalHandler.getViewer().setGrayed(viewpoint, true);
- } else {
- viewpointsSelectionGraphicalHandler.getViewer().setGrayed(viewpoint, false);
- }
- }
-
- }
-
- /**
- * Listen to any change regarding viewpoints or semantic models available to the session and refresh the list of
- * viewpoint available in the graphic component with their check status if needed. Viewpoint can be made unavailable
- * for the session when closing the project containing it and model semantic models can be removed for example.
- *
- * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
- *
- */
- private final class SessionChangeListener implements SessionListener {
- @Override
- public void notify(int changeKind) {
- switch (changeKind) {
- case SessionListener.SELECTED_VIEWS_CHANGE_KIND:
- case SessionListener.VSM_UPDATED:
- case SessionListener.SEMANTIC_CHANGE:
- availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
- setViewpoints(getAvailableViewpoints());
- break;
- default:
- break;
- }
-
- }
- }
-
- /**
- * Reinitialize the viewer containing all the checkbox for available viewpoints for the session with their check
- * status.
- *
- * @param theAvailableViewpoints
- * all the viewpoints available to the session that need to be made visible for activation/deactivation
- * to the user in the graphic component.
- */
- private void setViewpoints(Collection<Viewpoint> theAvailableViewpoints) {
- PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
- lastSelectedViewpoints.clear();
- CheckboxTableViewer viewer = viewpointsSelectionGraphicalHandler.getViewer();
- viewer.setInput(theAvailableViewpoints);
- // case were activated viewpoint are the one corresponding to the session.
- Collection<Viewpoint> selectedViewpoints = session.getSelectedViewpoints(false);
- for (int i = 0; i < viewer.getTable().getItemCount(); i++) {
- Object object = viewer.getElementAt(i);
- if (object instanceof Viewpoint) {
- Viewpoint viewerViewpoint = (Viewpoint) object;
- for (Viewpoint selectedViewpoint : selectedViewpoints) {
- if (EqualityHelper.areEquals(viewerViewpoint, selectedViewpoint)) {
- lastSelectedViewpoints.add(viewerViewpoint);
- }
- }
- }
- }
- if (!lastSelectedViewpoints.isEmpty()) {
- // Check all the default viewpoints
- viewer.setCheckedElements(lastSelectedViewpoints.toArray(new Object[0]));
- // Set the focus on the first one
- viewer.setSelection(new StructuredSelection(lastSelectedViewpoints.stream().findFirst().get()));
- } else {
- viewpointsSelectionGraphicalHandler.getBrowser().setText(""); //$NON-NLS-1$
- }
-
- // For all no selected viewpoints we check if they have missing dependencies among activated ones and if
- // they do we gray out
- // those.
- for (Viewpoint viewpoint : availableViewpoints) {
- Set<Viewpoint> viewpoints = new HashSet<Viewpoint>(lastSelectedViewpoints);
- viewpoints.add(viewpoint);
- Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper.getViewpointsMissingDependencies(viewpoints);
- if (viewpointsMissingDependencies.contains(viewpoint)) {
- viewer.setGrayed(viewpoint, true);
- } else {
- viewer.setGrayed(viewpoint, false);
- }
- }
- viewpointsSelectionGraphicalHandler.getRootComposite().layout();
- });
-
- }
-
- /**
- * Returns all registered viewpoints that define editors for metamodel of loaded session's semantic models.
- *
- * @return all registered viewpoints that define editors for metamodel of loaded session's semantic models.
- */
- public Collection<Viewpoint> getAvailableViewpoints() {
- return availableViewpoints;
- }
-
- /**
- * Create the control allowing to select/deselect viewpoints with checkbox and to see in a browser a description of
- * each viewpoint.
- *
- * @param parent
- * the parent composite to attached to this graphic component.
- */
- public void createControl(final Composite parent) {
- viewpointsSelectionGraphicalHandler.createControl(parent, false);
- viewpointsSelectionGraphicalHandler.setBrowserMinWidth(200);
- viewpointsSelectionGraphicalHandler.setHeight(304);
- checkStateListener = event -> {
- String errorMessage = null;
-
- if (event.getElement() instanceof Viewpoint) {
- Viewpoint viewpointChecked = (Viewpoint) event.getElement();
- viewpointsSelectionGraphicalHandler.getViewer().setSelection(new StructuredSelection(viewpointChecked));
- if (!lastSelectedViewpoints.isEmpty()) {
- errorMessage = getMissingDependencyErrorMessage(viewpointChecked, lastSelectedViewpoints);
- }
- if (errorMessage == null) {
- viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
- if (!viewpointsSelectionGraphicalHandler.getViewer().getGrayed(viewpointChecked)) {
- if (event.getChecked()) {
- viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpointChecked, true));
- } else {
- viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpointChecked, false));
- }
- }
- } else {
- viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
- }
- }
- };
- viewpointsSelectionGraphicalHandler.getViewer().addCheckStateListener(checkStateListener);
-
- selectionListener = event -> {
- if (event.getSelection() instanceof StructuredSelection) {
- StructuredSelection selection = (StructuredSelection) event.getSelection();
- if (selection.getFirstElement() instanceof Viewpoint) {
- Viewpoint viewpoint = (Viewpoint) selection.getFirstElement();
- String errorMessage = getMissingDependencyErrorMessage(viewpoint, lastSelectedViewpoints);
- if (errorMessage != null) {
- viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
- } else {
- viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
- }
- }
- }
- };
- viewpointsSelectionGraphicalHandler.getViewer().addSelectionChangedListener(selectionListener);
-
- doubleClickListener = (event) -> {
- event.getSelection();
- if (event.getSelection() instanceof StructuredSelection) {
- StructuredSelection selection = (StructuredSelection) event.getSelection();
- if (selection.getFirstElement() instanceof ViewpointSpec) {
- ViewpointSpec viewpoint = (ViewpointSpec) selection.getFirstElement();
- if (!viewpointsSelectionGraphicalHandler.getViewer().getGrayed(viewpoint)) {
- viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpoint, !viewpointsSelectionGraphicalHandler.getViewer().getChecked(viewpoint)));
- } else {
- viewpointsSelectionGraphicalHandler.getViewer().setChecked(viewpoint, !viewpointsSelectionGraphicalHandler.getViewer().getChecked(viewpoint));
- }
-
- }
- }
- };
- viewpointsSelectionGraphicalHandler.getViewer().addDoubleClickListener(doubleClickListener);
-
- setViewpoints(availableViewpoints);
- sessionChangelistener = new SessionChangeListener();
- session.addListener(sessionChangelistener);
- }
-
- /**
- * Return an error message referencing all missing dependencies for the given viewpoint or null if no missing
- * dependencies exists.
- *
- * @param viewpoint
- * the viewpoint from which we check if it has missing dependencies among activated viewpoints.
- * @param selectedViewpoints
- * the current activated viewpoints.
- * @return an error message referencing all missing dependencies for the given viewpoint or null if no missing
- * dependencies exists.
- */
- protected String getMissingDependencyErrorMessage(Viewpoint viewpoint, Set<Viewpoint> selectedViewpoints) {
- Set<Viewpoint> viewpoints = Sets.newHashSet(selectedViewpoints);
- viewpoints.add(viewpoint);
- Map<String, Collection<String>> missingDependencies = ViewpointSelection.getMissingDependencies(viewpoints);
- if (missingDependencies != null && missingDependencies.get(viewpoint.getName()) != null) {
- return MessageFormat.format(Messages.DynamicViewpointsSelectionComponent_missingDependencies_requirements, viewpoint.getName(),
- missingDependencies.get(viewpoint.getName()).stream().collect(Collectors.joining(", "))); //$NON-NLS-1$
- }
- return null;
- }
-
- /**
- * Dispose any listeners added by this instance.
- */
- public void dispose() {
- if (session != null && sessionChangelistener != null) {
- session.removeListener(sessionChangelistener);
- }
- if (viewpointsSelectionGraphicalHandler != null) {
- if (selectionListener != null) {
- viewpointsSelectionGraphicalHandler.getViewer().removeSelectionChangedListener(selectionListener);
- }
- if (checkStateListener != null) {
- viewpointsSelectionGraphicalHandler.getViewer().removeCheckStateListener(checkStateListener);
- }
- if (doubleClickListener != null) {
- viewpointsSelectionGraphicalHandler.getViewer().removeDoubleClickListener(doubleClickListener);
- }
- }
- viewpointStateListener = null;
- selectionListener = null;
- sessionChangelistener = null;
- session = null;
- }
-}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
index 593780b..f5c1521 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
@@ -122,6 +122,11 @@
private Composite browserErrorMessageComposite;
/**
+ * The root composite of the browser component.
+ */
+ private Composite browserRootComposite;
+
+ /**
* Return the composite enclosing all graphical parts of this component.
*
* @return the composite enclosing all graphical parts of this component.
@@ -140,6 +145,15 @@
}
/**
+ * Returns the root composite of the browser component.
+ *
+ * @return the root composite of the browser component.
+ */
+ public Composite getBrowserRootComposite() {
+ return browserRootComposite;
+ }
+
+ /**
* Return all registered viewpoints that define editors for metamodel of loaded session's semantic models.
*
* @param session
@@ -201,7 +215,7 @@
createTableViewer(rootComposite);
- this.browser = createBrowser(rootComposite);
+ createBrowser(rootComposite);
setBrowserInput(null);
}
@@ -214,9 +228,9 @@
* the parent composite to be attached to.
* @return the newly created {@link Browser}.
*/
- private Browser createBrowser(final Composite parent) {
+ public Browser createBrowser(final Composite parent) {
- Composite browserRootComposite = new Composite(parent, SWT.None);
+ browserRootComposite = new Composite(parent, SWT.BORDER);
browserRootComposite.setLayout(GridLayoutFactory.fillDefaults().create());
browserRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
@@ -241,6 +255,7 @@
browserGridData.widthHint = 0;
browserGridData.heightHint = 0;
aBrowser.setLayoutData(browserGridData);
+ this.browser = aBrowser;
return aBrowser;
} catch (SWTError error) {
/*
@@ -261,7 +276,7 @@
browserErrorMessageLayoutData.exclude = false;
browserErrorMessageText.setText(errorMessage);
browserErrorMessageComposite.setVisible(true);
- rootComposite.layout(true, true);
+ browserRootComposite.layout(true, true);
}
/**
@@ -271,7 +286,7 @@
browserErrorMessageLayoutData.exclude = true;
browserErrorMessageText.setText(""); //$NON-NLS-1$
browserErrorMessageComposite.setVisible(false);
- rootComposite.getParent().layout(true, true);
+ browserRootComposite.getParent().layout(true, true);
}
/**
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
index 3e4f684..7a17c15 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
@@ -21,6 +21,7 @@
import org.eclipse.sirius.business.api.query.IdentifiedElementQuery;
import org.eclipse.sirius.business.api.query.ViewpointQuery;
import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
import org.eclipse.sirius.common.tools.api.util.MessageTranslator;
import org.eclipse.sirius.common.ui.tools.api.view.common.item.ItemDecorator;
import org.eclipse.sirius.ext.base.Option;
@@ -186,4 +187,26 @@
public Image getImage() {
return SiriusEditPlugin.getPlugin().getImage(SiriusEditPlugin.getPlugin().getItemImageDescriptor(viewpoint));
}
+
+ /**
+ * Returns true if the viewpoint is enabled in the session of this item.
+ *
+ * @return true if the viewpoint is enabled in the session of this item. False otherwise.
+ */
+ public boolean isViewpointEnabledInSession() {
+ boolean isViewpointEnabledInSession = false;
+ Collection<Viewpoint> selectedViewpoints = session.getSelectedViewpoints(false);
+ for (Viewpoint viewpointTemp : selectedViewpoints) {
+ if (EqualityHelper.areEquals(viewpoint, viewpointTemp)) {
+ isViewpointEnabledInSession = true;
+ }
+
+ }
+ return isViewpointEnabledInSession;
+
+ }
+
+ public Viewpoint getViewpoint() {
+ return viewpoint;
+ }
}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
index f4e44e2..fa97163 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
@@ -16,13 +16,13 @@
import org.eclipse.sirius.ui.tools.api.views.ViewHelper;
import org.eclipse.sirius.ui.tools.internal.actions.creation.CreateRepresentationAction;
import org.eclipse.sirius.ui.tools.internal.views.common.SessionLabelProvider;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
import org.eclipse.sirius.ui.tools.internal.wizards.pages.RepresentationSelectionWizardPage;
import org.eclipse.sirius.ui.tools.internal.wizards.pages.SemanticElementSelectionWizardPage;
import org.eclipse.sirius.viewpoint.provider.Messages;
/**
- * This wizard creates a representation, choosing the representation type and
- * the semantic element.
+ * This wizard creates a representation, choosing the representation type and the semantic element.
*
* @author nlepine
*
@@ -35,6 +35,10 @@
private RepresentationSelectionWizardPage representationWizardPage;
+ private RepresentationDescriptionItemImpl representationDescriptionItem;
+
+ private boolean creationCancelled;
+
/**
* Constructor.
*
@@ -46,6 +50,19 @@
}
/**
+ * Initialize wizard with the given representation descriptor to use.
+ *
+ * @param theSession
+ * the session used for representation creation.
+ * @param theRepresentationDescriptionItem
+ * the representation descriptor to select by default.
+ */
+ public CreateRepresentationWizard(Session theSession, RepresentationDescriptionItemImpl theRepresentationDescriptionItem) {
+ this.session = theSession;
+ this.representationDescriptionItem = theRepresentationDescriptionItem;
+ }
+
+ /**
* Initialize the wizard.
*/
public void init() {
@@ -57,8 +74,8 @@
public boolean performFinish() {
EObject element = selectElementPage.getSelectedElement();
if (element != null) {
- CreateRepresentationAction action = new CreateRepresentationAction(session, element, representationWizardPage.getRepresentation(), new SessionLabelProvider(
- ViewHelper.INSTANCE.createAdapterFactory()));
+ CreateRepresentationAction action = new CreateRepresentationAction(session, element, representationWizardPage.getRepresentation(),
+ new SessionLabelProvider(ViewHelper.INSTANCE.createAdapterFactory()));
action.run();
}
return true;
@@ -66,7 +83,7 @@
@Override
public void addPages() {
- representationWizardPage = new RepresentationSelectionWizardPage(session);
+ representationWizardPage = new RepresentationSelectionWizardPage(session, representationDescriptionItem);
selectElementPage = new SemanticElementSelectionWizardPage(session);
representationWizardPage.setSelectionWizard(selectElementPage);
addPage(representationWizardPage);
@@ -85,4 +102,18 @@
return !representationWizardPage.isCurrentPageOnWizard() && super.canFinish();
}
+ @Override
+ public boolean performCancel() {
+ this.creationCancelled = true;
+ return true;
+ }
+
+ /**
+ * Returns true is the creation has been cancelled. False otherwise.
+ *
+ * @return true is the creation has been cancelled. False otherwise.
+ */
+ public boolean isCreationCancelled() {
+ return creationCancelled;
+ }
}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
index 4b6c54b..d5388d8 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
@@ -14,6 +14,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ISelection;
@@ -31,6 +32,7 @@
import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority;
import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
import org.eclipse.sirius.ui.tools.api.views.ViewHelper;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
import org.eclipse.sirius.ui.tools.internal.views.common.navigator.sorter.CommonItemSorter;
import org.eclipse.sirius.viewpoint.DView;
import org.eclipse.sirius.viewpoint.description.RepresentationDescription;
@@ -65,6 +67,11 @@
private SemanticElementSelectionWizardPage selectionWizard;
/**
+ * The representation descriptor that should be selected by default when opening the page.
+ */
+ private RepresentationDescriptionItemImpl representationDescriptionItem;
+
+ /**
* Create a new <code>RepresentationSelectionWizardPage</code>.
*
* @param root
@@ -77,6 +84,22 @@
setMessage(Messages.RepresentationSelectionWizardPage_message);
}
+ /**
+ * Create a new <code>RepresentationSelectionWizardPage</code>.
+ *
+ * @param theSession
+ * the session from which representations will be created.
+ * @param theRepresentationDescriptionItem
+ * The representation descriptor that should be selected by default when opening the page.
+ */
+ public RepresentationSelectionWizardPage(Session theSession, RepresentationDescriptionItemImpl theRepresentationDescriptionItem) {
+ super(Messages.RepresentationSelectionWizardPage_title);
+ this.setTitle(Messages.RepresentationSelectionWizardPage_title);
+ this.root = theSession;
+ setMessage(Messages.RepresentationSelectionWizardPage_message);
+ representationDescriptionItem = theRepresentationDescriptionItem;
+ }
+
@Override
public boolean canFlipToNextPage() {
boolean result = false;
@@ -160,7 +183,25 @@
}
}
});
-
+ if (representationDescriptionItem != null) {
+ // we select the representation description item among all other items.
+ treeViewer.expandAll();
+ int itemCount = treeViewer.getTree().getItemCount();
+ for (int i = 0; i < itemCount; i++) {
+ Object item = treeViewer.getTree().getItem(i).getData();
+ if (item instanceof Viewpoint) {
+ Viewpoint viewpoint = (Viewpoint) item;
+ Optional<RepresentationDescription> representationOption = Lists.newArrayList(viewpoint.getOwnedRepresentations()).stream()
+ .filter(rep -> CommonItemSorter.compareRepresentationDescriptions(rep, (RepresentationDescription) representationDescriptionItem.getWrappedObject()) == 0).findFirst();
+ if (representationOption.isPresent()) {
+ treeViewer.setSelection(new StructuredSelection(representationOption.get()), true);
+ representation = representationOption.get();
+ selectionWizard.setRepresentation(getRepresentation());
+ selectionWizard.update();
+ }
+ }
+ }
+ }
setControl(pageComposite);
}
@@ -214,6 +255,7 @@
return CommonItemSorter.compareRepresentationDescriptions(rep1, rep2);
};
});
+
children = reps.toArray();
}
return children;
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
index 5ad7f4b..7b2b381 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
@@ -100,10 +100,9 @@
final int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
tree = SWTUtil.createFilteredTree(parent, style, new EObjectFilter());
/*
- * If there is a problem accessing/enabling the quick selection mode the
- * best course of action is to fail silently, this mode only provides a
- * slightly improved user experience by automatically selecting the
- * first element which matches the filter and is selectable.
+ * If there is a problem accessing/enabling the quick selection mode the best course of action is to fail
+ * silently, this mode only provides a slightly improved user experience by automatically selecting the first
+ * element which matches the filter and is selectable.
*/
ReflectionHelper.invokeMethodWithoutException(tree, "setQuickSelectionMode", new Class[] { Boolean.TYPE }, new Object[] { true }); //$NON-NLS-1$
final TreeViewer viewer = tree.getViewer();
@@ -192,15 +191,16 @@
* Update the page.
*/
public void update() {
- treeViewer.refresh();
- if (tree.getFilterControl() != null) {
- /*
- * By setting the text to 'wilcard' ourselves we make sure to
- * trigger the filtering. As the tree has "QuickSelectionMode"
- * enabled it also makes the tree pre-select the first matching
- * node, saving the user a manual selection in many cases.
- */
- tree.getFilterControl().setText("*"); //$NON-NLS-1$
+ if (treeViewer != null) {
+ treeViewer.refresh();
+ if (tree.getFilterControl() != null) {
+ /*
+ * By setting the text to 'wilcard' ourselves we make sure to trigger the filtering. As the tree has
+ * "QuickSelectionMode" enabled it also makes the tree pre-select the first matching node, saving the
+ * user a manual selection in many cases.
+ */
+ tree.getFilterControl().setText("*"); //$NON-NLS-1$
+ }
}
}