Scipad 6.108
Francois Vogel [Sat, 12 May 2007 09:26:27 +0000 (09:26 +0000)]
 * Size implicit indices (type 129) are displayed in details in the watch
   window
 * Matlab sparse matrices (type 7) are watchable
 * Fixed: the watch variables must not be sent (written) to Scilab when
   skipping no code lines (they were already no longer read since 6.106)
 * Fixed: when only non editable variables were watched, the only way to add
   a watch variable was to remove all the non editable variables, then add
   the new variable and re-add the removed ones
 * The listboxes in the watch window and configure box have always an item
   selected (when not empty). They must have -exportselection 0, otherwise
   their selection gets lost when the Add arg box is opened
 * Catched the bubble information display for watch variables: the information
   to display in the tooltip might not yet be available (because watch
   variables can be added in any debugger state but their values and types are
   only updated in "DebugInProgress" state)
 * Scipad no longer flashes on executing the first debug command (was due to
   the temporary buffer packing the time needed for execing it)
 * scipad.xml: simplified the calling sequence and added a note about the
   watching capabilities of the debugger

scilab/modules/scipad/VERSION.xml
scilab/modules/scipad/changelog.txt
scilab/modules/scipad/help/en_US/scipad.xml
scilab/modules/scipad/macros/scipad_internals/FormatStringsForWatch.sci
scilab/modules/scipad/tcl/db_argsmanagement.tcl
scilab/modules/scipad/tcl/db_configureexec.tcl
scilab/modules/scipad/tcl/db_debugsession.tcl
scilab/modules/scipad/tcl/db_init.tcl
scilab/modules/scipad/tcl/db_watch.tcl
scilab/modules/scipad/tcl/msg_files/fr.msg
scilab/modules/scipad/tcl/tooltips.tcl

index c1fa53a..77fc216 100644 (file)
@@ -15,5 +15,5 @@
 -->
 <!-- =================== -->
 
-<VERSION major="6" minor="107" maintenance="0" revision="0" string="SciPad unstable-svn" />
+<VERSION major="6" minor="108" maintenance="0" revision="0" string="SciPad unstable-svn" />
 </MODULE_VERSION>
index 0e2caa7..f163da2 100644 (file)
@@ -2982,3 +2982,25 @@ Francois VOGEL, 08/05/07
    thus improving a bit the performance
  * Added better display in the debugger for non editable variable types
  * version --> 6.107
+
+Francois VOGEL, 12/05/07
+ * Size implicit indices (type 129) are displayed in details in the watch
+   window
+ * Matlab sparse matrices (type 7) are watchable
+ * Fixed: the watch variables must not be sent (written) to Scilab when
+   skipping no code lines (they were already no longer read since 6.106)
+ * Fixed: when only non editable variables were watched, the only way to add
+   a watch variable was to remove all the non editable variables, then add
+   the new variable and re-add the removed ones
+ * The listboxes in the watch window and configure box have always an item
+   selected (when not empty). They must have -exportselection 0, otherwise
+   their selection gets lost when the Add arg box is opened
+ * Catched the bubble information display for watch variables: the information
+   to display in the tooltip might not yet be available (because watch
+   variables can be added in any debugger state but their values and types are
+   only updated in "DebugInProgress" state)
+ * Scipad no longer flashes on executing the first debug command (was due to
+   the temporary buffer packing the time needed for execing it)
+ * scipad.xml: simplified the calling sequence and added a note about the
+   watching capabilities of the debugger
+ * version --> 6.108
index 230b4f6..cf753ca 100644 (file)
   <CALLING_SEQUENCE>
     <CALLING_SEQUENCE_ITEM>scipad()</CALLING_SEQUENCE_ITEM>
 
