8f48fb32a96c55931ed753e03fc5529aeb99c0d1
[taxeditor.git] / taxeditor-bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / referencingobjects / ReferencingObjectsView.java
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.bulkeditor.referencingobjects;
12
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.List;
17 import java.util.Set;
18
19 import org.apache.log4j.Logger;
20 import org.eclipse.core.runtime.IProgressMonitor;
21 import org.eclipse.core.runtime.IStatus;
22 import org.eclipse.core.runtime.Status;
23 import org.eclipse.core.runtime.jobs.Job;
24 import org.eclipse.jface.viewers.ISelection;
25 import org.eclipse.jface.viewers.IStructuredSelection;
26 import org.eclipse.jface.viewers.TableViewer;
27 import org.eclipse.jface.viewers.TableViewerColumn;
28 import org.eclipse.jface.viewers.Viewer;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.widgets.Composite;
31 import org.eclipse.swt.widgets.Display;
32 import org.eclipse.swt.widgets.Table;
33 import org.eclipse.ui.ISelectionListener;
34 import org.eclipse.ui.IWorkbenchPart;
35
36 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
37 import eu.etaxonomy.cdm.api.service.ICommonService;
38 import eu.etaxonomy.cdm.model.common.CdmBase;
39 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
40 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
41 import eu.etaxonomy.taxeditor.model.AbstractCdmViewPart;
42 import eu.etaxonomy.taxeditor.model.DescriptionHelper;
43 import eu.etaxonomy.taxeditor.model.LineSelection;
44 import eu.etaxonomy.taxeditor.store.CdmStore;
45
46 /**
47 * <p>ReferencingObjectsView class.</p>
48 *
49 * @author p.ciardelli
50 * @created 08.07.2009
51 * @version 1.0
52 */
53 public class ReferencingObjectsView extends AbstractCdmViewPart implements ISelectionListener{
54 private static final Logger logger = Logger
55 .getLogger(ReferencingObjectsView.class);
56
57 /** Constant <code>ID="eu.etaxonomy.taxeditor.bulkeditor.refer"{trunked}</code> */
58 public static final String ID = "eu.etaxonomy.taxeditor.bulkeditor.referencingobjectsview";
59
60 private TableViewer viewer;
61
62 private CdmBase referencedObject;
63
64 /* (non-Javadoc)
65 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#createViewer(org.eclipse.swt.widgets.Composite)
66 */
67 /** {@inheritDoc} */
68 @Override
69 public void createViewer(Composite parent) {
70 selectionService.addSelectionListener(this);
71
72 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
73 | SWT.V_SCROLL | SWT.FULL_SELECTION);
74 createColumns(viewer);
75 viewer.setContentProvider(new ReferencingObjectsContentProvider());
76 viewer.setLabelProvider(new ReferencingObjectsLabelProvider());
77 // viewer.setInput(new ArrayList<CdmBase>());
78 }
79
80 /**
81 * Create the columns for the table
82 * @param viewer
83 */
84 private void createColumns(TableViewer viewer) {
85 Table table = viewer.getTable();
86 String[] titles = {"Class", "Description", "UUID", "Object ID" };
87 int[] bounds = { 100, 200, 100, 70};
88
89 for (int i = 0; i < titles.length; i++) {
90 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
91 column.getColumn().setText(titles[i]);
92 column.getColumn().setWidth(bounds[i]);
93 column.getColumn().setResizable(true);
94 column.getColumn().setMoveable(true);
95 }
96 table.setHeaderVisible(true);
97 table.setLinesVisible(true);
98 }
99
100 /**
101 * <p>updateReferencingObjects</p>
102 *
103 * @param entity a {@link eu.etaxonomy.cdm.model.common.IdentifiableEntity} object.
104 */
105 public void updateReferencingObjects(final IdentifiableEntity entity) {
106
107 final Display display = Display.getCurrent();
108
109 Job job = new Job("Update Referencing Objects") {
110
111 @Override
112 protected IStatus run(IProgressMonitor monitor) {
113 monitor.beginTask("Calculating referencing objects", 10);
114
115 monitor.worked(3);
116
117 display.asyncExec(new Runnable() {
118
119 @Override
120 public void run() {
121 ConversationHolder conversation = CdmStore.createConversation();
122 List<CdmBase> referencingObjects = getReferencingObjects(entity);
123 updateView(referencingObjects);
124 conversation.close();
125 }
126 });
127
128 monitor.done();
129
130
131 return Status.OK_STATUS;
132 }
133 };
134
135 job.setPriority(Job.DECORATE);
136 job.schedule();
137 }
138
139 private List<CdmBase> getReferencingObjects(Object entity) {
140 try {
141 if(entity instanceof CdmBase){
142 referencedObject = (CdmBase) entity;
143 Set<CdmBase> setOfReferencingObjects = CdmStore.getService(ICommonService.class).getReferencingObjects(referencedObject);
144
145 List<CdmBase> referencingObjects = new ArrayList<CdmBase>(setOfReferencingObjects);
146
147 Collections.sort(referencingObjects, new ReferencingClassComparator());
148
149 return referencingObjects;
150 }
151 } catch (Exception e) {
152 logger.error("Error retrieving referencing objects", e);
153 }
154 return null;
155 }
156
157 class ReferencingClassComparator implements Comparator<CdmBase> {
158
159 /* (non-Javadoc)
160 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
161 */
162 public int compare(CdmBase o1, CdmBase o2) {
163 String string1 = o1.getClass().getSimpleName();
164 String string2 = o2.getClass().getSimpleName();
165 int classCompare = string1.compareToIgnoreCase(string2);
166 if (classCompare == 0) {
167 string1 = DescriptionHelper.getObjectDescription(o1);
168 string2 = DescriptionHelper.getObjectDescription(o2);
169 return string1.compareToIgnoreCase(string2);
170 } else {
171 return classCompare;
172 }
173 }
174 }
175
176 /**
177 *
178 */
179 private void updateView(List<CdmBase> referencingObjects) {
180 viewer.setInput(referencingObjects);
181 setContentDescription("'" + referencedObject + "' is referenced by:");
182 showViewer();
183 }
184
185 /** {@inheritDoc} */
186 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
187 if(! (part instanceof BulkEditor)){
188 setContentDescription("");
189 showEmptyPage();
190 return;
191 }
192
193 if(! (selection instanceof LineSelection)){
194 return;
195 }
196 LineSelection lineSelection = (LineSelection) selection;
197
198 if(lineSelection.size() != 1){
199 return;
200 }
201
202 if(! (lineSelection.getFirstElement() instanceof IdentifiableEntity)){
203 return;
204 }
205
206 showViewer(part, lineSelection);
207 }
208
209 /* (non-Javadoc)
210 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#showViewer(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
211 */
212 /** {@inheritDoc} */
213 @Override
214 public void showViewer(IWorkbenchPart part, ISelection selection) {
215 this.part = part;
216
217 IStructuredSelection structuredSelection = (IStructuredSelection) selection;
218
219 updateReferencingObjects((IdentifiableEntity) structuredSelection.getFirstElement());
220 }
221
222 /** {@inheritDoc} */
223 @Override
224 public void dispose() {
225 selectionService.removePostSelectionListener(this);
226 selectionService.removeSelectionListener(this);
227 super.dispose();
228 }
229
230 /* (non-Javadoc)
231 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getViewer()
232 */
233 /** {@inheritDoc} */
234 @Override
235 public Viewer getViewer() {
236 return viewer;
237 }
238
239 /* (non-Javadoc)
240 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#dirtyStateChanged()
241 */
242 /** {@inheritDoc} */
243 @Override
244 public void changed(Object object) {
245 // no editing in this view
246 }
247
248 /* (non-Javadoc)
249 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#onComplete()
250 */
251 /** {@inheritDoc} */
252 @Override
253 public boolean onComplete() {
254 return false;
255 }
256 }