| /******************************************************************************* |
| * Copyright (c) 2006, 2015 THALES GLOBAL SERVICES. |
| * 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: |
| * Thales - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.amalgam.explorer.activity.ui.api.editor.pages; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.amalgam.explorer.activity.ui.ActivityExplorerActivator; |
| import org.eclipse.amalgam.explorer.activity.ui.api.actions.DescriptionAction; |
| import org.eclipse.amalgam.explorer.activity.ui.api.actions.OpenActivityExplorerAction2; |
| import org.eclipse.amalgam.explorer.activity.ui.api.actions.ViewerFilteringAction; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.activities.ExplorerActivity; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.helper.FormHelper; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.helper.FormHelper.LayoutType; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.viewers.AbstractActivityExplorerViewer; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.viewers.DiagramViewer; |
| import org.eclipse.amalgam.explorer.activity.ui.api.editor.sections.ActivityExplorerSection; |
| import org.eclipse.amalgam.explorer.activity.ui.api.hyperlinkadapter.AbstractNewDiagramHyperlinkAdapter; |
| import org.eclipse.amalgam.explorer.activity.ui.internal.actions.util.MDSashForm; |
| import org.eclipse.amalgam.explorer.activity.ui.internal.extension.point.manager.ActivityExplorerExtensionManager; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.action.IMenuListener2; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.sirius.business.api.session.Session; |
| import org.eclipse.sirius.business.api.session.SessionManager; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.forms.IManagedForm; |
| import org.eclipse.ui.forms.events.IHyperlinkListener; |
| import org.eclipse.ui.forms.widgets.Form; |
| import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; |
| |
| /** |
| * Base class to implement basic session Activity Explorer page. |
| */ |
| public class BasicSessionActivityExplorerPage extends ActivityExplorerPage { |
| |
| /** |
| * Diagrams Viewer weight (used by the sash).ContentProvider |
| */ |
| private static final int DIAGRAMS_VIEWER_WEIGHT = 40; |
| |
| /** |
| * ActivityExplorerSection weight (used by the sash). |
| */ |
| private static final int SECTION_WEIGHT = 60; |
| |
| /** |
| * Container that hosts the viewer. |
| */ |
| private Composite _viewerContainer; |
| |
| /** |
| * List of Viewers in the current page |
| */ |
| private Set<AbstractActivityExplorerViewer> viewers = new HashSet<AbstractActivityExplorerViewer>(); |
| |
| /** |
| * define if viewer should appears in the page |
| */ |
| private boolean displayViewer; |
| |
| @Override |
| protected void createHeaderSections(Composite sectionContainer_p, IManagedForm managedForm_p) { |
| |
| // Create Overview section. |
| |
| final Form formWidget = managedForm_p.getForm().getForm(); |
| |
| // init |
| formWidget.getMenuManager().add(new Separator("empty-list")); //$NON-NLS-1$ |
| |
| // add listener |
| formWidget.getMenuManager().addMenuListener(new IMenuListener2() { |
| |
| public void menuAboutToShow(IMenuManager manager) { |
| |
| manager.removeAll(); |
| |
| for (Session session : SessionManager.INSTANCE.getSessions()) { |
| |
| if (!session.equals(BasicSessionActivityExplorerPage.this.getEditorInput().getSession())) { |
| formWidget.getMenuManager().add(new OpenActivityExplorerAction2(session)); |
| } |
| } |
| |
| } |
| |
| public void menuAboutToHide(IMenuManager manager) { |
| |
| } |
| |
| }); |
| |
| formWidget.getToolBarManager().update(true); |
| |
| createOverviewSection(sectionContainer_p, managedForm_p); |
| } |
| |
| @Override |
| protected void createFormContent(IManagedForm managedForm_p) { |
| super.createFormContent(managedForm_p); |
| |
| if (displayViewer) { |
| MDSashForm sashForm = (MDSashForm) getSectionContainer().getParent(); |
| _viewerContainer = createViewerContainer(sashForm, managedForm_p); |
| _viewerContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| // create viewers |
| createViewers(_viewerContainer, managedForm_p); |
| |
| // Hook resize listener for the sash behavior. |
| hookResizeListener(); |
| |
| // 66% 34 % weights for the sash. |
| sashForm.setWeights(new int[] { SECTION_WEIGHT, DIAGRAMS_VIEWER_WEIGHT }); |
| |
| // Force a layout to make sure, page is well refreshed. |
| managedForm_p.reflow(true); |
| |
| } |
| } |
| |
| /** |
| * defines the type of particular viewer that should be adding to the page. |
| */ |
| @SuppressWarnings("unchecked") |
| protected Class<? extends AbstractActivityExplorerViewer>[] addViewersTypeInPage() { |
| return new Class[] { DiagramViewer.class }; |
| } |
| |
| /** |
| * create and add a viewer in the page. |
| * @param viewerContainer_p |
| * @param managedForm_p |
| */ |
| private void createViewers(Composite viewerContainer_p, IManagedForm managedForm_p) { |
| Class<? extends AbstractActivityExplorerViewer>[] viewerTab = addViewersTypeInPage(); |
| for (Class<? extends AbstractActivityExplorerViewer> viewer : viewerTab) { |
| AbstractActivityExplorerViewer newViewer = addNewViewer(viewer); |
| newViewer.createViewer(viewerContainer_p, managedForm_p); |
| } |
| } |
| |
| /** |
| * Allows to add a new Viewer |
| * @param viewer |
| */ |
| protected final AbstractActivityExplorerViewer addNewViewer(Class<? extends AbstractActivityExplorerViewer> viewer) { |
| AbstractActivityExplorerViewer newViewer = null; |
| try { |
| newViewer = viewer.getConstructor(BasicSessionActivityExplorerPage.class).newInstance(this); |
| viewers.add(newViewer); |
| } catch (Exception ex) { |
| ActivityExplorerActivator.getDefault().sentToLogger(ex); |
| } |
| |
| return newViewer; |
| } |
| |
| /** |
| * Create the viewer that displays diagrams. |
| * @param viewerContainer_p |
| * @param managedForm_p |
| */ |
| /* |
| * protected Couple<TreeViewer, Section> createViewer(Composite viewerContainer_p, IManagedForm managedForm_p) { // Create the section. Couple<Section, |
| * Composite> section = FormHelper.createSectionWithDescription(managedForm_p.getToolkit(), viewerContainer_p, getViewerSectionTitle(), null); |
| * FormHelper.createSectionToolbar(section.getKey(), Collections.singletonList(getResetSectionFilter())); section.getKey().setLayoutData(new |
| * GridData(GridData.FILL_BOTH)); // Create a tree viewer with a regular expression filter. PatternFilter patternFilter = new PatternFilter(); |
| * @SuppressWarnings("deprecation") FilteredTree filteredTree = new FilteredTree(section.getValue(),SWT.NONE | SWT.SINGLE | SWT.BORDER, patternFilter); |
| * managedForm_p.getToolkit().adapt(filteredTree); // Get the tree viewer. final TreeViewer treeViewer = filteredTree.getViewer(); // Add double click |
| * listener to open double-clicked diagrams. addListenersOnViewer(treeViewer); // Add the filter driven by section. _diagramViewerFilter = new |
| * DelegatedViewerFilter(); treeViewer.addFilter(_diagramViewerFilter); // Set content provider. treeViewer.setContentProvider(getContentProvider()); // Set |
| * label provider. treeViewer.setLabelProvider(getLabelProvider()); // Auto expand the root node. treeViewer.setAutoExpandLevel(2); // Set the initial input. |
| * Also make sure to refresh the viewer if underlying // resources change. _sessionListener = new SessionListener() { public void notify(int changeKind_p) { |
| * if (changeKind_p == SessionListener.REPLACED) { markDiagramViewerAsDirty(); } } }; this.getEditorInput().getSession().addListener(_sessionListener); |
| * treeViewer.setInput(getInput()); // Forward selection changes to the editor site selection provider to notify the platform (e.g property view). |
| * treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| *//** |
| * {@inheritDoc} |
| */ |
| /* |
| * public void selectionChanged(SelectionChangedEvent event_p) { getEditorSite ().getSelectionProvider().setSelection(event_p.getSelection()); } }); // Make a |
| * context menu for the tree viewer. makeViewerActions(treeViewer); return new Couple<TreeViewer, Section>(treeViewer, section.getKey()); } protected String |
| * getViewerSectionTitle() { return Messages.BasicSessionActivityExplorerPage_0; } |
| */ |
| |
| /* |
| * protected Object getInput() { return getEditorInput().getSession(); } protected ILabelProvider getLabelProvider() { return new |
| * ViewpointCommonLabelProvider(); } |
| */ |
| |
| /** |
| * Create viewer container that hosts the viewer.<br> |
| * This one layouts its content using a {@link GridLayout}. |
| * @param parent_p |
| * @param managedForm_p |
| * @return |
| */ |
| protected Composite createViewerContainer(Composite parent_p, IManagedForm managedForm_p) { |
| return FormHelper.createCompositeWithLayoutType(managedForm_p.getToolkit(), parent_p, LayoutType.GRID_LAYOUT, 1, true); |
| } |
| |
| /** |
| * @see org.eclipse.ui.forms.editor.FormPage#dispose() |
| */ |
| @Override |
| public void dispose() { |
| // Unregister as property listener. |
| ActivityExplorerActivator.getDefault().getPreferenceStore().removePropertyChangeListener(this); |
| // Dispose viewer actions. |
| |
| for (AbstractActivityExplorerViewer viewer : viewers) { |
| viewer.dispose(); |
| } |
| // clean the viewers' list |
| viewers.clear(); |
| |
| super.dispose(); |
| } |
| |
| /** |
| * Get the viewpoint handled by this page. |
| * @return an empty string. |
| */ |
| public Set<String> getHandledViewpoint() { |
| Set<String> vps = new HashSet<String>(); |
| for (org.eclipse.amalgam.explorer.activity.ui.api.editor.sections.ActivityExplorerSection section : getSections()) { |
| for (ExplorerActivity activity : section.getActivities()) { |
| IHyperlinkListener listener = activity.getListener(); |
| if (listener instanceof AbstractNewDiagramHyperlinkAdapter) { |
| vps.add(((AbstractNewDiagramHyperlinkAdapter) listener).getRepresentationName()); |
| } |
| } |
| } |
| return vps; |
| } |
| |
| /** |
| * Handle contributed sections for specified ActivityExplorerPagesProvider. |
| * @param contributor_p |
| * @param sectionContainer_p |
| * @param managedForm_p |
| */ |
| @Override |
| protected void handleContributedSectionsFor(IConfigurationElement contributor_p) { |
| |
| // create the session |
| ActivityExplorerSection newSection = new ActivityExplorerSection(contributor_p) { |
| @Override |
| protected IAction[] getToolBarActions() { |
| |
| IAction[] toolbarActions = |
| new IAction[] { new DescriptionAction(BasicSessionActivityExplorerPage.this.getSite().getShell(), getDescription()), |
| new ViewerFilteringAction(BasicSessionActivityExplorerPage.this, this) }; |
| |
| if (!isFiltering()) { |
| toolbarActions = new IAction[] { new DescriptionAction(BasicSessionActivityExplorerPage.this.getSite().getShell(), getDescription()), }; |
| } |
| |
| return toolbarActions; |
| } |
| }; |
| |
| // inserts sections in page |
| boolean value = getSections().add(newSection); |
| if (!value) { |
| ActivityExplorerActivator |
| .getDefault() |
| .getLog() |
| .log( |
| new Status(IStatus.ERROR, ActivityExplorerActivator.ID, "The declared section: " + newSection.getId() |
| + " has the same index of a another section. Changes it!")); //$NON-NLS-1$ |
| } |
| |
| } |
| |
| /** |
| * Refresh the diagram viewer. |
| */ |
| /* |
| * public void refreshDiagramViewer() { if ((null != _viewer) && !_viewer.getControl().isDisposed()) { getViewer().refresh(); _isDirty = false; } } |
| */ |
| /** |
| * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean) |
| */ |
| @Override |
| public void setActive(boolean active_p) { |
| super.setActive(active_p); |
| if (active_p) { |
| // Set a new selection to the property sheet page on Activity Explorer page |
| // activation. |
| setCurrentPageSelectionToPropertySheetPage(); |
| } |
| } |
| |
| /** |
| * Refresh the property sheet page according to the current viewer selection.<br> |
| * {@link #getViewer()}. |
| */ |
| protected void setCurrentPageSelectionToPropertySheetPage() { |
| // Call the property sheet page without loading it. |
| // Indeed, we won't load it if the view is not displayed. |
| TabbedPropertySheetPage propertySheetPage = getEditor().getPropertySheetPage(); |
| |
| if ((null != propertySheetPage) && displayViewer) { |
| /* |
| * Viewer viewer = getViewer(); if(null!= viewer){ ISelection currentSelection = viewer.getSelection(); if(currentSelection != null) |
| * propertySheetPage.selectionChanged(getEditor(), currentSelection); } |
| */// TODO:A modifier pour la prise en compte de plusieurs viewer |
| } |
| } |
| |
| /** |
| * Set a viewer filter on the diagram viewer. |
| * @param filter_p <code>null</code> means reset the filter. |
| * @param action_p |
| */ |
| public void callViewersFilter(ViewerFilteringAction action_p) { |
| // If given filter is null that means reset the filter. |
| for (AbstractActivityExplorerViewer viewer : viewers) { |
| viewer.setViewerFilter(action_p); |
| } |
| } |
| |
| /** |
| * Uncheck the previous action's section that drove the filter. |
| */ |
| /* |
| * private void uncheckSectionFilterAction() { if (null != _sectionActionDrivingFilter) { _sectionActionDrivingFilter.setChecked(false); |
| * _sectionActionDrivingFilter = null; } } |
| */ |
| |
| /** |
| * Update action bars (handlers). |
| * @param editorActionBars |
| */ |
| @Override |
| public void updateActionBars() { |
| IActionBars editorActionBars = getEditorSite().getActionBars(); |
| // editorActionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), |
| // _deleteRepresentationAction); |
| // editorActionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), |
| // _renameRepresentationAction); |
| // Update action bars to make sure global ActionHandler are updated |
| // accordingly. |
| editorActionBars.updateActionBars(); |
| } |
| |
| /** |
| * Test if a viewer should be display in the page. |
| * @return boolean |
| */ |
| protected boolean isDisplayViewerInPage() { |
| return displayViewer; |
| } |
| |
| @Override |
| public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) { |
| |
| super.setInitializationData(cfig, propertyName, data); |
| displayViewer = ActivityExplorerExtensionManager.getIsDisplayViewerInPage(cfig); |
| |
| } |
| |
| /** |
| * Test if the page should be visible. if no sections is visible the page is not visible. |
| * @return boolean |
| */ |
| @Override |
| public boolean isVisible() { |
| boolean result = super.isVisible(); |
| result &= !getVisibleSections().isEmpty(); |
| |
| return result; |
| } |
| |
| } |