net.sourceforge.texlipse.properties.BuilderConfigDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.texlipse.properties.BuilderConfigDialog.java

Source

/*
 * $Id$
 *
 * Copyright (c) 2004-2005 by the TeXlapse Team.
 * 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 net.sourceforge.texlipse.properties;

import java.io.File;

import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.builder.ProgramRunner;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.JFaceResources;
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.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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * Builder configuration dialog.
 * Configures all the different ProgramRunner classes.
 * 
 * @author Kimmo Karlsson
 */
public class BuilderConfigDialog extends Dialog {

    protected File lastPath;
    private Text fileField;
    private Text argsField;
    private Label statusField;
    private ProgramRunner builder;

    /**
     * @param parentShell
     */
    public BuilderConfigDialog(Shell parentShell, ProgramRunner runner) {
        super(parentShell);
        builder = runner;
    }

    /**
     * Set dialog title when the window is created.
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(TexlipsePlugin.getResourceString("preferenceBuilderDialogTitle"));
    }

    /**
     * Check that the config is valid.
     * Close the dialog is the config is valid.
     */
    protected void okPressed() {

        String path = fileField.getText();
        if (!checkFile(path)) {
            return;
        }

        builder.setProgramPath(path);
        builder.setProgramArguments(argsField.getText());

        setReturnCode(OK);
        close();
    }

    /**
     * Check if the file name field contains a valid value.
     * @param path file path
     * @return true, if path is empty string or absolute path to an existing file
     */
    protected boolean checkFile(String path) {
        if (path != null && path.length() > 0) {

            File exec = new File(path);
            if (!exec.isFile() || (!exec.exists() && exec.isFile())) {

                setStatus("preferenceBuilderDialogFileNotFound", "");
                return false;
            }
        }
        setStatus("preferenceBuilderDialogFileOk", "");
        return true;
    }

    /**
     * Set status field message.
     * @param key message text key on resource bundle
     * @param info value of the text parameter (%s)
     */
    protected void setStatus(String key, String info) {
        String msg = "";
        if (key != null && key.length() > 0) {
            msg = TexlipsePlugin.getResourceString(key);
            if (msg.indexOf("%s") >= 0) {
                msg = msg.replaceAll("%s", info);
            }
        }
        statusField.setText(msg);
    }

    /**
     * Called at component creation phase.
     * @return initial status message for the dialog 
     */
    private String resolveStatus() {
        String path = builder.getProgramPath();

        if (path == null || path.length() == 0) {
            return TexlipsePlugin.getResourceString("preferenceBuilderDialogFileEmpty");
        }

        File exec = new File(path);
        if (!exec.exists() && exec.isFile()) {
            return TexlipsePlugin.getResourceString("preferenceBuilderDialogFileNotFound");
        }

        return TexlipsePlugin.getResourceString("preferenceBuilderDialogFileOk");
    }

