hydrograph.ui.help.aboutDialog.CustomAboutDialog.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.help.aboutDialog.CustomAboutDialog.java

Source

/*******************************************************************************
 * Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/

package hydrograph.ui.help.aboutDialog;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IProduct;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.about.AboutBundleGroupData;
import org.eclipse.ui.internal.about.AboutItem;
import org.eclipse.ui.internal.about.AboutTextManager;
import org.eclipse.ui.internal.about.InstallationDialog;
import org.eclipse.ui.internal.util.BundleUtility;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;

import hydrograph.ui.common.util.CustomColorRegistry;
import hydrograph.ui.help.Activator;
import hydrograph.ui.help.Messages;
import hydrograph.ui.logging.factory.LogFactory;
import hydrograph.ui.propertywindow.widgets.utility.WidgetUtility;

/**
 * The Class CustomAboutDialog. Creates Custom AboutDialog of Hydrograph
 * Application
 * 
 * @author Bitwise
 */
public class CustomAboutDialog extends TrayDialog {
    private static final String ECLIPSE_BUILD_ID = "eclipse.buildId";
    private final static int MAX_IMAGE_WIDTH_FOR_TEXT = 250;
    private final static int TEXT_MARGIN = 5;

    private final static int DETAILS_ID = IDialogConstants.CLIENT_ID + 1;

    private String productName;

    private IProduct product;

    private ArrayList<Image> images = new ArrayList<Image>();

    private Logger logger = LogFactory.INSTANCE.getLogger(CustomAboutDialog.class);
    private StyledText text;
    private Shell parentShell;
    private AboutTextManager aboutTextManager;
    private Cursor handCursor;
    private AboutItem item;
    private GridData data_1;
    private AboutBundleGroupData[] bundleGroupInfos;

