Project

General

Profile

Download (26.9 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.action.MenuManager;
29
import org.eclipse.jface.dialogs.Dialog;
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.ModifyEvent;
52
import org.eclipse.swt.events.ModifyListener;
53
import org.eclipse.swt.events.TraverseEvent;
54
import org.eclipse.swt.events.TraverseListener;
55
import org.eclipse.swt.graphics.Color;
56
import org.eclipse.swt.graphics.Font;
57
import org.eclipse.swt.graphics.GC;
58
import org.eclipse.swt.graphics.Point;
59
import org.eclipse.swt.graphics.Rectangle;
60
import org.eclipse.swt.layout.GridData;
61
import org.eclipse.swt.layout.GridLayout;
62
import org.eclipse.swt.widgets.Button;
63
import org.eclipse.swt.widgets.Composite;
64
import org.eclipse.swt.widgets.Control;
65
import org.eclipse.swt.widgets.Display;
66
import org.eclipse.swt.widgets.Event;
67
import org.eclipse.swt.widgets.Label;
68
import org.eclipse.swt.widgets.Shell;
69
import org.eclipse.swt.widgets.Table;
70
import org.eclipse.swt.widgets.Text;
71
import org.eclipse.swt.widgets.ToolBar;
72
import org.eclipse.ui.IWorkbenchPreferenceConstants;
73
import org.eclipse.ui.PlatformUI;
74
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
75
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
76
import org.eclipse.ui.internal.WorkbenchImages;
77
import org.eclipse.ui.internal.WorkbenchMessages;
78
import org.eclipse.ui.internal.WorkbenchPlugin;
79

    
80
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
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
        private StructuredSelection currentSelection;
102

    
103
        // message to show user
104
        private String message = ""; //$NON-NLS-1$
105

    
106
        protected final ContentProvider contentProvider;
107
        ItemsListLabelProvider itemsListLabelProvider;
108

    
109
        private final RefreshCacheJob refreshCacheJob;
110

    
111
        private ToolBar toolBar;
112
        private MenuManager menuManager;
113

    
114
        protected Object preferenceID;
115

    
116
        protected final int new_id = 4;
117
        protected final int new_id2 = 5;
118
        // Need to keep our own list of listeners
119
        private final ListenerList listeners = new ListenerList();
120

    
121

    
122
        private static final String EMPTY_STRING = ""; //$NON-NLS-1$
123
        private GridData gd_1;
124

    
125
        public SearchDialog(Shell parent, boolean multi) {
126
            super(parent);
127
            contentProvider = new ContentProvider();
128
            refreshCacheJob = new RefreshCacheJob();
129

    
130

    
131
        }
132

    
133

    
134
        @Override
135
        protected Control createDialogArea(Composite parent) {
136
            Composite container = (Composite) super.createDialogArea(parent);
137

    
138
            GridData gd = new GridData(GridData.FILL_BOTH);
139
            container.setLayoutData(gd);
140

    
141
            GridLayout layout = new GridLayout();
142
            layout.numColumns = 1;
143
            layout.marginWidth = 0;
144
            layout.marginHeight = 0;
145
            container.setLayout(layout);
146

    
147
            final Label headerLabel = createHeader(container);
148

    
149
            Composite searchAndFilter = new Composite(container, container.getStyle());
150
//            GridData gd_searchAndFilter = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
151
            GridData gd_searchAndFilter =new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
152
//            gd_searchAndFilter.widthHint = 576;
153
            searchAndFilter.setLayoutData(gd_searchAndFilter);
154
            GridLayout searchAndFilterLayout = new GridLayout();
155
            searchAndFilterLayout.numColumns = 2;
156
            searchAndFilter.setLayout(searchAndFilterLayout);
157
            searchField = new Text(searchAndFilter, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL);
158
            searchField.getAccessible().addAccessibleListener(new AccessibleAdapter() {
159
                @Override
160
                public void getName(AccessibleEvent e) {
161
                    e.result = LegacyActionTools.removeMnemonics(headerLabel
162
                            .getText());
163
                }
164
            });
165
            searchField.addModifyListener(new ModifyListener() {
166
                @Override
167
                public void modifyText(ModifyEvent e) {
168
                    search();
169
                    try {
170
                        fillContentProvider(null);
171
                    } catch (CoreException coreException) {
172
                        // TODO Auto-generated catch block
173
                        coreException.printStackTrace();
174
                    }
175
                }
176
            });
177
            gd_1 = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
178

    
179
//            gd_1.horizontalIndent = 2;
180
//            gd_1.horizontalAlignment = SWT.CENTER;
181
//            gd_1.grabExcessHorizontalSpace = true;
182
//            gd_1.widthHint = 500;
183
            searchField.setLayoutData(gd_1);
184

    
185
            createFilterButton(searchAndFilter);
186
            setList(new TableViewer(container,  SWT.SINGLE
187
                    | SWT.BORDER | SWT.V_SCROLL | SWT.VIRTUAL));
188

    
189
            getList().setContentProvider(contentProvider);
190
            getList().setLabelProvider(getItemsListLabelProvider());
191
            getList().setInput(new Object[0]);
192
            getList().setItemCount(contentProvider.getNumberOfElements());
193
            getList().addSelectionChangedListener(new ISelectionChangedListener() {
194
                @Override
195
                public void selectionChanged(SelectionChangedEvent event) {
196
                    StructuredSelection selection = (StructuredSelection) event
197
                            .getSelection();
198
                    currentSelection = selection;
199
                }
200
            });
201
            getList().addDoubleClickListener(new IDoubleClickListener() {
202
                @Override
203
                public void doubleClick(DoubleClickEvent event) {
204
                    okPressed();
205
                }
206
            });
207
//            createExtendedContentArea(container);
208
            new Label(container, SWT.NONE);
209

    
210
            return container;
211
        }
212

    
213

    
214
        abstract void createFilterButton(Composite searchAndFilter) ;
215

    
216
        protected abstract void search();
217

    
218
        /**
219
         * Creates an extra content area, which will be located above the details.
220
         *
221
         * @param parent
222
         *            parent to create the dialog widgets in
223
         * @return an extra content area
224
         */
225
//        protected abstract Control createExtendedContentArea(Composite parent);
226

    
227
        /**
228
         * Sets the title for this dialog.
229
         *
230
         * @param title
231
         *            the title
232
         */
233
        public void setTitle(String title) {
234
            this.title = title;
235
        }
236

    
237
        /**
238
         * Create a new header which is labelled by headerLabel.
239
         *
240
         * @param parent
241
         * @return Label the label of the header
242
         */
243
        private Label createHeader(Composite parent) {
244
            Composite header = new Composite(parent, SWT.NONE);
245
            GridData gd_header = new GridData(SWT.CENTER, SWT.CENTER, false, false, 2, 1);
246
            gd_header.widthHint = 575;
247
            header.setLayoutData(gd_header);
248

    
249
            GridLayout layout = new GridLayout();
250
            layout.verticalSpacing = 1;
251
            layout.marginWidth = 0;
252
            layout.marginHeight = 0;
253
            header.setLayout(layout);
254
            new Label(header, SWT.NONE);
255
            Label headerLabel = new Label(header, SWT.NONE);
256
            headerLabel.setText((getMessage() != null && getMessage().trim()
257
                    .length() > 0) ? getMessage()
258
                    : Messages.SearchDialog_patternLabel);
259
            headerLabel.addTraverseListener(new TraverseListener() {
260
                @Override
261
                public void keyTraversed(TraverseEvent e) {
262
                    if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
263
                        e.detail = SWT.TRAVERSE_NONE;
264
                        searchField.setFocus();
265
                    }
266
                }
267
            });
268
            GridData gd_headerLabel = new GridData(GridData.FILL_HORIZONTAL);
269
            gd_headerLabel.horizontalAlignment = SWT.LEFT;
270
            gd_headerLabel.grabExcessHorizontalSpace = false;
271
            gd_headerLabel.verticalAlignment = SWT.BOTTOM;
272
            gd_headerLabel.minimumHeight = 10;
273
            headerLabel.setLayoutData(gd_headerLabel);
274
            return headerLabel;
275
        }
