Project

General

Profile

Download (27.5 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
 * Copyright (C) 2007 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

    
11
package eu.etaxonomy.taxeditor.editor.view.checklist;
12

    
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.Collection;
16
import java.util.Collections;
17
import java.util.HashMap;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.SortedSet;
21

    
22
import org.apache.log4j.Logger;
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.IStatus;
25
import org.eclipse.core.runtime.Status;
26
import org.eclipse.core.runtime.jobs.Job;
27
import org.eclipse.jface.viewers.ISelection;
28
import org.eclipse.jface.viewers.StructuredViewer;
29
import org.eclipse.jface.viewers.TableViewer;
30
import org.eclipse.jface.viewers.TableViewerColumn;
31
import org.eclipse.swt.SWT;
32
import org.eclipse.swt.events.ModifyListener;
33
import org.eclipse.swt.events.SelectionAdapter;
34
import org.eclipse.swt.events.SelectionEvent;
35
import org.eclipse.swt.layout.GridData;
36
import org.eclipse.swt.layout.GridLayout;
37
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Display;
39
import org.eclipse.swt.widgets.Label;
40
import org.eclipse.swt.widgets.Menu;
41
import org.eclipse.swt.widgets.MenuItem;
42
import org.eclipse.swt.widgets.Table;
43
import org.eclipse.swt.widgets.TableColumn;
44
import org.eclipse.swt.widgets.Text;
45
import org.eclipse.swt.widgets.ToolBar;
46
import org.eclipse.swt.widgets.ToolItem;
47
import org.eclipse.ui.IEditorInput;
48
import org.eclipse.ui.IEditorSite;
49
import org.eclipse.ui.IMemento;
50
import org.eclipse.ui.ISelectionListener;
51
import org.eclipse.ui.ISelectionService;
52
import org.eclipse.ui.IWorkbenchPart;
53
import org.eclipse.ui.PartInitException;
54
import org.eclipse.ui.part.EditorPart;
55
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
56

    
57
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
58
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
59
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
60
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
61
import eu.etaxonomy.cdm.model.common.CdmBase;
62
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
63
import eu.etaxonomy.cdm.model.taxon.Classification;
64
import eu.etaxonomy.cdm.model.taxon.Taxon;
65
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
66
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
67
import eu.etaxonomy.taxeditor.editor.EditorUtil;
68
import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;
69
import eu.etaxonomy.taxeditor.editor.view.checklist.edit.DistributionEditingSupport;
70
import eu.etaxonomy.taxeditor.editor.view.checklist.filter.ChecklistEditorFilter;
71
import eu.etaxonomy.taxeditor.editor.view.checklist.listener.ChecklistDropdownSelectionListener;
72
import eu.etaxonomy.taxeditor.editor.view.checklist.listener.ChecklistFocusListener;
73
import eu.etaxonomy.taxeditor.editor.view.checklist.listener.ChecklistModifyListener;
74
import eu.etaxonomy.taxeditor.model.IContextListener;
75
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
76
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
77
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
78
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
79
import eu.etaxonomy.taxeditor.preference.Resources;
80
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
81
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
82
import eu.etaxonomy.taxeditor.store.CdmStore;
83

    
84
/**
85
 * <p>
86
 * ChecklistViewPart class.
87
 * </p>
88
 *
89
 * @author a.oppermann
90
 * @created 30.04.2014
91
 * @version 1.0
92
 */
93
public class ChecklistEditor extends EditorPart implements ISelectionListener, IPartContentHasFactualData,
94
        IConversationEnabled, IContextListener, IPartContentHasDetails, IDirtyMarkable, ICdmEntitySessionEnabled {
95

    
96
    private static final Logger logger = Logger.getLogger(ChecklistEditor.class);
97
    /**
98
     * Key used for storing Checklist Editor View
99
     */
100
    private static final String CHECKLIST_EDITOR_MEMENTO_KEY = "checklistEditor";
101

    
102

    
103

    
104

    
105
    private class ChecklistJob extends Job {
106

    
107
        private List<TaxonNode> taxonNodes;
108

    
109
        /**
110
         * @param name
111
         */
112
        public ChecklistJob(String title, List<TaxonNode> listTaxonNodes) {
113
            super(title);
114
            this.taxonNodes = listTaxonNodes;
115

    
116

    
117
        }
118

    
119
        /*
120
         * (non-Javadoc)
121
         *
122
         * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.
123
         * IProgressMonitor)
124
         */
125
        @Override
126
        public IStatus run(final IProgressMonitor monitor) {
127
            try {
128
                logger.debug("Begin of eclipse core runtime Job to Retrieve datasources");
129
                monitor.beginTask("Retrieving TaxonNodes", taxonNodes.size() + 1);
130

    
131
                final List<Taxon> taxonList = new ArrayList<Taxon>();
132

    
133
                for (TaxonNode taxonNode : taxonNodes) {
134
                    HibernateProxyHelper hh = new HibernateProxyHelper();
135
                    Taxon taxon = hh.deproxy(taxonNode.getTaxon(), Taxon.class);
136
                    taxonList.add(taxon);
137
                }
138
                // set View input
139
                Display.getDefault().asyncExec(new Runnable() {
140

    
141
                    @Override
142
                    public void run() {
143
                    	viewer.setInput(taxonList);
144
                    }
145
                });
146
                monitor.worked(1);
147

    
148
            } finally {
149
                monitor.done();
150
                taxonNodes = null;
151
            }
152
            return Status.OK_STATUS;
153
        }
154
    }
155

    
156
    /**
157
     * Constant
158
     * <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code>
159
     */
160
    public static String ID = "eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistEditor";
161

    
162
    private TableViewer viewer;
163

    
164
    private String partNameCache;
165

    
166
    private IWorkbenchSiteProgressService service;
167

    
168
    private ITaxonNodeService taxonNodeService;
169

    
170
    private ChecklistEditorComparator comparator;
171

    
172
    private ChecklistEditorInput checklistEditorInput;
173

    
174
    private SimpleSelectionProvider simpleSelectionProvider;
175

    
176
    private ISelectionService selectionService;
177

    
178
    private ConversationHolder conversation;
179

    
180
    private Integer countNodes;
181

    
182
    private List<TaxonNode> selectedTaxonNodes;
183

    
184
    private boolean dirty;
185

    
186
    private ChecklistEditorFilter filter;
187

    
188
    private Menu headerMenu;
189

    
190
    private Label statusLabel;
191

    
192
    private final ICdmEntitySession cdmEntitySession;
193

    
194
    private ChecklistLabelProvider labelProvider;
195

    
196
    private SortedSet<DefinedTermBase> terms = null;
197
	private ToolItem toolItem;
198
	private ChecklistDropdownSelectionListener dropListener;
199

    
200
    /**
201
     * @return the selectedTaxonNodes
202
     */
203
    public List<TaxonNode> getSelectedTaxonNodes() {
204
        return selectedTaxonNodes;
205
    }
206

    
207
    /**
208
     * @param selectedTaxonNodes
209
     *            the selectedTaxonNodes to set
210
     */
211
    public void setSelectedTaxonNodes(List<TaxonNode> selectedTaxonNodes) {
212
        this.selectedTaxonNodes = selectedTaxonNodes;
213
    }
214

    
215
    /**
216
     * <p>
217
     * Constructor for CdmDataSourceViewPart.
218
     * </p>
219
     */
220
    public ChecklistEditor() {
221
        cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
222

    
223
    }
224

    
225
    /** {@inheritDoc} */
226
    @Override
227
    public void createPartControl(Composite parent) {
228
        service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
229
        taxonNodeService = CdmStore.getService(ITaxonNodeService.class);
230
        selectionService = getSite().getWorkbenchWindow().getSelectionService();
231
        selectionService.addSelectionListener(this);
232
        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
233
        labelProvider = new ChecklistLabelProvider(this.viewer);
234
        terms = labelProvider.getNamedAreas();
235
        filter = new ChecklistEditorFilter();
236
        createTopComposite(parent);
237
        loadDataInput();
238
    }
239

    
240
    /**
241
     * @param parent
242
     */
243
    private void createTopComposite(Composite parent) {
244
        GridLayout gridLayout = new GridLayout(3, false);
245
        gridLayout.marginWidth = 0;
246
        gridLayout.marginHeight = 0;
247
        parent.setLayout(gridLayout);
248

    
249
        final Text searchText = createSearchBar(parent);
250
        createToolbar(parent);
251

    
252
        getSite().setSelectionProvider(viewer);
253

    
254
        final ModifyListener modifyListener = new ChecklistModifyListener(viewer, filter, searchText);
255

    
256
        searchText.addFocusListener(new ChecklistFocusListener(searchText, modifyListener));
257
        searchText.addModifyListener(modifyListener);
258
        createGridDataForViewerLayout();
259

    
260
        viewer.addFilter(filter);
261
        createTable();
262

    
263
        viewer.setContentProvider(new ChecklistContentProvider());
264
        viewer.setLabelProvider(this.labelProvider);
265
        comparator = new ChecklistEditorComparator();
266
        viewer.setComparator(comparator);
267

    
268
        createStatusBar(parent);
269
    }
270

    
271
	private void createGridDataForViewerLayout() {
272
		GridData gridData = new GridData();
273
		gridData.verticalAlignment = GridData.FILL;
274
        gridData.horizontalSpan = 3;
275
        gridData.grabExcessHorizontalSpace = true;
276
        gridData.grabExcessVerticalSpace = true;
277
        gridData.horizontalAlignment = GridData.FILL;
278
        viewer.getControl().setLayoutData(gridData);
279
	}
280

    
281
    /**
282
     * @param parent
283
     * @return
284
     */
285
    private Text createSearchBar(Composite parent) {
286
        Label searchLabel = new Label(parent, SWT.NONE);
287
        searchLabel.setText("Search: ");
288
        final Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.CANCEL);
289
        searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
290
        searchText.setForeground(EditorUtil.getColor(Resources.SEARCH_VIEW_FOREGROUND));
291
        searchText.setText("type filter text");
292
        return searchText;
293
    }
294

    
295
    /**
296
     * @param parent
297
     */
298
    private void createToolbar(Composite parent) {
299
        ToolBar toolBar = new ToolBar(parent, SWT.NONE);
300
        toolItem = new ToolItem(toolBar, SWT.DROP_DOWN | SWT.BORDER);
301
        toolItem.setText("Distribution Status");
302
        toolItem.setToolTipText("Show Distribution Status for selected Areas");
303
        createToolbarItems();
304
        toolItem.addSelectionListener(dropListener);
305
        toolBar.pack();
306
    }
307

    
308
	private void createToolbarItems() {
309
		dropListener = new ChecklistDropdownSelectionListener(toolItem, this, terms);
310
        for (DefinedTermBase<DefinedTermBase> term : terms) {
311
            if(term!=null){
312
                dropListener.add(term);
313
            }
314
        }
315
	}
316

    
317
    private void createStatusBar(Composite composite) {
318
        GridData gridData = new GridData();
319
        gridData.horizontalSpan = 3;
320
        gridData.grabExcessHorizontalSpace = true;
321
        gridData.horizontalAlignment = GridData.FILL;
322

    
323
        statusLabel = new Label(composite, SWT.LEFT);
324
        statusLabel.setText("Anzahl der Elemente: " + (countNodes != null ? countNodes : "uknown"));
325
        statusLabel.setLayoutData(gridData);
326
    }
327

    
328
    private void createTable() {
329
        Table table = viewer.getTable();//new Table(parent, viewer.getTable().getStyle());
330
        List<String> titles = new ArrayList<String>();
331
        List<Integer> bounds = new ArrayList<Integer>();
332
        if (PreferencesUtil.isShowRankInChecklistEditor()){
333
            Collections.addAll(titles, "Taxon",  "Rank");
334
            Collections.addAll(bounds, 300, 200);
335
        } else{
336
            Collections.addAll(titles, "Taxon");
337
            Collections.addAll(bounds, 300);
338
        }
339

    
340

    
341
        Map<Integer, Boolean> restoreValuesForColumnWidth = restoreValuesForColumnWidth(titles, bounds);
342
        createInitalDistributionColumns(table, titles, bounds, restoreValuesForColumnWidth);
343
        table.setSortDirection(SWT.DOWN);
344
        table.setHeaderVisible(true);
345
        table.setLinesVisible(true);
346
	}
347
    /**
348
     * This method creates initially the distribution columns for a table. It should only be called for creation.<br>
349
     *<p>
350
     *
351
     *<b>Notice:</b> If you want to add additional columns later please use <b>addTableViewerColumn()</b>
352
     *
353
     * @param table
354
     * @param titles
355
     * @param bounds
356
     * @param restoreValuesForColumnWidth
357
     */
358
	private void createInitalDistributionColumns(Table table,
359
			List<String> titles, List<Integer> bounds, Map<Integer, Boolean> restoreValuesForColumnWidth) {
360
		for (int columnIndex = 0; columnIndex < titles.size(); columnIndex++) {
361
            TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
362
            column.getColumn().setText(titles.get(columnIndex));
363
            column.getColumn().setWidth(bounds.get(columnIndex));
364
            column.getColumn().setResizable(true);
365
            column.getColumn().setMoveable(true);
366
            column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), columnIndex));
