net.rim.ejde.internal.ui.dialogs.CleanSimulatorDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.dialogs.CleanSimulatorDialog.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.dialogs;

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

import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.ui.dialogs.CleanSimulatorTreeItem.ItemId;
import net.rim.ejde.internal.ui.dialogs.CleanSimulatorTreeItem.ItemType;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.VMUtils;
import net.rim.ejde.internal.util.VMUtils.VMVersionComparator;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
import org.eclipse.ui.internal.MessageLine;

/**
 * CleanSimulatorDialog
 *
 * @author bkurz
 *
 */
public class CleanSimulatorDialog extends SelectionStatusDialog {
    private static String SDK_FIVE_VERSION = "5.0.0.0";

    private final int _treeViewerWidth = 78;
    private final int _treeViewerHeight = 18;

    private CheckboxTreeViewer _viewer;
    private ILabelProvider _labelProvider;
    private ILabelDecorator _labelDecorator;
    private ITreeContentProvider _contentProvider;
    private ICheckStateProvider _checkStateProvider;
    private Object _input;
    private IStatus _currentStatus;

    private String message = ""; //$NON-NLS-1$

    public CleanSimulatorDialog(Shell parent, ILabelProvider labelProvider, ILabelDecorator labelDecorator,
            ITreeContentProvider contentProvider, ICheckStateProvider checkStateProvider) {
        super(parent);
        _labelProvider = labelProvider;
        _labelDecorator = labelDecorator;
        _contentProvider = contentProvider;
        _checkStateProvider = checkStateProvider;
        setResult(new ArrayList<CleanSimulatorTreeItem>(0));
        setStatusLineAboveButtons(true);
        setStatus(null);
    }

    /**
     * Sets the input for the tree viewer
     *
     * @param input
     */
    public void setInput(Object input) {
        _input = input;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        GridData gridData = null;

        // Create message area and apply layout
        Label messageArea = createMessageArea(composite);
        gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
        gridData.widthHint = convertWidthInCharsToPixels(_treeViewerWidth);
        messageArea.setLayoutData(gridData);

        // Create tree viewer and apply layout
        CheckboxTreeViewer treeViewer = createTreeViewer(composite);
        gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.widthHint = convertWidthInCharsToPixels(_treeViewerWidth);
        gridData.heightHint = convertHeightInCharsToPixels(_treeViewerHeight);

        Tree tree = treeViewer.getTree();
        tree.setLayoutData(gridData);
        tree.setFont(parent.getFont());

        createSelectionButtons(composite);

        return composite;
    }

    @Override
    protected Label createMessageArea(Composite composite) {
        Label label = new Label(composite, SWT.WRAP);
        if (message != null) {
            label.setText(message);
        }
        label.setFont(composite.getFont());
        return label;
    }

    @Override
    protected String getMessage() {
        return message;
    }

    @Override
    public void setMessage(String message) {
        this.message = message;
    }

    protected CheckboxTreeViewer createTreeViewer(Composite parent) {
        _viewer = new CheckboxTreeViewer(parent, SWT.BORDER);
        _viewer.setLabelProvider(new DecoratingLabelProvider(_labelProvider, _labelDecorator));
        _viewer.setContentProvider(_contentProvider);
        _viewer.setCheckStateProvider(_checkStateProvider);
        _viewer.setInput(_input);
        _viewer.setAutoExpandLevel(2);
        _viewer.addCheckStateListener(new ICheckStateListener() {
            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                boolean isChecked = event.getChecked();
                CleanSimulatorTreeItem item = (CleanSimulatorTreeItem) event.getElement();
                if (!item.isEnabled()) {
                    // Sets enable state for SDKs with a running simulator
                    CheckboxTreeViewer source = (CheckboxTreeViewer) event.getSource();
                    source.setChecked(item, !isChecked);
                } else {
                    // Set check state for all items
                    item.setChecked(isChecked);
                    if (item.hasChildItems()) {
                        item.setAllChildrenChecked(isChecked);
                    }

                    // Check for older SDKs
                    boolean isOlderSDK = false;
                    if (item.getItemType().equals(ItemType.INTERNAL_BUNDLE)
                            && item.getRootItem().getChildItem(ItemId.CLEAN_SIMULATOR_DIRECTORY).isChecked()) {
                        isOlderSDK = isOlderSDK(item);
                    }

                    // Set check state for older SDKs
                    if (item.getItemID().equals(ItemId.CLEAN_SIMULATOR_DIRECTORY)
                            && item.getItemType().equals(ItemType.INTERNAL_BUNDLE)) {
                        if (isOlderSDK && isChecked) {
                            item.getParentItem().getChildItem(ItemId.ERASE_FILE_SYSTEM).setChecked(isChecked);
                        }
                    }

                    if (item.hasParentItem()) {
                        CleanSimulatorTreeItem parentItem = item.getParentItem();
                        boolean isSomeChildChecked = parentItem.isSomeChildChecked();
                        item.setAllParentChecked(isChecked ? isChecked : isSomeChildChecked);
                    }
                }

                updateViewer();
                setStatus(null);
                setWarningOlderSDK();
            }
        });
        _viewer.expandToLevel(1);
        _viewer.setExpandedElements(_viewer.getCheckedElements());