    /**
     * Create an instance of the AboutDialog for the given window.
     * 
     * @param parentShell
     *            The parent of the dialog.
     */
    public CustomAboutDialog(Shell parentShell) {
        super(parentShell);
        this.parentShell = parentShell;
        setShellStyle(SWT.CLOSE | SWT.APPLICATION_MODAL | SWT.WRAP);
        product = Platform.getProduct();

        if (product != null) {
            productName = product.getName();
        }
        if (productName == null) {
            productName = WorkbenchMessages.AboutDialog_defaultProductName;
        }

        // setDialogHelpAvailable(true);
    }

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected void buttonPressed(int buttonId) {
        switch (buttonId) {
        case DETAILS_ID:
            BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
                public void run() {
                    IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                    InstallationDialog dialog = new InstallationDialog(getShell(), workbenchWindow);
                    dialog.setModalParent(CustomAboutDialog.this);
                    dialog.open();
                }
            });
            break;
        default:
            super.buttonPressed(buttonId);
            break;
        }
    }

    public boolean close() {
        // dispose all images
        for (int i = 0; i < images.size(); ++i) {
            Image image = (Image) images.get(i);
            image.dispose();
        }

        return super.close();
    }

    /*
     * (non-Javadoc) Method declared on Window.
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(NLS.bind(WorkbenchMessages.AboutDialog_shellTitle, productName));

    }

    /**
     * Creates and returns the contents of the upper part of the dialog (above
     * the button bar).
     *
     * Subclasses should overide.
     *
     * @param parent
     *            the parent composite to contain the dialog area
     * @return the dialog area control
     */
    protected Control createDialogArea(Composite parent) {
        // brand the about box if there is product info
        Image aboutImage = null;
        item = null;
        if (product != null) {
            Bundle bundle = Platform.getBundle(Constants.ABOUT_DIALOG_IMAGE_BUNDLE_NAME);
            URL fullPathString = BundleUtility.find(bundle, Constants.ABOUT_DIALOG_IMAGE_PATH);
            aboutImage = ImageDescriptor.createFromURL(fullPathString).createImage();

            parent.getShell().setMinimumSize(450, 267);

            // if the about image is small enough, then show the text
            if (aboutImage == null || aboutImage.getBounds().width <= MAX_IMAGE_WIDTH_FOR_TEXT) {
                String aboutText = Messages.ABOUT_HEADER_TEXT + Messages.ABOUT_TEXT;

                if (aboutText != null) {
                    String buildNumber = System.getProperty(ECLIPSE_BUILD_ID);
                    if (StringUtils.isBlank(buildNumber)) {
                        buildNumber = Platform.getBundle(Activator.PLUGIN_ID).getVersion().toString();
                    }
                    item = AboutTextManager.scan(Messages.ABOUT_VERSION_INFO + "\n" + "Build Number : "
                            + buildNumber + "\n \n" + "License Information : " + Messages.ABOUT_LICENSE_INFO
                            + "\n \n " + Messages.ABOUT_COPYRIGHT_INFO + "\n \n");
                }
            }

            if (aboutImage != null) {
                images.add(aboutImage);
            }
        }

        // create a composite which is the parent of the top area and the bottom
        // button bar, this allows there to be a second child of this composite
        // with
        // a banner background on top but not have on the bottom
        Composite workArea = new Composite(parent, SWT.NONE);
        GridLayout workLayout = new GridLayout();
        workLayout.marginHeight = 0;
        workLayout.marginWidth = 0;
        workLayout.verticalSpacing = 0;
        workLayout.horizontalSpacing = 0;
        workArea.setLayout(workLayout);
        workArea.setLayoutData(new GridData(GridData.FILL_BOTH));

        // page group
        Color background = JFaceColors.getBannerBackground(parent.getDisplay());
        Color foreground = JFaceColors.getBannerForeground(parent.getDisplay());
        Composite top = (Composite) super.createDialogArea(workArea);

        // override any layout inherited from createDialogArea
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 0;
        layout.horizontalSpacing = 0;
        top.setLayout(layout);
        top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        top.setBackground(background);
        top.setForeground(foreground);

        // the image & text
        final Composite topContainer = new Composite(top, SWT.NONE);
        topContainer.setBackground(background);
        topContainer.setForeground(foreground);

        layout = new GridLayout();
        layout.numColumns = (aboutImage == null || item == null ? 1 : 2);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.verticalSpacing = 0;
        layout.horizontalSpacing = 0;
        topContainer.setLayout(layout);
        topContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        // Calculate a good height for the text
        GC gc = new GC(parent);
        int lineHeight = gc.getFontMetrics().getHeight();
        gc.dispose();

        // image on left side of dialog
        if (aboutImage != null) {
            Label imageLabel = new Label(topContainer, SWT.NONE);
            imageLabel.setBackground(background);
            imageLabel.setForeground(foreground);

            GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 0, 0);
            data.horizontalAlignment = GridData.FILL;
            data.verticalAlignment = GridData.FILL;
            data.grabExcessHorizontalSpace = true;
            data.grabExcessVerticalSpace = true;
            imageLabel.setLayoutData(data);
            imageLabel.setImage(aboutImage);
        }

        Composite newComposite = new Composite(topContainer, SWT.NONE);
        newComposite.setLayout(new GridLayout(1, true));
        newComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        newComposite.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 255, 255));
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
        topContainer.setLayoutData(data);
        // used only to drive initial size so that there are no hints in the
        // layout data
        final Link link = new Link(newComposite, SWT.NONE);
        GridData data1 = new GridData(SWT.FILL, SWT.FILL, true, false, 0, 0);
        link.setLayoutData(data1);
        link.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 255, 255));
        link.setText("<a>" + Messages.ABOUT_HEADER_TEXT + "</a>" + Messages.ABOUT_TEXT);

        link.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(MouseEvent e) {
                try {
                    PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser()
                            .openURL(new URL(Messages.HYDROGRAPH_URL));
                } catch (IllegalArgumentException | PartInitException | MalformedURLException e1) {
                    logger.error(e1.getMessage());
                    WidgetUtility.errorMessage(Messages.ERROR_MESSAGE_FOR_GITHUB_URL);
                }

            }
        });
        if (item != null) {

            text = new StyledText(newComposite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
            configureText(newComposite);

        }

        // horizontal bar
        Label bar = new Label(workArea, SWT.HORIZONTAL | SWT.SEPARATOR);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        bar.setLayoutData(data);

        // add image buttons for bundle groups that have them
        Composite bottom = (Composite) super.createDialogArea(workArea);
        // override any layout inherited from createDialogArea
        layout = new GridLayout();
        bottom.setLayout(layout);
        data_1 = new GridData();
        data_1.heightHint = 0;
        data_1.horizontalAlignment = SWT.FILL;
        data_1.verticalAlignment = SWT.FILL;
        data_1.grabExcessHorizontalSpace = true;

        bottom.setLayoutData(data_1);

        // spacer
        bar = new Label(bottom, SWT.NONE);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        bar.setLayoutData(data);

        return workArea;
    }

    void recreateWrappedText(Composite parent, boolean withScrolling) {
        int style = text.getStyle();
        if (withScrolling) {
            style |= SWT.V_SCROLL;
        } else {
            style ^= SWT.V_SCROLL;
        }
        boolean hasFocus = text.isFocusControl();
        Point selection = text.getSelection();
        text.dispose();
        text = new StyledText(parent, style);
        configureText(parent);
        if (hasFocus) {
            // text.setFocus();
        }
        text.setSelection(selection);
    }

    void configureText(final Composite parent) {
        // Don't set caret to 'null' as this causes
        // https://bugs.eclipse.org/293263.
        // text.setCaret(null);
        Color background = JFaceColors.getBannerBackground(parent.getDisplay());
        Color foreground = JFaceColors.getBannerForeground(parent.getDisplay());

        text.setFont(parent.getFont());
        text.setText(item.getText());

        text.setBackground(background);
        text.setForeground(foreground);
        text.setMargins(TEXT_MARGIN, TEXT_MARGIN, TEXT_MARGIN, 0);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        text.setLayoutData(gd);

        aboutTextManager = new AboutTextManager(text);
        aboutTextManager.setItem(item);

        createTextMenu();

    }

    /**
     * Create the context menu for the text widget.
     * 
     * @since 3.4
     */
    private void createTextMenu() {
        final MenuManager textManager = new MenuManager();
        textManager.add(new CommandContributionItem(new CommandContributionItemParameter(PlatformUI.getWorkbench(),
                null, IWorkbenchCommandConstants.EDIT_COPY, CommandContributionItem.STYLE_PUSH)));
        textManager.add(new CommandContributionItem(new CommandContributionItemParameter(PlatformUI.getWorkbench(),
                null, IWorkbenchCommandConstants.EDIT_SELECT_ALL, CommandContributionItem.STYLE_PUSH)));
        text.setMenu(textManager.createContextMenu(text));
        text.addDisposeListener(new DisposeListener() {

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

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
     */
    protected boolean isResizable() {
        return true;
    }

    protected void createButtonsForButtonBar(Composite parent) {
        parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Button button = createButton(parent, 0, "", false);
        Bundle bundle = Platform.getBundle(Constants.ABOUT_DIALOG_IMAGE_BUNDLE_NAME);
        URL fullPathString = BundleUtility.find(bundle, Constants.ABOUT_DIALOG_FEATURE_IMAGE_PATH);
        button.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false));
        button.setToolTipText("Help");
        Image image = ImageDescriptor.createFromURL(fullPathString).createImage();
        button.setImage(image);
        images.add(image);

        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                IWorkbenchPart workbenchPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                        .getActivePart();
                IHandlerService handlerService = (IHandlerService) workbenchPart.getSite()
                        .getService(IHandlerService.class);
                try {
                    handlerService.executeCommand("org.eclipse.ui.help.displayHelp", null);
                } catch (Exception ex) {
                    throw new RuntimeException("Help File Not Found!");
                }
            }
        });

        Button installationButton = new Button(parent, SWT.PUSH);
        installationButton.setLayoutData(new GridData());
        GridLayout layout = (GridLayout) parent.getLayout();
        installationButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
        layout.numColumns++;
        layout.makeColumnsEqualWidth = false;
        installationButton.setText("Installation Details");
        installationButton.setToolTipText("Installation Details");
        installationButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                HydrographInstallationDialog dialog = new HydrographInstallationDialog(getShell());
                dialog.open();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                // {Do-nothing}
            }
        });

        Label installationLabel = new Label(parent, SWT.NONE);
        installationLabel.setLayoutData(new GridData());
        GridLayout installationLabelLayout = (GridLayout) parent.getLayout();
        installationLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
        installationLabelLayout.numColumns++;
        installationLabelLayout.makeColumnsEqualWidth = false;

        Button ok = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        ok.setFocus();

    }
}