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