Project

General

Profile

Download (25.4 KB) Statistics
| Branch: | Tag: | Revision:
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

    
(33-33/43)