Removed
Link Here
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2005, 2011 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
6 |
* http://www.eclipse.org/legal/epl-v10.html |
7 |
* |
8 |
* Contributors: |
9 |
* IBM Corporation - initial API and implementation |
10 |
*******************************************************************************/ |
11 |
package org.eclipse.jdt.internal.ui.preferences; |
12 |
|
13 |
import java.util.ArrayList; |
14 |
import java.util.Collections; |
15 |
import java.util.Comparator; |
16 |
import java.util.HashMap; |
17 |
import java.util.Iterator; |
18 |
import java.util.List; |
19 |
import java.util.Map; |
20 |
|
21 |
import org.eclipse.swt.SWT; |
22 |
import org.eclipse.swt.events.SelectionAdapter; |
23 |
import org.eclipse.swt.events.SelectionEvent; |
24 |
import org.eclipse.swt.graphics.GC; |
25 |
import org.eclipse.swt.graphics.Image; |
26 |
import org.eclipse.swt.layout.GridData; |
27 |
import org.eclipse.swt.layout.GridLayout; |
28 |
import org.eclipse.swt.widgets.Button; |
29 |
import org.eclipse.swt.widgets.Composite; |
30 |
import org.eclipse.swt.widgets.Control; |
31 |
import org.eclipse.swt.widgets.Label; |
32 |
import org.eclipse.swt.widgets.Link; |
33 |
import org.eclipse.swt.widgets.Table; |
34 |
import org.eclipse.swt.widgets.TableColumn; |
35 |
|
36 |
import org.eclipse.core.commands.Command; |
37 |
import org.eclipse.core.commands.CommandManager; |
38 |
import org.eclipse.core.commands.IParameter; |
39 |
import org.eclipse.core.commands.Parameterization; |
40 |
import org.eclipse.core.commands.ParameterizedCommand; |
41 |
import org.eclipse.core.commands.common.NotDefinedException; |
42 |
import org.eclipse.core.commands.contexts.ContextManager; |
43 |
|
44 |
import org.eclipse.core.runtime.Assert; |
45 |
|
46 |
import org.eclipse.jface.bindings.BindingManager; |
47 |
import org.eclipse.jface.bindings.Scheme; |
48 |
import org.eclipse.jface.bindings.TriggerSequence; |
49 |
import org.eclipse.jface.layout.PixelConverter; |
50 |
import org.eclipse.jface.resource.ImageDescriptor; |
51 |
import org.eclipse.jface.resource.JFaceResources; |
52 |
import org.eclipse.jface.viewers.ArrayContentProvider; |
53 |
import org.eclipse.jface.viewers.CheckStateChangedEvent; |
54 |
import org.eclipse.jface.viewers.CheckboxTableViewer; |
55 |
import org.eclipse.jface.viewers.ICheckStateListener; |
56 |
import org.eclipse.jface.viewers.IStructuredSelection; |
57 |
import org.eclipse.jface.viewers.ITableLabelProvider; |
58 |
import org.eclipse.jface.viewers.LabelProvider; |
59 |
import org.eclipse.jface.viewers.ViewerComparator; |
60 |
|
61 |
import org.eclipse.ui.PlatformUI; |
62 |
import org.eclipse.ui.commands.ICommandService; |
63 |
import org.eclipse.ui.dialogs.PreferencesUtil; |
64 |
import org.eclipse.ui.keys.IBindingService; |
65 |
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; |
66 |
|
67 |
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; |
68 |
|
69 |
import org.eclipse.jdt.core.JavaCore; |
70 |
|
71 |
import org.eclipse.jdt.internal.corext.util.Messages; |
72 |
|
73 |
import org.eclipse.jdt.ui.PreferenceConstants; |
74 |
|
75 |
import org.eclipse.jdt.internal.ui.JavaPlugin; |
76 |
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo; |
77 |
import org.eclipse.jdt.internal.ui.text.java.CompletionProposalCategory; |
78 |
import org.eclipse.jdt.internal.ui.text.java.CompletionProposalComputerRegistry; |
79 |
import org.eclipse.jdt.internal.ui.util.SWTUtil; |
80 |
import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener; |
81 |
|
82 |
|
83 |
/** |
84 |
* |
85 |
* @since 3.2 |
86 |
*/ |
87 |
final class CodeAssistAdvancedConfigurationBlock extends OptionsConfigurationBlock { |
88 |
|
89 |
private static final Key PREF_EXCLUDED_CATEGORIES= getJDTUIKey(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES); |
90 |
private static final Key PREF_CATEGORY_ORDER= getJDTUIKey(PreferenceConstants.CODEASSIST_CATEGORY_ORDER); |
91 |
private static final Key PREF_CODEASSIST_TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC= getJDTCoreKey(JavaCore.TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC); |
92 |
|
93 |
private static Key[] getAllKeys() { |
94 |
return new Key[] { |
95 |
PREF_EXCLUDED_CATEGORIES, |
96 |
PREF_CATEGORY_ORDER, |
97 |
PREF_CODEASSIST_TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC |
98 |
}; |
99 |
} |
100 |
|
101 |
private final class DefaultTableLabelProvider extends LabelProvider implements ITableLabelProvider { |
102 |
|
103 |
/* |
104 |
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) |
105 |
*/ |
106 |
public Image getColumnImage(Object element, int columnIndex) { |
107 |
if (columnIndex == 0) |
108 |
return ((ModelElement) element).getImage(); |
109 |
return null; |
110 |
} |
111 |
|
112 |
/* |
113 |
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) |
114 |
*/ |
115 |
public String getColumnText(Object element, int columnIndex) { |
116 |
switch (columnIndex) { |
117 |
case 0: |
118 |
return ((ModelElement) element).getName(); |
119 |
case 1: |
120 |
return ((ModelElement) element).getKeybindingAsString(); |
121 |
default: |
122 |
Assert.isTrue(false); |
123 |
return null; |
124 |
} |
125 |
} |
126 |
|
127 |
/* |
128 |
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) |
129 |
*/ |
130 |
@Override |
131 |
public String getText(Object element) { |
132 |
return getColumnText(element, 0); // needed to make the sorter work |
133 |
} |
134 |
} |
135 |
|
136 |
private final class SeparateTableLabelProvider extends LabelProvider implements ITableLabelProvider { |
137 |
|
138 |
/* |
139 |
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) |
140 |
*/ |
141 |
public Image getColumnImage(Object element, int columnIndex) { |
142 |
if (columnIndex == 0) |
143 |
return ((ModelElement) element).getImage(); |
144 |
return null; |
145 |
} |
146 |
|
147 |
/* |
148 |
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) |
149 |
*/ |
150 |
public String getColumnText(Object element, int columnIndex) { |
151 |
switch (columnIndex) { |
152 |
case 0: |
153 |
return ((ModelElement) element).getName(); |
154 |
default: |
155 |
Assert.isTrue(false); |
156 |
return null; |
157 |
} |
158 |
} |
159 |
} |
160 |
|
161 |
private final Comparator<ModelElement> fCategoryComparator= new Comparator<ModelElement>() { |
162 |
private int getRank(ModelElement o) { |
163 |
return o.getRank(); |
164 |
} |
165 |
|
166 |
public int compare(ModelElement o1, ModelElement o2) { |
167 |
return getRank(o1) - getRank(o2); |
168 |
} |
169 |
}; |
170 |
|
171 |
private final class PreferenceModel { |
172 |
private static final int LIMIT= 65535; |
173 |
private static final String COLON= ":"; //$NON-NLS-1$ |
174 |
private static final String SEPARATOR= "\0"; //$NON-NLS-1$ |
175 |
|
176 |
private final List<ModelElement> fElements; |
177 |
/** |
178 |
* The read-only list of elements. |
179 |
*/ |
180 |
final List<ModelElement> elements; |
181 |
|
182 |
public PreferenceModel(CompletionProposalComputerRegistry registry) { |
183 |
List<CompletionProposalCategory> categories= registry.getProposalCategories(); |
184 |
fElements= new ArrayList<ModelElement>(); |
185 |
for (Iterator<CompletionProposalCategory> it= categories.iterator(); it.hasNext();) { |
186 |
CompletionProposalCategory category= it.next(); |
187 |
if (category.hasComputers()) { |
188 |
fElements.add(new ModelElement(category, this)); |
189 |
} |
190 |
} |
191 |
Collections.sort(fElements, fCategoryComparator); |
192 |
elements= Collections.unmodifiableList(fElements); |
193 |
} |
194 |
|
195 |
public void moveUp(ModelElement category) { |
196 |
int index= fElements.indexOf(category); |
197 |
if (index > 0) { |
198 |
ModelElement item= fElements.remove(index); |
199 |
fElements.add(index - 1, item); |
200 |
writeOrderPreference(null, false); |
201 |
} |
202 |
} |
203 |
|
204 |
public void moveDown(ModelElement category) { |
205 |
int index= fElements.indexOf(category); |
206 |
if (index < fElements.size() - 1) { |
207 |
ModelElement item= fElements.remove(index); |
208 |
fElements.add(index + 1, item); |
209 |
writeOrderPreference(null, false); |
210 |
} |
211 |
} |
212 |
|
213 |
private void writeInclusionPreference(ModelElement changed, boolean isInDefaultCategory) { |
214 |
StringBuffer buf= new StringBuffer(); |
215 |
for (Iterator<ModelElement> it= fElements.iterator(); it.hasNext();) { |
216 |
ModelElement item= it.next(); |
217 |
boolean included= changed == item ? isInDefaultCategory : item.isInDefaultCategory(); |
218 |
if (!included) |
219 |
buf.append(item.getId() + SEPARATOR); |
220 |
} |
221 |
|
222 |
String newValue= buf.toString(); |
223 |
String oldValue= setValue(PREF_EXCLUDED_CATEGORIES, newValue); |
224 |
validateSettings(PREF_EXCLUDED_CATEGORIES, oldValue, newValue); |
225 |
} |
226 |
|
227 |
private void writeOrderPreference(ModelElement changed, boolean isSeparate) { |
228 |
StringBuffer buf= new StringBuffer(); |
229 |
int i= 0; |
230 |
for (Iterator<ModelElement> it= fElements.iterator(); it.hasNext(); i++) { |
231 |
ModelElement item= it.next(); |
232 |
boolean separate= changed == item ? isSeparate : item.isSeparateCommand(); |
233 |
int rank= separate ? i : i + LIMIT; |
234 |
buf.append(item.getId() + COLON + rank + SEPARATOR); |
235 |
} |
236 |
|
237 |
String newValue= buf.toString(); |
238 |
String oldValue= setValue(PREF_CATEGORY_ORDER, newValue); |
239 |
validateSettings(PREF_CATEGORY_ORDER, oldValue, newValue); |
240 |
} |
241 |
|
242 |
|
243 |
private boolean readInclusionPreference(CompletionProposalCategory cat) { |
244 |
String[] ids= getTokens(getValue(PREF_EXCLUDED_CATEGORIES), SEPARATOR); |
245 |
for (int i= 0; i < ids.length; i++) { |
246 |
if (ids[i].equals(cat.getId())) |
247 |
return false; |
248 |
} |
249 |
return true; |
250 |
} |
251 |
|
252 |
private int readOrderPreference(CompletionProposalCategory cat) { |
253 |
String[] sortOrderIds= getTokens(getValue(PREF_CATEGORY_ORDER), SEPARATOR); |
254 |
for (int i= 0; i < sortOrderIds.length; i++) { |
255 |
String[] idAndRank= getTokens(sortOrderIds[i], COLON); |
256 |
if (idAndRank[0].equals(cat.getId())) |
257 |
return Integer.parseInt(idAndRank[1]); |
258 |
} |
259 |
return LIMIT - 1; |
260 |
} |
261 |
|
262 |
public void update() { |
263 |
Collections.sort(fElements, fCategoryComparator); |
264 |
} |
265 |
} |
266 |
|
267 |
private final class ModelElement { |
268 |
private final CompletionProposalCategory fCategory; |
269 |
private final Command fCommand; |
270 |
private final IParameter fParam; |
271 |
private final PreferenceModel fPreferenceModel; |
272 |
|
273 |
ModelElement(CompletionProposalCategory category, PreferenceModel model) { |
274 |
fCategory= category; |
275 |
ICommandService commandSvc= (ICommandService) PlatformUI.getWorkbench().getAdapter(ICommandService.class); |
276 |
fCommand= commandSvc.getCommand("org.eclipse.jdt.ui.specific_content_assist.command"); //$NON-NLS-1$ |
277 |
IParameter type; |
278 |
try { |
279 |
type= fCommand.getParameters()[0]; |
280 |
} catch (NotDefinedException x) { |
281 |
Assert.isTrue(false); |
282 |
type= null; |
283 |
} |
284 |
fParam= type; |
285 |
fPreferenceModel= model; |
286 |
} |
287 |
Image getImage() { |
288 |
return CodeAssistAdvancedConfigurationBlock.this.getImage(fCategory.getImageDescriptor()); |
289 |
} |
290 |
String getName() { |
291 |
return fCategory.getDisplayName(); |
292 |
} |
293 |
String getKeybindingAsString() { |
294 |
final Parameterization[] params= { new Parameterization(fParam, fCategory.getId()) }; |
295 |
final ParameterizedCommand pCmd= new ParameterizedCommand(fCommand, params); |
296 |
String key= getKeyboardShortcut(pCmd); |
297 |
return key; |
298 |
} |
299 |
boolean isInDefaultCategory() { |
300 |
return fPreferenceModel.readInclusionPreference(fCategory); |
301 |
} |
302 |
void setInDefaultCategory(boolean included) { |
303 |
if (included != isInDefaultCategory()) |
304 |
fPreferenceModel.writeInclusionPreference(this, included); |
305 |
} |
306 |
String getId() { |
307 |
return fCategory.getId(); |
308 |
} |
309 |
int getRank() { |
310 |
int rank= getInternalRank(); |
311 |
if (rank > PreferenceModel.LIMIT) |
312 |
return rank - PreferenceModel.LIMIT; |
313 |
return rank; |
314 |
} |
315 |
void moveUp() { |
316 |
fPreferenceModel.moveUp(this); |
317 |
} |
318 |
void moveDown() { |
319 |
fPreferenceModel.moveDown(this); |
320 |
} |
321 |
private int getInternalRank() { |
322 |
return fPreferenceModel.readOrderPreference(fCategory); |
323 |
} |
324 |
boolean isSeparateCommand() { |
325 |
return getInternalRank() < PreferenceModel.LIMIT; |
326 |
} |
327 |
|
328 |
void setSeparateCommand(boolean separate) { |
329 |
if (separate != isSeparateCommand()) |
330 |
fPreferenceModel.writeOrderPreference(this, separate); |
331 |
} |
332 |
|
333 |
void update() { |
334 |
fCategory.setIncluded(isInDefaultCategory()); |
335 |
int rank= getInternalRank(); |
336 |
fCategory.setSortOrder(rank); |
337 |
fCategory.setSeparateCommand(rank < PreferenceModel.LIMIT); |
338 |
} |
339 |
} |
340 |
|
341 |
/** element type: {@link ModelElement}. */ |
342 |
private final PreferenceModel fModel; |
343 |
private final Map<ImageDescriptor, Image> fImages= new HashMap<ImageDescriptor, Image>(); |
344 |
|
345 |
private CheckboxTableViewer fDefaultViewer; |
346 |
private CheckboxTableViewer fSeparateViewer; |
347 |
private Button fUpButton; |
348 |
private Button fDownButton; |
349 |
|
350 |
CodeAssistAdvancedConfigurationBlock(IStatusChangeListener statusListener, IWorkbenchPreferenceContainer container) { |
351 |
super(statusListener, null, getAllKeys(), container); |
352 |
fModel= new PreferenceModel(CompletionProposalComputerRegistry.getDefault()); |
353 |
} |
354 |
|
355 |
/* |
356 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#createContents(org.eclipse.swt.widgets.Composite) |
357 |
*/ |
358 |
@Override |
359 |
protected Control createContents(Composite parent) { |
360 |
|
361 |
ScrolledPageContent scrolled= new ScrolledPageContent(parent, SWT.H_SCROLL | SWT.V_SCROLL); |
362 |
|
363 |
scrolled.setExpandHorizontal(true); |
364 |
scrolled.setExpandVertical(true); |
365 |
|
366 |
Composite composite= new Composite(scrolled, SWT.NONE); |
367 |
int columns= 2; |
368 |
GridLayout layout= new GridLayout(columns, false); |
369 |
layout.marginWidth= 0; |
370 |
layout.marginHeight= 0; |
371 |
composite.setLayout(layout); |
372 |
|
373 |
|
374 |
createDefaultLabel(composite, columns); |
375 |
createDefaultViewer(composite, columns); |
376 |
createKeysLink(composite, columns); |
377 |
|
378 |
createFiller(composite, columns); |
379 |
|
380 |
createSeparateLabel(composite, columns); |
381 |
createSeparateSection(composite); |
382 |
|
383 |
createFiller(composite, columns); |
384 |
|
385 |
createParameterTimeoutControl(composite, columns); |
386 |
|
387 |
updateControls(); |
388 |
if (fModel.elements.size() > 0) { |
389 |
fDefaultViewer.getTable().select(0); |
390 |
fSeparateViewer.getTable().select(0); |
391 |
handleTableSelection(); |
392 |
} |
393 |
|
394 |
scrolled.setContent(composite); |
395 |
scrolled.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
396 |
return scrolled; |
397 |
} |
398 |
|
399 |
private void createDefaultLabel(Composite composite, int h_span) { |
400 |
final ICommandService commandSvc= (ICommandService) PlatformUI.getWorkbench().getAdapter(ICommandService.class); |
401 |
final Command command= commandSvc.getCommand(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS); |
402 |
ParameterizedCommand pCmd= new ParameterizedCommand(command, null); |
403 |
String key= getKeyboardShortcut(pCmd); |
404 |
if (key == null) |
405 |
key= PreferencesMessages.CodeAssistAdvancedConfigurationBlock_no_shortcut; |
406 |
|
407 |
PixelConverter pixelConverter= new PixelConverter(composite); |
408 |
int width= pixelConverter.convertWidthInCharsToPixels(40); |
409 |
|
410 |
Label label= new Label(composite, SWT.NONE | SWT.WRAP); |
411 |
label.setText(Messages.format(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_page_description, new Object[] { key })); |
412 |
GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false, h_span, 1); |
413 |
gd.widthHint= width; |
414 |
label.setLayoutData(gd); |
415 |
|
416 |
createFiller(composite, h_span); |
417 |
|
418 |
label= new Label(composite, SWT.NONE | SWT.WRAP); |
419 |
label.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_default_table_description); |
420 |
gd= new GridData(GridData.FILL, GridData.FILL, true, false, h_span, 1); |
421 |
gd.widthHint= width; |
422 |
label.setLayoutData(gd); |
423 |
} |
424 |
|
425 |
private void createDefaultViewer(Composite composite, int h_span) { |
426 |
fDefaultViewer= CheckboxTableViewer.newCheckList(composite, SWT.SINGLE | SWT.BORDER); |
427 |
Table table= fDefaultViewer.getTable(); |
428 |
table.setHeaderVisible(true); |
429 |
table.setLinesVisible(false); |
430 |
table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false, h_span, 1)); |
431 |
|
432 |
TableColumn nameColumn= new TableColumn(table, SWT.NONE); |
433 |
nameColumn.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_default_table_category_column_title); |
434 |
nameColumn.setResizable(false); |
435 |
TableColumn keyColumn= new TableColumn(table, SWT.NONE); |
436 |
keyColumn.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_default_table_keybinding_column_title); |
437 |
keyColumn.setResizable(false); |
438 |
|
439 |
fDefaultViewer.addCheckStateListener(new ICheckStateListener() { |
440 |
public void checkStateChanged(CheckStateChangedEvent event) { |
441 |
boolean checked= event.getChecked(); |
442 |
ModelElement element= (ModelElement) event.getElement(); |
443 |
element.setInDefaultCategory(checked); |
444 |
} |
445 |
}); |
446 |
|
447 |
fDefaultViewer.setContentProvider(new ArrayContentProvider()); |
448 |
|
449 |
DefaultTableLabelProvider labelProvider= new DefaultTableLabelProvider(); |
450 |
fDefaultViewer.setLabelProvider(labelProvider); |
451 |
fDefaultViewer.setInput(fModel.elements); |
452 |
fDefaultViewer.setComparator(new ViewerComparator()); // sort alphabetically |
453 |
|
454 |
final int ICON_AND_CHECKBOX_WITH= 50; |
455 |
final int HEADER_MARGIN= 20; |
456 |
int minNameWidth= computeWidth(table, nameColumn.getText()) + HEADER_MARGIN; |
457 |
int minKeyWidth= computeWidth(table, keyColumn.getText()) + HEADER_MARGIN; |
458 |
for (int i= 0; i < fModel.elements.size(); i++) { |
459 |
minNameWidth= Math.max(minNameWidth, computeWidth(table, labelProvider.getColumnText(fModel.elements.get(i), 0)) + ICON_AND_CHECKBOX_WITH); |
460 |
minKeyWidth= Math.max(minKeyWidth, computeWidth(table, labelProvider.getColumnText(fModel.elements.get(i), 1))); |
461 |
} |
462 |
|
463 |
nameColumn.setWidth(minNameWidth); |
464 |
keyColumn.setWidth(minKeyWidth); |
465 |
} |
466 |
|
467 |
private void createKeysLink(Composite composite, int h_span) { |
468 |
Link link= new Link(composite, SWT.NONE | SWT.WRAP); |
469 |
link.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_key_binding_hint); |
470 |
link.addSelectionListener(new SelectionAdapter() { |
471 |
@Override |
472 |
public void widgetSelected(SelectionEvent e) { |
473 |
PreferencesUtil.createPreferenceDialogOn(getShell(), e.text, null, null); |
474 |
} |
475 |
}); |
476 |
|
477 |
PixelConverter pixelConverter= new PixelConverter(composite); |
478 |
int width= pixelConverter.convertWidthInCharsToPixels(40); |
479 |
|
480 |
// limit the size of the Link as it would take all it can get |
481 |
GridData gd= new GridData(GridData.FILL, GridData.FILL, false, false, h_span, 1); |
482 |
gd.widthHint= width; |
483 |
link.setLayoutData(gd); |
484 |
} |
485 |
|
486 |
private void createFiller(Composite composite, int h_span) { |
487 |
Label filler= new Label(composite, SWT.NONE); |
488 |
filler.setVisible(false); |
489 |
filler.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, h_span, 1)); |
490 |
} |
491 |
|
492 |
private void createSeparateLabel(Composite composite, int h_span) { |
493 |
PixelConverter pixelConverter= new PixelConverter(composite); |
494 |
int width= pixelConverter.convertWidthInCharsToPixels(40); |
495 |
|
496 |
Label label= new Label(composite, SWT.NONE | SWT.WRAP); |
497 |
label.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_separate_table_description); |
498 |
GridData gd= new GridData(GridData.FILL, GridData.FILL, false, false, h_span, 1); |
499 |
gd.widthHint= width; |
500 |
label.setLayoutData(gd); |
501 |
} |
502 |
|
503 |
private void createSeparateSection(Composite composite) { |
504 |
createSeparateViewer(composite); |
505 |
createButtonList(composite); |
506 |
} |
507 |
|
508 |
private void createSeparateViewer(Composite composite) { |
509 |
fSeparateViewer= CheckboxTableViewer.newCheckList(composite, SWT.SINGLE | SWT.BORDER); |
510 |
Table table= fSeparateViewer.getTable(); |
511 |
table.setHeaderVisible(false); |
512 |
table.setLinesVisible(false); |
513 |
table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false, 1, 1)); |
514 |
|
515 |
TableColumn nameColumn= new TableColumn(table, SWT.NONE); |
516 |
nameColumn.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title); |
517 |
nameColumn.setResizable(false); |
518 |
|
519 |
fSeparateViewer.setContentProvider(new ArrayContentProvider()); |
520 |
|
521 |
ITableLabelProvider labelProvider= new SeparateTableLabelProvider(); |
522 |
fSeparateViewer.setLabelProvider(labelProvider); |
523 |
fSeparateViewer.setInput(fModel.elements); |
524 |
|
525 |
final int ICON_AND_CHECKBOX_WITH= 50; |
526 |
final int HEADER_MARGIN= 20; |
527 |
int minNameWidth= computeWidth(table, nameColumn.getText()) + HEADER_MARGIN; |
528 |
for (int i= 0; i < fModel.elements.size(); i++) { |
529 |
minNameWidth= Math.max(minNameWidth, computeWidth(table, labelProvider.getColumnText(fModel.elements.get(i), 0)) + ICON_AND_CHECKBOX_WITH); |
530 |
} |
531 |
|
532 |
nameColumn.setWidth(minNameWidth); |
533 |
|
534 |
fSeparateViewer.addCheckStateListener(new ICheckStateListener() { |
535 |
public void checkStateChanged(CheckStateChangedEvent event) { |
536 |
boolean checked= event.getChecked(); |
537 |
ModelElement element= (ModelElement) event.getElement(); |
538 |
element.setSeparateCommand(checked); |
539 |
} |
540 |
}); |
541 |
|
542 |
table.addSelectionListener(new SelectionAdapter() { |
543 |
@Override |
544 |
public void widgetSelected(SelectionEvent e) { |
545 |
handleTableSelection(); |
546 |
} |
547 |
}); |
548 |
|
549 |
} |
550 |
|
551 |
private void createButtonList(Composite parent) { |
552 |
Composite composite= new Composite(parent, SWT.NONE); |
553 |
composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); |
554 |
|
555 |
GridLayout layout= new GridLayout(); |
556 |
layout.marginWidth= 0; |
557 |
layout.marginHeight= 0; |
558 |
composite.setLayout(layout); |
559 |
|
560 |
fUpButton= new Button(composite, SWT.PUSH | SWT.CENTER); |
561 |
fUpButton.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_Up); |
562 |
fUpButton.addSelectionListener(new SelectionAdapter() { |
563 |
@Override |
564 |
public void widgetSelected(SelectionEvent e) { |
565 |
int index= getSelectionIndex(); |
566 |
if (index != -1) { |
567 |
fModel.elements.get(index).moveUp(); |
568 |
fSeparateViewer.refresh(); |
569 |
handleTableSelection(); |
570 |
} |
571 |
} |
572 |
}); |
573 |
fUpButton.setLayoutData(new GridData()); |
574 |
SWTUtil.setButtonDimensionHint(fUpButton); |
575 |
|
576 |
fDownButton= new Button(composite, SWT.PUSH | SWT.CENTER); |
577 |
fDownButton.setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_Down); |
578 |
fDownButton.addSelectionListener(new SelectionAdapter() { |
579 |
@Override |
580 |
public void widgetSelected(SelectionEvent e) { |
581 |
int index= getSelectionIndex(); |
582 |
if (index != -1) { |
583 |
fModel.elements.get(index).moveDown(); |
584 |
fSeparateViewer.refresh(); |
585 |
handleTableSelection(); |
586 |
} |
587 |
} |
588 |
}); |
589 |
fDownButton.setLayoutData(new GridData()); |
590 |
SWTUtil.setButtonDimensionHint(fDownButton); |
591 |
} |
592 |
|
593 |
private void createParameterTimeoutControl(Composite composite, int h_span) { |
594 |
Composite timeoutComposite= new Composite(composite, SWT.NONE); |
595 |
GridLayout layout= new GridLayout(4, false); |
596 |
layout.marginWidth= 0; |
597 |
layout.marginHeight= 0; |
598 |
timeoutComposite.setLayout(layout); |
599 |
GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false, h_span, 1); |
600 |
timeoutComposite.setLayoutData(gd); |
601 |
|
602 |
PixelConverter pixelConverter= new PixelConverter(composite); |
603 |
String str= PreferencesMessages.CodeAssistAdvancedConfigurationBlock_parameterNameFromAttachedJavadoc_timeout; |
604 |
addTextField(timeoutComposite, str, PREF_CODEASSIST_TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC, 0, pixelConverter.convertWidthInCharsToPixels(7)); |
605 |
|
606 |
} |
607 |
|
608 |
private void handleTableSelection() { |
609 |
ModelElement item= getSelectedItem(); |
610 |
if (item != null) { |
611 |
int index= getSelectionIndex(); |
612 |
fUpButton.setEnabled(index > 0); |
613 |
fDownButton.setEnabled(index < fModel.elements.size() - 1); |
614 |
} else { |
615 |
fUpButton.setEnabled(false); |
616 |
fDownButton.setEnabled(false); |
617 |
} |
618 |
} |
619 |
|
620 |
private ModelElement getSelectedItem() { |
621 |
return (ModelElement) ((IStructuredSelection) fSeparateViewer.getSelection()).getFirstElement(); |
622 |
} |
623 |
|
624 |
private int getSelectionIndex() { |
625 |
return fSeparateViewer.getTable().getSelectionIndex(); |
626 |
} |
627 |
|
628 |
/* |
629 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#updateControls() |
630 |
*/ |
631 |
@Override |
632 |
protected void updateControls() { |
633 |
super.updateControls(); |
634 |
|
635 |
fModel.update(); |
636 |
updateCheckedState(); |
637 |
fDefaultViewer.refresh(); |
638 |
fSeparateViewer.refresh(); |
639 |
handleTableSelection(); |
640 |
} |
641 |
|
642 |
private void updateCheckedState() { |
643 |
final int size= fModel.elements.size(); |
644 |
List<ModelElement> defaultChecked= new ArrayList<ModelElement>(size); |
645 |
List<ModelElement> separateChecked= new ArrayList<ModelElement>(size); |
646 |
|
647 |
for (Iterator<ModelElement> it= fModel.elements.iterator(); it.hasNext();) { |
648 |
ModelElement element= it.next(); |
649 |
if (element.isInDefaultCategory()) |
650 |
defaultChecked.add(element); |
651 |
if (element.isSeparateCommand()) |
652 |
separateChecked.add(element); |
653 |
} |
654 |
|
655 |
fDefaultViewer.setCheckedElements(defaultChecked.toArray(new Object[defaultChecked.size()])); |
656 |
fSeparateViewer.setCheckedElements(separateChecked.toArray(new Object[separateChecked.size()])); |
657 |
} |
658 |
|
659 |
/* |
660 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#processChanges(org.eclipse.ui.preferences.IWorkbenchPreferenceContainer) |
661 |
*/ |
662 |
@Override |
663 |
protected boolean processChanges(IWorkbenchPreferenceContainer container) { |
664 |
for (Iterator<ModelElement> it= fModel.elements.iterator(); it.hasNext();) { |
665 |
ModelElement item= it.next(); |
666 |
item.update(); |
667 |
} |
668 |
|
669 |
return super.processChanges(container); |
670 |
} |
671 |
|
672 |
/* |
673 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#validateSettings(org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock.Key, java.lang.String, java.lang.String) |
674 |
*/ |
675 |
@Override |
676 |
protected void validateSettings(Key changedKey, String oldValue, String newValue) { |
677 |
if (changedKey == PREF_CODEASSIST_TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC) { |
678 |
final StatusInfo status= new StatusInfo(); |
679 |
if (newValue.length() == 0) |
680 |
status.setError(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_parameterNameFromAttachedJavadoc_timeout_emptyInput); |
681 |
else { |
682 |
try { |
683 |
int number= Integer.parseInt(newValue); |
684 |
int min= 0; |
685 |
int max= 5000; |
686 |
if (number < min || number > max) { |
687 |
String msgFormat= PreferencesMessages.CodeAssistAdvancedConfigurationBlock_parameterNameFromAttachedJavadoc_timeout_invalidRange; |
688 |
String msg= Messages.format(msgFormat, new Object[] {new Integer(min), new Integer(max)}); |
689 |
status.setError(msg); |
690 |
} |
691 |
} catch (NumberFormatException ex) { |
692 |
String msgFormat= PreferencesMessages.CodeAssistAdvancedConfigurationBlock_parameterNameFromAttachedJavadoc_timeout_invalidInput; |
693 |
String msg= Messages.format(msgFormat, newValue); |
694 |
status.setError(msg); |
695 |
} |
696 |
} |
697 |
fContext.statusChanged(status); |
698 |
} |
699 |
} |
700 |
|
701 |
/* |
702 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#getFullBuildDialogStrings(boolean) |
703 |
*/ |
704 |
@Override |
705 |
protected String[] getFullBuildDialogStrings(boolean workspaceSettings) { |
706 |
// no builds triggered by our settings |
707 |
return null; |
708 |
} |
709 |
|
710 |
/* |
711 |
* @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#dispose() |
712 |
*/ |
713 |
@Override |
714 |
public void dispose() { |
715 |
for (Iterator<Image> it= fImages.values().iterator(); it.hasNext();) { |
716 |
Image image= it.next(); |
717 |
image.dispose(); |
718 |
} |
719 |
|
720 |
super.dispose(); |
721 |
} |
722 |
|
723 |
private int computeWidth(Control control, String name) { |
724 |
if (name == null) |
725 |
return 0; |
726 |
GC gc= new GC(control); |
727 |
try { |
728 |
gc.setFont(JFaceResources.getDialogFont()); |
729 |
return gc.stringExtent(name).x + 10; |
730 |
} finally { |
731 |
gc.dispose(); |
732 |
} |
733 |
} |
734 |
|
735 |
private static BindingManager fgLocalBindingManager; |
736 |
static { |
737 |
fgLocalBindingManager= new BindingManager(new ContextManager(), new CommandManager()); |
738 |
final IBindingService bindingService= (IBindingService)PlatformUI.getWorkbench().getService(IBindingService.class); |
739 |
final Scheme[] definedSchemes= bindingService.getDefinedSchemes(); |
740 |
if (definedSchemes != null) { |
741 |
try { |
742 |
for (int i = 0; i < definedSchemes.length; i++) { |
743 |
final Scheme scheme= definedSchemes[i]; |
744 |
final Scheme copy= fgLocalBindingManager.getScheme(scheme.getId()); |
745 |
copy.define(scheme.getName(), scheme.getDescription(), scheme.getParentId()); |
746 |
} |
747 |
} catch (final NotDefinedException e) { |
748 |
JavaPlugin.log(e); |
749 |
} |
750 |
} |
751 |
fgLocalBindingManager.setLocale(bindingService.getLocale()); |
752 |
fgLocalBindingManager.setPlatform(bindingService.getPlatform()); |
753 |
} |
754 |
|
755 |
private static String getKeyboardShortcut(ParameterizedCommand command) { |
756 |
IBindingService bindingService= (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class); |
757 |
fgLocalBindingManager.setBindings(bindingService.getBindings()); |
758 |
try { |
759 |
Scheme activeScheme= bindingService.getActiveScheme(); |
760 |
if (activeScheme != null) |
761 |
fgLocalBindingManager.setActiveScheme(activeScheme); |
762 |
} catch (NotDefinedException e) { |
763 |
JavaPlugin.log(e); |
764 |
} |
765 |
|
766 |
TriggerSequence[] bindings= fgLocalBindingManager.getActiveBindingsDisregardingContextFor(command); |
767 |
if (bindings.length > 0) |
768 |
return bindings[0].format(); |
769 |
return null; |
770 |
} |
771 |
|
772 |
private Image getImage(ImageDescriptor imgDesc) { |
773 |
if (imgDesc == null) |
774 |
return null; |
775 |
|
776 |
Image img= fImages.get(imgDesc); |
777 |
if (img == null) { |
778 |
img= imgDesc.createImage(false); |
779 |
fImages.put(imgDesc, img); |
780 |
} |
781 |
return img; |
782 |
} |
783 |
|
784 |
} |