com.aptana.ui.dialogs.MinimizableWizardDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ui.dialogs.MinimizableWizardDialog.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2012 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ui.dialogs;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

/**
 * A {@link WizardDialog} implementation that allows replacing the "Finish" button with a "Hide" button, and has a
 * default behavior for hiding the wizard. By default, the wizard will be hidden, and a toast will appear on the bottom
 * right side of the studio. Clicking the toast will show the wizard again.<br>
 * 
 * @author sgibly@appcelerator.com
 */
public class MinimizableWizardDialog extends WizardDialog {
    private boolean hideOnFinish;
    private String infoTitle;
    private String infoMessage;
    private GenericInfoPopupDialog toast;

    /**
     * Constructs a new MinimizableWizardDialog. By default, the wizard dialog will act as a regular
     * {@link WizardDialog} , and will display a "Finish" button. In case you wish to change the finish into "Hide",
     * call the {@link #enableHiding(boolean)} with <code>true</code>. This is useful when you only want to display the
     * "Hide" when a specific condition is met.
     * 
     * @param parentShell
     * @param newWizard
     * @param infoTitle
     *            The title to display for the 'toast' in case the 'Hide' is clicked.
     * @param infoMessage
     *            The message to display in the 'toast' in case the 'Hide' is clicked.
     */
    public MinimizableWizardDialog(Shell parentShell, IWizard newWizard, String infoTitle, String infoMessage) {
        super(parentShell, newWizard);
        this.infoTitle = infoTitle;
        this.infoMessage = infoMessage;
    }

    /**
     * Constructs a new MinimizableWizardDialog.
     * 
     * @param parentShell
     * @param newWizard
     * @param hideOnFinish
     *            When <code>true</code>, indicate the this wizard dialog will display "Hide" instead of "Finish" right
     *            when it opens.
     * @param infoTitle
     *            The title to display for the 'toast' in case the 'Hide' is clicked.
     * @param infoMessage
     *            The message to display in the 'toast' in case the 'Hide' is clicked.
     */
    public MinimizableWizardDialog(Shell parentShell, IWizard newWizard, boolean hideOnFinish, String infoTitle,
            String infoMessage) {
        this(parentShell, newWizard, infoTitle, infoMessage);
        this.hideOnFinish = hideOnFinish;
    }

    /**
     * The Hide button has been pressed.
     */
    public void hidePressed() {
        if (hideOnFinish) {
            final Shell activeShell = getShell();
            toast = new GenericInfoPopupDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                    infoTitle, infoMessage, new Runnable() {
                        public void run() {
                            activeShell.setVisible(true);
                        }
                    });
            toast.open();
            activeShell.setVisible(false);

            activeShell.addShellListener(new ShellAdapter() {
                @Override
                public void shellClosed(ShellEvent e) {
                    if (toast != null) {
                        // In case the shell gets closed programatically, close the toast.
                        toast.close();
                    }
                }
            });
        }

    }

    /**
     * Enables the wizard to hide. When <code>true</code>, the 'Finish' button is replaced with 'Hide' button. On
     * pressing Hide button, the dialog is hidden and a 'toast' appears at the bottom of the screen. Clicking the toast
     * will bring back the dialog onto the screen.
     * 
     * @param enabled
     */
    public void enableHiding(boolean enabled) {
        if (hideOnFinish != enabled) {
            hideOnFinish = enabled;
            updateFinishButton(getButton(IDialogConstants.FINISH_ID));
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String,
     * boolean)
     */
    @Override
    protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
        Button b = super.createButton(parent, id, label, defaultButton);
        if (hideOnFinish && id == IDialogConstants.FINISH_ID) {
            updateFinishButton(b);
        }
        return b;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.wizard.WizardDialog#finishPressed()
     */
    @Override
    protected void finishPressed() {
        if (hideOnFinish) {
            hidePressed();
        } else {
            super.finishPressed();
        }
    }

    protected void updateFinishButton(Button button) {
        if (button != null) {
            button.setText(
                    hideOnFinish ? Messages.MinimizableWizardDialog_hideLabel : IDialogConstants.FINISH_LABEL);
        }
    }
}