367
            if (columnIndex == 0) {
368
                table.setSortColumn(column.getColumn());
369
            }
370
            if (columnIndex == 1 && PreferencesUtil.isShowRankInChecklistEditor()) {
371
            	/** uncommented it for now because no rank editing is wanted **/
372
//                column.setEditingSupport(new RankEditingSupport(viewer, this));
373
            }
374
            if ((columnIndex == 1 && !PreferencesUtil.isShowRankInChecklistEditor()) || columnIndex >= 2 ) {
375
                //read PrefrenceStore to setWidth according to last saved state
376
                if(restoreValuesForColumnWidth.get(columnIndex)){
377
                    column.getColumn().setWidth(50);
378
                }else{
379
                    column.getColumn().setWidth(50);
380
                }
381
                column.setEditingSupport(new DistributionEditingSupport(viewer, this, columnIndex));
382
            }
383
        }
384
	}
385

    
386
    /**
387
     * This methods loads the last opened distribution columns for the table viewer from the prefrence store.<br>
388
     *<p>
389
     * <b>Notice:</b> It adds also the TitleCache to the titles list for the header of each column.<p>
390
     *
391
     * @param titles
392
     * @param bounds
393
     * @return Map<Integer, Boolean>
394
     */
395
	private Map<Integer, Boolean> restoreValuesForColumnWidth(List<String> titles,
396
			List<Integer> bounds) {
397
		Map<Integer, Boolean> restoreColumnWidth = new HashMap<Integer, Boolean>();
398
		if (terms != null) {
399
		    int columnIndex;
400
		    if (PreferencesUtil.isShowRankInChecklistEditor()){
401
		        columnIndex = 2;
402
		    } else{
403
		        columnIndex = 1;
404
		    }
405
            for (DefinedTermBase<DefinedTermBase> term : terms) {
406
                if(term != null){
407
                    restoreColumnWidth.put(columnIndex, PreferencesUtil.getPreferenceStore().getBoolean(term.getUuid().toString()));
408
                    if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
409
                        if (term.getIdInVocabulary() != null){
410
                            titles.add(term.getIdInVocabulary());
411
                        } else{
412
                            titles.add(term.getTitleCache());
413
                        }
414
                    }else{
415
                        titles.add(term.getTitleCache());
416
                    }
417
                    bounds.add(200);
418
                    columnIndex++;
419
                }
420
            }
421
        }
