/************************************************************************************* * Copyright (c) 2014 Red Hat, Inc. 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: * JBoss by Red Hat - Initial implementation. * Tomas Milata - Added Batch diagram editor (JBIDE-19717). ************************************************************************************/ package org.jboss.tools.batch.ui.editor.internal.model; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.sapphire.Element; import org.eclipse.sapphire.LoggingService; import org.eclipse.sapphire.Sapphire; import org.eclipse.sapphire.modeling.xml.RootXmlResource; import org.eclipse.sapphire.ui.SapphireEditor; import org.eclipse.sapphire.ui.def.DefinitionLoader; import org.eclipse.sapphire.ui.def.DefinitionLoader.Reference; import org.eclipse.sapphire.ui.def.EditorPageDef; import org.eclipse.sapphire.ui.forms.swt.MasterDetailsEditorPage; import org.eclipse.sapphire.ui.swt.gef.SapphireDiagramEditor; import org.eclipse.sapphire.ui.swt.xml.editor.XmlEditorResourceStore; import org.eclipse.ui.PartInitException; import org.eclipse.wst.sse.ui.StructuredTextEditor; import org.jboss.tools.common.text.ext.IMultiPageEditor; public class JobXMLEditor extends SapphireEditor implements IMultiPageEditor { public static final int DESIGN_PAGE_INDEX = 0; public static final int DIAGRAM_PAGE_INDEX = 1; private Job model; private FlowElementsContainer currentDiagramModel; private StructuredTextEditor schemaSourceEditor; private JSapphireDiagramEditor schemaDiagram; private MasterDetailsEditorPage design; @Override protected void createSourcePages() throws PartInitException { this.schemaSourceEditor = new StructuredTextEditor(); this.schemaSourceEditor.setEditorPart(this); int index = addPage(this.schemaSourceEditor, getEditorInput()); setPageText(index, "Source"); } @Override protected Element createModel() { this.model = Job.TYPE .instantiate(new RootXmlResource(new XmlEditorResourceStore(this, this.schemaSourceEditor))); this.currentDiagramModel = this.model; return this.model; } public FlowElementsContainer getCurrentDiagramModel() { return currentDiagramModel; } @Override protected void createDiagramPages() throws PartInitException { JSapphireDiagramEditor oldDiagram = schemaDiagram; schemaDiagram = new JSapphireDiagramEditor(this, currentDiagramModel, DefinitionLoader.sdef(getClass()).page("DiagramPage")) { }; addEditorPage(DIAGRAM_PAGE_INDEX, this.schemaDiagram); if(oldDiagram != null) { oldDiagram.rehook(schemaDiagram); } } class JSapphireDiagramEditor extends SapphireDiagramEditor { CustomPalettePage palettePage = null; public JSapphireDiagramEditor(SapphireEditor editor, Element element, Reference<EditorPageDef> definition) { super(editor, element, definition); } @Override protected CustomPalettePage createPalettePage() { return palettePage = super.createPalettePage(); } void rehook(JSapphireDiagramEditor schemaDiagram) { schemaDiagram.palettePage = palettePage; if(palettePage != null) { PaletteViewer viewer = palettePage.getPaletteViewer(); schemaDiagram.getEditDomain().setPaletteViewer(viewer); } } } @Override protected void createFormPages() throws PartInitException { createModel(); this.design = new MasterDetailsEditorPage(this, this.model, DefinitionLoader.sdef(getClass()).page("design")); addPage(DESIGN_PAGE_INDEX, this.design); } public Job getSchema() { return this.model; } @Override public void doSave(final IProgressMonitor monitor) { this.schemaDiagram.doSave(monitor); super.doSave(monitor); } public StructuredTextEditor getSourceEditor() { return schemaSourceEditor; } public MasterDetailsEditorPage getFormEditor() { return design; } public void changeDiagramContent(FlowElementsContainer newRoot) { this.currentDiagramModel = newRoot; try { createDiagramPages(); } catch (PartInitException e) { Sapphire.service(LoggingService.class).log(e); } removePage(JobXMLEditor.DIAGRAM_PAGE_INDEX + 1); setActiveEditor(this.schemaDiagram); } @Override public void switchToSourceTab() { setActiveEditor(schemaSourceEditor); } @Override public void dispose() { super.dispose(); if(model != null) { model.dispose(); model = null; } } }