org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2013 Wind River Systems, Inc. and others. 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:
 * Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.tcf.te.ui.jface.dialogs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
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.Shell;
import org.eclipse.tcf.te.ui.swt.activator.UIPlugin;
import org.eclipse.ui.PlatformUI;

/**
 * Custom title area dialog implementation.
 */
public class CustomTitleAreaDialog extends TitleAreaDialog implements IMessageProvider {
    protected static final int comboHistoryLength = 10;
    private String contextHelpId = null;

    // The dialog settings storage
    private IDialogSettings dialogSettings;

    private String message;
    private int messageType;
    private String errorMessage;
    private String title;

    // The default message is shown to the user if no other message is set
    private String defaultMessage;
    private int defaultMessageType;

    /**
     * Constructor.
     *
     * @param parent The parent shell used to view the dialog.
     */
    public CustomTitleAreaDialog(Shell parent) {
        this(parent, null);
    }

    /**
     * Constructor.
     *
     * @param parent The parent shell used to view the dialog, or <code>null</code>.
     * @param contextHelpId The dialog context help id or <code>null</code>.
     */
    public CustomTitleAreaDialog(Shell parent, String contextHelpId) {
        super(parent);
        initializeDialogSettings();
        setContextHelpId(contextHelpId);
    }

    protected void setContextHelpId(String contextHelpId) {
        this.contextHelpId = contextHelpId;
        setHelpAvailable(contextHelpId != null);
    }

    /**
     * Initialize the dialog settings storage.
     */
    protected void initializeDialogSettings() {
        IDialogSettings settings = doGetDialogSettingsToInitialize();
        Assert.isNotNull(settings);
        IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
        if (section == null) {
            section = settings.addNewSection(getDialogSettingsSectionName());
        }
        setDialogSettings(section);
    }

    /**
     * Returns the dialog settings container to use and to initialize. This
     * method is called from <code>initializeDialogSettings</code> and allows
     * overriding the dialog settings container without changing the dialog
     * settings structure.
     *
     * @return The dialog settings container to use. Must not be <code>null</code>.
     */
    protected IDialogSettings doGetDialogSettingsToInitialize() {
        return UIPlugin.getDefault().getDialogSettings();
    }

    /**
     * Returns the section name to use for separating different persistent
     * dialog settings from different dialogs.
     *
     * @return The section name used to store the persistent dialog settings within the plugins persistent
     *         dialog settings store.
     */
    public String getDialogSettingsSectionName() {
        return "CustomTitleAreaDialog"; //$NON-NLS-1$
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#create()
     */
    @Override
    public void create() {
        super.create();

        // If the dialog got set a message, make sure the message is really shown
        // to the user from the beginning.
        if (isMessageSet()) {
            if (errorMessage != null) {
                super.setErrorMessage(errorMessage);
            } else {
                super.setMessage(message, messageType);
            }
        } else if (defaultMessage != null) {
            // Default message set
            super.setMessage(defaultMessage, defaultMessageType);
        }

        // If the dialog got set a title, make sure the title is shown
        if (title != null) {
            super.setTitle(title);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected final Control createDialogArea(Composite parent) {
        if (contextHelpId != null) {
            PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, contextHelpId);
        }

        // Let the super implementation create the dialog area control
        Control control = super.createDialogArea(parent);
        // Setup the inner panel as scrollable composite
        if (control instanceof Composite) {
            ScrolledComposite sc = new ScrolledComposite((Composite) control, SWT.V_SCROLL);

            GridLayout layout = new GridLayout(1, true);
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            layout.verticalSpacing = 0;
            layout.horizontalSpacing = 0;

            sc.setLayout(layout);
            sc.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));

            sc.setExpandHorizontal(true);
            sc.setExpandVertical(true);

            // Give subclasses the chance to configure the new dialog area control
            configureDialogAreaControl(sc);

            Composite composite = new Composite(sc, SWT.NONE);
            composite.setLayout(new GridLayout());

            // Setup the dialog area content
            createDialogAreaContent(composite);

            sc.setContent(composite);
            sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

            // Return the scrolled composite as new dialog area control
            control = sc;
        }

        return control;
    }

    /**
     * Creates the dialog area content.
     *
     * @param parent The parent composite. Must not be <code>null</code>.
     */
    protected void createDialogAreaContent(Composite parent) {
        Assert.isNotNull(parent);
    }

    /**
     * Configure the dialog top control.
     *
     * @param composite The dialog top control. Must not be <code>null</code>.
     */
    protected void configureDialogAreaControl(Composite composite) {
        Assert.isNotNull(composite);
    }

