com.codesourcery.internal.installer.ui.pages.ProductsPage.java Source code

Java tutorial

Introduction

Here is the source code for com.codesourcery.internal.installer.ui.pages.ProductsPage.java

Source

/*******************************************************************************
 *  Copyright (c) 2014 Mentor Graphics 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:
 *     Mentor Graphics - initial API and implementation
 *******************************************************************************/
package com.codesourcery.internal.installer.ui.pages;

import java.util.ArrayList;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
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.TableColumn;

import com.codesourcery.installer.IInstallConsoleProvider;
import com.codesourcery.installer.IInstallData;
import com.codesourcery.installer.IInstallMode;
import com.codesourcery.installer.IInstallProduct;
import com.codesourcery.installer.IInstalledProduct;
import com.codesourcery.installer.Installer;
import com.codesourcery.installer.console.ConsoleListPrompter;
import com.codesourcery.installer.ui.InstallWizardPage;
import com.codesourcery.internal.installer.IInstallerImages;
import com.codesourcery.internal.installer.InstallMessages;

/**
 * This page presents installed products
 * for selection.
 */
public class ProductsPage extends InstallWizardPage implements IInstallConsoleProvider {
    private static final String[] COLUMN_NAMES = new String[] { InstallMessages.ProductsPage_NameColumn,
            InstallMessages.ProductsPage_VersionColumn };
    /** Components table column widths */
    private static final int[] COLUMN_WIDTHS = new int[] { 350, 100 };

    /** Installed products */
    protected IInstallProduct[] installedProducts = null;
    /** Selected products */
    protected IInstallProduct[] selectedProducts = null;
    /** Message label */
    protected Label messageLabel;
    /** Message to show */
    protected String message;
    /** Products table */
    protected CheckboxTableViewer viewer;
    /** Console list prompter */
    protected ConsoleListPrompter<IInstallProduct> consoleList;

    /**
     * Constructor
     * 
     * @param pageName Page name
     * @param title Page title
     * @param message Message to show
     */
    public ProductsPage(String pageName, String title, String message) {
        super(pageName, title);

        this.message = message;
        setPageComplete(true);
    }

    /**
     * Returns the prompt message.
     * 
     * @return Message
     */
    private String getPromptMessage() {
        return message;
    }

    /**
     * Returns the selected products.
     * 
     * @return Selected products
     */
    public IInstallProduct[] getSelectedProducts() {
        return selectedProducts;
    }

    /**
     * Sets the selected products.
     * 
     * @param products Selected products
     */
    private void setSelectedProducts(IInstallProduct[] products) {
        this.selectedProducts = products;
    }

    @Override
    public Control createContents(Composite parent) {
        Composite area = new Composite(parent, SWT.NONE);
        area.setLayout(new GridLayout(1, false));
        area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        // Message label
        messageLabel = new Label(area, SWT.WRAP);
        messageLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 1, 1));
        messageLabel.setText(getPromptMessage());

        viewer = CheckboxTableViewer.newCheckList(area,
                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        viewer.getTable().setHeaderVisible(true);
        viewer.setLabelProvider(new ProductLabelProvider());
        // Components table columns
        for (int i = 0; i < COLUMN_NAMES.length; i++) {
            TableColumn column = new TableColumn(viewer.getTable(), SWT.LEFT);
            column.setText(COLUMN_NAMES[i]);
            column.setWidth(COLUMN_WIDTHS[i]);
        }
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                onProductSelected();
            }
        });

        return area;
    }

    @Override
    public void setActive(IInstallData data) {
        super.setActive(data);

        if (installedProducts == null) {
            installedProducts = Installer.getDefault().getInstallManager().getInstallManifest().getProducts();
            if (!isConsoleMode()) {
                viewer.setInput(installedProducts);

                // Find installed product if available
                IInstallProduct uninstallProduct = null;
                IInstalledProduct installedProduct = Installer.getDefault().getInstallManager()
                        .getInstalledProduct();
                if (installedProduct != null) {
                    IInstallProduct[] products = Installer.getDefault().getInstallManager().getInstallManifest()
                            .getProducts();
                    for (IInstallProduct product : products) {
                        if (product.getId().equals(installedProduct.getId())) {
                            uninstallProduct = product;
                            break;
                        }
                    }
                }

                // If installed product has been set, check only it
                if (uninstallProduct != null) {
                    viewer.setAllChecked(false);
                    viewer.setChecked(uninstallProduct, true);
                }
                // Else check all products
                else {
                    viewer.setAllChecked(true);
                }
            }
        }
    }

    /**
     * Called when the products selection has changed.
     */
    private void onProductSelected() {
        Object[] checkedElements = viewer.getCheckedElements();
        if (checkedElements.length == 0) {
            setErrorMessage(InstallMessages.ProductsPageSelectionError);
            setPageComplete(false);
        } else {
            setErrorMessage(null);
            setPageComplete(true);
        }

        getContainer().updateButtons();
    }

    /**
     * Product label provider
     */
    private class ProductLabelProvider extends LabelProvider implements ITableLabelProvider {
        @Override
        public Image getColumnImage(Object element, int columnIndex) {
            if (element instanceof IInstallProduct) {
                if (columnIndex == 0)
                    return Installer.getDefault().getImageRegistry().get(IInstallerImages.COMPONENT);
            }

            return null;
        }

        @Override
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof IInstallProduct) {
                IInstallProduct product = (IInstallProduct) element;
                if (columnIndex == 0)
                    return product.getName();
                else if (columnIndex == 1)
                    return product.getVersionString();
            }

            return null;
        }
    }

    @Override
    public boolean isSupported() {
        IInstallMode mode = Installer.getDefault().getInstallManager().getInstallMode();
        return mode.isUninstall();
    }

    @Override
    public void saveInstallData(IInstallData data) {
        if (!isConsoleMode()) {
            Object[] checkedElements = viewer.getCheckedElements();
            IInstallProduct[] products = new IInstallProduct[checkedElements.length];
            for (int index = 0; index < checkedElements.length; index++) {
                products[index] = (IInstallProduct) checkedElements[index];
            }

            setSelectedProducts(products);
        }
    }

    @Override
    public String getConsoleResponse(String input) throws IllegalArgumentException {
        String response = null;

        if (input == null) {
            // Create prompter
            consoleList = new ConsoleListPrompter<IInstallProduct>(getPromptMessage(), false);
            // Add prompts
            for (IInstallProduct installedProduct : installedProducts) {
                consoleList.addItem(installedProduct.getName(), installedProduct, true, true);
            }
        }

        // Get response
        response = consoleList.getConsoleResponse(input);
        if (response == null) {
            ArrayList<IInstallProduct> selectedProducts = new ArrayList<IInstallProduct>();
            consoleList.getSelectedData(selectedProducts);
            setSelectedProducts(selectedProducts.toArray(new IInstallProduct[selectedProducts.size()]));
        }

        return response;
    }
}