fix #5687: matchmode needs to be BEGINNING for identifier search
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / dialog / selection / SearchDialog.java
1 // $Id$
2 /**
3 * Copyright (C) 2017 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.ui.dialog.selection;
11
12
13
14 import java.text.Collator;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.Comparator;
18 import java.util.List;
19
20 import org.eclipse.core.runtime.Assert;
21 import org.eclipse.core.runtime.CoreException;
22 import org.eclipse.core.runtime.IProgressMonitor;
23 import org.eclipse.core.runtime.IStatus;
24 import org.eclipse.core.runtime.ListenerList;
25 import org.eclipse.core.runtime.Status;
26 import org.eclipse.core.runtime.jobs.Job;
27 import org.eclipse.jface.action.LegacyActionTools;
28 import org.eclipse.jface.dialogs.Dialog;
29 import org.eclipse.jface.dialogs.IDialogConstants;
30 import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
31 import org.eclipse.jface.viewers.DoubleClickEvent;
32 import org.eclipse.jface.viewers.IColorProvider;
33 import org.eclipse.jface.viewers.IDoubleClickListener;
34 import org.eclipse.jface.viewers.IFontProvider;
35 import org.eclipse.jface.viewers.ILabelProvider;
36 import org.eclipse.jface.viewers.ILabelProviderListener;
37 import org.eclipse.jface.viewers.ISelectionChangedListener;
38 import org.eclipse.jface.viewers.IStructuredContentProvider;
39 import org.eclipse.jface.viewers.LabelProvider;
40 import org.eclipse.jface.viewers.LabelProviderChangedEvent;
41 import org.eclipse.jface.viewers.SelectionChangedEvent;
42 import org.eclipse.jface.viewers.StructuredSelection;
43 import org.eclipse.jface.viewers.StyledCellLabelProvider;
44 import org.eclipse.jface.viewers.StyledString;
45 import org.eclipse.jface.viewers.TableViewer;
46 import org.eclipse.jface.viewers.Viewer;
47 import org.eclipse.jface.viewers.ViewerCell;
48 import org.eclipse.swt.SWT;
49 import org.eclipse.swt.accessibility.AccessibleAdapter;
50 import org.eclipse.swt.accessibility.AccessibleEvent;
51 import org.eclipse.swt.events.KeyAdapter;
52 import org.eclipse.swt.events.KeyEvent;
53 import org.eclipse.swt.events.ModifyEvent;
54 import org.eclipse.swt.events.ModifyListener;
55 import org.eclipse.swt.events.TraverseEvent;
56 import org.eclipse.swt.events.TraverseListener;
57 import org.eclipse.swt.graphics.Color;
58 import org.eclipse.swt.graphics.Font;
59 import org.eclipse.swt.graphics.GC;
60 import org.eclipse.swt.graphics.Point;
61 import org.eclipse.swt.graphics.Rectangle;
62 import org.eclipse.swt.layout.GridData;
63 import org.eclipse.swt.layout.GridLayout;
64 import org.eclipse.swt.widgets.Button;
65 import org.eclipse.swt.widgets.Composite;
66 import org.eclipse.swt.widgets.Control;
67 import org.eclipse.swt.widgets.Display;
68 import org.eclipse.swt.widgets.Event;
69 import org.eclipse.swt.widgets.Label;
70 import org.eclipse.swt.widgets.Shell;
71 import org.eclipse.swt.widgets.Table;
72 import org.eclipse.swt.widgets.Text;
73 import org.eclipse.ui.IWorkbenchPreferenceConstants;
74 import org.eclipse.ui.PlatformUI;
75 import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
76 import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
77 import org.eclipse.ui.internal.WorkbenchImages;
78 import org.eclipse.ui.internal.WorkbenchMessages;
79 import org.eclipse.ui.internal.WorkbenchPlugin;
80
81 import eu.etaxonomy.cdm.model.common.ICdmBase;
82 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
83 import eu.etaxonomy.taxeditor.l10n.Messages;
84 import eu.etaxonomy.taxeditor.ui.dialog.selection.CdmFilteredItemsSelectionDialog.ItemsListSeparator;
85
86 /**
87 * @author k.luther
88 * @date 15.11.2017
89 *
90 */
91 public abstract class SearchDialog<T extends ICdmBase> extends Dialog{// implements IConversationEnabled{
92
93 private TableViewer list;
94 private Text searchField;
95 private String title;
96 protected Button newButton1;
97
98
99 protected Button newButton2;
100 protected Button filterButton;
101 protected Button btnCheckButton;
102 private StructuredSelection currentSelection;
103
104 // message to show user
105 private String message = ""; //$NON-NLS-1$
106
107 protected final ContentProvider contentProvider;
108 ItemsListLabelProvider itemsListLabelProvider;
109
110 private final RefreshCacheJob refreshCacheJob;
111
112 protected Object preferenceID;
113
114 protected final int new_id = 4;
115 protected final int new_id2 = 5;
116 protected final int space_id = 6;
117 // Need to keep our own list of listeners
118 private final ListenerList listeners = new ListenerList();
119
120
121 private static final String EMPTY_STRING = ""; //$NON-NLS-1$
122 private GridData gd_1;
123 protected boolean useIdentifier;
124
125 public SearchDialog(Shell parent, String title) {
126 super(parent);
127 this.title = title;
128 contentProvider = new ContentProvider();
129 refreshCacheJob = new RefreshCacheJob();
130
131 }
132
133 @Override
134 protected void configureShell(Shell shell) {
135 super.configureShell(shell);
136 shell.setText(title);
137 }
138
139 @Override
140 protected Control createDialogArea(Composite parent) {
141 Composite container = (Composite) super.createDialogArea(parent);
142
143 GridData gd = new GridData(GridData.FILL_BOTH);
144 container.setLayoutData(gd);
145
146 GridLayout layout = new GridLayout();
147 layout.numColumns = 1;
148 layout.marginWidth = 0;
149 layout.marginHeight = 0;
150 container.setLayout(layout);
151
152 final Label headerLabel = createHeader(container);
153
154 Composite searchAndFilter = new Composite(container, container.getStyle());
155
156 searchAndFilter.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
157 GridLayout searchAndFilterLayout = new GridLayout();
158 searchAndFilterLayout.numColumns = 2;
159 searchAndFilter.setLayout(searchAndFilterLayout);
160 searchField = new Text(searchAndFilter, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL);
161 searchField.getAccessible().addAccessibleListener(new AccessibleAdapter() {
162 @Override
163 public void getName(AccessibleEvent e) {
164 e.result = LegacyActionTools.removeMnemonics(headerLabel
165 .getText());
166 }
167 });
168 searchField.addModifyListener(new ModifyListener() {
169 @Override
170 public void modifyText(ModifyEvent e) {
171 search();
172 // fillContentProvider(null);
173
174 }
175 });
176 gd_1 = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
177 gd_1.horizontalIndent = 7;
178
179 searchField.setLayoutData(gd_1);
180
181 createFilterButton(searchAndFilter);
182
183 addIdentifierCheckButton(searchAndFilter);
184 // new Label(searchAndFilter, SWT.NONE);
185 setList(new TableViewer(container, SWT.SINGLE
186 | SWT.BORDER | SWT.V_SCROLL | SWT.VIRTUAL));
187
188 getList().setContentProvider(contentProvider);
189 getList().setLabelProvider(getItemsListLabelProvider());
190 getList().setInput(new Object[0]);
191 getList().setItemCount(contentProvider.getNumberOfElements());
192 getList().addSelectionChangedListener(new ISelectionChangedListener() {
193 @Override
194 public void selectionChanged(SelectionChangedEvent event) {
195 StructuredSelection selection = (StructuredSelection) event
196 .getSelection();
197 currentSelection = selection;
198 }
199 });
200 getList().addDoubleClickListener(new IDoubleClickListener() {
201 @Override
202 public void doubleClick(DoubleClickEvent event) {
203 okPressed();
204 }
205 });
206 searchField.addKeyListener(new KeyAdapter() {
207 @Override
208 public void keyPressed(KeyEvent e) {
209 if (e.keyCode == SWT.ARROW_DOWN) {
210 if (getList().getTable().getItemCount() > 0) {
211 getList().getTable().setFocus();
212 }
213 }
214 }
215 });
216
217 // createExtendedContentArea(container);
218 new Label(container, SWT.NONE);
219 search();
220
221 return container;
222 }
223
224
225 protected void addIdentifierCheckButton(Composite searchAndFilter) {
226 //as default do nothing
227 }
228
229
230 abstract void createFilterButton(Composite searchAndFilter) ;
231
232 protected abstract void search();
233
234
235 /**
236 * Create a new header which is labelled by headerLabel.
237 *
238 * @param parent
239 * @return Label the label of the header
240 */
241 private Label createHeader(Composite parent) {
242 Composite header = new Composite(parent, SWT.NONE);
243 GridData gd_header = new GridData(SWT.CENTER, SWT.CENTER, false, false, 2, 1);
244 gd_header.horizontalIndent = 5;
245 gd_header.widthHint = 575;
246 header.setLayoutData(gd_header);
247
248 GridLayout layout = new GridLayout();
249 layout.marginLeft = 5;
250 layout.horizontalSpacing = 0;
251 layout.verticalSpacing = 1;
252 layout.marginWidth = 0;
253 layout.marginHeight = 0;
254 header.setLayout(layout);
255 new Label(header, SWT.NONE);
256 Label headerLabel = new Label(header, SWT.NONE);
257 headerLabel.setText((getMessage() != null && getMessage().trim()
258 .length() > 0) ? getMessage()
259 : Messages.SearchDialog_patternLabel);
260 headerLabel.addTraverseListener(new TraverseListener() {
261 @Override
262 public void keyTraversed(TraverseEvent e) {
263 if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
264 e.detail = SWT.TRAVERSE_NONE;
265 searchField.setFocus();
266 }
267 }
268 });
269 GridData gd_headerLabel = new GridData(GridData.FILL_HORIZONTAL);
270 gd_headerLabel.horizontalAlignment = SWT.LEFT;
271 gd_headerLabel.grabExcessHorizontalSpace = false;
272 gd_headerLabel.verticalAlignment = SWT.BOTTOM;
273 gd_headerLabel.minimumHeight = 10;
274 headerLabel.setLayoutData(gd_headerLabel);
275 return headerLabel;
276 }
277
278 protected String getMessage() {
279 return message;
280 }
281
282 protected void setMessage(String message){
283 this.message = message;
284 }
285
286 public Text getSearchField() {
287 return searchField;
288 }
289
290
291 public void setSearchField(Text searchField) {
292 this.searchField = searchField;
293 }
294
295 private ItemsListLabelProvider getItemsListLabelProvider() {
296 if (itemsListLabelProvider == null) {
297 itemsListLabelProvider = new ItemsListLabelProvider(
298 new LabelProvider());
299 }
300 return itemsListLabelProvider;
301 }
302
303
304 public TableViewer getList() {
305 return list;
306 }
307
308 public void setList(TableViewer list) {
309 this.list = list;
310 Table table = list.getTable();
311 GridData gd_table = new GridData(SWT.CENTER, SWT.CENTER, true, true, 2, 1);
312 gd_table.heightHint = 231;
313 gd_table.widthHint = 543;
314 table.setLayoutData(gd_table);
315 }
316
317 public Button getNewButton1() {
318 return newButton1;
319 }
320
321
322 public void setNewButton1(Button newButton1) {
323 this.newButton1 = newButton1;
324 }
325
326
327 public Button getNewButton2() {
328 return newButton2;
329 }
330
331
332 public void setNewButton2(Button newButton2) {
333 this.newButton2 = newButton2;
334 }
335
336
337 public Button getFilterButton() {
338 return filterButton;
339 }
340
341
342 public void setFilterButton(Button filterButton) {
343 this.filterButton = filterButton;
344 }
345
346 /**
347 * Sets a new label provider for items in the list. If the label provider
348 * also implements {@link
349 * org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider
350 * .IStyledLabelProvider}, the style text labels provided by it will be used
351 * provided that the corresponding preference is set.
352 *
353 * @see IWorkbenchPreferenceConstants#USE_COLORED_LABELS
354 *
355 * @param listLabelProvider
356 * the label provider for items in the list
357 */
358 public void setListLabelProvider(ILabelProvider listLabelProvider) {
359 getItemsListLabelProvider().setProvider(listLabelProvider);
360 }
361 protected Comparator getItemsComparator() {
362 return new Comparator<UuidAndTitleCache>() {
363 @Override
364 public int compare(UuidAndTitleCache entity1,
365 UuidAndTitleCache entity2) {
366 Collator collator = Collator.getInstance();
367 if (entity1.getUuid().equals(entity2.getUuid())){
368 return 0;
369 }
370 int result = collator.compare(entity1.getTitleCache(), entity2.getTitleCache());
371 if (result == 0){
372 result = entity1.getUuid().compareTo(entity2.getUuid());
373 }
374 return result;
375 }
376 };
377 }
378
379
380 class ContentProvider implements
381 IStructuredContentProvider {
382
383 private List items;
384
385 /**
386 * Creates new instance of <code>ContentProvider</code>.
387 */
388 public ContentProvider() {
389 this.items = Collections.synchronizedList(new ArrayList(2048));
390 }
391
392 /**
393 * Removes all content items and resets progress message.
394 */
395 public void reset() {
396 this.items.clear();
397
398 }
399
400 public void add(Object item) {
401 this.items.add(item);
402 }
403
404 /**
405 * Refresh dialog.
406 */
407 public void refresh() {
408 scheduleRefresh();
409 }
410
411 /**
412 * Schedule refresh job.
413 */
414 public void scheduleRefresh() {
415 refreshCacheJob.cancelAll();
416 refreshCacheJob.schedule();
417 }
418
419 /*
420 * (non-Javadoc)
421 *
422 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
423 */
424 @Override
425 public Object[] getElements(Object inputElement) {
426 return items.toArray();
427 }
428
429 public int getNumberOfElements() {
430 return items.size();
431 }
432
433 /*
434 * (non-Javadoc)
435 *
436 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
437 */
438 @Override
439 public void dispose() {
440 }
441
442 /*
443 * (non-Javadoc)
444 *
445 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
446 * java.lang.Object, java.lang.Object)
447 */
448 @Override
449 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
450 }
451
452
453 }
454
455
456 public boolean isUseIdentifier() {
457 return useIdentifier;
458 }
459
460
461 public StructuredSelection getCurrentSelection() {
462 return currentSelection;
463 }
464
465 /**
466 * Fills the content provider with matching items.
467 *
468 * @param progressMonitor
469 * must be used to report search progress. The state of this
470 * progress monitor reflects the state of the filtering process.
471 * @throws CoreException
472 */
473 protected abstract void fillContentProvider(IProgressMonitor progressMonitor) ;
474
475
476 /**
477 * Refreshes the dialog - has to be called in UI thread.
478 */
479 public void refresh() {
480 if (getList() != null && !getList().getTable().isDisposed()) {
481
482 List lastRefreshSelection = ((StructuredSelection) getList()
483 .getSelection()).toList();
484 getList().getTable().deselectAll();
485
486 getList().setItemCount(contentProvider.getNumberOfElements());
487 getList().refresh();
488
489 if (getList().getTable().getItemCount() > 0) {
490 // preserve previous selection
491 if ( lastRefreshSelection != null
492 && lastRefreshSelection.size() > 0) {
493 getList().setSelection(new StructuredSelection(
494 lastRefreshSelection));
495 } else {
496
497 getList().getTable().setSelection(0);
498 getList().getTable().notifyListeners(SWT.Selection, new Event());
499 }
500 if ( super.getButton(IDialogConstants.OK_ID) != null){
501 super.getButton(IDialogConstants.OK_ID).setEnabled(true);
502 }
503 } else {
504 getList().setSelection(StructuredSelection.EMPTY);
505 }
506
507 }
508 }
509
510 /**
511 * A job responsible for computing filtered items list presented using
512 * <code>RefreshJob</code>.
513 *
514 * @see FilteredItemsSelectionDialog.RefreshJob
515 *
516 */
517 private class RefreshCacheJob extends Job {
518
519 public RefreshCacheJob() {
520 super(
521 WorkbenchMessages.FilteredItemsSelectionDialog_cacheRefreshJob);
522 setSystem(true);
523 }
524
525 /**
526 * Stops the job and all sub-jobs.
527 */
528 public void cancelAll() {
529 cancel();
530 }
531
532 /*
533 * (non-Javadoc)
534 *
535 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
536 */
537 @Override
538 protected IStatus run(IProgressMonitor monitor) {
539 if (monitor.isCanceled()) {
540 return new Status(IStatus.CANCEL, WorkbenchPlugin.PI_WORKBENCH,
541 IStatus.CANCEL, EMPTY_STRING, null);
542 }
543
544 if (SearchDialog.this != null) {
545 SearchDialog.this.fillContentProvider(monitor);
546 }
547
548 return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK,
549 EMPTY_STRING, null);
550
551 }
552
553 /*
554 * (non-Javadoc)
555 *
556 * @see org.eclipse.core.runtime.jobs.Job#canceling()
557 */
558 @Override
559 protected void canceling() {
560 super.canceling();
561 }
562
563 }
564
565 private class ItemsListLabelProvider extends StyledCellLabelProvider
566 implements ILabelProviderListener {
567 private ILabelProvider provider;
568
569 /**
570 * Creates a new instance of the class.
571 *
572 * @param provider
573 * the label provider for all items, not <code>null</code>
574 * @param selectionDecorator
575 * the decorator for selected items, can be <code>null</code>
576 */
577 public ItemsListLabelProvider(ILabelProvider provider) {
578 Assert.isNotNull(provider);
579 this.provider = provider;
580 this.provider.addListener(this);
581 }
582
583 /**
584 * Sets new label provider.
585 *
586 * @param newProvider
587 * new label provider for items in the list, not
588 * <code>null</code>
589 */
590 public void setProvider(ILabelProvider newProvider) {
591 Assert.isNotNull(newProvider);
592 provider.removeListener(this);
593 provider.dispose();
594 provider = newProvider;
595
596 if (provider != null) {
597 provider.addListener(this);
598 }
599 }
600
601
602
603 private boolean isSelected(Object element) {
604 if (element != null && getCurrentSelection() != null) {
605 if (element.equals(getCurrentSelection())) {
606 return true;
607 }
608 }
609 return false;
610 }
611
612 /*
613 * (non-Javadoc)
614 *
615 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
616 */
617 private String getText(Object element) {
618 if (element instanceof ItemsListSeparator) {
619 return getSeparatorLabel(((ItemsListSeparator) element)
620 .getName());
621 }
622 String str = provider.getText(element);
623 return str;
624 }
625
626 private StyledString getStyledText(Object element,
627 IStyledLabelProvider provider) {
628 StyledString string = provider.getStyledText(element);
629
630 return string;
631 }
632
633 @Override
634 public void update(ViewerCell cell) {
635 Object element = cell.getElement();
636
637 if (!(element instanceof ItemsListSeparator)
638 && provider instanceof IStyledLabelProvider) {
639 IStyledLabelProvider styledLabelProvider = (IStyledLabelProvider) provider;
640 StyledString styledString = getStyledText(element,
641 styledLabelProvider);
642
643 cell.setText(styledString.getString());
644 cell.setStyleRanges(styledString.getStyleRanges());
645 cell.setImage(styledLabelProvider.getImage(element));
646 } else {
647 cell.setText(getText(element));
648
649 }
650 cell.setFont(getFont(element));
651 cell.setForeground(getForeground(element));
652 cell.setBackground(getBackground(element));
653
654 super.update(cell);
655 }
656
657 private String getSeparatorLabel(String separatorLabel) {
658 Rectangle rect = getList().getTable().getBounds();
659
660 int borderWidth = getList().getTable().computeTrim(0, 0, 0, 0).width;
661
662 int imageWidth = WorkbenchImages.getImage(
663 IWorkbenchGraphicConstants.IMG_OBJ_SEPARATOR).getBounds().width;
664
665 int width = rect.width - borderWidth - imageWidth;
666
667 GC gc = new GC(getList().getTable());
668 gc.setFont(getList().getTable().getFont());
669
670 int fSeparatorWidth = gc.getAdvanceWidth('-');
671 int fMessageLength = gc.textExtent(separatorLabel).x;
672
673 gc.dispose();
674
675 StringBuffer dashes = new StringBuffer();
676 int chars = (((width - fMessageLength) / fSeparatorWidth) / 2) - 2;
677 for (int i = 0; i < chars; i++) {
678 dashes.append('-');
679 }
680
681 StringBuffer result = new StringBuffer();
682 result.append(dashes);
683 result.append(" " + separatorLabel + " "); //$NON-NLS-1$//$NON-NLS-2$
684 result.append(dashes);
685 return result.toString().trim();
686 }
687
688 /*
689 * (non-Javadoc)
690 *
691 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
692 */
693 @Override
694 public void addListener(ILabelProviderListener listener) {
695 listeners.add(listener);
696 }
697
698 /*
699 * (non-Javadoc)
700 *
701 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
702 */
703 @Override
704 public void dispose() {
705 provider.removeListener(this);
706 provider.dispose();
707 super.dispose();
708 }
709
710 /*
711 * (non-Javadoc)
712 *
713 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
714 * java.lang.String)
715 */
716 @Override
717 public boolean isLabelProperty(Object element, String property) {
718 if (provider.isLabelProperty(element, property)) {
719 return true;
720 }
721 return false;
722 }
723
724 /*
725 * (non-Javadoc)
726 *
727 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
728 */
729 @Override
730 public void removeListener(ILabelProviderListener listener) {
731 listeners.remove(listener);
732 }
733
734 private Color getBackground(Object element) {
735 if (element instanceof ItemsListSeparator) {
736 return null;
737 }
738 if (provider instanceof IColorProvider) {
739 return ((IColorProvider) provider).getBackground(element);
740 }
741 return null;
742 }
743
744 private Color getForeground(Object element) {
745 if (element instanceof ItemsListSeparator) {
746 return Display.getCurrent().getSystemColor(
747 SWT.COLOR_WIDGET_NORMAL_SHADOW);
748 }
749 if (provider instanceof IColorProvider) {
750 return ((IColorProvider) provider).getForeground(element);
751 }
752 return null;
753 }
754
755 private Font getFont(Object element) {
756 if (element instanceof ItemsListSeparator) {
757 return null;
758 }
759 if (provider instanceof IFontProvider) {
760 return ((IFontProvider) provider).getFont(element);
761 }
762 return null;
763 }
764
765 /*
766 * (non-Javadoc)
767 *
768 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
769 */
770 @Override
771 public void labelProviderChanged(LabelProviderChangedEvent event) {
772 Object[] l = listeners.getListeners();
773 for (int i = 0; i < listeners.size(); i++) {
774 ((ILabelProviderListener) l[i]).labelProviderChanged(event);
775 }
776 }
777 }
778
779 @Override
780 protected Point getInitialSize() {
781 return new Point(593, 399);
782 }
783
784
785
786 }
787
788