blob: cfb38b35dbeda9c14262dfaa582bd24d9f51ca91 [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS core plugin --
-- --
-- Copyright (C) 2014 --
-- 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 java.net.URL;
import java.util.Hashtable;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.polarsys.chess.core.profiles.CHESSProfileManager;
import org.polarsys.chess.core.resourcelistener.ResourceSetListenerManager;
import org.polarsys.chess.core.resourcelistener.SelectionListenerManager;
import org.polarsys.chess.core.views.DiagramStatus;
import org.polarsys.chess.service.gui.utils.CHESSEditorUtils;
import org.polarsys.chess.service.internal.Activator;
public class CHESSService {
private static final String ICON_LOCATION = "org.polarsys.chess.service";
public static Hashtable<String, ImageDescriptor> viewIcons = new Hashtable<String, ImageDescriptor>();
private ISashWindowsContainer container;
private ServicesRegistry serviceRegistry;
private DiagramStatus diagramStatus;
private SelectionListenerManager selectionListener;
private ResourceSetListenerManager resourceListener;
private TransactionalEditingDomain editingDomain;
private IEditorPart currentEditor;
private IWorkbenchPage currentPage;
public CHESSService(ISashWindowsContainer container, ServicesRegistry registry) {
this.container = container;
serviceRegistry = registry;
}
public boolean start(IWorkbenchPart part) {
IEditorPart activeEditor = container.getActiveEditor();
if (activeEditor!=null && CHESSEditorUtils.isCHESSProject(activeEditor)) {
initializeCHESS(activeEditor);
return true;
}
if (activeEditor == null) {
//waitForActiveEditor();
//return true;
try {
if (part instanceof PapyrusMultiDiagramEditor){
PapyrusMultiDiagramEditor editor = (PapyrusMultiDiagramEditor)part;
serviceRegistry = (ServicesRegistry)editor.getAdapter(ServicesRegistry.class);
container = serviceRegistry.getService(ISashWindowsContainer.class);
if (CHESSEditorUtils.isCHESSProject(editor)) {
initializeCHESS(editor);
return true;
}
}
} catch (ServiceException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return false;
}
private void initializeCHESS(IEditorPart activeEditor) {
ModelSet modelSet = null;
//ISashWindowsContainer container = null;
try {
modelSet = serviceRegistry.getService(ModelSet.class);
// container = serviceRegistry.getService(ISashWindowsContainer.class);
// container = ServiceUtils.getInstance().getISashWindowsContainer(
// serviceRegistry);
container = (ISashWindowsContainer)activeEditor.getAdapter(ISashWindowsContainer.class);
if (container == null)
container = serviceRegistry.getService(ISashWindowsContainer.class);
diagramStatus = new DiagramStatus(
container.getActiveSashWindowsPage());
editingDomain = modelSet
.getTransactionalEditingDomain();
CHESSProfileManager
.loadCHESSProfile(editingDomain.getResourceSet());
//let plugins to load external profiles
CHESSProfileManager.loadExternalProfiles(editingDomain.getResourceSet());
resourceListener = new ResourceSetListenerManager(
serviceRegistry);
editingDomain
.addResourceSetListener(resourceListener);
//serviceRegistry.add(DiagramStatus.class, 5, diagramStatus);
selectionListener = new SelectionListenerManager(
serviceRegistry);
currentEditor = activeEditor;
currentPage = currentEditor.getSite().getPage();
currentPage.addSelectionListener(selectionListener);
loadIcons();
//System.err.println("CHESS Service initialized...");
//clean diagrams: useful when the .model is modified outside the CHESS editor
//TODO we should add a user-level preference to enable/disable this action
CHESSEditorUtils.cleanAllDiagrams();
Activator.info("CHESS Service has been initialized.");
} catch (ServiceException e) {
Activator.error("Errors during CHESS service initialization", e);
}
}
public void stopService(){
currentPage.removeSelectionListener(selectionListener);
editingDomain.removeResourceSetListener(resourceListener);
//System.err.println("CHESS Service terminated.");
Activator.info("CHESS Service has been terminated.");
}
private void loadIcons() {
// Load view icons
if (!viewIcons.keySet().isEmpty()){
return;
}
URL nullFile = FileLocator.find(Platform
.getBundle(ICON_LOCATION), new Path(
"icons/NullView.gif"), null);
ImageDescriptor icon = ImageDescriptor.createFromURL(nullFile);
viewIcons.put(CHESSProfileManager.NULL_VIEW, icon);
for (String v : CHESSProfileManager.CHESS_VIEWS_LIST) {
URL file = FileLocator.find(
Platform.getBundle(ICON_LOCATION),
new Path("icons/" + v + ".gif"), null);
if (file != null) {
icon = ImageDescriptor.createFromURL(file);
} else {
icon = ImageDescriptor.createFromURL(nullFile);
}
viewIcons.put(v, icon);
}
}
public void unload() {
// TODO Auto-generated method stub
}
public DiagramStatus getDiagramStatus() {
return diagramStatus;
}
}