    /**
     * Create the contents of the dialog.
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);

        GridLayout gl = (GridLayout) composite.getLayout();
        gl.numColumns = 2;

        Label descrLabel = new Label(composite, SWT.LEFT);
        descrLabel.setText(TexlipsePlugin.getResourceString("preferenceBuilderDialogDescriptionLabel")
                .replaceAll("%s", builder.getDescription()));
        GridData dgd = new GridData(GridData.FILL_HORIZONTAL);
        dgd.horizontalSpan = 2;
        descrLabel.setLayoutData(dgd);

        addFileBrowser(composite);

        addArgumentsField(composite);

        if (builder.getInputFormat() != null && builder.getInputFormat().length() > 0
                && builder.getOutputFormat() != null && builder.getOutputFormat().length() > 0) {
            addFormatsField(composite);
        }

        Group group = new Group(composite, SWT.SHADOW_IN);
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        ((GridData) group.getLayoutData()).horizontalSpan = 2;
        group.setLayout(new GridLayout());
        statusField = new Label(group, SWT.LEFT);
        statusField.setText(resolveStatus());
        statusField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        statusField.setToolTipText(TexlipsePlugin.getResourceString("preferenceBuilderDialogStatusTooltip"));

        return composite;
    }

    /**
     * Creates the executable browsing component.
     * @param composite parent component
     */
    private void addFileBrowser(Composite composite) {

        Label fileLabel = new Label(composite, SWT.LEFT);
        fileLabel.setText(TexlipsePlugin.getResourceString("preferenceBuilderCommandLabel"));
        fileLabel.setToolTipText(TexlipsePlugin.getResourceString("preferenceBuilderCommandTooltip"));
        fileLabel.setLayoutData(new GridData());

        Composite browser = new Composite(composite, SWT.NONE);
        browser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout bgl = new GridLayout();
        bgl.numColumns = 2;
        browser.setLayout(bgl);

        fileField = new Text(browser, SWT.SINGLE | SWT.BORDER);
        fileField.setText(builder.getProgramPath());
        fileField.setToolTipText(TexlipsePlugin.getResourceString("preferenceBuilderCommandTooltip"));
        fileField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fileField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                checkFile(fileField.getText());
            }
        });

        Button browseButton = new Button(browser, SWT.PUSH);
        browseButton.setText(JFaceResources.getString("openBrowse"));
        browseButton.setLayoutData(new GridData());
        browseButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {

                FileDialog dialog = new FileDialog(getShell());
                if (lastPath != null) {
                    if (lastPath.exists()) {
                        dialog.setFilterPath(lastPath.getAbsolutePath());
                    }
                } else {
                    lastPath = new File(fileField.getText());
                    while (lastPath != null && !lastPath.isDirectory()) {
                        lastPath = lastPath.getParentFile();
                    }
                    if (lastPath != null && lastPath.exists()) {
                        dialog.setFilterPath(lastPath.getAbsolutePath());
                    }
                }

                String dir = dialog.open();
                if (dir != null) {
                    lastPath = new File(dir.trim());
                    if (lastPath.exists()) {
                        fileField.setText(lastPath.getAbsolutePath());
                    } else {
                        lastPath = null;
                    }
                    checkFile(fileField.getText());
                }

            }
        });
    }

    /**
     * Adds the program arguments text field to the dialog.
     * @param parent parent component
     */
    private void addArgumentsField(Composite parent) {

        Label label = new Label(parent, SWT.LEFT);
        label.setText(TexlipsePlugin.getResourceString("preferenceBuilderArgsLabel"));
        label.setToolTipText(TexlipsePlugin.getResourceString("preferenceBuilderArgsTooltip"));
        label.setLayoutData(new GridData());

        argsField = new Text(parent, SWT.SINGLE | SWT.BORDER);
        argsField.setText(builder.getProgramArguments());
        argsField.setToolTipText(TexlipsePlugin.getResourceString("preferenceBuilderArgsTooltip"));
        argsField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    }

    /**
     * Adds the program arguments text field to the dialog.
     * @param parent parent component
     */
    private void addFormatsField(Composite parent) {

        Composite leftPart = new Composite(parent, SWT.NULL);
        leftPart.setLayoutData(new GridData());
        GridLayout llay = new GridLayout();
        llay.numColumns = 2;
        leftPart.setLayout(llay);

        Label label = new Label(leftPart, SWT.LEFT);
        label.setText(TexlipsePlugin.getResourceString("preferenceBuilderInputFormatLabel"));
        label.setLayoutData(new GridData());

        Group inputGroup = new Group(leftPart, SWT.SHADOW_IN);
        inputGroup.setLayoutData(new GridData());
        inputGroup.setLayout(new GridLayout());

        Label inputLabel = new Label(inputGroup, SWT.LEFT);
        inputLabel.setText("." + builder.getInputFormat());
        inputLabel.setLayoutData(new GridData());

        Composite rightPart = new Composite(parent, SWT.NULL);
        rightPart.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout rlay = new GridLayout();
        rlay.numColumns = 2;
        rightPart.setLayout(rlay);

        Label label2 = new Label(rightPart, SWT.LEFT);
        label2.setText(TexlipsePlugin.getResourceString("preferenceBuilderOutputFormatLabel"));
        label2.setLayoutData(new GridData());

        Group outputGroup = new Group(rightPart, SWT.SHADOW_IN);
        outputGroup.setLayoutData(new GridData());
        outputGroup.setLayout(new GridLayout());

        Label outputLabel = new Label(outputGroup, SWT.LEFT);
        outputLabel.setText("." + builder.getOutputFormat());
        outputLabel.setLayoutData(new GridData());
    }
}