/******************************************************************************* * Copyright (c) 2007 VTT Technical Research Centre of Finland and others. * 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: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.proconf.g3d.base; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IPartListener; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.simantics.db.Graph; import org.simantics.db.GraphRequestAdapter; import org.simantics.db.GraphRequestStatus; import org.simantics.db.Session; import org.simantics.db.Resource; import org.simantics.db.events.GraphChangeEvent; import org.simantics.db.management.ISessionContext; import org.simantics.proconf.ui.workbench.ResourceEditorPart; import org.simantics.utils.ErrorLogger; public abstract class ThreeDimensionalEditorPart extends ResourceEditorPart implements ThreeDimensionalEditorProvider{ protected Composite parent; protected ThreeDimensionalEditorBase editor; protected ISelectionListener pageSelectionListener; protected abstract ThreeDimensionalEditorBase createEditor(ISessionContext session); /** * This is a callback that will allow us to create the viewer and it. */ @Override public void createPartControl(Composite p) { this.parent = p; try { editor = createEditor(getSessionContext()); // add partlistener that loads the scene-graph when the view has been created this.getEditorSite().getPage().addPartListener(new IPartListener() { boolean opened = false; boolean activated = false; public void partOpened(IWorkbenchPart part) { if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) { opened = true; } } public void partActivated(IWorkbenchPart part) { if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) { if (opened & !activated) { activated = true; load(); } } } public void partBroughtToTop(IWorkbenchPart part) {} public void partClosed(IWorkbenchPart part) {} public void partDeactivated(IWorkbenchPart part) {} private void load() { //System.out.println("ThreeDimensionalEditorPart.reload()"); Session ses = ThreeDimensionalEditorPart.this.getSession(); GraphRequestAdapter r = new GraphRequestAdapter() { @Override public GraphRequestStatus perform(Graph g) throws Exception { reload(g); return GraphRequestStatus.transactionComplete(); } }; ses.asyncRead(r); } }); IActionBars actionBar = getEditorSite().getActionBars(); // editor.setActionBarContributor(getEditorSite().getActionBarContributor()); editor.setActionBars(actionBar); getSession().syncRead(new GraphRequestAdapter() { @Override public GraphRequestStatus perform(Graph g) throws Exception { editor.createControl(g,parent); return GraphRequestStatus.transactionComplete(); } }); contributeStatusBar(actionBar.getStatusLineManager()); hookPageSelection(); getSite().setSelectionProvider(editor.selectionAdapter); } catch (Exception e) { Display d = getSite().getShell().getDisplay(); d.asyncExec(new Runnable() { public void run() { getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false); } }); ErrorLogger logger = ErrorLogger.getDefault(); logger.logError("Shape editor failed to open, see exception for details", e); } } protected void contributeStatusBar(IStatusLineManager manager) { } @Override public void reload(Graph g) { Resource inputResource = getInputResource(); if (inputResource != null) { editor.reload(g,inputResource); } else { Display d = getSite().getShell().getDisplay(); d.asyncExec(new Runnable() { public void run() { editor.showMessage("Failed to load model."); getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false); } }); } } @Override public void update(GraphChangeEvent e) { editor.update(e); } @Override public void setFocus() { editor.setFocus(); } /** * Hooks selection listening */ private void hookPageSelection() { pageSelectionListener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (part == ThreeDimensionalEditorPart.this) return; pageSelectionChanged(part, selection); } }; getSite().getPage().addPostSelectionListener(pageSelectionListener); ISelection sel = getSite().getPage().getSelection(); IWorkbenchPart wb = getSite().getPage().getActivePart(); pageSelectionChanged(wb, sel); } /** * Receives selection changes * * @param part * @param selection */ protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) { editor.pageSelectionChanged(part, selection); } public void dispose() { if (pageSelectionListener != null) getSite().getPage().removePostSelectionListener(pageSelectionListener); editor.dispose(); super.dispose(); } public ThreeDimensionalEditorBase getEditor() { return editor; } @Override public Object getAdapter(Class adapter) { Object o = super.getAdapter(adapter); if (o == null) { o = editor.getAdapter(adapter); } return o; } }