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/

Reply via email to