ofandroidclipse.wizards.NewOFAndroidProjectPage.java Source code

Java tutorial

Introduction

Here is the source code for ofandroidclipse.wizards.NewOFAndroidProjectPage.java

Source

/*
 * Copyright (c) 2013, 2014 Hemanta Sapkota.
 * 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
 *
 * Contributors:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package ofandroidclipse.wizards;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import ofandroidclipse.Activator;
import ofandroidclipse.ofReleaseDir.OFUtil;
import ofandroidclipse.ofReleaseDir.OFUtil.OFAndroidProjectParams;
import ofandroidclipse.ofReleaseDir.OFUtil.OFAndroidProjectParamsBuilder;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.wb.swt.ResourceManager;

import com.google.common.base.Optional;

/**
 * The Class NewOFAndroidProjectPage.
 */
public class NewOFAndroidProjectPage extends WizardPage {

    /**
     * The Class TableLabelProvider.
     */
    private class TableLabelProvider extends LabelProvider implements ITableLabelProvider {

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            File f = (File) element;
            return f.getName();
        }
    }

    /**
     * The Class ContentProvider.
     */
    private class ContentProvider implements IStructuredContentProvider {

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            return ofxAndroidExamples.toArray();
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /** The txt project name. */
    private Text txtProjectName;

    /** The lblproject name. */
    private Label lblprojectName;

    /** The gd_txt project name. */
    private GridData gd_txtProjectName;

    /** The lbl path to of. */
    private Label lblPathToOf;

    /** The txt pathto of. */
    private Text txtPathtoOF;

    /** The btn browse. */
    private Button btnBrowse;

    /** The btn import of android lib. */
    private Button btnImportOFAndroidLib;

    /** The tab folder. */
    private TabFolder tabFolder;

    /** The tbtm import examples. */
    private TabItem tbtmImportExamples;

    /** The delegate. */
    private NewOFAndroidProjectPageDelegate delegate;

    /** The cmp examples. */
    private Composite cmpExamples;

    /** The table. */
    private Table table;

    /** The checkbox table viewer. */
    private CheckboxTableViewer checkboxTableViewer;

    /** The ofx android examples. */
    private List<File> ofxAndroidExamples = new ArrayList<File>();

    /** The tblclmn select all. */
    private TableColumn tblclmnSelectAll;

    /** The table viewer column. */
    private TableViewerColumn tableViewerColumn;

    /** The tbtm template. */
    private TabItem tbtmTemplate;

    /** The form toolkit. */
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());

    /** The scrolled form. */
    private ScrolledForm scrolledForm;

    /** The cmp template. */
    private Composite cmpTemplate;

    /** The template project. */
    private String templateProject = OFUtil.OF_ANRDOID_EMPTY_EXAMPLE;

    /**
     * Constructor for SampleNewWizardPage.
     */
    public NewOFAndroidProjectPage() {
        super("wizardPage");
        setMessage(
                "OpenFrameworks for Android requires ADT plugin. If ADT plugin is not installed, please do so from the Eclipse Marketplace.\n\n");
        setImageDescriptor(ResourceManager.getPluginImageDescriptor("OFAndroidClipse", "icons/ofIcon68x68.png"));
        setTitle("OpenFrameworks Android Project");
        setDescription("This wizard creates new android project for OpenFrameworks.");

        delegate = new NewOFAndroidProjectPageDelegate();
    }

    /**
     * Creates the control.
     *
     * @param parent the parent
     * @see IDialogPage#createControl(Composite)
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 3;
        layout.verticalSpacing = 9;
        container.setLayout(layout);
        layout.numColumns = 3;
        lblprojectName = new Label(container, SWT.NULL);
        lblprojectName.setText("&Project name:");

        txtProjectName = new Text(container, SWT.BORDER | SWT.SINGLE);
        gd_txtProjectName = new GridData(GridData.FILL_HORIZONTAL);
        txtProjectName.setLayoutData(gd_txtProjectName);
        txtProjectName.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                validate();
            }
        });
        initialize();
        setControl(container);
        new Label(container, SWT.NONE);

        lblPathToOf = new Label(container, SWT.NONE);
        lblPathToOf.setText("Path to OF");

        txtPathtoOF = new Text(container, SWT.BORDER);
        txtPathtoOF.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        btnBrowse = new Button(container, SWT.NONE);
        btnBrowse.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    doBrowse();
                } catch (CoreException e1) {
                    Activator.logException(e1);
                }
            }
        });
        btnBrowse.setText("Browse");
        new Label(container, SWT.NONE);

        btnImportOFAndroidLib = new Button(container, SWT.CHECK);
        btnImportOFAndroidLib.setText("Import ofAndroidLib");
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);

        tabFolder = new TabFolder(container, SWT.NONE);
        GridData gd_tabFolder = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
        gd_tabFolder.widthHint = 414;
        gd_tabFolder.heightHint = 65;
        tabFolder.setLayoutData(gd_tabFolder);

        tbtmTemplate = new TabItem(tabFolder, SWT.NONE);
        tbtmTemplate.setText("Template");

        scrolledForm = formToolkit.createScrolledForm(tabFolder);
        tbtmTemplate.setControl(scrolledForm);
        formToolkit.paintBordersFor(scrolledForm);
        scrolledForm.getBody().setLayout(new FillLayout(SWT.HORIZONTAL));

        cmpTemplate = new Composite(scrolledForm.getBody(), SWT.NONE);
        formToolkit.adapt(cmpTemplate);
        formToolkit.paintBordersFor(cmpTemplate);
        cmpTemplate.setLayout(new GridLayout(2, true));

        tbtmImportExamples = new TabItem(tabFolder, SWT.NONE);
        tbtmImportExamples.setText("Import Extra Samples");

        cmpExamples = new Composite(tabFolder, SWT.NONE);
        tbtmImportExamples.setControl(cmpExamples);
        cmpExamples.setLayout(new FillLayout(SWT.HORIZONTAL));

        checkboxTableViewer = CheckboxTableViewer.newCheckList(cmpExamples, SWT.BORDER | SWT.FULL_SELECTION);
        table = checkboxTableViewer.getTable();
        table.setHeaderVisible(true);

        tableViewerColumn = new TableViewerColumn(checkboxTableViewer, SWT.NONE);
        tableViewerColumn.getColumn().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                selectAllExamples();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });
        tblclmnSelectAll = tableViewerColumn.getColumn();
        tblclmnSelectAll.setWidth(374);
        tblclmnSelectAll.setText("Select All");
        checkboxTableViewer.setLabelProvider(new TableLabelProvider());
        checkboxTableViewer.setContentProvider(new ContentProvider());
        new Label(container, SWT.NONE);

        validate();
    }

    /**
     * Select all examples.
     */
    private void selectAllExamples() {
        checkboxTableViewer.setAllChecked(true);
    }

    /**
     * Do browse.
     *
     * @throws CoreException the core exception
     */
    private void doBrowse() throws CoreException {
        DirectoryDialog dd = new DirectoryDialog(getShell());
        String p = dd.open();

        Optional<String> path = Optional.fromNullable(p);
        if (!path.isPresent()) {
            return;
        }

        txtPathtoOF.setText(path.get());
        setPageComplete(true);
        setErrorMessage(null);

        /* List all the examples */
        ofxAndroidExamples = delegate.getExamples(path.get());
        checkboxTableViewer.setInput(ofxAndroidExamples);
        checkboxTableViewer.refresh();

        for (File f : ofxAndroidExamples) {
            final Button chk = new Button(cmpTemplate, SWT.RADIO);
            chk.setText(f.getName());
            chk.addSelectionListener(new SelectionListener() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    templateProject = chk.getText();
                }

                @Override
                public void widgetDefaultSelected(SelectionEvent e) {
                }
            });
        }
        scrolledForm.reflow(true);
    }

    /**
     * Tests if the current workbench selection is a suitable container to use.
     */

    private void initialize() {
    }

    /**
     * Ensures that both text fields are set.
     */

    private void validate() {
        if (StringUtils.isEmpty(txtProjectName.getText())) {
            setErrorMessage("Project name is required");
            setPageComplete(false);
            return;
        }

        if (StringUtils.isEmpty(txtPathtoOF.getText())) {
            setErrorMessage("Path to OpenFrameworks is required");
            setPageComplete(false);
            return;
        }

        setErrorMessage(null);
        setPageComplete(true);
    }

    /**
     * Builds the params.
     *
     * @return the OF android project params
     */
    public OFAndroidProjectParams buildParams() {
        OFAndroidProjectParamsBuilder builder = OFAndroidProjectParamsBuilder.newBuilder()
                .setProjectName(getProjectName()).setPathToOF(getPathToOF())
                .setShouldImportOFAndroidLib(shouldImportOFAndroidLib()).setTemplateProject(getTemplateProject());

        for (Object o : checkboxTableViewer.getCheckedElements()) {
            builder.addExampleToImport(o.toString());
        }

        return builder.build();
    }

    /**
     * Gets the project name.
     *
     * @return the project name
     */
    private String getProjectName() {
        return txtProjectName.getText().trim();
    }

    /**
     * Gets the path to of.
     *
     * @return the path to of
     */
    private String getPathToOF() {
        return txtPathtoOF.getText().trim();
    }

    /**
     * Gets the template project.
     *
     * @return the template project
     */
    private String getTemplateProject() {
        return templateProject;
    }

    /**
     * Should import of android lib.
     *
     * @return the boolean
     */
    private Boolean shouldImportOFAndroidLib() {
        return btnImportOFAndroidLib.getSelection();
    }
}