X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Fbase%2FThreeDimensionalEditorPart.java;fp=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Fbase%2FThreeDimensionalEditorPart.java;h=a3da25103e60cff356df0fb9c8c87c1c532c36fb;hb=10f144a2bb2d7bec98b812b83acecb333fd098ea;hp=0000000000000000000000000000000000000000;hpb=3055b543aa5afc0cca4bb3b341704e7c5103fa6a;p=simantics%2F3d.git diff --git a/org.simantics.g3d/src/org/simantics/proconf/g3d/base/ThreeDimensionalEditorPart.java b/org.simantics.g3d/src/org/simantics/proconf/g3d/base/ThreeDimensionalEditorPart.java new file mode 100644 index 00000000..a3da2510 --- /dev/null +++ b/org.simantics.g3d/src/org/simantics/proconf/g3d/base/ThreeDimensionalEditorPart.java @@ -0,0 +1,188 @@ +/******************************************************************************* + * Copyright (c) 2007- VTT Technical Research Centre of Finland. + * 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.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.ui.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 EditorLoader() { + + public IWorkbenchPart getWorkbechPart() { + return ThreeDimensionalEditorPart.this.getEditorSite().getPart(); + } + + public 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); + getSite().getPage().addSelectionListener(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); + getSite().getPage().removeSelectionListener(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; + } + + + +}