422
		return restoreColumnWidth;
423
	}
424

    
425
    /**
426
     * This method adds new DistributionColumns to an existing table.
427
     *
428
     * @param title
429
     * @param bound
430
     * @param colNumber
431
     * @return
432
     */
433
    private TableViewerColumn addTableViewerColumn(String title, int bound, final int colNumber) {
434
        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
435
        final TableColumn column = viewerColumn.getColumn();
436
        column.setText(title);
437
        column.setWidth(200);
438
        viewerColumn.setEditingSupport(new DistributionEditingSupport(viewer, this, colNumber));
439
        column.setResizable(true);
440
        column.setMoveable(true);
441
        return viewerColumn;
442
      }
443

    
444

    
445

    
446
    /**
447
     *
448
     * pull data from database and set input for view
449
     *
450
     */
451
    private void loadDataInput() {
452
        Classification classification = checklistEditorInput.getClassification();
453
        TaxonNode taxonNode = checklistEditorInput.getTaxonNode();
454
        if (classification != null && taxonNode == null) {
455
            countNodes = taxonNodeService.countAllNodesForClassification(classification);
456
            statusLabel.setText("Anzahl der Elemente: " + (countNodes != null ? countNodes : "unknown"));
457
            // This should not kill the view nor the editor if something goes
458
            // wrong
459
            // TODO: don't load the whole taxonNode Object but rather a small
460
            // and simple Solution
461
            // FIXME: May be don't open classification which are greater than
462
            // 3000 Taxa
463
            selectedTaxonNodes = taxonNodeService.listAllNodesForClassification(classification, 0, countNodes);
464
            getService().schedule(new ChecklistJob("loading Taxa", selectedTaxonNodes), Job.LONG);
465
        }
466
        if (taxonNode != null) {
467
            selectedTaxonNodes = taxonNodeService.loadChildNodesOfTaxonNode(taxonNode, NODE_INIT_STRATEGY, true, null);
468
            getService().schedule(new ChecklistJob("loading Taxa", selectedTaxonNodes), Job.LONG);
469
        }
470
    }