    /**
     * Returns the associated dialog settings storage.
     *
     * @return The dialog settings storage.
     */
    public IDialogSettings getDialogSettings() {
        // The dialog settings may not been initialized here. Initialize first in this case
        // to be sure that we do have always the correct dialog settings.
        if (dialogSettings == null) {
            initializeDialogSettings();
        }
        return dialogSettings;
    }

    /**
     * Sets the associated dialog settings storage.
     *
     * @return The dialog settings storage.
     */
    public void setDialogSettings(IDialogSettings dialogSettings) {
        this.dialogSettings = dialogSettings;
    }

    /**
     * Adds the given string to the given string array.
     *
     * @param history String array to add the given entry to it.
     * @param newEntry The new entry to add.
     * @return The updated string array containing the old array content plus the new entry.
     */
    protected String[] addToHistory(String[] history, String newEntry) {
        List<String> l = new ArrayList<String>(Arrays.asList(history));
        addToHistory(l, newEntry);
        String[] r = new String[l.size()];
        l.toArray(r);
        return r;
    }

    /**
     * Adds the given string to the given list.
     *
     * @param history List to add the given entry to it.
     * @param newEntry The new entry to add. Must not be <code>null</code>
     *
     * @return The updated list containing the old list content plus the new entry.
     */
    protected void addToHistory(List<String> history, String newEntry) {
        Assert.isNotNull(newEntry);

        history.remove(newEntry);
        history.add(0, newEntry);
        // since only one new item was added, we can be over the limit
        // by at most one item
        if (history.size() > comboHistoryLength) {
            history.remove(comboHistoryLength);
        }
    }

    /**
     * Save current dialog widgets values.
     * Called by <code>okPressed</code>.
     */
    protected void saveWidgetValues() {
        return;
    }

    /**
     * Restore previous dialog widgets values.
     * Note: This method is not called automatically! You have
     *       to call this method at the appropriate time and place.
     */
    protected void restoreWidgetValues() {
        return;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        saveWidgetValues();
        super.okPressed();
    }

    /**
     * Cleanup when dialog is closed.
     */
    protected void dispose() {
        dialogSettings = null;
        message = null;
        messageType = IMessageProvider.NONE;
        errorMessage = null;
        title = null;
        defaultMessage = null;
        defaultMessageType = IMessageProvider.NONE;
    }

    /**
     * Cleanup the Dialog and close it.
     */
    @Override
    public boolean close() {
        dispose();
        return super.close();
    }

    /**
     * Set the enabled state of the dialog button specified by the given id (@see <code>IDialogConstants</code>)
     * to the given state.
     *
     * @param buttonId The button id for the button to change the enabled state for.
     * @param enabled The new enabled state to set for the button.
     */
    public void setButtonEnabled(int buttonId, boolean enabled) {
        Button button = getButton(buttonId);
        if (button != null) {
            button.setEnabled(enabled);
        }
    }

    /**
     * Sets the title for this dialog.
     *
     * @param title The title.
     */
    public void setDialogTitle(String title) {
        if (getShell() != null && !getShell().isDisposed()) {
            getShell().setText(title);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#setTitle(java.lang.String)
     */
    @Override
    public void setTitle(String newTitle) {
        title = newTitle;
        super.setTitle(newTitle);
    }

    /**
     * Set the default message. The default message is shown within the
     * dialogs message area if no other message is set.
     *
     * @param message The default message or <code>null</code>.
     * @param type The default message type. See {@link IMessageProvider}.
     */
    public void setDefaultMessage(String message, int type) {
        defaultMessage = message;
        defaultMessageType = type;
        // Push the default message to the dialog if no other message is set
        if (!isMessageSet() && getContents() != null) {
            super.setMessage(defaultMessage, defaultMessageType);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#setMessage(java.lang.String, int)
     */
    @Override
    public void setMessage(String newMessage, int newType) {
        // To be able to implement IMessageProvider, we have to remember the
        // set message ourselfs. There is no access to these information by the
        // base class.
        message = newMessage;
        messageType = newType;
        // Only pass on to super implementation if the control has been created yet
        if (getContents() != null) {
            super.setMessage(message != null ? message : defaultMessage,
                    message != null ? messageType : defaultMessageType);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#setErrorMessage(java.lang.String)
     */
    @Override
    public void setErrorMessage(String newErrorMessage) {
        // See setMessage(...)
        errorMessage = newErrorMessage;
        super.setErrorMessage(newErrorMessage);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage()
     */
    @Override
    public String getMessage() {
        return errorMessage != null ? errorMessage : message;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType()
     */
    @Override
    public int getMessageType() {
        return errorMessage != null ? IMessageProvider.ERROR : messageType;
    }

    /**
     * Returns if or if not an message is set to the dialog.
     *
     * @return <code>True</code> if a message has been set, <code>false</code> otherwise.
     */
    public boolean isMessageSet() {
        return errorMessage != null || message != null;
    }
}