-    <CALLING_SEQUENCE_ITEM>scipad(f)</CALLING_SEQUENCE_ITEM>
-
-    <CALLING_SEQUENCE_ITEM>scipad(f1,f2,...)</CALLING_SEQUENCE_ITEM>
-
-    <CALLING_SEQUENCE_ITEM>scipad([f1,f2,...])</CALLING_SEQUENCE_ITEM>
+    <CALLING_SEQUENCE_ITEM>scipad(f1[,f2,...])</CALLING_SEQUENCE_ITEM>
 
     <CALLING_SEQUENCE_ITEM>scipad f1 f2 ...</CALLING_SEQUENCE_ITEM>
   </CALLING_SEQUENCE>
   <PARAM>
     <PARAM_INDENT>
       <PARAM_ITEM>
-        <PARAM_NAME>f, f1, f2...</PARAM_NAME>
+        <PARAM_NAME>f1, f2...</PARAM_NAME>
 
         <PARAM_DESCRIPTION>
-          <SP>: file or directory pathnames (strings)</SP>
+          <SP>: (strings or vectors of strings) file or directory pathnames</SP>
         </PARAM_DESCRIPTION>
       </PARAM_ITEM>
     </PARAM_INDENT>
     <P>At any time during the debug, a <BD>watch window</BD> can be displayed
     on user request. It allows to monitor any variable value, or change a
     variable value during a breakpoint stop and relaunch execution with the
-    modified value. The watch window also displays the calling stack and
+    modified value. A watchable variable can be part of a larger structure,
+    for instance if A is a 20x20 matrix, the shorter sub-matrix A(2:4,7:9)
+    can be watched. The watch window also displays the calling stack and
     contains a toolbar with the most useful commands from the debug menu.</P>
 
     <P></P>
index 944d529..846b965 100644 (file)
@@ -11,9 +11,9 @@ function [svar,tysi] = FormatStringsForWatch(var)
 // Both strings are used for the watch window of the debugger in Scipad.
 // Author: François Vogel, 2004-2007
 
-  unklabel   = "<?>"; // Warning: if this is changed it must be changed accordingly in db_init.tcl
-  unsuptyp_l = "<<";  // Ditto
-  unsuptyp_r = ">>";  // Ditto
+  unklabel = "<?>"; // Warning: if this is changed it must be changed accordingly in db_init.tcl
+  noedit_l = "<<";  // Ditto
+  noedit_r = ">>";  // Ditto
 
   if execstr("tvar = type(var);","errcatch") <> 0 then
     warning(LocalizeForScipad(" what you try to watch is not supported by the debugger"));
@@ -22,7 +22,7 @@ function [svar,tysi] = FormatStringsForWatch(var)
 
   else
 
