1 6 package de.uka.ipd.coverage.plugin.ui; 7 8 import java.util.*; 9 import java.util.List ; 10 11 import org.eclipse.core.resources.IMarker; 12 import org.eclipse.core.resources.ResourcesPlugin; 13 import org.eclipse.core.runtime.CoreException; 14 import org.eclipse.jface.action.*; 15 import org.eclipse.jface.resource.ImageDescriptor; 16 import org.eclipse.jface.viewers.*; 17 import org.eclipse.swt.SWT; 18 import org.eclipse.swt.graphics.Image; 19 import org.eclipse.swt.layout.FillLayout; 20 import org.eclipse.swt.widgets.*; 21 import org.eclipse.ui.*; 22 import org.eclipse.ui.actions.SelectionProviderAction; 23 import org.eclipse.ui.model.IWorkbenchAdapter; 24 import org.eclipse.ui.part.ViewPart; 25 import org.eclipse.ui.progress.IWorkbenchSiteProgressService; 26 27 import de.uka.ipd.coverage.plugin.CoveragePlugin; 28 import de.uka.ipd.coverage.utils.Logger; 29 30 34 public class CoverageMarkerView extends ViewPart implements MarkerListener { 35 36 private Logger logger = new Logger(this); 37 private CoverageMarkerManager markerManager = CoveragePlugin.getDefault().getMarkerManager(); 38 39 private class MListContentProvider implements IStructuredContentProvider { 40 41 public Object [] getElements(Object inputElement) { 42 return CoveragePlugin.getDefault().getMarkerManager().getPrimaryMarkers(); 43 } 44 45 public void dispose() { 46 markerManager.removeMarkerListener(CoverageMarkerView.this); 47 } 48 49 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 50 logger.info("implement me: inputChanged()"); } 52 53 public void setSorter(TableSorter newSorter) { 54 logger.info("should set sorter!!"); } 56 57 } 58 59 private class MListLabelProvider implements ITableLabelProvider { 60 61 private List labelProviderListenerList = new ArrayList(); 62 63 private Image getImage(Object element) { 64 IMarker marker = (IMarker) element; 65 IWorkbenchAdapter wa = (IWorkbenchAdapter) marker.getAdapter(IWorkbenchAdapter.class); 66 ImageDescriptor id = wa.getImageDescriptor(element); 67 if (id != null) { 68 return id.createImage(); 69 } 70 return null; 71 } 72 73 public Image getColumnImage(Object element, int columnIndex) { 74 if (columnIndex == 0) { 75 return getImage(element); 76 } else { 77 return null; 78 } 79 } 80 81 public String getColumnText(Object element, int columnIndex) { 82 return getFields()[columnIndex].getValue(element); 83 } 84 85 public void addListener(ILabelProviderListener listener) { 86 if (!labelProviderListenerList.contains(listener)) { 87 labelProviderListenerList.add(listener); 88 } 89 } 90 91 public void dispose() { 92 } 94 95 public boolean isLabelProperty(Object element, String property) { 96 return false; 97 } 98 99 public void removeListener(ILabelProviderListener listener) { 100 labelProviderListenerList.remove(listener); 101 } 102 } 103 104 public void markersChanged(CoverageMarkerManager source) { 105 runInDisplayThread(new Runnable () { 106 public void run() { 107 viewer.refresh(); 108 } 109 }); 110 } 111 112 public void markersAdded(final IMarker[] markers) { 113 runInDisplayThread(new Runnable () { 114 public void run() { 115 viewer.add(markers); 116 } 117 }); 118 } 119 120 private void runInDisplayThread(Runnable runnable) { 121 Display display = this.viewer.getControl().getDisplay(); 122 if(!display.isDisposed()) { 123 display.syncExec(runnable); 124 } 125 } 126 127 128 129 private MListContentProvider content; 130 131 private static final String TAG_COLUMN_WIDTH = "columnWidth"; private static final String TAG_VERTICAL_POSITION = "verticalPosition"; private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition"; 135 public static final String SORT_ACTION_ID = "sort"; public static final String FILTERS_ACTION_ID = "filters"; 138 private final static IField[] VISIBLE_FIELDS = { 139 new FieldCoverageState(), 140 new FieldMessage(), 141 new FieldLine(), 142 new FieldCoveredUses(), 143 new FieldUncoveredUses(), 144 new FieldResource(), 145 }; 146 147 private final static ColumnLayoutData[] DEFAULT_COLUMN_LAYOUTS = { 148 new ColumnPixelData(19, false), 149 new ColumnWeightData(200), 150 new ColumnWeightData(20), 151 new ColumnWeightData(100), 152 new ColumnWeightData(100), 153 new ColumnWeightData(60) 154 }; 155 156 private TableViewer viewer; 157 private IMemento memento; 158 protected ColumnLayoutData[] columnLayouts; 159 160 protected SelectionProviderAction openAction; 161 162 private Map actions = new HashMap(); 163 private ISelectionProvider selectionProvider = new SelectionProviderAdapter(); 164 165 private TableSorter sorter; 166 167 170 public void init(IViewSite site, IMemento memento) throws PartInitException { 171 super.init(site, memento); 172 this.memento = memento; 173 } 174 175 191 protected void viewerSelectionChanged(IStructuredSelection selection) { 192 Object [] rawSelection = selection.toArray(); 193 IMarker[] markers = new IMarker[rawSelection.length]; 194 for (int idx = 0; idx < rawSelection.length; idx++) { 195 markers[idx] = ((IMarker)rawSelection[idx]); 196 } 197 setSelection(new StructuredSelection(markers)); 198 updateStatusMessage(selection); 199 } 200 201 216 protected void updateStatusMessage(IStructuredSelection selection) { 217 String message = ""; 219 if (selection == null || selection.size() == 0){ 220 message = updateSummaryVisible(); 222 } else if (selection.size() == 1) { 223 IMarker marker = (IMarker)selection.getFirstElement(); 225 try { 226 message = (String ) marker.getAttribute("message"); } catch (CoreException e) { 228 logger.log(e); 229 e.printStackTrace(); 230 } 231 } else if (selection.size() > 1) { 232 message = updateSummaryVisible(); 234 } 235 getViewSite().getActionBars().getStatusLineManager().setMessage(message); 236 } 237 238 239 242 protected String updateSummaryVisible() { 243 return ""; } 245 246 249 public void createPartControl(Composite parent) { 250 parent.setLayout(new FillLayout()); 251 252 viewer = new TableViewer(createTable(parent)); 253 restoreColumnWidths(memento); 254 createColumns(viewer.getTable()); 255 256 content = new MListContentProvider(); 257 viewer.setContentProvider(content); 258 259 viewer.setLabelProvider(new MListLabelProvider()); 260 261 viewer.addSelectionChangedListener(new ISelectionChangedListener() { 262 public void selectionChanged(SelectionChangedEvent event) { 263 IStructuredSelection selection = (IStructuredSelection)event.getSelection(); 264 viewerSelectionChanged(selection); 265 }}); 266 267 setSorter(getSorter()); 268 269 createActions(); 272 273 viewer.setInput(getViewerInput()); 274 275 277 Scrollable scrollable = (Scrollable) viewer.getControl(); 278 ScrollBar bar = scrollable.getVerticalBar(); 279 if (bar != null) { 280 bar.setSelection(restoreVerticalScrollBarPosition(memento)); 281 } 282 bar = scrollable.getHorizontalBar(); 283 if (bar != null) { 284 bar.setSelection(restoreHorizontalScrollBarPosition(memento)); 285 } 286 287 MenuManager mgr = initContextMenu(); 288 Menu menu = mgr.createContextMenu(viewer.getControl()); 289 viewer.getControl().setMenu(menu); 290 getSite().registerContextMenu(mgr, getSelectionProvider()); 291 292 getSite().setSelectionProvider(getSelectionProvider()); 293 294 initActionBars(getViewSite().getActionBars()); 295 297 viewer.addOpenListener(new IOpenListener() { 298 public void open(OpenEvent event) { 299 handleOpenEvent(event); 300 } 301 }); 302 308 markerManager.addMarkerListener(this); 309 310 CoveragePlugin.getDefault().setMarkerView(this); 311 } 312 313 private ISelectionProvider getSelectionProvider() { 314 return selectionProvider; 315 } 316 317 320 protected void setSelection(IStructuredSelection selection) { 321 getSelectionProvider().setSelection(selection); 322 } 323 324 327 void setSorter(TableSorter sorter2) { 328 TableSorter newSorter = new TableSorter(sorter2); 329 330 sorter = newSorter; 331 content.setSorter(newSorter); 332 sorterChanged(); 334 } 335 336 339 public void dispose() { 340 openAction.dispose(); 341 CoveragePlugin.getDefault().setMarkerView(null); 342 } 343 344 347 protected Table createTable(Composite parent) { 348 Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION); 349 table.setLinesVisible(true); 350 table.setFont(parent.getFont()); 351 return table; 352 } 353 354 protected void createColumns(final Table table) { 355 TableLayout layout = new TableLayout(); 357 table.setLayout(layout); 358 table.setHeaderVisible(true); 359 final IField[] fields = getFields(); 360 ColumnLayoutData[] columnWidths = columnLayouts; 361 if (columnWidths == null) { 362 columnWidths = getDefaultColumnLayouts(); 363 } 364 for (int i = 0; i < fields.length; i++) { 365 if (columnWidths == null || i >= columnWidths.length || columnWidths[i] == null) { 366 layout.addColumnData(new ColumnPixelData(504 / fields.length, true)); 367 } 368 else { 369 layout.addColumnData(columnWidths[i]); 370 } 371 TableColumn tc = new TableColumn(table, SWT.NONE,i); 372 tc.setText(fields[i].getColumnHeaderText()); 373 tc.setImage(fields[i].getColumnHeaderImage()); 374 } 376 } 377 378 protected void createActions() { 379 openAction = new ActionOpenMarker(this, getSelectionProvider()); 380 } 381 382 protected IAction getAction(String id) { 383 return (IAction) actions.get(id); 384 } 385 386 protected void putAction(String id, IAction action) { 387 actions.put(id, action); 388 } 389 390 protected MenuManager initContextMenu() { 391 MenuManager mgr = new MenuManager(); 392 mgr.setRemoveAllWhenShown(true); 393 mgr.addMenuListener(new IMenuListener() { 394 public void menuAboutToShow(IMenuManager mgr) { 395 396 getViewer().cancelEditing(); 397 fillContextMenu(mgr); 398 } 399 }); 400 return mgr; 401 } 402 403 405 protected void initActionBars(IActionBars actionBars) { 406 initMenu(actionBars.getMenuManager()); 407 initToolBar(actionBars.getToolBarManager()); 408 } 409 410 private void initToolBar(IToolBarManager manager) { 411 IAction showDefAction = new Action() { 412 public void run() { 413 CoveragePlugin.getDefault().getMarkerManager().enablePrimaryMarkers(); 414 } 415 }; 416 showDefAction.setText(Messages.getString("CoverageMarkerView.2")); manager.add(showDefAction); 418 } 419 420 protected void initMenu(IMenuManager menu) { 421 IAction sortAction = getAction(SORT_ACTION_ID); 422 if (sortAction != null) 423 menu.add(sortAction); 424 IAction filtersAction = getAction(FILTERS_ACTION_ID); 425 if (filtersAction != null) 426 menu.add(filtersAction); 427 } 428 429 protected void fillContextMenu(IMenuManager manager) { 432 System.out.println("implement me: CoverageMarkerView.fillContextMenu()"); } 434 435 public void setFocus() { 436 TableViewer viewer = getViewer(); 437 if (viewer != null && !viewer.getControl().isDisposed()) { 438 Runnable focusSetter = new Runnable () { 439 public void run() { 440 getViewer().getControl().setFocus(); 441 } 442 }; 443 runInDisplayThread(focusSetter); 444 } 445 } 446 447 protected TableSorter getSorter() { 448 if (sorter == null) { 449 int[] priorities = new int[getFields().length]; 450 int[] directions = new int[getFields().length]; 451 for (int i = 0; i < getFields().length; i++) { 452 priorities[i] = i; 453 } 454 Arrays.fill(directions, TableSorter.ASCENDING); 455 sorter = new TableSorter(getFields(), priorities, directions); 456 sorter.setTopPriority(getFields()[2]); 457 } 459 return sorter; 460 } 461 462 464 protected IField[] getFields() { 465 return VISIBLE_FIELDS; 466 } 467 468 protected Object getViewerInput() { 469 return ResourcesPlugin.getWorkspace().getRoot(); 470 } 471 472 473 475 protected TableViewer getViewer() { 476 return viewer; 477 } 478 479 498 protected ColumnLayoutData[] getDefaultColumnLayouts() { 499 return DEFAULT_COLUMN_LAYOUTS; 500 } 501 502 509 protected void sorterChanged() { 510 viewer.setSorter(getSorter()); 511 512 final TableViewer viewer = getViewer(); 513 if (viewer == null) { 514 return; 515 } 516 517 getSite().getShell().getDisplay().asyncExec(new Runnable () { 518 public void run() { 519 viewer.getControl().setRedraw(false); 520 viewer.refresh(false); 521 viewer.getControl().setRedraw(true); 522 } 523 }); 524 } 525 526 528 protected void handleOpenEvent(OpenEvent event) { 529 openAction.run(); 530 } 531 532 535 public void saveState(IMemento memento) { 536 super.saveState(memento); 537 538 TableColumn[] columns = viewer.getTable().getColumns(); 540 for (int i = 0; i < columns.length; i++) { 541 memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i].getWidth()); 542 } 543 544 546 Scrollable scrollable = (Scrollable) viewer.getControl(); 548 ScrollBar bar = scrollable.getVerticalBar(); 549 int position = (bar != null) ? bar.getSelection() : 0; 550 memento.putInteger(TAG_VERTICAL_POSITION, position); 551 bar = scrollable.getHorizontalBar(); 553 position = (bar != null) ? bar.getSelection() : 0; 554 memento.putInteger(TAG_HORIZONTAL_POSITION, position); 555 } 556 557 private void restoreColumnWidths(IMemento memento) { 558 if (memento == null) { 559 return; 560 } 561 columnLayouts = new ColumnLayoutData[getFields().length]; 562 for (int i = 0; i < columnLayouts.length; i++) { 563 Integer width = memento.getInteger(TAG_COLUMN_WIDTH + i); 564 if (width == null) { 565 columnLayouts = null; 566 break; 567 } 568 else { 569 columnLayouts[i] = new ColumnPixelData(width.intValue(), true); 570 } 571 } 572 } 573 574 private int restoreVerticalScrollBarPosition(IMemento memento) { 575 if (memento == null) { 576 return 0; 577 } 578 Integer position = memento.getInteger(TAG_VERTICAL_POSITION); 579 return (position == null) ? 0 : position.intValue(); 580 } 581 582 private int restoreHorizontalScrollBarPosition(IMemento memento) { 583 if (memento == null) { 584 return 0; 585 } 586 Integer position = memento.getInteger(TAG_HORIZONTAL_POSITION); 587 return (position == null) ? 0 : position.intValue(); 588 } 589 590 594 protected IWorkbenchSiteProgressService getProgressService() { 595 IWorkbenchSiteProgressService service = null; 596 Object siteService = 597 getSite().getAdapter(IWorkbenchSiteProgressService.class); 598 if(siteService != null) 599 service = (IWorkbenchSiteProgressService) siteService; 600 return service; 601 } 602 603 } 604 | Popular Tags |