/* Copyright 2012-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.snaker.designer; import java.util.ArrayList; import java.util.EventObject; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.gef.commands.CommandStackListener; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.SelectionAction; import org.eclipse.gef.ui.actions.UpdateAction; import org.eclipse.gef.ui.parts.SelectionSynchronizer; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.MultiPageEditorPart; import org.snaker.designer.actions.ActionHelper; import org.snaker.designer.editors.AbstractEditorPage; import org.snaker.designer.editors.ProcessDesignerEditor; import org.snaker.designer.editors.TaskFieldDesignerEditor; import org.snaker.designer.model.BaseElement; /** * Snaker流程设计器(多页面设计) * 活动页面为流程设计器、双击流程的任务节点,可打开表单设计器 * @author yuqs * @version 1.0 */ public class SnakerFlowDesignerEditor extends MultiPageEditorPart implements IAdaptable { public static final String ID = "org.snaker.designer.SnakerFlowDesignerEditor"; private int pageId = -1; private int formEditPageID = -1; private List<String> editPartActionIDs = new ArrayList<String>(); private List<String> stackActionIDs = new ArrayList<String>(); private List<String> editorActionIDs = new ArrayList<String>(); private boolean isDirty = false; private MultiPageCommandStackListener multiPageCommandStackListener; public BaseElement model = null; private SelectionSynchronizer synchronizer; private ActionRegistry actionRegistry; private CommandStackListener delegatingCommandStackListener = new CommandStackListener() { public void commandStackChanged(EventObject event) { SnakerFlowDesignerEditor.this .updateActions(SnakerFlowDesignerEditor.this.stackActionIDs); } }; private ISelectionListener selectionListener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection selection) { SnakerFlowDesignerEditor.this .updateActions(SnakerFlowDesignerEditor.this.editPartActionIDs); } }; public SnakerFlowDesignerEditor() { } @Override protected void createPages() { try { IFile file = ((IFileEditorInput) getEditorInput()).getFile(); int page = addPage(new ProcessDesignerEditor(this, file), getEditorInput()); setProcessDesignerPage(page); setPageText(page, getProcessDesignerPage().getPageName()); getMultiPageCommandStackListener().addCommandStack( getProcessDesignerPage().getCommandStack()); setActivePage(page); } catch (Exception e) { e.printStackTrace(); } } @Override public void doSaveAs() { getProcessDesignerPage().doSaveAs(); getMultiPageCommandStackListener().markSaveLocations(); } @Override public void doSave(IProgressMonitor monitor) { try { getProcessDesignerPage().doSave(monitor); getMultiPageCommandStackListener().markSaveLocations(); } catch(RuntimeException e) { setDirty(true); } } @Override public boolean isSaveAsAllowed() { return true; } @Override public void setActivePage(int pageIndex) { super.setActivePage(pageIndex); currentPageChanged(); } @Override protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); currentPageChanged(); } protected void currentPageChanged() { if (getProcessDesignerPage().getPageName().equalsIgnoreCase( getCurrentPage().getPageName())) { removeFormEditPage(); } } public void setFormEditPageID(int editPageID) { this.formEditPageID = editPageID; } public int getFormEditPageID() { return this.formEditPageID; } public List<String> getEditActionList() { return this.editPartActionIDs; } public void registerAction(SelectionAction action) { getActionRegistry().registerAction(action); this.editPartActionIDs.add(action.getId()); } public void removeFormEditPage() { if (-1 == getFormEditPageID()) { return; } removePage(getFormEditPageID()); setFormEditPageID(-1); } public AbstractEditorPage getFormEditPage() { return (AbstractEditorPage) getEditor(this.formEditPageID); } public void createFormEditPage(Object obj) { try { int formPageId = addPage(new TaskFieldDesignerEditor(this, obj), getEditorInput()); setFormEditPageID(formPageId); setPageText(formPageId, getFormEditPage().getPageName()); getMultiPageCommandStackListener().addCommandStack( getFormEditPage().getCommandStack()); } catch (Exception e) { e.printStackTrace(); } } public void setDirty(boolean dirty) { if (this.isDirty != dirty) { this.isDirty = dirty; firePropertyChange(IEditorPart.PROP_DIRTY); } } public boolean isDirty() { return this.isDirty; } private void setProcessDesignerPage(int id) { this.pageId = id; } protected void createActions() { ActionHelper.createCommonAction(this, this.editPartActionIDs, getActionRegistry()); } private void updateActions(List<String> actionIds) { for (Iterator<String> ids = actionIds.iterator(); ids.hasNext();) { IAction action = getActionRegistry().getAction(ids.next()); if (action == null) { continue; } if (!(action instanceof UpdateAction)) { continue; } ((UpdateAction) action).update(); } } protected ISelectionListener getSelectionListener() { return this.selectionListener; } protected void firePropertyChange(int propertyId) { super.firePropertyChange(propertyId); updateActions(this.editorActionIDs); } private ProcessDesignerEditor getProcessDesignerPage() { return (ProcessDesignerEditor) getEditor(this.pageId); } protected CommandStackListener getDelegatingCommandStackListener() { return this.delegatingCommandStackListener; } public MultiPageCommandStackListener getMultiPageCommandStackListener() { if (this.multiPageCommandStackListener == null) { this.multiPageCommandStackListener = new MultiPageCommandStackListener( this); } return this.multiPageCommandStackListener; } public AbstractEditorPage getCurrentPage() { if (getActivePage() == -1) { return null; } return (AbstractEditorPage) getEditor(getActivePage()); } public SelectionSynchronizer getSelectionSynchronizer() { if (this.synchronizer == null) this.synchronizer = new SelectionSynchronizer(); return this.synchronizer; } public ActionRegistry getActionRegistry() { if (this.actionRegistry == null) { this.actionRegistry = new ActionRegistry(); } return this.actionRegistry; } public void setActionRegistry(ActionRegistry actionRegistry) { this.actionRegistry = actionRegistry; } @Override public void dispose() { getMultiPageCommandStackListener().dispose(); getSite().getWorkbenchWindow().getSelectionService() .removeSelectionListener(getSelectionListener()); getActionRegistry().dispose(); super.dispose(); } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { super.init(site, input); getSite().getWorkbenchWindow().getSelectionService() .addSelectionListener(getSelectionListener()); createActions(); } @SuppressWarnings("rawtypes") @Override public Object getAdapter(Class adapter) { return super.getAdapter(adapter); } }