276

    
277
        protected String getMessage() {
278
            return message;
279
        }
280

    
281
        protected void setMessage(String message){
282
            this.message = message;
283
        }
284

    
285
        public Text getSearchField() {
286
            return searchField;
287
        }
288

    
289

    
290
        public void setSearchField(Text searchField) {
291
            this.searchField = searchField;
292
        }
293

    
294
        private ItemsListLabelProvider getItemsListLabelProvider() {
295
            if (itemsListLabelProvider == null) {
296
                itemsListLabelProvider = new ItemsListLabelProvider(
297
                        new LabelProvider());
298
            }
299
            return itemsListLabelProvider;
300
        }
301
//        private void createViewMenu(Composite parent) {
302
//            toolBar = new ToolBar(parent, SWT.FLAT);
303
//
304
//            GridData data = new GridData();
305
//            data.horizontalAlignment = GridData.END;
306
//            data.grabExcessHorizontalSpace = true;
307
//            toolBar.setLayoutData(data);
308
//
309
//            menuManager = new MenuManager();
310
//
311
//            fillViewMenu(menuManager);
312
//
313
//            IHandlerService service = PlatformUI.getWorkbench()
314
//                    .getService(IHandlerService.class);
315
//            IHandler handler = new AbstractHandler() {
316
//                @Override
317
//                public Object execute(ExecutionEvent event) {
318
//                    showViewMenu();
319
//                    return null;
320
//                }
321
//            };
322
//        }
323

    
324
//        /**
325
//         * Fills the menu of the dialog.
326
//         *
327
//         * @param menuManager
328
//         *            the menu manager
329
//         */
330
//        protected void fillViewMenu(IMenuManager menuManager) {
331
//
332
//        }
333

    
334
//        private void showViewMenu() {
335
//            Menu menu = menuManager.createContextMenu(getShell());
336
//            Rectangle bounds = toolItem.getBounds();
337
//            Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
338
//            topLeft = toolBar.toDisplay(topLeft);
339
//            menu.setLocation(topLeft.x, topLeft.y);
340
//            menu.setVisible(true);
341
//        }
342

    
343
        public TableViewer getList() {
344
            return list;
345
        }
