// ============================================================================
//
// Copyright (C) 2006-2012 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.designer.core.ui.views;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
import org.eclipse.jdt.internal.ui.text.SimpleJavaSourceViewerConfiguration;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.text.IJavaPartitions;
import org.eclipse.jdt.ui.text.JavaTextTools;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.talend.commons.exception.SystemException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.PluginChecker;
import org.talend.core.language.ECodeLanguage;
import org.talend.core.language.LanguageManager;
import org.talend.core.model.process.IConnection;
import org.talend.core.model.process.IElement;
import org.talend.core.model.process.INode;
import org.talend.core.model.temp.ECodePart;
import org.talend.core.service.ICorePerlService;
import org.talend.core.ui.IJobletProviderService;
import org.talend.designer.codegen.ICodeGenerator;
import org.talend.designer.codegen.ICodeGeneratorService;
import org.talend.designer.core.DesignerPlugin;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.model.process.AbstractProcessProvider;
/**
* View that will show the code of the current component.
*
* $Id: CodeView.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class CodeView extends ViewPart {
// private StyledText text;
private IDocument document;
private ICodeGenerator codeGenerator = null;
private static final int CODE_START = 0;
private static final int CODE_MAIN = 1;
private static final int CODE_END = 2;
private static final int CODE_ALL = 3;
private int codeView = CODE_MAIN;
private int nodeCodeView = -1;
private static final String ERROR_MESSAGE = Messages.getString("CodeView.Error"); //$NON-NLS-1$
private static final String MULTIPLE_COMPONENT_ERROR_MESSAGE = Messages.getString("CodeView.MultipleComponentError"); //$NON-NLS-1$
private INode selectedNode = null;
private INode generatingNode = null;
public static final String ID = "org.talend.designer.core.codeView"; //$NON-NLS-1$
private Composite parent;
IAction viewStartAction = new Action() {
@Override
public String getText() {
return Messages.getString("CodeView.Start"); //$NON-NLS-1$
}
@Override
public void run() {
codeView = CODE_START;
refresh();
}
};
IAction viewMainAction = new Action() {
@Override
public String getText() {
return Messages.getString("CodeView.Main"); //$NON-NLS-1$
}
@Override
public void run() {
codeView = CODE_MAIN;
refresh();
}
};
IAction viewEndAction = new Action() {
@Override
public String getText() {
return Messages.getString("CodeView.End"); //$NON-NLS-1$
}
@Override
public void run() {
codeView = CODE_END;
refresh();
}
};
IAction viewAllAction = new Action() {
@Override
public String getText() {
return Messages.getString("CodeView.All"); //$NON-NLS-1$
}
@Override
public void run() {
codeView = CODE_ALL;
refresh();
}
};
public CodeView() {
}
@Override
public void createPartControl(Composite parent) {
this.parent = parent;
parent.setLayout(new FillLayout());
ECodeLanguage language = LanguageManager.getCurrentLanguage();
ISourceViewer viewer = null;
final StyledText text;
int styles = SWT.H_SCROLL | SWT.V_SCROLL;
document = new Document();
switch (language) {
case JAVA:
IPreferenceStore store = JavaPlugin.getDefault().getCombinedPreferenceStore();
viewer = new JavaSourceViewer(parent, null, null, false, styles, store);
viewer.setDocument(document);
JavaTextTools tools = JavaPlugin.getDefault().getJavaTextTools();
tools.setupJavaDocumentPartitioner(viewer.getDocument(), IJavaPartitions.JAVA_PARTITIONING);
SimpleJavaSourceViewerConfiguration config = new SimpleJavaSourceViewerConfiguration(tools.getColorManager(), store,
null, IJavaPartitions.JAVA_PARTITIONING, true);
viewer.configure(config);
viewer.getTextWidget().setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
document = viewer.getDocument();
break;
default: // PERL
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICorePerlService.class)) {
ICorePerlService service = (ICorePerlService) GlobalServiceRegister.getDefault().getService(
ICorePerlService.class);
viewer = service.createViewer(parent, styles, false);
document = viewer.getDocument();
}
}
viewer.setEditable(false);
text = viewer.getTextWidget();
// getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this);
IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
IAction wrapAction = new Action() {
@Override
public void run() {
text.setWordWrap(isChecked());
}
};
wrapAction.setToolTipText("wrap"); //$NON-NLS-1$
wrapAction.setChecked(false);
wrapAction.setImageDescriptor(ImageDescriptor.createFromFile(DesignerPlugin.class, "/icons/wrap.gif")); //$NON-NLS-1$
tbm.add(wrapAction);
createMenu();
}
private void createMenu() {
IMenuManager manager = getViewSite().getActionBars().getMenuManager();
manager.add(viewStartAction);
manager.add(viewMainAction);
manager.add(viewEndAction);
manager.add(viewAllAction);
viewMainAction.setChecked(true);
}
public static void refreshCodeView(final IElement element) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart view = page.findView(CodeView.ID);
if (view != null) {
final CodeView codeView = (CodeView) view;
codeView.getViewSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
codeView.refresh(element);
}
});
}
}
private void refresh(IElement element) {
if (element instanceof INode) {
selectedNode = (INode) element;
if (nodeCodeView != -1) {
codeView = nodeCodeView;
nodeCodeView = -1;
}
refresh();
} else if (element instanceof IConnection) {
selectedNode = ((IConnection) element).getSource();
nodeCodeView = codeView;
codeView = CODE_END;
refresh();
} else if (element == null) {
selectedNode = null;
generatingNode = null;
}
}
public void refresh() {
if (selectedNode != null) {
String generatedCode = ""; //$NON-NLS-1$
// joblet or joblet node
boolean isJoblet = AbstractProcessProvider.isExtensionProcessForJoblet(selectedNode.getProcess());
if (!isJoblet && PluginChecker.isJobLetPluginLoaded()) {
IJobletProviderService jobletSservice = (IJobletProviderService) GlobalServiceRegister.getDefault().getService(
IJobletProviderService.class);
if (jobletSservice != null && jobletSservice.isJobletComponent(selectedNode)) {
isJoblet = true;
}
}
if (isJoblet) {
document.set(generatedCode);
return;
}
generatingNode = null;
for (INode node : selectedNode.getProcess().getGeneratingNodes()) {
if (node.getUniqueName().equals(selectedNode.getUniqueName())) {
generatingNode = node;
}
}
if (generatingNode == null) {
document.set(Messages.getString("CodeView.MultipleComponentError")); //$NON-NLS-1$
return;
}
if (codeGenerator == null) {
ICodeGeneratorService service = DesignerPlugin.getDefault().getCodeGeneratorService();
codeGenerator = service.createCodeGenerator();
}
viewStartAction.setChecked(false);
viewMainAction.setChecked(false);
viewEndAction.setChecked(false);
viewAllAction.setChecked(false);
try {
switch (codeView) {
case CODE_START:
viewStartAction.setChecked(true);
generatedCode = codeGenerator.generateComponentCode(generatingNode, ECodePart.BEGIN);
break;
case CODE_MAIN:
viewMainAction.setChecked(true);
generatedCode = codeGenerator.generateComponentCode(generatingNode, ECodePart.MAIN);
break;
case CODE_END:
viewEndAction.setChecked(true);
generatedCode = codeGenerator.generateComponentCode(generatingNode, ECodePart.END);
break;
case CODE_ALL:
viewAllAction.setChecked(true);
generatedCode = codeGenerator.generateComponentCode(generatingNode, ECodePart.BEGIN);
generatedCode += codeGenerator.generateComponentCode(generatingNode, ECodePart.MAIN);
generatedCode += codeGenerator.generateComponentCode(generatingNode, ECodePart.END);
break;
default:
}
} catch (SystemException e) {
document.set(Messages.getString("CodeView.Error")); //$NON-NLS-1$
ExceptionHandler.process(e);
}
document.set(generatedCode);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
this.parent.setFocus();
}
}