org.ustok.extgen.ui.wizard.WizardPageCfg.java Source code

Java tutorial

Introduction

Here is the source code for org.ustok.extgen.ui.wizard.WizardPageCfg.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2012 www.ustok.org
 * 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 org.ustok.extgen.ui.wizard;

import java.util.regex.Pattern;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
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.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.Table;
import org.eclipse.swt.widgets.Text;
import org.ustok.extgen.internal.ui.ImageConstants;
import org.ustok.extgen.internal.ui.ImageProvider;
import org.ustok.extgen.internal.ui.provider.ExtensionPointTableContentProvider;
import org.ustok.extgen.internal.ui.provider.ExtensionPointTableLabelProvider;

/**
 * Wizard page to select extension-points and configure target source folder and
 * package.
 * 
 * @author Ingo Mohr
 * @created Nov 9, 2011
 */
class WizardPageCfg extends WizardPage {

    /** page name */
    public static final String NAME = WizardPageCfg.class.getSimpleName();

    /** button to check/uncheck all */
    private Button fButtonCheckAll;

    /** table viewer */
    private CheckboxTableViewer fTableViewer;

    /** text widget to configure the target source folder */
    private Text fTextSourceFolder;

    /** text widget to configure the package for the generated Java classes */
    private Text fTextPackage;