346

    
347
        public void setList(TableViewer list) {
348
            this.list = list;
349
            Table table = list.getTable();
350
            GridData gd_table = new GridData(SWT.CENTER, SWT.CENTER, true, true, 2, 1);
351
            gd_table.heightHint = 231;
352
            gd_table.widthHint = 543;
353
            table.setLayoutData(gd_table);
354
        }
355

    
356
        public Button getNewButton1() {
357
            return newButton1;
358
        }
359

    
360

    
361
        public void setNewButton1(Button newButton1) {
362
            this.newButton1 = newButton1;
363
        }
364

    
365

    
366
        public Button getNewButton2() {
367
            return newButton2;
368
        }
369

    
370

    
371
        public void setNewButton2(Button newButton2) {
372
            this.newButton2 = newButton2;
373
        }
374

    
375

    
376
        public Button getFilterButton() {
377
            return filterButton;
378
        }
379

    
380

    
381
        public void setFilterButton(Button filterButton) {
382
            this.filterButton = filterButton;
383
        }
384

    
385
        /**
386
         * Sets a new label provider for items in the list. If the label provider
387
         * also implements {@link
388
         * org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider
389
         * .IStyledLabelProvider}, the style text labels provided by it will be used
390
         * provided that the corresponding preference is set.
391
         *
392
         * @see IWorkbenchPreferenceConstants#USE_COLORED_LABELS
393
         *
394
         * @param listLabelProvider
395
         *      the label provider for items in the list
396
         */
397
        public void setListLabelProvider(ILabelProvider listLabelProvider) {
398
            getItemsListLabelProvider().setProvider(listLabelProvider);
399
        }
