001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.wizards.buildpaths;
011:
012: import java.util.ArrayList;
013: import java.util.HashSet;
014: import java.util.Iterator;
015: import java.util.List;
016: import java.util.Set;
017:
018: import org.eclipse.core.runtime.IStatus;
019:
020: import org.eclipse.core.resources.IContainer;
021:
022: import org.eclipse.swt.SWT;
023: import org.eclipse.swt.custom.BusyIndicator;
024: import org.eclipse.swt.events.SelectionAdapter;
025: import org.eclipse.swt.events.SelectionEvent;
026: import org.eclipse.swt.layout.GridData;
027: import org.eclipse.swt.widgets.Button;
028: import org.eclipse.swt.widgets.Composite;
029: import org.eclipse.swt.widgets.Control;
030: import org.eclipse.swt.widgets.Shell;
031: import org.eclipse.swt.widgets.Tree;
032:
033: import org.eclipse.jface.viewers.CheckStateChangedEvent;
034: import org.eclipse.jface.viewers.CheckboxTreeViewer;
035: import org.eclipse.jface.viewers.ICheckStateListener;
036: import org.eclipse.jface.viewers.ILabelProvider;
037: import org.eclipse.jface.viewers.ISelectionChangedListener;
038: import org.eclipse.jface.viewers.IStructuredSelection;
039: import org.eclipse.jface.viewers.ITreeContentProvider;
040: import org.eclipse.jface.viewers.SelectionChangedEvent;
041: import org.eclipse.jface.viewers.StructuredSelection;
042: import org.eclipse.jface.viewers.ViewerFilter;
043: import org.eclipse.jface.window.Window;
044:
045: import org.eclipse.ui.dialogs.NewFolderDialog;
046: import org.eclipse.ui.dialogs.SelectionStatusDialog;
047:
048: import org.eclipse.ui.views.navigator.ResourceComparator;
049:
050: import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
051: import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
052:
053: /**
054: */
055: public class MultipleFolderSelectionDialog extends
056: SelectionStatusDialog implements ISelectionChangedListener {
057:
058: private CheckboxTreeViewer fViewer;
059:
060: private ILabelProvider fLabelProvider;
061: private ITreeContentProvider fContentProvider;
062: private List fFilters;
063:
064: private Object fInput;
065: private Button fNewFolderButton;
066: private IContainer fSelectedContainer;
067: private Set fExisting;
068: private Object fFocusElement;
069:
070: public MultipleFolderSelectionDialog(Shell parent,
071: ILabelProvider labelProvider,
072: ITreeContentProvider contentProvider) {
073: super (parent);
074: fLabelProvider = labelProvider;
075: fContentProvider = contentProvider;
076:
077: setSelectionResult(null);
078: setStatusLineAboveButtons(true);
079:
080: int shellStyle = getShellStyle();
081: setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
082:
083: fExisting = null;
084: fFocusElement = null;
085: fFilters = null;
086: }
087:
088: public void setExisting(Object[] existing) {
089: fExisting = new HashSet();
090: for (int i = 0; i < existing.length; i++) {
091: fExisting.add(existing[i]);
092: }
093: }
094:
095: /**
096: * Sets the tree input.
097: * @param input the tree input.
098: */
099: public void setInput(Object input) {
100: fInput = input;
101: }
102:
103: /**
104: * Adds a filter to the tree viewer.
105: * @param filter a filter.
106: */
107: public void addFilter(ViewerFilter filter) {
108: if (fFilters == null)
109: fFilters = new ArrayList(4);
110:
111: fFilters.add(filter);
112: }
113:
114: /**
115: * Handles cancel button pressed event.
116: */
117: protected void cancelPressed() {
118: setSelectionResult(null);
119: super .cancelPressed();
120: }
121:
122: /*
123: * @see SelectionStatusDialog#computeResult()
124: */
125: protected void computeResult() {
126: Object[] checked = fViewer.getCheckedElements();
127: if (fExisting == null) {
128: if (checked.length == 0) {
129: checked = null;
130: }
131: } else {
132: ArrayList res = new ArrayList();
133: for (int i = 0; i < checked.length; i++) {
134: Object elem = checked[i];
135: if (!fExisting.contains(elem)) {
136: res.add(elem);
137: }
138: }
139: if (!res.isEmpty()) {
140: checked = res.toArray();
141: } else {
142: checked = null;
143: }
144: }
145: setSelectionResult(checked);
146: }
147:
148: private void access$super Create() {
149: super .create();
150: }
151:
152: /*
153: * @see Window#create()
154: */
155: public void create() {
156:
157: BusyIndicator.showWhile(null, new Runnable() {
158: public void run() {
159: access$super Create();
160:
161: fViewer
162: .setCheckedElements(getInitialElementSelections()
163: .toArray());
164:
165: fViewer.expandToLevel(2);
166: if (fExisting != null) {
167: for (Iterator iter = fExisting.iterator(); iter
168: .hasNext();) {
169: fViewer.reveal(iter.next());
170: }
171: }
172:
173: updateOKStatus();
174: }
175: });
176:
177: }
178:
179: /**
180: * Creates the tree viewer.
181: *
182: * @param parent the parent composite
183: * @return the tree viewer
184: */
185: protected CheckboxTreeViewer createTreeViewer(Composite parent) {
186: fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);
187:
188: fViewer.setContentProvider(fContentProvider);
189: fViewer.setLabelProvider(fLabelProvider);
190: fViewer.addCheckStateListener(new ICheckStateListener() {
191: public void checkStateChanged(CheckStateChangedEvent event) {
192: updateOKStatus();
193: }
194: });
195:
196: fViewer.setComparator(new ResourceComparator(
197: ResourceComparator.NAME));
198: if (fFilters != null) {
199: for (int i = 0; i != fFilters.size(); i++)
200: fViewer.addFilter((ViewerFilter) fFilters.get(i));
201: }
202:
203: fViewer.setInput(fInput);
204:
205: return fViewer;
206: }
207:
208: /**
209: *
210: */
211: protected void updateOKStatus() {
212: computeResult();
213: if (getResult() != null) {
214: updateStatus(new StatusInfo());
215: } else {
216: updateStatus(new StatusInfo(IStatus.ERROR, "")); //$NON-NLS-1$
217: }
218: }
219:
220: /* (non-Javadoc)
221: * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
222: */
223: protected Control createDialogArea(Composite parent) {
224: Composite composite = (Composite) super
225: .createDialogArea(parent);
226:
227: createMessageArea(composite);
228: CheckboxTreeViewer treeViewer = createTreeViewer(composite);
229:
230: GridData data = new GridData(GridData.FILL_BOTH);
231: data.widthHint = convertWidthInCharsToPixels(60);
232: data.heightHint = convertHeightInCharsToPixels(18);
233:
234: Tree treeWidget = treeViewer.getTree();
235: treeWidget.setLayoutData(data);
236: treeWidget.setFont(composite.getFont());
237:
238: Button button = new Button(composite, SWT.PUSH);
239: button
240: .setText(NewWizardMessages.MultipleFolderSelectionDialog_button);
241: button.addSelectionListener(new SelectionAdapter() {
242: public void widgetSelected(SelectionEvent event) {
243: newFolderButtonPressed();
244: }
245: });
246: button.setFont(composite.getFont());
247:
248: fNewFolderButton = button;
249:
250: treeViewer.addSelectionChangedListener(this );
251: if (fExisting != null) {
252: Object[] existing = fExisting.toArray();
253: treeViewer.setGrayedElements(existing);
254: setInitialSelections(existing);
255: }
256: if (fFocusElement != null) {
257: treeViewer.setSelection(new StructuredSelection(
258: fFocusElement), true);
259: }
260: treeViewer.addCheckStateListener(new ICheckStateListener() {
261: public void checkStateChanged(CheckStateChangedEvent event) {
262: forceExistingChecked(event);
263: }
264: });
265:
266: applyDialogFont(composite);
267: return composite;
268: }
269:
270: protected void forceExistingChecked(CheckStateChangedEvent event) {
271: if (fExisting != null) {
272: Object elem = event.getElement();
273: if (fExisting.contains(elem)) {
274: fViewer.setChecked(elem, true);
275: }
276: }
277: }
278:
279: private void updateNewFolderButtonState() {
280: IStructuredSelection selection = (IStructuredSelection) fViewer
281: .getSelection();
282: fSelectedContainer = null;
283: if (selection.size() == 1) {
284: Object first = selection.getFirstElement();
285: if (first instanceof IContainer) {
286: fSelectedContainer = (IContainer) first;
287: }
288: }
289: fNewFolderButton.setEnabled(fSelectedContainer != null);
290: }
291:
292: protected void newFolderButtonPressed() {
293: Object createdFolder = createFolder(fSelectedContainer);
294: if (createdFolder != null) {
295: CheckboxTreeViewer treeViewer = fViewer;
296: treeViewer.refresh(fSelectedContainer);
297: treeViewer.reveal(createdFolder);
298: treeViewer.setChecked(createdFolder, true);
299: treeViewer.setSelection(new StructuredSelection(
300: createdFolder));
301: updateOKStatus();
302: }
303: }
304:
305: protected Object createFolder(IContainer container) {
306: NewFolderDialog dialog = new NewFolderDialog(getShell(),
307: container);
308: if (dialog.open() == Window.OK) {
309: return dialog.getResult()[0];
310: }
311: return null;
312: }
313:
314: /* (non-Javadoc)
315: * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
316: */
317: public void selectionChanged(SelectionChangedEvent event) {
318: updateNewFolderButtonState();
319: }
320:
321: public void setInitialFocus(Object focusElement) {
322: fFocusElement = focusElement;
323: }
324:
325: }
|