// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package com.amalto.workbench.editors; import java.util.ArrayList; import java.util.LinkedList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.CoolBarManager; import org.eclipse.jface.action.ToolBarContributionItem; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.CoolBar; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.IFormPage; import com.amalto.workbench.availablemodel.AvailableModelUtil; import com.amalto.workbench.availablemodel.IAvailableModel; import com.amalto.workbench.i18n.Messages; import com.amalto.workbench.image.EImage; import com.amalto.workbench.image.ImageCache; import com.amalto.workbench.models.IXObjectModelListener; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.providers.XObjectEditorInput; public class XObjectEditor extends FormEditor implements IXObjectModelListener, IServerObjectEditorState { private static Log log = LogFactory.getLog(XObjectEditor.class); public ArrayList<IFormPage> formPages = new ArrayList<IFormPage>(); private TreeObject initialXObject = null; // backup protected boolean saveInProgress = false; private com.amalto.workbench.editors.XObjectEditor.TdEditorToolBar toolBar; /* * (non-Javadoc) * * @see org.eclipse.ui.forms.editor.FormEditor#addPages() */ @Override protected void addPages() { updateTitle(); TreeObject xobject = (TreeObject) ((XObjectEditorInput) this.getEditorInput()).getModel(); // backup initial object this.initialXObject = new TreeObject(xobject.getDisplayName(), xobject.getServerRoot(), xobject.getType(), xobject.getWsKey(), xobject.getWsObject(), xobject.getAdditionalInfo()); if (!xobject.isXObject()) { return; } // register model listener xobject.addListener(this); // available models java.util.List<IAvailableModel> availablemodels = AvailableModelUtil.getAvailableModels(isLocalInput()); for (IAvailableModel model : availablemodels) { model.addPage(xobject, this); } addPageForXObject(xobject); } public void setName(String name) { setPartName(name); } /** * DOC hbhong Comment method "addPageForXObject". * * @throws PartInitException */ protected void addPageForXObject(TreeObject xobject) { try { switch (xobject.getType()) { case TreeObject.DATA_MODEL: // addPage(new DataModelMainPage(this)); // // // addPage(new DataModelEditorPage(this)); // WSDataModel wsObject = (WSDataModel) (xobject.getWsObject()); // Document doc = new Document(Util.formatXsdSource(wsObject.getXsdSchema())); // xmlEditor = new XMLEditor(this, xobject); // addPage(xmlEditor, new XMLEditorInput(doc)); // this.setPageText(1, "Schema"); break; case TreeObject.INBOUND_PLUGIN: break; case TreeObject.OUTBOUND_PLUGIN: break; case TreeObject.VIEW: addPage(new ViewMainPage(this)); break; case TreeObject.DATA_CLUSTER: addPage(new DataClusterMainPage(this)); break; case TreeObject.STORED_PROCEDURE: addPage(new StoredProcedureMainPage(this)); break; case TreeObject.MENU: addPage(new MenuMainPage(this)); break; case TreeObject.SERVICE_CONFIGURATION: addPage(new ServiceConfigrationMainPage(this)); break; /* * case TreeObject.RESOURCES: case TreeObject.DATA_MODEL_RESOURCE: case * TreeObject.DATA_MODEL_TYPES_RESOURCE: case TreeObject.CUSTOM_TYPES_RESOURCE: case * TreeObject.PICTURES_RESOURCE: addPage(new ResourceMainPage(this)); break; */ case TreeObject.CUSTOM_TYPE: // addPage(new CustomTypeMainPage(this)); break; case TreeObject.ROUTING_RULE: try { addPage(new RoutingRuleMainPage(this)); } catch (PartInitException e) { log.error(e.getMessage(), e); } break; case TreeObject.TRANSFORMER: try { addPage(new TransformerMainPage(this)); } catch (PartInitException e) { log.error(e.getMessage(), e); } break; case TreeObject.JOB: try { addPage(new JobMainPage(this)); } catch (PartInitException e) { log.error(e.getMessage(), e); } break; default: // MessageDialog.openError(this.getSite().getShell(), "Error", // "Unknown "+IConstants.TALEND+" Object Type: "+xobject.getType()); return; }// switch } catch (PartInitException e) { MessageDialog.openError(this.getSite().getShell(), Messages._Error, Messages.bind(Messages.XObjectEditor_ErrorMsg, e.getLocalizedMessage())); } } @Override public int addPage(IFormPage page) throws PartInitException { formPages.add(page); return super.addPage(page); } /* * (non-Javadoc) * * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void doSave(IProgressMonitor monitor) { this.saveInProgress = true; try { int numPages = formPages.size(); monitor.beginTask(Messages.bind(Messages.XObjectEditor_Saving, this.getEditorInput().getName()), numPages + 1); for (int i = 0; i < numPages; i++) { if ((formPages.get(i)) instanceof AFormPage) { if (!((AFormPage) (formPages.get(i))).beforeDoSave()) { return; } } (formPages.get(i)).doSave(monitor); monitor.worked(1); if (monitor.isCanceled()) { this.saveInProgress = false; return; } } } catch (Exception e) { log.error(e.getMessage(), e); } finally { monitor.done(); } } /* * (non-Javadoc) * * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed() */ @Override public boolean isSaveAsAllowed() { return false; } @Override public void doSaveAs() { } private void updateTitle() { IEditorInput input = this.getEditorInput(); setPartName(input.getName()); setContentDescription("");//$NON-NLS-1$ } @Override public void dispose() { // save space TreeObject xobject = (TreeObject) ((XObjectEditorInput) this.getEditorInput()).getModel(); if (xobject != null) { xobject.setWsObject(null); xobject.removeListener(this); } super.dispose(); formPages.clear(); } /** * Model Listener */ public void handleEvent(int type, TreeObject parent, TreeObject child) { } public TreeObject getInitialXObject() { return initialXObject; } @Override protected void pageChange(int newPageIndex) { AFormPage page = (AFormPage) formPages.get(0); boolean isdirty = page.isDirty(); super.pageChange(newPageIndex); linkDirty(page, isdirty); } private void linkDirty(Object page, boolean dirty) { if (dirty) { if (page instanceof DataModelMainPage) { if (findPage(DataModelMainPage.class.getName()) != null) { DataModelMainPage mainPage = (DataModelMainPage) findPage(DataModelMainPage.class.getName()); mainPage.markDirtyWithoutCommit(); } } } } @Override public Image getTitleImage() { TreeObject object = (TreeObject) ((XObjectEditorInput) this.getEditorInput()).getModel(); if (object.getType() == TreeObject._SERVER_) { return ImageCache.getCreatedImage("icons/talend-picto-small.gif");//$NON-NLS-1$ } else if (object.getType() == TreeObject.DATA_CLUSTER) { return ImageCache.getCreatedImage(EImage.DATA_CLUSTER_WHITE.getPath()); } else if (object.getType() == TreeObject.DATA_MODEL) { return ImageCache.getCreatedImage(EImage.DATA_MODEL_WHITE.getPath()); } else if (object.getType() == TreeObject.MENU) { return ImageCache.getCreatedImage(EImage.MENU_WHITE.getPath()); } else if (object.getType() == TreeObject.TRANSFORMER) { return ImageCache.getCreatedImage(EImage.TRANSFORMER_WHITE.getPath()); } else if (object.getType() == TreeObject.ROLE) { return ImageCache.getCreatedImage(EImage.ROLE_WHITE.getPath()); } else if (object.getType() == TreeObject.STORED_PROCEDURE) { return ImageCache.getCreatedImage(EImage.STORED_PROCEDURE_WHITE.getPath()); } else if (object.getType() == TreeObject.ROUTING_RULE) { return ImageCache.getCreatedImage(EImage.ROUTING_RULE_WHITE.getPath()); } else if (object.getType() == TreeObject.VIEW) { return ImageCache.getCreatedImage(EImage.VIEW_WHITE.getPath()); } else if (object.getType() == TreeObject.DOCUMENT) { return ImageCache.getCreatedImage(EImage.DOCUMENTS.getPath()); } else if (object.getType() == TreeObject.SUBSCRIPTION_ENGINE) { return ImageCache.getCreatedImage(EImage.SUBSCRIPTION_ENGINE_WHITE.getPath()); } else if (object.getType() == TreeObject.SERVICE_CONFIGURATION) { return ImageCache.getCreatedImage(EImage.SERVICE_CONFIGURATION_WHITE.getPath()); } else if (object.getType() == TreeObject.RESOURCES || object.getType() == TreeObject.DATA_MODEL_RESOURCE || object.getType() == TreeObject.DATA_MODEL_TYPES_RESOURCE || object.getType() == TreeObject.CUSTOM_TYPES_RESOURCE || object.getType() == TreeObject.PICTURES_RESOURCE) { return ImageCache.getCreatedImage(EImage.RESOURCES_WHITE.getPath()); } else if (object.getType() == TreeObject.JOB) { return ImageCache.getCreatedImage(EImage.JOB.getPath()); } return ImageCache.getCreatedImage("icons/error.gif");//$NON-NLS-1$ } @Override public int getCurrentPage() { return super.getCurrentPage(); } @Override protected Composite createPageContainer(Composite parent) { GridLayout gridLayout = new GridLayout(); gridLayout.verticalSpacing = 0; gridLayout.numColumns = 1; gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; parent.setLayout(gridLayout); Composite barComp = new Composite(parent, SWT.NONE); GridData gdData = new GridData(GridData.FILL_HORIZONTAL); barComp.setLayoutData(gdData); barComp.setLayout(new FormLayout()); createToolbar(barComp); Composite mainParent = new Composite(parent, SWT.NONE); GridData gdData1 = new GridData(GridData.FILL_BOTH); gdData1.grabExcessVerticalSpace = true; mainParent.setLayoutData(gdData1); return super.createPageContainer(mainParent); } protected void createToolbar(final Composite parent) { toolBar = new TdEditorToolBar(parent); FormData data = new FormData(); data.top = new FormAttachment(0, 0); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); toolBar.getToolbarControl().setLayoutData(data); toolBar.addResizeListener(new ControlListener() { public void controlMoved(ControlEvent e) { } public void controlResized(ControlEvent e) { parent.getParent().layout(true); parent.layout(true); } }); } /** * DOC bzhou Comment method "getToolBar". * * @return */ public TdEditorToolBar getToolBar() { return toolBar; } public class TdEditorToolBar { private CoolBar coolBar = null; private CoolBarManager coolBarMgr; private ToolBarManager defaultToolBarMgr; private LinkedList<Action> actions = new LinkedList<Action>(); public TdEditorToolBar(Composite parent) { // create coolbar coolBar = new CoolBar(parent, SWT.FLAT); coolBarMgr = new CoolBarManager(coolBar); GridData gid = new GridData(); gid.horizontalAlignment = GridData.FILL; coolBar.setLayoutData(gid); // initialize default actions defaultToolBarMgr = new ToolBarManager(SWT.FLAT); actions.add(new RefreshSectionAction()); for (Action action : actions) { defaultToolBarMgr.add(action); } // add all toolbars to parent coolbar coolBarMgr.add(new ToolBarContributionItem(defaultToolBarMgr)); coolBarMgr.update(true); } public void addResizeListener(ControlListener listener) { coolBar.addControlListener(listener); } public CoolBar getToolbarControl() { return coolBar; } public void addActions(Action... actions) { assert actions != null; if (coolBarMgr != null) { for (Action action : actions) { defaultToolBarMgr.add(action); } // coolBarMgr.add(new ToolBarContributionItem(defaultToolBarMgr)); defaultToolBarMgr.update(true); coolBarMgr.update(true); } } /** * * DOC mzhao TdEditorToolBar class global comment. Detailled comment */ private class RefreshSectionAction extends Action { public RefreshSectionAction() { super("Refresh"); //$NON-NLS-1$ setToolTipText(Messages.XObjectEditor_Refresh); this.setImageDescriptor(ImageCache.getImage(EImage.REFRESH.getPath())); } @Override public void run() { IFormPage page = formPages.get(getCurrentPage()); if (page != null && page instanceof AFormPage) { ((AFormPage) page).refreshPage(); } } } } public IFormPage getPage(int index) { return formPages.get(index); } // public boolean isReadOnly() { return false; } public boolean isLocalInput() { return false; } }