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