    /**
     * Constructor of WizardPageCfg.
     */
    WizardPageCfg() {
        super(WizardPageCfg.NAME);
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite pParent) {
        Composite comp = new Composite(pParent, SWT.NONE);
        comp.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        comp.setLayout(GridLayoutFactory.swtDefaults().create());

        Label labelEPs = new Label(comp, SWT.NONE);
        labelEPs.setText("Extension Points:");

        final int height = 100;
        Table table = new Table(comp, SWT.FULL_SELECTION | SWT.BORDER | SWT.CHECK);
        table.setLayoutData(GridDataFactory.swtDefaults().hint(SWT.DEFAULT, height).align(SWT.FILL, SWT.BEGINNING)
                .grab(true, false).create());
        fTableViewer = new CheckboxTableViewer(table);
        fTableViewer.setContentProvider(new ExtensionPointTableContentProvider());
        fTableViewer.setLabelProvider(new ExtensionPointTableLabelProvider());
        fTableViewer.addCheckStateListener(new ICheckStateListener() {
            @Override
            public void checkStateChanged(CheckStateChangedEvent pEvent) {
                int itemCount = fTableViewer.getTable().getItemCount();
                int numChecked = fTableViewer.getCheckedElements().length;

                if (itemCount > 0) {
                    boolean allChecked = numChecked == itemCount;
                    boolean noneChecked = numChecked == 0;

                    boolean grayed = !allChecked && !noneChecked;
                    fButtonCheckAll.setGrayed(grayed);

                    if (noneChecked) {
                        fButtonCheckAll.setSelection(false);
                    } else {
                        fButtonCheckAll.setSelection(true);
                    }
                }

                revalidate();
            }
        });

        fButtonCheckAll = new Button(comp, SWT.CHECK);
        fButtonCheckAll.setText("Check All");
        fButtonCheckAll.addSelectionListener(new SelectionAdapter() {
            /**
             * {@inheritDoc}
             * 
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent pE) {
                fTableViewer.setAllChecked(fButtonCheckAll.getSelection());
                revalidate();
            }
        });

        Label labelSeparator = new Label(comp, SWT.SEPARATOR | SWT.HORIZONTAL);
        labelSeparator.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        final int numColumns = 3;
        Composite compFolders = new Composite(comp, SWT.NONE);
        compFolders.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        compFolders.setLayout(GridLayoutFactory.fillDefaults().numColumns(numColumns).create());

        Label labelImgSrcFolder = new Label(compFolders, SWT.NONE);
        labelImgSrcFolder.setImage(ImageProvider.getImage(ImageConstants.SOURCE_FOLDER));

        Label labelTxtSrcFolder = new Label(compFolders, SWT.NONE);
        labelTxtSrcFolder.setText("Source Folder:");

        fTextSourceFolder = new Text(compFolders, SWT.BORDER);
        fTextSourceFolder.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        fTextSourceFolder.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent pE) {
                revalidate();
            }
        });

        new Label(compFolders, SWT.NONE);

        Label labelTxtPackage = new Label(compFolders, SWT.NONE);
        labelTxtPackage.setText("Package:");

        fTextPackage = new Text(compFolders, SWT.BORDER);
        fTextPackage.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        fTextPackage.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent pE) {
                revalidate();
            }
        });

        setControl(comp);
        setDescription("Setup the extension-points, target source folder and package information.");
        setTitle("Extension Resolver Configuration");

        initControl();
    }

    /**
     * Initializes the values of the control.
     */
    void initControl() {
        IWizardPage rawPage = getWizard().getPage(WizardPageProject.NAME);
        WizardPageProject page = (WizardPageProject) rawPage;
        Combo combo = page.getComboProject();
        if (combo.getSelectionIndex() != -1) {
            String projectName = combo.getItem(combo.getSelectionIndex());
            if (projectName != null) {
                IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
                IPluginModelBase model = PluginRegistry.findModel(project);
                fTableViewer.setInput(model);
                fTableViewer.refresh();

                if (model != null) {
                    String pluginID = model.getPluginBase().getId();
                    if (pluginID != null) {
                        fTextPackage.setText(pluginID + ".extension");
                    }
                }
            }
        }

        fTextSourceFolder.setText("src");
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
     */
    @Override
    public boolean isPageComplete() {
        int numChecked = fTableViewer.getCheckedElements().length;
        boolean hasSrcFolder = fTextSourceFolder.getText().length() > 0;
        boolean hasPackage = fTextPackage.getText().length() > 0;

        return numChecked > 0 && hasSrcFolder && hasPackage;
    }

    /**
     * Revalidates the page.
     */
    private void revalidate() {
        setPageComplete(isPageComplete());

        boolean valid = revalidateScrFolder();
        valid = valid && revalidatePackage();

        if (valid) {
            setErrorMessage(null);
        }
    }

    /**
     * Revalidates the package.
     * 
     * @return <code>true</code> if no problem could be found.
     */
    private boolean revalidatePackage() {
        String txtPackage = getTextPackage().getText();
        if (txtPackage.trim().length() < 1) {
            setErrorMessage("Please define a package for the classes to create.");
            return false;
        }

        boolean matches = Pattern.matches("([A-z]\\w*\\.)*[A-z]\\w*", txtPackage);
        if (!matches) {
            setErrorMessage("The package identifier isn't valid.");
            return false;
        }

        return true;
    }

    /**
     * Revalidates the source folder.
     * 
     * @return <code>true</code> if no problem could be found.
     */
    private boolean revalidateScrFolder() {
        String txtSrc = getTextSourceFolder().getText();
        if (txtSrc.trim().length() < 1) {
            setErrorMessage("Please define a source folder to create the classes in.");
            return false;
        }

        return true;
    }

    /**
     * Returns the buttonCheckAll.
     * 
     * @return the buttonCheckAll.
     */
    public Button getButtonCheckAll() {
        return fButtonCheckAll;
    }

    /**
     * Returns the table viewer with all checked extension-points.
     * 
     * @return the tableViewer.
     */
    public CheckboxTableViewer getTableViewer() {
        return fTableViewer;
    }

    /**
     * Returns the text widget to configure the target source folder.
     * 
     * @return the textSourceFolder.
     */
    public Text getTextSourceFolder() {
        return fTextSourceFolder;
    }

    /**
     * Returns the textPackage.
     * 
     * @return the widget to configure the package for the generated Java
     *         classes.
     */
    public Text getTextPackage() {
        return fTextPackage;
    }

}