471

    
472
    /** {@inheritDoc} */
473
    @Override
474
    public void dispose() {
475
        cdmEntitySession.dispose();
476
        super.dispose();
477
    }
478

    
479
    /** {@inheritDoc} */
480
    @Override
481
    public void setFocus() {
482
        cdmEntitySession.bind();
483
        viewer.getControl().setFocus();
484
    }
485

    
486
    /*
487
     * (non-Javadoc)
488
     *
489
     * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
490
     */
491
    /** {@inheritDoc} */
492
    @Override
493
    public void showBusy(boolean busy) {
494
        super.showBusy(busy);
495
        // viewer.getTable().setEnabled(!busy);
496
        if (busy) {
497
            partNameCache = getPartName();
498
            setPartName("Loading " + countNodes + " Taxa...");
499
        } else {
500
            if (partNameCache != null) {
501
                setPartName(partNameCache);
502
            }
503
        }
504
    }
505

    
506
    /**
507
     * <p>
508
     * Getter for the field <code>viewer</code>.
509
     * </p>
510
     *
511
     * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
512
     */
513
    public StructuredViewer getViewer() {
514
        return viewer;
515
    }
516

    
517
    public void refresh() {
518
        viewer.refresh();
519
    }
520

    
521
    /**
522
     * This method should only be called for adding new Distribution columns and reloading the table.<br>
523
     * It will hide the old distribution column and load the newly added columns.<br>
524
     * <p>
525
     * <b>Notice:</b> for data update please use <b>refresh()</b>
526
     *
527
     */