400
        protected Comparator getItemsComparator() {
401
            return new Comparator<UuidAndTitleCache>() {
402
                @Override
403
                public int compare(UuidAndTitleCache entity1,
404
                        UuidAndTitleCache entity2) {
405
                    Collator collator = Collator.getInstance();
406
                    if (entity1.getUuid().equals(entity2.getUuid())){
407
                        return 0;
408
                    }
409
                    int result = collator.compare(entity1.getTitleCache(), entity2.getTitleCache());
410
                    if (result == 0){
411
                        result = entity1.getUuid().compareTo(entity2.getUuid());
412
                    }
413
                    return result;
414
                }
415
            };
416
        }
417

    
418

    
419
        class ContentProvider implements
420
                IStructuredContentProvider {
421

    
422
            private List items;
423

    
424
            /**
425
             * Creates new instance of <code>ContentProvider</code>.
426
             */
427
            public ContentProvider() {
428
                this.items = Collections.synchronizedList(new ArrayList(2048));
429
            }
430

    
431
            /**
432
             * Removes all content items and resets progress message.
433
             */
434
            public void reset() {
435
                this.items.clear();
436

    
437
            }
438

    
439
            public void add(Object item) {
440
                this.items.add(item);
441
            }
442

    
443
            /**
444
             * Refresh dialog.
445
             */
446
            public void refresh() {
447
                scheduleRefresh();
448
            }
449

    
450
            /**
451
             * Schedule refresh job.
452
             */
453
            public void scheduleRefresh() {
454
                refreshCacheJob.cancelAll();
455
                refreshCacheJob.schedule();
456
            }
457

    
458
            /*
459
             * (non-Javadoc)
460
             *
461
             * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
462
             */
463
            @Override
464
            public Object[] getElements(Object inputElement) {
465
                return items.toArray();
466
            }
467

    
468
            public int getNumberOfElements() {
469
               return items.size();
470
            }
471

    
472
            /*
473
             * (non-Javadoc)
474
             *
475
             * @see org.eclipse.jface.viewers.IContentProvider#dispose()
476
             */
477
            @Override
478
            public void dispose() {
479
            }
480

    
481
            /*
482
             * (non-Javadoc)
483
             *
484
             * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
485
             *      java.lang.Object, java.lang.Object)
486
             */
487
            @Override
488
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
489
            }
490

    
491

    
492
        }
493

    
494

    
495

    
496
        public StructuredSelection getCurrentSelection() {
497
            return currentSelection;
498
        }
499

    
500
        /**
501
         * Fills the content provider with matching items.
502
         *
503
         * @param progressMonitor
504
         *            must be used to report search progress. The state of this
505
         *            progress monitor reflects the state of the filtering process.
506
         * @throws CoreException
507
         */
508
        protected abstract void fillContentProvider(IProgressMonitor progressMonitor) throws CoreException;
509

    
510

    
511
        /**
512
         * Refreshes the dialog - has to be called in UI thread.
513
         */
514
        public void refresh() {
515
            if (getList() != null && !getList().getTable().isDisposed()) {
516

    
517
                List lastRefreshSelection = ((StructuredSelection) getList()
518
                        .getSelection()).toList();
519
                getList().getTable().deselectAll();
520

    
521
                getList().setItemCount(contentProvider.getNumberOfElements());
522
                getList().refresh();
523

    
524
                if (getList().getTable().getItemCount() > 0) {
525
                    // preserve previous selection
526
                    if ( lastRefreshSelection != null
527
                            && lastRefreshSelection.size() > 0) {
528
                        getList().setSelection(new StructuredSelection(
529
                                lastRefreshSelection));
530
                    } else {
531

    
532
                        getList().getTable().setSelection(0);
533
                        getList().getTable().notifyListeners(SWT.Selection, new Event());
534
                    }
535
                } else {
536
                    getList().setSelection(StructuredSelection.EMPTY);
537
                }
538

    
539
            }
540
        }
541

    
542
        /**
543
         * A job responsible for computing filtered items list presented using
544
         * <code>RefreshJob</code>.
545
         *
546
         * @see FilteredItemsSelectionDialog.RefreshJob
547
         *
548
         */
