Set svn:eol-style to native
Pierre Marechal [Thu, 17 Jul 2008 08:39:11 +0000 (08:39 +0000)]
scilab/modules/core/tests/nonreg_tests/bug_3280.tst
scilab/modules/dynamic_link/tests/nonreg_tests/bug_3268.tst
scilab/modules/fileio/tests/nonreg_tests/bug_3232.tst
scilab/modules/scipad/tcl/db_bptsgui.tcl
scilab/modules/scipad/tcl/scrollableframe.tcl
scilab/modules/sparse/tests/nonreg_tests/bug_3263.tst
scilab/modules/string/tests/nonreg_tests/bug_3228.tst
scilab/modules/string/tests/nonreg_tests/bug_3241.tst
scilab/modules/string/tests/unit_tests/grep_pcre76.tst
scilab/modules/string/tests/unit_tests/regexp_pcre76.tst
scilab/modules/string/tests/unit_tests/strindex_pcre76.tst

index f8d1c5a..581d559 100644 (file)
@@ -1,16 +1,16 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2008 - INRIA - Allan CORNET\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// <-- Non-regression test for bug 3280 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3280\r
-//\r
-// <-- Short Description -->\r
-//A permanent variable   'L' is defined when launching scilab with the '-l' option.\r
-\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008 - INRIA - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 3280 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3280
+//
+// <-- Short Description -->
+//A permanent variable   'L' is defined when launching scilab with the '-l' option.
+
 if isdef('L') then pause,end