-    if and(tvar<>[1 2 4 5 6 8 9 10 11 13 14 15 16 17 128 129 130]) then
+    if and(tvar<>[1 2 4 5 6 7 8 9 10 11 13 14 15 16 17 128 129 130]) then
       // unsupported cases
       warning(LocalizeForScipad(" what you try to watch is of type ")...
           +typeof(var)...
@@ -122,6 +122,23 @@ function [svar,tysi] = FormatStringsForWatch(var)
         tysi = LocalizeForScipad("Type:") + " " + typeof(var) + ", " + ...
                LocalizeForScipad("size:") + " " + string(nr) + "x" + string(nc);
 
+      case 7 then  // Matlab sparse matrix
+        [ij,v,mn]=spget(var);
+        ind = FormatStringsForWatch(ij);
+        vec = FormatStringsForWatch(v);
+        dim = FormatStringsForWatch(mn);
+        svar = "mtlb_sparse(sparse(" + ind + "," + vec + "," + dim + "))";
+        [nr,nc] = size(var);
+        // isreal does not work with a Matlab sparse (%msp_isreal is not defined)
+        // so use a detour
+        if isreal(sparse(ij,v,mn)) then
+          reco = LocalizeForScipad("real");
+        else
+          reco = LocalizeForScipad("complex");
+        end
+        tysi = LocalizeForScipad("Type:") + " " + typeof(var) + " (" + reco + "), " + ...
+               LocalizeForScipad("size:") + " " + string(nr) + "x" + string(nc);
+
       case 8 then  // 1, 2 or 4-bytes integer matrix (this works for 1 to 10-bytes int or uint)
         if prod(size(var)) > 1 then
           svar = MatFormatStringsForWatch(var);
@@ -137,11 +154,11 @@ function [svar,tysi] = FormatStringsForWatch(var)
                LocalizeForScipad("size:") + " " + string(nr) + "x" + string(nc);
 
       case 9 then  // graphic handle, we aren't yet able to display the content
-        svar = unsuptyp_l + LocalizeForScipad("graphic handle") + unsuptyp_r
+        svar = noedit_l + LocalizeForScipad("graphic handle") + noedit_r
         [nr,nc] = size(var);
         tysi = LocalizeForScipad("Type:") + " " + typeof(var) + ", " + ...
                LocalizeForScipad("size:") + " " + string(nr) + "x" + string(nc);
-         
+
       case 10 then  // character string matrix
         if prod(size(var)) > 1 then
           svar = MatFormatStringsForWatch(var);
@@ -162,22 +179,22 @@ function [svar,tysi] = FormatStringsForWatch(var)
 
       case 11 then  // uncompiled function
         Vars = macrovar(var);
-        svar = unsuptyp_l + LocalizeForScipad("uncompiled function") + unsuptyp_r + ...
-               "+\[" + strcat(Vars(2)',",") + "]=...(" + strcat(Vars(1)',",") + ")"
+        svar = noedit_l + LocalizeForScipad("uncompiled function") + noedit_r + ...
+               ":\[" + strcat(Vars(2)',",") + "]=...(" + strcat(Vars(1)',",") + ")"
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
 
       case 13 then  // compiled function
         Vars = macrovar(var)
-        svar = unsuptyp_l + LocalizeForScipad("compiled function") + unsuptyp_r + ...
+        svar = noedit_l + LocalizeForScipad("compiled function") + noedit_r + ...
                ":\[" + strcat(Vars(2)',",") + "]=...(" + strcat(Vars(1)',",") + ")"
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
 
       case 14 then  // library
         s = string(var)
-        svar = unsuptyp_l + LocalizeForScipad("library") + unsuptyp_r + ...
+        svar = noedit_l + LocalizeForScipad("library") + noedit_r + ...
                ":" + strcat(s(2:$),",")
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
-        
+
       case 15 then  // list or tlist or mlist (types 16 and 17 changed into 15 above)
         if length(var) == 0 then svar = listpref + "list()";
         else
@@ -195,19 +212,18 @@ function [svar,tysi] = FormatStringsForWatch(var)
         tysi = LocalizeForScipad("Type:") + " " + typeof(var) + ", " + ...
                LocalizeForScipad("size:") + " " + string(length(var)) + " " + LocalizeForScipad("elements");
 
-      case 128 then  // pointer
-        svar = unsuptyp_l + LocalizeForScipad("pointer") + unsuptyp_r
+      case 128 then  // pointer, e.g. a=rand(5,5);b=rand(5,1);A=sparse(a);[h,rk]=lufact(A);typeof(h), type(h)
+        svar = noedit_l + LocalizeForScipad("pointer") + noedit_r
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
 
-      case 129 then  // size implicit index?
-        svar = unsuptyp_l + LocalizeForScipad("size implicit index") + unsuptyp_r
+      case 129 then  // size implicit index, e.g. index=2:$; typeof(index), type(index)
+        svar = noedit_l + LocalizeForScipad("size implicit index") + noedit_r + " " + sci2exp(var)
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
 
       case 130 then  // intrinsic function
-        svar = unsuptyp_l + LocalizeForScipad("primitive") + unsuptyp_r
+        svar = noedit_l + LocalizeForScipad("primitive") + noedit_r
         tysi = LocalizeForScipad("Type:") + " " + typeof(var)
 
-
       end
     end
   end
index 1aa47f6..96adbce 100644 (file)
@@ -1,14 +1,21 @@
 proc Addarg_bp {w focusbut leftwin rightwin} {
 # Create the add argument dialog
 # This dialog can be called from the watch window or from the configure dialog
+# Calling this proc with $leftwin being an empty listbox or a non empty listbox
+# with no selected item will result in creating a new element (unless the user
+# hits Cancel)
     global argname argvalue
     global adda getvaluefromscilab
     global textFont menuFont
 
-    set pos [$leftwin curselection]
-    if {$pos == ""} {set pos -1}
+    if {[$leftwin index end] == 0} {
+        set emptylistbox true
+    } else {
+        set emptylistbox false
+    }
+
     set selecteditem [$leftwin curselection]
-    if {$selecteditem != ""} {
+    if {!$emptylistbox && $selecteditem != ""} {
         set argname [$leftwin get $selecteditem]
         set argvalue [$rightwin get $selecteditem]
         # check that what the user selected for edit is actually editable
@@ -17,15 +24,22 @@ proc Addarg_bp {w focusbut leftwin rightwin} {
             set editable [lindex [createsetinscishellcomm $argname] 3]
             if {!$editable} {
                 tk_messageBox -message \
-                    [mc "This variable can be watched but cannot be edited!"] \
+                    [concat [mc "This variable can be watched but cannot be edited!"]\
+                            [mc "A new watch variable will be created."] ] \
                     -icon warning -type ok \
                     -title [mc "Non editable variable"]
+                # run the add variable dialog again after having cleared the selection,
+                # which is a special case in proc Addarg_bp: listbox is not empty but
+                # has no currently selected item
+                $leftwin selection clear $selecteditem
+                Addarg_bp $w $focusbut $leftwin $rightwin
                 return
             }
         }
     } else {
         set argname ""
         set argvalue ""
+        set selecteditem -1
     }
 
     set adda $w.adda
@@ -74,22 +88,22 @@ proc Addarg_bp {w focusbut leftwin rightwin} {
     set bestwidth [mcmaxra "OK" \
                            "Cance&l"]
     button $adda.f.f9.buttonOK -text "OK" \
-           -command "OKadda_bp $pos $leftwin $rightwin ; destroy $adda"\
+           -command "OKadda_bp $selecteditem $leftwin $rightwin ; destroy $adda"\
            -width $bestwidth -font $menuFont
     eval "button $adda.f.f9.buttonCancel [bl "Cance&l"] \
-           -command \"Canceladda_bp $adda $pos $leftwin\"\
+           -command \"Canceladda_bp $adda $selecteditem $leftwin\"\
            -width $bestwidth -font \[list $menuFont\] "
     pack $adda.f.f9.buttonOK $adda.f.f9.buttonCancel -side left -padx 10
     pack $adda.f.f9 -pady 4
     pack $adda.f -expand 1 -fill x
 
-    bind $adda <Return> "OKadda_bp $pos $leftwin $rightwin ; destroy $adda"
-    bind $adda <Escape> "Canceladda_bp $adda $pos $leftwin"
+    bind $adda <Return> "OKadda_bp $selecteditem $leftwin $rightwin ; destroy $adda"
+    bind $adda <Escape> "Canceladda_bp $adda $selecteditem $leftwin"
 
     bind $adda <Alt-[fb $adda.f.cbox1]>           "$adda.f.cbox1 invoke"
     bind $adda <Alt-[fb $adda.f.f9.buttonCancel]> "$adda.f.f9.buttonCancel invoke"
 
-    if {$selecteditem != ""} {
+    if {$selecteditem != -1} {
         focus $adda.f.f2.entry
     } else {
         focus $adda.f.f1.entry
@@ -175,6 +189,8 @@ proc OKadda_bp {pos leftwin rightwin {forceget "false"}} {
         }
         if {$alreadyexists == "false"} {
             # a new variable was added in the add box
+            $leftwin selection clear $pos
+            # set insert position after the currently selected item
             incr pos
             if {[string first listboxinput $leftwin] != -1} {
                 # the proc was called from configure box
@@ -198,13 +214,15 @@ proc OKadda_bp {pos leftwin rightwin {forceget "false"}} {
             $leftwin see $pos
         } else {
             # an existing variable was modified in the add box
-            set nextone [expr {$eltindex + 1}]
-            if {$nextone >= [$leftwin size]} {
-                set nextone 0
-            }
+            $leftwin selection clear $eltindex
             if {[string first listboxinput $leftwin] != -1} {
                 # the proc was called from configure box
                 set funvarsvals($funname,$argname) $argvalue
+                set nextone [expr {$eltindex + 1}]
+                if {$nextone >= [$leftwin size]} {
+                    set nextone 0
+                }
+                set selitem $nextone
             } else {
                 # the proc was called from the watch window
                 if {$argvalue == ""} {set argvalue $unklabel}
@@ -216,9 +234,10 @@ proc OKadda_bp {pos leftwin rightwin {forceget "false"}} {
                     ScilabEval_lt $fullcomm "seq"
                     set argvalue $watchvarsvals($argname)
                 }
+                set selitem $eltindex
             }
-            $leftwin selection set $nextone
-            $leftwin see $nextone
+            $leftwin selection set $selitem
+            $leftwin see $selitem
             $rightwin delete $eltindex
             $rightwin insert $eltindex $argvalue
         }
@@ -235,12 +254,17 @@ proc OKadda_bp {pos leftwin rightwin {forceget "false"}} {
             getwatchvarfromshell          ; # get new value of all the watched variables
         }
 
+    } else {
+        # $argname is empty
+        if {$pos == -1} {set pos 0}
+        $leftwin selection set $pos
     }
 }
 
 proc Canceladda_bp {w pos leftwin} {
 # Close the add argument dialog and ignore the values of its fields
     destroy $w
+    if {$pos == -1} {set pos 0}
     $leftwin selection set $pos
 }
 
index 23688db..f3e16ed 100644 (file)
@@ -81,10 +81,10 @@ proc configurefoo_bp {} {
     scrollbar $listboxscrolly -command "scrollyboth_bp $listboxinput $listboxinputval"
     listbox $listboxinput -height 6 -width 12 -font $textFont -yscrollcommand \
                           "scrollyrightandscrollbar_bp $listboxscrolly $listboxinput $listboxinputval" \
-                          -takefocus 0
+                          -takefocus 0 -exportselection 0
     listbox $listboxinputval -height 6 -width 25 -font $textFont -yscrollcommand \
                           "scrollyleftandscrollbar_bp $listboxscrolly $listboxinput $listboxinputval" \
-                          -takefocus 0
+                          -takefocus 0 -exportselection 0
     if {[info exists funvars($funname)]} {
         foreach var $funvars($funname) {
             $listboxinput insert end $var
@@ -190,6 +190,7 @@ proc scrollyrightandscrollbar_bp {lbscrolly leftwin rightwin x y} {
     eval "$rightwin yview $firstvisible"
 }
 proc selectinrightwin_bp {leftwin rightwin} {
+    $leftwin selection clear 0 end
     set selecteditem [$rightwin curselection]
     if {$selecteditem != ""} {
         $rightwin selection clear $selecteditem
index 817219b..7c558bc 100644 (file)
@@ -18,6 +18,8 @@ proc execfile_bp {{stepmode "nostep"}} {
 # return argument: 0=success, -1=fail
     global funnameargs listoftextarea funsinbuffer waitmessage watchvars
     global setbptonreallybreakpointedlinescmd
+    global tmpdir
+
     if {[isscilabbusy 5]} {return}
     showinfo $waitmessage
 
@@ -50,11 +52,6 @@ proc execfile_bp {{stepmode "nostep"}} {
         #         buffers 1) tagged as scilab buffers and 2) colorized
         #         Maybe a warning to the user about the non exec-ing of
         #         scilab not colorized buffers would be a good idea...
-        # <TODO>: if the same function name can be found in more than one
-        #         buffer, then the last found will be the one known by
-        #         Scilab during debug - the user receives a message box
-        #         but it would be better to support it (i.e. let the user
-        #         select which function he wants to use)
         # <TODO>: instead of execing all non level zero code from all scilab
         #         scheme buffers, Scipad should actually exec only the
         #         configured function plus all its ancillaries if those
@@ -91,14 +88,30 @@ proc execfile_bp {{stepmode "nostep"}} {
             }
         }
 
-        # create a new buffer, exec it and then destroy it
-        # doing this, there is not even a flash in the display
-        set saved_ta [gettextareacur]
-        filesetasnew
-        [gettextareacur] insert 1.0 $allfuntexts
-        set execresult [execfile "current"]
-        closecur "NoSaveQuestion"
-        showtext $saved_ta
+        # create a temporary file, puts everything in there, and exec it
+        # this part is catched to take into account possible access
+        # (permissions) errors
+        if {[catch {
+            set fname [file join $tmpdir "Scipad_execfile_bp_tempfile.sci"]
+            # mode(-1) to prevent Scilab to echo the commands passed to the temporary
+            # file - only "mode(-1)" will be displayed in the Scilab shell when the
+            # ScilabEval "exec ..." below gets executed
+            set fid [open $fname w]
+            puts $fid "mode(-1);"
+            puts $fid $allfuntexts
+            close $fid
+            ScilabEval_lt "exec(\"$fname\")" "sync" "seq"
+            set execresult 0
+        }] != 0} {
+            # if the temporary file solution did not work, let's create a
+            # temporary regular buffer and exec it!
+            set saved_ta [gettextareacur]
+            filesetasnew
+            [gettextareacur] insert 1.0 $allfuntexts
+            set execresult [execfile "current"]
+            closecur "NoSaveQuestion"
+            showtext $saved_ta
+        }
         if {$execresult == -1} {
             # in case execing the file produced an error, restore the cursors
             # and return (the debug must not be launched) - the cleanup has
@@ -803,16 +816,21 @@ proc resume_bp {{checkbusyflag 1} {stepmode "nostep"}} {
     if {$funnameargs != ""} {
         setdebuggerbusycursor
         if {![isnocodeline [gettextareacur] insert]} {
+            # the debugger is not currently skipping no code lines
             removelocalvars
-        }
-        set commnvars [createsetinscishellcomm $watchvars]
-        set watchsetcomm [lindex $commnvars 0]
-        if {$watchsetcomm != ""} {
-            set visibilitycomm [lindex $commnvars 2]
-            ScilabEval_lt "$visibilitycomm;$watchsetcomm" "seq"
-            set returnwithvars [lindex $commnvars 1]
-            ScilabEval_lt "$returnwithvars" "seq"
+            set commnvars [createsetinscishellcomm $watchvars]
+            set watchsetcomm [lindex $commnvars 0]
+            if {$watchsetcomm != ""} {
+                set visibilitycomm [lindex $commnvars 2]
+                ScilabEval_lt "$visibilitycomm;$watchsetcomm" "seq"
+                set returnwithvars [lindex $commnvars 1]
+                ScilabEval_lt "$returnwithvars" "seq"
+            } else {
+                ScilabEval_lt "resume(0)" "seq"
+            }
         } else {
+            # the debugger is currently skipping no code lines
+            # the watch variables do not have to be updated
             ScilabEval_lt "resume(0)" "seq"
         }
         updateactivebreakpoint
@@ -832,6 +850,9 @@ proc goonwo_bp {} {
     # the debugger won't execute in that case
     if {[checkforduplicatefunnames]} {return}
 
+    # no test on [getdbstate], this proc can only be called in "DebugInProgress"
+    # state (this is set by the debugger state machine in proc setdbmenuentriesstates_bp)
+
     showinfo $waitmessage
     if {$funnameargs != ""} {
         removeallactive_bp
index 01ccd7f..64c3e0a 100644 (file)
@@ -1,8 +1,8 @@
 set funnameargs ""
 set funnames ""
-set unklabel "<?>"   ;# Warning: if this is changed it must be changed accordingly in FormatStringsForWatch.sci
-set unsuptyp_l "<<"  ;# Ditto
-set unsuptyp_r ">>"  ;# Ditto
+set unklabel "<?>" ;# Warning: if this is changed it must be changed accordingly in FormatStringsForWatch.sci
+set noedit_l "<<"  ;# Ditto
+set noedit_r ">>"  ;# Ditto
 set curdropind 0
 set dragndroplb ""
 set watchvars ""
index a1ff74c..7b360e4 100644 (file)
@@ -259,11 +259,11 @@ proc showwatch_bp {} {
     listbox $lbvarname -height 6 -width 12 -font $textFont -yscrollcommand \
                        "scrollyrightandscrollbar_bp $scrolly $lbvarname $lbvarval" \
                        -xscrollcommand "$scrollxl set" \
-                       -takefocus 0
+                       -takefocus 0 -exportselection 0
     listbox $lbvarval  -height 6 -font $textFont -yscrollcommand \
                        "scrollyleftandscrollbar_bp $scrolly $lbvarname $lbvarval" \
                        -xscrollcommand "$scrollxr set" \
-                       -takefocus 0
+                       -takefocus 0 -exportselection 0
     if {[info exists watchvars]} {
         foreach var $watchvars {
             $lbvarname insert end $var
@@ -449,14 +449,20 @@ proc updatewatch_bp {} {
     if {[info exists watch]} {
         if {[winfo exists $watch]} {
             if {[info exists watchvars]} {
+                set curlbsel [$lbvarname curselection]
                 $lbvarname delete 0 end
                 $lbvarval delete 0 end
                 foreach var $watchvars {
                     $lbvarname insert end $var
                     $lbvarval insert end $watchvarsvals($var)
                 }
-                $lbvarname selection set 0
-                $lbvarname see 0
+                if {$curlbsel != ""} {
+                    $lbvarname selection set $curlbsel
+                    $lbvarname see $curlbsel
+                } else {
+                    $lbvarname selection set 0
+                    $lbvarname see 0
+                }
             }
             $callstackwidget configure -state normal
             $callstackwidget delete 1.0 end
@@ -587,14 +593,14 @@ proc getlocalsnames {} {
     # note the complication below to provide a function (type 13)
     # and not a string to macrovar, and to let the expression be
     # evaluated at the correct time...!
-    
+
     # Moreover, the test on the emptiness of db_curfunname allows
     # to deal easily with the case where the debugger finished
     # the debug: [lindex $callstackfuns 0] is empty and would throw
     # an error in macrovar(""). In this case no local variable is
     # to be considered and the elements of $varsforautowatchloc are
     # reset to empty lists
+
     # finally, to ease backporting, the result of TCL_EvalStr is not
     # used directly, the usual detour with TCL_GetVar is used
 
@@ -733,9 +739,9 @@ proc createsetinscishellcomm {setofvars} {
 #         3. execstr("var1",...,varN","errcatch","n");
 #         4. a list of editable true|false flags for each variable
 # Elements of variables from $setofvars whose value is $unklabel or starts with
-# $unsuptyp_l are filtered out (ignored)
+# $noedit_l are filtered out (ignored)
     global watchvars watchvarsvals unklabel
-    global unsuptyp_l
+    global noedit_l
     set fullcomm ""
     set varset ""
     set retcomm ""
@@ -743,7 +749,7 @@ proc createsetinscishellcomm {setofvars} {
     set editable [list ]
     foreach var $setofvars {
         if {[string first $unklabel $watchvarsvals($var)] == -1 && \
-            [string first $unsuptyp_l $watchvarsvals($var)] == -1} {
+            [string first $noedit_l $watchvarsvals($var)] == -1} {
             # Variable is fully defined and is editable
             set onecomm [duplicatechars "$var=$watchvarsvals($var);" "\""]
             set onecomm [duplicatechars $onecomm "'"]
@@ -759,7 +765,7 @@ proc createsetinscishellcomm {setofvars} {
             if {$watchvarsvals($var) == $unklabel} {
                 # Variable is fully undefined, nothing to do
                 lappend editable true
-            } elseif {[string range $watchvarsvals($var) 0 1] == $unsuptyp_l} {
+            } elseif {[string range $watchvarsvals($var) 0 1] == $noedit_l} {
                 # Variable is a single non editable type, nothing to do
                 lappend editable false
             } else {
@@ -767,11 +773,11 @@ proc createsetinscishellcomm {setofvars} {
                 # contains at least one element of non editable type
                 # In this case, we're dealing with list(elt1,..,eltn,$unklabel,eltm,..,eltp)
                 # and $unklabel can appear any number of times >1 in the elements list, or
-                # with list(elt1,..,eltn,$unsuptyp_lsomething$unsuptyp_r,eltm,..,eltp)
+                # with list(elt1,..,eltn,$noedit_lsomething$noedit_r,eltm,..,eltp)
                 # or with a mix of these two
                 # Result: variable is split into:
                 # $var=list();$var($curind)=elt1; and so on, forgetting the undefined and
-                # non editable elements marked as $unklabel or starting with $unsuptyp_l
+                # non editable elements marked as $unklabel or starting with $noedit_l
                 # This recreates truly undefined elements in Scilab
                 # Note that this method does in fact not support lists with non editable
                 # elements: those elements would be erased from the list and replaced by
@@ -826,7 +832,7 @@ proc createsetinscishellcomm {setofvars} {
                     incr curind
                     set curval [string range $watchvarsvals($var) $start [expr {$i - 1}]]
                     if {$curval != $unklabel} {
-                        if {[string range $curval 0 1] != $unsuptyp_l} {
+                        if {[string range $curval 0 1] != $noedit_l} {
                             # normal (i.e. defined and editable) element
                             set onecomm [duplicatechars "$var\($curind\)=$curval;" "\""]
                             set onecomm [duplicatechars $onecomm "'"]
index ba236d4..a8ff57e 100644 (file)
@@ -1,5 +1,5 @@
 # Scipad texts in French
-# in sync at least with v6.107
+# in sync at least with v6.108
 
 
 # commons
@@ -47,6 +47,8 @@
 # db_argsmanagement.tcl
 ::msgcat::mcset fr "This variable can be watched but cannot be edited!" \
                    "Cette variable peut être espionnée mais ne peut pas être modifiée !"
+::msgcat::mcset fr "A new watch variable will be created." \
+                   "Une nouvelle variable espion va être créée."
 ::msgcat::mcset fr "Non editable variable" "Variable non éditable"
 ::msgcat::mcset fr "Variable:" "Variable :"
 ::msgcat::mcset fr "Value:" "Valeur :"
index b5edac4..53bddc3 100644 (file)
@@ -84,8 +84,14 @@ proc update_bubble_watchvar {w type mousexy} {
         cancel_bubble_deletion $w
 
         # destroy the previous bubble and create the new one
-        update_bubble leave $w $mousexy $watchvarstysi($escwvar)
-        update_bubble enter $w $mousexy $watchvarstysi($escwvar)
+        # catched because when closing the add argument box, if the mouse cursor
+        # is above the bubble triggering area in the watch window, then the
+        # content to display in the bubble might not yet be retrieved from
+        # Scilab (because the debug state is not "DebugInProgress")
+        catch {
+            update_bubble leave $w $mousexy $watchvarstysi($escwvar)
+            update_bubble enter $w $mousexy $watchvarstysi($escwvar)
+        }
 
         # wait a bit and play the game again
         after 100 "update_bubble_watchvar $w $type \[winfo pointerxy $pad\]"