blob: d1355bb0a6890c26504dbda01cdbabc48342abd6 [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS editor plugin --
-- --
-- Copyright (C) 2011-2012 --
-- University of Padova, ITALY --
-- --
-- Author: Alessandro Zovi azovi@math.unipd.it --
-- --
-- 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-v20.html --
-----------------------------------------------------------------------
*/
package org.polarsys.chess.service.internal.service;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.impl.EObjectTreeElementImpl;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.services.ISourceProviderService;
import org.eclipse.ui.views.properties.PropertySheet;
import org.polarsys.chess.core.resourcelistener.SelectionListenerExtra;
import org.polarsys.chess.core.views.DiagramStatus;
import org.polarsys.chess.service.core.exceptions.NoDiagramStatusException;
import org.polarsys.chess.service.gui.utils.CHESSEditorUtils;
import org.polarsys.chess.service.internal.Activator;
import org.polarsys.chess.service.internal.commands.switchers.SwitchSourceProvider;
import org.polarsys.chess.service.internal.palette.PaletteManager;
public class SelectionListener extends SelectionListenerExtra {
DiagramStatus diagramStatus = null;
private void retrieveDiagramStatus() throws NoDiagramStatusException{
// lazy association
if (diagramStatus == null)
diagramStatus = CHESSEditorUtils.getDiagramStatus(getRegistry());
if (diagramStatus == null) {
throw new NoDiagramStatusException();
}
}
private void processPart(IWorkbenchPart part, ISelection selection){
if (part instanceof PropertySheet) {
/*get the actual active editor*/
part = ((PropertySheet) part).getSite().getWorkbenchWindow()
.getActivePage().getActiveEditor();
} else if (part instanceof PapyrusMultiDiagramEditor &&
CHESSEditorUtils.isCHESSProject((IEditorPart)part)) {
// listens to sash page change events in the editor and
// modify the view
PapyrusMultiDiagramEditor editor = (PapyrusMultiDiagramEditor) part;
IPage activePage = (editor).getISashWindowsContainer()
.getActiveSashWindowsPage();
diagramStatus.setActualView(activePage);
// enable/disable palette according to current view
PaletteManager.setPaletteVisibility(editor, diagramStatus);
} else if (part instanceof ModelExplorerPageBookView
&& selection instanceof TreeSelection && !selection.isEmpty()) {
// listens to model element selection in Model Explorer
TreeSelection tSelection = (TreeSelection) selection;
Object fElement = tSelection.getFirstElement();
if (fElement instanceof EObjectTreeElementImpl) {
diagramStatus.setActualView(tSelection);
}
}
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
try {
retrieveDiagramStatus();
diagramStatus.setUserAction(true);
processPart(part, selection);
IWorkbenchWindow window = part.getSite().getWorkbenchWindow();
if (window.getActivePage() != null) {
updateStatus(window);
}
} catch (NoDiagramStatusException e1) {
Activator.error(null, e1);
} catch (Exception e2) {
Activator.error(null, e2);
}
}
/**
* Enable/disable the switch to extra-functional view command
* Enable when the current view is the functional view
*/
private void updateStatus(IWorkbenchWindow window) {
ISourceProviderService spService = (ISourceProviderService) window
.getService(ISourceProviderService.class);
SwitchSourceProvider sp = (SwitchSourceProvider) spService
.getSourceProvider(SwitchSourceProvider.SWITCH);
sp.updateStatus(window.getActivePage().getActiveEditor());
}
}