com.aptana.ide.server.configuration.ui.BasicServerComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.server.configuration.ui.BasicServerComposite.java

Source

/**
 * Copyright (c) 2005-2006 Aptana, Inc.
 *
 * 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. If redistributing this code,
 * this entire header must remain intact.
 */
package com.aptana.ide.server.configuration.ui;

import java.io.File;
import java.util.HashSet;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.Font;
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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

import com.aptana.ide.server.core.ServerPathUtils;

/**
 * @author Pavel Petrochenko
 */
public class BasicServerComposite extends Composite {

    /**
     * The number of columns that this composite span to.
     * <code>COLUMNS = 3</code>
     */
    protected static final int COLUMNS = 3;
    /**
     * path field of composite
     */
    protected Text path;
    /**
     * Updater
     */
    protected StatusUpdater updater;
    protected Text name;
    private HashSet<String> serverNames = new HashSet<String>();
    protected Text descriptionText;
    private boolean isNested;
    protected Text log;
    protected ModifyListener validationModifyListener;

    /**
     * Whether path is required.
     */
    protected boolean requiresPath = true;
    protected Text docRoot;

    /**
     * @author Pavel Petrochenko
     */
    public abstract static class StatusUpdater {

        /**
         * @param isOk
         * @param message
         */
        public abstract void updateStatus(boolean isOk, String message);
    }

    /**
     * Whether the child requires path to be specified.
     * @return true if requires, false otherwise.
     */
    private boolean requiresPath() {
        return requiresPath;
    }

    /**
     * Whether path must be file.
     * @return true if must be file, false if folder instead.
     */
    protected boolean pathMustBeFile() {
        return true;
    }

