I just took a quick look at the problem you are having but I am wondering
if it is actually a "feature" and not a bug. For instance, if I run the
following code in tclsh and in jacl I get the same results (the
upvared name is passed to the trace callback).
proc tracecall { args } {
puts "tracecall = \{$args\}"
}
proc testtrace {varnm value} {
upvar #0 $varnm panvar
set panvar(name) $value
}
set arr(name) mo
trace variable arr(name) w tracecall
testtrace arr doug
tclsh prints "tracecall = {panvar name w}"
jacl prints "tracecall = {panvar name w}"
Any reaction?
Mo DeJong
[EMAIL PROTECTED]
On Mon, 10 May 1999, Johnson, Bruce wrote:
> I've been having a little trouble with implementing traces for the widget
> variables used in my Swank package (a Tk-like interface to Swing). Below is
> some example Java code that implements a trace on a variable (in this case
> for a textual widget, like an entry). The code works fine until you try to
> use it from a Tcl proc where you use an "upvar" command..
>
> For example, if you test with the following procedure and commands:
>
> proc testtrace {varnm value} {
> upvar #0 $varnm panvar
> set panvar(name) $value
> }
>
>
> entry .e -textvariable tvar(name)
>
> testtrace tvar value
>
> you find that the arguments string1 and string2 of traceProc are "panvar"
> and "name"
>
> not "tvar" and "name" and an exception is thrown:
> can't set panvar(name): can't read "panvar(name)" no such variable
> Any thoughts?
>
> Bruce
>
> package swank;
> import java.util.*;
> import java.lang.*;
> import java.awt.*;
> import javax.swing.*;
> import javax.swing.text.*;
> import javax.swing.event.*;
> import tcl.lang.*;
>
> public class myDocumentListener implements DocumentListener,VarTrace
> {
> Interp interp;
> String varName = null;
> JTextComponent jtext;
> boolean traceLock = false;
>
> myDocumentListener(Interp interp,JTextComponent jtext) {
> this.interp = interp;
> this.jtext = jtext;
> }
> public void traceProc(Interp interp, String string1, String string2, int
> flags) throws TclException
> {
> if (!traceLock) {
> TclObject tobj = interp.getVar(string1,string2,TCL.GLOBAL_ONLY);
> jtext.setText(tobj.toString());
> }
> traceLock = false;
> }
>
> public void setVarName(String name) throws TclException {
> if ((varName != null) && (!varName.equals(""))) {
> interp.untraceVar(varName,this,TCL.TRACE_WRITES|
> TCL.GLOBAL_ONLY);
> }
> try {
> TclObject tobj = interp.getVar(name,TCL.GLOBAL_ONLY);
> }
> catch (TclException tclException)
> {
> TclObject tobj = TclString.newInstance("");
> interp.setVar(name,tobj,TCL.GLOBAL_ONLY);
> }
> interp.traceVar(name,this,TCL.TRACE_WRITES| TCL.GLOBAL_ONLY);
> varName = new String(name);
> }
>
> public String getVarName() {
> return(varName);
> }
>
> public void updateVar(DocumentEvent docEvent)
> {
> if (varName==null) {
> return;
> }
> Document doc = docEvent.getDocument();
> String string=null;
> try {
> string = doc.getText(0,doc.getLength());
> }
> catch (BadLocationException e) {
> return;
> }
>
> TclObject tobj = TclString.newInstance(string);
> try {
> traceLock = true;
> interp.setVar(varName,tobj,TCL.GLOBAL_ONLY);
> } catch (TclException tclException) {
> return;
> }
> }
>
> public void insertUpdate(DocumentEvent docEvent) {
> updateVar(docEvent);
> }
>
> public void removeUpdate(DocumentEvent docEvent) {
> updateVar(docEvent);
> }
> public void changedUpdate(DocumentEvent docEvent) {
> updateVar(docEvent);
> }
> }
>
> ----------------------------------------------------------------
> The TclJava mailing list is sponsored by WebNet Technologies.
> To subscribe: send mail to [EMAIL PROTECTED]
> with the word SUBSCRIBE as the subject.
> To unsubscribe: send mail to [EMAIL PROTECTED]
> with the word UNSUBSCRIBE as the subject.
> To send to the list, send email to '[EMAIL PROTECTED]'.
> A list archive is at: http://www.findmail.com/listsaver/tcldallas/
>
----------------------------------------------------------------
The TclJava mailing list is sponsored by WebNet Technologies.
To subscribe: send mail to [EMAIL PROTECTED]
with the word SUBSCRIBE as the subject.
To unsubscribe: send mail to [EMAIL PROTECTED]
with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'.
A list archive is at: http://www.findmail.com/listsaver/tcldallas/