// ============================================================================
//
// 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 org.talend.dataprofiler.core.ui.editor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
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.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextFileDocumentProvider;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProviderExtension2;
import org.eclipse.ui.texteditor.IElementStateListener;
import org.talend.core.model.process.IContextManager;
import org.talend.core.model.properties.TDQItem;
import org.talend.core.ui.CoreUIPlugin;
import org.talend.core.ui.context.view.AbstractContextView;
import org.talend.core.ui.context.view.Contexts;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.ui.views.context.TdqContextView;
import org.talend.repository.model.RepositoryNode;
/**
* DOC rli class global comment. Detailled comment
*/
public abstract class CommonFormEditor extends FormEditor implements IPrefersPerspective {
private TdEditorToolBar toolBar = null;
private TdEditorBarWrapper editorBarWrap = null;
private Object editorObject;
protected AbstractMetadataFormPage masterPage;
protected IContextManager contextManager = null;
private String lastRunContextGroupName = null;
private static Logger log = Logger.getLogger(CommonFormEditor.class);
protected boolean isDirty = false;
private IDocumentProvider provider;
public AbstractMetadataFormPage getMasterPage() {
return this.masterPage;
}
/**
* Getter for lastRunContextGroupName.
*
* @return the lastRunContextGroupName
*/
public String getLastRunContextGroupName() {
return this.lastRunContextGroupName;
}
/**
* Sets the lastRunContextGroupName.
*
* @param lastRunContextGroupName the lastRunContextGroupName to set
*/
public void setLastRunContextGroupName(String lastRunContextGroupName) {
this.lastRunContextGroupName = lastRunContextGroupName;
}
/**
* Getter for contextManager.
*
* @return the contextManager
*/
public IContextManager getContextManager() {
return contextManager;
}
public Object getEditorObject() {
return this.editorObject;
}
public void setEditorObject(Object editorObject) {
this.editorObject = editorObject;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.editor.FormEditor#createPages()
*/
@Override
protected void createPages() {
addPages();
setCssStyleForTabFolder();
}
/**
* Set the Css style for tab folder
*/
protected void setCssStyleForTabFolder() {
Composite container = getContainer();
if (container instanceof CTabFolder) {
CoreUIPlugin.setCSSClass(container, "org-talend-rcp-abstractMultiPageEditor-footer"); //$NON-NLS-1$
}
}
/** The editor's element state listener. */
private IElementStateListener fElementStateListener = new ElementListener();
/**
* DOC rli AnalysisEditor class global comment. Detailled comment
*/
class ElementListener implements IElementStateListener {
public void elementContentAboutToBeReplaced(Object element) {
// do nothing until now
}
public void elementContentReplaced(Object element) {
// do nothing until now
}
public void elementDeleted(Object element) {
// MOD msjian TDQ-10651: fix for remote items, when rename it in editor should not close editor
// close(true);
}
public void elementDirtyStateChanged(Object element, boolean isDirty) {
// do nothing until now
}
public void elementMoved(Object originalElement, Object movedElement) {
// MOD klliu 2011-06-30 bug 22436: when the Name of model element changes,that needs not close Editor
// close(true);
}
}
@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);
}
@Override
protected void setInput(IEditorInput input) {
super.setInput(input);
translateInput(input);
try {
updateDocumentProvider(input);
} catch (CoreException e) {
log.error("Install the document provider is failture when created the editor of " + input.getName());//$NON-NLS-1$
}
}
protected void translateInput(IEditorInput input) {
// do nothing until now
}
/**
* Provide a new DocumentProvider based on the given editor input.
*
* @param input the editor input.
* @throws CoreException
*/
protected void updateDocumentProvider(IEditorInput input) throws CoreException {
IProgressMonitor rememberedProgressMonitor = null;
provider = new TextFileDocumentProvider();
provider.addElementStateListener(fElementStateListener);
IDocumentProviderExtension2 extension = (IDocumentProviderExtension2) provider;
extension.setProgressMonitor(rememberedProgressMonitor);
provider.connect(input);
}
/**
* Disposes of the connection with the document provider. Subclasses may extend.
*
* @since 3.0
*/
protected void disposeDocumentProvider() {
if (provider != null) {
IEditorInput input = getEditorInput();
if (input != null) {
provider.disconnect(input);
}
if (fElementStateListener != null) {
provider.removeElementStateListener(fElementStateListener);
fElementStateListener = null;
}
}
provider = null;
}
@Override
public void dispose() {
this.disposeDocumentProvider();
super.dispose();
}
@Override
public void close(final boolean save) {
Display display = getSite().getShell().getDisplay();
display.asyncExec(new Runnable() {
public void run() {
getSite().getPage().closeEditor(CommonFormEditor.this, save);
}
});
}
@Override
public void doSaveAs() {
doSave(null);
}
@Override
public void doSave(IProgressMonitor monitor) {
this.isDirty = false;
firePropertyChange(IEditorPart.PROP_DIRTY);
Object editorObject2 = this.getEditorObject();
if (editorObject2 != null) {
if (editorObject2 instanceof RepositoryNode) {
RepositoryNode node = (RepositoryNode) editorObject2;
if (node.getParent() != null) {
CorePlugin.getDefault().refreshDQView(node.getParent());
} else {
CorePlugin.getDefault().refreshDQView(node);
}
} else {
CorePlugin.getDefault().refreshDQView(editorObject2);
}
} else {
CorePlugin.getDefault().refreshDQView();
}
CorePlugin.getDefault().refreshWorkSpace();
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.editor.FormEditor#pageChange(int)
*/
@Override
protected void pageChange(int newPageIndex) {
super.pageChange(newPageIndex);
if (getActivePageInstance() instanceof AbstractFormPage) {
AbstractFormPage page = (AbstractFormPage) getActivePageInstance();
editorBarWrap.clearRegisterComposite();
editorBarWrap.setExpandableComposites(page.getExpandCompositeList());
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
*/
@Override
public boolean isDirty() {
return isDirty || super.isDirty();
}
public void setDirty(boolean isDirty) {
this.isDirty = isDirty;
firePropertyChange(IEditorPart.PROP_DIRTY);
}
/**
* DOC bzhou Comment method "createToolbar".
*
* @param parent
*/
protected void createToolbar(final Composite parent) {
editorBarWrap = new TdEditorBarWrapper(this);
toolBar = new TdEditorToolBar(parent, editorBarWrap);
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) {
// do nothing until now
}
public void controlResized(ControlEvent e) {
parent.getParent().layout(true);
parent.layout(true);
}
});
}
/**
* DOC bzhou Comment method "getToolBar".
*
* @return
*/
public TdEditorToolBar getToolBar() {
return toolBar;
}
/**
* DOC yyi Comment method "LockEditor".
*
* @param lock
*/
public void lockFormEditor(boolean lock) {
if (null != editorBarWrap) {
Iterator<ExpandableComposite> it = editorBarWrap.getExpandableComposites().iterator();
while (it.hasNext()) {
ExpandableComposite composite = it.next();
if (composite == null || composite.isDisposed()) {
it.remove();
continue;
}
composite.getClient().setEnabled(!lock);
}
}
if (null != toolBar) {
toolBar.getToolbarControl().setEnabled(!lock);
}
}
public List<String> getPreferredPerspectiveId() {
List<String> result = new ArrayList<String>();
result.add(PluginConstant.PERSPECTIVE_ID);
result.add(PluginConstant.SQLEXPLORER_PERSPECTIVE_ID);
return result;
}
/**
*
* refresh the opend editor.
*/
public void refreshEditor() {
// empty at here,implement in sub-classes
}
/**
* update the tdq context view.
*/
public void updateContextView() {
Contexts.switchToCurContextsView(PluginConstant.PERSPECTIVE_ID, AbstractContextView.CTX_ID_TDQ);
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow == null) {
return;
}
final IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
if (page == null) {
return;
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IViewPart part = page.findView(AbstractContextView.CTX_ID_TDQ);
if (part != null && part instanceof TdqContextView) {
TdqContextView tdqContextView = (TdqContextView) part;
tdqContextView.setCurrentPage(masterPage);
tdqContextView.setCurrentItem((TDQItem) masterPage.getProperty().getItem());
}
}
});
}
/**
* show the context view for the SupportContextEditor.
*
*/
protected void showContextView() {
IViewPart ctxViewer = getSite().getPage().findView(AbstractContextView.CTX_ID_TDQ);
if (ctxViewer == null) {
try {
ctxViewer = getSite().getPage().showView(AbstractContextView.CTX_ID_TDQ);
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
}