528
    @SuppressWarnings({ "unchecked", "rawtypes" })
529
	public void reload(){
530
    	//create new Items for Dropdown menue
531
    	Table table = viewer.getTable();
532
    	table.setRedraw(false);
533
    	SortedSet<DefinedTermBase> oldTerms = terms;
534

    
535
//    	if (PreferencesUtil.isShowIdInVocabularyInChecklistEditor()){
536
//
537
//    	} else{
538
//    	    terms = (SortedSet<DefinedTermBase>) labelProvider.getTermsOrderedByLabels(labelProvider.getNamedAreas(), CdmStore.getDefaultLanguage());
539
//    	}
540
    	SortedSet<DefinedTermBase> newTerms = labelProvider.getNamedAreas();
541
    	toolItem.removeSelectionListener(dropListener);
542
    	hideDistributionColumns(oldTerms);
543
    	createToolbarItems();
544
    	toolItem.addSelectionListener(dropListener);
545
    	for(DefinedTermBase term:newTerms){
546
    		int count = viewer.getTable().getColumnCount();
547
    		addTableViewerColumn(term.getTitleCache(), 200, count);
548
    		acitivateNewColumnInDropDownMenu(term);
549
    	}
550
        viewer.setLabelProvider(labelProvider);
551
        getService().schedule(new ChecklistJob("loading Taxa", selectedTaxonNodes), Job.LONG);
552
        table.setRedraw(true);
553
    	viewer.refresh();
554
    }
