### Eclipse Workspace Patch 1.0 #P org.eclipse.team.cvs.ui Index: src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectSelectionPage.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectSelectionPage.java,v retrieving revision 1.19 diff -u -r1.19 RefreshRemoteProjectSelectionPage.java --- src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectSelectionPage.java 15 Sep 2006 14:45:57 -0000 1.19 +++ src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectSelectionPage.java 22 May 2007 13:57:51 -0000 @@ -10,17 +10,22 @@ *******************************************************************************/ package org.eclipse.team.internal.ccvs.ui.repo; -import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.dialogs.*; import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.*; +import org.eclipse.swt.graphics.FontMetrics; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.*; import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; import org.eclipse.team.internal.ccvs.ui.*; @@ -28,6 +33,8 @@ import org.eclipse.team.internal.ccvs.ui.wizards.CVSWizardPage; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.FilteredTree; +import org.eclipse.ui.dialogs.PatternFilter; import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.model.WorkbenchLabelProvider; @@ -42,6 +49,9 @@ private WorkingSetSelectionArea workingSetArea; private IWorkingSet workingSet; private IDialogSettings settings; + private FilteredTree ft; + private final Set remotes = new HashSet(); + private FontMetrics fontMetrics; /** * Custom input provider which returns the list of root folders @@ -83,12 +93,17 @@ super(pageName, title, titleImage, description); this.settings = settings; this.rootFolders = rootFolders; + } /** * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { + GC gc = new GC(parent); + gc.setFont(parent.getFont()); + fontMetrics = gc.getFontMetrics(); + gc.dispose(); final Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, false)); @@ -98,19 +113,107 @@ // set F1 help PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.REFRESH_REMOTE_PROJECT_SELECTION_PAGE); - listArea = new ListSelectionArea( - new InputElement(), - new RemoteContentProvider(), - new WorkbenchLabelProvider(), - CVSUIMessages.RefreshRemoteProjectSelectionPage_selectRemoteProjects); - listArea.createArea(composite); + Label label = new Label(composite, SWT.LEFT | SWT.WRAP); + label.setText(CVSUIMessages.RefreshRemoteProjectSelectionPage_selectRemoteProjects); + label.setFont(parent.getFont()); + GridData data = new GridData(); + data.horizontalAlignment = GridData.FILL; + data.grabExcessHorizontalSpace = true; + data.widthHint= 0; + label.setLayoutData(data); + + ft = new FilteredTree(composite, SWT.CHECK | SWT.BORDER, new PatternFilter()); + GridData fdata = new GridData(SWT.FILL, SWT.FILL, true, true); + fdata.heightHint = 0; // It will expand to the size of the wizard page! + fdata.widthHint = 0; + ft.getViewer().getTree().setLayoutData(fdata); + + + final InputElement ie = new InputElement(); + ft.getViewer().setLabelProvider(new WorkbenchLabelProvider()); + ft.getViewer().setContentProvider(new RemoteContentProvider(){ - listArea.addPropertyChangeListener(new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - updateEnablement(); + public Object[] getChildren(Object element) { + if(element == ie){ + return super.getChildren(element); + } + return new Object[]{}; } - }); - listArea.getViewer().setComparator(new RepositoryComparator()); + + public boolean hasChildren(Object element) { + if(element == ie){ + return super.hasChildren(element); + } + return false; + } + + }); + ft.getViewer().setInput(ie); + ft.getViewer().setComparator(new RepositoryComparator()); + ft.getViewer().getTree().addSelectionListener(new SelectionListener(){ + + public void widgetDefaultSelected(SelectionEvent e) {} + + public void widgetSelected(SelectionEvent e) { + if(e.detail == SWT.CHECK){ + TreeItem data = (TreeItem) e.item; + if(data.getChecked()){ + remotes.add(data.getData()); + } else { + remotes.remove(data.getData()); + } + updateEnablement(); + } + } + + }); + + ft.getFilterControl().addModifyListener(new ModifyListener(){ + + public void modifyText(ModifyEvent e) { + TreeItem[] items = ft.getViewer().getTree().getItems(); + for(int i = 0; i < items.length; i++){ + if(remotes.contains(items[i].getData())){ + items[i].setChecked(true); + } else { + items[i].setChecked(false); + } + } + } + + }); + + + Composite buttonComposite = new Composite(composite, SWT.RIGHT); + buttonComposite.setLayout(new GridLayout(2, false)); + buttonComposite.setData(new GridData(SWT.END, SWT.BEGINNING, true, false)); + + Button selectButton = createButton(buttonComposite, CVSUIMessages.ListSelectionArea_selectAll, GridData.HORIZONTAL_ALIGN_FILL); + + SelectionListener listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + TreeItem[] items = ft.getViewer().getTree().getItems(); + for(int i = 0; i < items.length; i++){ + items[i].setChecked(true); + remotes.add(items[i].getData()); + } + } + }; + selectButton.addSelectionListener(listener); + + + Button deselectButton = createButton(buttonComposite, CVSUIMessages.ListSelectionArea_deselectAll, GridData.HORIZONTAL_ALIGN_FILL); + + listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + TreeItem[] items = ft.getViewer().getTree().getItems(); + for(int i = 0; i < items.length; i++){ + items[i].setChecked(false); + remotes.remove(items[i].getData()); + } + } + }; + deselectButton.addSelectionListener(listener); workingSetArea = new WorkingSetSelectionArea(getShell(), CVSUIMessages.RefreshRemoteProjectSelectionPage_noWorkingSet, CVSUIMessages.RefreshRemoteProjectSelectionPage_workingSet, settings); // setWorkingSet(workingSet); @@ -123,7 +226,21 @@ workingSetArea.createArea(composite); Dialog.applyDialogFont(parent); } + + protected Button createButton(Composite parent, String label, int style) { + Button button = new Button(parent, SWT.PUSH); + button.setText(label); + // we need to explicitly set the font to the parent's font for dialogs + button.setFont(parent.getFont()); + GridData data = new GridData(style); + data.heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_HEIGHT); + int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + button.setLayoutData(data); + return button; + } + /** * Sets the working set that should be selected in the most recently * used working set list. @@ -155,8 +272,7 @@ } private void updateEnablement() { - boolean atLeastOne = listArea.getViewer().getCheckedElements().length > 0; - setPageComplete(atLeastOne); + setPageComplete(remotes.size() > 0); } /** @@ -164,7 +280,6 @@ * @return ICVSRemoteResource[] */ public ICVSRemoteResource[] getSelectedRemoteProject() { - Object[] checked = listArea.getViewer().getCheckedElements(); - return (ICVSRemoteResource[]) Arrays.asList(checked).toArray(new ICVSRemoteResource[checked.length]); + return (ICVSRemoteResource[]) remotes.toArray(new ICVSRemoteResource[]{}); } }