Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | Added new package org.netbeans.modules.languages.tcl.debugger.variables to handle VariablesView. Includes NameColumn, TclVariable and the most important TclVariablesModel. Also TclDebuggerActionsProvider is now registered via META-INF/ to be available for TclVariablesModel class and for general comunication with TclDebuggerJavaPart. debugServer.tcl upgraded to serve [info vars]. |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
689e69ec6f814e6efb5418e08d2b813c |
User & Date: | dmp 2011-07-28 00:54:48 |
Original Comment: | Added new package org.netbeans.modules.languages.tcl.debugger.variables to handle VariablesView. Includes NameColumn, TclVariable and the most important TclVariablesModel. Also TclDebuggerActionsProvider is now registered via META-INF/ to be available for TclVariablesModel class and for general comunication with TclDebuggerJavaPart. debugServer.tcl upgraded to serve [info vars]. |
2011-07-28
| ||
14:50 | Changed: [info vars] is now splited to [info locals] and [info globals]. VariablesView adapted to locals and globals. Added support for displaying arrays in VariablesView. check-in: 55a3ad0bc1 user: dmp tags: trunk | |
00:54 | Added new package org.netbeans.modules.languages.tcl.debugger.variables to handle VariablesView. Includes NameColumn, TclVariable and the most important TclVariablesModel. Also TclDebuggerActionsProvider is now registered via META-INF/ to be available for TclVariablesModel class and for general comunication with TclDebuggerJavaPart. debugServer.tcl upgraded to serve [info vars]. check-in: 689e69ec6f user: dmp tags: trunk | |
2011-07-25
| ||
23:20 | Added META-INF/debugger/TclSession/LocalView to register viewmodels. Added class TclVariableModel to implement variables window. check-in: 4005b99d02 user: dmp tags: trunk | |
Changes to TclPlugin/src/META-INF/debugger/TclSession/LocalsView/org.netbeans.spi.viewmodel.NodeModel.
|
| | | 1 | org.netbeans.modules.languages.tcl.debugger.variables.TclVariablesModel |
Changes to TclPlugin/src/META-INF/debugger/TclSession/LocalsView/org.netbeans.spi.viewmodel.TableModel.
|
| | | 1 | org.netbeans.modules.languages.tcl.debugger.variables.TclVariablesModel |
Changes to TclPlugin/src/META-INF/debugger/TclSession/LocalsView/org.netbeans.spi.viewmodel.TreeModel.
|
| | | 1 | org.netbeans.modules.languages.tcl.debugger.variables.TclVariablesModel |
Added TclPlugin/src/META-INF/debugger/TclSession/org.netbeans.modules.languages.tcl.debugger.TclDebuggerActionsProvider.
> | 1 | org.netbeans.modules.languages.tcl.debugger.TclDebuggerActionsProvider |
Changes to TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/ProjectExchangeService.java.
︙ | ︙ | |||
14 15 16 17 18 19 20 21 22 | public abstract class ProjectExchangeService { private TclProject project; public void setProject( TclProject project ) { this.project=project; } abstract public TclProject getProject(); } | > | 14 15 16 17 18 19 20 21 22 23 | public abstract class ProjectExchangeService { private TclProject project; public void setProject( TclProject project ) { this.project=project; } abstract public TclProject getProject(); //abstract public TclDebuggerJavaPart getTclDebuggerJavaPart(); } |
Changes to TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/TclDebuggerActionsProvider.java.
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import org.netbeans.api.debugger.DebuggerInfo; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.modules.languages.tcl.project.TclProject; import org.netbeans.spi.debugger.ActionsProviderSupport; import org.netbeans.spi.debugger.ContextProvider; import org.netbeans.spi.debugger.DebuggerEngineProvider; import org.netbeans.spi.debugger.SessionProvider; /** * Registered by META-INF/debugger/TclSession/org.netbeans.spi.debugger.ActionsProvider * @author dmp */ public class TclDebuggerActionsProvider extends ActionsProviderSupport { | > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import org.netbeans.api.debugger.DebuggerInfo; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.modules.languages.tcl.project.TclProject; import org.netbeans.spi.debugger.ActionsProviderSupport; import org.netbeans.spi.debugger.ContextProvider; import org.netbeans.spi.debugger.DebuggerEngineProvider; import org.netbeans.spi.debugger.SessionProvider; import org.netbeans.spi.viewmodel.ModelListener; /** * Registered by META-INF/debugger/TclSession/org.netbeans.spi.debugger.ActionsProvider * @author dmp */ public class TclDebuggerActionsProvider extends ActionsProviderSupport { |
︙ | ︙ | |||
36 37 38 39 40 41 42 | public static final Object ACTION_RUN_BACK_TO_CURSOR="runBackToCursor"; public static final Object ACTION_POP_TOPMOST_CALL="popTopmostCall"; public static final Object ACTION_FIX="fix"; public static final Object ACTION_RESTART="restart"; public static final Object ACTION_TOGGLE_BREAKPOINT="toggleBreakpoint"; public static final String TCL_DEBUGGER_INFO="TclDebuggerInfo"; public static final String TCL_SESSION="TclSession"; | | > > > > > > > < | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | public static final Object ACTION_RUN_BACK_TO_CURSOR="runBackToCursor"; public static final Object ACTION_POP_TOPMOST_CALL="popTopmostCall"; public static final Object ACTION_FIX="fix"; public static final Object ACTION_RESTART="restart"; public static final Object ACTION_TOGGLE_BREAKPOINT="toggleBreakpoint"; public static final String TCL_DEBUGGER_INFO="TclDebuggerInfo"; public static final String TCL_SESSION="TclSession"; private TclDebuggerEngineProvider engineProvider=null; private static final Set actions=new HashSet(); public TclDebuggerJavaPart getTclDebuggerJavaPart() { return tclDebuggerJavaPart; } private TclDebuggerJavaPart tclDebuggerJavaPart; static{ actions.add( ACTION_KILL ); actions.add( ACTION_PAUSE ); actions.add( ACTION_CONTINUE ); actions.add( ACTION_START ); actions.add( ACTION_STEP_INTO ); actions.add( ACTION_STEP_OVER ); actions.add( ACTION_RUN_TO_CURSOR ); } public TclDebuggerActionsProvider( ContextProvider contextProvider ) { engineProvider=( TclDebuggerEngineProvider )contextProvider.lookupFirst( null, DebuggerEngineProvider.class ); for( Iterator it=actions.iterator(); it.hasNext(); ) { setEnabled( it.next(), true ); } } |
︙ | ︙ | |||
90 91 92 93 94 95 96 | new ProjectExchangeService() { @Override public TclProject getProject() { return tclProject; } | | | 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | new ProjectExchangeService() { @Override public TclProject getProject() { return tclProject; } } }; } }, null } ); manager.startDebugging( info ); |
︙ | ︙ | |||
137 138 139 140 141 142 143 144 | tclDebuggerJavaPart.actionRunToCursor(); } //System.out.println( "debugger doAction(): " + o ); } | | > > | 144 145 146 147 148 149 150 151 152 153 154 | tclDebuggerJavaPart.actionRunToCursor(); } //System.out.println( "debugger doAction(): " + o ); } } |
Changes to TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/TclDebuggerJavaPart.java.
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.io.InputStream; import java.io.OutputStream; import java.util.NoSuchElementException; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.Session; import org.netbeans.modules.languages.tcl.project.TclProject; import org.netbeans.modules.languages.tcl.run.RunTclsh; import org.openide.util.Exceptions; /** * TclDebugger Java Part * @author dmp */ public class TclDebuggerJavaPart { private TclProject project=null; private CurrentProgramCounterModify programCounter; private File currentFile; private int currentLineNumber; ClientToTclPart tclPart=null; private TclDebuggerEngineProvider engineProvider; private File tclPartFile=null; private final String tclPartFileName="debugServer.tcl"; private int tclPartPortNumber=31337; public TclDebuggerJavaPart( TclDebuggerEngineProvider engineProvider ) { bindProject(); this.engineProvider=engineProvider; | > > > > > > > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import java.io.InputStream; import java.io.OutputStream; import java.util.NoSuchElementException; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.Session; import org.netbeans.modules.languages.tcl.project.TclProject; import org.netbeans.modules.languages.tcl.run.RunTclsh; import org.netbeans.spi.viewmodel.ModelListener; import org.openide.util.Exceptions; /** * TclDebugger Java Part * @author dmp */ public class TclDebuggerJavaPart { private TclProject project=null; private CurrentProgramCounterModify programCounter; private File currentFile; private int currentLineNumber; ClientToTclPart tclPart=null; private TclDebuggerEngineProvider engineProvider; private File tclPartFile=null; private final String tclPartFileName="debugServer.tcl"; private int tclPartPortNumber=31337; private String variablesString=null; private ModelListener modelListener=null; public void addModelListener( ModelListener ml ) { //System.out.println("addModelListner inside TclDebuggerJavaPart : "+ml); this.modelListener = ml; } public TclDebuggerJavaPart( TclDebuggerEngineProvider engineProvider ) { bindProject(); this.engineProvider=engineProvider; |
︙ | ︙ | |||
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | } } private void getExecutionStatus() { tclPart.printlnToSocket( "status" ); try { String fileName=tclPart.nextLineFromFromSocket(); currentFile=new File( fileName ); currentLineNumber=Integer.parseInt( tclPart.nextLineFromFromSocket() ); programCounter.modify(); } catch( NoSuchElementException e ) { System.out.println( ">>> End of debugging…" ); actionKill(); } | > > > > > > > > > > > > > > > | | > | 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | } } private void getExecutionStatus() { tclPart.printlnToSocket( "status" ); try { // get first line → file localization String fileName=tclPart.nextLineFromFromSocket(); currentFile=new File( fileName ); // get second line → line in file currentLineNumber=Integer.parseInt( tclPart.nextLineFromFromSocket() ); programCounter.modify(); // get third line → number of variablesString int numberOfVariables=Integer.parseInt( tclPart.nextLineFromFromSocket() ); variablesString = ""; // every following numberOfVariables line contains name nad value of variable for( int i=1; i <= numberOfVariables; i++ ) { variablesString += tclPart.nextLineFromFromSocket()+"\n"; } updateTclVariablesModel(); } catch( NoSuchElementException e ) { System.out.println( ">>> End of debugging…" ); actionKill(); } } // Action handlers below: // public void actionStepOver() { createConnectionToTclPart(); tclPart.printlnToSocket( "stepover" ); getExecutionStatus(); } |
︙ | ︙ | |||
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | void actionKill() { createConnectionToTclPart(); tclPart.printlnToSocket( "exit" ); tclPart.close(); programCounter.detach(); engineProvider.getDestructor().killEngine(); } // Getters below: // public File getCurrentFile() { return currentFile; } public int getCurrentLineNumber() { return currentLineNumber; } | > > > > > > > > | > > > | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | void actionKill() { createConnectionToTclPart(); tclPart.printlnToSocket( "exit" ); tclPart.close(); programCounter.detach(); engineProvider.getDestructor().killEngine(); } private void updateTclVariablesModel() { if( modelListener != null) { modelListener.modelChanged( null); } } // Getters below: // public File getCurrentFile() { return currentFile; } public int getCurrentLineNumber() { return currentLineNumber; } public String getVariablesString() { return variablesString; } } |
Changes to TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/resources/debugServer.tcl.
︙ | ︙ | |||
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | variable lineNumber variable infoFrame # other globals variable startLevel variable socketFd proc setData args { set debug::infoFrame [info frame] set infoDict [info frame [expr $debug::infoFrame - $debug::startLevel]] set debug::lineNumber [dict get $infoDict line] set debug::fileName [dict get $infoDict file] } proc sendData args { puts $debug::socketFd $debug::fileName puts $debug::socketFd $debug::lineNumber flush $debug::socketFd } proc serverProc {channel clientaddr clientport} { set debug::socketFd $channel puts stderr ">>> connection from $clientaddr:$clientport" | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | variable lineNumber variable infoFrame # other globals variable startLevel variable socketFd proc listVars args { set level [expr [info level] - 2] set listVars [uplevel $level info vars] set formatted "" set count 0 foreach var $listVars { set isArray [uplevel $level array exists $var] if { $isArray } { set names [uplevel $level array names $var] #puts "$var = ISARRAY" set toAppend "$var = ISARRAY\n" append formatted $toAppend incr count #puts "[set var]KEYS = $names" set toAppend "[set var]_KEYS = $names\n" append formatted $toAppend incr count foreach n $names { set varname [set var]($n) set value [uplevel $level set $varname] #puts "$varname = $value" set toAppend "$varname = $value\n" append formatted $toAppend incr count } } else { #puts "$var = [uplevel $level set $var]" set toAppend "$var = [uplevel $level set $var]\n" append formatted $toAppend incr count } } append count "\n$formatted" return $count } proc setData args { set debug::infoFrame [info frame] set infoDict [info frame [expr $debug::infoFrame - $debug::startLevel]] set debug::lineNumber [dict get $infoDict line] set debug::fileName [dict get $infoDict file] } proc sendData args { puts $debug::socketFd $debug::fileName puts $debug::socketFd $debug::lineNumber set flist [listVars] puts -nonewline $debug::socketFd $flist flush $debug::socketFd } proc serverProc {channel clientaddr clientport} { set debug::socketFd $channel puts stderr ">>> connection from $clientaddr:$clientport" |
︙ | ︙ |
Added TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/variables/NameColumn.java.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* * Created during Google Summer Of Code 2011. * For Tcl/Tk Community by student Michał Poczwardowski * License: BSD */ package org.netbeans.modules.languages.tcl.debugger.variables; import org.netbeans.spi.viewmodel.ColumnModel; /** * CURRENTLY UNUSED/UNREGISTERED: * To register new Column please add: * META-INF/debugger/TclSersion/LocalsView/org.netbeans.spi.viewmodel.ColumntModel * and fill this with: org.netbeans.modules.languages.tcl.debugger.variables.NameColumn * @author dmp */ public class NameColumn extends ColumnModel { @Override public String getID() { return "Modification"; } @Override public String getDisplayName() { return "Modification Status"; } @Override public Class getType() { return TclVariable.class; } } |
Added TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/variables/TclVariable.java.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /* * Created during Google Summer Of Code 2011. * For Tcl/Tk Community by student Michał Poczwardowski * License: BSD */ package org.netbeans.modules.languages.tcl.debugger.variables; /** * * @author dmp */ public class TclVariable { private String name; private String value; private String type; public TclVariable( String name, String value ) { this.name=name; this.value=value; } public String getName() { return name; } public String getType() { return type; } public String getValue() { return value; } } |
Name change from TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/TclVariablesModel.java to TclPlugin/src/org/netbeans/modules/languages/tcl/debugger/variables/TclVariablesModel.java.
1 2 3 4 5 | /* * Created during Google Summer Of Code 2011. * For Tcl/Tk Community by student Michał Poczwardowski * License: BSD */ | | > > > > > > > > | | | | | | | | | > < < < < < | > > | > > > | > > > > > > > > > | > > > > > > | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | /* * Created during Google Summer Of Code 2011. * For Tcl/Tk Community by student Michał Poczwardowski * License: BSD */ package org.netbeans.modules.languages.tcl.debugger.variables; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Properties; import org.netbeans.modules.languages.tcl.debugger.TclDebuggerActionsProvider; import org.netbeans.modules.languages.tcl.debugger.TclDebuggerJavaPart; import org.netbeans.modules.languages.tcl.project.TclProject; import org.netbeans.spi.debugger.ContextProvider; import org.netbeans.spi.debugger.ui.Constants; import org.netbeans.spi.viewmodel.ModelListener; import org.netbeans.spi.viewmodel.NodeModel; import org.netbeans.spi.viewmodel.TableModel; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.UnknownTypeException; import org.openide.util.Exceptions; /** * * @author dmp */ public class TclVariablesModel implements TreeModel, NodeModel, TableModel { private static final String VARROOT="ROOT"; private ArrayList<ModelListener> listeners=new ArrayList<ModelListener>(); // private final ContextProvider lookupProvider; private TclDebuggerJavaPart tclDebugger; private Properties variableProperties; public TclVariablesModel( ContextProvider lookupProvider ) { TclDebuggerActionsProvider tclDebuggerActionsProvider=( TclDebuggerActionsProvider )lookupProvider.lookupFirst( null, TclDebuggerActionsProvider.class ); tclDebugger=tclDebuggerActionsProvider.getTclDebuggerJavaPart(); //this.lookupProvider=lookupProvider; } @Override public Object getRoot() { return VARROOT; } @Override public void addModelListener( ModelListener ml ) { tclDebugger.addModelListener( ml ); listeners.add( ml ); } @Override public void removeModelListener( ModelListener ml ) { listeners.remove( ml ); } @Override public boolean isReadOnly( Object o, String string ) throws UnknownTypeException { return true; } @Override public Object[] getChildren( Object o, int i, int i1 ) throws UnknownTypeException { System.out.println( "getChildren of o:" + o ); ArrayList<Object> kids=new ArrayList<Object>(); String name; String value; String variablesString = tclDebugger.getVariablesString(); if( o == VARROOT && !variablesString.isEmpty()) { StringReader sr=new StringReader( variablesString ); this.variableProperties=new Properties(); try { variableProperties.load( sr ); System.out.println( variableProperties.keySet().size()); for( Object object:variableProperties.keySet() ) { name=( String )object; value=variableProperties.getProperty( name ); kids.add( new TclVariable( name, value ) ); } } catch( IOException ex ) { Exceptions.printStackTrace( ex ); } } return kids.toArray(); } @Override public boolean isLeaf( Object o ) throws UnknownTypeException { if( o instanceof String ) { String s=( String )o; if( s.compareTo( VARROOT ) == 0 ) { return false; } } return true; } @Override public int getChildrenCount( Object o ) throws UnknownTypeException { return 2; } @Override public String getDisplayName( Object o ) throws UnknownTypeException { TclVariable var=( TclVariable )o; return var.getName(); } @Override public String getIconBase( Object o ) throws UnknownTypeException { return TclProject.getImageIcon().toString(); } |
︙ | ︙ | |||
101 102 103 104 105 106 107 | System.out.println( "setValueAt" ); } @Override public Object getValueAt( Object o, String string ) throws UnknownTypeException { if( o instanceof TclVariable ) { TclVariable var=( TclVariable )o; | | | | | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | System.out.println( "setValueAt" ); } @Override public Object getValueAt( Object o, String string ) throws UnknownTypeException { if( o instanceof TclVariable ) { TclVariable var=( TclVariable )o; if( string.compareTo( Constants.LOCALS_VALUE_COLUMN_ID ) == 0 ) { return var.getValue(); } if( string.compareTo( Constants.LOCALS_TYPE_COLUMN_ID ) == 0 ) { return "String"; } } return ""; } } |