555

    
556
	private void acitivateNewColumnInDropDownMenu(DefinedTermBase term) {
557
		Menu menu = dropListener.getMenu();
558
		MenuItem[] items = menu.getItems();
559
		for(MenuItem item: items){
560
			if(item.getText().equalsIgnoreCase(term.getTitleCache())){
561
				item.setSelection(true);
562
				PreferencesUtil.getPreferenceStore().setValue(term.getUuid().toString(), true);
563
			}
564
		}
565
	}
566

    
567
	private void hideDistributionColumns(SortedSet<DefinedTermBase> oldTerms) {
568
		TableColumn[] columns = viewer.getTable().getColumns();
569
    	for(int i=4; i<columns.length; i++){
570
    		//remove all columns
571
    		columns[i].dispose();
572
    		Menu menu = dropListener.getMenu();
573
    		int itemCount = menu.getItemCount();
574
    		MenuItem item = menu.getItem(i-3);
575
    		item.setSelection(false);
576
    	}
577
    	if(oldTerms != null){
578
    		for(DefinedTermBase term : oldTerms){
579
    			PreferencesUtil.getPreferenceStore().setValue(term.getUuid().toString(), false);
580
    		}
581
    	}
582
	}
583

    
584
    /**
585
     * <p>
586
     * Getter for the field <code>service</code>.
587
     * </p>
588
     *
589
     * @return the service
590
     */
591
    public IWorkbenchSiteProgressService getService() {
592
        return service;
593
    }
594

    
595
    private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
596
        SelectionAdapter selectionAdapter = new SelectionAdapter() {
597
            @Override
598
            public void widgetSelected(SelectionEvent e) {
599
                comparator.setColumn(index);
600
                int dir = viewer.getTable().getSortDirection();
601
                if (viewer.getTable().getSortColumn() == column) {
602
                    dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
603
                } else {
604
                    dir = SWT.DOWN;
605
                }
606
                viewer.getTable().setSortDirection(dir);
607
                viewer.getTable().setSortColumn(column);
608
                viewer.refresh();
609
            }
610
        };
611
        return selectionAdapter;
612
    }
613

    
614
    @Override
615
    public void doSave(IProgressMonitor monitor) {
616
        try {
617
            monitor.beginTask("Saving Editor", 1);
618
            getConversationHolder().bind();
619
            getConversationHolder().commit(true);
620
            setDirty(false);
621
            monitor.worked(1);
622
        } finally {
623
            monitor.done();
624
        }
625

    
626
    }
627

    
628
    @Override
629
    public void doSaveAs() {
630
    }
631

    
632
    @Override
633
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
634
        setSite(site);
635
        setInput(input);
636
        if (input instanceof ChecklistEditorInput) {
637
            checklistEditorInput = (ChecklistEditorInput) input;
638
            setPartName(getPartName() + ": " + checklistEditorInput.getName());
639
            conversation = ((ChecklistEditorInput) input).getConversationHolder();
640
        }
641
        simpleSelectionProvider = new SimpleSelectionProvider();
642
        getSite().setSelectionProvider(simpleSelectionProvider);
643
    }
644

    
645
    @Override
646
    public boolean isSaveAsAllowed() {
647
        return false;
648
    }
649

    
650
    /*
651
     * (non-Javadoc)
652
     *
653
     * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.
654
     * IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
655
     */
656
    @Override
657
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
658
    }
659

    
660
    /*
661
     * (non-Javadoc)
662
     *
663
     * @see
664
     * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update
665
     * (eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
666
     */
667
    @Override
668
    public void update(CdmDataChangeMap changeEvents) {
669

    
670
    }
