Java tutorial
/* * 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; } }