        updateViewer();
        setStatus(null);

        setWarningOlderSDK();
        return _viewer;
    }

    @SuppressWarnings("unchecked")
    private void updateViewer() {
        List<CleanSimulatorTreeItem> items = (List<CleanSimulatorTreeItem>) _viewer.getInput();
        List<CleanSimulatorTreeItem> checkedItems = new ArrayList<CleanSimulatorTreeItem>();
        List<CleanSimulatorTreeItem> grayedItems = new ArrayList<CleanSimulatorTreeItem>();

        for (CleanSimulatorTreeItem item : items) {
            if (item.isEnabled()) {
                grayedItems.addAll(CleanSimulatorTreeItem.getGrayedItems(item));
                checkedItems.addAll(CleanSimulatorTreeItem.getCheckedItems(item));
            }
        }
        _viewer.setCheckedElements(checkedItems.toArray());
        _viewer.setGrayedElements(grayedItems.toArray());
    }

    @SuppressWarnings("restriction")
    @Override
    protected Control createButtonBar(Composite parent) {
        Composite composite = (Composite) super.createButtonBar(parent);

        for (Control c : composite.getChildren()) {
            if (c instanceof MessageLine) {
                GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, true);
                layoutData.horizontalSpan = 2;
                layoutData.verticalAlignment = SWT.TOP;
                layoutData.widthHint = 100;
                layoutData.heightHint = 30;
                c.setLayoutData(layoutData);
            }
        }
        return composite;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    protected void createSelectionButtons(Composite parent) {
        Composite composite = new Composite(parent, SWT.RIGHT);

        GridLayout layout = new GridLayout();
        layout.numColumns = 0;
        layout.marginWidth = 0;
        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        composite.setLayout(layout);

        GridData gridData = new GridData(SWT.RIGHT, SWT.FILL, true, false);
        composite.setLayoutData(gridData);

        Button selectAllButton = createButton(composite, IDialogConstants.SELECT_ALL_ID,
                Messages.CLEAN_SIMULATOR_DIALOG_SELECT_ALL_BUTTON, false);
        selectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Object[] items = _contentProvider.getElements(_input);
                selectAll(items, true);
            }
        });

        Button deselectAllButton = createButton(composite, IDialogConstants.DESELECT_ALL_ID,
                Messages.CLEAN_SIMULATOR_DIALOG_DESELECT_ALL_BUTTON, false);
        deselectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Object[] items = _contentProvider.getElements(_input);
                selectAll(items, false);
            }
        });
    }

    private void selectAll(Object[] items, boolean selected) {
        CleanSimulatorTreeItem treeItem;
        for (Object item : items) {
            treeItem = (CleanSimulatorTreeItem) item;

            if (treeItem.isEnabled()) {
                treeItem.getRootItem().setAllChildrenChecked(selected);
            }
        }
        updateViewer();
        setStatus(null);
        setWarningOlderSDK();
    }

    @Override
    protected void computeResult() {
        _viewer.expandAll();
        setResult(Arrays.asList(_viewer.getCheckedElements()));
    }

    @Override
    protected void cancelPressed() {
        setResult(null);
        super.cancelPressed();
    }

    private void setStatus(Status status) {
        if (status == null) {
            if (_viewer != null && _viewer.getCheckedElements().length > 0) {
                _currentStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0, IConstants.EMPTY_STRING, null);
            } else {
                _currentStatus = new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
                        Messages.CLEAN_SIMULATOR_DIALOG_ERROR_NO_SELECTION, null);
            }
        } else {
            _currentStatus = status;
        }
        updateStatus(_currentStatus);
        updateButtonsEnableState(_currentStatus);
    }

    private void setWarningOlderSDK() {
        Object[] items = _contentProvider.getElements(_input);
        for (Object item : items) {
            CleanSimulatorTreeItem treeItem = (CleanSimulatorTreeItem) item;
            if (treeItem.getItemType().equals(ItemType.INTERNAL_BUNDLE) && isOlderSDK(treeItem)) {
                if (treeItem.getChildItem(ItemId.CLEAN_SIMULATOR_DIRECTORY).isChecked()
                        && !treeItem.getChildItem(ItemId.ERASE_FILE_SYSTEM).isChecked()) {
                    setStatus(new Status(IStatus.WARNING, PlatformUI.PLUGIN_ID, 0,
                            Messages.CLEAN_SIMULATOR_DIALOG_WARNING_OLDER_SDK, null));
                }
                break;
            }
        }
    }

    private boolean isOlderSDK(CleanSimulatorTreeItem item) {
        CleanSimulatorTreeItemInternal itemInternalBundle = (CleanSimulatorTreeItemInternal) item;
        VMVersionComparator comparator = new VMVersionComparator();
        int result = comparator.compare(VMUtils.getVMVersion(itemInternalBundle.getVMInstall()), SDK_FIVE_VERSION);
        return result == -1 ? true : false;
    }
}