Java tutorial
/******************************************************************************* * * Copyright (c) 2016 ecFeed AS. * 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 * *******************************************************************************/ package com.ecfeed.ui.editor; import java.util.List; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import com.ecfeed.android.utils.AndroidBaseRunnerHelper; import com.ecfeed.core.adapter.EImplementationStatus; import com.ecfeed.core.model.AbstractNode; import com.ecfeed.core.model.ClassNode; import com.ecfeed.core.utils.EcException; import com.ecfeed.core.utils.SystemLogger; import com.ecfeed.ui.common.utils.EclipseProjectHelper; import com.ecfeed.ui.common.utils.IFileInfoProvider; import com.ecfeed.ui.modelif.ClassInterface; import com.ecfeed.ui.modelif.IModelUpdateContext; public class ClassDetailsPage extends BasicDetailsPage { private boolean fIsAndroidProject; private IFileInfoProvider fFileInfoProvider; private MethodsViewer fMethodsSection; private OtherMethodsViewer fOtherMethodsSection; private Text fClassNameText; private Text fPackageNameText; private Button fRunOnAndroidCheckbox; private Label fAndroidBaseRunnerLabel; private Combo fAndroidBaseRunnerCombo; private ClassInterface fClassIf; private GlobalParametersViewer fGlobalParametersSection; private JavaDocCommentsSection fCommentsSection; private class BrowseClassesSelectionListener extends AbstractSelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { fClassIf.reassignClass(); } } private class AndroidBaseRunnerComboSelectionListener extends AbstractSelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { if (baseRunnerFieldsActive()) { fClassIf.setAndroidBaseRunner(fAndroidBaseRunnerCombo.getText()); String androidBaseRunner = fClassIf.getAndroidBaseRunner(); fAndroidBaseRunnerCombo.setText(androidBaseRunner); } } } private class AndroidBaseRunnerComboFocusListener implements FocusListener { @Override public void focusGained(FocusEvent e) { refreshAndroidBaseRunnerCombo(); } @Override public void focusLost(FocusEvent e) { } } private class ClassNameSelectionListener extends AbstractSelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { fClassIf.setLocalName(fClassNameText.getText()); fClassNameText.setText(fClassIf.getLocalName()); } } private class PackageNameSelectionListener extends AbstractSelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { fClassIf.setPackageName(fPackageNameText.getText()); fPackageNameText.setText(fClassIf.getPackageName()); } } private class RunOnAndroidCheckBoxAdapter extends AbstractSelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { boolean selection = fRunOnAndroidCheckbox.getSelection(); fClassIf.setRunOnAndroid(selection); if (selection) { adjustAndroidBaseRunner(); } refresh(); } private void adjustAndroidBaseRunner() { final String defaultBaseAndroidBaseRunner = AndroidBaseRunnerHelper.getDefaultAndroidBaseRunnerName(); if (!baseRunnerFieldsActive()) { fClassIf.setAndroidBaseRunner(defaultBaseAndroidBaseRunner); return; } String androidBaseRunner = fClassIf.getAndroidBaseRunner(); if (androidBaseRunner == null || androidBaseRunner.isEmpty()) { fClassIf.setAndroidBaseRunner(defaultBaseAndroidBaseRunner); } } } public ClassDetailsPage(ModelMasterSection masterSection, IModelUpdateContext updateContext, IFileInfoProvider fileInfoProvider) { super(masterSection, updateContext, fileInfoProvider); fFileInfoProvider = fileInfoProvider; fIsAndroidProject = new EclipseProjectHelper(fFileInfoProvider).isAndroidProject(); fClassIf = new ClassInterface(this, fFileInfoProvider); } @Override public void createContents(Composite parent) { super.createContents(parent); createBasicParametersComposite(getMainComposite()); if (fFileInfoProvider.isProjectAvailable()) { addForm(fCommentsSection = new JavaDocCommentsSection(this, this, fFileInfoProvider)); } addViewerSection(fMethodsSection = new MethodsViewer(this, this, fFileInfoProvider)); addViewerSection(fGlobalParametersSection = new GlobalParametersViewer(this, this, fFileInfoProvider)); if (fFileInfoProvider.isProjectAvailable()) { addViewerSection(fOtherMethodsSection = new OtherMethodsViewer(this, this, fFileInfoProvider)); } getToolkit().paintBordersFor(getMainComposite()); } @Override protected Composite createTextClientComposite() { Composite textClient = super.createTextClientComposite(); return textClient; } private void createBasicParametersComposite(Composite parent) { Composite mainComposite = getToolkit().createComposite(parent); mainComposite.setLayout(new GridLayout(1, false)); mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); Composite packageAndClassComposite = getToolkit().createComposite(mainComposite); initAndFillClassComposite(packageAndClassComposite); if (fIsAndroidProject) { Composite androidComposite = getToolkit().createComposite(mainComposite); initAndFillAndroidComposite(androidComposite); } } private void initAndFillClassComposite(Composite composite) { composite.setLayout(new GridLayout(3, false)); composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // row 1 // col 1 label getToolkit().createLabel(composite, "Package name"); // col 2 packageName fPackageNameText = getToolkit().createText(composite, null, SWT.NONE); fPackageNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fPackageNameText.addSelectionListener(new PackageNameSelectionListener()); // col 3 empty getToolkit().createLabel(composite, ""); // row 2 // col 1 label getToolkit().createLabel(composite, "Class name"); // col 2 className fClassNameText = getToolkit().createText(composite, null, SWT.NONE); fClassNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fClassNameText.addSelectionListener(new ClassNameSelectionListener()); // col 3 browse button if (fFileInfoProvider.isProjectAvailable()) { Button browseButton = getToolkit().createButton(composite, "Browse...", SWT.NONE); browseButton.addSelectionListener(new BrowseClassesSelectionListener()); browseButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); } getToolkit().paintBordersFor(composite); } private void initAndFillAndroidComposite(Composite composite) { composite.setLayout(new GridLayout(2, false)); composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); // row 1 // col 1 and 2 fRunOnAndroidCheckbox = getToolkit().createButton(composite, "Run on Android", SWT.CHECK); GridData checkboxGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); checkboxGridData.horizontalSpan = 2; fRunOnAndroidCheckbox.setLayoutData(checkboxGridData); fRunOnAndroidCheckbox.addSelectionListener(new RunOnAndroidCheckBoxAdapter()); // row 2 if (baseRunnerFieldsActive()) { // col 1 - label fAndroidBaseRunnerLabel = getToolkit().createLabel(composite, "Base runner"); // col 2 - runner combo fAndroidBaseRunnerCombo = new ComboViewer(composite, SWT.NONE).getCombo(); fAndroidBaseRunnerCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fAndroidBaseRunnerCombo.addFocusListener(new AndroidBaseRunnerComboFocusListener()); fAndroidBaseRunnerCombo.addSelectionListener(new AndroidBaseRunnerComboSelectionListener()); fillAndroidBaseRunnerCombo(); } } private void refreshAndroidBaseRunnerCombo() { if (baseRunnerFieldsActive()) { String currentRunner = fAndroidBaseRunnerCombo.getText(); fAndroidBaseRunnerCombo.removeAll(); fillAndroidBaseRunnerCombo(); fAndroidBaseRunnerCombo.setText(currentRunner); } } private void fillAndroidBaseRunnerCombo() { String projectPath = null; try { projectPath = new EclipseProjectHelper(fFileInfoProvider).getProjectPath(); List<String> runners = fClassIf.createRunnerList(projectPath); for (String runner : runners) { fAndroidBaseRunnerCombo.add(runner); } } catch (EcException e) { SystemLogger.logCatch(e.getMessage()); } } @Override public void refresh() { super.refresh(); if (getSelectedElement() instanceof ClassNode) { ClassNode selectedClass = (ClassNode) getSelectedElement(); fClassIf.setTarget(selectedClass); String title = fClassIf.getQualifiedName(); //Remove implementation status for performance reasons // String title = fClassIf.getQualifiedName() + " [" + fClassIf.getImplementationStatus() + "]"; getMainSection().setText(title); fClassNameText.setText(fClassIf.getLocalName()); fPackageNameText.setText(fClassIf.getPackageName()); if (fIsAndroidProject) { refreshAndroid(); } fMethodsSection.setInput(selectedClass); fGlobalParametersSection.setInput(selectedClass); refreshOtherMethodsSection(selectedClass); if (fFileInfoProvider.isProjectAvailable()) { fCommentsSection.setInput(selectedClass); } getMainSection().layout(); } } private void refreshOtherMethodsSection(ClassNode classNode) { if (!fFileInfoProvider.isProjectAvailable()) { return; } if (fClassIf.getImplementationStatus() == EImplementationStatus.NOT_IMPLEMENTED) { fOtherMethodsSection.setVisible(false); return; } fOtherMethodsSection.setInput(classNode); fOtherMethodsSection.setVisible(fOtherMethodsSection.getItemsCount() > 0); } private void refreshAndroid() { boolean runOnAndroid = fClassIf.getRunOnAndroid(); fRunOnAndroidCheckbox.setSelection(runOnAndroid); if (baseRunnerFieldsActive()) { fAndroidBaseRunnerLabel.setEnabled(runOnAndroid); fAndroidBaseRunnerCombo.setEnabled(runOnAndroid); String androidBaseRunner = fClassIf.getAndroidBaseRunner(); if (androidBaseRunner == null) { androidBaseRunner = ""; } fAndroidBaseRunnerCombo.setText(androidBaseRunner); } } private boolean baseRunnerFieldsActive() { return false; } @Override protected Class<? extends AbstractNode> getNodeType() { return ClassNode.class; } }