549
        private class RefreshCacheJob extends Job {
550

    
551
            public RefreshCacheJob() {
552
                super(
553
                        WorkbenchMessages.FilteredItemsSelectionDialog_cacheRefreshJob);
554
                setSystem(true);
555
            }
556

    
557
            /**
558
             * Stops the job and all sub-jobs.
559
             */
560
            public void cancelAll() {
561
                cancel();
562
            }
563

    
564
            /*
565
             * (non-Javadoc)
566
             *
567
             * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
568
             */
569
            @Override
570
            protected IStatus run(IProgressMonitor monitor) {
571
                if (monitor.isCanceled()) {
572
                    return new Status(IStatus.CANCEL, WorkbenchPlugin.PI_WORKBENCH,
573
                            IStatus.CANCEL, EMPTY_STRING, null);
574
                }
575

    
576
                if (SearchDialog.this != null) {
577

    
578
                    try {
579
                        SearchDialog.this.fillContentProvider(monitor);
580
                    } catch (CoreException e) {
581
                        // TODO Auto-generated catch block
582
                        e.printStackTrace();
583
                    }
584
                }
585

    
586
                return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK,
587
                        EMPTY_STRING, null);
588

    
589
            }
590

    
591
            /*
592
             * (non-Javadoc)
593
             *
594
             * @see org.eclipse.core.runtime.jobs.Job#canceling()
595
             */
596
            @Override
597
            protected void canceling() {
598
                super.canceling();
599
            }
600

    
601
        }
602

    
603
        private class ItemsListLabelProvider extends StyledCellLabelProvider