    /**
     * @return is configuration valid
     */
    public boolean validate() {
        if (requiresPath()) {
            String originalPath = path.getText();
            String filePath = ServerPathUtils.getFileNameByPathWithParameters(originalPath);
            if (filePath == null) {
                updater.updateStatus(false, Messages.BasicServerComposite_FILE_SHOULD_BE_DIR);
                return false;
            }
            File file = new File(filePath);
            if (!isNested) {
                String name = this.name.getText();
                if (name.length() == 0) {
                    updater.updateStatus(false, Messages.BasicServerComposite_EMPTY_NAME);
                    return false;
                }
                if (serverNames.contains(name)) {
                    updater.updateStatus(false, Messages.BasicServerComposite_DUBLICATE_NAME);
                    return false;
                }
            }
            if (file.exists()) {
                if (!pathMustBeFile() || file.isFile()) {
                    updater.updateStatus(true, ""); //$NON-NLS-1$
                    if (log != null) {
                        String text = log.getText();
                        if (text.length() != 0) {
                            file = new File(text);
                            if (!file.exists() || !file.isFile()) {
                                updater.updateStatus(false,
                                        Messages.BasicServerComposite_LOG_SHOULD_BE_EMPTY_OR_POINT_TO_FILE);
                                return false;
                            }
                        }
                    }
                } else {
                    updater.updateStatus(false, Messages.BasicServerComposite_FILE_SHOULD_BE_DIR);
                    return false;
                }
            } else {
                updater.updateStatus(false, Messages.BasicServerComposite_PATH_NOT_EXISTS);
                return false;
            }
            if (docRoot != null && docRoot.isEnabled()) {
                String documentRoot = docRoot.getText().trim();
                if (documentRoot.length() == 0 || !new File(documentRoot).isDirectory()) {
                    updater.updateStatus(false, Messages.BasicServerComposite_DOCUMENT_ROOT_ERROR);
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * @param parent
     * @param style
     * @param updater
     * @param isNested
     */
    public BasicServerComposite(Composite parent, int style, final StatusUpdater updater, boolean isNested,
            boolean requiresPath) {
        super(parent, style);
        this.requiresPath = requiresPath;
        initialize(updater, isNested);
    }

    /**
     * @param parent
     * @param style
     * @param updater
     * @param isNested
     */
    public BasicServerComposite(Composite parent, int style, final StatusUpdater updater, boolean isNested) {
        super(parent, style);
        initialize(updater, isNested);
    }

    private void initialize(final StatusUpdater updater, boolean isNested) {
        this.updater = updater;
        validationModifyListener = new ValidationModifyListener();
        this.setLayout(new GridLayout(COLUMNS, false));
        this.isNested = isNested;
        if (!isNested) {
            Label nlabel = new Label(this, SWT.NONE);
            nlabel.setText(Messages.BasicServerComposite_NAME);
            name = new Text(this, SWT.BORDER);
            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
            gridData.horizontalSpan = 2;
            name.setLayoutData(gridData);
            Label ds = new Label(this, SWT.NONE);
            ds.setText(Messages.BasicServerComposite_Description);
            descriptionText = new Text(this, SWT.BORDER);
            GridData gridData2 = new GridData(GridData.FILL_HORIZONTAL);
            gridData2.horizontalSpan = 2;
            descriptionText.setLayoutData(gridData);
        }
        if (requiresPath()) {
            Label label = new Label(this, SWT.NONE);
            label.setText(getPathLabel());
            path = new Text(this, SWT.BORDER);
            path.addModifyListener(validationModifyListener);
            if (name != null) {
                name.addModifyListener(validationModifyListener);
            }
            path.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            Button browser = new Button(this, SWT.PUSH);
            browser.setText(Messages.BasicServerComposite_BROWSE);
            browser.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if (pathMustBeFile()) {
                        FileDialog fdlg = new FileDialog(getShell(), SWT.OPEN);
                        String text = path.getText();
                        if (text.length() > 0) {
                            File file = new File(text);
                            File parentFile = file.getParentFile();
                            if (parentFile != null) {
                                fdlg.setFilterPath(parentFile.getPath());
                            }
                        }
                        String open = fdlg.open();
                        if (open != null) {
                            path.setText(open);
                        }
                    } else {
                        DirectoryDialog fdlg = new DirectoryDialog(getShell(), SWT.OPEN);
                        String text = path.getText();
                        if (text.length() > 0) {
                            File file = new File(text);
                            File parentFile = file.getParentFile();
                            if (parentFile != null) {
                                fdlg.setFilterPath(parentFile.getPath());
                            }
                        }
                        String open = fdlg.open();
                        if (open != null) {
                            path.setText(open);
                        }
                    }
                }
            });
        }
    }

    /**
     * @return label
     */
    protected String getPathLabel() {
        return Messages.BasicServerComposite_PATH;
    }

    /**
     * @param names
     */
    public void setServerNames(HashSet<String> names) {
        this.serverNames = names;
    }

    /**
     * @return path
     */
    public String getServerPath() {
        if (path != null) {
            return path.getText();
        }
        return null;
    }

    /**
     * @param serverPath
     */
    public void setServerPath(String serverPath) {
        if (path != null) {
            this.path.setText(serverPath);
        }
        validate();
    }

    /**
     * @param name
     */
    public void setServerName(String name) {
        if (this.name != null) {
            this.name.setText(name);
        }
    }

    /**
     * @param name
     */
    public void setServerDescription(String name) {
        if (this.descriptionText != null) {
            this.descriptionText.setText(name);
        }
    }

    /**
     * @return name
     */
    public String getServerName() {
        return this.name == null ? "" : this.name.getText(); //$NON-NLS-1$
    }

    /**
     * @return description
     */
    public String getServerDescription() {
        return this.descriptionText == null ? "" : this.descriptionText.getText(); //$NON-NLS-1$
    }

    /**
     * @return path to log
     */
    public String getLogPath() {
        return this.log == null ? "" : this.log.getText(); //$NON-NLS-1$
    }

    /**
     * @param path
     */
    public void setLogPath(String path) {
        if (path == null) {
            path = ""; //$NON-NLS-1$
        }
        if (this.log != null) {
            this.log.setText(path);
        }
    }

    /**
     * Returns the document root.
     * 
     * @return The doc root, or empty string in case it is not available or not set.
     */
    public String getDocumentRoot() {
        if (docRoot == null) {
            return ""; //$NON-NLS-1$
        }
        return docRoot.getText();
    }

    /**
     * Sets the document root.
     * @param path
     * @throws IllegalStateException in case this method is called before the document root field was initialize.
     */
    public void setDocumentRoot(String root) throws IllegalStateException {
        if (docRoot == null) {
            throw new IllegalStateException("Cannot set " + root //$NON-NLS-1$
                    + ". The document root text component was not initialized."); //$NON-NLS-1$
        }
        docRoot.setText(root);
    }

    /**
     * Adds a horizontal space. 
     */
    protected void addHorizontalSpace(Composite parent) {
        Label spacer = new Label(this, SWT.NONE);
        GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.horizontalSpan = COLUMNS;
        spacer.setLayoutData(layoutData);
    }

    protected void addDocumentRootPath(Composite parent) {
        // Add the document root text field
        Label docRootLabel = new Label(parent, SWT.NONE);
        docRootLabel.setText(Messages.BasicServerComposite_DOC_ROOT);
        docRoot = new Text(parent, SWT.BORDER);
        docRoot.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        docRoot.addModifyListener(validationModifyListener);
        Button browseBt = new Button(parent, SWT.PUSH);
        browseBt.setText(Messages.BasicServerComposite_BROWSE);
        browseBt.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                DirectoryDialog dialog = new DirectoryDialog(getShell());
                String path = dialog.open();
                if (path != null) {
                    docRoot.setText(path);
                }
            }
        });
    }

    protected void addLogPath(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(Messages.BasicServerComposite_LOG_PATH_TITLE);
        log = new Text(parent, SWT.BORDER);
        log.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Button browser = new Button(parent, SWT.PUSH);
        browser.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {

            }

            public void widgetSelected(SelectionEvent e) {
                FileDialog fdlg = new FileDialog(getShell(), SWT.OPEN);
                String text = log.getText();
                if (text.length() > 0) {
                    File file = new File(text);
                    File parentFile = file.getParentFile();
                    if (parentFile != null) {
                        fdlg.setFilterPath(parentFile.getPath());
                    }
                }
                String open = fdlg.open();
                if (open != null) {
                    log.setText(open);
                }
            }
        });
        log.addModifyListener(validationModifyListener);
        browser.setText(Messages.BasicServerComposite_LOG_PATH_CHOOSE);
    }

    /**
     * Adds an example text label. 
     */
    protected void addExampleText(Composite parent, String text) {
        new Label(parent, SWT.NONE);
        Label banner = new Label(this, SWT.NONE);
        banner.setText(text);
        Font defaultFont = JFaceResources.getDefaultFont();
        final Font smallFont = new Font(banner.getDisplay(), defaultFont.getFontData()[0].getName(), 8, SWT.NONE);
        banner.setFont(smallFont);
        banner.addDisposeListener(new DisposeListener() {

            public void widgetDisposed(DisposeEvent e) {
                smallFont.dispose();
            }

        });
        GridData gds = new GridData(GridData.FILL_HORIZONTAL);
        gds.horizontalSpan = 2;
        gds.verticalIndent = -3;
        gds.verticalAlignment = SWT.TOP;
        banner.setLayoutData(gds);
    }

    private class ValidationModifyListener implements ModifyListener {
        public void modifyText(ModifyEvent e) {
            validate();
        }
    }
}