Java tutorial
// ============================================================================ // // Copyright (C) 2006-2015 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 java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; 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.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.UIJob; import org.talend.commons.exception.SystemException; import org.talend.commons.ui.gmf.util.DisplayUtils; 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.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$ * */ 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; private String generatedCode; private boolean generating = false; 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: // empty since only have java } 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) { DisplayUtils.getDisplay().syncExec(new Runnable() { @Override public void run() { IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (ww != null) { IWorkbenchPage page = ww.getActivePage(); IViewPart view = page.findView(CodeView.ID); if (view != null) { final CodeView codeView = (CodeView) view; 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; } } private synchronized void setGenerating(boolean generating) { this.generating = generating; } private synchronized boolean isGenerating() { return this.generating; } public void refresh() { ICodeGeneratorService service = DesignerPlugin.getDefault().getCodeGeneratorService(); if (service.isInitializingJet()) { return; } if (isGenerating()) { return; } setGenerating(true); final List<? extends INode> generatingNodes = selectedNode.getProcess().getGeneratingNodes(); Job job = new Job(Messages.getString("CodeView.initMessage")) { //$NON-NLS-1$ @Override protected IStatus run(IProgressMonitor monitor) { if (selectedNode != null) { generatedCode = ""; //$NON-NLS-1$ try { // 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) { return org.eclipse.core.runtime.Status.OK_STATUS; } generatingNode = null; for (INode node : generatingNodes) { if (node.getUniqueName().equals(selectedNode.getUniqueName())) { generatingNode = node; } } if (generatingNode == null) { generatedCode = Messages.getString("CodeView.MultipleComponentError"); //$NON-NLS-1$ return org.eclipse.core.runtime.Status.OK_STATUS; } ICodeGeneratorService service = DesignerPlugin.getDefault().getCodeGeneratorService(); // have to do this dirty change to avoid the side effect for BD component. codeGenerator = service.createCodeGenerator(selectedNode.getProcess(), false, false); viewStartAction.setChecked(false); viewMainAction.setChecked(false); viewEndAction.setChecked(false); viewAllAction.setChecked(false); 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) { generatedCode = Messages.getString("CodeView.Error"); //$NON-NLS-1$ ExceptionHandler.process(e); } catch (Exception e) { // Some exceptions can appear in case we close some jobs while generating // Just ignore them, and set blank directly to the code view generatedCode = ""; //$NON-NLS-1$ } } return org.eclipse.core.runtime.Status.OK_STATUS; } }; job.setPriority(Job.INTERACTIVE); job.schedule(); job.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent event) { new UIJob("") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { document.set(generatedCode); setGenerating(false); return org.eclipse.core.runtime.Status.OK_STATUS; } }.schedule(); } }); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { this.parent.setFocus(); } }