\ No newline at end of file
index f4001f7..b972cb5 100644 (file)
@@ -1,15 +1,15 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2008 - DIGITEO - Allan CORNET\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// <-- Non-regression test for bug 3268 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3268\r
-// link try to load a non existing file\r
-\r
-ierr = execstr('link(''NOEXISTLIBNAME'',''foo'')','errcatch');\r
-if ierr <> 999 then pause,end\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 3268 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3268
+// link try to load a non existing file
+
+ierr = execstr('link(''NOEXISTLIBNAME'',''foo'')','errcatch');
+if ierr <> 999 then pause,end
index 986e1f4..25fa360 100644 (file)
@@ -1,19 +1,19 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2008 - DIGITEO - Allan CORNET\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// <-- Non-regression test for bug 3232 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3232\r
-//\r
-// <-- Short Description -->\r
-//mput ( 1 , 'plop' )\r
-wm = warning('query');\r
-warning('off');\r
-ierr = execstr('mput ( 1 , ''plop'' );','errcatch');\r
-warning(wm);\r
-if ierr <> 10000 then pause,end\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 3232 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3232
+//
+// <-- Short Description -->
+//mput ( 1 , 'plop' )
+wm = warning('query');
+warning('off');
+ierr = execstr('mput ( 1 , ''plop'' );','errcatch');
+warning(wm);
+if ierr <> 10000 then pause,end
index a8347e5..3cb5931 100644 (file)
-#  Scipad - programmer's editor and debugger for Scilab\r
-#\r
-#  Copyright (C) 2002 -      INRIA, Matthieu Philippe\r
-#  Copyright (C) 2003-2006 - Weizmann Institute of Science, Enrico Segre\r
-#  Copyright (C) 2004-2008 - Francois Vogel\r
-#\r
-#  Localization files ( in tcl/msg_files/) are copyright of the \r
-#  individual authors, listed in the header of each file\r
-#\r
-# This program is free software; you can redistribute it and/or modify\r
-# it under the terms of the GNU General Public License as published by\r
-# the Free Software Foundation; either version 2 of the License, or\r
-# (at your option) any later version.\r
-#\r
-# This program is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-# GNU General Public License for more details.\r
-#\r
-# You should have received a copy of the GNU General Public License\r
-# along with this program; if not, write to the Free Software\r
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
-#\r
-# See the file scipad/license.txt\r
-#\r
-#######################################################\r
-### Breakpoints properties graphical user interface ###\r
-#######################################################\r
-\r
-proc showbptgui_bp {} {\r
-# display the breakpoints properties dialog\r
-\r
-    global pad bptsgui\r
-    global bptsprops\r
-    global menuFont textFont maxcharinascilabname\r
-    global bptsguicolwidth\r
-    global bptconditiontypes bpthitconditions\r
-    global bptsguigeom\r
-    global currentlyopeningbptsgui\r
-\r
-    # currentlyopeningbptsgui is used to prevent from a Tcl error to happen\r
-    # when Ctrl-F9 is pressed continuously: the opening of a new bptsgui window\r
-    # could be launched before the previous bptsgui window has not yet been\r
-    # completely destroyed, thus some sort of duplicate widget name error would\r
-    # fire\r
-    if {![info exists currentlyopeningbptsgui]} {\r
-        set currentlyopeningbptsgui true\r
-    } else {\r
-        # just ignore any binding that fires while Scipad is already currently\r
-        # opening the bpts gui\r
-        return\r
-    }\r
-\r
-    # this is used for restoring the previous geometry of the bpts gui at the\r
-    # end of the opening, or to save its initial geometry\r
-    if {[info exists bptsgui]} {\r
-        set firstbptsguiopening false\r
-    } else {\r
-        set firstbptsguiopening true\r
-    }\r
-\r
-    set bptsgui $pad.bptsgui\r
-    if {[istoplevelopen bptsgui]} {\r
-        closebptsgui\r
-    }\r
-\r
-    # number of lines displayed in the dialog when it opens\r
-    set defaultnbdisplayedlines 4\r
-\r
-    # column widths in characters - arrange for a min size, and such that\r
-    # the labels are always entirely visible\r
-    set funcolwidth [mcmaxra "Function"]\r
-    if {$funcolwidth < $maxcharinascilabname} {set funcolwidth $maxcharinascilabname}\r
-    set lincolwidth [mcmaxra "Line"]\r
-    if {$lincolwidth < 4} {set lincolwidth 4}\r
-    set enacolwidth [mcmaxra "Enabled"]\r
-    if {$enacolwidth < 4} {set enacolwidth 4}\r
-    set expcolwidth [mcmaxra "Expression"]\r
-    if {$expcolwidth < 20} {set expcolwidth 20}\r
-    set listofpossible $bptconditiontypes\r
-    lappend listofpossible "Hit if"\r
-    set ctycolwidth [eval mcmaxra $listofpossible]\r
-    if {$ctycolwidth < 4} {set ctycolwidth 4}\r
-    set watcolwidth [mcmaxra "Watched"]\r
-    if {$watcolwidth < 4} {set watcolwidth 4}\r
-    set hctcolwidth [mcmaxra "Hit count"]\r
-    if {$hctcolwidth < 4} {set hctcolwidth 4}\r
-    set listofpossible $bpthitconditions\r
-    lappend listofpossible "Break if"\r
-    set bricolwidth [eval mcmaxra $bpthitconditions]\r
-    if {$bricolwidth < 4} {set bricolwidth 4}\r
-    set hthcolwidth [mcmaxra "Threshold"]\r
-    if {$hthcolwidth < 4} {set hthcolwidth 4}\r
-    set rhccolwidth [mcmaxra "Reset hit"]\r
-    if {$rhccolwidth < 4} {set rhccolwidth 4}\r
-    set bptsguicolwidth [list $funcolwidth $lincolwidth $enacolwidth \\r
-                              $expcolwidth $ctycolwidth $watcolwidth \\r
-                              $hctcolwidth $bricolwidth $hthcolwidth \\r
-                              $rhccolwidth]\r
-\r
-    # column weights for the grid geometry manager\r
-    set funcolweight 2\r
-    set lincolweight 1\r
-    set enacolweight 1\r
-    set expcolweight 4\r
-    set ctycolweight 2\r
-    set watcolweight 1\r
-    set hctcolweight 1\r
-    set bricolweight 2\r
-    set hthcolweight 1\r
-    set rhccolweight 1\r
-\r
-    toplevel $bptsgui\r
-    wm title $bptsgui [mc "Breakpoints properties"]\r
-    wm withdraw $bptsgui\r
-    wm protocol $bptsgui WM_DELETE_WINDOW {closebptsgui}\r
-\r
-    # a frame for the breakpoints list plus the vertical scrollbar\r
-    frame $bptsgui.f1 ;# -bg lightblue ; $bptsgui conf -bg black\r
-\r
-    # a frame for the column titles and the breakpoints properties\r
-    set bptsguibptlist $bptsgui.f1.fl\r
-    frame $bptsguibptlist ; # -bg yellow\r
-\r
-    # a frame for the column labels\r
-    frame $bptsguibptlist.flabels\r
-\r
-    # in order to have the titles be the same width and height than the table\r
-    # content, a fake entry is gridded *in the labels grid*\r
-    # then the real column titles are gridded at the same row 0 as the fakes\r
-    #     so first the fakes\r
-    set cfr $bptsgui.f1.fl.flabels\r
-    set ID fake\r
-    label $cfr.funname$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $funcolwidth\r
-    label $cfr.funline$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $lincolwidth\r
-    checkbutton $cfr.enable$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $enacolwidth\r
-    entry $cfr.expression$ID -font $textFont -takefocus 0\\r
-            -width $expcolwidth\r
-    spinbox $cfr.conditiontype$ID -font $textFont -takefocus 0 \\r
-            -width $ctycolwidth\r
-    checkbutton $cfr.watchit$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $watcolwidth\r
-    label $cfr.hitcount$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $hctcolwidth\r
-    spinbox $cfr.hitcountcondition$ID -font $textFont -takefocus 0 \\r
-            -width $bricolwidth\r
-    entry $cfr.hitthreshold$ID -font $textFont -takefocus 0\\r
-            -width $hthcolwidth\r
-    button $cfr.resethitcount$ID -font $textFont -relief groove -takefocus 0 \\r
-            -width $rhccolwidth\r
-    grid $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \\r
-            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \\r
-            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID \\r
-            -sticky nsew -row 0\r
-    #     and now the real entries, gridded above the fakes\r
-    label $bptsguibptlist.flabels.fun -font $menuFont -width $funcolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Function"]\r
-    label $bptsguibptlist.flabels.lin -font $menuFont -width $lincolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Line"]\r
-    label $bptsguibptlist.flabels.ena -font $menuFont -width $enacolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Enabled"]\r
-    label $bptsguibptlist.flabels.exp -font $menuFont -width $expcolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Expression"]\r
-    label $bptsguibptlist.flabels.cty -font $menuFont -width $ctycolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Hit if"]\r
-    label $bptsguibptlist.flabels.wad -font $menuFont -width $watcolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Watched"]\r
-    label $bptsguibptlist.flabels.hct -font $menuFont -width $hctcolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Hit count"]\r
-    label $bptsguibptlist.flabels.bri -font $menuFont -width $bricolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Break if"]\r
-    label $bptsguibptlist.flabels.hth -font $menuFont -width $hthcolwidth \\r
-            -relief groove -takefocus 0 -text [mc "Threshold"]\r
-    label $bptsguibptlist.flabels.rhc -font $menuFont -width $rhccolwidth \\r
-            -relief groove -takefocus 0\r
-    # to ensure consistent resizing, the labels must be configured the exact\r
-    # same way as the breakpoint table itself, though in different master windows\r
-    grid $bptsguibptlist.flabels.fun $bptsguibptlist.flabels.lin \\r
-            $bptsguibptlist.flabels.ena $bptsguibptlist.flabels.exp \\r
-            $bptsguibptlist.flabels.cty $bptsguibptlist.flabels.wad \\r
-            $bptsguibptlist.flabels.hct $bptsguibptlist.flabels.bri \\r
-            $bptsguibptlist.flabels.hth $bptsguibptlist.flabels.rhc \\r
-            -sticky nsew -row 0\r
-\r
-    grid columnconfigure $bptsguibptlist.flabels 0 -weight $funcolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 1 -weight $lincolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 2 -weight $enacolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 3 -weight $expcolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 4 -weight $ctycolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 5 -weight $watcolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 6 -weight $hctcolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 7 -weight $bricolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 8 -weight $hthcolweight\r
-    grid columnconfigure $bptsguibptlist.flabels 9 -weight $rhccolweight\r
-    pack $bptsguibptlist.flabels -expand 0 -fill x\r
-\r
-    # a frame for the vertical scrollbar\r
-    frame $bptsgui.f1.fr\r
-\r
-    set scrollf $bptsguibptlist.sf\r
-    set scrolly $bptsgui.f1.fr.yscroll\r
-\r
-    # a scrolled frame for the breakpoints properties table itself\r
-    scrolledframe $scrollf -yscrollcommand "$scrolly set" -fill x\r
-    scrollbar $scrolly -command "$scrollf yview" -takefocus 0\r
-\r
-    foreach ID [getusedIDsfrombptprops] {\r
-        addbptingui $ID\r
-    }\r
-    grid columnconfigure $scrollf.scrolled 0 -weight $funcolweight\r
-    grid columnconfigure $scrollf.scrolled 1 -weight $lincolweight\r
-    grid columnconfigure $scrollf.scrolled 2 -weight $enacolweight\r
-    grid columnconfigure $scrollf.scrolled 3 -weight $expcolweight\r
-    grid columnconfigure $scrollf.scrolled 4 -weight $ctycolweight\r
-    grid columnconfigure $scrollf.scrolled 5 -weight $watcolweight\r
-    grid columnconfigure $scrollf.scrolled 6 -weight $hctcolweight\r
-    grid columnconfigure $scrollf.scrolled 7 -weight $bricolweight\r
-    grid columnconfigure $scrollf.scrolled 8 -weight $hthcolweight\r
-    grid columnconfigure $scrollf.scrolled 9 -weight $rhccolweight\r
-\r
-    pack $scrollf -expand 1 -fill both\r
-    pack $scrolly -expand 1 -fill y -padx 2\r
-\r
-    pack $bptsgui.f1.fr -expand 0 -fill y -side right\r
-    pack $bptsguibptlist -expand 1 -fill both \r
-\r
-    frame $bptsgui.fb ; # contains the button at the bottom\r
-\r
-    set bestwidth [mcmaxra "&Help" "&Close"]\r
-    set buttonHelp $bptsgui.fb.buttonHelp\r
-    eval "button $buttonHelp [bl "&Help"] \\r
-            -command \"helpbptsgui\" \\r
-            -font \[list $menuFont\] -width $bestwidth"\r
-    set buttonClose $bptsgui.fb.buttonClose\r
-    eval "button $buttonClose [bl "&Close"] \\r
-            -command \"closebptsgui\" \\r
-            -font \[list $menuFont\] -width $bestwidth"\r
-    pack $buttonHelp $buttonClose -padx 40 -side left\r
-\r
-    pack $bptsgui.fb -expand 0 -fill none -pady 5 -side bottom\r
-    pack $bptsgui.f1 -expand 1 -fill both\r
-\r
-    bind $bptsgui <Alt-[fb $buttonHelp]> "$buttonHelp invoke"\r
-\r
-    # after 0 in the following Alt binding is mandatory for Linux only\r
-    # This is Tk bug 1236306 (still unfixed in Tk8.4.15 and Tk 8.5a6)\r
-    bind $bptsgui <Alt-[fb $buttonClose]> "after 0 {$buttonClose invoke}"\r
-\r
-    bind $bptsgui <MouseWheel> {$bptsgui.f1.fl.sf yview scroll [expr {- (%D / 120) * 1}] units}\r
-\r
-    if {$firstbptsguiopening} {\r
-        update idletasks\r
-        setwingeom $bptsgui\r
-        wm resizable $bptsgui 1 1\r
-    } else {\r
-        wm geometry $bptsgui $bptsguigeom\r
-    }\r
-\r
-    wm deiconify $bptsgui\r
-\r
-    # this *must* be after wm deiconify, otherwise [winfo height ...] still\r
-    # returns 1 on Linux\r
-    update ; # so that winfo height does not return 0\r
-    set onelineheight [winfo height $bptsguibptlist.flabels.fun]\r
-    $scrollf configure -height [expr {$onelineheight * $defaultnbdisplayedlines}]\r
-\r
-    unset -- currentlyopeningbptsgui\r
-}\r
-\r
-proc addbptingui {ID} {\r
-# insert the breakpoint identified by its ID $ID in the breakpoints gui,\r
-# more precisely inside the container scrolledframe of this gui\r
-\r
-    global bptsgui bptsguicolwidth bptconditiontypes bpthitconditions\r
-    global textFont\r
-\r
-    # do nothing if the breakpoints properties window is not open\r
-    # it will be refreshed on opening\r
-    if {![istoplevelopen bptsgui]} {\r
-        return\r
-    }\r
-\r
-    foreach {funcolwidth lincolwidth enacolwidth \\r
-             expcolwidth ctycolwidth watcolwidth \\r
-             hctcolwidth bricolwidth hthcolwidth \\r
-             rhccolwidth} $bptsguicolwidth {}\r
-\r
-    set cfr $bptsgui.f1.fl.sf.scrolled\r
-\r
-    label $cfr.funname$ID -font $textFont -relief groove -takefocus 0 \\r
-            -textvariable bptsprops($ID,funname) \\r
-            -width $funcolwidth\r
-    label $cfr.funline$ID -font $textFont -relief groove -takefocus 0 \\r
-            -textvariable bptsprops($ID,funline) \\r
-            -width $lincolwidth\r
-    checkbutton $cfr.enable$ID -font $textFont -relief groove \\r
-            -variable bptsprops($ID,enable) -onvalue true -offvalue false \\r
-            -width $enacolwidth \\r
-            -command "tagconfigurebreakpointbackground $ID"\r
-    entry $cfr.expression$ID -font $textFont \\r
-            -textvariable bptsprops($ID,expression) \\r
-            -width $expcolwidth \\r
-            -validate key -validatecommand "validateconditioneditingui $ID"\r
-    # -textvariable is not used in the spinbox, instead a separate procedure\r
-    # is called through the -command option (see proc updatebptspropscondtype)\r
-    spinbox $cfr.conditiontype$ID -font $textFont \\r
-            -values [listlocalize $bptconditiontypes] \\r
-            -command "updatebptspropscondtype $ID %s" \\r
-            -state readonly -width $ctycolwidth\r
-    updatespinboxexprcondtype $ID $cfr.conditiontype$ID\r
-    checkbutton $cfr.watchit$ID -font $textFont -relief groove \\r
-            -variable bptsprops($ID,watched) -onvalue true -offvalue false \\r
-            -width $watcolwidth \\r
-            -command "togglewatchcondbptexpr $ID"\r
-    label $cfr.hitcount$ID -font $textFont -relief groove -takefocus 0 \\r
-            -textvariable bptsprops($ID,hitcount) \\r
-            -width $hctcolwidth\r
-    # same comment for this spinbox as for $cfr.conditiontype$ID\r
-    spinbox $cfr.hitcountcondition$ID -font $textFont \\r
-            -values [listlocalize $bpthitconditions] \\r
-            -command "updatebptspropshitconds $ID %s" \\r
-            -state readonly -width $bricolwidth\r
-    updatespinboxhitcountcondtype $ID $cfr.hitcountcondition$ID\r
-    entry $cfr.hitthreshold$ID -font $textFont \\r
-            -textvariable bptsprops($ID,hitcountthreshold) \\r
-            -width $hthcolwidth -justify center \\r
-            -validate key -validatecommand "validatehitthresholdeditingui %P"\r
-    button $cfr.resethitcount$ID -font $textFont -relief groove -takefocus 0 \\r
-            -command "resetonehitcount $ID" -text [mc "Reset hit"] \\r
-            -width $rhccolwidth\r
-\r
-    # find the row number where new entry should be inserted\r
-    set insertrow [selectrowforsortedbpts $ID]\r
-    # shift the existing rows one line down to make room for the new entry\r
-    set lastrow [expr {[lindex [grid size $cfr] 1] - 1}]\r
-    for {set i $lastrow} {$i >= $insertrow} {incr i -1} {\r
-        set j [expr {$i + 1}]\r
-        foreach aslave [grid slaves $cfr -row $i] {\r
-            grid configure $aslave -row $j\r
-        }\r
-    }\r
-\r
-    # grid the new entry in the empty space\r
-    grid $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \\r
-            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \\r
-            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID \\r
-            -sticky nsew -row $insertrow\r
-\r
-    # when changing something in the breakpoints gui one wants to show where\r
-    # the breakpoint currently modified is located among the opened buffers\r
-    bind $cfr.funname$ID           <Button-1> "showbreakpointedline $ID $cfr.funname$ID"\r
-    bind $cfr.funline$ID           <Button-1> "showbreakpointedline $ID $cfr.funline$ID"\r
-    # but not for check/spin boxes (because blinking delays the update)\r
-    # bind $cfr.enable$ID           <Button-1> "showbreakpointedline $ID $cfr.enable$ID"\r
-    #bind $cfr.expression$ID        <Button-1> "showbreakpointedline $ID $cfr.expression$ID"\r
-    #bind $cfr.conditiontype$ID     <Button-1> "showbreakpointedline $ID $cfr.conditiontype$ID"\r
-    #bind $cfr.watchit$ID           <Button-1> "showbreakpointedline $ID $cfr.watchit$ID"\r
-    bind $cfr.hitcount$ID          <Button-1> "showbreakpointedline $ID $cfr.hitcount$ID"\r
-    #bind $cfr.hitcountcondition$ID <Button-1> "showbreakpointedline $ID $cfr.hitcountcondition$ID"\r
-    #bind $cfr.hitthreshold$ID      <Button-1> "showbreakpointedline $ID $cfr.hitthreshold$ID"\r
-    #bind $cfr.resethitcount$ID     <Button-1> "showbreakpointedline $ID $cfr.resethitcount$ID"\r
-}\r
-\r
-proc delbptingui {ID} {\r
-# remove breakpoint identified by its ID $ID from the breakpoints gui\r
-    global bptsgui\r
-\r
-    # do nothing if the breakpoints properties window is not open\r
-    # it will be refreshed on opening\r
-    if {![istoplevelopen bptsgui]} {\r
-        return\r
-    }\r
-\r
-    set cfr $bptsgui.f1.fl.sf.scrolled\r
-\r
-    # grid forget and shift upwards needed so that grid size is OK,\r
-    # which in turn is the condition for the downwards shifting algorithm\r
-    # in proc addbptingui to work\r
-    set deleterow [getrowingridfromID $ID]\r
-    set lastrow [expr {[lindex [grid size $cfr] 1] - 1}]\r
-    grid forget $cfr.funname$ID $cfr.funline$ID $cfr.expression$ID $cfr.watchit$ID\r
-    for {set i $deleterow} {$i <= $lastrow} {incr i} {\r
-        set j [expr {$i + 1}]\r
-        foreach aslave [grid slaves $cfr -row $j] {\r
-            grid configure $aslave -row $i\r
-        }\r
-    }\r
-\r
-    # note: destroy instruction mandatory here - see comments in proc deletebreakpoint\r
-    destroy $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \\r
-            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \\r
-            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID\r
-}\r
-\r
-proc getrowingridfromID {ID} {\r
-# return the row number in which the breakpoint $ID is gridded in the\r
-# breakpoints gui\r
-# if $ID is not gridded, then return -1\r
-    global bptsgui\r
-\r
-    set cfr $bptsgui.f1.fl.sf.scrolled\r
-\r
-    set isingrid [lsearch -exact [grid slaves $cfr] $cfr.funname$ID]\r
-\r
-    if {$isingrid != -1} {\r
-        set infos [grid info $cfr.funname$ID]\r
-        set therow [lindex $infos [expr {[lsearch $infos "-row"] + 1}]]\r
-    } else {\r
-        set therow -1\r
-    }\r
-    return $therow    \r
-}\r
-\r
-proc selectrowforsortedbpts {ID} {\r
-# from a breakpoint ID, return the row number in which this breakpoint should\r
-# be gridded so that the grid is sorted alphabetically by funname and then by\r
-# increasing funline\r
-    global bptsprops bptsgui\r
-\r
-    set fname $bptsprops($ID,funname)\r
-    set fline $bptsprops($ID,funline)\r
-\r
-    set row 0\r
-\r
-    set allfunnames [getfunnamesfrombptsprops]\r
-    set funlinesoffname [getfunlinesfrombptsprops $fname]\r
-\r
-    # remove what we're searching from the lists of line numbers\r
-    # and function names\r
-    # this is necessary since when proc selectrowforsortedbpts\r
-    # is called the bptsprops array has already been augmented\r
-    # with the new breakpoint, and the algorithm below supposes\r
-    # that (fname,fline) is not (yet) part of bptsprops\r
-    set flinepos [lsearch -exact $funlinesoffname $fline]\r
-    set funlinesoffname [lreplace $funlinesoffname $flinepos $flinepos]\r
-\r
-    # same thing: $funlinesoffname must only contain the breakpointed\r
-    # lines already displayed in the bpts gui\r
-    set linestokeep [list ]\r
-    foreach thisfline $funlinesoffname {\r
-        set rowingrid [getrowingridfromID [where2bptID $fname $thisfline]]\r
-        if {$rowingrid != -1} {\r
-            lappend linestokeep $thisfline\r
-        }\r
-    }\r
-    set funlinesoffname $linestokeep\r
-\r
-    # now, if there is no remaining breakpointed line for $fname,\r
-    # remove also $fname from $allfunnames\r
-    if {$funlinesoffname == {}} {\r
-        set fnamepos [lsearch -exact $allfunnames $fname]\r
-        set allfunnames [lreplace $allfunnames $fnamepos $fnamepos]\r
-    }\r
-\r
-    foreach nameoffun $allfunnames {\r
-        switch -- [string compare $nameoffun $fname] {\r
-            -1 {\r
-                 incr row [llength [getfunlinesfrombptsprops $nameoffun]]\r
-                 continue\r
-               }\r
-             0 {\r
-                 set i 0\r
-                 while {([lindex $funlinesoffname $i] < $fline) && ($i < [llength $funlinesoffname])} {incr i}\r
-                 incr row $i\r
-                 break\r
-               }\r
-             1 {\r
-                 break\r
-               }\r
-        }\r
-    }\r
-\r
-    return $row\r
-}\r
-\r
-proc validateconditioneditingui {ID} {\r
-# this proc is used to maintain the display in the main Scipad window in sync\r
-# with the changes made in the expression area of the breakpoints properties gui\r
-    global bptsprops\r
-\r
-    # maintain consistency between the breakpoints gui and the watch window\r
-    # with no headache! if the expression was currently watched, then remove\r
-    # the watching first and let the user set it again afterwards if he still\r
-    # wants it\r
-    if {$bptsprops($ID,watched)} {\r
-        set bptsprops($ID,watched) false\r
-        togglewatchcondbptexpr $ID\r
-    }\r
-\r
-    # the new condition value needs to be updated in bptsprops($ID,curexpvalue)\r
-    # so that the next check in proc checkendofdebug_bp will use the correct\r
-    # "value at previous stop"\r
-    # executing this is fast enough, even with validation happening on each\r
-    # keypress in the condition area of the bptsgui\r
-    saveoneconditionvalue $ID\r
-\r
-    # the after 0 trick is needed to have the validation result (i.e. true)\r
-    # be sent to the entry widget first, so that the edit gets validated\r
-    # and the textvariable bptsprops(...) receives the new value before\r
-    # the tagging stuff occurs\r
-    after 0 "tagconfigurebreakpointbackground $ID"\r
-\r
-    # any content is allowed, error checking happens\r
-    # when executing the statement at each stop (see proc checkendofdebug_bp)\r
-    return true\r
-}\r
-\r
-proc updatebptspropscondtype {ID newconditiontype} {\r
-# update bptsprops($ID,conditiontype)\r
-# this proc is called whenever a button is clicked in the condition type\r
-# spinbox of the bpts gui\r
-# one could have obtained the same effect through -textvariable in the\r
-# spinbox definition, but then one would have had to deal with the locale\r
-# whenever bptsprops($ID,conditiontype) is used thoughout the code\r
-# with this approach only the display in the spinbox is localized, and\r
-# the internal value of bptsprops($ID,conditiontype) has only to be used\r
-# in english (and with strings that do not need to be identical to the\r
-# displayed ones)\r
-    global bptsprops bptconditiontypes\r
-\r
-    set pos [lsearch -exact [listlocalize $bptconditiontypes] $newconditiontype]\r
-    # $pos == -1 should not happen, i.e. the espression condition type newly selected\r
-    # in the spinbox should be found in the localized list of esxpression condition types\r
-\r
-    set bptsprops($ID,conditiontype) [lindex $bptconditiontypes $pos]\r
-}\r
-\r
-proc updatespinboxexprcondtype {ID w} {\r
-# update condition type displayed in the spinbox so that it matches\r
-# $bptsprops($ID,conditiontype)\r
-    global bptsprops\r
-\r
-    $w set [mc $bptsprops($ID,conditiontype)]\r
-}\r
-\r
-proc validatehitthresholdeditingui {proposedcontent} {\r
-# return true if and only if the proposed new full content $newcontent that\r
-# the user tries to have in the threshold entry area is a positive or zero\r
-# integer number\r
-# moreover, the user is not allowed to delete completely the entry\r
-# note: string is integer -strict $newcontent is not enough because\r
-#       this allows for negative integers, and also for leading zeroes\r
-\r
-    global strictlypositiveintegerREpat\r
-\r
-    return [regexp $strictlypositiveintegerREpat $proposedcontent]\r
-}\r
-\r
-proc updatebptspropshitconds {ID newhitcondition} {\r
-# this is the same as proc updatebptspropscondtype, but for the hit count\r
-# condition type (while proc updatebptspropscondtype deals with the\r
-# breakpoint expression condition type)\r
-# <TODO> factorize this code with proc updatebptspropscondtype\r
-    global bptsprops bpthitconditions\r
-\r
-    set pos [lsearch -exact [listlocalize $bpthitconditions] $newhitcondition]\r
-    # $pos == -1 should not happen, i.e. the hit condition type newly selected\r
-    # in the spinbox should be found in the localized list of hit condition types\r
-\r
-    set bptsprops($ID,hitcountcondition) [lindex $bpthitconditions $pos]\r
-}\r
-\r
-proc updatespinboxhitcountcondtype {ID w} {\r
-# update hit count condition type displayed in the spinbox so that it matches\r
-# $bptsprops($ID,hitcountcondition)\r
-    global bptsprops\r
-\r
-    $w set [mc $bptsprops($ID,hitcountcondition)]\r
-}\r
-\r
-proc togglewatchcondbptexpr {ID} {\r
-# toggle the watching of the conditional expression of breakpoint identified\r
-# by $ID\r
-# the watching consists in adding a generic expression in the watch window\r
-# and in maintaining consistency between the expression displayed in the\r
-# breakpoints gui and in the watch window (the latter is done throughout\r
-# the code, not in this proc)\r
-    global bptsprops\r
-    global watchgenexps\r
-\r
-    if {$bptsprops($ID,watched)} {\r
-        # now watch expression from breakpoint $ID\r
-        # duplicates are dealt with in proc OKadda_bp\r
-        quickAddWatch_bp $bptsprops($ID,expression) genericexpression\r
-\r
-    } else {\r
-        # stop watching expression from breakpoint $ID\r
-        # before removing the expression from the watch window, check that\r
-        # no other breakpoint currently watched has the same expression\r
-        set mustremove true\r
-        foreach otherID [getusedIDsfrombptprops] {\r
-            if {$otherID == $ID} {continue}\r
-            if {$bptsprops($otherID,watched) &&\r
-                $bptsprops($otherID,expression) == $bptsprops($ID,expression)} {\r
-                set mustremove false\r
-                break\r
-            }\r
-        }\r
-        if {$mustremove} {\r
-            # remove the expression from the watch\r
-            set posinwatchgenexps [lsearch -exact $watchgenexps $bptsprops($ID,expression)]\r
-            # $posinwatchgenexps should never be -1 if consistency is maintained correctly\r
-            # between the watch window and the breakpoints gui, which should be the case\r
-            set watchgenexps [lreplace $watchgenexps $posinwatchgenexps $posinwatchgenexps]\r
-        }\r
-    }\r
-}\r
-\r
-proc unwatchallcondbptexpr {exp} {\r
-# uncheck the "Watched" checkbox of all breakpoints having $exp\r
-# as conditional expression\r
-    global bptsprops\r
-    foreach ID [getusedIDsfrombptprops] {\r
-        if {$bptsprops($ID,expression) == $exp} {\r
-            set bptsprops($ID,watched) false\r
-            # here don't call proc togglewatchcondbptexpr, because the current\r
-            # proc is already called by proc Removearg_bp, i.e. the corresponding\r
-            # expression is already in the process of being deleted from the\r
-            # watch window\r
-        }\r
-    }\r
-}\r
-\r
-proc closebptsgui {} {\r
-    global bptsgui bptsguigeom\r
-\r
-    # save size and position of the window for future restoration\r
-    set bptsguigeom [wm geometry $bptsgui]\r
-\r
-    # one must delete the widgets (see proc deletebreakpoint for an\r
-    # approximate reason)\r
-    foreach ID [getusedIDsfrombptprops] {\r
-        delbptingui $ID\r
-    }\r
-\r
-    destroy $bptsgui\r
-}\r
-\r
-proc helpbptsgui {} {\r
-# a dialog explaining a bit the vocabulary about breakpoints conditions\r
-    global bptsgui\r
-    set tit [mc "Breakpoints vocabulary"]\r
-    set mes [concat [mc "A breakpoint is identified by its location, i.e. its position (a line number) in a function."] \\r
-                    [mc "When the execution process encounters an enabled breakpoint, then this breakpoint is said to be reached."] \\r
-                    [mc "When the breakpoint is reached and its associated conditional expression is true (or changed),\\r
-                         then the breakpoint is said to be hit."] \\r
-                    [mc "The hit count is the number of times the breakpoint has been hit."] \\r
-                    [mc "Execution will stop at a breakpoint if the hit count satisfies the selectable break condition."] \\r
-            ]\r
-    tk_messageBox -message $mes -icon info -title $tit -parent $bptsgui\r
-}\r
-\r
-proc showbreakpointedline {ID focuswidget} {\r
-# show the piece of code that contains the breakpoint identified by $ID\r
-    global bptsprops\r
-    after idle "blinkline $bptsprops($ID,funline) $bptsprops($ID,funname) 1 ; focus $focuswidget"\r
-}\r
-\r
-proc highlightbptinbptsgui {ID} {\r
-# colorize in red the line in $bptsgui that contains the informations related to \r
-# breakpoint with ID $ID\r
-    global bptsgui\r
-    global oldcolorfunnameinbptsgui oldcolorfunlineinbptsgui\r
-\r
-    # do nothing if the breakpoints properties window is not open\r
-    if {![istoplevelopen bptsgui]} {\r
-        return\r
-    }\r
-\r
-    set cfr $bptsgui.f1.fl.sf.scrolled\r
-\r
-    set oldcolorfunnameinbptsgui [$cfr.funname$ID cget -foreground]\r
-    set oldcolorfunlineinbptsgui [$cfr.funline$ID cget -foreground]\r
-\r
-    $cfr.funname$ID configure -foreground red\r
-    $cfr.funline$ID configure -foreground red\r
-\r
-    # <TODO> Should it scroll the bpts list so that breakpoint $ID\r
-    #        becomes visible if it was hidden? Sort of a $ID see...\r
-    #        I'd say no...\r
-}\r
-\r
-proc unhighlightbptinbptsgui {ID} {\r
-# colorize in normal color the line in $bptsgui that contains the informations \r
-# related to breakpoint with ID $ID\r
-    global bptsgui\r
-    global oldcolorfunnameinbptsgui oldcolorfunlineinbptsgui\r
-\r
-    # do nothing if the breakpoints properties window is not open\r
-    if {![istoplevelopen bptsgui]} {\r
-        return\r
-    }\r
-\r
-    set cfr $bptsgui.f1.fl.sf.scrolled\r
-\r
-    # when the breakpoints gui is opened the first time with the mouse cursor\r
-    # in a breakpoint, then the old colors are undefined\r
-    # therefore catch this\r
-    catch {\r
-        $cfr.funname$ID configure -foreground $oldcolorfunnameinbptsgui\r
-        $cfr.funline$ID configure -foreground $oldcolorfunlineinbptsgui\r
-    }\r
-}\r
-\r
-proc sortbptsgui {nameoffun} {\r
-# sort the entries in the breakpoints properties gui\r
-# this is not a real sorting algorithm, in the sense that is won't sort\r
-# an arbitrarily messed up breakpoints gui\r
-# when entering this proc the gui is supposed to be perfectly sorted,\r
-# the only entries that might be not sorted are those having $nameoffun\r
-# as function name\r
-\r
-    # do nothing if the breakpoints properties window is not open\r
-    # it will be refreshed on opening\r
-    if {![istoplevelopen bptsgui]} {\r
-        return\r
-    }\r
-\r
-    # algorithm :\r
-    #   . retrieve the IDs of entries having $nameoffun\r
-    #   . delete these entries from the gui\r
-    #   . add them again (this looks for the right insert place)\r
-    foreach aline [getfunlinesfrombptsprops $nameoffun] {\r
-        set ID [where2bptID $nameoffun $aline]\r
-        delbptingui $ID\r
-        addbptingui $ID\r
-    }\r
-}\r
+#  Scipad - programmer's editor and debugger for Scilab
+#
+#  Copyright (C) 2002 -      INRIA, Matthieu Philippe
+#  Copyright (C) 2003-2006 - Weizmann Institute of Science, Enrico Segre
+#  Copyright (C) 2004-2008 - Francois Vogel
+#
+#  Localization files ( in tcl/msg_files/) are copyright of the 
+#  individual authors, listed in the header of each file
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# See the file scipad/license.txt
+#
+#######################################################
+### Breakpoints properties graphical user interface ###
+#######################################################
+
+proc showbptgui_bp {} {
+# display the breakpoints properties dialog
+
+    global pad bptsgui
+    global bptsprops
+    global menuFont textFont maxcharinascilabname
+    global bptsguicolwidth
+    global bptconditiontypes bpthitconditions
+    global bptsguigeom
+    global currentlyopeningbptsgui
+
+    # currentlyopeningbptsgui is used to prevent from a Tcl error to happen
+    # when Ctrl-F9 is pressed continuously: the opening of a new bptsgui window
+    # could be launched before the previous bptsgui window has not yet been
+    # completely destroyed, thus some sort of duplicate widget name error would
+    # fire
+    if {![info exists currentlyopeningbptsgui]} {
+        set currentlyopeningbptsgui true
+    } else {
+        # just ignore any binding that fires while Scipad is already currently
+        # opening the bpts gui
+        return
+    }
+
+    # this is used for restoring the previous geometry of the bpts gui at the
+    # end of the opening, or to save its initial geometry
+    if {[info exists bptsgui]} {
+        set firstbptsguiopening false
+    } else {
+        set firstbptsguiopening true
+    }
+
+    set bptsgui $pad.bptsgui
+    if {[istoplevelopen bptsgui]} {
+        closebptsgui
+    }
+
+    # number of lines displayed in the dialog when it opens
+    set defaultnbdisplayedlines 4
+
+    # column widths in characters - arrange for a min size, and such that
+    # the labels are always entirely visible
+    set funcolwidth [mcmaxra "Function"]
+    if {$funcolwidth < $maxcharinascilabname} {set funcolwidth $maxcharinascilabname}
+    set lincolwidth [mcmaxra "Line"]
+    if {$lincolwidth < 4} {set lincolwidth 4}
+    set enacolwidth [mcmaxra "Enabled"]
+    if {$enacolwidth < 4} {set enacolwidth 4}
+    set expcolwidth [mcmaxra "Expression"]
+    if {$expcolwidth < 20} {set expcolwidth 20}
+    set listofpossible $bptconditiontypes
+    lappend listofpossible "Hit if"
+    set ctycolwidth [eval mcmaxra $listofpossible]
+    if {$ctycolwidth < 4} {set ctycolwidth 4}
+    set watcolwidth [mcmaxra "Watched"]
+    if {$watcolwidth < 4} {set watcolwidth 4}
+    set hctcolwidth [mcmaxra "Hit count"]
+    if {$hctcolwidth < 4} {set hctcolwidth 4}
+    set listofpossible $bpthitconditions
+    lappend listofpossible "Break if"
+    set bricolwidth [eval mcmaxra $bpthitconditions]
+    if {$bricolwidth < 4} {set bricolwidth 4}
+    set hthcolwidth [mcmaxra "Threshold"]
+    if {$hthcolwidth < 4} {set hthcolwidth 4}
+    set rhccolwidth [mcmaxra "Reset hit"]
+    if {$rhccolwidth < 4} {set rhccolwidth 4}
+    set bptsguicolwidth [list $funcolwidth $lincolwidth $enacolwidth \
+                              $expcolwidth $ctycolwidth $watcolwidth \
+                              $hctcolwidth $bricolwidth $hthcolwidth \
+                              $rhccolwidth]
+
+    # column weights for the grid geometry manager
+    set funcolweight 2
+    set lincolweight 1
+    set enacolweight 1
+    set expcolweight 4
+    set ctycolweight 2
+    set watcolweight 1
+    set hctcolweight 1
+    set bricolweight 2
+    set hthcolweight 1
+    set rhccolweight 1
+
+    toplevel $bptsgui
+    wm title $bptsgui [mc "Breakpoints properties"]
+    wm withdraw $bptsgui
+    wm protocol $bptsgui WM_DELETE_WINDOW {closebptsgui}
+
+    # a frame for the breakpoints list plus the vertical scrollbar
+    frame $bptsgui.f1 ;# -bg lightblue ; $bptsgui conf -bg black
+
+    # a frame for the column titles and the breakpoints properties
+    set bptsguibptlist $bptsgui.f1.fl
+    frame $bptsguibptlist ; # -bg yellow
+
+    # a frame for the column labels
+    frame $bptsguibptlist.flabels
+
+    # in order to have the titles be the same width and height than the table
+    # content, a fake entry is gridded *in the labels grid*
+    # then the real column titles are gridded at the same row 0 as the fakes
+    #     so first the fakes
+    set cfr $bptsgui.f1.fl.flabels
+    set ID fake
+    label $cfr.funname$ID -font $textFont -relief groove -takefocus 0 \
+            -width $funcolwidth
+    label $cfr.funline$ID -font $textFont -relief groove -takefocus 0 \
+            -width $lincolwidth
+    checkbutton $cfr.enable$ID -font $textFont -relief groove -takefocus 0 \
+            -width $enacolwidth
+    entry $cfr.expression$ID -font $textFont -takefocus 0\
+            -width $expcolwidth
+    spinbox $cfr.conditiontype$ID -font $textFont -takefocus 0 \
+            -width $ctycolwidth
+    checkbutton $cfr.watchit$ID -font $textFont -relief groove -takefocus 0 \
+            -width $watcolwidth
+    label $cfr.hitcount$ID -font $textFont -relief groove -takefocus 0 \
+            -width $hctcolwidth
+    spinbox $cfr.hitcountcondition$ID -font $textFont -takefocus 0 \
+            -width $bricolwidth
+    entry $cfr.hitthreshold$ID -font $textFont -takefocus 0\
+            -width $hthcolwidth
+    button $cfr.resethitcount$ID -font $textFont -relief groove -takefocus 0 \
+            -width $rhccolwidth
+    grid $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \
+            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \
+            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID \
+            -sticky nsew -row 0
+    #     and now the real entries, gridded above the fakes
+    label $bptsguibptlist.flabels.fun -font $menuFont -width $funcolwidth \
+            -relief groove -takefocus 0 -text [mc "Function"]
+    label $bptsguibptlist.flabels.lin -font $menuFont -width $lincolwidth \
+            -relief groove -takefocus 0 -text [mc "Line"]
+    label $bptsguibptlist.flabels.ena -font $menuFont -width $enacolwidth \
+            -relief groove -takefocus 0 -text [mc "Enabled"]
+    label $bptsguibptlist.flabels.exp -font $menuFont -width $expcolwidth \
+            -relief groove -takefocus 0 -text [mc "Expression"]
+    label $bptsguibptlist.flabels.cty -font $menuFont -width $ctycolwidth \
+            -relief groove -takefocus 0 -text [mc "Hit if"]
+    label $bptsguibptlist.flabels.wad -font $menuFont -width $watcolwidth \
+            -relief groove -takefocus 0 -text [mc "Watched"]
+    label $bptsguibptlist.flabels.hct -font $menuFont -width $hctcolwidth \
+            -relief groove -takefocus 0 -text [mc "Hit count"]
+    label $bptsguibptlist.flabels.bri -font $menuFont -width $bricolwidth \
+            -relief groove -takefocus 0 -text [mc "Break if"]
+    label $bptsguibptlist.flabels.hth -font $menuFont -width $hthcolwidth \
+            -relief groove -takefocus 0 -text [mc "Threshold"]
+    label $bptsguibptlist.flabels.rhc -font $menuFont -width $rhccolwidth \
+            -relief groove -takefocus 0
+    # to ensure consistent resizing, the labels must be configured the exact
+    # same way as the breakpoint table itself, though in different master windows
+    grid $bptsguibptlist.flabels.fun $bptsguibptlist.flabels.lin \
+            $bptsguibptlist.flabels.ena $bptsguibptlist.flabels.exp \
+            $bptsguibptlist.flabels.cty $bptsguibptlist.flabels.wad \
+            $bptsguibptlist.flabels.hct $bptsguibptlist.flabels.bri \
+            $bptsguibptlist.flabels.hth $bptsguibptlist.flabels.rhc \
+            -sticky nsew -row 0
+
+    grid columnconfigure $bptsguibptlist.flabels 0 -weight $funcolweight
+    grid columnconfigure $bptsguibptlist.flabels 1 -weight $lincolweight
+    grid columnconfigure $bptsguibptlist.flabels 2 -weight $enacolweight
+    grid columnconfigure $bptsguibptlist.flabels 3 -weight $expcolweight
+    grid columnconfigure $bptsguibptlist.flabels 4 -weight $ctycolweight
+    grid columnconfigure $bptsguibptlist.flabels 5 -weight $watcolweight
+    grid columnconfigure $bptsguibptlist.flabels 6 -weight $hctcolweight
+    grid columnconfigure $bptsguibptlist.flabels 7 -weight $bricolweight
+    grid columnconfigure $bptsguibptlist.flabels 8 -weight $hthcolweight
+    grid columnconfigure $bptsguibptlist.flabels 9 -weight $rhccolweight
+    pack $bptsguibptlist.flabels -expand 0 -fill x
+
+    # a frame for the vertical scrollbar
+    frame $bptsgui.f1.fr
+
+    set scrollf $bptsguibptlist.sf
+    set scrolly $bptsgui.f1.fr.yscroll
+
+    # a scrolled frame for the breakpoints properties table itself
+    scrolledframe $scrollf -yscrollcommand "$scrolly set" -fill x
+    scrollbar $scrolly -command "$scrollf yview" -takefocus 0
+
+    foreach ID [getusedIDsfrombptprops] {
+        addbptingui $ID
+    }
+    grid columnconfigure $scrollf.scrolled 0 -weight $funcolweight
+    grid columnconfigure $scrollf.scrolled 1 -weight $lincolweight
+    grid columnconfigure $scrollf.scrolled 2 -weight $enacolweight
+    grid columnconfigure $scrollf.scrolled 3 -weight $expcolweight
+    grid columnconfigure $scrollf.scrolled 4 -weight $ctycolweight
+    grid columnconfigure $scrollf.scrolled 5 -weight $watcolweight
+    grid columnconfigure $scrollf.scrolled 6 -weight $hctcolweight
+    grid columnconfigure $scrollf.scrolled 7 -weight $bricolweight
+    grid columnconfigure $scrollf.scrolled 8 -weight $hthcolweight
+    grid columnconfigure $scrollf.scrolled 9 -weight $rhccolweight
+
+    pack $scrollf -expand 1 -fill both
+    pack $scrolly -expand 1 -fill y -padx 2
+
+    pack $bptsgui.f1.fr -expand 0 -fill y -side right
+    pack $bptsguibptlist -expand 1 -fill both 
+
+    frame $bptsgui.fb ; # contains the button at the bottom
+
+    set bestwidth [mcmaxra "&Help" "&Close"]
+    set buttonHelp $bptsgui.fb.buttonHelp
+    eval "button $buttonHelp [bl "&Help"] \
+            -command \"helpbptsgui\" \
+            -font \[list $menuFont\] -width $bestwidth"
+    set buttonClose $bptsgui.fb.buttonClose
+    eval "button $buttonClose [bl "&Close"] \
+            -command \"closebptsgui\" \
+            -font \[list $menuFont\] -width $bestwidth"
+    pack $buttonHelp $buttonClose -padx 40 -side left
+
+    pack $bptsgui.fb -expand 0 -fill none -pady 5 -side bottom
+    pack $bptsgui.f1 -expand 1 -fill both
+
+    bind $bptsgui <Alt-[fb $buttonHelp]> "$buttonHelp invoke"
+
+    # after 0 in the following Alt binding is mandatory for Linux only
+    # This is Tk bug 1236306 (still unfixed in Tk8.4.15 and Tk 8.5a6)
+    bind $bptsgui <Alt-[fb $buttonClose]> "after 0 {$buttonClose invoke}"
+
+    bind $bptsgui <MouseWheel> {$bptsgui.f1.fl.sf yview scroll [expr {- (%D / 120) * 1}] units}
+
+    if {$firstbptsguiopening} {
+        update idletasks
+        setwingeom $bptsgui
+        wm resizable $bptsgui 1 1
+    } else {
+        wm geometry $bptsgui $bptsguigeom
+    }
+
+    wm deiconify $bptsgui
+
+    # this *must* be after wm deiconify, otherwise [winfo height ...] still
+    # returns 1 on Linux
+    update ; # so that winfo height does not return 0
+    set onelineheight [winfo height $bptsguibptlist.flabels.fun]
+    $scrollf configure -height [expr {$onelineheight * $defaultnbdisplayedlines}]
+
+    unset -- currentlyopeningbptsgui
+}
+
+proc addbptingui {ID} {
+# insert the breakpoint identified by its ID $ID in the breakpoints gui,
+# more precisely inside the container scrolledframe of this gui
+
+    global bptsgui bptsguicolwidth bptconditiontypes bpthitconditions
+    global textFont
+
+    # do nothing if the breakpoints properties window is not open
+    # it will be refreshed on opening
+    if {![istoplevelopen bptsgui]} {
+        return
+    }
+
+    foreach {funcolwidth lincolwidth enacolwidth \
+             expcolwidth ctycolwidth watcolwidth \
+             hctcolwidth bricolwidth hthcolwidth \
+             rhccolwidth} $bptsguicolwidth {}
+
+    set cfr $bptsgui.f1.fl.sf.scrolled
+
+    label $cfr.funname$ID -font $textFont -relief groove -takefocus 0 \
+            -textvariable bptsprops($ID,funname) \
+            -width $funcolwidth
+    label $cfr.funline$ID -font $textFont -relief groove -takefocus 0 \
+            -textvariable bptsprops($ID,funline) \
+            -width $lincolwidth
+    checkbutton $cfr.enable$ID -font $textFont -relief groove \
+            -variable bptsprops($ID,enable) -onvalue true -offvalue false \
+            -width $enacolwidth \
+            -command "tagconfigurebreakpointbackground $ID"
+    entry $cfr.expression$ID -font $textFont \
+            -textvariable bptsprops($ID,expression) \
+            -width $expcolwidth \
+            -validate key -validatecommand "validateconditioneditingui $ID"
+    # -textvariable is not used in the spinbox, instead a separate procedure
+    # is called through the -command option (see proc updatebptspropscondtype)
+    spinbox $cfr.conditiontype$ID -font $textFont \
+            -values [listlocalize $bptconditiontypes] \
+            -command "updatebptspropscondtype $ID %s" \
+            -state readonly -width $ctycolwidth
+    updatespinboxexprcondtype $ID $cfr.conditiontype$ID
+    checkbutton $cfr.watchit$ID -font $textFont -relief groove \
+            -variable bptsprops($ID,watched) -onvalue true -offvalue false \
+            -width $watcolwidth \
+            -command "togglewatchcondbptexpr $ID"
+    label $cfr.hitcount$ID -font $textFont -relief groove -takefocus 0 \
+            -textvariable bptsprops($ID,hitcount) \
+            -width $hctcolwidth
+    # same comment for this spinbox as for $cfr.conditiontype$ID
+    spinbox $cfr.hitcountcondition$ID -font $textFont \
+            -values [listlocalize $bpthitconditions] \
+            -command "updatebptspropshitconds $ID %s" \
+            -state readonly -width $bricolwidth
+    updatespinboxhitcountcondtype $ID $cfr.hitcountcondition$ID
+    entry $cfr.hitthreshold$ID -font $textFont \
+            -textvariable bptsprops($ID,hitcountthreshold) \
+            -width $hthcolwidth -justify center \
+            -validate key -validatecommand "validatehitthresholdeditingui %P"
+    button $cfr.resethitcount$ID -font $textFont -relief groove -takefocus 0 \
+            -command "resetonehitcount $ID" -text [mc "Reset hit"] \
+            -width $rhccolwidth
+
+    # find the row number where new entry should be inserted
+    set insertrow [selectrowforsortedbpts $ID]
+    # shift the existing rows one line down to make room for the new entry
+    set lastrow [expr {[lindex [grid size $cfr] 1] - 1}]
+    for {set i $lastrow} {$i >= $insertrow} {incr i -1} {
+        set j [expr {$i + 1}]
+        foreach aslave [grid slaves $cfr -row $i] {
+            grid configure $aslave -row $j
+        }
+    }
+
+    # grid the new entry in the empty space
+    grid $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \
+            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \
+            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID \
+            -sticky nsew -row $insertrow
+
+    # when changing something in the breakpoints gui one wants to show where
+    # the breakpoint currently modified is located among the opened buffers
+    bind $cfr.funname$ID           <Button-1> "showbreakpointedline $ID $cfr.funname$ID"
+    bind $cfr.funline$ID           <Button-1> "showbreakpointedline $ID $cfr.funline$ID"
+    # but not for check/spin boxes (because blinking delays the update)
+    # bind $cfr.enable$ID           <Button-1> "showbreakpointedline $ID $cfr.enable$ID"
+    #bind $cfr.expression$ID        <Button-1> "showbreakpointedline $ID $cfr.expression$ID"
+    #bind $cfr.conditiontype$ID     <Button-1> "showbreakpointedline $ID $cfr.conditiontype$ID"
+    #bind $cfr.watchit$ID           <Button-1> "showbreakpointedline $ID $cfr.watchit$ID"
+    bind $cfr.hitcount$ID          <Button-1> "showbreakpointedline $ID $cfr.hitcount$ID"
+    #bind $cfr.hitcountcondition$ID <Button-1> "showbreakpointedline $ID $cfr.hitcountcondition$ID"
+    #bind $cfr.hitthreshold$ID      <Button-1> "showbreakpointedline $ID $cfr.hitthreshold$ID"
+    #bind $cfr.resethitcount$ID     <Button-1> "showbreakpointedline $ID $cfr.resethitcount$ID"
+}
+
+proc delbptingui {ID} {
+# remove breakpoint identified by its ID $ID from the breakpoints gui
+    global bptsgui
+
+    # do nothing if the breakpoints properties window is not open
+    # it will be refreshed on opening
+    if {![istoplevelopen bptsgui]} {
+        return
+    }
+
+    set cfr $bptsgui.f1.fl.sf.scrolled
+
+    # grid forget and shift upwards needed so that grid size is OK,
+    # which in turn is the condition for the downwards shifting algorithm
+    # in proc addbptingui to work
+    set deleterow [getrowingridfromID $ID]
+    set lastrow [expr {[lindex [grid size $cfr] 1] - 1}]
+    grid forget $cfr.funname$ID $cfr.funline$ID $cfr.expression$ID $cfr.watchit$ID
+    for {set i $deleterow} {$i <= $lastrow} {incr i} {
+        set j [expr {$i + 1}]
+        foreach aslave [grid slaves $cfr -row $j] {
+            grid configure $aslave -row $i
+        }
+    }
+
+    # note: destroy instruction mandatory here - see comments in proc deletebreakpoint
+    destroy $cfr.funname$ID $cfr.funline$ID $cfr.enable$ID $cfr.expression$ID \
+            $cfr.conditiontype$ID $cfr.watchit$ID $cfr.hitcount$ID \
+            $cfr.hitcountcondition$ID $cfr.hitthreshold$ID $cfr.resethitcount$ID
+}
+
+proc getrowingridfromID {ID} {
+# return the row number in which the breakpoint $ID is gridded in the
+# breakpoints gui
+# if $ID is not gridded, then return -1
+    global bptsgui
+
+    set cfr $bptsgui.f1.fl.sf.scrolled
+
+    set isingrid [lsearch -exact [grid slaves $cfr] $cfr.funname$ID]
+
+    if {$isingrid != -1} {
+        set infos [grid info $cfr.funname$ID]
+        set therow [lindex $infos [expr {[lsearch $infos "-row"] + 1}]]
+    } else {
+        set therow -1
+    }
+    return $therow    
+}
+
+proc selectrowforsortedbpts {ID} {
+# from a breakpoint ID, return the row number in which this breakpoint should
+# be gridded so that the grid is sorted alphabetically by funname and then by
+# increasing funline
+    global bptsprops bptsgui
+
+    set fname $bptsprops($ID,funname)
+    set fline $bptsprops($ID,funline)
+
+    set row 0
+
+    set allfunnames [getfunnamesfrombptsprops]
+    set funlinesoffname [getfunlinesfrombptsprops $fname]
+
+    # remove what we're searching from the lists of line numbers
+    # and function names
+    # this is necessary since when proc selectrowforsortedbpts
+    # is called the bptsprops array has already been augmented
+    # with the new breakpoint, and the algorithm below supposes
+    # that (fname,fline) is not (yet) part of bptsprops
+    set flinepos [lsearch -exact $funlinesoffname $fline]
+    set funlinesoffname [lreplace $funlinesoffname $flinepos $flinepos]
+
+    # same thing: $funlinesoffname must only contain the breakpointed
+    # lines already displayed in the bpts gui
+    set linestokeep [list ]
+    foreach thisfline $funlinesoffname {
+        set rowingrid [getrowingridfromID [where2bptID $fname $thisfline]]
+        if {$rowingrid != -1} {
+            lappend linestokeep $thisfline
+        }
+    }
+    set funlinesoffname $linestokeep
+
+    # now, if there is no remaining breakpointed line for $fname,
+    # remove also $fname from $allfunnames
+    if {$funlinesoffname == {}} {
+        set fnamepos [lsearch -exact $allfunnames $fname]
+        set allfunnames [lreplace $allfunnames $fnamepos $fnamepos]
+    }
+
+    foreach nameoffun $allfunnames {
+        switch -- [string compare $nameoffun $fname] {
+            -1 {
+                 incr row [llength [getfunlinesfrombptsprops $nameoffun]]
+                 continue
+               }
+             0 {
+                 set i 0
+                 while {([lindex $funlinesoffname $i] < $fline) && ($i < [llength $funlinesoffname])} {incr i}
+                 incr row $i
+                 break
+               }
+             1 {
+                 break
+               }
+        }
+    }
+
+    return $row
+}
+
+proc validateconditioneditingui {ID} {
+# this proc is used to maintain the display in the main Scipad window in sync
+# with the changes made in the expression area of the breakpoints properties gui
+    global bptsprops
+
+    # maintain consistency between the breakpoints gui and the watch window
+    # with no headache! if the expression was currently watched, then remove
+    # the watching first and let the user set it again afterwards if he still
+    # wants it
+    if {$bptsprops($ID,watched)} {
+        set bptsprops($ID,watched) false
+        togglewatchcondbptexpr $ID
+    }
+
+    # the new condition value needs to be updated in bptsprops($ID,curexpvalue)
+    # so that the next check in proc checkendofdebug_bp will use the correct
+    # "value at previous stop"
+    # executing this is fast enough, even with validation happening on each
+    # keypress in the condition area of the bptsgui
+    saveoneconditionvalue $ID
+
+    # the after 0 trick is needed to have the validation result (i.e. true)
+    # be sent to the entry widget first, so that the edit gets validated
+    # and the textvariable bptsprops(...) receives the new value before
+    # the tagging stuff occurs
+    after 0 "tagconfigurebreakpointbackground $ID"
+
+    # any content is allowed, error checking happens
+    # when executing the statement at each stop (see proc checkendofdebug_bp)
+    return true
+}
+
+proc updatebptspropscondtype {ID newconditiontype} {
+# update bptsprops($ID,conditiontype)
+# this proc is called whenever a button is clicked in the condition type
+# spinbox of the bpts gui
+# one could have obtained the same effect through -textvariable in the
+# spinbox definition, but then one would have had to deal with the locale
+# whenever bptsprops($ID,conditiontype) is used thoughout the code
+# with this approach only the display in the spinbox is localized, and
+# the internal value of bptsprops($ID,conditiontype) has only to be used
+# in english (and with strings that do not need to be identical to the
+# displayed ones)
+    global bptsprops bptconditiontypes
+
+    set pos [lsearch -exact [listlocalize $bptconditiontypes] $newconditiontype]
+    # $pos == -1 should not happen, i.e. the espression condition type newly selected
+    # in the spinbox should be found in the localized list of esxpression condition types
+
+    set bptsprops($ID,conditiontype) [lindex $bptconditiontypes $pos]
+}
+
+proc updatespinboxexprcondtype {ID w} {
+# update condition type displayed in the spinbox so that it matches
+# $bptsprops($ID,conditiontype)
+    global bptsprops
+
+    $w set [mc $bptsprops($ID,conditiontype)]
+}
+
+proc validatehitthresholdeditingui {proposedcontent} {
+# return true if and only if the proposed new full content $newcontent that
+# the user tries to have in the threshold entry area is a positive or zero
+# integer number
+# moreover, the user is not allowed to delete completely the entry
+# note: string is integer -strict $newcontent is not enough because
+#       this allows for negative integers, and also for leading zeroes
+
+    global strictlypositiveintegerREpat
+
+    return [regexp $strictlypositiveintegerREpat $proposedcontent]
+}
+
+proc updatebptspropshitconds {ID newhitcondition} {
+# this is the same as proc updatebptspropscondtype, but for the hit count
+# condition type (while proc updatebptspropscondtype deals with the
+# breakpoint expression condition type)
+# <TODO> factorize this code with proc updatebptspropscondtype
+    global bptsprops bpthitconditions
+
+    set pos [lsearch -exact [listlocalize $bpthitconditions] $newhitcondition]
+    # $pos == -1 should not happen, i.e. the hit condition type newly selected
+    # in the spinbox should be found in the localized list of hit condition types
+
+    set bptsprops($ID,hitcountcondition) [lindex $bpthitconditions $pos]
+}
+
+proc updatespinboxhitcountcondtype {ID w} {
+# update hit count condition type displayed in the spinbox so that it matches
+# $bptsprops($ID,hitcountcondition)
+    global bptsprops
+
+    $w set [mc $bptsprops($ID,hitcountcondition)]
+}
+
+proc togglewatchcondbptexpr {ID} {
+# toggle the watching of the conditional expression of breakpoint identified
+# by $ID
+# the watching consists in adding a generic expression in the watch window
+# and in maintaining consistency between the expression displayed in the
+# breakpoints gui and in the watch window (the latter is done throughout
+# the code, not in this proc)
+    global bptsprops
+    global watchgenexps
+
+    if {$bptsprops($ID,watched)} {
+        # now watch expression from breakpoint $ID
+        # duplicates are dealt with in proc OKadda_bp
+        quickAddWatch_bp $bptsprops($ID,expression) genericexpression
+
+    } else {
+        # stop watching expression from breakpoint $ID
+        # before removing the expression from the watch window, check that
+        # no other breakpoint currently watched has the same expression
+        set mustremove true
+        foreach otherID [getusedIDsfrombptprops] {
+            if {$otherID == $ID} {continue}
+            if {$bptsprops($otherID,watched) &&
+                $bptsprops($otherID,expression) == $bptsprops($ID,expression)} {
+                set mustremove false
+                break
+            }
+        }
+        if {$mustremove} {
+            # remove the expression from the watch
+            set posinwatchgenexps [lsearch -exact $watchgenexps $bptsprops($ID,expression)]
+            # $posinwatchgenexps should never be -1 if consistency is maintained correctly
+            # between the watch window and the breakpoints gui, which should be the case
+            set watchgenexps [lreplace $watchgenexps $posinwatchgenexps $posinwatchgenexps]
+        }
+    }
+}
+
+proc unwatchallcondbptexpr {exp} {
+# uncheck the "Watched" checkbox of all breakpoints having $exp
+# as conditional expression
+    global bptsprops
+    foreach ID [getusedIDsfrombptprops] {
+        if {$bptsprops($ID,expression) == $exp} {
+            set bptsprops($ID,watched) false
+            # here don't call proc togglewatchcondbptexpr, because the current
+            # proc is already called by proc Removearg_bp, i.e. the corresponding
+            # expression is already in the process of being deleted from the
+            # watch window
+        }
+    }
+}
+
+proc closebptsgui {} {
+    global bptsgui bptsguigeom
+
+    # save size and position of the window for future restoration
+    set bptsguigeom [wm geometry $bptsgui]
+
+    # one must delete the widgets (see proc deletebreakpoint for an
+    # approximate reason)
+    foreach ID [getusedIDsfrombptprops] {
+        delbptingui $ID
+    }
+
+    destroy $bptsgui
+}
+
+proc helpbptsgui {} {
+# a dialog explaining a bit the vocabulary about breakpoints conditions
+    global bptsgui
+    set tit [mc "Breakpoints vocabulary"]
+    set mes [concat [mc "A breakpoint is identified by its location, i.e. its position (a line number) in a function."] \
+                    [mc "When the execution process encounters an enabled breakpoint, then this breakpoint is said to be reached."] \
+                    [mc "When the breakpoint is reached and its associated conditional expression is true (or changed),\
+                         then the breakpoint is said to be hit."] \
+                    [mc "The hit count is the number of times the breakpoint has been hit."] \
+                    [mc "Execution will stop at a breakpoint if the hit count satisfies the selectable break condition."] \
+            ]
+    tk_messageBox -message $mes -icon info -title $tit -parent $bptsgui
+}
+
+proc showbreakpointedline {ID focuswidget} {
+# show the piece of code that contains the breakpoint identified by $ID
+    global bptsprops
+    after idle "blinkline $bptsprops($ID,funline) $bptsprops($ID,funname) 1 ; focus $focuswidget"
+}
+
+proc highlightbptinbptsgui {ID} {
+# colorize in red the line in $bptsgui that contains the informations related to 
+# breakpoint with ID $ID
+    global bptsgui
+    global oldcolorfunnameinbptsgui oldcolorfunlineinbptsgui
+
+    # do nothing if the breakpoints properties window is not open
+    if {![istoplevelopen bptsgui]} {
+        return
+    }
+
+    set cfr $bptsgui.f1.fl.sf.scrolled
+
+    set oldcolorfunnameinbptsgui [$cfr.funname$ID cget -foreground]
+    set oldcolorfunlineinbptsgui [$cfr.funline$ID cget -foreground]
+
+    $cfr.funname$ID configure -foreground red
+    $cfr.funline$ID configure -foreground red
+
+    # <TODO> Should it scroll the bpts list so that breakpoint $ID
+    #        becomes visible if it was hidden? Sort of a $ID see...
+    #        I'd say no...
+}
+
+proc unhighlightbptinbptsgui {ID} {
+# colorize in normal color the line in $bptsgui that contains the informations 
+# related to breakpoint with ID $ID
+    global bptsgui
+    global oldcolorfunnameinbptsgui oldcolorfunlineinbptsgui
+
+    # do nothing if the breakpoints properties window is not open
+    if {![istoplevelopen bptsgui]} {
+        return
+    }
+
+    set cfr $bptsgui.f1.fl.sf.scrolled
+
+    # when the breakpoints gui is opened the first time with the mouse cursor
+    # in a breakpoint, then the old colors are undefined
+    # therefore catch this
+    catch {
+        $cfr.funname$ID configure -foreground $oldcolorfunnameinbptsgui
+        $cfr.funline$ID configure -foreground $oldcolorfunlineinbptsgui
+    }
+}
+
+proc sortbptsgui {nameoffun} {
+# sort the entries in the breakpoints properties gui
+# this is not a real sorting algorithm, in the sense that is won't sort
+# an arbitrarily messed up breakpoints gui
+# when entering this proc the gui is supposed to be perfectly sorted,
+# the only entries that might be not sorted are those having $nameoffun
+# as function name
+
+    # do nothing if the breakpoints properties window is not open
+    # it will be refreshed on opening
+    if {![istoplevelopen bptsgui]} {
+        return
+    }
+
+    # algorithm :
+    #   . retrieve the IDs of entries having $nameoffun
+    #   . delete these entries from the gui
+    #   . add them again (this looks for the right insert place)
+    foreach aline [getfunlinesfrombptsprops $nameoffun] {
+        set ID [where2bptID $nameoffun $aline]
+        delbptingui $ID
+        addbptingui $ID
+    }
+}
index f52f0eb..12288a9 100644 (file)
-##############################################################################\r
-###\r
-### Scrollable frame megawidget\r
-###\r
-### The content of this file has been copied from the Tcl Wiki\r
-### at http://wiki.tcl.tk/9223\r
-###\r
-### Licence: NOL (see below authors and licences)\r
-###\r
-##############################################################################\r
-\r
-if {[info exists ::scrolledframe::version]} { return }\r
-namespace eval ::scrolledframe \\r
-{\r
-# beginning of ::scrolledframe namespace definition\r
-\r
-namespace export scrolledframe\r
-\r
-# ==============================\r
-#\r
-# scrolledframe\r
-set version 0.9.1\r
-set (debug,place) 0\r
-#\r
-# a scrolled frame\r
-#\r
-# (C) 2003, ulis\r
-#\r
-# NOL licence (No Obligation Licence)\r
-#\r
-# Changes (C) 2004, KJN\r
-#\r
-# NOL licence (No Obligation Licence)\r
-# ==============================\r
-#\r
-# Hacked package, no documentation, sorry\r
-# See example at bottom\r
-#\r
-# ------------------------------\r
-# v 0.9.1\r
-#  automatic scroll on resize\r
-# ==============================\r
-\r
-  package provide Scrolledframe $version\r
-\r
-  # --------------\r
-  #\r
-  # create a scrolled frame\r
-  #\r
-  # --------------\r
-  # parm1: widget name\r
-  # parm2: options key/value list\r
-  # --------------\r
-  proc scrolledframe {w args} \\r
-  {\r
-    variable {}\r
-    # create a scrolled frame\r
-    frame $w\r
-    # trap the reference\r
-    rename $w ::scrolledframe::_$w\r
-    # redirect to dispatch\r
-    interp alias {} $w {} ::scrolledframe::dispatch $w\r
-    # create scrollable internal frame\r
-    frame $w.scrolled -highlightt 0 -padx 0 -pady 0\r
-    # place it\r
-    place $w.scrolled -in $w -x 0 -y 0\r
-    if {$(debug,place)} { puts "place $w.scrolled -in $w -x 0 -y 0" } ;#DEBUG\r
-    # init internal data\r
-    set ($w:vheight) 0\r
-    set ($w:vwidth) 0\r
-    set ($w:vtop) 0\r
-    set ($w:vleft) 0\r
-    set ($w:xscroll) ""\r
-    set ($w:yscroll) ""\r
-    set ($w:width)    0\r
-    set ($w:height)   0\r
-    set ($w:fillx)    0\r
-    set ($w:filly)    0\r
-    # configure\r
-    if {$args != ""} { uplevel 1 ::scrolledframe::config $w $args }\r
-    # bind <Configure>\r
-    bind $w <Configure> [namespace code [list resize $w]]\r
-    bind $w.scrolled <Configure> [namespace code [list resize $w]]\r
-    # return widget ref\r
-    return $w\r
-  }\r
-\r
-  # --------------\r
-  #\r
-  # dispatch the trapped command\r
-  #\r
-  # --------------\r
-  # parm1: widget name\r
-  # parm2: operation\r
-  # parm2: operation args\r
-  # --------------\r
-  proc dispatch {w cmd args} \\r
-  {\r
-    variable {}\r
-    switch -glob -- $cmd \\r
-    {\r
-      con*    { uplevel 1 [linsert $args 0 ::scrolledframe::config $w] }\r
-      xvi*    { uplevel 1 [linsert $args 0 ::scrolledframe::xview  $w] }\r
-      yvi*    { uplevel 1 [linsert $args 0 ::scrolledframe::yview  $w] }\r
-      default { uplevel 1 [linsert $args 0 ::scrolledframe::_$w    $cmd] }\r
-    }\r
-  }\r
-\r
-  # --------------\r
-  # configure operation\r
-  #\r
-  # configure the widget\r
-  # --------------\r
-  # parm1: widget name\r
-  # parm2: options\r
-  # --------------\r
-  proc config {w args} \\r
-  {\r
-    variable {}\r
-    set options {}\r
-    set flag 0\r
-    foreach {key value} $args \\r
-    {\r
-      switch -glob -- $key \\r
-      {\r
-        -fill   \\r
-        {\r
-          # new fill option: what should the scrolled object do if it is smaller than the viewing window?\r
-          if {$value == "none"} {\r
-             set ($w:fillx) 0\r
-             set ($w:filly) 0\r
-          } elseif {$value == "x"} {\r
-             set ($w:fillx) 1\r
-             set ($w:filly) 0\r
-          } elseif {$value == "y"} {\r
-             set ($w:fillx) 0\r
-             set ($w:filly) 1\r
-          } elseif {$value == "both"} {\r
-             set ($w:fillx) 1\r
-             set ($w:filly) 1\r
-          } else {\r
-             error "invalid value: should be \"$w configure -fill value\", where \"value\" is \"x\", \"y\", \"none\", or \"both\""\r
-          }\r
-          resize $w force\r
-          set flag 1\r
-        }\r
-        -xsc*   \\r
-        {\r
-          # new xscroll option\r
-          set ($w:xscroll) $value\r
-          set flag 1\r
-        }\r
-        -ysc*   \\r
-        {\r
-          # new yscroll option\r
-          set ($w:yscroll) $value\r
-          set flag 1\r
-        }\r
-        default { lappend options $key $value }\r
-      }\r
-    }\r
-    # check if needed\r
-    if {!$flag || $options != ""} \\r
-    {\r
-      # call frame config\r
-      uplevel 1 [linsert $options 0 ::scrolledframe::_$w config]\r
-    }\r
-  }\r
-\r
-  # --------------\r
-  # resize proc\r
-  #\r
-  # Update the scrollbars if necessary, in response to a change in either the viewing window\r
-  # or the scrolled object.\r
-  # Replaces the old resize and the old vresize\r
-  # A <Configure> call may mean any change to the viewing window or the scrolled object.\r
-  # We only need to resize the scrollbars if the size of one of these objects has changed.\r
-  # Usually the window sizes have not changed, and so the proc will not resize the scrollbars.\r
-  # --------------\r
-  # parm1: widget name\r
-  # parm2: pass anything to force resize even if dimensions are unchanged\r
-  # --------------\r
-  proc resize {w args} \\r
-  {\r
-    variable {}\r
-    set force [llength $args]\r
-\r
-    set _vheight     $($w:vheight)\r
-    set _vwidth      $($w:vwidth)\r
-    # compute new height & width\r
-    set ($w:vheight) [winfo reqheight $w.scrolled]\r
-    set ($w:vwidth)  [winfo reqwidth  $w.scrolled]\r
-\r
-    # The size may have changed, e.g. by manual resizing of the window\r
-    set _height     $($w:height)\r
-    set _width      $($w:width)\r
-    set ($w:height) [winfo height $w] ;# gives the actual height of the viewing window\r
-    set ($w:width)  [winfo width  $w] ;# gives the actual width of the viewing window\r
-\r
-    if {$force || $($w:vheight) != $_vheight || $($w:height) != $_height} {\r
-      # resize the vertical scroll bar\r
-      yview $w scroll 0 unit\r
-      # yset $w\r
-    }\r
-\r
-    if {$force || $($w:vwidth) != $_vwidth || $($w:width) != $_width} {\r
-      # resize the horizontal scroll bar\r
-      xview $w scroll 0 unit\r
-      # xset $w\r
-    }\r
-  } ;# end proc resize\r
-\r
-  # --------------\r
-  # xset proc\r
-  #\r
-  # resize the visible part\r
-  # --------------\r
-  # parm1: widget name\r
-  # --------------\r
-  proc xset {w} \\r
-  {\r
-    variable {}\r
-    # call the xscroll command\r
-    set cmd $($w:xscroll)\r
-    if {$cmd != ""} { catch { eval $cmd [xview $w] } }\r
-  }\r
-\r
-  # --------------\r
-  # yset proc\r
-  #\r
-  # resize the visible part\r
-  # --------------\r
-  # parm1: widget name\r
-  # --------------\r
-  proc yset {w} \\r
-  {\r
-    variable {}\r
-    # call the yscroll command\r
-    set cmd $($w:yscroll)\r
-    if {$cmd != ""} { catch { eval $cmd [yview $w] } }\r
-  }\r
-\r
-  # -------------\r
-  # xview\r
-  #\r
-  # called on horizontal scrolling\r
-  # -------------\r
-  # parm1: widget path\r
-  # parm2: optional moveto or scroll\r
-  # parm3: fraction if parm2 == moveto, count unit if parm2 == scroll\r
-  # -------------\r
-  # return: scrolling info if parm2 is empty\r
-  # -------------\r
-  proc xview {w {cmd ""} args} \\r
-  {\r
-    variable {}\r
-    # check args\r
-    set len [llength $args]\r
-    switch -glob -- $cmd \\r
-    {\r
-      ""      {set args {}}\r
-      mov*    \\r
-      { if {$len != 1} { error "wrong # args: should be \"$w xview moveto fraction\"" } }\r
-      scr*    \\r
-      { if {$len != 2} { error "wrong # args: should be \"$w xview scroll count unit\"" } }\r
-      default \\r
-      { error "unknown operation \"$cmd\": should be empty, moveto or scroll" }\r
-    }\r
-    # save old values:\r
-    set _vleft $($w:vleft)\r
-    set _vwidth $($w:vwidth)\r
-    set _width  $($w:width)\r
-    # compute new vleft\r
-    set count ""\r
-    switch $len \\r
-    {\r
-      0       \\r
-      {\r
-        # return fractions\r
-        if {$_vwidth == 0} { return {0 1} }\r
-        set first [expr {double($_vleft) / $_vwidth}]\r
-        set last [expr {double($_vleft + $_width) / $_vwidth}]\r
-        if {$last > 1.0} { return {0 1} }\r
-        return [list [format %g $first] [format %g $last]]\r
-      }\r
-      1       \\r
-      {\r
-        # absolute movement\r
-        set vleft [expr {int(double($args) * $_vwidth)}]\r
-      }\r
-      2       \\r
-      {\r
-        # relative movement\r
-        foreach {count unit} $args break\r
-        if {[string match p* $unit]} { set count [expr {$count * 9}] }\r
-        set vleft [expr {$_vleft + $count * 0.1 * $_width}]\r
-      }\r
-    }\r
-    if {$vleft + $_width > $_vwidth} { set vleft [expr {$_vwidth - $_width}] }\r
-    if {$vleft < 0} { set vleft 0 }\r
-    if {$vleft != $_vleft || $count == 0} \\r
-    {\r
-      set ($w:vleft) $vleft\r
-      xset $w\r
-      if {$($w:fillx) && ($_vwidth < $_width || $($w:xscroll) == "") } {\r
-        # "scrolled object" is not scrolled, because it is too small or because no scrollbar was requested\r
-        # fillx means that, in these cases, we must tell the object what its width should be\r
-        place $w.scrolled -in $w -x [expr {-$vleft}] -width $_width\r
-        if {$(debug,place)} { puts "place $w.scrolled -in $w -x [expr {-$vleft}] -width $_width" } ;#DEBUG\r
-      } else {\r
-        place $w.scrolled -in $w -x [expr {-$vleft}] -width {}\r
-        if {$(debug,place)} { puts "place $w.scrolled -in $w -x [expr {-$vleft}] -width {}" } ;#DEBUG\r
-      }\r
-\r
-    }\r
-  }\r
-\r
-  # -------------\r
-  # yview\r
-  #\r
-  # called on vertical scrolling\r
-  # -------------\r
-  # parm1: widget path\r
-  # parm2: optional moveto or scroll\r
-  # parm3: fraction if parm2 == moveto, count unit if parm2 == scroll\r
-  # -------------\r
-  # return: scrolling info if parm2 is empty\r
-  # -------------\r
-  proc yview {w {cmd ""} args} \\r
-  {\r
-    variable {}\r
-    # check args\r
-    set len [llength $args]\r
-    switch -glob -- $cmd \\r
-    {\r
-      ""      {set args {}}\r
-      mov*    \\r
-      { if {$len != 1} { error "wrong # args: should be \"$w yview moveto fraction\"" } }\r
-      scr*    \\r
-      { if {$len != 2} { error "wrong # args: should be \"$w yview scroll count unit\"" } }\r
-      default \\r
-      { error "unknown operation \"$cmd\": should be empty, moveto or scroll" }\r
-    }\r
-    # save old values\r
-    set _vtop $($w:vtop)\r
-    set _vheight $($w:vheight)\r
-#    set _height [winfo height $w]\r
-    set _height $($w:height)\r
-    # compute new vtop\r
-    set count ""\r
-    switch $len \\r
-    {\r
-      0       \\r
-      {\r
-        # return fractions\r
-        if {$_vheight == 0} { return {0 1} }\r
-        set first [expr {double($_vtop) / $_vheight}]\r
-        set last [expr {double($_vtop + $_height) / $_vheight}]\r
-        if {$last > 1.0} { return {0 1} }\r
-        return [list [format %g $first] [format %g $last]]\r
-      }\r
-      1       \\r
-      {\r
-        # absolute movement\r
-        set vtop [expr {int(double($args) * $_vheight)}]\r
-      }\r
-      2       \\r
-      {\r
-        # relative movement\r
-        foreach {count unit} $args break\r
-        if {[string match p* $unit]} { set count [expr {$count * 9}] }\r
-        set vtop [expr {$_vtop + $count * 0.1 * $_height}]\r
-      }\r
-    }\r
-    if {$vtop + $_height > $_vheight} { set vtop [expr {$_vheight - $_height}] }\r
-    if {$vtop < 0} { set vtop 0 }\r
-    if {$vtop != $_vtop || $count == 0} \\r
-    {\r
-      set ($w:vtop) $vtop\r
-      yset $w\r
-      if {$($w:filly) && ($_vheight < $_height || $($w:yscroll) == "")} {\r
-        # "scrolled object" is not scrolled, because it is too small or because no scrollbar was requested\r
-        # filly means that, in these cases, we must tell the object what its height should be\r
-        place $w.scrolled -in $w -y [expr {-$vtop}] -height $_height\r
-        if {$(debug,place)} { puts "place $w.scrolled -in $w -y [expr {-$vtop}] -height $_height" } ;#DEBUG\r
-      } else {\r
-        place $w.scrolled -in $w -y [expr {-$vtop}] -height {}\r
-        if {$(debug,place)} { puts "place $w.scrolled -in $w -y [expr {-$vtop}] -height {}" } ;#DEBUG\r
-      }\r
-    }\r
-  }\r
-\r
-# end of ::scrolledframe namespace definition\r
-}\r
-\r
-#\r
-# EXAMPLE OF USE\r
-#\r
-\r
-if {0} {\r
-\r
-  package require Scrolledframe\r
-\r
-  namespace import ::scrolledframe::scrolledframe\r
-\r
-  scrolledframe .sf -height 150 -width 100 \\r
-      -xscrollcommand {.hs set} -yscrollcommand {.vs set}  -fill both ;# try both, x, y or none\r
-  scrollbar .vs -command {.sf yview}\r
-  scrollbar .hs -command {.sf xview} -orient horizontal\r
-  grid .sf -row 0 -column 0 -sticky nsew\r
-  grid .vs -row 0 -column 1 -sticky ns\r
-  grid .hs -row 1 -column 0 -sticky ew\r
-  grid rowconfigure . 0 -weight 1\r
-  grid columnconfigure . 0 -weight 1\r
-  set f .sf.scrolled\r
-#  .sf configure -bg white\r
-\r
-  foreach i {0 1 2 3 4 5 6 7 8 9} \\r
-  {\r
-    label $f.l$i -text "Hi! I'm the scrolled label $i" -relief groove\r
-    pack $f.l$i -padx 10 -pady 2 -anchor nw -fill x\r
-  }\r
-  label $f.lf -text "Hi! I take up the slack!" -relief groove\r
-  pack  $f.lf -in $f -padx 10 -pady 2 -anchor nw -fill both -expand 1\r
-\r
-}\r
+##############################################################################
+###
+### Scrollable frame megawidget
+###
+### The content of this file has been copied from the Tcl Wiki
+### at http://wiki.tcl.tk/9223
+###
+### Licence: NOL (see below authors and licences)
+###
+##############################################################################
+
+if {[info exists ::scrolledframe::version]} { return }
+namespace eval ::scrolledframe \
+{
+# beginning of ::scrolledframe namespace definition
+
+namespace export scrolledframe
+
+# ==============================
+#
+# scrolledframe
+set version 0.9.1
+set (debug,place) 0
+#
+# a scrolled frame
+#
+# (C) 2003, ulis
+#
+# NOL licence (No Obligation Licence)
+#
+# Changes (C) 2004, KJN
+#
+# NOL licence (No Obligation Licence)
+# ==============================
+#
+# Hacked package, no documentation, sorry
+# See example at bottom
+#
+# ------------------------------
+# v 0.9.1
+#  automatic scroll on resize
+# ==============================
+
+  package provide Scrolledframe $version
+
+  # --------------
+  #
+  # create a scrolled frame
+  #
+  # --------------
+  # parm1: widget name
+  # parm2: options key/value list
+  # --------------
+  proc scrolledframe {w args} \
+  {
+    variable {}
+    # create a scrolled frame
+    frame $w
+    # trap the reference
+    rename $w ::scrolledframe::_$w
+    # redirect to dispatch
+    interp alias {} $w {} ::scrolledframe::dispatch $w
+    # create scrollable internal frame
+    frame $w.scrolled -highlightt 0 -padx 0 -pady 0
+    # place it
+    place $w.scrolled -in $w -x 0 -y 0
+    if {$(debug,place)} { puts "place $w.scrolled -in $w -x 0 -y 0" } ;#DEBUG
+    # init internal data
+    set ($w:vheight) 0
+    set ($w:vwidth) 0
+    set ($w:vtop) 0
+    set ($w:vleft) 0
+    set ($w:xscroll) ""
+    set ($w:yscroll) ""
+    set ($w:width)    0
+    set ($w:height)   0
+    set ($w:fillx)    0
+    set ($w:filly)    0
+    # configure
+    if {$args != ""} { uplevel 1 ::scrolledframe::config $w $args }
+    # bind <Configure>
+    bind $w <Configure> [namespace code [list resize $w]]
+    bind $w.scrolled <Configure> [namespace code [list resize $w]]
+    # return widget ref
+    return $w
+  }
+
+  # --------------
+  #
+  # dispatch the trapped command
+  #
+  # --------------
+  # parm1: widget name
+  # parm2: operation
+  # parm2: operation args
+  # --------------
+  proc dispatch {w cmd args} \
+  {
+    variable {}
+    switch -glob -- $cmd \
+    {
+      con*    { uplevel 1 [linsert $args 0 ::scrolledframe::config $w] }
+      xvi*    { uplevel 1 [linsert $args 0 ::scrolledframe::xview  $w] }
+      yvi*    { uplevel 1 [linsert $args 0 ::scrolledframe::yview  $w] }
+      default { uplevel 1 [linsert $args 0 ::scrolledframe::_$w    $cmd] }
+    }
+  }
+
+  # --------------
+  # configure operation
+  #
+  # configure the widget
+  # --------------
+  # parm1: widget name
+  # parm2: options
+  # --------------
+  proc config {w args} \
+  {
+    variable {}
+    set options {}
+    set flag 0
+    foreach {key value} $args \
+    {
+      switch -glob -- $key \
+      {
+        -fill   \
+        {
+          # new fill option: what should the scrolled object do if it is smaller than the viewing window?
+          if {$value == "none"} {
+             set ($w:fillx) 0
+             set ($w:filly) 0
+          } elseif {$value == "x"} {
+             set ($w:fillx) 1
+             set ($w:filly) 0
+          } elseif {$value == "y"} {
+             set ($w:fillx) 0
+             set ($w:filly) 1
+          } elseif {$value == "both"} {
+             set ($w:fillx) 1
+             set ($w:filly) 1
+          } else {
+             error "invalid value: should be \"$w configure -fill value\", where \"value\" is \"x\", \"y\", \"none\", or \"both\""
+          }
+          resize $w force
+          set flag 1
+        }
+        -xsc*   \
+        {
+          # new xscroll option
+          set ($w:xscroll) $value
+          set flag 1
+        }
+        -ysc*   \
+        {
+          # new yscroll option
+          set ($w:yscroll) $value
+          set flag 1
+        }
+        default { lappend options $key $value }
+      }
+    }
+    # check if needed
+    if {!$flag || $options != ""} \
+    {
+      # call frame config
+      uplevel 1 [linsert $options 0 ::scrolledframe::_$w config]
+    }
+  }
+
+  # --------------
+  # resize proc
+  #
+  # Update the scrollbars if necessary, in response to a change in either the viewing window
+  # or the scrolled object.
+  # Replaces the old resize and the old vresize
+  # A <Configure> call may mean any change to the viewing window or the scrolled object.
+  # We only need to resize the scrollbars if the size of one of these objects has changed.
+  # Usually the window sizes have not changed, and so the proc will not resize the scrollbars.
+  # --------------
+  # parm1: widget name
+  # parm2: pass anything to force resize even if dimensions are unchanged
+  # --------------
+  proc resize {w args} \
+  {
+    variable {}
+    set force [llength $args]
+
+    set _vheight     $($w:vheight)
+    set _vwidth      $($w:vwidth)
+    # compute new height & width
+    set ($w:vheight) [winfo reqheight $w.scrolled]
+    set ($w:vwidth)  [winfo reqwidth  $w.scrolled]
+
+    # The size may have changed, e.g. by manual resizing of the window
+    set _height     $($w:height)
+    set _width      $($w:width)
+    set ($w:height) [winfo height $w] ;# gives the actual height of the viewing window
+    set ($w:width)  [winfo width  $w] ;# gives the actual width of the viewing window
+
+    if {$force || $($w:vheight) != $_vheight || $($w:height) != $_height} {
+      # resize the vertical scroll bar
+      yview $w scroll 0 unit
+      # yset $w
+    }
+
+    if {$force || $($w:vwidth) != $_vwidth || $($w:width) != $_width} {
+      # resize the horizontal scroll bar
+      xview $w scroll 0 unit
+      # xset $w
+    }
+  } ;# end proc resize
+
+  # --------------
+  # xset proc
+  #
+  # resize the visible part
+  # --------------
+  # parm1: widget name
+  # --------------
+  proc xset {w} \
+  {
+    variable {}
+    # call the xscroll command
+    set cmd $($w:xscroll)
+    if {$cmd != ""} { catch { eval $cmd [xview $w] } }
+  }
+
+  # --------------
+  # yset proc
+  #
+  # resize the visible part
+  # --------------
+  # parm1: widget name
+  # --------------
+  proc yset {w} \
+  {
+    variable {}
+    # call the yscroll command
+    set cmd $($w:yscroll)
+    if {$cmd != ""} { catch { eval $cmd [yview $w] } }
+  }
+
+  # -------------
+  # xview
+  #
+  # called on horizontal scrolling
+  # -------------
+  # parm1: widget path
+  # parm2: optional moveto or scroll
+  # parm3: fraction if parm2 == moveto, count unit if parm2 == scroll
+  # -------------
+  # return: scrolling info if parm2 is empty
+  # -------------
+  proc xview {w {cmd ""} args} \
+  {
+    variable {}
+    # check args
+    set len [llength $args]
+    switch -glob -- $cmd \
+    {
+      ""      {set args {}}
+      mov*    \
+      { if {$len != 1} { error "wrong # args: should be \"$w xview moveto fraction\"" } }
+      scr*    \
+      { if {$len != 2} { error "wrong # args: should be \"$w xview scroll count unit\"" } }
+      default \
+      { error "unknown operation \"$cmd\": should be empty, moveto or scroll" }
+    }
+    # save old values:
+    set _vleft $($w:vleft)
+    set _vwidth $($w:vwidth)
+    set _width  $($w:width)
+    # compute new vleft
+    set count ""
+    switch $len \
+    {
+      0       \
+      {
+        # return fractions
+        if {$_vwidth == 0} { return {0 1} }
+        set first [expr {double($_vleft) / $_vwidth}]
+        set last [expr {double($_vleft + $_width) / $_vwidth}]
+        if {$last > 1.0} { return {0 1} }
+        return [list [format %g $first] [format %g $last]]
+      }
+      1       \
+      {
+        # absolute movement
+        set vleft [expr {int(double($args) * $_vwidth)}]
+      }
+      2       \
+      {
+        # relative movement
+        foreach {count unit} $args break
+        if {[string match p* $unit]} { set count [expr {$count * 9}] }
+        set vleft [expr {$_vleft + $count * 0.1 * $_width}]
+      }
+    }
+    if {$vleft + $_width > $_vwidth} { set vleft [expr {$_vwidth - $_width}] }
+    if {$vleft < 0} { set vleft 0 }
+    if {$vleft != $_vleft || $count == 0} \
+    {
+      set ($w:vleft) $vleft
+      xset $w
+      if {$($w:fillx) && ($_vwidth < $_width || $($w:xscroll) == "") } {
+        # "scrolled object" is not scrolled, because it is too small or because no scrollbar was requested
+        # fillx means that, in these cases, we must tell the object what its width should be
+        place $w.scrolled -in $w -x [expr {-$vleft}] -width $_width
+        if {$(debug,place)} { puts "place $w.scrolled -in $w -x [expr {-$vleft}] -width $_width" } ;#DEBUG
+      } else {
+        place $w.scrolled -in $w -x [expr {-$vleft}] -width {}
+        if {$(debug,place)} { puts "place $w.scrolled -in $w -x [expr {-$vleft}] -width {}" } ;#DEBUG
+      }
+
+    }
+  }
+
+  # -------------
+  # yview
+  #
+  # called on vertical scrolling
+  # -------------
+  # parm1: widget path
+  # parm2: optional moveto or scroll
+  # parm3: fraction if parm2 == moveto, count unit if parm2 == scroll
+  # -------------
+  # return: scrolling info if parm2 is empty
+  # -------------
+  proc yview {w {cmd ""} args} \
+  {
+    variable {}
+    # check args
+    set len [llength $args]
+    switch -glob -- $cmd \
+    {
+      ""      {set args {}}
+      mov*    \
+      { if {$len != 1} { error "wrong # args: should be \"$w yview moveto fraction\"" } }
+      scr*    \
+      { if {$len != 2} { error "wrong # args: should be \"$w yview scroll count unit\"" } }
+      default \
+      { error "unknown operation \"$cmd\": should be empty, moveto or scroll" }
+    }
+    # save old values
+    set _vtop $($w:vtop)
+    set _vheight $($w:vheight)
+#    set _height [winfo height $w]
+    set _height $($w:height)
+    # compute new vtop
+    set count ""
+    switch $len \
+    {
+      0       \
+      {
+        # return fractions
+        if {$_vheight == 0} { return {0 1} }
+        set first [expr {double($_vtop) / $_vheight}]
+        set last [expr {double($_vtop + $_height) / $_vheight}]
+        if {$last > 1.0} { return {0 1} }
+        return [list [format %g $first] [format %g $last]]
+      }
+      1       \
+      {
+        # absolute movement
+        set vtop [expr {int(double($args) * $_vheight)}]
+      }
+      2       \
+      {
+        # relative movement
+        foreach {count unit} $args break
+        if {[string match p* $unit]} { set count [expr {$count * 9}] }
+        set vtop [expr {$_vtop + $count * 0.1 * $_height}]
+      }
+    }
+    if {$vtop + $_height > $_vheight} { set vtop [expr {$_vheight - $_height}] }
+    if {$vtop < 0} { set vtop 0 }
+    if {$vtop != $_vtop || $count == 0} \
+    {
+      set ($w:vtop) $vtop
+      yset $w
+      if {$($w:filly) && ($_vheight < $_height || $($w:yscroll) == "")} {
+        # "scrolled object" is not scrolled, because it is too small or because no scrollbar was requested
+        # filly means that, in these cases, we must tell the object what its height should be
+        place $w.scrolled -in $w -y [expr {-$vtop}] -height $_height
+        if {$(debug,place)} { puts "place $w.scrolled -in $w -y [expr {-$vtop}] -height $_height" } ;#DEBUG
+      } else {
+        place $w.scrolled -in $w -y [expr {-$vtop}] -height {}
+        if {$(debug,place)} { puts "place $w.scrolled -in $w -y [expr {-$vtop}] -height {}" } ;#DEBUG
+      }
+    }
+  }
+
+# end of ::scrolledframe namespace definition
+}
+
+#
+# EXAMPLE OF USE
+#
+
+if {0} {
+
+  package require Scrolledframe
+
+  namespace import ::scrolledframe::scrolledframe
+
+  scrolledframe .sf -height 150 -width 100 \
+      -xscrollcommand {.hs set} -yscrollcommand {.vs set}  -fill both ;# try both, x, y or none
+  scrollbar .vs -command {.sf yview}
+  scrollbar .hs -command {.sf xview} -orient horizontal
+  grid .sf -row 0 -column 0 -sticky nsew
+  grid .vs -row 0 -column 1 -sticky ns
+  grid .hs -row 1 -column 0 -sticky ew
+  grid rowconfigure . 0 -weight 1
+  grid columnconfigure . 0 -weight 1
+  set f .sf.scrolled
+#  .sf configure -bg white
+
+  foreach i {0 1 2 3 4 5 6 7 8 9} \
+  {
+    label $f.l$i -text "Hi! I'm the scrolled label $i" -relief groove
+    pack $f.l$i -padx 10 -pady 2 -anchor nw -fill x
+  }
+  label $f.lf -text "Hi! I take up the slack!" -relief groove
+  pack  $f.lf -in $f -padx 10 -pady 2 -anchor nw -fill both -expand 1
+
+}
index b514194..29a2fa9 100644 (file)
@@ -1,39 +1,39 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2007-2008 - INRIA - Serge STEER <serge.steer@inria.fr>\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// <-- Non-regression test for bug 3263 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3263\r
-//\r
-// <-- Short Description -->\r
-// ludel(h) fails @ rev. 25935\r
-\r
-\r
-a=[0.2,0.6,0.6,0.2,0.3;\r
-0.8,0.8,0.7,0.2,0.9;\r
-0,0.7,0.7,0.2,0.2;\r
-0.3,0.9,0.2,0.9,0.3;\r
-0.7,0.1,0.5,0.7,0.4];\r
-\r
-b=[0.3;0.6;0.5;0.3;0.6];\r
-\r
-A=sparse(a);\r
-\r
-[h,rk]=lufact(A);\r
-\r
-x=lusolve(h,b);\r
-\r
-if norm(a*x-b)>1d-10 then pause,end\r
-\r
-[P,L,U,Q]=luget(h);\r
-\r
-if norm(P*L*U*Q-A)>1d-10 then pause,end\r
-\r
-ierr = execstr('ludel(h);','errcatch');\r
-if ierr <> 0 then pause,end;\r
-\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2007-2008 - INRIA - Serge STEER <serge.steer@inria.fr>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 3263 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3263
+//
+// <-- Short Description -->
+// ludel(h) fails @ rev. 25935
+
+
+a=[0.2,0.6,0.6,0.2,0.3;
+0.8,0.8,0.7,0.2,0.9;
+0,0.7,0.7,0.2,0.2;
+0.3,0.9,0.2,0.9,0.3;
+0.7,0.1,0.5,0.7,0.4];
+
+b=[0.3;0.6;0.5;0.3;0.6];
+
+A=sparse(a);
+
+[h,rk]=lufact(A);
+
+x=lusolve(h,b);
+
+if norm(a*x-b)>1d-10 then pause,end
+
+[P,L,U,Q]=luget(h);
+
+if norm(P*L*U*Q-A)>1d-10 then pause,end
+
+ierr = execstr('ludel(h);','errcatch');
+if ierr <> 0 then pause,end;
+
index 20f1ebb..5edb5db 100644 (file)
@@ -1,22 +1,22 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2008 - DIGITEO - Allan CORNET\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-\r
-// <-- Non-regression test for bug 3228 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3228\r
-//\r
-// <-- Short Description -->\r
-// ascii('é') returns a incorrect value\r
-\r
-\r
-if ascii('à') <> 224 then pause,end\r
-if ascii('ç') <> 231 then pause,end\r
-if ascii('è') <> 232 then pause,end\r
-if ascii('é') <> 233 then pause,end\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+
+// <-- Non-regression test for bug 3228 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3228
+//
+// <-- Short Description -->
+// ascii('é') returns a incorrect value
+
+
+if ascii('à') <> 224 then pause,end
+if ascii('ç') <> 231 then pause,end
+if ascii('è') <> 232 then pause,end
+if ascii('é') <> 233 then pause,end
 if ascii('ù') <> 249 then pause,end
\ No newline at end of file
index 778363d..0bb9c5c 100644 (file)
@@ -1,51 +1,51 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2008 - DIGITEO - Allan CORNET\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// <-- TEST WITH GRAPHIC -->\r
-\r
-// <-- Non-regression test for bug 3241 -->\r
-//\r
-// <-- Bugzilla URL -->\r
-// http://bugzilla.scilab.org/show_bug.cgi?id=3241\r
-//\r
-// <-- Short Description -->\r
-// length function does not work anymore with polynomials, boolean, integers.\r
-// in scilab 4 length(x) was similar to size(x) for these data types\r
-\r
-\r
-if length(%s) <> size(%s,'*') then pause,end\r
-if length(%t) <> size(%s,'*') then pause,end\r
-if length(int32(1)) <> size(int32(1),'*') then pause,end\r
-if length(int16(2)) <> size(int16(2),'*') then pause,end\r
-if length(int8(3)) <> size(int8(3),'*') then pause,end\r
-\r
-if length(%s) <> 1 then pause,end\r
-if length(%t) <> 1 then pause,end\r
-if length(int32(1)) <> 1 then pause,end\r
-if length(int16(2)) <> 1 then pause,end\r
-if length(int8(3)) <> 1 then pause,end\r
-\r
-if length([%s,%s,%s;%s,%s,%s]) <> size([%s,%s,%s;%s,%s,%s],'*') then pause,end\r
-if length([%t,%f,%t;%t,%f,%t]) <> size([%t,%f,%t;%t,%f,%t],'*') then pause,end\r
-if length([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)]) <> size([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)],'*') then pause,end\r
-if length([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)]) <> size([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)],'*') then pause,end\r
-if length([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)]) <> size([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)],'*')  then pause,end\r
-\r
-if length([%s,%s,%s;%s,%s,%s]) <> 6 then pause,end\r
-if length([%t,%f,%t;%t,%f,%t]) <> 6 then pause,end\r
-if length([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)]) <> 6 then pause,end\r
-if length([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)]) <> 6 then pause,end\r
-if length([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)]) <> 6 then pause,end\r
-\r
-s = scf();\r
-handle_Matrix = [s,s,s;s,s,s];\r
-if length(s) <> 1 then pause,end\r
-if length(s) <> size(s,'*') then pause,end\r
-\r
-if length(handle_Matrix) <> size(handle_Matrix,'*') then pause,end\r
-if length(handle_Matrix) <> 6 then pause,end\r
-delete(s);\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+
+// <-- Non-regression test for bug 3241 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3241
+//
+// <-- Short Description -->
+// length function does not work anymore with polynomials, boolean, integers.
+// in scilab 4 length(x) was similar to size(x) for these data types
+
+
+if length(%s) <> size(%s,'*') then pause,end
+if length(%t) <> size(%s,'*') then pause,end
+if length(int32(1)) <> size(int32(1),'*') then pause,end
+if length(int16(2)) <> size(int16(2),'*') then pause,end
+if length(int8(3)) <> size(int8(3),'*') then pause,end
+
+if length(%s) <> 1 then pause,end
+if length(%t) <> 1 then pause,end
+if length(int32(1)) <> 1 then pause,end
+if length(int16(2)) <> 1 then pause,end
+if length(int8(3)) <> 1 then pause,end
+
+if length([%s,%s,%s;%s,%s,%s]) <> size([%s,%s,%s;%s,%s,%s],'*') then pause,end
+if length([%t,%f,%t;%t,%f,%t]) <> size([%t,%f,%t;%t,%f,%t],'*') then pause,end
+if length([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)]) <> size([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)],'*') then pause,end
+if length([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)]) <> size([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)],'*') then pause,end
+if length([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)]) <> size([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)],'*')  then pause,end
+
+if length([%s,%s,%s;%s,%s,%s]) <> 6 then pause,end
+if length([%t,%f,%t;%t,%f,%t]) <> 6 then pause,end
+if length([int32(1),int32(2),int32(3);int32(1),int32(2),int32(3)]) <> 6 then pause,end
+if length([int16(1),int16(2),int16(3);int16(1),int16(2),int16(3)]) <> 6 then pause,end
+if length([int8(1),int8(2),int8(3);int8(1),int8(2),int8(3)]) <> 6 then pause,end
+
+s = scf();
+handle_Matrix = [s,s,s;s,s,s];
+if length(s) <> 1 then pause,end
+if length(s) <> size(s,'*') then pause,end
+
+if length(handle_Matrix) <> size(handle_Matrix,'*') then pause,end
+if length(handle_Matrix) <> 6 then pause,end
+delete(s);
index 33eba03..dfb927b 100644 (file)
@@ -1,17 +1,17 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2007-2008 - INRIA\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-// Comments about PCRE 7.6 see changelog PCRE\r
-//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns\r
-//  than the number used in the conditional) now cause a compile-time error.\r
-//  This is actually not compatible with Perl, which accepts such patterns, but\r
-//  treats the conditional as always being FALSE (as PCRE used to), but it\r
-//    seems to me that giving a diagnostic is better.\r
-if execstr("grep(''a'' ,''/(?(1)a|b)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("grep(''a'',''/(?(?{0})a|b)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("grep(''a'',''/(?(?{1})b|a)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("grep(''a'',''/(?(1)b|a)/'',''r'')","errcatch") <>  999  then pause,end\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2007-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// Comments about PCRE 7.6 see changelog PCRE
+//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
+//  than the number used in the conditional) now cause a compile-time error.
+//  This is actually not compatible with Perl, which accepts such patterns, but
+//  treats the conditional as always being FALSE (as PCRE used to), but it
+//    seems to me that giving a diagnostic is better.
+if execstr("grep(''a'' ,''/(?(1)a|b)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("grep(''a'',''/(?(?{0})a|b)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("grep(''a'',''/(?(?{1})b|a)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("grep(''a'',''/(?(1)b|a)/'',''r'')","errcatch") <>  999  then pause,end
index f513ff8..3b81501 100644 (file)
@@ -1,20 +1,20 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2007-2008 - INRIA\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-//===============================\r
-// unit tests regexp\r
-//===============================\r
-// Comments about PCRE 7.6 see changelog PCRE\r
-//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns\r
-//  than the number used in the conditional) now cause a compile-time error.\r
-//  This is actually not compatible with Perl, which accepts such patterns, but\r
-//  treats the conditional as always being FALSE (as PCRE used to), but it\r
-//    seems to me that giving a diagnostic is better.\r
-if execstr("regexp(''a'' ,''/(?(1)a|b)/'')","errcatch") <>  999  then pause,end\r
-if execstr("regexp(''a'',''/(?(?{0})a|b)/'')","errcatch") <>  999  then pause,end\r
-if execstr("regexp(''a'',''/(?(?{1})b|a)/'')","errcatch") <>  999  then pause,end\r
-if execstr("regexp(''a'',''/(?(1)b|a)/'')","errcatch") <>  999  then pause,end\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2007-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//===============================
+// unit tests regexp
+//===============================
+// Comments about PCRE 7.6 see changelog PCRE
+//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
+//  than the number used in the conditional) now cause a compile-time error.
+//  This is actually not compatible with Perl, which accepts such patterns, but
+//  treats the conditional as always being FALSE (as PCRE used to), but it
+//    seems to me that giving a diagnostic is better.
+if execstr("regexp(''a'' ,''/(?(1)a|b)/'')","errcatch") <>  999  then pause,end
+if execstr("regexp(''a'',''/(?(?{0})a|b)/'')","errcatch") <>  999  then pause,end
+if execstr("regexp(''a'',''/(?(?{1})b|a)/'')","errcatch") <>  999  then pause,end
+if execstr("regexp(''a'',''/(?(1)b|a)/'')","errcatch") <>  999  then pause,end
index cfb2808..96c0d61 100644 (file)
@@ -1,21 +1,21 @@
-// =============================================================================\r
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
-// Copyright (C) 2007-2008 - INRIA\r
-//\r
-//  This file is distributed under the same license as the Scilab package.\r
-// =============================================================================\r
-\r
-//===============================\r
-// unit tests strindex\r
-//===============================\r
-// Comments about PCRE 7.6 see changelog PCRE\r
-//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns\r
-//  than the number used in the conditional) now cause a compile-time error.\r
-//  This is actually not compatible with Perl, which accepts such patterns, but\r
-//  treats the conditional as always being FALSE (as PCRE used to), but it\r
-//    seems to me that giving a diagnostic is better.\r
-if execstr("strindex(''a'' ,''/(?(1)a|b)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("strindex(''a'',''/(?(?{0})a|b)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("strindex(''a'',''/(?(?{1})b|a)/'',''r'')","errcatch") <>  999  then pause,end\r
-if execstr("strindex(''a'',''/(?(1)b|a)/'',''r'')","errcatch") <>  999  then pause,end\r
-//========================================================================================\r
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2007-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//===============================
+// unit tests strindex
+//===============================
+// Comments about PCRE 7.6 see changelog PCRE
+//7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
+//  than the number used in the conditional) now cause a compile-time error.
+//  This is actually not compatible with Perl, which accepts such patterns, but
+//  treats the conditional as always being FALSE (as PCRE used to), but it
+//    seems to me that giving a diagnostic is better.
+if execstr("strindex(''a'' ,''/(?(1)a|b)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("strindex(''a'',''/(?(?{0})a|b)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("strindex(''a'',''/(?(?{1})b|a)/'',''r'')","errcatch") <>  999  then pause,end
+if execstr("strindex(''a'',''/(?(1)b|a)/'',''r'')","errcatch") <>  999  then pause,end
+//========================================================================================