org.xmind.ui.dialogs.SimpleInfoPopupDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.ui.dialogs.SimpleInfoPopupDialog.java

Source

/* ******************************************************************************
 * Copyright (c) 2006-2012 XMind Ltd. and others.
 * 
 * This file is a part of XMind 3. XMind releases 3 and
 * above are dual-licensed under the Eclipse Public License (EPL),
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 * and the GNU Lesser General Public License (LGPL), 
 * which is available at http://www.gnu.org/licenses/lgpl.html
 * See http://www.xmind.net/license.html for details.
 * 
 * Contributors:
 *     XMind Ltd. - initial API and implementation
 *******************************************************************************/
package org.xmind.ui.dialogs;

import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.util.Util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.xmind.ui.resources.FontUtils;

public class SimpleInfoPopupDialog extends SmoothPopupDialog {

    private String infoText;

    private IAction leftAction;

    private IAction rightAction;

    private int iconId;

    private Image icon;

    private boolean closeOnAction = false;

    public SimpleInfoPopupDialog(Shell parent, String title, String infoText) {
        this(parent, title, infoText, 0, null, null);
    }

    public SimpleInfoPopupDialog(Shell parent, String title, String infoText, int iconId) {
        this(parent, title, infoText, iconId, null, null);
    }

    public SimpleInfoPopupDialog(Shell parent, String title, String infoText, int iconId, IAction leftAction,
            IAction rightAction) {
        super(parent, true, title);
        this.infoText = infoText;
        this.iconId = iconId;
        this.leftAction = leftAction;
        this.rightAction = rightAction;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        GridLayout layout = ((GridLayout) composite.getLayout());
        layout.marginWidth = 5;
        layout.marginHeight = 5;

        boolean hasIcon = hasIcon();
        boolean hasInfo = hasInfo();

        if (hasIcon || hasInfo) {
            Composite infoArea = new Composite(composite, SWT.NO_FOCUS);
            int numColumns = hasIcon && hasInfo ? 2 : 1;
            GridLayout infoAreaLayout = new GridLayout(numColumns, false);
            infoAreaLayout.marginWidth = 0;
            infoAreaLayout.marginHeight = 0;
            infoArea.setLayout(infoAreaLayout);
            GridData infoAreaLayoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
            infoAreaLayoutData.widthHint = 180;
            infoAreaLayoutData.heightHint = 100;
            infoArea.setLayoutData(infoAreaLayoutData);

            if (hasIcon) {
                Label iconLabel = new Label(infoArea, SWT.CENTER);
                iconLabel.setImage(getIcon());
                iconLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, !hasInfo, true));
            }

            if (hasInfo) {
                Label info = new Label(infoArea, SWT.WRAP | SWT.CENTER);
                info.setText(getInfoText());
                info.setFont(getInfoFont());
                info.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, true));
            }
        }

        boolean hasLeftAction = leftAction != null;
        boolean hasRightAction = rightAction != null;
        if (hasLeftAction || hasRightAction) {
            Composite actionBar = new Composite(composite, SWT.NO_FOCUS);
            int numColumns = hasLeftAction && hasRightAction ? 2 : 1;
            GridLayout infoAreaLayout = new GridLayout(numColumns, false);
            infoAreaLayout.marginWidth = 0;
            infoAreaLayout.marginHeight = 0;
            actionBar.setLayout(infoAreaLayout);
            actionBar.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, !hasInfo && !hasIcon));

            if (hasLeftAction) {
                Control left = createHyperlink(actionBar, leftAction);
                GridData leftLayoutData = new GridData(SWT.BEGINNING, SWT.END, true, !hasInfo && !hasIcon);
                left.setLayoutData(leftLayoutData);
            }

            if (hasRightAction) {
                Control right = createHyperlink(actionBar, rightAction);
                GridData rightLayoutData = new GridData(SWT.END, SWT.END, true, !hasInfo && !hasIcon);
                right.setLayoutData(rightLayoutData);
            }
        }

        return composite;
    }

    protected Control createHyperlink(Composite parent, final IAction action) {
        Hyperlink hyperlink = new Hyperlink(parent, SWT.NONE);
        hyperlink.setText(getHyperlinkText(action));
        hyperlink.setUnderlined(true);
        hyperlink.addHyperlinkListener(new HyperlinkAdapter() {
            public void linkActivated(HyperlinkEvent e) {
                openHyperlink(action);
                if (closeOnAction) {
                    close();
                }
            }
        });
        return hyperlink;
    }

    protected String getHyperlinkText(IAction action) {
        String text = action.getText();
        if (text != null) {
            text = Action.removeAcceleratorText(text);
            text = Action.removeMnemonics(text);
            return text;
        }
        return ""; //$NON-NLS-1$
    }

    public IAction getLeftAction() {
        return leftAction;
    }

    public IAction getRightAction() {
        return rightAction;
    }

    protected boolean hasHyperlink() {
        return leftAction != null;
    }

    protected void openHyperlink(final IAction action) {
        SafeRunner.run(new SafeRunnable() {
            public void run() throws Exception {
                action.run();
            }
        });
    }

    protected Font getInfoFont() {
        return FontUtils.getNewHeight(JFaceResources.DEFAULT_FONT, Util.isMac() ? 14 : 10);
    }

    public String getInfoText() {
        return infoText;
    }

    protected boolean hasInfo() {
        return infoText != null;
    }

    protected Image getIcon() {
        if (icon == null && iconId > 0) {
            icon = getShell().getDisplay().getSystemImage(iconId);
        }
        return icon;
    }

    protected boolean hasIcon() {
        return iconId > 0 && getIcon() != null;
    }

    /**
     * Turn on/off "close popup dialog on left/right action triggered" feature.
     * 
     * @param enabled
     */
    public void setCloseOnAction(boolean enabled) {
        this.closeOnAction = enabled;
    }

}