/** * Copyright (c) 2009 Bestsolution.at and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Tom Schindl<tom.schindl@bestsolution.at> - Initial API and implementation */ package org.eclipse.emf.example.databinding.project.ui.rcp.views; import org.eclipse.core.databinding.ObservablesManager; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.services.ISourceProviderService; import org.eclipse.emf.examples.databinding.project.core.IModelResource; import org.eclipse.emf.examples.databinding.project.core.model.project.Project; import org.eclipse.emf.example.databinding.project.ui.rcp.Activator; import org.eclipse.emf.example.databinding.project.ui.rcp.ResourceProvider; import org.eclipse.emf.example.databinding.project.ui.rcp.databinding.EMFObservablesManager; /** * The workbench part displayed to the user */ public class ProjectAdminViewPart extends ViewPart implements ISaveablePart2 { /** * Id of the view */ public static final String ID = "org.eclipse.emf.example.databinding.project.ui.rcp.views.ProjectAdminViewPart"; private SashForm sashForm; private FormToolkit toolkit; private float divider = 0.2f; private static final String DIVIDER_KEY = Activator.PLUGIN_ID + ".divider"; private ObservablesManager mgr; private ObservablesManager defaultMgr; private IModelResource resource; private ProjectExplorerPart projectExplorer; private ProjectFormAreaPart projectDataForm; private IPartListener2 listener; private UndoAction undoAction; private RedoAction redoAction; private IModelResource.Listener modelListener; @Override public void init(final IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); if (memento != null && memento.getFloat(DIVIDER_KEY) != null) { divider = memento.getFloat(DIVIDER_KEY); } listener = new PartListenerImpl(site); site.getPage().addPartListener(listener); } @Override public void saveState(IMemento memento) { super.saveState(memento); int total = sashForm.getWeights()[0] + sashForm.getWeights()[1]; memento.putFloat(DIVIDER_KEY, sashForm.getWeights()[0] * 1.f / total); } @Override public void createPartControl(Composite parent) { String path = getViewSite().getSecondaryId().replaceAll("#_#", ":"); resource = Activator.getDefault().loadResource(path); //FIXME This needs to be a real URI modelListener = new IModelResource.Listener() { public void dirtyStateChanged() { firePropertyChange(PROP_DIRTY); } public void commandStackChanged() { // Ignore } }; resource.addListener(modelListener); if (resource == null) { throw new RuntimeException("Could not load resource!"); } toolkit = new FormToolkit(parent.getDisplay()); sashForm = new SashForm(parent, SWT.HORIZONTAL); /* * Track the creation of observables so that we don't leak listeners * when the view part is closed */ mgr = new EMFObservablesManager(); defaultMgr = new ObservablesManager(); mgr.runAndCollect(new Runnable() { public void run() { projectExplorer = new ProjectExplorerPart(getViewSite(), sashForm, toolkit, resource.getFoundation(), defaultMgr); projectDataForm = new ProjectFormAreaPart( getViewSite(), sashForm, toolkit, resource, defaultMgr, projectExplorer.getProjectObservable()); } }); int left = (int)(100 * divider); sashForm.setWeights(new int []{ left, 100 - left }); makeActions(); } private void makeActions() { undoAction = new UndoAction(resource); redoAction = new RedoAction(resource); getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction); getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction); } @Override public void setFocus() { projectExplorer.setFocus(); } @Override public void dispose() { if (undoAction != null) undoAction.dispose(); if (redoAction != null) redoAction.dispose(); if (modelListener != null && resource != null) resource.removeListener(modelListener); ISourceProviderService s = (ISourceProviderService)getSite().getService(ISourceProviderService.class); ResourceProvider p = (ResourceProvider)s.getSourceProvider(ResourceProvider.MODEL_RESOURCE_NAME); p.setModelResource(null); getSite().getPage().removePartListener(listener); projectDataForm.dispose(); projectExplorer.dispose(); if (toolkit != null) { toolkit.dispose(); } if (defaultMgr != null) { defaultMgr.dispose(); } if (mgr != null) { mgr.dispose(); } super.dispose(); } private class PartListenerImpl implements IPartListener2 { private IViewSite site; public PartListenerImpl(IViewSite site) { this.site = site; } public void partVisible(IWorkbenchPartReference partRef) { // Ignore } public void partOpened(IWorkbenchPartReference partRef) { // Ignore } public void partInputChanged(IWorkbenchPartReference partRef) { // Ignore } public void partHidden(IWorkbenchPartReference partRef) { // Ignore } public void partDeactivated(IWorkbenchPartReference partRef) { // Ignore } public void partClosed(IWorkbenchPartReference partRef) { // Ignore } public void partBroughtToTop(IWorkbenchPartReference partRef) { // Ignore } public void partActivated(IWorkbenchPartReference partRef) { ISourceProviderService s = (ISourceProviderService)site.getService(ISourceProviderService.class); ResourceProvider p = (ResourceProvider)s.getSourceProvider(ResourceProvider.MODEL_RESOURCE_NAME); p.setModelResource(resource); p.setCommitter(projectExplorer.getCommitter()); p.setProject((Project)projectExplorer.getProjectObservable().getValue()); } } public int promptToSaveOnClose() { return ISaveablePart2.DEFAULT; } public void doSave(IProgressMonitor monitor) { if (resource != null) { IStatus s = resource.save(); if (!s.isOK()) { Activator.getDefault().getLog().log(s); throw new RuntimeException(); } else { firePropertyChange(PROP_DIRTY); } } } public void doSaveAs() { // Ignore } public boolean isDirty() { return resource.isDirty(); } public boolean isSaveAsAllowed() { return false; } public boolean isSaveOnCloseNeeded() { return true; } }