Netbeans Support for Tcl

Check-in [689e69ec6f]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
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: 689e69ec6f814e6efb5418e08d2b813c809d4ba0
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].
Context
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
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to TclPlugin/src/META-INF/debugger/TclSession/LocalsView/org.netbeans.spi.viewmodel.NodeModel.

1
org.netbeans.modules.languages.tcl.debugger.TclVariablesModel
|
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.TclVariablesModel
|
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.TclVariablesModel
|
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
43
44







45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
	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;
	private static final Set actions=new HashSet();








	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 );
	}

	private TclDebuggerJavaPart tclDebuggerJavaPart;

	public TclDebuggerActionsProvider( ContextProvider contextProvider ) {
		engineProvider=( TclDebuggerEngineProvider )contextProvider.lookupFirst( null, DebuggerEngineProvider.class );
		for( Iterator it=actions.iterator(); it.hasNext(); ) {
			setEnabled( it.next(), true );
		}
	}







|

>
>
>
>
>
>
>











<







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
97
98
99
100
101
102
103
104
							      new ProjectExchangeService() {

								      @Override
								      public TclProject getProject() {
									      return tclProject;
								      }

							      }
						      };
				       }

			       }, null
		       } );

		manager.startDebugging( info );







|







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
145



			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
118
119

120
121
122
123
124
125
126
		}

	}

	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();
		}
	}
	

	// Action handlers below:
	//
	public void actionStepOver() {
		createConnectionToTclPart();
		tclPart.printlnToSocket( "stepover" );
		getExecutionStatus();
	}







>


>
>


>
>
>
>
>
>
>
>
>
>
>
>




|
|
>







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


164



	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
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
/*
 * Created during Google Summer Of Code 2011.
 * For Tcl/Tk Community by student Michał Poczwardowski
 * License: BSD
 */
package org.netbeans.modules.languages.tcl.debugger;



import java.util.ArrayList;



import org.netbeans.modules.languages.tcl.project.TclProject;


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;


/**
 *
 * @author dmp
 */
public class TclVariablesModel implements TreeModel, NodeModel, TableModel {

	class TclVariable {

		public TclVariable( String name, String value ) {
			this.name=name;
			this.value=value;
		}

		public String name;
		public String value;

	}

	private static final String NAME="LocalsType";
	private static final String VALUE="LocalsValue";
	private static final String TCL_ROOT="RoottooR";
	private ArrayList<ModelListener> listeners=new ArrayList<ModelListener>();

	@Override
	public Object getRoot() {
		return TCL_ROOT;
	}

	@Override
	public void addModelListener( ModelListener 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 {

        	ArrayList<Object> kids = new ArrayList<Object>();



		kids.add( new TclVariable("foo", "1"));









		kids.add( new TclVariable("bar", "2"));






		return kids.toArray();
		
	}

	@Override
	public boolean isLeaf( Object o ) throws UnknownTypeException {
		if( o instanceof String ) {
			String s=( String )o;
			if( s.compareTo( TCL_ROOT ) == 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.name;
	}

	@Override
	public String getIconBase( Object o ) throws UnknownTypeException {
		return TclProject.getImageIcon().toString();
	}






|

>
>

>
>
>

>
>





>







|
|
|
|
|
|
|
|
|
>

<
<
<
<
<



|




>















>
|
>
>
>
|
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>

|






|














|







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
108
109
110
111
112
113
114
115
116
117
118
		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( NAME ) == 0 ) {
				return var.name;
			}
			if( string.compareTo( VALUE ) == 0 ) {
				return var.value;
			}
		}
		return "";
	}

}







|
|

|
|






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 "";
	}

}