1 19 package org.netbeans.modules.debugger.jpda.ui.breakpoints; 20 21 import java.beans.PropertyChangeEvent ; 22 import java.beans.PropertyChangeListener ; 23 import java.util.HashMap ; 24 import java.util.Iterator ; 25 26 import org.netbeans.api.debugger.Breakpoint; 27 import org.netbeans.api.debugger.DebuggerEngine; 28 import org.netbeans.api.debugger.DebuggerManager; 29 import org.netbeans.api.debugger.DebuggerManagerAdapter; 30 import org.netbeans.api.debugger.LazyDebuggerManagerListener; 31 import org.netbeans.api.debugger.jpda.JPDABreakpoint; 32 import org.netbeans.api.debugger.jpda.JPDADebugger; 33 import org.netbeans.api.debugger.jpda.LineBreakpoint; 34 import org.netbeans.modules.debugger.jpda.ui.EditorContextBridge; 35 36 37 46 public class BreakpointAnnotationListener extends DebuggerManagerAdapter { 47 48 private HashMap breakpointToAnnotation = new HashMap (); 49 private boolean listen = true; 50 51 52 public String [] getProperties () { 53 return new String [] {DebuggerManager.PROP_BREAKPOINTS}; 54 } 55 56 59 public void propertyChange (PropertyChangeEvent e) { 60 String propertyName = e.getPropertyName (); 61 if (propertyName == null) return; 62 if (!listen) return; 63 if ( (!LineBreakpoint.PROP_CONDITION.equals (propertyName)) && 64 (!LineBreakpoint.PROP_URL.equals (propertyName)) && 65 (!LineBreakpoint.PROP_LINE_NUMBER.equals (propertyName)) && 66 (!JPDABreakpoint.PROP_ENABLED.equals (propertyName)) 67 ) return; 68 LineBreakpoint b = (LineBreakpoint) e.getSource (); 69 annotate (b); 70 } 71 72 77 public void breakpointAdded (Breakpoint b) { 78 if (b instanceof LineBreakpoint) { 79 ((LineBreakpoint) b).addPropertyChangeListener (this); 80 annotate ((LineBreakpoint) b); 81 } 82 } 83 84 89 public void breakpointRemoved (Breakpoint b) { 90 if (b instanceof LineBreakpoint) { 91 ((LineBreakpoint) b).removePropertyChangeListener (this); 92 removeAnnotation ((LineBreakpoint) b); 93 } 94 } 95 96 public LineBreakpoint findBreakpoint (String url, int lineNumber) { 97 Iterator i = breakpointToAnnotation.keySet ().iterator (); 98 while (i.hasNext ()) { 99 LineBreakpoint lb = (LineBreakpoint) i.next (); 100 if (!lb.getURL ().equals (url)) continue; 101 Object annotation = breakpointToAnnotation.get (lb); 102 int ln = EditorContextBridge.getLineNumber (annotation, null); 103 if (ln == lineNumber) return lb; 104 } 105 return null; 106 } 107 108 109 111 private void annotate (LineBreakpoint b) { 112 Object annotation = breakpointToAnnotation.get (b); 114 if (annotation != null) 115 EditorContextBridge.removeAnnotation (annotation); 116 if (b.isHidden ()) return; 117 118 annotation = EditorContextBridge.annotate (b); 120 if (annotation == null) return; 121 breakpointToAnnotation.put (b, annotation); 122 123 DebuggerEngine de = DebuggerManager.getDebuggerManager (). 124 getCurrentEngine (); 125 Object timeStamp = null; 126 if (de != null) 127 timeStamp = de.lookupFirst (null, JPDADebugger.class); 128 update (b, timeStamp); 129 } 130 131 public void updateLineBreakpoints () { 132 Iterator it = breakpointToAnnotation.keySet ().iterator (); 133 while (it.hasNext ()) { 134 LineBreakpoint lb = (LineBreakpoint) it.next (); 135 update (lb, null); 136 } 137 } 138 139 private void update (LineBreakpoint b, Object timeStamp) { 140 Object annotation = breakpointToAnnotation.get (b); 141 int ln = EditorContextBridge.getLineNumber (annotation, timeStamp); 142 listen = false; 143 b.setLineNumber (ln); 144 listen = true; 145 } 146 147 private void removeAnnotation (LineBreakpoint b) { 148 Object annotation = breakpointToAnnotation.remove (b); 149 if (annotation != null) 150 EditorContextBridge.removeAnnotation (annotation); 151 } 152 } 153 | Popular Tags |