monolipse.ui.resources.BooAssemblySourcePropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for monolipse.ui.resources.BooAssemblySourcePropertyPage.java

Source

/*
 * Boo Development Tools for the Eclipse IDE
 * Copyright (C) 2005 Rodrigo B. de Oliveira (rbo@acm.org)
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

package monolipse.ui.resources;

import monolipse.core.BooCore;
import monolipse.core.IAssemblySource;
import monolipse.core.AssemblySourceLanguage;
import monolipse.core.foundation.WorkspaceUtilities;
import monolipse.ui.BooUI;
import monolipse.ui.views.BooExplorerLabelProvider;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.model.WorkbenchContentProvider;

public class BooAssemblySourcePropertyPage extends PreferencePage implements IWorkbenchPropertyPage {

    private IAdaptable _element;
    private Button[] _outputTypeButtons;
    private Button[] _languageButtons;
    private Text _outputPath;
    private Text _additionalOptions;

    public BooAssemblySourcePropertyPage() {
    }

    protected void performDefaults() {
    }

    public boolean performOk() {
        IAssemblySource source = getAssemblySource();
        if (null == source)
            return false;

        try {
            source.setOutputType(getSelectedOutputType());
            source.setLanguage(getSelectedLanguage());
            source.setOutputFolder(getOutputFolder());
            source.setAdditionalOptions(getAdditionalOptions());
            source.save(null);
        } catch (CoreException e) {
            BooUI.logException(e);
            return false;
        }

        return true;
    }

    private String getAdditionalOptions() {
        return _additionalOptions.getText();
    }

    private AssemblySourceLanguage getSelectedLanguage() {
        return (AssemblySourceLanguage) getSelectedButtonData(_languageButtons);
    }

    private String getSelectedOutputType() {
        return (String) getSelectedButtonData(_outputTypeButtons);
    }

    private Object getSelectedButtonData(Button[] buttons) {
        for (int i = 0; i < buttons.length; i++) {
            Button button = buttons[i];
            if (button.getSelection()) {
                return button.getData();
            }
        }
        return null;
    }

    private IAssemblySource getAssemblySource() {
        try {
            return BooCore.getAssemblySource((IFolder) _element);
        } catch (CoreException e) {
            BooUI.logException(e);
            setErrorMessage(e.getLocalizedMessage());
        }
        return null;
    }

    public IAdaptable getElement() {
        return _element;
    }

    public void setElement(IAdaptable element) {
        _element = element;
    }

    protected Control createContents(Composite parent) {
        IAssemblySource source = getAssemblySource();
        if (null == source)
            return null;

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new RowLayout(SWT.VERTICAL));

        final String[] data = new String[] { IAssemblySource.OutputType.CONSOLE_APPLICATION,
                IAssemblySource.OutputType.WINDOWS_APPLICATION, IAssemblySource.OutputType.LIBRARY, };
        final String[] labels = new String[] { "Console Application", "Windows Application", "Library", };
        _outputTypeButtons = createButtonGroup(composite, "Output Type", labels, data, source.getOutputType());

        Object[] sourceLanguages = AssemblySourceLanguage.values();
        String[] languageLabels = new String[] { "boojay", "boo", "c#", "c# 1.1 (no generics)", };
        _languageButtons = createButtonGroup(composite, "Language", languageLabels, sourceLanguages,
                source.getLanguage());

        try {
            createOutputFolderGroup(composite, source);
        } catch (CoreException e) {
            e.printStackTrace();
        }

        createAdditionalOptionsGroup(composite, source);

        return composite;
    }

    private void createAdditionalOptionsGroup(Composite composite, IAssemblySource source) {

        Group group = createGroup(composite, "Additional Compiler Options: ");
        _additionalOptions = new Text(group, SWT.BORDER);
        _additionalOptions.setText(source.getAdditionalOptions());
        setTextSize(_additionalOptions, 20, 1);
    }

    private void setTextSize(Text text, int columns, int rows) {

        GC gc = new GC(text);
        FontMetrics fm = gc.getFontMetrics();
        int width = columns * fm.getAverageCharWidth();
        int height = rows * fm.getHeight();
        gc.dispose();
        text.setSize(text.computeSize(width, height));
    }

    private void createOutputFolderGroup(Composite composite, final IAssemblySource source) throws CoreException {

        Group group = createGroup(composite, "Output Folder: ");

        _outputPath = new Text(group, SWT.NONE);
        _outputPath.setEditable(false);

        if (source.hasOutputFolder())
            setOutputFolder(source.getOutputFolder());

        Button button = new Button(group, SWT.PUSH);
        button.setText("Browse...");
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent evt) {
                FolderSelectionDialog dlg = new FolderSelectionDialog(getShell(), new BooExplorerLabelProvider(),
                        new WorkbenchContentProvider());
                dlg.setTitle("Select Output Location: ");
                dlg.setInput(WorkspaceUtilities.getWorkspaceRoot());
                dlg.setInitialSelection(getOutputFolder());
                dlg.addFilter(new ViewerFilter() {
                    public boolean select(Viewer viewer, Object parentElement, Object element) {
                        return element instanceof IContainer;
                    }
                });
                if (FolderSelectionDialog.OK == dlg.open()) {
                    setOutputFolder((IContainer) dlg.getFirstResult());
                }
            }
        });
    }

    private void setOutputFolder(IContainer outputFolder) {
        String path = outputFolder.getFullPath().toPortableString();
        _outputPath.setText(path);
        _outputPath.setData(outputFolder);
        _outputPath.setToolTipText(path);
        _outputPath.pack();
    }

    private IFolder getOutputFolder() {
        return (IFolder) _outputPath.getData();
    }

    private Button[] createButtonGroup(Composite parent, String groupLabel, String[] labels, Object[] data,
            Object selectedItem) {
        Group group = createGroup(parent, groupLabel);

        Button[] buttons = new Button[data.length];
        for (int i = 0; i < data.length; ++i) {
            Button button = new Button(group, SWT.RADIO);
            button.setText(labels[i]);
            button.setData(data[i]);
            if (data[i].equals(selectedItem)) {
                button.setSelection(true);
            }
            buttons[i] = button;
        }
        return buttons;
    }

    private Group createGroup(Composite parent, String groupLabel) {
        Group group = new Group(parent, SWT.SHADOW_IN);
        group.setText(groupLabel);
        group.setLayout(new RowLayout(SWT.VERTICAL));
        return group;
    }

}