Eclipseplugins
SubCheckView.java
1 package com.proalpha.pds.checks;
2 
3 import java.io.File;
4 import java.text.Collator;
5 import java.text.ParseException;
6 import java.text.SimpleDateFormat;
7 import java.util.Date;
8 import java.util.GregorianCalendar;
9 import java.util.Iterator;
10 import java.util.Locale;
11 
12 import javax.xml.datatype.XMLGregorianCalendar;
13 
14 import org.eclipse.core.filesystem.EFS;
15 import org.eclipse.core.filesystem.IFileStore;
16 import org.eclipse.core.resources.IProject;
17 import org.eclipse.core.resources.ResourcesPlugin;
18 import org.eclipse.jface.action.IToolBarManager;
19 import org.eclipse.jface.resource.ImageDescriptor;
20 import org.eclipse.jface.resource.JFaceResources;
21 import org.eclipse.jface.text.BadLocationException;
22 import org.eclipse.jface.text.IDocument;
23 import org.eclipse.jface.viewers.ArrayContentProvider;
24 import org.eclipse.jface.viewers.ColumnLabelProvider;
25 import org.eclipse.jface.viewers.ISelection;
26 import org.eclipse.jface.viewers.IStructuredSelection;
27 import org.eclipse.jface.viewers.TableViewer;
28 import org.eclipse.jface.viewers.TableViewerColumn;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.graphics.Image;
31 import org.eclipse.swt.graphics.Point;
32 import org.eclipse.swt.layout.GridData;
33 import org.eclipse.swt.layout.GridLayout;
34 import org.eclipse.swt.program.Program;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Event;
37 import org.eclipse.swt.widgets.Listener;
38 import org.eclipse.swt.widgets.Menu;
39 import org.eclipse.swt.widgets.MenuItem;
40 import org.eclipse.swt.widgets.Table;
41 import org.eclipse.swt.widgets.TableColumn;
42 import org.eclipse.swt.widgets.TableItem;
43 import org.eclipse.swt.widgets.Text;
44 import org.eclipse.ui.IEditorPart;
45 import org.eclipse.ui.ISelectionListener;
46 import org.eclipse.ui.IWorkbenchPage;
47 import org.eclipse.ui.IWorkbenchPart;
48 import org.eclipse.ui.PartInitException;
49 import org.eclipse.ui.PlatformUI;
50 import org.eclipse.ui.forms.events.HyperlinkEvent;
51 import org.eclipse.ui.forms.events.IHyperlinkListener;
52 import org.eclipse.ui.forms.widgets.ExpandableComposite;
53 import org.eclipse.ui.forms.widgets.Form;
54 import org.eclipse.ui.forms.widgets.FormToolkit;
55 import org.eclipse.ui.forms.widgets.Hyperlink;
56 import org.eclipse.ui.forms.widgets.Section;
57 import org.eclipse.ui.ide.IDE;
58 import org.eclipse.ui.part.ViewPart;
59 import org.eclipse.ui.texteditor.IDocumentProvider;
60 import org.eclipse.ui.texteditor.ITextEditor;
61 
62 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck;
63 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck.TtDSLogEntryRepos;
64 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck.TtDSLogEntrySrc;
65 import com.proalpha.pds.util.AddToCodeCheckedBy;
66 import com.proalpha.pds.util.SendCheckInfoEmail;
67 
68 public class SubCheckView extends ViewPart implements ISelectionListener {
69 
70  public static final String ID = "com.proalpha.pds.checks.SubCheckView";
71  private FormToolkit toolkit;
72  private Form form;
73  private Text lastUser;
74  private Text reported;
75  private Text objectID;
76  private Text line;
77  private Text module;
78  private Text description;
79  private TableViewer viewer;
80  private Text codeFragment;
81  private Hyperlink backgroundInfoUrl;
82  private ConsistencyChecksImageProvider imageProvider;
83  private String selectedProjectName;
84  private CheckFilter filter;
85  private Image mailImage;
86  private Image codecheckedbyImage;
87 
88  public SubCheckView() {
89  super();
90  imageProvider = new ConsistencyChecksImageProvider();
91  }
92 
93  @Override
94  public void dispose() {
95  if (mailImage != null)
96  mailImage.dispose();
97  if (codecheckedbyImage != null)
98  codecheckedbyImage.dispose();
99  super.dispose();
100  }
101 
102  private void clearDetailSection() {
103  setLastUser("");
104  setReported("");
105  setObjectID("");
106  setLine("");
107  setModule("");
108  setDescription("");
109  setCodeFragment("");
110  backgroundInfoUrl.setText("");
111  }
112 
113  private void clearTableSection() {
114  if (!viewer.getTable().isDisposed()) {
115  viewer.getTable().removeAll();
116  viewer.setInput(null);
117  viewer.refresh(true);
118 
119  setPartName("Consistency Subchecks");
120  setTitleImage(imageProvider.getDefaultImage());
121  }
122  }
123 
124  private void createDetailSection() {
125  Section sectionDetails = toolkit.createSection(form.getBody(),
126  ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE);
127  sectionDetails.setText("Details");
128 
129  GridLayout layout = new GridLayout();
130  layout.numColumns = 4;
131  sectionDetails.setLayout(layout);
132  sectionDetails.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
133  sectionDetails.setExpanded(true);
134 
135  Composite compositeDetails = toolkit.createComposite(sectionDetails);
136  compositeDetails.setLayout(layout);
137  sectionDetails.setClient(compositeDetails);
138 
139  toolkit.createLabel(compositeDetails, "Last User");
140  toolkit.createLabel(compositeDetails, "Reported");
141  toolkit.createLabel(compositeDetails, "Line");
142  toolkit.createLabel(compositeDetails, "Module");
143 
144  lastUser = toolkit.createText(compositeDetails, "");
145  lastUser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
146 
147  reported = toolkit.createText(compositeDetails, "");
148  reported.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
149 
150  line = toolkit.createText(compositeDetails, "");
151  line.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
152 
153  module = toolkit.createText(compositeDetails, "");
154  module.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
155 
156  toolkit.createLabel(compositeDetails, "URL");
157  toolkit.createLabel(compositeDetails, "");
158  toolkit.createLabel(compositeDetails, "");
159  toolkit.createLabel(compositeDetails, "");
160 
161  backgroundInfoUrl = toolkit.createHyperlink(compositeDetails, "", SWT.MULTI | SWT.WRAP);
162  backgroundInfoUrl.addHyperlinkListener(new IHyperlinkListener() {
163 
164  @Override
165  public void linkExited(HyperlinkEvent arg0) {
166  // Ignored
167  }
168 
169  @Override
170  public void linkEntered(HyperlinkEvent arg0) {
171  // Ignored
172  }
173 
174  @Override
175  public void linkActivated(HyperlinkEvent event) {
176  if (!event.getLabel().isEmpty()) {
177  Program.launch(event.getLabel());
178  }
179  }
180  });
181  GridData urlGridData = new GridData(GridData.FILL_BOTH);
182  urlGridData.horizontalSpan = 4;
183  backgroundInfoUrl.setLayoutData(urlGridData);
184 
185  toolkit.createLabel(compositeDetails, "Object");
186  toolkit.createLabel(compositeDetails, "Description");
187  toolkit.createLabel(compositeDetails, "Code Fragment");
188  toolkit.createLabel(compositeDetails, "");
189 
190  objectID = toolkit.createText(compositeDetails, "", SWT.MULTI | SWT.WRAP);
191  GridData objectIDData = new GridData();
192  objectIDData.horizontalSpan = 1;
193  objectIDData.heightHint = 100;
194  objectIDData.widthHint = 100;
195  objectIDData.horizontalAlignment = SWT.FILL;
196  objectID.setLayoutData(objectIDData);
197 
198  GridData descData = new GridData();
199  descData.horizontalSpan = 1;
200  descData.heightHint = 100;
201  descData.horizontalAlignment = SWT.FILL;
202 
203  description = toolkit.createText(compositeDetails, "", SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
204  description.setLayoutData(descData);
205 
206  codeFragment = toolkit.createText(compositeDetails, "", SWT.MULTI | SWT.V_SCROLL);
207 
208  GridData codeFragmentData = new GridData();
209  codeFragmentData.horizontalSpan = 2;
210  codeFragmentData.heightHint = 100;
211  codeFragmentData.horizontalAlignment = SWT.FILL;
212  codeFragment.setLayoutData(codeFragmentData);
213  codeFragment.setFont(JFaceResources.getFont("Courier New"));
214 
215  }
216 
217  @Override
218  public void createPartControl(Composite parent) {
219  toolkit = new FormToolkit(parent.getDisplay());
220  form = toolkit.createForm(parent);
221 
222  GridLayout formLayout = new GridLayout();
223  formLayout.numColumns = 1;
224  form.getBody().setLayout(formLayout);
225  form.getBody().setLayoutData(new GridData(GridData.FILL_BOTH));
226 
227  IToolBarManager toolBarMgr = getViewSite().getActionBars().getToolBarManager();
228  toolBarMgr.update(true);
229  createTableSection();
230  createDetailSection();
231 
232  getSite().setSelectionProvider(viewer);
233  getViewSite().getPage().addSelectionListener(this);
234 
235  }
236 
237  private void createTableSection() {
238  Section tableSection = toolkit.createSection(form.getBody(), ExpandableComposite.NO_TITLE);
239  tableSection.setExpanded(true);
240  tableSection.setLayout(new GridLayout());
241  GridData sectionTableData = new GridData(GridData.FILL_BOTH);
242  sectionTableData.minimumHeight = 100;
243  tableSection.setLayoutData(sectionTableData);
244  Composite compositeTable = toolkit.createComposite(tableSection);
245  compositeTable.setLayout(new GridLayout());
246  compositeTable.setLayoutData(new GridData(GridData.FILL_BOTH));
247  tableSection.setClient(compositeTable);
248  viewer = new TableViewer(compositeTable, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
249  Table table = viewer.getTable();
250  table.setHeaderVisible(true);
251  table.setLinesVisible(true);
252  GridData data = new GridData(GridData.FILL_BOTH);
253  data.grabExcessVerticalSpace = true;
254  table.setLayoutData(data);
255  configureTable(table);
256 
257  table.addListener(SWT.MouseDown, event -> {
258  TableItem item = table.getItem(new Point(event.x, event.y));
259  if (item == null) {
260  table.deselectAll();
261  clearDetailSection();
262  }
263  });
264 
265  addContextMenu(table);
266 
267  viewer.setContentProvider(new ArrayContentProvider());
268  viewer.addDoubleClickListener(event -> {
269  TableViewer source = (TableViewer) event.getSource();
270  IStructuredSelection selection = (IStructuredSelection) source.getSelection();
271  Object firstElement = selection.getFirstElement();
272 
273  if (firstElement instanceof TtDSLogEntrySrc && selectedProjectName != null) {
274  IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject(selectedProjectName);
275  if (selectedProject != null) {
276  File projectFile = selectedProject.getRawLocation().makeAbsolute().toFile();
277  String sourceFileName = ((TtDSLogEntrySrc) firstElement).getSourceFileName();
278  File fileToOpen = searchFile(new File(projectFile.toPath().toAbsolutePath() + "\\src"),
279  sourceFileName);
280 
281  if (fileToOpen != null && fileToOpen.isFile()) {
282  int lineToJump = ((TtDSLogEntrySrc) firstElement).getSourceFileLine() - 1;
283  openFileInEditor(lineToJump, fileToOpen);
284  }
285  }
286  }
287  });
288 
289  viewer.addSelectionChangedListener(event -> {
290  ISelection selection = event.getSelection();
291  if (selection instanceof IStructuredSelection) {
292  updateDetailSection(((IStructuredSelection) selection).getFirstElement());
293  }
294  });
295 
296  filter = new CheckFilter();
297  viewer.addFilter(filter);
298  }
299 
300  private void openFileInEditor(int lineToJump, File fileToOpen) {
301  try {
302  IFileStore fileStore = EFS.getLocalFileSystem().getStore(fileToOpen.toURI());
303  IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
304  IEditorPart editor = IDE.openEditorOnFileStore(page, fileStore);
305 
306  if (editor instanceof ITextEditor) {
307  IDocumentProvider provider = ((ITextEditor) editor).getDocumentProvider();
308  IDocument document = provider.getDocument(editor.getEditorInput());
309 
310  int start = 0;
311  if (lineToJump < 0)
312  lineToJump = 0;
313  start = document.getLineOffset(lineToJump);
314  ((ITextEditor) editor).selectAndReveal(start, 0);
315  }
316  } catch (PartInitException | BadLocationException e) {
317  e.printStackTrace();
318  }
319  }
320 
321  private MenuItem addContextMenu(Table table) {
322  Menu tableContextMenu = new Menu(table);
323  table.setMenu(tableContextMenu);
324 
325  MenuItem sendAsMailMenuItem = new MenuItem(tableContextMenu, SWT.NONE);
326  sendAsMailMenuItem.setText("Send as Mail");
327  mailImage = ImageDescriptor.createFromURL(getClass().getResource("/images/mail.png")).createImage();
328  sendAsMailMenuItem.setImage(mailImage);
329 
330  MenuItem addToCodeCheckedBy = new MenuItem(tableContextMenu, SWT.NONE);
331  addToCodeCheckedBy.setText("Add to codecheckedby.xml");
332  codecheckedbyImage = ImageDescriptor.createFromURL(getClass().getResource("/images/bug_green.png"))
333  .createImage();
334  addToCodeCheckedBy.setImage(codecheckedbyImage);
335 
336  sendAsMailMenuItem.addListener(SWT.Selection, event -> {
337  SendCheckInfoEmail mail = new SendCheckInfoEmail();
338  mail.send(viewer.getSelection(), selectedProjectName != null ? selectedProjectName : "Unknown project");
339  });
340 
341  addToCodeCheckedBy.addListener(SWT.Selection, event -> {
342  AddToCodeCheckedBy addToCCB = new AddToCodeCheckedBy();
343  addToCCB.add(viewer.getSelection(), selectedProjectName);
344  });
345 
346  table.addListener(SWT.MenuDetect, event -> {
347  if (table.getSelectionCount() <= 0) {
348  event.doit = false;
349  } else {
350  Iterator<?> it = ((IStructuredSelection) viewer.getSelection()).iterator();
351  Object object;
352  while (it.hasNext()) {
353  object = it.next();
354  if (object instanceof TtDSLogEntryRepos) {
355  addToCodeCheckedBy.setEnabled(true);
356  break;
357  } else
358  addToCodeCheckedBy.setEnabled(false);
359  }
360  }
361  });
362 
363  return addToCodeCheckedBy;
364  }
365 
366  private File searchFile(File file, String search) {
367  if (file.isDirectory()) {
368  File[] arr = file.listFiles();
369  for (File f : arr) {
370  File found = searchFile(f, search);
371  if (found != null)
372  return found;
373  }
374  } else {
375  if (file.getName().equals(search)) {
376  return file;
377  }
378  }
379  return null;
380  }
381 
382  private void configureTable(Table table) {
383  createLastUserColum(table);
384  createReportedColumn(table);
385  createObjectColumn(table);
386  createLineColumn(table);
387  createModuleColumn(table);
388  createDescriptionColumn(table);
389  }
390 
391  private void createObjectColumn(Table table) {
392  TableColumn objectColumn = createTableColumn(table, "Object");
393  TableViewerColumn objectViewerColumn = new TableViewerColumn(viewer, objectColumn);
394  objectViewerColumn.setLabelProvider(new ColumnLabelProvider() {
395  @Override
396  public String getText(Object element) {
397  String resultText = super.getText(element);
398  if (element instanceof TtDSLogEntrySrc) {
399  resultText = ((TtDSLogEntrySrc) element).getSourceFileName();
400  } else if (element instanceof TtDSLogEntryRepos) {
401  resultText = ((TtDSLogEntryRepos) element).getOwningID();
402  }
403  return resultText;
404  }
405  });
406  objectColumn.addListener(SWT.Selection, createSortListener(table));
407  }
408 
409  private void createLineColumn(Table table) {
410  TableColumn lineColumn = createTableColumn(table, "Line");
411  TableViewerColumn lineViewerColumn = new TableViewerColumn(viewer, lineColumn);
412  lineViewerColumn.setLabelProvider(new ColumnLabelProvider() {
413  @Override
414  public String getText(Object element) {
415  String resultText = super.getText(element);
416  if (element instanceof TtDSLogEntrySrc) {
417  resultText = String.valueOf(((TtDSLogEntrySrc) element).getSourceFileLine());
418  } else if (element instanceof TtDSLogEntryRepos) {
419  resultText = "";
420  }
421  return resultText;
422  }
423  });
424  lineColumn.addListener(SWT.Selection, createSortIntListener(table));
425  }
426 
427  private void createModuleColumn(Table table) {
428  TableColumn moduleColumn = createTableColumn(table, "Module");
429  TableViewerColumn moduleViewerColumn = new TableViewerColumn(viewer, moduleColumn);
430  moduleViewerColumn.setLabelProvider(new ColumnLabelProvider() {
431  @Override
432  public String getText(Object element) {
433  String resultText = super.getText(element);
434  if (element instanceof TtDSLogEntrySrc) {
435  resultText = ((TtDSLogEntrySrc) element).getModule();
436  } else if (element instanceof TtDSLogEntryRepos) {
437  resultText = ((TtDSLogEntryRepos) element).getModule();
438  }
439  return resultText;
440  }
441  });
442  moduleColumn.addListener(SWT.Selection, createSortListener(table));
443  }
444 
445  private void createDescriptionColumn(Table table) {
446  TableColumn descriptionColumn = createTableColumn(table, "Description");
447  TableViewerColumn descriptionViewerColumn = new TableViewerColumn(viewer, descriptionColumn);
448  descriptionViewerColumn.setLabelProvider(new ColumnLabelProvider() {
449  @Override
450  public String getText(Object element) {
451  String resultText = super.getText(element);
452  if (element instanceof TtDSLogEntrySrc) {
453  resultText = ((TtDSLogEntrySrc) element).getLogEntryDescription();
454  } else if (element instanceof TtDSLogEntryRepos) {
455  resultText = ((TtDSLogEntryRepos) element).getLogEntryDescription();
456  }
457  return resultText;
458  }
459  });
460  descriptionColumn.addListener(SWT.Selection, createSortListener(table));
461  }
462 
463  private void createReportedColumn(Table table) {
464  TableColumn reportedColumn = createTableColumn(table, "Reported");
465  TableViewerColumn reportedViewerColumn = new TableViewerColumn(viewer, reportedColumn);
466  reportedViewerColumn.setLabelProvider(new ColumnLabelProvider() {
467  @Override
468  public String getText(Object element) {
469  String resultText = super.getText(element);
470  SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
471  GregorianCalendar calendar = null;
472 
473  if (element instanceof TtDSLogEntrySrc) {
474  calendar = ((TtDSLogEntrySrc) element).getReportedFirst().toGregorianCalendar();
475  } else if (element instanceof TtDSLogEntryRepos) {
476  calendar = ((TtDSLogEntryRepos) element).getReportedFirst().toGregorianCalendar();
477  }
478  if (calendar != null) {
479  dateFormat.setTimeZone(calendar.getTimeZone());
480  resultText = dateFormat.format(calendar.getTime());
481  }
482  return resultText;
483  }
484  });
485  reportedColumn.addListener(SWT.Selection, createSortDateListener(table));
486  }
487 
488  private void createLastUserColum(Table table) {
489  TableColumn lastUserColumn = createTableColumn(table, "Last User");
490  TableViewerColumn lastUserViewerColumn = new TableViewerColumn(viewer, lastUserColumn);
491  lastUserViewerColumn.setLabelProvider(new ColumnLabelProvider() {
492  @Override
493  public String getText(Object element) {
494  String resultText = super.getText(element);
495  if (element instanceof TtDSLogEntrySrc) {
496  resultText = ((TtDSLogEntrySrc) element).getLastUser();
497  } else if (element instanceof TtDSLogEntryRepos) {
498  resultText = ((TtDSLogEntryRepos) element).getLastUser();
499  }
500  return resultText;
501  }
502  });
503  lastUserColumn.addListener(SWT.Selection, createSortListener(table));
504  }
505 
506  private Listener createSortListener(final Table table) {
507  return new Listener() {
508  public void handleEvent(Event e) {
509  TableItem[] items = table.getItems();
510  TableColumn column = (TableColumn) e.widget;
511 
512  int direction = getSortDirection(table, column);
513  int index = getColumnIndex(table, column);
514 
515  if (index >= 0) {
516  Collator collator = Collator.getInstance(Locale.getDefault());
517  for (int i = 0; i < items.length; i++) {
518  String value1 = items[i].getText(index);
519  for (int j = 0; j < i; j++) {
520  String value2 = items[j].getText(index);
521  if (collator.compare(value1, value2) * direction <= 0) {
522  String[] itemValues = { items[i].getText(0), items[i].getText(1), items[i].getText(2),
523  items[i].getText(3), items[i].getText(4), items[i].getText(5) };
524  Object itemData = items[i].getData();
525  items[i].dispose();
526  TableItem item = new TableItem(table, SWT.NONE, j);
527  item.setText(itemValues);
528  item.setData(itemData);
529  items = table.getItems();
530  break;
531  }
532  }
533  }
534  }
535  }
536 
537  private int getColumnIndex(Table table, TableColumn column) {
538  int index = 0;
539  for (TableColumn tableColumn : table.getColumns()) {
540 
541  if (tableColumn.getText().equals(column.getText())) {
542  return index;
543  }
544  index++;
545  }
546  return -1;
547  }
548  };
549  }
550 
551  private Listener createSortDateListener(final Table table) {
552  return new Listener() {
553  public void handleEvent(Event e) {
554  TableItem[] items = table.getItems();
555  TableColumn column = (TableColumn) e.widget;
556 
557  int direction = getSortDirection(table, column);
558  int index = table.indexOf(column);
559 
560  if (index >= 0) {
561  SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
562  for (int i = 0; i < items.length; i++) {
563  Date value1;
564  try {
565  value1 = dateFormatter.parse(items[i].getText(index));
566  } catch (ParseException e1) {
567  value1 = new Date();
568  }
569  for (int j = 0; j < i; j++) {
570  Date value2;
571  try {
572  value2 = dateFormatter.parse(items[j].getText(index));
573  } catch (ParseException e1) {
574  value2 = new Date();
575  }
576  if (value1.compareTo(value2) * direction <= 0) {
577  String[] itemValues = { items[i].getText(0), items[i].getText(1), items[i].getText(2),
578  items[i].getText(3), items[i].getText(4), items[i].getText(5) };
579  Object itemData = items[i].getData();
580  items[i].dispose();
581  TableItem item = new TableItem(table, SWT.NONE, j);
582  item.setText(itemValues);
583  item.setData(itemData);
584  items = table.getItems();
585  break;
586  }
587  }
588  }
589  }
590  }
591  };
592  }
593 
594  private Listener createSortIntListener(final Table table) {
595  return new Listener() {
596  public void handleEvent(Event e) {
597  TableItem[] items = table.getItems();
598  TableColumn column = (TableColumn) e.widget;
599 
600  int direction = getSortDirection(table, column);
601  int index = table.indexOf(column);
602 
603  if (index >= 0) {
604 
605  for (int i = 0; i < items.length; i++) {
606  int value1 = Integer.parseInt(items[i].getText(index));
607  for (int j = 0; j < i; j++) {
608  int value2 = Integer.parseInt(items[j].getText(index));
609  if (Integer.compare(value1, value2) * direction <= 0) {
610  String[] itemValues = { items[i].getText(0), items[i].getText(1), items[i].getText(2),
611  items[i].getText(3), items[i].getText(4), items[i].getText(5) };
612  Object itemData = items[i].getData();
613  items[i].dispose();
614  TableItem item = new TableItem(table, SWT.NONE, j);
615  item.setText(itemValues);
616  item.setData(itemData);
617  items = table.getItems();
618  break;
619  }
620  }
621  }
622  }
623  }
624  };
625  }
626 
627  private int getSortDirection(Table table, TableColumn column) {
628  table.setSortColumn(column);
629  int direction = table.getSortDirection();
630  if (direction == SWT.UP) {
631  table.setSortDirection(SWT.DOWN);
632  direction = -1;
633  } else if (direction == SWT.DOWN) {
634  table.setSortDirection(SWT.NONE);
635  direction = 0;
636  } else {
637  table.setSortDirection(SWT.UP);
638  direction = 1;
639  }
640  return direction;
641  }
642 
643  private TableColumn createTableColumn(Table table, String header) {
644  TableColumn column = new TableColumn(table, SWT.NONE);
645  column.setText(header);
646  column.setWidth(100);
647  column.setResizable(true);
648  return column;
649  }
650 
651  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
652  if (part != null && selection != null) {
653  if ((!(part instanceof CheckTreeView)) || (viewer.getTable().isDisposed())) {
654  if (!selection.isEmpty() && (selection instanceof IStructuredSelection)) {
655  IStructuredSelection structuredSelection = ((IStructuredSelection) selection);
656  if (structuredSelection.size() > 1) {
657  clearDetailSection();
658  }
659  }
660  return;
661  }
662 
663  clearDetailSection();
664  clearTableSection();
665 
666  if (!selection.isEmpty() && (selection instanceof IStructuredSelection)) {
667  if (part instanceof CheckTreeView) {
668  selectedProjectName = ((CheckTreeView) part).getSelectedProject();
669  filter.setSearchFilter(((CheckTreeView) part).getCurrentTeam(),
670  ((CheckTreeView) part).getCurrentModule());
671  }
672 
673  IStructuredSelection structuredSelection = ((IStructuredSelection) selection);
674  Object firstSelectedElement = structuredSelection.getFirstElement();
675  if (firstSelectedElement instanceof TtDSSubCheck) {
676  updateTableSection((TtDSSubCheck) firstSelectedElement);
677  } else if ((firstSelectedElement instanceof TtDSLogEntrySrc)
678  || (firstSelectedElement instanceof TtDSLogEntryRepos)) {
679  updateDetailSection(firstSelectedElement);
680  }
681  }
682  }
683  }
684 
685  private void updateTableSection(TtDSSubCheck subcheck) {
686  Boolean hasInput = Boolean.FALSE;
687  Object viewerInput = null;
688 
689  if (!subcheck.getTtDSLogEntrySrc().isEmpty()) {
690  viewerInput = subcheck.getTtDSLogEntrySrc().toArray();
691  hasInput = Boolean.TRUE;
692  } else if (!subcheck.getTtDSLogEntryRepos().isEmpty()) {
693  viewerInput = subcheck.getTtDSLogEntryRepos();
694  hasInput = Boolean.TRUE;
695  }
696 
697  if (Boolean.TRUE.equals(hasInput)) {
698 
699  viewer.getTable().removeAll();
700  viewer.setInput(viewerInput);
701  viewer.refresh(true);
702 
703  for (TableColumn column : viewer.getTable().getColumns())
704  column.pack();
705 
706  setUrl(subcheck.getBackgroundInfoURL());
707  setPartName(subcheck.getDSSubCheckID());
708  setTitleImage(imageProvider.getImage(subcheck));
709  }
710  }
711 
712  private void setUrl(String url) {
713  backgroundInfoUrl.setText((url != null) ? url : "");
714 
715  }
716 
717  private void setDescription(String text) {
718  description.setText((text != null) ? text : "");
719  }
720 
721  @Override
722  public void setFocus() {
723  // ignored
724  }
725 
726  private void setLastUser(String text) {
727  lastUser.setText((text != null) ? text : "");
728  }
729 
730  private void setLine(String text) {
731  line.setText((text != null) ? text : "");
732  }
733 
734  private void setCodeFragment(String text) {
735  codeFragment.setText((text != null) ? text : "");
736  }
737 
738  private void setModule(String text) {
739  module.setText((text != null) ? text : "");
740  }
741 
742  private void setLogEntryReposDetails(TtDSLogEntryRepos entryRepos) {
743  setLastUser(entryRepos.getLastUser());
744  setReported(entryRepos.getReportedFirst());
745  setObjectID(entryRepos.getOwningID().replace(", ", ",\n"));
746  setLine("");
747  setModule(entryRepos.getModule());
748  setDescription(entryRepos.getLogEntryDescription());
749  setCodeFragment("");
750  }
751 
752  private void setLogEntrySrcDetails(TtDSLogEntrySrc entrySrc) {
753  setLastUser(entrySrc.getLastUser());
754  setReported(entrySrc.getReportedFirst());
755  setObjectID(entrySrc.getSourceFileName());
756  setLine(String.valueOf(entrySrc.getSourceFileLine()));
757  setModule(entrySrc.getModule());
758  setDescription(entrySrc.getLogEntryDescription());
759  setCodeFragment(entrySrc.getStatement());
760  }
761 
762  private void setObjectID(String text) {
763  objectID.setText((text != null) ? text : "");
764  }
765 
766  private void setReported(String text) {
767  reported.setText((text != null) ? text : "");
768  }
769 
770  private void setReported(XMLGregorianCalendar calendar) {
771  if (calendar != null) {
772  setReported(calendar.getDay() + "." + calendar.getMonth() + "." + calendar.getYear());
773  } else {
774  setReported("");
775  }
776  }
777 
778  private void updateDetailSection(Object entry) {
779  if (entry instanceof TtDSLogEntrySrc) {
780  setLogEntrySrcDetails((TtDSLogEntrySrc) entry);
781  } else if (entry instanceof TtDSLogEntryRepos) {
782  setLogEntryReposDetails((TtDSLogEntryRepos) entry);
783  } else {
784  clearDetailSection();
785  }
786  }
787 }