001: package visualdebugger.views;
002:
003: import java.io.File;
004: import java.util.HashMap;
005: import java.util.Map;
006:
007: import org.eclipse.core.resources.IFile;
008: import org.eclipse.core.resources.IMarker;
009: import org.eclipse.core.resources.IProject;
010: import org.eclipse.core.runtime.CoreException;
011: import org.eclipse.jdt.core.*;
012: import org.eclipse.jdt.core.dom.AST;
013: import org.eclipse.jdt.core.dom.ASTParser;
014: import org.eclipse.jdt.core.dom.CompilationUnit;
015: import org.eclipse.jface.action.*;
016: import org.eclipse.jface.dialogs.MessageDialog;
017: import org.eclipse.jface.text.ITextOperationTarget;
018: import org.eclipse.jface.text.ITextSelection;
019: import org.eclipse.jface.text.source.ISourceViewer;
020: import org.eclipse.jface.viewers.*;
021: import org.eclipse.swt.SWT;
022: import org.eclipse.swt.graphics.Image;
023: import org.eclipse.swt.widgets.Composite;
024: import org.eclipse.swt.widgets.Menu;
025: import org.eclipse.swt.widgets.Table;
026: import org.eclipse.swt.widgets.TableColumn;
027: import org.eclipse.ui.*;
028: import org.eclipse.ui.part.ViewPart;
029: import org.eclipse.ui.texteditor.ITextEditor;
030: import org.eclipse.ui.texteditor.MarkerUtilities;
031:
032: import de.uka.ilkd.key.visualdebugger.*;
033: import de.uka.ilkd.key.visualdebugger.executiontree.*;
034:
035: public class BreakpointView extends ViewPart {
036: private TableViewer viewer;
037: private Action deleteAction;
038: private Action addAction;
039:
040: private BreakpointManager bpManager;
041:
042: class BpContentProvider implements IStructuredContentProvider {
043:
044: public void inputChanged(Viewer v, Object oldInput,
045: Object newInput) {
046: }
047:
048: public void dispose() {
049: }
050:
051: public Object[] getElements(Object parent) {
052: if (parent instanceof BreakpointManager) {
053: return ((BreakpointManager) parent).getBreapoints();
054: } else
055: return new String[] { "One", "Two", "Three" };
056: }
057: }
058:
059: class BpLabelProvider extends LabelProvider implements
060: ITableLabelProvider {
061: public String getColumnText(Object obj, int index) {
062: if (obj instanceof BreakpointEclipse) {
063: BreakpointEclipse b = (BreakpointEclipse) obj;
064: if (index == 2) {
065: final String s = b.getStatement().toString();
066: return s.substring(0, s.lastIndexOf("\n"));
067: } else if (index == 0) {
068: return b.getCompilationUnit().getResource()
069: .getName();
070: } else if (index == 1) {
071: return b.getMethod().getElementName();
072: }
073:
074: return b.getId().getId() + "";
075: }
076: return "UNKNOWN CONTENT";
077: }
078:
079: public Image getColumnImage(Object obj, int index) {
080: return null;
081: }
082:
083: public Image getImage(Object obj) {
084: return PlatformUI.getWorkbench().getSharedImages()
085: .getImage(ISharedImages.IMG_OBJ_ELEMENT);
086: }
087: }
088:
089: public BreakpointView() {
090: bpManager = VisualDebugger.getVisualDebugger().getBpManager();
091: }
092:
093: /**
094: * This is a callback that will allow us
095: * to create the viewer and initialize it.
096: */
097: public void createPartControl(Composite parent) {
098: viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
099: | SWT.V_SCROLL | SWT.SEPARATOR);
100:
101: //viewer.setSorter(new NameSorter());
102:
103: Table table = viewer.getTable();
104: //table.setLayoutData(new GridData(GridData.FILL_BOTH));
105: TableColumn column;
106:
107: column = new TableColumn(table, SWT.NONE, 0);
108: column.setWidth(100);
109: column.setText("File");
110: column = new TableColumn(table, SWT.NONE, 1);
111: column.setWidth(100);
112: column.setText("Method");
113: column = new TableColumn(table, SWT.NONE, 2);
114: column.setWidth(70);
115: column.setText("Statement");
116: table.setHeaderVisible(true);
117: table.setLinesVisible(true);
118: viewer.setContentProvider(new BpContentProvider());
119: viewer.setLabelProvider(new BpLabelProvider());
120:
121: viewer.setInput(bpManager);
122:
123: hookListener();
124: makeActions();
125: hookContextMenu();
126:
127: contributeToActionBars();
128: }
129:
130: private void hookListener() {
131: viewer
132: .addSelectionChangedListener(new ISelectionChangedListener() {
133: public void selectionChanged(
134: SelectionChangedEvent event) {
135: // if the selection is empty clear the label
136: if (event.getSelection().isEmpty()) {
137:
138: return;
139: }
140: if (event.getSelection() instanceof IStructuredSelection) {
141: IStructuredSelection selection = (IStructuredSelection) event
142: .getSelection();
143:
144: Object domain = selection.getFirstElement();
145: if (domain instanceof BreakpointEclipse) { //TODO !!!!!
146: BreakpointEclipse bp = (BreakpointEclipse) domain;
147: // ICompilationUnit unit = bp.getCompilationUnit();
148: ISourceViewer viewer = null;
149: IWorkbench workbench = PlatformUI
150: .getWorkbench();
151: IWorkbenchPage page = workbench
152: .getActiveWorkbenchWindow()
153: .getActivePage();
154: IMarker marker = null;
155: //TODO add marker attribute to BreakpointEclipse
156: try {
157: IMarker[] markers = bp
158: .getCompilationUnit()
159: .getResource()
160: .findMarkers(
161: "VisualDebugger.bpmarker",
162: true, 1);
163: for (int i = 0; i < markers.length; i++) {
164:
165: if (((Integer) markers[i]
166: .getAttribute("StatementId"))
167: .intValue() == bp
168: .getId().getId()) {
169: marker = markers[i];
170: }
171: }
172: } catch (CoreException e) {
173: // TODO Auto-generated catch block
174: e.printStackTrace();
175: }
176:
177: try {
178: IEditorPart ed = org.eclipse.ui.ide.IDE
179: .openEditor(page, marker,
180: true);
181: viewer = (ISourceViewer) ed
182: .getAdapter(ITextOperationTarget.class);
183: } catch (Exception e) {
184: e.printStackTrace();
185:
186: }
187:
188: //IEditorPart editor =PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
189: /*//bp.getAnnotation().getSourceViewer().setSelectedRange(bp.getSelection().getOffset(), bp.getSelection().getLength());
190: if (editor instanceof ITextEditor){
191: ITextEditor tedit= (ITextEditor) editor;
192: tedit.getSelectionProvider().setSelection(bp.getSelection());
193: }*/
194:
195: }
196: }
197: }
198: });
199: }
200:
201: private void hookContextMenu() {
202: MenuManager menuMgr = new MenuManager("#PopupMenu");
203: menuMgr.setRemoveAllWhenShown(true);
204: menuMgr.addMenuListener(new IMenuListener() {
205: public void menuAboutToShow(IMenuManager manager) {
206: BreakpointView.this .fillContextMenu(manager);
207: }
208: });
209: Menu menu = menuMgr.createContextMenu(viewer.getControl());
210: viewer.getControl().setMenu(menu);
211: getSite().registerContextMenu(menuMgr, viewer);
212: }
213:
214: private void contributeToActionBars() {
215: IActionBars bars = getViewSite().getActionBars();
216: fillLocalPullDown(bars.getMenuManager());
217: fillLocalToolBar(bars.getToolBarManager());
218: }
219:
220: private void fillLocalPullDown(IMenuManager manager) {
221:
222: manager.add(addAction);
223: manager.add(new Separator());
224: manager.add(deleteAction);
225: }
226:
227: private void fillContextMenu(IMenuManager manager) {
228: manager.add(addAction);
229: manager.add(deleteAction);
230: // Other plug-ins can contribute there actions here
231: manager.add(new Separator(
232: IWorkbenchActionConstants.MB_ADDITIONS));
233: }
234:
235: private void fillLocalToolBar(IToolBarManager manager) {
236: manager.add(addAction);
237: manager.add(deleteAction);
238: }
239:
240: private void makeActions() {
241: addAction = new Action() {
242: public void run() {
243: IEditorPart editor = PlatformUI.getWorkbench()
244: .getActiveWorkbenchWindow().getActivePage()
245: .getActiveEditor();
246: if (editor instanceof ITextEditor) {
247: ITextEditor tedit = (ITextEditor) editor;
248:
249: ISelection sel = tedit.getSelectionProvider()
250: .getSelection();
251: ITextSelection tsel = (ITextSelection) sel;
252: IFile file = (IFile) tedit.getEditorInput()
253: .getAdapter(IFile.class);
254:
255: String fileName = file.getProjectRelativePath()
256: .toString();
257: System.out.println(fileName);
258: System.out.println("FileName " + fileName);
259:
260: ICompilationUnit unit = JavaCore
261: .createCompilationUnitFrom(file);
262: IMethod method = null;
263: try {
264: IJavaElement je = unit.getElementAt(tsel
265: .getOffset());
266: if (je instanceof IMethod) {
267: method = (IMethod) je;
268: }
269:
270: // System.out.println(method);
271: // System.out.println(method.getClass());
272: } catch (JavaModelException e) {
273: // TODO Auto-generated catch block
274: e.printStackTrace();
275: }
276:
277: //-------- get File
278: IProject project = unit.getJavaProject()
279: .getProject();
280: File location = project.getLocation().toFile();
281: File f = new File(location + fileName);
282: System.out.println(location + "/" + fileName);
283: //----------------------
284:
285: ASTParser parser = ASTParser.newParser(AST.JLS3);
286: parser.setResolveBindings(true);
287: parser.setSource(unit);
288: CompilationUnit astRoot = (CompilationUnit) parser
289: .createAST(null);
290:
291: FindStatementVisitor visitor = new FindStatementVisitor(
292: tsel.getOffset());
293: astRoot.accept(visitor);
294:
295: if (visitor.getStatement() == null) {
296: MessageDialog
297: .openError(PlatformUI.getWorkbench()
298: .getActiveWorkbenchWindow()
299: .getShell(),
300: "Adding Statement Breakpoint",
301: "Please select a Java statement in the Java Editor");
302: return;
303: }
304: // ISourceViewer sviewer = getSourceViewer(file);
305:
306: // BreakpointAnnotation annotation = new BreakpointAnnotation("VisualDebugger.BpAnnotationType",true,"Statement Breakpoint",sviewer);
307: //new BreakpointAnnotation("VisualDebugger.BpAnnotationType",marker);
308: //System.out.println("P " +annotation.isPersistent());
309: BreakpointEclipse bp = new BreakpointEclipse(
310: new SourceElementId("", visitor
311: .getStatementId()), visitor
312: .getTextSelection(), visitor
313: .getStatement(), unit, method);
314: if (!bpManager.addBreakpoint(bp))
315: return;
316: try {
317: Map map = new HashMap();
318: map.put("StatementId", new Integer(visitor
319: .getStatementId()));
320: //MarkerUtilities.setLineNumber(map, 10);
321: MarkerUtilities.setCharStart(map, visitor
322: .getTextSelection().getOffset());
323: MarkerUtilities.setCharEnd(map, visitor
324: .getTextSelection().getOffset()
325: + visitor.getTextSelection()
326: .getLength());
327:
328: MarkerUtilities.createMarker(
329: unit.getResource(), map,
330: "VisualDebugger.bpmarker");
331:
332: } catch (CoreException e) {
333: // TODO Auto-generated catch block
334: e.printStackTrace();
335: }
336: //--------------------------------------------------------
337:
338: // TODO start/end line
339: //IDocument doc = tedit.getDocumentProvider().getDocument(null);
340: //IRegion i = doc.getLineInformationOfOffset(bp.getSelection().getOffset());
341: // Line Tracker...
342:
343: // sviewer.getAnnotationModel().
344: // addAnnotation(annotation,
345: // new Position(visitor.getTextSelection().getOffset(), visitor.getTextSelection().getLength()));
346: //sviewer.revealRange(visitor.getTextSelection().getOffset(), visitor.getTextSelection().getOffset());
347:
348: viewer.setInput(bpManager);
349: DebuggerEvent event = new DebuggerEvent(
350: DebuggerEvent.TREE_CHANGED, ExecutionTree
351: .getITNode());
352: VisualDebugger.getVisualDebugger()
353: .fireDebuggerEvent(event);
354:
355: }
356: }
357: };
358: addAction.setText("Add");
359: addAction.setToolTipText("Adds a statement breakpoint");
360: // addAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
361: // getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
362:
363: deleteAction = new Action() {
364: public void run() {
365: IStructuredSelection sel = (IStructuredSelection) viewer
366: .getSelection();
367:
368: Object domain = sel.getFirstElement();
369: if (domain instanceof BreakpointEclipse) {
370: BreakpointEclipse bp = (BreakpointEclipse) domain;
371: try {
372: IMarker[] markers = bp.getCompilationUnit()
373: .getResource().findMarkers(
374: "VisualDebugger.bpmarker",
375: true, 1);
376: for (int i = 0; i < markers.length; i++) {
377: if (((Integer) markers[i]
378: .getAttribute("StatementId"))
379: .intValue() == bp.getId().getId()) {
380: markers[i].delete();
381: }
382: }
383: } catch (CoreException e) {
384: // TODO Auto-generated catch block
385: e.printStackTrace();
386: }
387:
388: //ISourceViewer sviewer = bp.getAnnotation().getSourceViewer();
389: //sviewer.getAnnotationModel().removeAnnotation(bp.getAnnotation());
390: bpManager.remove(bp);
391: viewer.setInput(bpManager);
392: DebuggerEvent event = new DebuggerEvent(
393: DebuggerEvent.TREE_CHANGED, ExecutionTree
394: .getITNode());
395: VisualDebugger.getVisualDebugger()
396: .fireDebuggerEvent(event);
397:
398: //showMessage("Action 1 executed");
399:
400: }
401: }
402: };
403: deleteAction.setText("Remove");
404: deleteAction.setToolTipText("Removes the selected breakpoint");
405: //deleteAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
406: // getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
407:
408: }
409:
410: /**
411: * Passing the focus request to the viewer's control.
412: */
413: public void setFocus() {
414: viewer.getControl().setFocus();
415: }
416: }
|