671

    
672
    /*
673
     * (non-Javadoc)
674
     *
675
     * @see
676
     * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
677
     * ()
678
     */
679
    @Override
680
    public ConversationHolder getConversationHolder() {
681
        return conversation;
682
    }
683

    
684
    /*
685
     * (non-Javadoc)
686
     *
687
     * @see
688
     * eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.
689
     * eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
690
     */
691

    
692
    @Override
693
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
694

    
695
    }
696

    
697
    /*
698
     * (non-Javadoc)
699
     *
700
     * @see
701
     * eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse
702
     * .ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
703
     */
704
    @Override
705
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
706
//        IStructuredSelection sel = (IStructuredSelection) this.viewer.getSelection();
707
//        if (sel.isEmpty()) {
708
//            return;
709
//        }
710
//        memento = memento.createChild("tree-selections");
711
//        Iterator iter = sel.iterator();
712
//        while (iter.hasNext()) {
713
//            String nodeName = (String) iter.next();
714
//            memento.createChild("selected-nodes", nodeName);
715
//        }
716
    }
717

    
718
    /*
719
     * (non-Javadoc)
720
     *
721
     * @see
722
     * eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse
723
     * .ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
724
     */
725
    @Override
726
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
727

    
728
    }
729

    
730
    /*
731
     * (non-Javadoc)
732
     *
733
     * @see
734
     * eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse
735
     * .core.runtime.IProgressMonitor)
736
     */
737
    @Override
738
    public void contextRefresh(IProgressMonitor monitor) {
739
    }
740

    
741
    /*
742
     * (non-Javadoc)
743
     *
744
     * @see
745
     * eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse
746
     * .ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
747
     */
748
    @Override
749
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
750
        conversation.clear();
751
        conversation.close();
752
        conversation = null;
753
    }
754

    
755
    private static final List<String> NODE_INIT_STRATEGY = Arrays.asList(new String[] { "descriptions",
756
            "descriptions.*", "description.state", "feature", "feature.*", "childNodes", "childNodes.taxon",
757
            "childNodes.taxon.name", "taxonNodes", "taxonNodes.*", "taxonNodes.taxon.*", "taxon.*",
758
            "taxon.descriptions", "taxon.sec", "taxon.name.*", "taxon.synonymRelations", "terms", "name.*",
759
            "name.rank.representations", "name.status.type.representations", "sources.$", "stateData.$" });
760

    
761
    /*
762
     * (non-Javadoc)
763
     *
764
     * @see
765
     * eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(
766
     * java.lang.Object)
767
     */
768
    @Override
769
    public void changed(Object element) {
770
        if (element != null) {
771
            viewer.update(element, null);
772
            setDirty(true);
773
            firePropertyChange(PROP_DIRTY);
774
        }
775
    }
776

    
777
    /* (non-Javadoc)
778
     * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
779
     */
780
    @Override
781
    public void forceDirty() {
782
        changed(null);
783
    }
784

    
785
    public void setDirty(boolean dirty) {
786
        this.dirty = dirty;
787
        firePropertyChange(PROP_DIRTY);
788
    }
789

    
790
    /*
791
     * (non-Javadoc)
792
     *
793
     * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
794
     */
795
    @Override
796
    public boolean isDirty() {
797
        return dirty;
798
    }
799

    
800
    /* (non-Javadoc)
801
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
802
     */
803
    @Override
804
    public ICdmEntitySession getCdmEntitySession() {
805
        // TODO Auto-generated method stub
806
        return null;
807
    }
808

    
809
    /* (non-Javadoc)
810
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
811
     */
812
    @Override
813
    public <T extends CdmBase> Collection<T> getRootEntities() {
814
        // TODO Auto-generated method stub
815
        return null;
816
    }
817

    
818
    /* (non-Javadoc)
819
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
820
     */
821
    @Override
822
    public Map<Object, List<String>> getPropertyPathsMap() {
823
        // TODO Auto-generated method stub
824
        return null;
825
    }
826

    
827
    /**
828
     * @return the labelProvider
829
     */
830
    public ChecklistLabelProvider getLabelProvider() {
831
        return labelProvider;
832
    }
833
}
(2-2/5)