/* * 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.launchers; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import net.rim.ejde.internal.ui.viewers.project.BlackBerryProjectTreeViewer; import net.rim.ejde.internal.util.Messages; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.dialogs.SimpleWorkingSetSelectionDialog; /** * UI that displays selectable list of all BB apps in workspace * * @author bchabot */ public class AppSelectionUI { protected BlackBerryProjectTreeViewer _projectsTreeViewer; private Button _selectAllButton; private Button _deselectButton; private Button _selectWorkingSetButton; private Label _counterLabel; private PropertyChangeSupport _dispatcher = new PropertyChangeSupport( this ); private Listener _listener = new Listener(); class Listener extends SelectionAdapter { public void widgetSelected( SelectionEvent e ) { Object source = e.getSource(); if( source == _selectAllButton ) { _projectsTreeViewer.setAllChecked( true ); updateCounter(); } else if( source == _deselectButton ) { _projectsTreeViewer.setAllChecked( false ); updateCounter(); } else if( source == _selectWorkingSetButton ) { handleWorkingSetSelection(); updateCounter(); } _dispatcher.firePropertyChange( "", null, null ); } } /** * Constructor */ public AppSelectionUI() { } public void addPropertyChangeListener( PropertyChangeListener listener ) { _dispatcher.addPropertyChangeListener( listener ); } public void removePropertyChangeListener( PropertyChangeListener listener ) { _dispatcher.removePropertyChangeListener( listener ); } public List< String > getCheckedProjectNames() { return _projectsTreeViewer.getCheckedProjectNames(); } public List< IProject > getCheckedProjects() { return _projectsTreeViewer.getCheckedProjects(); } public boolean isChecked( IProject project ) { return _projectsTreeViewer.getChecked( project ); } /** * Refreshes the project selected count UI */ protected void updateCounter() { if( _counterLabel != null ) { int checked = _projectsTreeViewer.getCheckedElements().length; int total = _projectsTreeViewer.getNumProjects(); _counterLabel .setText( NLS.bind( Messages.AppSelectionUI_counter, Integer.valueOf( checked ), Integer.valueOf( total ) ) ); } } /** * Creates the UI * * @param parent * @param span * @param indent */ public void createControl( Composite parent, int span, int indent ) { createProjectViewer( parent, span - 1, indent ); createButtonContainer( parent ); } /** * Creates the project viewer UI * * @param composite * @param span * @param indent */ protected void createProjectViewer( Composite composite, int span, int indent ) { _projectsTreeViewer = new BlackBerryProjectTreeViewer( composite, span, indent ); GridData layoutData = new GridData( GridData.FILL_BOTH ); layoutData.widthHint = 410; _projectsTreeViewer.getTree().setLayoutData( layoutData ); _projectsTreeViewer.addCheckStateListener( new ICheckStateListener() { public void checkStateChanged( final CheckStateChangedEvent event ) { updateCounter(); _dispatcher.firePropertyChange( "", null, null ); } } ); } private void createButtonContainer( Composite parent ) { Composite composite = new Composite( parent, SWT.NONE ); GridLayout layout = new GridLayout(); layout.marginHeight = layout.marginWidth = 0; composite.setLayout( layout ); composite.setLayoutData( new GridData( GridData.FILL_VERTICAL ) ); _selectAllButton = createButton( composite, Messages.AppSelectionUI_selectAll ); _deselectButton = createButton( composite, Messages.AppSelectionUI_deselectAll ); _selectWorkingSetButton = createButton( composite, Messages.AppSelectionUI_selectWorkingSet ); _counterLabel = new Label( composite, SWT.NONE ); _counterLabel.setLayoutData( new GridData( GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_END ) ); updateCounter(); } protected int getTreeViewerStyle() { return SWT.BORDER; } private Button createButton( Composite composite, String text ) { Button button = new Button( composite, SWT.PUSH ); button.setText( text ); button.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); // SWTUtil.setButtonDimensionHint(button); button.addSelectionListener( _listener ); return button; } /** * Initializes the projects selected with the given config data * * @param config */ public void initializeFrom( Collection< IProject > allProjects, Collection< IProject > checkedProjects ) { if( _projectsTreeViewer.getInput() == null ) { _projectsTreeViewer.setUseHashlookup( true ); _projectsTreeViewer.initInput( allProjects ); } setCheckedProjects( checkedProjects ); updateCounter(); } protected void setCheckedProjects( Collection< IProject > checked ) { _projectsTreeViewer.setCheckedElements( checked.toArray( new IProject[ 0 ] ) ); } /** * @deprecated * */ public void performApply( ILaunchConfigurationWorkingCopy config ) { /* * config.setAttribute(IFledgeLaunchConstants.PROJECTS, _projectsTreeViewer.getSelectedProjectNames()); */ } public void enableViewer( boolean enable ) { _projectsTreeViewer.getTree().setEnabled( enable ); _selectAllButton.setEnabled( enable ); _deselectButton.setEnabled( enable ); _counterLabel.setEnabled( enable ); } public void dispose() { } protected boolean isEnabled() { return _projectsTreeViewer.getTree().isEnabled(); } private void handleWorkingSetSelection() { Shell shell = _selectWorkingSetButton.getShell(); String[] workingSetIds = new String[] { IWorkingSetIDs.JAVA, IWorkingSetIDs.RESOURCE }; IWorkingSet[] selectedWorkingSets = new IWorkingSet[ 0 ]; SimpleWorkingSetSelectionDialog dialog = new SimpleWorkingSetSelectionDialog( shell, workingSetIds, selectedWorkingSets, true ); dialog.setMessage( WorkbenchMessages.WorkingSetGroup_WorkingSetSelection_message ); if( dialog.open() == Window.OK ) { IWorkingSet[] result = dialog.getSelection(); if( result != null && result.length > 0 ) { selectedWorkingSets = result; } else { selectedWorkingSets = new IWorkingSet[ 0 ]; } Set< IProject > checked = new HashSet< IProject >(); if( selectedWorkingSets.length > 0 ) { for( int i = 0; i < selectedWorkingSets.length; i++ ) { IAdaptable[] adapters = selectedWorkingSets[ i ].getElements(); for( int k = 0; k < adapters.length; k++ ) { IResource res = (IResource) adapters[ k ].getAdapter( IResource.class ); checked.add( res.getProject() ); } } } setCheckedProjects( checked ); } } }