Index: debuggercore/api/src/org/netbeans/api/debugger/DebuggerManager.java =================================================================== RCS file: /shared/data/ccvs/repository/debuggercore/api/src/org/netbeans/api/debugger/DebuggerManager.java,v retrieving revision 1.21.4.1.2.1.22.1 diff -u -r1.21.4.1.2.1.22.1 DebuggerManager.java --- debuggercore/api/src/org/netbeans/api/debugger/DebuggerManager.java 15 Jan 2007 14:58:40 -0000 1.21.4.1.2.1.22.1 +++ debuggercore/api/src/org/netbeans/api/debugger/DebuggerManager.java 19 Feb 2007 11:14:21 -0000 @@ -13,7 +13,7 @@ * "Portions Copyrighted [year] [name of copyright owner]" * * The Original Software is NetBeans. The Initial Developer of the Original - * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun * Microsystems, Inc. All Rights Reserved. */ @@ -24,7 +24,6 @@ import java.util.HashMap; import org.openide.util.Cancellable; -import org.openide.util.RequestProcessor; import org.openide.util.Task; import org.netbeans.spi.debugger.DelegatingDebuggerEngineProvider; @@ -1095,12 +1094,10 @@ private void removeSession (Session session) { Session[] oldSessions; Session[] newSessions; - DebuggerEngine oldEngine; - DebuggerEngine newEngine; + Session nCurrentSesson = null; synchronized (sessions) { oldSessions = getSessions(); // find index of given debugger and new instance of currentDebugger - Session nCurrentSesson = null; int i, k = oldSessions.length; for (i = 0; i < k; i++) { if (oldSessions[i] == session) { @@ -1115,7 +1112,8 @@ if (session == getCurrentSession ()) { if ((nCurrentSesson == null) && (k > 1)) nCurrentSesson = oldSessions[1]; - setCurrentSession (nCurrentSesson); + } else { + nCurrentSesson = getCurrentSession(); } newSessions = new Session [oldSessions.length - 1]; @@ -1127,16 +1125,9 @@ sessions.remove(i); session.removePropertyChangeListener (sessionListener); - - oldEngine = currentEngine; - newEngine = null; - if (getCurrentSession () != null) - newEngine = getCurrentSession ().getCurrentEngine (); - currentEngine = newEngine; - } - if (oldEngine != newEngine) { - firePropertyChange (PROP_CURRENT_ENGINE, oldEngine, newEngine); + // The current engine is set in setCurrentSession(). } + setCurrentSession (nCurrentSesson); fireSessionRemoved (session, oldSessions, newSessions); } Index: debuggerjpda/src/org/netbeans/modules/debugger/jpda/JPDADebuggerImpl.java =================================================================== RCS file: /shared/data/ccvs/repository/debuggerjpda/src/org/netbeans/modules/debugger/jpda/JPDADebuggerImpl.java,v retrieving revision 1.81.4.3.2.4.14.1 diff -u -r1.81.4.3.2.4.14.1 JPDADebuggerImpl.java --- debuggerjpda/src/org/netbeans/modules/debugger/jpda/JPDADebuggerImpl.java 15 Jan 2007 14:58:42 -0000 1.81.4.3.2.4.14.1 +++ debuggerjpda/src/org/netbeans/modules/debugger/jpda/JPDADebuggerImpl.java 19 Feb 2007 11:14:22 -0000 @@ -13,7 +13,7 @@ * "Portions Copyrighted [year] [name of copyright owner]" * * The Original Software is NetBeans. The Initial Developer of the Original - * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun * Microsystems, Inc. All Rights Reserved. */ @@ -38,6 +38,7 @@ import com.sun.jdi.request.EventRequestManager; import com.sun.jdi.request.InvalidRequestStateException; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; @@ -471,6 +472,23 @@ updateCurrentCallStackFrame (thread); } + /** + * Set the current thread and call stack, but do not fire changes. + * @return The PropertyChangeEvent associated with this change, it can have + * attached other PropertyChangeEvents as a propagation ID. + */ + private PropertyChangeEvent setCurrentThreadNoFire(JPDAThread thread) { + Object oldT = currentThread; + currentThread = (JPDAThreadImpl) thread; + PropertyChangeEvent evt = null; + if (thread != oldT) + evt = new PropertyChangeEvent(this, PROP_CURRENT_THREAD, oldT, currentThread); + PropertyChangeEvent evt2 = updateCurrentCallStackFrameNoFire(thread); + if (evt == null) evt = evt2; + else if (evt2 != null) evt.setPropagationId(evt2); + return evt; + } + public void setCurrentCallStackFrame (CallStackFrame callStackFrame) { CallStackFrame old = setCurrentCallStackFrameNoFire(callStackFrame); if (old == callStackFrame) return ; @@ -797,13 +815,27 @@ * Performs stop action. */ public void setStoppedState (ThreadReference thread) { + PropertyChangeEvent evt; synchronized (LOCK) { // this method can be called in stopped state to switch // the current thread only JPDAThread t = getThread (thread); checkJSR45Languages (t); - setCurrentThread (t); - setState (STATE_STOPPED); + evt = setCurrentThreadNoFire(t); + PropertyChangeEvent evt2 = setStateNoFire(STATE_STOPPED); + + if (evt == null) evt = evt2; + else if (evt2 != null) { + PropertyChangeEvent evt3 = evt; + while(evt3.getPropagationId() != null) evt3 = (PropertyChangeEvent) evt3.getPropagationId(); + evt3.setPropagationId(evt2); + } + } + if (evt != null) { + do { + firePropertyChange(evt); + evt = (PropertyChangeEvent) evt.getPropagationId(); + } while (evt != null); } } @@ -963,26 +995,39 @@ } } - private void setState (int state) { - if (state == this.state) return; + private PropertyChangeEvent setStateNoFire (int state) { + if (state == this.state) return null; int o = this.state; this.state = state; - firePropertyChange (PROP_STATE, new Integer (o), new Integer (state)); - //PENDING HACK see issue 46287 System.setProperty( "org.openide.awt.SwingBrowserImpl.do-not-block-awt", String.valueOf (state != STATE_DISCONNECTED) ); + return new PropertyChangeEvent(this, PROP_STATE, new Integer (o), new Integer (state)); + } + + private void setState (int state) { + PropertyChangeEvent evt = setStateNoFire(state); + if (evt != null) { + firePropertyChange(evt); + } } /** - * Fires property change. - */ + * Fires property change. + */ private void firePropertyChange (String name, Object o, Object n) { pcs.firePropertyChange (name, o, n); } + /** + * Fires property change. + */ + private void firePropertyChange (PropertyChangeEvent evt) { + pcs.firePropertyChange (evt); + } + private SourcePath engineContext; public synchronized SourcePath getEngineContext () { if (engineContext == null) @@ -1027,6 +1072,27 @@ } catch (AbsentInformationException e) { setCurrentCallStackFrame (null); } + } + + /** + * @param thread The thread to take the top frame from + * @return A PropertyChangeEvent or null. + */ + private PropertyChangeEvent updateCurrentCallStackFrameNoFire(JPDAThread thread) { + CallStackFrame old; + CallStackFrame callStackFrame; + if ( (thread == null) || + (thread.getStackDepth () < 1)) + old = setCurrentCallStackFrameNoFire(callStackFrame = null); + else + try { + old = setCurrentCallStackFrameNoFire(callStackFrame = thread.getCallStack (0, 1) [0]); + } catch (AbsentInformationException e) { + old = setCurrentCallStackFrameNoFire(callStackFrame = null); + } + if (old == callStackFrame) return null; + else return new PropertyChangeEvent(this, PROP_CURRENT_CALL_STACK_FRAME, + old, callStackFrame); } private List disableAllBreakpoints () {