604
        implements ILabelProviderListener {
605
            private ILabelProvider provider;
606

    
607
    /**
608
     * Creates a new instance of the class.
609
     *
610
     * @param provider
611
     *            the label provider for all items, not <code>null</code>
612
     * @param selectionDecorator
613
     *            the decorator for selected items, can be <code>null</code>
614
     */
615
    public ItemsListLabelProvider(ILabelProvider provider) {
616
        Assert.isNotNull(provider);
617
        this.provider = provider;
618
        this.provider.addListener(this);
619
    }
620

    
621
    /**
622
     * Sets new label provider.
623
     *
624
     * @param newProvider
625
     *            new label provider for items in the list, not
626
     *            <code>null</code>
627
     */
628
    public void setProvider(ILabelProvider newProvider) {
629
        Assert.isNotNull(newProvider);
630
        provider.removeListener(this);
631
        provider.dispose();
632
        provider = newProvider;
633

    
634
        if (provider != null) {
635
            provider.addListener(this);
636
        }
637
    }
638

    
639

    
640

    
641
    private boolean isSelected(Object element) {
642
        if (element != null && getCurrentSelection() != null) {
643
            if (element.equals(getCurrentSelection())) {
644
                return true;
645
            }
646
        }
647
        return false;
648
    }
649

    
650
    /*
651
     * (non-Javadoc)
652
     *
653
     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
654
     */
655
    private String getText(Object element) {
656
        if (element instanceof ItemsListSeparator) {
657
            return getSeparatorLabel(((ItemsListSeparator) element)
658
                    .getName());
659
        }
660
        String str = provider.getText(element);
661
        return str;
662
    }
663

    
664
    private StyledString getStyledText(Object element,
665
            IStyledLabelProvider provider) {
666
        StyledString string = provider.getStyledText(element);
667

    
668
        return string;
669
    }
670

    
671
    @Override
672
    public void update(ViewerCell cell) {
673
        Object element = cell.getElement();
674

    
675
        if (!(element instanceof ItemsListSeparator)
676
                && provider instanceof IStyledLabelProvider) {
677
            IStyledLabelProvider styledLabelProvider = (IStyledLabelProvider) provider;
678
            StyledString styledString = getStyledText(element,
679
                    styledLabelProvider);
680

    
681
            cell.setText(styledString.getString());
682
            cell.setStyleRanges(styledString.getStyleRanges());
683
            cell.setImage(styledLabelProvider.getImage(element));
684
        } else {
685
            cell.setText(getText(element));
686

    
687
        }
688
        cell.setFont(getFont(element));
689
        cell.setForeground(getForeground(element));
690
        cell.setBackground(getBackground(element));
691

    
692
        super.update(cell);
693
    }
694

    
695
    private String getSeparatorLabel(String separatorLabel) {
696
        Rectangle rect = getList().getTable().getBounds();
697

    
698
        int borderWidth = getList().getTable().computeTrim(0, 0, 0, 0).width;
699

    
700
        int imageWidth = WorkbenchImages.getImage(
701
                IWorkbenchGraphicConstants.IMG_OBJ_SEPARATOR).getBounds().width;
702

    
703
        int width = rect.width - borderWidth - imageWidth;
704

    
705
        GC gc = new GC(getList().getTable());
706
        gc.setFont(getList().getTable().getFont());
707

    
708
        int fSeparatorWidth = gc.getAdvanceWidth('-');
709
        int fMessageLength = gc.textExtent(separatorLabel).x;
710

    
711
        gc.dispose();
712

    
713
        StringBuffer dashes = new StringBuffer();
714
        int chars = (((width - fMessageLength) / fSeparatorWidth) / 2) - 2;
715
        for (int i = 0; i < chars; i++) {
716
            dashes.append('-');
717
        }
718

    
719
        StringBuffer result = new StringBuffer();
720
        result.append(dashes);
721
        result.append(" " + separatorLabel + " "); //$NON-NLS-1$//$NON-NLS-2$
722
        result.append(dashes);
723
        return result.toString().trim();
724
    }
725

    
726
    /*
727
     * (non-Javadoc)
728
     *
729
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
730
     */
731
    @Override
732
    public void addListener(ILabelProviderListener listener) {
733
        listeners.add(listener);
734
    }
735

    
736
    /*
737
     * (non-Javadoc)
738
     *
739
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
740
     */
741
    @Override
742
    public void dispose() {
743
        provider.removeListener(this);
744
        provider.dispose();
745
        super.dispose();
746
    }
747

    
748
    /*
749
     * (non-Javadoc)
750
     *
751
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
752
     *      java.lang.String)
753
     */
754
    @Override
755
    public boolean isLabelProperty(Object element, String property) {
756
        if (provider.isLabelProperty(element, property)) {
757
            return true;
758
        }
759
        return false;
760
    }
761

    
762
    /*
763
     * (non-Javadoc)
764
     *
765
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
766
     */
767
    @Override
768
    public void removeListener(ILabelProviderListener listener) {
769
        listeners.remove(listener);
770
    }
771

    
772
    private Color getBackground(Object element) {
773
        if (element instanceof ItemsListSeparator) {
774
            return null;
775
        }
776
        if (provider instanceof IColorProvider) {
777
            return ((IColorProvider) provider).getBackground(element);
778
        }
779
        return null;
780
    }
781

    
782
    private Color getForeground(Object element) {
783
        if (element instanceof ItemsListSeparator) {
784
            return Display.getCurrent().getSystemColor(
785
                    SWT.COLOR_WIDGET_NORMAL_SHADOW);
786
        }
787
        if (provider instanceof IColorProvider) {
788
            return ((IColorProvider) provider).getForeground(element);
789
        }
790
        return null;
791
    }
792

    
793
    private Font getFont(Object element) {
794
        if (element instanceof ItemsListSeparator) {
795
            return null;
796
        }
797
        if (provider instanceof IFontProvider) {
798
            return ((IFontProvider) provider).getFont(element);
799
        }
800
        return null;
801
    }
802

    
803
    /*
804
     * (non-Javadoc)
805
     *
806
     * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
807
     */
808
    @Override
809
    public void labelProviderChanged(LabelProviderChangedEvent event) {
810
        Object[] l = listeners.getListeners();
811
        for (int i = 0; i < listeners.size(); i++) {
812
            ((ILabelProviderListener) l[i]).labelProviderChanged(event);
813
        }
814
    }
815
}
816

    
817
    @Override
818
    protected Point getInitialSize() {
819
        return new Point(593, 399);
820
    }
821

    
822

    
823

    
824
}
825

    
826

    
(31-31/39)