From: <ro...@us...> - 2008-08-18 12:18:28
|
Revision: 1544 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1544&view=rev Author: ron-fox Date: 2008-08-18 12:18:37 +0000 (Mon, 18 Aug 2008) Log Message: ----------- Incorporate tkcon 2.4 see BZ 332 Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Scripts/tkcon.tcl Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-07-11 19:25:37 UTC (rev 1543) +++ trunk/SpecTcl/CHANGELOG 2008-08-18 12:18:37 UTC (rev 1544) @@ -801,4 +801,5 @@ July 11, 2008 - Gui/slice.tcl - re-init the browser on accepting a gate (reinit member) that restores the parameters used to the list. - Expose the treeview interface to clients of - Gui/browser.tcl \ No newline at end of file + Gui/browser.tcl +August 18, 2008 - Update to tkcon V2.4 \ No newline at end of file Modified: trunk/SpecTcl/Scripts/tkcon.tcl =================================================================== --- trunk/SpecTcl/Scripts/tkcon.tcl 2008-07-11 19:25:37 UTC (rev 1543) +++ trunk/SpecTcl/Scripts/tkcon.tcl 2008-08-18 12:18:37 UTC (rev 1544) @@ -1,6 +1,6 @@ -#!/usr/local/bin/wish -# -# exec test/SpecTcl "$0" ${1+"$@"} +#!/bin/sh +# \ +exec wish "$0" ${1+"$@"} # ## tkcon.tcl @@ -10,39 +10,40 @@ ## (from "Practical Programming in Tcl and Tk") ## ## Thanks to the following (among many) for early bug reports & code ideas: -## Steven Wahl <st...@in...>, Jan Nijtmans <nij...@ni...> -## Crimmins <mar...@um...>, Wart <wa...@ug...> +## Steven Wahl, Jan Nijtmans, Mark Crimmins, Wart ## -## Copyright 1995-1999 Jeffrey Hobbs +## Copyright (c) 1995-2004 Jeffrey Hobbs, jeff(a)hobbs(.)org ## Initiated: Thu Aug 17 15:36:47 PDT 1995 ## -## jef...@ac... -## ## source standard_disclaimer.tcl ## source bourbon_ware.tcl ## -## FIX NOTES - ideas on the block: -## can tkConSplitCmd be used for debugging? -## can return/error be overridden for debugging? - -# Butchered and eviscerated by R. Fox, but still pretty much -# the TclGuy's work. +# Proxy support for retrieving the current version of Tkcon. # +# Mon Jun 25 12:19:56 2001 - Pat Thoyts +# +# In your tkcon.cfg or .tkconrc file put your proxy details into the +# `proxy' member of the `PRIV' array. e.g.: +# +# set ::tkcon::PRIV(proxy) wwwproxy:8080 +# +# If you want to be prompted for proxy authentication details (eg for +# an NT proxy server) make the second element of this variable non-nil - eg: +# +# set ::tkcon::PRIV(proxy) {wwwproxy:8080 1} +# +# Or you can set the above variable from within tkcon by calling +# +# tkcon master set ::tkcon:PRIV(proxy) wwwproxy:8080 +# -if {$tcl_version>=8.0} { +if {$tcl_version < 8.0} { + return -code error "tkcon requires at least Tcl/Tk8" +} else { package require -exact Tk $tcl_version -} elseif {[catch {package require -exact Tk [expr {$tcl_version-3.4}]}]} { - return -code error "TkCon requires at least Tcl7.6/Tk4.2" } -# Set our appname to be SpecTcl_pid: -# - -set SpecTclAppname SpecTcl-[exec hostname]-[pid] -tk appname $SpecTclAppname - - catch {package require bogus-package-name} foreach pkg [info loaded {}] { set file [lindex $pkg 0] @@ -55,44 +56,74 @@ } catch {unset pkg file name version} -set TKCON(WWW) [info exists embed_args] +# Tk 8.4 makes previously exposed stuff private. +# FIX: Update tkcon to not rely on the private Tk code. +# +if {![llength [info globals tkPriv]]} { + ::tk::unsupported::ExposePrivateVariable tkPriv +} +foreach cmd {SetCursor UpDownLine Transpose ScrollPages} { + if {![llength [info commands tkText$cmd]]} { + ::tk::unsupported::ExposePrivateCommand tkText$cmd + } +} -## tkConInit - inits tkCon +# Initialize the ::tkcon namespace # -# Calls: tkConInitUI -# Outputs: errors found in tkCon resource file +namespace eval ::tkcon { + # when modifying this line, make sure that the auto-upgrade check + # for version still works. + variable VERSION "2.4" + # The OPT variable is an array containing most of the optional + # info to configure. COLOR has the color data. + variable OPT + variable COLOR + + # PRIV is used for internal data that only tkcon should fiddle with. + variable PRIV + set PRIV(WWW) [info exists embed_args] + + variable EXPECT 0 +} + +## ::tkcon::Init - inits tkcon +# +# Calls: ::tkcon::InitUI +# Outputs: errors found in tkcon's resource file ## -;proc tkConInit {} { - global auto_path tcl_platform env tcl_pkgPath \ - TKCON argc argv tcl_interactive errorInfo +proc ::tkcon::Init {args} { + variable VERSION + variable OPT + variable COLOR + variable PRIV + global tcl_platform env tcl_interactive errorInfo - if {![info exists argv]} { - set argv {} - set argc 0 - } - set tcl_interactive 1 + set argc [llength $args] - if {[info exists TKCON(name)]} { - set title $TKCON(name) - } else { - tkConMainInit - set title Main + ## + ## When setting up all the default values, we always check for + ## prior existence. This allows users who embed tkcon to modify + ## the initial state before tkcon initializes itself. + ## + + # bg == {} will get bg color from the main toplevel (in InitUI) + foreach {key default} { + bg {} + blink \#FFFF00 + cursor \#000000 + disabled \#4D4D4D + proc \#008800 + var \#FFC0D0 + prompt \#8F4433 + stdin \#000000 + stdout \#0000FF + stderr \#FF0000 + } { + if {![info exists COLOR($key)]} { set COLOR($key) $default } } - # get bg color from the main toplevel - array set TKCON { - color,bg {} - color,blink \#FFFF00 - color,cursor \#000000 - color,disabled \#4D4D4D - color,proc \#008800 - color,var \#FFC0D0 - color,prompt \#8F4433 - color,stdin \#000000 - color,stdout \#0000FF - color,stderr \#FF0000 - + foreach {key default} { autoload {} blinktime 500 blinkrange 1 @@ -101,6 +132,7 @@ cols 80 debugPrompt {(level \#$level) debug [history nextid] > } dead {} + edit edit expandorder {Pathname Variable Procname} font {} history 48 @@ -109,17 +141,28 @@ lightbrace 1 lightcmd 1 maineval {} - maxmenu 15 + maxmenu 18 nontcl 0 + prompt1 {ignore this, it's set below} rows 20 scrollypos right showmenu 1 showmultiple 1 + showstatusbar 1 slaveeval {} slaveexit close subhistory 1 + gc-delay 60000 + gets {congets} + overrideexit 1 + usehistory 1 exec slave + } { + if {![info exists OPT($key)]} { set OPT($key) $default } + } + + foreach {key default} { app {} appname {} apptype slave @@ -131,95 +174,127 @@ deadapp 0 deadsock 0 debugging 0 - gc-delay 60000 + displayWin . histid 0 find {} find,case 0 find,reg 0 errorInfo {} - slavealias { edit more less tkcon } + protocol exit + showOnStartup 1 slaveprocs { - alias dir dump echo idebug lremove - tkcon_puts tclindex observe observe_var unalias which what + alias clear dir dump echo idebug lremove + tkcon_puts tkcon_gets observe observe_var unalias which what } - version 1.6 - release {31 March 1999} - docs "http://www.purl.org/net/hobbs/tcl/script/tkcon/\nhttp://www.hobbs.wservice.com/tcl/script/tkcon/" - email {jef...@ac...} + RCS {RCS: @(#) $Id$} + HEADURL {http://cvs.sourceforge.net/viewcvs.py/*checkout*/tkcon/tkcon/tkcon.tcl?rev=HEAD} + + docs "http://tkcon.sourceforge.net/" + email {jeff(a)hobbs(.)org} root . + uid 0 + tabs {} + } { + if {![info exists PRIV($key)]} { set PRIV($key) $default } } - if {[info globals TKConsoleHistory] == "TKConsoleHistory"} { - global TKConsoleHistory - set TKCON(history) $TKConsoleHistory + foreach {key default} { + slavealias { $OPT(edit) more less tkcon } + } { + if {![info exists PRIV($key)]} { set PRIV($key) [subst $default] } } - if {[info globals TKConsoleBufferSize] == "TKConsoleBufferSize"} { - global TKConsoleBufferSize - set TKCON(buffer) $TKConsoleBufferSize + set PRIV(version) $VERSION + + option add *Menu.tearOff 0 + option add *takeFocus 0 + + if {[info exists PRIV(name)]} { + set title $PRIV(name) + } else { + MainInit + # some main initialization occurs later in this proc, + # to go after the UI init + set MainInit 1 + set title Main } + ## NOTES FOR STAYING IN PRIMARY INTERPRETER: - ## If you set TKCON(exec) to {}, then instead of a multiple interpreter - ## model, you get TkCon operating in the main interp by default. + ## + ## If you set ::tkcon::OPT(exec) to {}, then instead of a multiple + ## interp model, you get tkcon operating in the main interp by default. ## This can be useful when attaching to programs that like to operate ## in the main interpter (for example, based on special wish'es). ## You can set this from the command line with -exec "" ## A side effect is that all tkcon command line args will be used ## by the first console only. - set TKCON(exec) {} + set OPT(exec) {} - if {$TKCON(WWW)} { - lappend TKCON(slavealias) history - set TKCON(prompt1) {[history nextid] % } + if {$PRIV(WWW)} { + lappend PRIV(slavealias) history + set OPT(prompt1) {[history nextid] % } } else { - lappend TKCON(slaveprocs) tcl_unknown unknown - set TKCON(prompt1) {([file tail [pwd]]) [history nextid] % } + lappend PRIV(slaveprocs) tcl_unknown unknown + set OPT(prompt1) {([file tail [pwd]]) [history nextid] % } } - ## If there appear to be children of '.', then make sure we use - ## a disassociated toplevel. - if {[llength [winfo children .]]} { - set TKCON(root) .tkcon + ## If we are using the default '.' toplevel, and there appear to be + ## children of '.', then make sure we use a disassociated toplevel. + if {$PRIV(root) == "." && [llength [winfo children .]]} { + set PRIV(root) .tkcon } - ## Do platform specific configuration here + ## Do platform specific configuration here, other than defaults ### Use tkcon.cfg filename for resource filename on non-unix systems ### Determine what directory the resource file should be in - ### Windows could possibly use env(WINDIR) switch $tcl_platform(platform) { macintosh { - set envHome PREF_FOLDER - cd [file dirname [info script]] - set TKCON(rcfile) tkcon.cfg + if {![interp issafe]} {cd [file dirname [info script]]} + set envHome PREF_FOLDER + set rcfile tkcon.cfg + set histfile tkcon.hst + catch {console hide} } windows { - set envHome HOME - set TKCON(rcfile) tkcon.cfg + set envHome HOME + set rcfile tkcon.cfg + set histfile tkcon.hst } unix { - set envHome HOME - set TKCON(rcfile) .tkconrc + set envHome HOME + set rcfile .tkconrc + set histfile .tkcon_history } } if {[info exists env($envHome)]} { - set TKCON(rcfile) [file join $env($envHome) $TKCON(rcfile)] + set home $env($envHome) + if {[file pathtype $home] == "volumerelative"} { + # Convert 'C:' to 'C:/' if necessary, innocuous otherwise + append home / + } + if {![info exists PRIV(rcfile)]} { + set PRIV(rcfile) [file join $home $rcfile] + } + if {![info exists PRIV(histfile)]} { + set PRIV(histfile) [file join $home $histfile] + } } ## Handle command line arguments before sourcing resource file to ## find if resource file is being specified (let other args pass). - if {[set i [lsearch -exact $argv -rcfile]] != -1} { - set TKCON(rcfile) [lindex $argv [incr i]] + if {[set i [lsearch -exact $args -rcfile]] != -1} { + set PRIV(rcfile) [lindex $args [incr i]] } - if {!$TKCON(WWW) && [file exists $TKCON(rcfile)]} { - set code [catch [list uplevel \#0 source $TKCON(rcfile)] err] + if {!$PRIV(WWW) && [file exists $PRIV(rcfile)]} { + set code [catch {uplevel \#0 [list source $PRIV(rcfile)]} err] } if {[info exists env(TK_CON_LIBRARY)]} { - uplevel \#0 lappend auto_path $env(TK_CON_LIBRARY) - } else { - uplevel \#0 lappend auto_path $TKCON(library) + lappend ::auto_path $env(TK_CON_LIBRARY) + } elseif {$OPT(library) != ""} { + lappend ::auto_path $OPT(library) } - if {![info exists tcl_pkgPath]} { + if {![info exists ::tcl_pkgPath]} { set dir [file join [file dirname [info nameofexec]] lib] if {[llength [info commands @scope]]} { set dir [file join $dir itcl] @@ -234,24 +309,24 @@ set slavefiles {} set truth {^(1|yes|true|on)$} for {set i 0} {$i < $argc} {incr i} { - set arg [lindex $argv $i] + set arg [lindex $args $i] if {[string match {-*} $arg]} { - set val [lindex $argv [incr i]] + set val [lindex $args [incr i]] ## Handle arg based options switch -glob -- $arg { - -- - -argv { + -- - -argv - -args { set argv [concat -- [lrange $argv $i end]] set argc [llength $argv] break } - -color,* { set TKCON([string range $arg 1 end]) $val } - -exec { set TKCON(exec) $val } - -main - -e - -eval { append TKCON(maineval) \n$val\n } - -package - -load { lappend TKCON(autoload) $val } - -slave { append TKCON(slaveeval) \n$val\n } - -nontcl { set TKCON(nontcl) [regexp -nocase $truth $val] } - -root { set TKCON(root) $val } - -font { set TKCON(font) $val } + -color-* { set COLOR([string range $arg 7 end]) $val } + -exec { set OPT(exec) $val } + -main - -e - -eval { append OPT(maineval) \n$val\n } + -package - -load { lappend OPT(autoload) $val } + -slave { append OPT(slaveeval) \n$val\n } + -nontcl { set OPT(nontcl) [regexp -nocase $truth $val]} + -root { set PRIV(root) $val } + -font { set OPT(font) $val } -rcfile {} default { lappend slaveargs $arg; incr i -1 } } @@ -263,40 +338,57 @@ } ## Create slave executable - if {[string compare {} $TKCON(exec)]} { - uplevel \#0 tkConInitSlave $TKCON(exec) $slaveargs + if {"" != $OPT(exec)} { + uplevel \#0 ::tkcon::InitSlave $OPT(exec) $slaveargs } else { set argc [llength $slaveargs] - set argv $slaveargs + set args $slaveargs uplevel \#0 $slaveargs } - history keep $TKCON(history) - ## Attach to the slave, tkConEvalAttached will then be effective -# RFRFRF tkConAttach $TKCON(appname) $TKCON(apptype) - global SpecTclAppname + ## Attach to the slave, EvalAttached will then be effective + Attach $PRIV(appname) $PRIV(apptype) + InitUI $title + if {"" != $OPT(exec)} { + # override exit to DeleteTab now that tab has been created + $OPT(exec) alias exit ::tkcon::DeleteTab $PRIV(curtab) $OPT(exec) + } - tkConAttach $SpecTclAppname $TKCON(apptype) -# RFRFRF tkConInitUI $title - tkConInitUI $SpecTclAppname - ## swap puts and gets with the tkcon versions to make sure all ## input and output is handled by tkcon - if {![catch {rename puts tkcon_tcl_puts}]} { - interp alias {} puts {} tkcon_puts + if {![catch {rename ::puts ::tkcon_tcl_puts}]} { + interp alias {} ::puts {} ::tkcon_puts } - #if {![catch {rename gets tkcon_tcl_gets}]} { - #interp alias {} gets {} tkcon_gets - #} + if {($OPT(gets) != "") && ![catch {rename ::gets ::tkcon_tcl_gets}]} { + interp alias {} ::gets {} ::tkcon_gets + } + EvalSlave history keep $OPT(history) + if {[info exists MainInit]} { + # Source history file only for the main console, as all slave + # consoles will adopt from the main's history, but still + # keep separate histories + if {!$PRIV(WWW) && $OPT(usehistory) && [file exists $PRIV(histfile)]} { + puts -nonewline "loading history file ... " + # The history file is built to be loaded in and + # understood by tkcon + if {[catch {uplevel \#0 [list source $PRIV(histfile)]} herr]} { + puts stderr "error:\n$herr" + append PRIV(errorInfo) $errorInfo\n + } + set PRIV(event) [EvalSlave history nextid] + puts "[expr {$PRIV(event)-1}] events added" + } + } + ## Autoload specified packages in slave - set pkgs [tkConEvalSlave package names] - foreach pkg $TKCON(autoload) { + set pkgs [EvalSlave package names] + foreach pkg $OPT(autoload) { puts -nonewline "autoloading package \"$pkg\" ... " if {[lsearch -exact $pkgs $pkg]>-1} { - if {[catch {tkConEvalSlave package require [list $pkg]} pkgerr]} { + if {[catch {EvalSlave package require [list $pkg]} pkgerr]} { puts stderr "error:\n$pkgerr" - append TKCON(errorInfo) $errorInfo\n + append PRIV(errorInfo) $errorInfo\n } else { puts "OK" } } else { puts stderr "error: package does not exist" @@ -304,81 +396,94 @@ } ## Evaluate maineval in slave - if {[string compare {} $TKCON(maineval)] && \ - [catch {uplevel \#0 $TKCON(maineval)} merr]} { + if {[string compare {} $OPT(maineval)] && \ + [catch {uplevel \#0 $OPT(maineval)} merr]} { puts stderr "error in eval:\n$merr" - append TKCON(errorInfo) $errorInfo\n + append PRIV(errorInfo) $errorInfo\n } ## Source extra command line argument files into slave executable foreach fn $slavefiles { puts -nonewline "slave sourcing \"$fn\" ... " - if {[catch {tkConEvalSlave source [list $fn]} fnerr]} { + if {[catch {EvalSlave source [list $fn]} fnerr]} { puts stderr "error:\n$fnerr" - append TKCON(errorInfo) $errorInfo\n + append PRIV(errorInfo) $errorInfo\n } else { puts "OK" } } ## Evaluate slaveeval in slave - if {[string compare {} $TKCON(slaveeval)] && \ - [catch {interp eval $TKCON(exec) $TKCON(slaveeval)} serr]} { + if {[string compare {} $OPT(slaveeval)] && \ + [catch {interp eval $OPT(exec) $OPT(slaveeval)} serr]} { puts stderr "error in slave eval:\n$serr" - append TKCON(errorInfo) $errorInfo\n + append PRIV(errorInfo) $errorInfo\n } ## Output any error/output that may have been returned from rcfile if {[info exists code] && $code && [string compare {} $err]} { - puts stderr "error in $TKCON(rcfile):\n$err" - append TKCON(errorInfo) $errorInfo + puts stderr "error in $PRIV(rcfile):\n$err" + append PRIV(errorInfo) $errorInfo } - if {[string compare {} $TKCON(exec)]} { - tkConStateCheckpoint [concat $TKCON(name) $TKCON(exec)] slave + if {[string compare {} $OPT(exec)]} { + StateCheckpoint [concat $PRIV(name) $OPT(exec)] slave } - tkConStateCheckpoint $TKCON(name) slave + StateCheckpoint $PRIV(name) slave + + Prompt "$title console display active (Tcl$::tcl_patchLevel / Tk$::tk_patchLevel)\n" } -## tkConInitSlave - inits the slave by placing key procs and aliases in it +## ::tkcon::InitSlave - inits the slave by placing key procs and aliases in it ## It's arg[cv] are based on passed in options, while argv0 is the same as ## the master. tcl_interactive is the same as the master as well. # ARGS: slave - name of slave to init. If it does not exist, it is created. # args - args to pass to a slave as argv/argc ## -;proc tkConInitSlave {slave args} { - global TKCON argv0 tcl_interactive tcl_library env +proc ::tkcon::InitSlave {slave args} { + variable OPT + variable COLOR + variable PRIV + global argv0 tcl_interactive tcl_library env auto_path tk_library + if {[string match {} $slave]} { return -code error "Don't init the master interpreter, goofball" } if {![interp exists $slave]} { interp create $slave } if {[interp eval $slave info command source] == ""} { - $slave alias source tkConSafeSource $slave - $slave alias load tkConSafeLoad $slave - $slave alias open tkConSafeOpen $slave + $slave alias source SafeSource $slave + $slave alias load SafeLoad $slave + $slave alias open SafeOpen $slave $slave alias file file + interp eval $slave \ + [list set auto_path [lremove $auto_path $tk_library]] interp eval $slave [dump var -nocomplain tcl_library env] interp eval $slave { catch {source [file join $tcl_library init.tcl]} } interp eval $slave { catch unknown } } + # This will likely be overridden to call DeleteTab where possible $slave alias exit exit interp eval $slave { - catch {rename puts tkcon_tcl_puts} - #catch {rename gets tkcon_tcl_gets} + # Do package require before changing around puts/gets catch {package require bogus-package-name} + catch {rename ::puts ::tkcon_tcl_puts} } - foreach cmd $TKCON(slaveprocs) { $slave eval [dump proc $cmd] } - foreach cmd $TKCON(slavealias) { $slave alias $cmd $cmd } - interp alias $slave ls $slave dir -full - interp alias $slave puts $slave tkcon_puts - #interp alias $slave gets $slave tkcon_gets + foreach cmd $PRIV(slaveprocs) { $slave eval [dump proc $cmd] } + foreach cmd $PRIV(slavealias) { $slave alias $cmd $cmd } + interp alias $slave ::ls $slave ::dir -full + interp alias $slave ::puts $slave ::tkcon_puts + if {$OPT(gets) != ""} { + interp eval $slave { catch {rename ::gets ::tkcon_tcl_gets} } + interp alias $slave ::gets $slave ::tkcon_gets + } if {[info exists argv0]} {interp eval $slave [list set argv0 $argv0]} interp eval $slave set tcl_interactive $tcl_interactive \; \ + set auto_path [list [lremove $auto_path $tk_library]] \; \ set argc [llength $args] \; \ - set argv [list $args] \; history keep $TKCON(history) \; { + set argv [list $args] \; { if {![llength [info command bgerror]]} { - ;proc bgerror err { + proc bgerror err { global errorInfo set body [info body bgerror] - rename bgerror {} + rename ::bgerror {} if {[auto_load bgerror]} { return [bgerror $err] } - ;proc bgerror err $body + proc bgerror err $body tkcon bgerror $err $errorInfo } } @@ -392,215 +497,424 @@ } } -## tkConInitInterp - inits an interpreter by placing key +## ::tkcon::InitInterp - inits an interpreter by placing key ## procs and aliases in it. # ARGS: name - interp name # type - interp type (slave|interp) ## -;proc tkConInitInterp {name type} { - global TKCON +proc ::tkcon::InitInterp {name type} { + variable OPT + variable PRIV + ## Don't allow messing up a local master interpreter if {[string match namespace $type] || ([string match slave $type] && \ [regexp {^([Mm]ain|Slave[0-9]+)$} $name])} return - set old [tkConAttach] - if {$TKCON(A:version) >= 8.0} { set oldname $TKCON(namesp) } + set old [Attach] + set oldname $PRIV(namesp) catch { - tkConAttach $name $type - tkConEvalAttached { - catch {rename puts tkcon_tcl_puts} - #catch {rename gets tkcon_tcl_gets} - } - foreach cmd $TKCON(slaveprocs) { tkConEvalAttached [dump proc $cmd] } + Attach $name $type + EvalAttached { catch {rename ::puts ::tkcon_tcl_puts} } + foreach cmd $PRIV(slaveprocs) { EvalAttached [dump proc $cmd] } switch -exact $type { slave { - foreach cmd $TKCON(slavealias) { - tkConMain interp alias $name $cmd $TKCON(name) $cmd + foreach cmd $PRIV(slavealias) { + Main interp alias $name ::$cmd $PRIV(name) ::$cmd } } interp { - set thistkcon [tk appname] - foreach cmd $TKCON(slavealias) { - tkConEvalAttached "proc $cmd args { send [list $thistkcon] $cmd \$args }" + set thistkcon [::send::appname] + foreach cmd $PRIV(slavealias) { + EvalAttached "proc $cmd args { ::send::send [list $thistkcon] $cmd \$args }" } } } ## Catch in case it's a 7.4 (no 'interp alias') interp - tkConEvalAttached { - catch {interp alias {} ls {} dir -full} - if {[catch {interp alias {} puts {} tkcon_puts}]} { - catch {rename tkcon_puts puts} + EvalAttached { + catch {interp alias {} ::ls {} ::dir -full} + if {[catch {interp alias {} ::puts {} ::tkcon_puts}]} { + catch {rename ::tkcon_puts ::puts} } - #if {[catch {interp alias {} gets {} tkcon_gets}]} { - #catch {rename tkcon_gets gets} - #} } + if {$OPT(gets) != ""} { + EvalAttached { + catch {rename ::gets ::tkcon_tcl_gets} + if {[catch {interp alias {} ::gets {} ::tkcon_gets}]} { + catch {rename ::tkcon_gets ::gets} + } + } + } return } {err} - eval tkConAttach $old - if {$TKCON(A:version) >= 8.0} { tkConAttachNamespace $oldname } + eval Attach $old + AttachNamespace $oldname if {[string compare {} $err]} { return -code error $err } } -## tkConInitUI - inits UI portion (console) of tkCon +## ::tkcon::InitUI - inits UI portion (console) of tkcon ## Creates all elements of the console window and sets up the text tags -# ARGS: root - widget pathname of the tkCon console root +# ARGS: root - widget pathname of the tkcon console root # title - title for the console root and main (.) windows -# Calls: tkConInitMenus, tkConPrompt +# Calls: ::tkcon::InitMenus, ::tkcon::Prompt ## -;proc tkConInitUI {title} { - global TKCON +proc ::tkcon::InitUI {title} { + variable OPT + variable PRIV + variable COLOR - set root $TKCON(root) + set root $PRIV(root) if {[string match . $root]} { set w {} } else { set w [toplevel $root] } - catch {wm withdraw $root} - set TKCON(base) $w + if {!$PRIV(WWW)} { + wm withdraw $root + wm protocol $root WM_DELETE_WINDOW $PRIV(protocol) + } + set PRIV(base) $w - ## Text Console - set TKCON(console) [set con $w.text] - text $con -wrap char -yscrollcommand [list $w.sy set] \ - -foreground $TKCON(color,stdin) \ - -insertbackground $TKCON(color,cursor) - if {[string compare {} $TKCON(color,bg)]} { - $con configure -background $TKCON(color,bg) + catch {font create tkconfixed -family Courier -size -12} + catch {font create tkconfixedbold -family Courier -size -12 -weight bold} + + set PRIV(statusbar) [set sbar [frame $w.fstatus]] + set PRIV(tabframe) [frame $sbar.tabs] + set PRIV(X) [button $sbar.deltab -text "X" -command ::tkcon::DeleteTab \ + -activeforeground red -fg red -font tkconfixedbold \ + -highlightthickness 0 -padx 2 -pady 0 -bd 1 \ + -state disabled -relief flat] + catch {$PRIV(X) configure -overrelief raised} + label $sbar.cursor -relief sunken -bd 1 -anchor e -width 6 \ + -textvariable ::tkcon::PRIV(StatusCursor) + set padx [expr {![info exists ::tcl_platform(os)] + || ![string match "Windows CE" $::tcl_platform(os)]}] + grid $PRIV(X) $PRIV(tabframe) $sbar.cursor -sticky news -padx $padx + grid configure $PRIV(tabframe) -sticky nsw + grid configure $PRIV(X) -pady 0 -padx 0 + grid columnconfigure $sbar 1 -weight 1 + grid rowconfigure $sbar 0 -weight 1 + grid rowconfigure $PRIV(tabframe) 0 -weight 1 + if {$::tcl_version >= 8.4 && [tk windowingsystem] == "aqua"} { + # give space for the corner resize handle + grid columnconfigure $sbar [lindex [grid size $sbar] 0] -minsize 20 } - set TKCON(color,bg) [$con cget -background] - if {[string compare {} $TKCON(font)]} { + + ## Create console tab + set con [InitTab $w] + set PRIV(curtab) $con + + # Only apply this for the first console + $con configure -setgrid 1 -width $OPT(cols) -height $OPT(rows) + bind $PRIV(root) <Configure> { + if {"%W" == $::tkcon::PRIV(root)} { + scan [wm geometry [winfo toplevel %W]] "%%dx%%d" \ + ::tkcon::OPT(cols) ::tkcon::OPT(rows) + if {[info exists ::tkcon::EXP(spawn_id)]} { + catch {stty rows $::tkcon::OPT(rows) columns \ + $::tkcon::OPT(cols) < $::tkcon::EXP(slave,name)} + } + } + } + + # scrollbar + set sy [scrollbar $w.sy -takefocus 0 -bd 1 -command [list $con yview]] + if {!$PRIV(WWW) && [string match "Windows CE" $::tcl_platform(os)]} { + $w.sy configure -width 10 + } + + $con configure -yscrollcommand [list $sy set] + set PRIV(console) $con + set PRIV(scrolly) $sy + + ## Menus + ## catch against use in plugin + if {[catch {menu $w.mbar} PRIV(menubar)]} { + set PRIV(menubar) [frame $w.mbar -relief raised -bd 1] + } + + InitMenus $PRIV(menubar) $title + Bindings + + if {$OPT(showmenu)} { + $root configure -menu $PRIV(menubar) + } + + grid $con -row 1 -column 1 -sticky news + grid $sy -row 1 -column [expr {$OPT(scrollypos)=="left"?0:2}] -sticky ns + grid $sbar -row 2 -column 0 -columnspan 3 -sticky ew + + grid columnconfigure $root 1 -weight 1 + grid rowconfigure $root 1 -weight 1 + + if {!$OPT(showstatusbar)} { + grid remove $sbar + } + + if {!$PRIV(WWW)} { + wm title $root "tkcon $PRIV(version) $title" + if {$PRIV(showOnStartup)} { wm deiconify $root } + } + if {$PRIV(showOnStartup)} { focus -force $PRIV(console) } + if {$OPT(gc-delay)} { + after $OPT(gc-delay) ::tkcon::GarbageCollect + } +} + +proc ::tkcon::InitTab {w} { + variable OPT + variable PRIV + variable COLOR + variable ATTACH + + # text console + set con $w.tab[incr PRIV(uid)] + text $con -wrap char -foreground $COLOR(stdin) \ + -insertbackground $COLOR(cursor) + $con mark set output 1.0 + $con mark set limit 1.0 + if {[string compare {} $COLOR(bg)]} { + $con configure -background $COLOR(bg) + } + set COLOR(bg) [$con cget -background] + if {[string compare {} $OPT(font)]} { ## Set user-requested font, if any - $con configure -font $TKCON(font) - } elseif {[info tclversion] >= 8.0} { + $con configure -font $OPT(font) + } elseif {[string compare unix $::tcl_platform(platform)]} { ## otherwise make sure the font is monospace set font [$con cget -font] if {![font metrics $font -fixed]} { - font create tkconfixed -family Courier -size -12 $con configure -font tkconfixed } } else { - $con configure -font {*Courier*12*} + $con configure -font tkconfixed } - set TKCON(font) [$con cget -font] - if {!$TKCON(WWW)} { - $con configure -setgrid 1 -width $TKCON(cols) -height $TKCON(rows) - } - bindtags $con [list $con PreCon TkConsole PostCon $root all] - if {[info tclversion] >= 8.0} { - ## Menus - ## catch against use in plugin - if {[catch {menu $w.mbar} TKCON(menubar)]} { - set TKCON(menubar) [frame $w.mbar -relief raised -bd 1] + set OPT(font) [$con cget -font] + bindtags $con [list $con TkConsole TkConsolePost $PRIV(root) all] + + # scrollbar + if {!$PRIV(WWW)} { + if {[string match "Windows CE" $::tcl_platform(os)]} { + font configure tkconfixed -family Tahoma -size 8 + $con configure -font tkconfixed -bd 0 -padx 0 -pady 0 + set cw [font measure tkconfixed "0"] + set ch [font metrics tkconfixed -linespace] + set sw [winfo screenwidth $con] + set sh [winfo screenheight $con] + # We need the magic hard offsets until I find a way to + # correctly assume size + if {$cw*($OPT(cols)+2) > $sw} { + set OPT(cols) [expr {($sw / $cw) - 2}] + } + if {$ch*($OPT(rows)+3) > $sh} { + set OPT(rows) [expr {($sh / $ch) - 3}] + } + # Place it so that the titlebar underlaps the CE titlebar + wm geometry $PRIV(root) +0+0 } - } else { - set TKCON(menubar) [frame $w.mbar -relief raised -bd 1] } - ## Scrollbar - set TKCON(scrolly) [scrollbar $w.sy -takefocus 0 -bd 1 \ - -command [list $con yview]] + $con configure -height $OPT(rows) -width $OPT(cols) - tkConInitMenus $TKCON(menubar) $title - tkConBindings + foreach col {prompt stdout stderr stdin proc} { + $con tag configure $col -foreground $COLOR($col) + } + $con tag configure var -background $COLOR(var) + $con tag raise sel + $con tag configure blink -background $COLOR(blink) + $con tag configure find -background $COLOR(blink) - if {$TKCON(showmenu)} { - if {[info tclversion] >= 8.0} { - $root configure -menu $TKCON(menubar) - } else { - pack $TKCON(menubar) -fill x + set ATTACH($con) [Attach] + set rb [radiobutton $PRIV(tabframe).cb[winfo name $con] \ + -textvariable ::tkcon::ATTACH($con) \ + -selectcolor white -relief sunken \ + -indicatoron 0 -padx 0 -pady 0 -bd 1 \ + -variable ::tkcon::PRIV(curtab) -value $con \ + -command [list ::tkcon::GotoTab $con]] + if {$::tcl_version >= 8.4} { + $rb configure -offrelief flat -overrelief raised + } + grid $rb -row 0 -column [lindex [grid size $PRIV(tabframe)] 0] -sticky ns + grid $con -row 1 -column 1 -sticky news + + lappend PRIV(tabs) $con + return $con +} + +proc ::tkcon::GotoTab {con} { + variable PRIV + variable ATTACH + + set numtabs [llength $PRIV(tabs)] + #if {$numtabs == 1} { return } + + if {[regexp {^[0-9]+$} $con]} { + set curtab [lsearch -exact $PRIV(tabs) $PRIV(console)] + set nexttab [expr {$curtab + $con}] + if {$nexttab >= $numtabs} { + set nexttab 0 + } elseif {$nexttab < 0} { + set nexttab "end" } + set con [lindex $PRIV(tabs) $nexttab] + } elseif {$con == $PRIV(console)} { + return } - pack $w.sy -side $TKCON(scrollypos) -fill y - pack $con -fill both -expand 1 - tkConPrompt "$title console display active\n" + # adjust console + if {[winfo exists $PRIV(console)]} { + lower $PRIV(console) + $PRIV(console) configure -yscrollcommand {} + set ATTACH($PRIV(console)) [Attach] + } + set PRIV(console) $con + $con configure -yscrollcommand [list $PRIV(scrolly) set] + $PRIV(scrolly) configure -command [list $con yview] - foreach col {prompt stdout stderr stdin proc} { - $con tag configure $col -foreground $TKCON(color,$col) + # adjust attach + eval [linsert $ATTACH($con) 0 Attach] + + set PRIV(curtab) $con + + raise $con + + if {[$con compare 1.0 == end-1c]} { + Prompt } - $con tag configure var -background $TKCON(color,var) - $con tag configure blink -background $TKCON(color,blink) - $con tag configure find -background $TKCON(color,blink) - if {![catch {wm title $root "TkCon $TKCON(version) $title"}]} { - bind $con <Configure> { - scan [wm geometry [winfo toplevel %W]] "%%dx%%d" \ - TKCON(cols) TKCON(rows) - } + # set StatusCursor + set PRIV(StatusCursor) [$con index insert] + + focus -force $con +} + +proc ::tkcon::NewTab {{con {}}} { + variable PRIV + variable ATTACH + + set con [InitTab $PRIV(base)] + set slave [interp create Slave[GetSlaveNum]] + InitSlave $slave + $slave alias exit ::tkcon::DeleteTab $con $slave + set ATTACH($con) [list $slave slave] + $PRIV(X) configure -state normal + MenuConfigure Console "Delete Tab" -state normal + GotoTab $con +} + +proc ::tkcon::DeleteTab {{con {}} {slave {}}} { + variable PRIV + + set numtabs [llength $PRIV(tabs)] + if {$numtabs <= 2} { + $PRIV(X) configure -state disabled + MenuConfigure Console "Delete Tab" -state disabled } - catch {wm deiconify $root} - focus -force $TKCON(console) - if {$TKCON(gc-delay)} { - after $TKCON(gc-delay) tkConGarbageCollect + if {$numtabs == 1} { + # in the master, it should do the right thing + # currently the first master still exists - need rearch to fix + exit + # we might end up here, depending on how exit is rerouted + return } + + if {$con == ""} { + set con $PRIV(console) + } + catch {unset ATTACH($con)} + set curtab [lsearch -exact $PRIV(tabs) $con] + set PRIV(tabs) [lreplace $PRIV(tabs) $curtab $curtab] + + set numtabs [llength $PRIV(tabs)] + set nexttab $curtab + if {$nexttab >= $numtabs} { + set nexttab end + } + set nexttab [lindex $PRIV(tabs) $nexttab] + + GotoTab $nexttab + + if {$slave != "" && $slave != $::tkcon::OPT(exec)} { + interp delete $slave + } + destroy $PRIV(tabframe).cb[winfo name $con] + destroy $con } -## tkConGarbageCollect - do various cleanup ops periodically to our setup +## ::tkcon::GarbageCollect - do various cleanup ops periodically to our setup ## -;proc tkConGarbageCollect {} { - global TKCON - set w $TKCON(console) - ## Remove error tags that no longer span anything - ## Make sure the tag pattern matches the unique tag prefix - foreach tag [$w tag names] { - if {[string match _tag* $tag] && ![llength [$w tag ranges $tag]]} { - $w tag delete $tag +proc ::tkcon::GarbageCollect {} { + variable OPT + variable PRIV + + foreach w $PRIV(tabs) { + if {[winfo exists $w]} { + ## Remove error tags that no longer span anything + ## Make sure the tag pattern matches the unique tag prefix + foreach tag [$w tag names] { + if {[string match _tag* $tag] + && ![llength [$w tag ranges $tag]]} { + $w tag delete $tag + } + } } } - if {$TKCON(gc-delay)} { - after $TKCON(gc-delay) tkConGarbageCollect + if {$OPT(gc-delay)} { + after $OPT(gc-delay) ::tkcon::GarbageCollect } } -## tkConEval - evaluates commands input into console window +## ::tkcon::Eval - evaluates commands input into console window ## This is the first stage of the evaluating commands in the console. -## They need to be broken up into consituent commands (by tkConCmdSep) in +## They need to be broken up into consituent commands (by ::tkcon::CmdSep) in ## case a multiple commands were pasted in, then each is eval'ed (by -## tkConEvalCmd) in turn. Any uncompleted command will not be eval'ed. +## ::tkcon::EvalCmd) in turn. Any uncompleted command will not be eval'ed. # ARGS: w - console text widget -# Calls: tkConCmdGet, tkConCmdSep, tkConEvalCmd +# Calls: ::tkcon::CmdGet, ::tkcon::CmdSep, ::tkcon::EvalCmd ## -;proc tkConEval {w} { - set incomplete [tkConCmdSep [tkConCmdGet $w] cmds last] +proc ::tkcon::Eval {w} { + set incomplete [CmdSep [CmdGet $w] cmds last] $w mark set insert end-1c $w insert end \n if {[llength $cmds]} { - foreach c $cmds {tkConEvalCmd $w $c} + foreach c $cmds {EvalCmd $w $c} $w insert insert $last {} } elseif {!$incomplete} { - tkConEvalCmd $w $last + EvalCmd $w $last } - $w see insert + if {[winfo exists $w]} { + $w see insert + } } -## tkConEvalCmd - evaluates a single command, adding it to history +## ::tkcon::EvalCmd - evaluates a single command, adding it to history # ARGS: w - console text widget # cmd - the command to evaluate -# Calls: tkConPrompt +# Calls: ::tkcon::Prompt # Outputs: result of command to stdout (or stderr if error occured) # Returns: next event number ## -;proc tkConEvalCmd {w cmd} { - global TKCON +proc ::tkcon::EvalCmd {w cmd} { + variable OPT + variable PRIV + $w mark set output end if {[string compare {} $cmd]} { set code 0 - if {$TKCON(subhistory)} { - set ev [tkConEvalSlave history nextid] + if {$OPT(subhistory)} { + set ev [EvalSlave history nextid] incr ev -1 if {[string match !! $cmd]} { - set code [catch {tkConEvalSlave history event $ev} cmd] + set code [catch {EvalSlave history event $ev} cmd] if {!$code} {$w insert output $cmd\n stdin} } elseif {[regexp {^!(.+)$} $cmd dummy event]} { ## Check last event because history event is broken - set code [catch {tkConEvalSlave history event $ev} cmd] + set code [catch {EvalSlave history event $ev} cmd] if {!$code && ![string match ${event}* $cmd]} { - set code [catch {tkConEvalSlave history event $event} cmd] + set code [catch {EvalSlave history event $event} cmd] } if {!$code} {$w insert output $cmd\n stdin} } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $cmd dummy old new]} { - set code [catch {tkConEvalSlave history event $ev} cmd] + set code [catch {EvalSlave history event $ev} cmd] if {!$code} { regsub -all -- $old $cmd $new cmd $w insert output $cmd\n stdin } - } elseif {$TKCON(calcmode) && ![catch {expr $cmd} err]} { - tkConEvalSlave history add $cmd + } elseif {$OPT(calcmode) && ![catch {expr $cmd} err]} { + AddSlaveHistory $cmd set cmd $err set code -1 } @@ -613,33 +927,43 @@ ## evaluation of this command - for cases like the command ## has a vwait or something in it $w mark set limit end - if {$TKCON(nontcl) && [string match interp $TKCON(apptype)]} { - set code [catch "tkConEvalSend $cmd" res] + if {$OPT(nontcl) && [string match interp $PRIV(apptype)]} { + set code [catch {EvalSend $cmd} res] if {$code == 1} { - set TKCON(errorInfo) "Non-Tcl errorInfo not available" + set PRIV(errorInfo) "Non-Tcl errorInfo not available" } + } elseif {[string match socket $PRIV(apptype)]} { + set code [catch {EvalSocket $cmd} res] + if {$code == 1} { + set PRIV(errorInfo) "Socket-based errorInfo not available" + } } else { - set code [catch {tkConEvalAttached $cmd} res] + set code [catch {EvalAttached $cmd} res] if {$code == 1} { - if {[catch {tkConEvalAttached set errorInfo} err]} { - set TKCON(errorInfo) "Error getting errorInfo:\n$err" + if {[catch {EvalAttached [list set errorInfo]} err]} { + set PRIV(errorInfo) "Error getting errorInfo:\n$err" } else { - set TKCON(errorInfo) $err + set PRIV(errorInfo) $err } } } - tkConEvalSlave history add $cmd + if {![winfo exists $w]} { + # early abort - must be a deleted tab + return + } + AddSlaveHistory $cmd + catch {EvalAttached [list set _ $res]} if {$code} { - if {$TKCON(hoterrors)} { - set tag [tkConUniqueTag $w] + if {$OPT(hoterrors)} { + set tag [UniqueTag $w] $w insert output $res [list stderr $tag] \n stderr $w tag bind $tag <Enter> \ [list $w tag configure $tag -under 1] $w tag bind $tag <Leave> \ [list $w tag configure $tag -under 0] $w tag bind $tag <ButtonRelease-1> \ - "if {!\$tkPriv(mouseMoved)} \ - {[list edit -attach [tkConAttach] -type error -- $TKCON(errorInfo)]}" + "if {!\[info exists tkPriv(mouseMoved)\] || !\$tkPriv(mouseMoved)} \ + {[list $OPT(edit) -attach [Attach] -type error -- $PRIV(errorInfo)]}" } else { $w insert output $res\n stderr } @@ -648,139 +972,222 @@ } } } - tkConPrompt - set TKCON(event) [tkConEvalSlave history nextid] + Prompt + set PRIV(event) [EvalSlave history nextid] } -## tkConEvalSlave - evaluates the args in the associated slave +## ::tkcon::EvalSlave - evaluates the args in the associated slave ## args should be passed to this procedure like they would be at ## the command line (not like to 'eval'). # ARGS: args - the command and args to evaluate ## -;proc tkConEvalSlave args { - global TKCON - interp eval $TKCON(exec) $args +proc ::tkcon::EvalSlave args { + interp eval $::tkcon::OPT(exec) $args } -## tkConEvalOther - evaluate a command in a foreign interp or slave +## ::tkcon::EvalOther - evaluate a command in a foreign interp or slave ## without attaching to it. No check for existence is made. # ARGS: app - interp/slave name # type - (slave|interp) ## -;proc tkConEvalOther { app type args } { +proc ::tkcon::EvalOther { app type args } { if {[string compare slave $type]==0} { - return [tkConSlave $app $args] + return [Slave $app $args] } else { - return [uplevel 1 send [list $app] $args] + return [uplevel 1 ::send::send [list $app] $args] } } -## tkConEvalSend - sends the args to the attached interpreter +## ::tkcon::AddSlaveHistory - +## Command is added to history only if different from previous command. +## This also doesn't cause the history id to be incremented, although the +## command will be evaluated. +# ARGS: cmd - command to add +## +proc ::tkcon::AddSlaveHistory cmd { + set ev [EvalSlave history nextid] + incr ev -1 + set code [catch {EvalSlave history event $ev} lastCmd] + if {$code || [string compare $cmd $lastCmd]} { + EvalSlave history add $cmd + } +} + +## ::tkcon::EvalSend - sends the args to the attached interpreter ## Varies from 'send' by determining whether attachment is dead ## when an error is received -# ARGS: args - the args to send across +# ARGS: cmd - the command string to send across # Returns: the result of the command ## -;proc tkConEvalSend args { - global TKCON - if {$TKCON(deadapp)} { - if {[lsearch -exact [winfo interps] $TKCON(app)]<0} { +proc ::tkcon::EvalSend cmd { + variable OPT + variable PRIV + + if {$PRIV(deadapp)} { + if {[lsearch -exact [::send::interps] $PRIV(app)]<0} { return } else { - set TKCON(appname) [string range $TKCON(appname) 5 end] - set TKCON(deadapp) 0 - tkConPrompt "\n\"$TKCON(app)\" alive\n" \ - [tkConCmdGet $TKCON(console)] + set PRIV(appname) [string range $PRIV(appname) 5 end] + set PRIV(deadapp) 0 + Prompt "\n\"$PRIV(app)\" alive\n" [CmdGet $PRIV(console)] } } - set code [catch {uplevel 1 send [list $TKCON(app)] $args} result] - if {$code && [lsearch -exact [winfo interps] $TKCON(app)]<0} { + set code [catch {::send::send -displayof $PRIV(displayWin) $PRIV(app) $cmd} result] + if {$code && [lsearch -exact [::send::interps] $PRIV(app)]<0} { ## Interpreter disappeared - if {[string compare leave $TKCON(dead)] && \ - ([string match ignore $TKCON(dead)] || \ - [tk_dialog $TKCON(base).dead "Dead Attachment" \ - "\"$TKCON(app)\" appears to have died.\ - \nReturn to primary slave interpreter?" questhead 0 OK No])} { - set TKCON(appname) "DEAD:$TKCON(appname)" - set TKCON(deadapp) 1 + if {[string compare leave $OPT(dead)] && \ + ([string match ignore $OPT(dead)] || \ + [tk_messageBox -title "Dead Attachment" -type yesno \ + -icon info -message \ + "\"$PRIV(app)\" appears to have died.\ + \nReturn to primary slave interpreter?"]=="no")} { + set PRIV(appname) "DEAD:$PRIV(appname)" + set PRIV(deadapp) 1 } else { - set err "Attached Tk interpreter \"$TKCON(app)\" died." - tkConAttach {} - set TKCON(deadapp) 0 - tkConEvalSlave set errorInfo $err + set err "Attached Tk interpreter \"$PRIV(app)\" died." + Attach {} + set PRIV(deadapp) 0 + EvalSlave set errorInfo $err } - tkConPrompt \n [tkConCmdGet $TKCON(console)] + Prompt \n [CmdGet $PRIV(console)] } return -code $code $result } -## tkConEvalNamespace - evaluates the args in a particular namespace -## This is an override for tkConEvalAttached for when the user wants -## to attach to a particular namespace of the attached interp -# ARGS: attached -# namespace the namespace to evaluate in -# args the args to evaluate -# RETURNS: the result of the command +## ::tkcon::EvalSocket - sends the string to an interpreter attached via +## a tcp/ip socket ## -;proc tkConEvalNamespace { attached namespace args } { - global TKCON - if {[llength $args]} { - if {$TKCON(A:itcl2)} { - uplevel \#0 $attached namespace [list $namespace $args] +## In the EvalSocket case, ::tkcon::PRIV(app) is the socket id +## +## Must determine whether socket is dead when an error is received +# ARGS: cmd - the data string to send across +# Returns: the result of the command +## +proc ::tkcon::EvalSocket cmd { + variable OPT + variable PRIV + global tcl_version + + if {$PRIV(deadapp)} { + if {![info exists PRIV(app)] || \ + [catch {eof $PRIV(app)} eof] || $eof} { + return } else { - uplevel \#0 $attached namespace eval [list $namespace $args] + set PRIV(appname) [string range $PRIV(appname) 5 end] + set PRIV(deadapp) 0 + Prompt "\n\"$PRIV(app)\" alive\n" [CmdGet $PRIV(console)] } } + # Sockets get \'s interpreted, so that users can + # send things like \n\r or explicit hex values + set cmd [subst -novariables -nocommands $cmd] + #puts [list $PRIV(app) $cmd] + set code [catch {puts $PRIV(app) $cmd ; flush $PRIV(app)} result] + if {$code && [eof $PRIV(app)]} { + ## Interpreter died or disappeared + puts "$code eof [eof $PRIV(app)]" + EvalSocketClosed + } + return -code $code $result } +## ::tkcon::EvalSocketEvent - fileevent command for an interpreter attached +## via a tcp/ip socket +## Must determine whether socket is dead when an error is received +# ARGS: args - the args to send across +# Returns: the result of the command +## +proc ::tkcon::EvalSocketEvent {sock} { + variable PRIV -## tkConNamespaces - return all the namespaces descendent from $ns + if {[gets $sock line] == -1} { + if {[eof $sock]} { + EvalSocketClosed $sock + } + return + } + puts $line +} + +## ::tkcon::EvalSocketClosed - takes care of handling a closed eval socket ## -# +# ARGS: args - the args to send across +# Returns: the result of the command ## -;proc tkConNamespaces { {ns ::} } { - global TKCON - if {$TKCON(A:itcl2)} { - return [tkConNamespacesItcl $ns] +proc ::tkcon::EvalSocketClosed {sock} { + variable OPT + variable PRIV + + catch {close $sock} + if {![string match $sock $PRIV(app)]} { + # If we are not still attached to that socket, just return. + # Might be nice to tell the user the socket closed ... + return + } + if {[string compare leave $OPT(dead)] && \ + ([string match ignore $OPT(dead)] || \ + [tk_messageBox -title "Dead Attachment" -type yesno \ + -icon question \ + -message "\"$PRIV(app)\" appears to have died.\ + \nReturn to primary slave interpreter?"] == "no")} { + set PRIV(appname) "DEAD:$PRIV(appname)" + set PRIV(deadapp) 1 } else { - return [tkConNamespacesTcl8 $ns] + set err "Attached Tk interpreter \"$PRIV(app)\" died." + Attach {} + set PRIV(deadapp) 0 + EvalSlave set errorInfo $err } + Prompt \n [CmdGet $PRIV(console)] } -;proc tkConNamespacesTcl8 { ns {l {}} } { - if {[string compare {} $ns]} { lappend l $ns } - foreach i [tkConEvalAttached [list namespace children $ns]] { - set l [tkConNamespacesTcl8 $i $l] +## ::tkcon::EvalNamespace - evaluates the args in a particular namespace +## This is an override for ::tkcon::EvalAttached for when the user wants +## to attach to a particular namespace of the attached interp +# ARGS: attached +# namespace the namespace to evaluate in +# args the args to evaluate +# RETURNS: the result of the command +## +proc ::tkcon::EvalNamespace { attached namespace args } { + if {[llength $args]} { + uplevel \#0 $attached \ + [list [concat [list namespace eval $namespace] $args]] } - return $l } -;proc tkConNamespacesItcl { ns {l {}} } { + +## ::tkcon::Namespaces - return all the namespaces descendent from $ns +## +# +## +proc ::tkcon::Namespaces {{ns ::} {l {}}} { if {[string compare {} $ns]} { lappend l $ns } - set names [tkConEvalAttached [list info namespace children $ns]] - foreach i $names { set l [tkConNamespacesItcl $i $l] } + foreach i [EvalAttached [list namespace children $ns]] { + set l [Namespaces $i $l] + } return $l } -## tkConCmdGet - gets the current command from the console widget +## ::tkcon::CmdGet - gets the current command from the console widget # ARGS: w - console text widget # Returns: text which compromises current command line ## -;proc tkConCmdGet w { +proc ::tkcon::CmdGet w { if {![llength [$w tag nextrange prompt limit end]]} { $w tag add stdin limit end-1c return [$w get limit end-1c] } } -## tkConCmdSep - separates multiple commands into a list and remainder +## ::tkcon::CmdSep - separates multiple commands into a list and remainder # ARGS: cmd - (possible) multiple command to separate # list - varname for the list of commands that were separated. # last - varname of any remainder (like an incomplete final command). # If there is only one command, it's placed in this var. # Returns: constituent command info in varnames specified by list & rmd. ## -;proc tkConCmdSep {cmd list last} { +proc ::tkcon::CmdSep {cmd list last} { upvar 1 $list cmds $last inc set inc {} set cmds {} @@ -803,11 +1210,11 @@ return $i } -## tkConCmdSplit - splits multiple commands into a list +## ::tkcon::CmdSplit - splits multiple commands into a list # ARGS: cmd - (possible) multiple command to separate # Returns: constituent commands in a list ## -;proc tkConCmdSplit {cmd} { +proc ::tkcon::CmdSplit {cmd} { set inc {} set cmds {} foreach cmd [split [string trimleft $cmd] \n] { @@ -826,136 +1233,150 @@ return $cmds } -## tkConUniqueTag - creates a uniquely named tag, reusing names -## Called by tkConEvalCmd +## ::tkcon::UniqueTag - creates a uniquely named tag, reusing names +## Called by ::tkcon::EvalCmd # ARGS: w - text widget # Outputs: tag name guaranteed unique in the widget ## -;proc tkConUniqueTag {w} { +proc ::tkcon::UniqueTag {w} { set tags [$w tag names] set idx 0 while {[lsearch -exact $tags _tag[incr idx]] != -1} {} return _tag$idx } -## tkConConstrainBuffer - This limits the amount of data in the text widget -## Called by tkConPrompt and in tkcon proc buffer/console switch cases +## ::tkcon::ConstrainBuffer - This limits the amount of data in the text widget +## Called by ::tkcon::Prompt and in tkcon proc buffer/console switch cases # ARGS: w - console text widget # size - # of lines to constrain to # Outputs: may delete data in console widget ## -;proc tkConConstrainBuffer {w size} { +proc ::tkcon::ConstrainBuffer {w size} { if {[$w index end] > $size} { $w delete 1.0 [expr {int([$w index end])-$size}].0 } } -## tkConPrompt - displays the prompt in the console widget +## ::tkcon::Prompt - displays the prompt in the console widget # ARGS: w - console text widget -# Outputs: prompt (specified in TKCON(prompt1)) to console +# Outputs: prompt (specified in ::tkcon::OPT(prompt1)) to console ## -;proc tkConPrompt {{pre {}} {post {}} {prompt {}}} { - global TKCON - set w $TKCON(console) +proc ::tkcon::Prompt {{pre {}} {post {}} {prompt {}}} { + variable OPT + variable PRIV + + set w $PRIV(console) + if {![winfo exists $w]} { return } if {[string compare {} $pre]} { $w insert end $pre stdout } set i [$w index end-1c] - if {[string compare {} $TKCON(appname)]} { - $w insert end ">$TKCON(appname)< " prompt + if {!$OPT(showstatusbar)} { + if {[string compare {} $PRIV(appname)]} { + $w insert end ">$PRIV(appname)< " prompt + } + if {[string compare :: $PRIV(namesp)]} { + $w insert end "<$PRIV(namesp)> " prompt + } } - if {[string compare :: $TKCON(namesp)]} { - $w insert end "<$TKCON(namesp)> " prompt - } if {[string compare {} $prompt]} { $w insert end $prompt prompt } else { - $w insert end [tkConEvalSlave subst $TKCON(prompt1)] prompt + $w insert end [EvalSlave subst $OPT(prompt1)] prompt } $w mark set output $i $w mark set insert end $w mark set limit insert $w mark gravity limit left if {[string compare {} $post]} { $w insert end $post stdin } - tkConConstrainBuffer $w $TKCON(buffer) + ConstrainBuffer $w $OPT(buffer) + set ::tkcon::PRIV(StatusCursor) [$w index insert] $w see end } +proc ::tkcon::RePrompt {{pre {}} {post {}} {prompt {}}} { + # same as prompt, but does nothing for those actions where we + # only wanted to refresh the prompt on attach change when the + # statusbar is showing (which carries that info instead) + variable OPT + if {!$OPT(showstatusbar)} { + Prompt $pre $post $prompt + } +} -## tkConAbout - gives about info for tkCon +## ::tkcon::About - gives about info for tkcon ## -;proc tkConAbout {} { - global TKCON - set w $TKCON(base).about - if {[winfo exists $w]} { - wm deiconify $w - } else { - global tk_patchLevel tcl_patchLevel tcl_platform +proc ::tkcon::About {} { + variable OPT + variable PRIV + variable COLOR + + set w $PRIV(base).about + if {![winfo exists $w]} { + global tk_patchLevel tcl_patchLevel tcl_version toplevel $w - wm title $w "About TkCon v$TKCON(version)" + wm withdraw $w + wm transient $w $PRIV(root) + wm group $w $PRIV(root) + wm title $w "About tkcon v$PRIV(version)" button $w.b -text Dismiss -command [list wm withdraw $w] text $w.text -height 9 -bd 1 -width 60 \ - -foreground $TKCON(color,stdin) \ - -background $TKCON(color,bg) \ - -font $TKCON(font) + -foreground $COLOR(stdin) \ + -background $COLOR(bg) \ + -font $OPT(font) pack $w.b -fill x -side bottom pack $w.text -fill both -side left -expand 1 $w.text tag config center -justify center - if {[string compare unix $tcl_platform(platform)] \ - || [info tclversion] >= 8} { - $w.text tag config title -justify center -font {Courier -18 bold} - } else { - $w.text tag config title -justify center -font *Courier*Bold*18* - } - $w.text insert 1.0 "About TkCon v$TKCON(version)" title \ - "\n\nCopyright 1995-1999 Jeffrey Hobbs, $TKCON(email)\ - \nRelease Date: v$TKCON(version), $TKCON(release)\ - \nDocumentation available at:\n$TKCON(docs)\ + $w.text tag config title -justify center -font {Courier -18 bold} + # strip down the RCS info displayed in the about box + regexp {,v ([0-9\./: ]*)} $PRIV(RCS) -> RCS + $w.text insert 1.0 "About tkcon v$PRIV(version)" title \ + "\n\nCopyright 1995-2002 Jeffrey Hobbs, $PRIV(email)\ + \nRelease Info: v$PRIV(version), CVS v$RCS\ + \nDocumentation available at:\n$PRIV(docs)\ \nUsing: Tcl v$tcl_patchLevel / Tk v$tk_patchLevel" center $w.text config -state disabled + bind $w <Escape> [list destroy $w] } + wm deiconify $w } -## tkConInitMenus - inits the menubar and popup for the console +## ::tkcon::InitMenus - inits the menubar and popup for the console # ARGS: w - console text widget ## -;proc tkConInitMenus {w title} { - global TKCON tcl_platform +proc ::tkcon::InitMenus {w title} { + variable OPT + variable PRIV + variable COLOR + global tcl_platform - if {[catch {menu $w.pop -tearoff 0}]} { + if {[catch {menu $w.pop}]} { label $w.label -text "Menus not available in plugin mode" - pack $w.label + grid $w.label -sticky ew return } - menu $w.context -tearoff 0 -disabledforeground $TKCON(color,disabled) - set TKCON(context) $w.context - set TKCON(popup) $w.pop + menu $w.context -disabledforeground $COLOR(disabled) + set PRIV(context) $w.context + set PRIV(popup) $w.pop - if {[info tclversion] >= 8.0} { - proc tkConMenuButton {w m l} { - $w add cascade -label $m -underline 0 -menu $w.$l - return $w.$l - } - set x {} - } else { - proc tkConMenuButton {w m l} { - pack [menubutton $w.$l -text $m -underline 0 \ - -padx 6p -pady 6p -menu $w.$l.m] -side left - return $w.$l.m - } - set x .m + proc MenuButton {w m l} { + $w add cascade -label $m -underline 0 -menu $w.$l + return $w.$l } + proc MenuConfigure {m l args} { + variable PRIV + eval [list $PRIV(menubar).[string tolower $m] entryconfigure $l] $args + eval [list $PRIV(popup).[string tolower $m] entryconfigure $l] $args + } + foreach m [list File Console Edit Interp Prefs History Help] { set l [string tolower $m] - tkConMenuButton $w $m $l + MenuButton $w $m $l $w.pop add cascade -label $m -underline 0 -menu $w.pop.$l } - if {[info tclversion] < 8.0} { - pack $w.help -side right - } ## File Menu ## - foreach m [list [menu $w.file$x -disabledforeground $TKCON(color,disabled)] \ - [menu $w.pop.file -disabledforeground $TKCON(color,disabled)]] { - $m add command -label "Load File" -underline 0 -command tkConLoad + foreach m [list [menu $w.file -disabledforeground $COLOR(disabled)] \ + [menu $w.pop.file -disabledforeground $COLOR(disabled)]] { + $m add command -label "Load File" -underline 0 -command ::tkcon::Load $m add cascade -label "Save ..." -underline 0 -menu $m.save $m add separator $m add command -label "Quit" -underline 0 -accel Ctrl-q -command exit @@ -963,156 +1384,195 @@ ## Save Menu ## set s $m.save - menu $s -disabledforeground $TKCON(color,disabled) -tearoff 0 - $s add command -label "All" -und 0 -command {tkConSave {} all} - $s add command -label "History" -und 0 -command {tkConSave {} history} - $s add command -label "Stdin" -und 3 -command {tkConSave {} stdin} - $s add command -label "Stdout" -und 3 -command {tkConSave {} stdout} - $s add command -label "Stderr" -und 3 -command {tkConSave {} stderr} + menu $s -disabledforeground $COLOR(disabled) + $s add command -label "All" -underline 0 \ + -command {::tkcon::Save {} all} + $s add command -label "History" -underline 0 \ + -command {::tkcon::Save {} history} + $s add command -label "Stdin" -underline 3 \ + -command {::tkcon::Save {} stdin} + $s add command -label "Stdout" -underline 3 \ + -command {::tkcon::Save {} stdout} + $s add command -label "Stderr" -underline 3 \ + -command {::tkcon::Save {} stderr} } ## Console Menu ## - foreach m [list [menu $w.console$x -disabledfore $TKCON(color,disabled)] \ - [menu $w.pop.console -disabledfore $TKCON(color,disabled)]] { + foreach m [list [menu $w.console -disabledfore $COLOR(disabled)] \ + [menu $w.pop.console -disabledfore $COLOR(disabled)]] { $m add command -label "$title Console" -state disabled -# RF $m add command -la... [truncated message content] |
From: <ro...@us...> - 2008-09-15 12:27:44
|
Revision: 1545 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1545&view=rev Author: ron-fox Date: 2008-09-15 12:27:51 +0000 (Mon, 15 Sep 2008) Log Message: ----------- Opportunistic trimming of license comments. Modified Paths: -------------- trunk/SpecTcl/Events/BufferDecoder.h trunk/SpecTcl/TCL/TCLInterpreterObject.h Modified: trunk/SpecTcl/Events/BufferDecoder.h =================================================================== --- trunk/SpecTcl/Events/BufferDecoder.h 2008-08-18 12:18:37 UTC (rev 1544) +++ trunk/SpecTcl/Events/BufferDecoder.h 2008-09-15 12:27:51 UTC (rev 1545) @@ -1,284 +1,20 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your - freedom to share and change it. By contrast, the GNU General Public - License is intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users. This - General Public License applies to most of the Free Software - Foundation's software and to any other program whose authors commit to - using it. (Some other Free Software Foundation software is covered by - the GNU Library General Public License instead.) You can apply it to - your programs, too. - - When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it - in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether - gratis or for a fee, you must give the recipients all the rights that - you have. You must make sure that they, too, receive or can get the - source code. And you must show them these terms so they know their - rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, - distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain - that everyone understands that there is no warranty for this free - software. If the software is modified by someone else and passed on, we - want its recipients to know that what they have is not the original, so - that any problems introduced by others will not reflect on the original - authors' reputations. - - Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that redistributors of a free - program will individually obtain patent licenses, in effect making the - program proprietary. To prevent this, we have made it clear that any - patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and - modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains - a notice placed by the copyright holder saying it may be distributed - under the terms of this General Public License. The "Program", below, - refers to any such program or work, and a "work based on the Program" - means either the Program or any derivative work under copyright law: - that is to say, a work containing the Program or a portion of it, - either verbatim or with modifications and/or translated into another - language. (Hereinafter, translation is included without limitation in - the term "modification".) Each licensee is addressed as "you". - - Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of - running the Program is not restricted, and the output from the Program - is covered only if its contents constitute a work based on the - Program (independent of having been made by running the Program). - Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's - source code as you receive it, in any medium, provided that you - conspicuously and appropriately publish on each copy an appropriate - copyright notice and disclaimer of warranty; keep intact all the - notices that refer to this License and to the absence of any warranty; - and give any other recipients of the Program a copy of this License - along with the Program. - - You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion - of it, thus forming a work based on the Program, and copy and - distribute such modifications or work under the terms of Section 1 - above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - - These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Program, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Program, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote it. - - Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Program. - - In addition, mere aggregation of another work not based on the Program - with the Program (or with a work based on the Program) on a volume of - a storage or distribution medium does not bring the other work under - the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the terms of - Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - - The source code for a work means the preferred form of the work for - making modifications to it. For an executable work, complete source - code means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to - control compilation and installation of the executable. However, as a - special exception, the source code distributed need not include - anything that is normally distributed (in either source or binary - form) with the major components (compiler, kernel, and so on) of the - operating system on which the executable runs, unless that component - itself accompanies the executable. - - If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent - access to copy the source code from the same place counts as - distribution of the source code, even though third parties are not - compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense or distribute the Program is - void, and will automatically terminate your rights under this License. - However, parties who have received copies, or rights, from you under - this License will not have their licenses terminated so long as such - parties remain in full compliance. - - 5. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify or - distribute the Program or its derivative works. These actions are - prohibited by law if you do not accept this License. Therefore, by - modifying or distributing the Program (or any work based on the - Program), you indicate your acceptance of this License to do so, and - all its terms and conditions for copying, distributing or modifying - the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program subject to - these terms and conditions. You may not impose any further - restrictions on the recipients' exercise of the rights granted herein. - You are not responsible for enforcing compliance by third parties to - this License. - - 7. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent issues), - conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot - distribute so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you - may not distribute the Program at all. For example, if a patent - license would not permit royalty-free redistribution of the Program by - all those who receive copies directly or indirectly through you, then - the only way you could satisfy both it and this License would be to - refrain entirely from distribution of the Program. - - If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply and the section as a whole is intended to apply in other - circumstances. - - It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system, which is - implemented by public license practices. Many people have made - generous contributions to the wide range of software distributed - through that system in reliance on consistent application of that - system; it is up to the author/donor to decide if he or she is willing - to distribute software through any other system and a licensee cannot - impose that choice. - - This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted interfaces, the - original copyright holder who places the Program under this License - may add an explicit geographical distribution limitation excluding - those countries, so that distribution is permitted only in or among - countries not thus excluded. In such case, this License incorporates - the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the - General Public License from time to time. Such new versions will be similar - in spirit to the present version, but may differ in detail to address new - problems or concerns. - - Each version is given a distinguishing version number. If the Program - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and conditions - either of that version or of any later version published by the Free Software - Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to the author to - ask for permission. For software which is copyrighted by the Free Software - Foundation, write to the Free Software Foundation; we sometimes make - exceptions for this. Our decision will be guided by the two goals of - preserving the free status of all derivatives of our free software and of - promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR - THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN - OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE - THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, - YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR - REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, - INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING - OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO - LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR - THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), - EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // CBufferDecoder.h: // // This file defines the CBufferDecoder class. Modified: trunk/SpecTcl/TCL/TCLInterpreterObject.h =================================================================== --- trunk/SpecTcl/TCL/TCLInterpreterObject.h 2008-08-18 12:18:37 UTC (rev 1544) +++ trunk/SpecTcl/TCL/TCLInterpreterObject.h 2008-09-15 12:27:51 UTC (rev 1545) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // CTCLInterpreterObject.h: // // This file defines the CTCLInterpreterObject class. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-09-17 18:00:14
|
Revision: 1546 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1546&view=rev Author: ron-fox Date: 2008-09-17 18:00:23 +0000 (Wed, 17 Sep 2008) Log Message: ----------- Fix error in handling of RunState variable. Never got set "Inactive" on end file on data source. Modified Paths: -------------- trunk/SpecTcl/Events/NSCLBufferDecoder.h trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp Modified: trunk/SpecTcl/Events/NSCLBufferDecoder.h =================================================================== --- trunk/SpecTcl/Events/NSCLBufferDecoder.h 2008-09-15 12:27:51 UTC (rev 1545) +++ trunk/SpecTcl/Events/NSCLBufferDecoder.h 2008-09-17 18:00:23 UTC (rev 1546) @@ -1,283 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your - freedom to share and change it. By contrast, the GNU General Public - License is intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users. This - General Public License applies to most of the Free Software - Foundation's software and to any other program whose authors commit to - using it. (Some other Free Software Foundation software is covered by - the GNU Library General Public License instead.) You can apply it to - your programs, too. - - When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it - in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether - gratis or for a fee, you must give the recipients all the rights that - you have. You must make sure that they, too, receive or can get the - source code. And you must show them these terms so they know their - rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, - distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain - that everyone understands that there is no warranty for this free - software. If the software is modified by someone else and passed on, we - want its recipients to know that what they have is not the original, so - that any problems introduced by others will not reflect on the original - authors' reputations. - - Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that redistributors of a free - program will individually obtain patent licenses, in effect making the - program proprietary. To prevent this, we have made it clear that any - patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and - modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains - a notice placed by the copyright holder saying it may be distributed - under the terms of this General Public License. The "Program", below, - refers to any such program or work, and a "work based on the Program" - means either the Program or any derivative work under copyright law: - that is to say, a work containing the Program or a portion of it, - either verbatim or with modifications and/or translated into another - language. (Hereinafter, translation is included without limitation in - the term "modification".) Each licensee is addressed as "you". - - Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of - running the Program is not restricted, and the output from the Program - is covered only if its contents constitute a work based on the - Program (independent of having been made by running the Program). - Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's - source code as you receive it, in any medium, provided that you - conspicuously and appropriately publish on each copy an appropriate - copyright notice and disclaimer of warranty; keep intact all the - notices that refer to this License and to the absence of any warranty; - and give any other recipients of the Program a copy of this License - along with the Program. - - You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion - of it, thus forming a work based on the Program, and copy and - distribute such modifications or work under the terms of Section 1 - above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - - These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Program, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Program, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote it. - - Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Program. - - In addition, mere aggregation of another work not based on the Program - with the Program (or with a work based on the Program) on a volume of - a storage or distribution medium does not bring the other work under - the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the terms of - Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - - The source code for a work means the preferred form of the work for - making modifications to it. For an executable work, complete source - code means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to - control compilation and installation of the executable. However, as a - special exception, the source code distributed need not include - anything that is normally distributed (in either source or binary - form) with the major components (compiler, kernel, and so on) of the - operating system on which the executable runs, unless that component - itself accompanies the executable. - - If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent - access to copy the source code from the same place counts as - distribution of the source code, even though third parties are not - compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense or distribute the Program is - void, and will automatically terminate your rights under this License. - However, parties who have received copies, or rights, from you under - this License will not have their licenses terminated so long as such - parties remain in full compliance. - - 5. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify or - distribute the Program or its derivative works. These actions are - prohibited by law if you do not accept this License. Therefore, by - modifying or distributing the Program (or any work based on the - Program), you indicate your acceptance of this License to do so, and - all its terms and conditions for copying, distributing or modifying - the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program subject to - these terms and conditions. You may not impose any further - restrictions on the recipients' exercise of the rights granted herein. - You are not responsible for enforcing compliance by third parties to - this License. - - 7. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent issues), - conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot - distribute so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you - may not distribute the Program at all. For example, if a patent - license would not permit royalty-free redistribution of the Program by - all those who receive copies directly or indirectly through you, then - the only way you could satisfy both it and this License would be to - refrain entirely from distribution of the Program. - - If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply and the section as a whole is intended to apply in other - circumstances. - - It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system, which is - implemented by public license practices. Many people have made - generous contributions to the wide range of software distributed - through that system in reliance on consistent application of that - system; it is up to the author/donor to decide if he or she is willing - to distribute software through any other system and a licensee cannot - impose that choice. - - This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted interfaces, the - original copyright holder who places the Program under this License - may add an explicit geographical distribution limitation excluding - those countries, so that distribution is permitted only in or among - countries not thus excluded. In such case, this License incorporates - the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the - General Public License from time to time. Such new versions will be similar - in spirit to the present version, but may differ in detail to address new - problems or concerns. - - Each version is given a distinguishing version number. If the Program - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and conditions - either of that version or of any later version published by the Free Software - Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to the author to - ask for permission. For software which is copyrighted by the Free Software - Foundation, write to the Free Software Foundation; we sometimes make - exceptions for this. Our decision will be guided by the two goals of - preserving the free status of all derivatives of our free software and of - promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR - THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN - OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE - THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, - YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR - REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, - INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING - OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO - LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR - THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), - EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // CNSCLBufferDecoder.h: // // This file defines the CNSCLBufferDecoder class. @@ -289,7 +25,6 @@ // East Lansing, MI 48824-1321 // mailto:fo...@ns... // -// Copyright 1999 NSCL, All Rights Reserved. // ///////////////////////////////////////////////////////////// Modified: trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp =================================================================== --- trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp 2008-09-15 12:27:51 UTC (rev 1545) +++ trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp 2008-09-17 18:00:23 UTC (rev 1546) @@ -551,6 +551,7 @@ call the OnEventSourceEOF member for each event processing pipeline element. */ + void CTclAnalyzer::OnEndFile() { @@ -562,8 +563,12 @@ if (!pProcessor->OnEventSourceEOF()) break; p++; } + // Set the Run State to Halted: + + m_pRunState->Set("Halted"); // <-- Added this line } + /*! Assigns a unique name of the form Anonymous::n where n is an integer. This is used to assign unique names to EventProcessors the user has not named. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-09-17 19:53:15
|
Revision: 1549 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1549&view=rev Author: ron-fox Date: 2008-09-17 19:53:24 +0000 (Wed, 17 Sep 2008) Log Message: ----------- Add extensible factories template dir to the directory tree. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Makefile.am trunk/SpecTcl/configure.in Added Paths: ----------- trunk/SpecTcl/factories/ trunk/SpecTcl/factories/CCreator.h trunk/SpecTcl/factories/CExtensibleFactory.h trunk/SpecTcl/factories/Makefile.am Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-09-17 18:42:27 UTC (rev 1548) +++ trunk/SpecTcl/CHANGELOG 2008-09-17 19:53:24 UTC (rev 1549) @@ -807,3 +807,5 @@ - Fixed error in RunState handling.. Set it to "Inactive" on event source EOF. This is needed to support batchmode processing of e.g. filter files. + +Start on 3.3 Modified: trunk/SpecTcl/Makefile.am =================================================================== --- trunk/SpecTcl/Makefile.am 2008-09-17 18:42:27 UTC (rev 1548) +++ trunk/SpecTcl/Makefile.am 2008-09-17 19:53:24 UTC (rev 1549) @@ -1,4 +1,4 @@ -SUBDIRS = Replace Scripts Utility Display \ +SUBDIRS = Replace Scripts Utility factories Display \ NSCLException Xamine Tape EventSource \ TCL Events Gates Sorter SpectrumIO Filter Analysis TreeParam \ Fits SpecTcl \ Modified: trunk/SpecTcl/configure.in =================================================================== --- trunk/SpecTcl/configure.in 2008-09-17 18:42:27 UTC (rev 1548) +++ trunk/SpecTcl/configure.in 2008-09-17 19:53:24 UTC (rev 1549) @@ -4,7 +4,7 @@ AC_CONFIG_AUX_DIR(config) AM_CONFIG_HEADER(config.h) AC_CANONICAL_HOST -AM_INIT_AUTOMAKE(SpecTcl, 3.2-001) +AM_INIT_AUTOMAKE(SpecTcl, 3.3) AC_EXEEXT @@ -911,6 +911,7 @@ AC_OUTPUT(Makefile Replace/Makefile Scripts/Makefile Utility/Makefile \ + factories/Makefile \ Display/Makefile NSCLException/Makefile \ Xamine/Makefile Tape/Makefile \ EventSource/Makefile TCL/Makefile Events/Makefile Gates/Makefile \ Added: trunk/SpecTcl/factories/CCreator.h =================================================================== --- trunk/SpecTcl/factories/CCreator.h (rev 0) +++ trunk/SpecTcl/factories/CCreator.h 2008-09-17 19:53:24 UTC (rev 1549) @@ -0,0 +1,44 @@ +#ifndef __CCREATOR_H +#define __CCREATOR_H + +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __STL_STRING +#include <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif + +/*! + The abstract extensible factor pattern is widely enough used by +me to be worth a templated implementation. This class provides +the base class for the creators of these factories. +See the commens in CExtensibleFactory.h for information about how +to instantiate this pattern. +*/ + +template <class T> +class CCreator +{ +public: + virtual T* operator() = 0; + virtual std::string describe() const; +}; + + +#endif Added: trunk/SpecTcl/factories/CExtensibleFactory.h =================================================================== --- trunk/SpecTcl/factories/CExtensibleFactory.h (rev 0) +++ trunk/SpecTcl/factories/CExtensibleFactory.h 2008-09-17 19:53:24 UTC (rev 1549) @@ -0,0 +1,132 @@ +#ifndef __CEXTENISBLEFACTORY_H +#define __CEXTENSIBLEFACTORY_H + + +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __STL_STRING +#include <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif + +#ifndef __STL_MAP +#include <map> +#ifndef __STL_MAP +#define __STL_MAP +#endif +#endif + +/*! + This is an extensible factory pattern realized as a template class. + This allows a client to instantiate the factory for any class hierarchy. + Supose I have a class hierarchy with a base class named george. + I can create an instance of this class factory by defining the following typedefs: + +\verbatim + +typedef CCreator<george> CGeorgeCreator; +typedef CExtensibleFactory<george> CGeorgeFactory; + +\endverbatim + Next; for each subclass of george, I derive a creator from + CGeorgeCreator. The creator is just a virtual constructor and + generally looks like this: + +\verbatim + +george* +CGeorgeSubclassCreator::operator() { + return new CGeorgeSubClass; +} + +\endverbatim + + Having done all this, I need to generally wrap the + extensible factory into a singleton and arrange for the + factory to be populated with creators. Some of the creators + (standard creators) could be created/installed in the singleton's + getInstance method..here's more sample code: + +\verbatim + +class CGeorgeSingleton : public CGeorgeFactory { +private: + static CGeorgeSingleton* theInstance; +private: + CGeorgeSingleton(); +public: + CGeorgeSingleton* getInstance(); +}; + +static CGeorgeSingleton* CGeorgeSingleton::theInstance(0); + +CGeorgeSingleton* +CGeorgeSingleton::getInstance() +{ + if (!theInstance) { + theInstance = new CGeorgeSingleton; + theInstance.addCreator("subclass", new CGoergeSubclassCreator()); + } + return theInstance; +} + +\endverbatim + + +Then I can use the factory as follows: + + +\verbatim +.. +CGeorgeSingleton* pFactory = CGeorgeSingleton::getInstance(); +george* pGeorge = pFactory->create("subclass"); +if (!pGeorge) { +cerr << "No creator for " << "subclass" << endl; + +.. +\endverbatim +*/ + + +template <class T> +class CExtensibleFactory +{ +private: + typedef std::map<std::string, CCreator<T>* > CreatorMap; + typedef CreatorMap::iterator CreatorIterator; + CreatorMap m_creators; + +public: + void addCreator(std::string type, + CCreator<T>* pCreator) { + m_creators[type] = pCreator; + } + T* create(std::string type) { + CreatorIterator p = m_creators.find(type); + if (p == m_creators.end()) { + return reinterpret_cast<T*>(NULL); + } + else { + return p->second; + } + } + +}; + +#endif Added: trunk/SpecTcl/factories/Makefile.am =================================================================== --- trunk/SpecTcl/factories/Makefile.am (rev 0) +++ trunk/SpecTcl/factories/Makefile.am 2008-09-17 19:53:24 UTC (rev 1549) @@ -0,0 +1,8 @@ + + +EXTRA_DIST = CCreator.h \ + CExtensibleFactor.h + +install-exec-local: + install -d -m 0755 $(prefix)/include + install -m 0744 *.h $(prefix)/include \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-09-26 17:30:50
|
Revision: 1556 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1556&view=rev Author: ron-fox Date: 2008-09-26 17:30:43 +0000 (Fri, 26 Sep 2008) Log Message: ----------- - make fitgsl.c compatible with 4.4 compiler - Add capability to specify that data sources need not deliver full buffers for stream based decoders. - Add capability for buffer decoders to specify if they are stream or buffer based. - Make the data source open of a data source honor the decoder's specification of whether or not it should run in stream or block mode. - Make the Ring buffer decoder indicate it wil operate in stream mode. Modified Paths: -------------- trunk/SpecTcl/DecoderRing/CRingBufferDecoder.cpp trunk/SpecTcl/DecoderRing/CRingBufferDecoder.h trunk/SpecTcl/EventSource/DiskFile.h trunk/SpecTcl/EventSource/File.cpp trunk/SpecTcl/EventSource/File.h trunk/SpecTcl/EventSource/PipeFile.cpp trunk/SpecTcl/EventSource/PipeFile.h trunk/SpecTcl/EventSource/TestFile.cpp trunk/SpecTcl/EventSource/TestFile.h trunk/SpecTcl/Events/BufferDecoder.cpp trunk/SpecTcl/Events/BufferDecoder.h trunk/SpecTcl/Fits/fitgsl.c trunk/SpecTcl/SpecTcl/DataSourcePackage.cpp Modified: trunk/SpecTcl/DecoderRing/CRingBufferDecoder.cpp =================================================================== --- trunk/SpecTcl/DecoderRing/CRingBufferDecoder.cpp 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/DecoderRing/CRingBufferDecoder.cpp 2008-09-26 17:30:43 UTC (rev 1556) @@ -260,7 +260,19 @@ { return m_pTranslator; } +/*! + Returns false idicating that the data source is not going to be + necessarily providing fixed length data buffers. This is required to + ensure that SpecTcl does not block indefinitely on a read when + runs end due to them not ending on block boundaries. +*/ +bool +CRingBufferDecoder::blockMode() +{ + return false; +} + /////////////////////////////////////////////////////////////////// // // Non-public utility functions: Modified: trunk/SpecTcl/DecoderRing/CRingBufferDecoder.h =================================================================== --- trunk/SpecTcl/DecoderRing/CRingBufferDecoder.h 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/DecoderRing/CRingBufferDecoder.h 2008-09-26 17:30:43 UTC (rev 1556) @@ -106,6 +106,10 @@ virtual std::string getTitle(); virtual BufferTranslator* getBufferTranslator(); + virtual bool blockMode(); // True if data source must deliver fixed sized blocks. + + + private: void createTranslator(); void processBuffer(); Modified: trunk/SpecTcl/EventSource/DiskFile.h =================================================================== --- trunk/SpecTcl/EventSource/DiskFile.h 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/EventSource/DiskFile.h 2008-09-26 17:30:43 UTC (rev 1556) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // DiskFile.h: // This file defines the CDiskFile class. // This is essentially the CFile class using it's @@ -309,7 +48,8 @@ // CDiskFile() : CFile() {} - CDiskFile(UInt_t nFd) : CFile(nFd) {} + CDiskFile(UInt_t nFd, + bool fullblocks=true) : CFile(nFd, fullblocks) {} virtual ~CDiskFile() {} CDiskFile(const CDiskFile& rhs) : CFile(rhs) {} Modified: trunk/SpecTcl/EventSource/File.cpp =================================================================== --- trunk/SpecTcl/EventSource/File.cpp 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/EventSource/File.cpp 2008-09-26 17:30:43 UTC (rev 1556) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + static const char* Copyright = "(C) Copyright Michigan State University 2005, All rights reserved"; @@ -327,6 +66,34 @@ // Functions for class CFile +/*! + Default constructor initializes in the closed state with the fixed length + flag set true. The Open call can modify that. +*/ +CFile::CFile() : + m_nFd(0), + m_eState(kfsClosed), + m_fixedLength(true) +{ +} + +/*! + When constructing with an existing file descriptor; + - We are open. + - We need to specify the state of the fixedlength flag (defaults to true). + - If the fixed length flag is false, we need to set the fd in nonblocking mode. + \throw CErrnoException if the required fcntl's fail. +*/ +CFile::CFile(UInt_t nFd, bool fixedLength) : + m_nFd (nFd ), + m_eState (kfsOpen), + m_fixedLength(fixedLength) +{ + if (!m_fixedLength) { + disableBlocking(); + } +} + ////////////////////////////////////////////////////////////////////////// // // Function: @@ -385,7 +152,6 @@ // The I/O system buffering etc. may not let us do the read in one full gulp: - UInt_t nTotalRead(0); errno = 0; while(nTotalRead != nBytes) { @@ -397,12 +163,13 @@ char* p = (char*)pBuffer; p += nRead; pBuffer = (Address_t)p; + if (!m_fixedLength) break; // Non fixed length data source, we're done. } else if (nRead == 0) { break; // Next read gives the end file cond. } else { // Note in theory this is not possible. - throw CErrnoException("CPipeFile::Read - failed CFile::Read"); + throw CErrnoException("CFile::Read - failed CFile::Read"); } } nBuffers++; @@ -474,43 +241,48 @@ } m_nFd = nFd; m_eState = kfsOpen; // nFd is presumably open. + + // Set the fixedLength flag from the state of the fd flags: + + long flags = fcntl(m_nFd, F_GETFL); + if (flags == -1) { + throw CErrnoException("CFile::Open(UInt_t) fcntl F_GETFL failed"); + } + + // If the non blocking flag is set, we don't require fixed length block.s + + m_fixedLength = flags & O_NONBLOCK ? false : true; } -////////////////////////////////////////////////////////////////////////// -// -// Function: -// void Open ( std::string& rsFilename, UInt_t nAccess ) -// Operation Type: -// I/O connection -// +/*! + Connects the file object to a file. + If successful, the file state is set to + Open. If not, an exception is thrown. + + By default, the open() system service is + called. + + + \parm sFilename: + Name of file to open. + \param nAccess: + Bitwise or of the values: + - kacRead Read access + - kacWrite Write access + - kacCreate Create if needed. + - kacAppend Append before writes. + \param fullBlocks true if the data source is delivering fixed length data blocks. + + \throw CErrnoException if the open fails. + \note Files created are created with permissions + rw-r--r-- + \note If the file is already open, it is closed first. + +*/ + void -CFile::Open(const std::string& rsFilename, UInt_t nAccess) +CFile::Open(const std::string& rsFilename, UInt_t nAccess, bool fullBlocks) { -// Connects the file object to a file. -// If successful, the file state is set to -// Open. If not, an exception is thrown. -// -// By default, the open() system service is -// called. -// -// Formal Parameters: -// std::string& sFilename: -// Name of file to open. -// UInt_t nAccess: -// Bitwise or of the values: -// kacRead Read access -// kacWrite Write access -// kacCreate Create if needed. -// kacAppend Append before writes. -// -// Throws: -// CErrnoException if the open fails. -// NOTES: -// 1. -// Files created are created with permissions -// rw-r--r-- -// 2. -// If the file is already open, it is closed first. -// + int nReadWrite = kacRead | kacWrite; if(m_eState == kfsOpen) { @@ -541,6 +313,11 @@ else { m_eState = kfsOpen; m_nFd = (UInt_t)nFd; + + // If m_fixedLength is false, we need to turn off blocking: + + if (!m_fixedLength) disableBlocking(); + } } ////////////////////////////////////////////////////////////////////////// @@ -583,6 +360,9 @@ if(m_eState == kfsOpen) { m_nFd = dup(rFile.m_nFd); } + // dup preservers the O_NONBLOCK flag so: + + m_fixedLength = rFile.m_fixedLength; } /////////////////////////////////////////////////////////////////////////////// // @@ -641,3 +421,20 @@ // return (m_eState == kfsOpen); } +/* +** utility function to set the O_NONBLOCK flag in the +** file descriptor's flags. +*/ +void +CFile::disableBlocking() +{ + long flags = fcntl(m_nFd, F_GETFL); + if (flags == -1) { + throw CErrnoException("CFile::disableBlocking - failed fcntl F_GETFL"); + } + flags |= O_NONBLOCK; + if (fcntl(m_nFd, F_SETFL, flags) == -1) { + throw CErrnoException("CFile::disableBlocking - failed fcntl F_SETFL"); + } + m_fixedLength = false; // in case derived classes call this. +} Modified: trunk/SpecTcl/EventSource/File.h =================================================================== --- trunk/SpecTcl/EventSource/File.h 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/EventSource/File.h 2008-09-26 17:30:43 UTC (rev 1556) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // CFile.h: // // This file defines the CFile class. @@ -306,8 +45,9 @@ class CFile { - UInt_t m_nFd; // File descriptor open on the file. + UInt_t m_nFd; // File descriptor open on the file. FileState_t m_eState; // Current state of the file. + bool m_fixedLength; public: @@ -316,9 +56,11 @@ // constructor based on the name of a file. // - CFile () : m_nFd(0), m_eState(kfsClosed) { } // Default - CFile ( UInt_t am_nFd) // From fd. - : m_nFd (am_nFd), m_eState (kfsOpen) { } + CFile (); + CFile ( UInt_t am_nFd, + bool fixedLength=true); + // From fd. + virtual ~ CFile ( ) { if(m_eState == kfsOpen) Close(); @@ -367,7 +109,8 @@ virtual Int_t Read (Address_t pBuffer, UInt_t nSize) ; virtual Int_t Write (const Address_t pBuffer, UInt_t nBytes) ; - virtual void Open (const STD(string)& rsFilename, UInt_t nAccess) ; + virtual void Open (const STD(string)& rsFilename, UInt_t nAccess, + bool fullBlocks = true) ; virtual void Open(UInt_t nFd); virtual void Close () ; virtual Bool_t IsReadable(UInt_t nMs) const; @@ -377,7 +120,7 @@ protected: virtual void DoAssign(const CFile& rFile); void AssertOpen() const; - + void disableBlocking(); }; #endif Modified: trunk/SpecTcl/EventSource/PipeFile.cpp =================================================================== --- trunk/SpecTcl/EventSource/PipeFile.cpp 2008-09-26 12:07:30 UTC (rev 1555) +++ trunk/SpecTcl/EventSource/PipeFile.cpp 2008-09-26 17:30:43 UTC (rev 1556) @@ -1,279 +1,17 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that e... [truncated message content] |
From: <ro...@us...> - 2008-09-26 20:47:46
|
Revision: 1561 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1561&view=rev Author: ron-fox Date: 2008-09-26 20:47:35 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Integrate both the base and the superimposed spectrum. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Display/dispwind.h trunk/SpecTcl/Display/guintegrate.cc Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-09-26 19:29:29 UTC (rev 1560) +++ trunk/SpecTcl/CHANGELOG 2008-09-26 20:47:35 UTC (rev 1561) @@ -831,4 +831,6 @@ - Documented SpecTcl::addBufferDecoder. - Documented new behavior of the -format switch on the attach command. + - Xamine - integrate superimposed spectra as well + as base spectra. Modified: trunk/SpecTcl/Display/dispwind.h =================================================================== --- trunk/SpecTcl/Display/dispwind.h 2008-09-26 19:29:29 UTC (rev 1560) +++ trunk/SpecTcl/Display/dispwind.h 2008-09-26 20:47:35 UTC (rev 1561) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + /* ** Facility: ** Display spectrum window management subsystem. Modified: trunk/SpecTcl/Display/guintegrate.cc =================================================================== --- trunk/SpecTcl/Display/guintegrate.cc 2008-09-26 19:29:29 UTC (rev 1560) +++ trunk/SpecTcl/Display/guintegrate.cc 2008-09-26 20:47:35 UTC (rev 1561) @@ -61,6 +61,8 @@ #include "grobjmgr.h" #include "panemgr.h" #include "mapcoord.h" +#include "superpos.h" + /* ** Constants: */ @@ -109,6 +111,17 @@ static IntegrationDisplay *dialog = NULL; +/* + Add text and, if needed log, to the integration display: +*/ +static void addAndLog(IntegrationDisplay* d, char* pText) +{ + d->AddText(pText); + if(Xamine_logging) { + Xamine_log.LogMessage(pText); + } +} + /* ** Functional Description: @@ -217,10 +230,8 @@ g->getid(), g->getname(n), centroid, fwhm, area); - d->AddText(txt); /* Add to the dialog. */ - if(Xamine_logging) { - Xamine_log.ContinueMessage(txt); - } + addAndLog(d, txt); + } /* @@ -260,13 +271,8 @@ /* Add the line to the dialog: */ - d->AddText(txt); + addAndLog(d, txt); - /* If logging is on then also log: */ - - if(Xamine_logging) { - Xamine_log.ContinueMessage(txt); - } } /* @@ -373,6 +379,7 @@ return; } } + /* ** Functional Description: @@ -404,11 +411,10 @@ int nobjects = Xamine_GetSpectrumObjectCount(specno); int ngates = Xamine_GetSpectrumGateCount(specno); int nints; - if(att->is1d()) - nints = nobjects+ngates; - else - nints = nobjects+ngates; + nints = nobjects+ngates; + + if(nints == 0) { return; } @@ -424,11 +430,10 @@ spname, " Id Name Centroid FWHM Area\n", "Summing regions: \n"); - if(Xamine_logging) { - Xamine_log.LogMessage(buffer); - } - d->AddText(buffer); + addAndLog(d, buffer); + + // grobj_generic *objects[GROBJ_MAXOBJECTS]; if(nobjects > 0) { @@ -442,41 +447,98 @@ for( i = 0; i < nobjects; i++) { if( (objects[i]->type() == summing_region_1d) || (objects[i]->type() == summing_region_2d)) { - Integrate(dialog, objects[i], specno, spectype); + Integrate(d, objects[i], specno, spectype); } } + + delete []objects; } - nobjects = Xamine_GetSpectrumGateCount(specno); - if(nobjects > 0) { - grobj_generic** objects = new grobj_generic*[nobjects]; - Xamine_GetSpectrumGates(specno, objects, nobjects, True); + if(ngates > 0) { + grobj_generic** objects = new grobj_generic*[ngates]; + Xamine_GetSpectrumGates(specno, objects, ngates, True); grobj_type matching; if(!att->is1d()) { sprintf(buffer,"Contours:\n"); - if(Xamine_logging) - Xamine_log.LogMessage(buffer); - d->AddText(buffer); + addAndLog(d, buffer); matching = contour_2d; } else { sprintf(buffer, "Cuts: \n"); - if(Xamine_logging) - Xamine_log.LogMessage(buffer); - d->AddText(buffer); + addAndLog(d, buffer); matching = cut_1d; } - for(int i = 0; i < nobjects; i++) { + for(int i = 0; i < ngates; i++) { if(objects[i]->type() == matching) { - Integrate(dialog, objects[i], specno, spectype); + Integrate(d, objects[i], specno, spectype); } } delete []objects; } + // If the spectrum is 1-d we should also do the superpositions. + // this gets done by re-getting the objects cloning them and applying + // them to the superimposed spectra. We don't attempt to figure out + // the grobjs defined on the superpositions as they aren't even being + // displayed. + + if (att->is1d()) { + win_1d* att1 = reinterpret_cast<win_1d*>(att); + SuperpositionList& superimposed(att1->GetSuperpositions()); + if (superimposed.Count() == 0) return; // nothing superimposed. + + SuperpositionListIterator sp(superimposed); + addAndLog(d, "Superpositions:\n"); + + grobj_generic** objects = new grobj_generic*[nobjects]; + grobj_generic** gates = new grobj_generic*[ngates]; + + Xamine_GetSpectrumObjects(specno, objects, nobjects, True); + Xamine_GetSpectrumGates(specno, gates, ngates, True); + + while(!sp.Last()) { + Superposition super(sp.Next()); + int spectrum = super.Spectrum(); + xamine_shared->getname(spname, spectrum); + sprintf(buffer, + " Integrations for spectrum %s (Superposition)\n\n%s%s", + spname, + " Id Name Centroid FWHM Area\n", + "Summing regions: \n"); + + addAndLog(d, buffer); + + // Summing regions note that only 1-ds can have superpositions... + + for (int i=0; i < nobjects; i++) { + if ((objects[i]->type() == summing_region_1d)) { + grobj_generic* copy = objects[i]->clone(); + copy->setspectrum(spectrum); + Integrate(d, copy, spectrum, xamine_shared->gettype(spectrum)); + delete copy; + } + } + // cuts: + + addAndLog(d, "Cuts\n"); + + for (int i=0; i < ngates; i++) { + if ((gates[i]->type() == cut_1d)) { + grobj_generic* copy = gates[i]->clone(); + copy->setspectrum(spectrum); + Integrate(d, copy, spectrum, xamine_shared->gettype(spectrum)); + delete copy; + } + } + // Delete the copies of the objects and spectra: + } + delete []objects; + delete []gates; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-10-02 17:52:16
|
Revision: 1564 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1564&view=rev Author: ron-fox Date: 2008-10-02 17:52:12 +0000 (Thu, 02 Oct 2008) Log Message: ----------- Correctly deal with the fact that the first buffer in a run is sequence number 0 so the value of buffersAnalyzed must be 0 when that's seen, rather than 1.. that's why we show more than 100% buffers analyzed. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-10-02 17:32:57 UTC (rev 1563) +++ trunk/SpecTcl/CHANGELOG 2008-10-02 17:52:12 UTC (rev 1564) @@ -836,5 +836,8 @@ October 2, 2008 - Add ungate context menu option to new GUI. - Don't write applications if the gate is -Ungated- (spectrum was ungated). + - Correct the count of buffers analyzed to account for the + fact that the first buffer is sequence 0 so we need + the first buffer to increment our buffers analyzed -> 0. Modified: trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp =================================================================== --- trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp 2008-10-02 17:32:57 UTC (rev 1563) +++ trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp 2008-10-02 17:52:12 UTC (rev 1564) @@ -77,7 +77,7 @@ m_pBuffersAnalyzed = new CTCLVariable(&rInterp, string("BuffersAnalyzed"), kfFALSE); - ClearVariable(*m_pBuffersAnalyzed); + SetVariable(*m_pBuffersAnalyzed,-1); m_pLastSequence = new CTCLVariable(&rInterp, string("LastSequence"), @@ -233,7 +233,7 @@ 7. Clear the appropriate set of counters. */ void CTclAnalyzer::OnBegin(CBufferDecoder* pDecoder) { - ClearVariable(*m_pBuffersAnalyzed); + SetVariable(*m_pBuffersAnalyzed, -1); ClearVariable(*m_pLastSequence); m_pRunState->Set("Active"); SetVariable(*m_pRunNumber, pDecoder->getRun()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-09-26 12:07:43
|
Revision: 1555 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1555&view=rev Author: ron-fox Date: 2008-09-26 12:07:30 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Fix typo to ensure generic factory headers get in the distro. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/factories/Makefile.am Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-09-19 21:00:22 UTC (rev 1554) +++ trunk/SpecTcl/CHANGELOG 2008-09-26 12:07:30 UTC (rev 1555) @@ -818,4 +818,7 @@ are extensible. September 18, 2008 - Registered default decoders with DataSourcePackage +September 22, 2008 + - Added CRingBufferDecoder support so that ring buffer + data can be decoded. Modified: trunk/SpecTcl/factories/Makefile.am =================================================================== --- trunk/SpecTcl/factories/Makefile.am 2008-09-19 21:00:22 UTC (rev 1554) +++ trunk/SpecTcl/factories/Makefile.am 2008-09-26 12:07:30 UTC (rev 1555) @@ -1,7 +1,7 @@ EXTRA_DIST = CCreator.h \ - CExtensibleFactor.h + CExtensibleFactory.h install-exec-local: install -d -m 0755 $(prefix)/include This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-10-02 17:33:00
|
Revision: 1563 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1563&view=rev Author: ron-fox Date: 2008-10-02 17:32:57 +0000 (Thu, 02 Oct 2008) Log Message: ----------- - Add ungate option to the SpecTcl gui. - Don't write applies for spectra gated on "-Ungated-" which means the spectrum was most recently ungated. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Gui/guistate.tcl trunk/SpecTcl/Gui/newGui.tcl Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2008-09-26 21:29:08 UTC (rev 1562) +++ trunk/SpecTcl/CHANGELOG 2008-10-02 17:32:57 UTC (rev 1563) @@ -833,4 +833,8 @@ attach command. - Xamine - integrate superimposed spectra as well as base spectra. +October 2, 2008 - Add ungate context menu option to new GUI. + - Don't write applications if the gate is -Ungated- + (spectrum was ungated). + Modified: trunk/SpecTcl/Gui/guistate.tcl =================================================================== --- trunk/SpecTcl/Gui/guistate.tcl 2008-09-26 21:29:08 UTC (rev 1562) +++ trunk/SpecTcl/Gui/guistate.tcl 2008-10-02 17:32:57 UTC (rev 1563) @@ -533,7 +533,7 @@ set gate [lindex $application 1] set gatename [lindex $gate 0] # ungated spectra are actually gated on -TRUE- - if {$gatename != "-TRUE-"} { + if {$gatename != "-TRUE-" && $gatename != "-Ungated-"} { puts $fd "apply [list $gatename] [list $spectrum]" } } Modified: trunk/SpecTcl/Gui/newGui.tcl =================================================================== --- trunk/SpecTcl/Gui/newGui.tcl 2008-09-26 21:29:08 UTC (rev 1562) +++ trunk/SpecTcl/Gui/newGui.tcl 2008-10-02 17:32:57 UTC (rev 1563) @@ -62,9 +62,24 @@ - #--------------- Utility functions ------------------------- +# unGate spectrum +# Removes a gate that's applied to a spectrum. The browser +# is then updated to reflect the new state. +# +# Parameters: +# spectrum - name of the spectrum to ungatge. +# Implicit: +# .gui.b - Browser widget path. +# +proc unGate spectrum { + ungate $spectrum + .gui.b update + failsafeWrite + +} + # displayScriptErrors filename errors # Displays the errors associated with sourcing a file. # The errors are displayed in a non-modal dialog named @@ -644,6 +659,7 @@ $men add command -label {Edit...} $men add command -label {Clear} $men add command -label {Gate...} + $men add command -label {UnGate} $men add separator $men add command -label {Write...} $men add separator @@ -764,10 +780,11 @@ .spectrumcontextmenu entryconfigure 0 -command [list editSpectrum $path] .spectrumcontextmenu entryconfigure 1 -command [list clear $name] .spectrumcontextmenu entryconfigure 2 -command [list applyGate $name] + .spectrumcontextmenu entryconfigure 3 -command [list unGate $name] - .spectrumcontextmenu entryconfigure 4 -command [list writeSpectrum $name] + .spectrumcontextmenu entryconfigure 5 -command [list writeSpectrum $name] - .spectrumcontextmenu entryconfigure 6 -command [list deleteSpectrum $name] + .spectrumcontextmenu entryconfigure 7 -command [list deleteSpectrum $name] tk_popup .spectrumcontextmenu $x $y } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-12-30 21:25:59
|
Revision: 1574 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1574&view=rev Author: ron-fox Date: 2008-12-30 21:25:55 +0000 (Tue, 30 Dec 2008) Log Message: ----------- - Good compiles on base part of gamma summary spectrum addition. - Opportunistic comment header trimming. Modified Paths: -------------- trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp trunk/SpecTcl/SpectrumIO/NSCLAsciiSpectrumFormatter.cpp trunk/SpecTcl/TCL/TCLList.h Modified: trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp =================================================================== --- trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp 2008-12-30 21:25:16 UTC (rev 1573) +++ trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp 2008-12-30 21:25:55 UTC (rev 1574) @@ -123,9 +123,14 @@ nYChannels, fYLow, fYHigh); } - /*! + Destructor is here for chaining: +*/ +template <class T> +CGammaSummarySpectrum<T>::~CGammaSummarySpectrum() {} + +/*! Increment the spectrum. Iterating through each x channel and its associated axis mapping, treat that x channel strip as a 1-d spectrum and increment it. Modified: trunk/SpecTcl/SpectrumIO/NSCLAsciiSpectrumFormatter.cpp =================================================================== --- trunk/SpecTcl/SpectrumIO/NSCLAsciiSpectrumFormatter.cpp 2008-12-30 21:25:16 UTC (rev 1573) +++ trunk/SpecTcl/SpectrumIO/NSCLAsciiSpectrumFormatter.cpp 2008-12-30 21:25:55 UTC (rev 1574) @@ -44,55 +44,9 @@ // // //////////////////////////.cpp file///////////////////////////////////////////////////// -/* - Change Log: - $Log$ - Revision 5.6 2007/09/11 21:06:33 ron-fox - Put the correct spectrum axis limits into swrite files. - Revision 5.5 2007/05/11 20:51:57 ron-fox - Make NSCLAsciiSpectrumFormatter correctly deal with rev 2, 3 and - 'malforme3d 2' produced by version 3.2-pre2 for summary spectra. - Revision 5.4 2007/05/11 15:30:53 ron-fox - Change spectrum I/O format version to 3. Need to figure out how to read 2 - for e.g. summary spectra. - Revision 5.3 2007/02/23 20:38:18 ron-fox - BZ291 enhancement... add gamma deluxe spectrum type (independent x/y - parameter lists). - - Revision 5.2 2005/06/03 15:19:29 ron-fox - Part of breaking off /merging branch to start 3.1 development - - Revision 5.1.2.2 2005/05/11 21:26:37 ron-fox - - Add -pedantic and deal with the fallout. - - Fix long standing issues with sread/swrite -format binary - - Merge in Tim's strip chart spectrum and ensure stuff builds - correctly. - - Revision 5.1.2.1 2004/12/21 17:51:26 ron-fox - Port to gcc 3.x compilers. - - Revision 5.1 2004/11/29 16:56:13 ron-fox - Begin port to 3.x compilers calling this 3.0 - - Revision 4.6.4.1 2004/07/01 13:54:42 ron-fox - Defect 135: swrite does not properly preserve channel -> spectrum mappings. - - Revision 4.6 2003/11/13 19:48:49 ron-fox - Unconditionally include config.h - - Revision 4.5 2003/08/25 16:25:33 ron-fox - Initial starting point for merge with filtering -- this probably does not - generate a goo spectcl build. - - Revision 4.4 2003/04/19 00:11:50 ron-fox - Move to format version 2.0: Supply mapping information about the range covered by each axis of a spectrum. Note that reads are backwards compatible with version 1.0 and will default the range to 0 - nchans-1. - -*/ - - #include <config.h> #include "NSCLAsciiSpectrumFormatter.h" @@ -271,42 +225,82 @@ vector<Float_t> createHighs; vector<UInt_t> createDims; - if(eSpecType == keSummary) { - UInt_t nChannels; - if (nRevision == 3) { - nChannels = vDimensions[0]; - } - else { - // There was a time that I had not incremented the - // rev level to 2, but wrote only 1 dim: - if (vDimensions.size() == 1) { + // This switch handles special cases: + + switch (eSpecType) { + + case keSummary: + { + + UInt_t nChannels; + if (nRevision == 3) { nChannels = vDimensions[0]; - } else { - nChannels = vDimensions[1]; } + else { + // There was a time that I had not incremented the + // rev level to 2, but wrote only 1 dim: + + if (vDimensions.size() == 1) { + nChannels = vDimensions[0]; + } else { + nChannels = vDimensions[1]; + } + } + Float_t fLow = vLows[1]; + Float_t fHigh = vHighs[1]; + + createDims.push_back(nChannels); + createLows.push_back(fLow); + createHighs.push_back(fHigh); + } - Float_t fLow = vLows[1]; - Float_t fHigh = vHighs[1]; - - createDims.push_back(nChannels); - createLows.push_back(fLow); - createHighs.push_back(fHigh); - + break; + default: + { + + createDims = vDimensions; + createLows = vLows; + createHighs= vHighs; + } } - else { - createDims = vDimensions; - createLows = vLows; - createHighs= vHighs; - } // // Create an appropriate spectrum: // CSpectrum* pSpectrum(0); CSpectrumFactory Factory; Factory.ExceptionMode(kfFALSE); - if (vyParameters.size() == 0) { + + // Gamma summary spectra are a special case: + + if (eSpecType == keGSummary) { + // parameter names have to be marshalled into a vector of vectors. + // each parameter strip ends in an empty parameter name (""). + // This includes the last strip. + + vector<vector<string> > gSummaryParams; + vector<string> column; + for (int i=0; i < vParameters.size(); i++) { + if (vParameters[i] == "") { + // End of strip: + + gSummaryParams.push_back(column); + column.clear(); + } + else { + column.push_back(vParameters[i]); + } + } + // Now we can create the spectrum: + pSpectrum = Factory.CreateSpectrum(Name, eSpecType, eDataType, + gSummaryParams, + createDims, &createLows, &createHighs); + + + } + else if (vyParameters.size() == 0) { + pSpectrum = Factory.CreateSpectrum(Name, eSpecType, eDataType, vParameters, createDims, &createLows, @@ -325,7 +319,8 @@ // Once more a wierdness of summary spectra.. at this time // vDimensions won't be right for them: - if (eSpecType == keSummary) { + if ((eSpecType == keSummary) || + (eSpecType == keGSummary)) { vDimensions.clear(); vDimensions.push_back(vParameters.size()); // X axis dim is parameter count. vDimensions.push_back(createDims[0]); // and y axis is the 1 creation dim. @@ -424,7 +419,8 @@ rStream << ") "; // Close off the first one: Delimeter = '('; for (UInt_t i = 0; i < spectrumDef.vyParameters.size(); i++) { - FindById p(spectrumDef.vyParameters[i]); + UInt_t pnum = spectrumDef.vyParameters[i]; + FindById p(pnum); ParameterDictionaryIterator i = rDict.FindMatch(p); string name; if (i != rDict.end()) { @@ -441,13 +437,14 @@ else { Delimeter = '('; for(UInt_t i = 0; i < Parameters.size(); i++) { - FindById p(Parameters[i]); + UInt_t pnum = Parameters[i]; + FindById p(pnum); ParameterDictionaryIterator i = rDict.FindMatch(p); if(i != rDict.end()) { rStream << Delimeter << Quote << (*i).second.getName() << Quote; } else { - rStream << Delimeter << "*UNKNOWN*"; + rStream << Delimeter << (pnum == UINT_MAX ? Quote+Quote : "*UNKNOWN*"); } Delimeter = ' '; } Modified: trunk/SpecTcl/TCL/TCLList.h =================================================================== --- trunk/SpecTcl/TCL/TCLList.h 2008-12-30 21:25:16 UTC (rev 1573) +++ trunk/SpecTcl/TCL/TCLList.h 2008-12-30 21:25:55 UTC (rev 1574) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + // CTCLList.h: // // This file defines the CTCLList class. @@ -289,46 +28,7 @@ // Copyright 1999 NSCL, All Rights Reserved. // ///////////////////////////////////////////////////////////// -/*! - Change Log: - $Log$ - Revision 5.3 2006/03/10 14:21:53 ron-fox - Migrate TCL Interfaces to object form and remove direct - references to interp->result - Revision 5.2 2005/06/03 15:19:30 ron-fox - Part of breaking off /merging branch to start 3.1 development - - Revision 5.1.2.1 2004/12/21 17:51:27 ron-fox - Port to gcc 3.x compilers. - - Revision 5.1 2004/11/29 16:56:14 ron-fox - Begin port to 3.x compilers calling this 3.0 - - Revision 4.2.4.1 2004/10/20 19:53:02 ron-fox - Fix a defect discovered in TCLList::operator= attempt to allow variables - as axis specs (failed). - - Revision 4.2 2003/03/25 12:01:28 ron-fox - Added Change log comment generated from the CVS $Log$ - Added Change log comment generated from the CVS Revision 5.3 2006/03/10 14:21:53 ron-fox - Added Change log comment generated from the CVS Migrate TCL Interfaces to object form and remove direct - Added Change log comment generated from the CVS references to interp->result - Added Change log comment generated from the CVS - Added Change log comment generated from the CVS Revision 5.2 2005/06/03 15:19:30 ron-fox - Added Change log comment generated from the CVS Part of breaking off /merging branch to start 3.1 development - Added Change log comment generated from the CVS - Added Change log comment generated from the CVS Revision 5.1.2.1 2004/12/21 17:51:27 ron-fox - Added Change log comment generated from the CVS Port to gcc 3.x compilers. - Added Change log comment generated from the CVS - Added Change log comment generated from the CVS Revision 5.1 2004/11/29 16:56:14 ron-fox - Added Change log comment generated from the CVS Begin port to 3.x compilers calling this 3.0 - Added Change log comment generated from the CVS - Added Change log comment generated from the CVS Revision 4.2.4.1 2004/10/20 19:53:02 ron-fox - Added Change log comment generated from the CVS Fix a defect discovered in TCLList::operator= attempt to allow variables - Added Change log comment generated from the CVS as axis specs (failed). - Added Change log comment generated from the CVS tag. -*/ #ifndef __TCLLIST_H //Required for current class #define __TCLLIST_H //Required for base classes This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2008-12-30 23:14:17
|
Revision: 1575 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1575&view=rev Author: ron-fox Date: 2008-12-30 23:14:13 +0000 (Tue, 30 Dec 2008) Log Message: ----------- - Got Definition working - Got Listing working - Got binding working - Got increment working - >May< have writing working, but not reading. Modified Paths: -------------- trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp trunk/SpecTcl/Sorter/CGammaSummarySpectrum.h trunk/SpecTcl/Sorter/SpectrumFactory.cpp trunk/SpecTcl/SpecTcl/SpectrumCommand.cpp Modified: trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp =================================================================== --- trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp 2008-12-30 21:25:55 UTC (rev 1574) +++ trunk/SpecTcl/Sorter/CGammaSummarySpectrum.cpp 2008-12-30 23:14:13 UTC (rev 1575) @@ -155,7 +155,7 @@ if (paramId < event.size() && event[paramId].isValid()) { UInt_t chan = static_cast<UInt_t>(m_Axes[x].ParameterToAxis(event[paramId])); if (chan < m_nYChannels) { - p[chan*m_nYChannels]++; + p[chan*m_nXChannels]++; } } } @@ -178,7 +178,7 @@ indexCheck(x,y); T* p = (T*)getStorage(); - return (ULong_t)p[x + y*m_nYChannels]; + return (ULong_t)p[x + y*m_nXChannels]; } /*! Sets a channel value in a spectrum @@ -194,7 +194,7 @@ indexCheck(x,y); T* p = (T*)getStorage(); - p[x+y*m_nYChannels] = (T)(nValue); + p[x+y*m_nXChannels] = (T)(nValue); } /*! @@ -272,6 +272,12 @@ CGammaSummarySpectrum<T>::GetDefinition() { static SpectrumDefinition def; + def.fLows.clear(); + def.fHighs.clear(); + def.nChannels.clear(); + def.vParameters.clear(); + + def.sName = getName(); def.nId = getNumber(); def.eType = keGSummary; @@ -285,12 +291,18 @@ def.vParameters.push_back(p[j]); } def.vParameters.push_back(UINT_MAX); // end of row sentinel. - def.fLows.push_back(m_Axes[i].getLow()); - def.fHighs.push_back(m_Axes[i].getHigh()); + } - def.nChannels.push_back(m_Parameters.size()); + def.fLows.push_back(0); + def.fHighs.push_back(m_nXChannels-1); + def.nChannels.push_back(m_nXChannels); + def.nChannels.push_back(m_nYChannels); + def.fLows.push_back(m_Axes[0].getLow()); + def.fHighs.push_back(m_Axes[0].getHigh()); + + return def; } /*! @@ -342,6 +354,61 @@ { return keGSummary; } + +/*! + Return a low limit on an axis. +*/ +template <class T> +Float_t +CGammaSummarySpectrum<T>::GetLow(UInt_t n) const +{ + if (n == 0) { + return 0.0; + } + else if (n == 1) { + return m_Axes[0].getLow(); + } + else { + throw CRangeError(0,1,n, "Getting low limit of a gamma summary spectrum axis"); + } +} + +/*! + Return high limit on an axis: +*/ +template<class T> +Float_t +CGammaSummarySpectrum<T>::GetHigh(UInt_t n) const +{ + if (n == 0) { + return static_cast<Float_t>(m_nXChannels - 1); + } + else if (n == 1) { + return m_Axes[0].getHigh(); + } + else { + throw CRangeError(0,1,n, "Getting high limit of a gamma summary spectrum axis"); + } +} + +/*! + Return the units for an axis: +*/ +template<class T> +string +CGammaSummarySpectrum<T>::GetUnits(UInt_t n) const +{ + if (n == 0 ) { + return string("channels"); + } + else if (n == 1) { + return m_Axes[0].getParameterMapping().getUnits(); + } + else { + throw CRangeError(0,1,n, "Getting units of a gamma summary spectrum axis"); + } +} + /////////////////////////////////////////////////////////////////////////////// // Utility methods. // Modified: trunk/SpecTcl/Sorter/CGammaSummarySpectrum.h =================================================================== --- trunk/SpecTcl/Sorter/CGammaSummarySpectrum.h 2008-12-30 21:25:55 UTC (rev 1574) +++ trunk/SpecTcl/Sorter/CGammaSummarySpectrum.h 2008-12-30 23:14:13 UTC (rev 1575) @@ -102,6 +102,10 @@ virtual SpectrumType_t getSpectrumType(); + virtual Float_t GetLow(UInt_t n) const; + virtual Float_t GetHigh(UInt_t n) const; + virtual std::string GetUnits(UInt_t n) const; + // Utility functions: private: Modified: trunk/SpecTcl/Sorter/SpectrumFactory.cpp =================================================================== --- trunk/SpecTcl/Sorter/SpectrumFactory.cpp 2008-12-30 21:25:55 UTC (rev 1574) +++ trunk/SpecTcl/Sorter/SpectrumFactory.cpp 2008-12-30 23:14:13 UTC (rev 1575) @@ -574,7 +574,7 @@ // validate the type and take action accordingly: switch(specType) { - keGSummary: + case keGSummary: { // Marshall the parameter array: Modified: trunk/SpecTcl/SpecTcl/SpectrumCommand.cpp =================================================================== --- trunk/SpecTcl/SpecTcl/SpectrumCommand.cpp 2008-12-30 21:25:55 UTC (rev 1574) +++ trunk/SpecTcl/SpecTcl/SpectrumCommand.cpp 2008-12-30 23:14:13 UTC (rev 1575) @@ -505,7 +505,7 @@ if (string(pType) == string("gs")) { - rPack.CreateSpectrum(rResult, pName, pType, vGSParameters, + return rPack.CreateSpectrum(rResult, pName, pType, vGSParameters, vChannels, vLows, vHighs, pDataType); } else if (vyParameters.size() == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-01-05 19:12:51
|
Revision: 1584 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1584&view=rev Author: ron-fox Date: 2009-01-05 19:12:43 +0000 (Mon, 05 Jan 2009) Log Message: ----------- Added gamma summary spectrum formally. - Added minimal support to multicolored monster. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/TreeParam/SpectrumGenerator.tcl Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-01-05 14:47:38 UTC (rev 1583) +++ trunk/SpecTcl/CHANGELOG 2009-01-05 19:12:43 UTC (rev 1584) @@ -840,4 +840,4 @@ fact that the first buffer is sequence 0 so we need the first buffer to increment our buffers analyzed -> 0. - +January 5, 2009 - Added gamma summary spectrum. Modified: trunk/SpecTcl/TreeParam/SpectrumGenerator.tcl =================================================================== --- trunk/SpecTcl/TreeParam/SpectrumGenerator.tcl 2009-01-05 14:47:38 UTC (rev 1583) +++ trunk/SpecTcl/TreeParam/SpectrumGenerator.tcl 2009-01-05 19:12:43 UTC (rev 1584) @@ -737,6 +737,18 @@ set highy "" set binsy "" } + gs { + set ltype "GS" + set varx [lindex [lindex $parameters 0] 0] + set lowx [format %g [lindex [lindex $resolutions 0] 0]] + set highx [format %g [lindex [lindex $resolutions 0] 1]] + set binx [format %x [lindex [lindex $resolutions 0] 2]] + set vary "" + set lowy "" + set highy "" + set binsy "" + + } gd { set ltype "GD" set varx [lindex $parameters 0] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-01-15 18:15:01
|
Revision: 1589 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1589&view=rev Author: ron-fox Date: 2009-01-15 18:14:52 +0000 (Thu, 15 Jan 2009) Log Message: ----------- Added API docs for gamma summary and deluxe spectra. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/SpecTcl/spectclapi.3 Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-01-15 15:00:30 UTC (rev 1588) +++ trunk/SpecTcl/CHANGELOG 2009-01-15 18:14:52 UTC (rev 1589) @@ -845,3 +845,6 @@ - Fix Xamine compilation errors with -pedantic. Need to use reinterpret_cast to cast XtPointer -> function pointers. + - Document gamma summary spectra in the on-board html. + - Document GUI gamma summary spectrum creator. + - Added API docs for gamma deluxe and gamma summary spectra \ No newline at end of file Modified: trunk/SpecTcl/SpecTcl/spectclapi.3 =================================================================== --- trunk/SpecTcl/SpecTcl/spectclapi.3 2009-01-15 15:00:30 UTC (rev 1588) +++ trunk/SpecTcl/SpecTcl/spectclapi.3 2009-01-15 18:14:52 UTC (rev 1589) @@ -288,6 +288,37 @@ STD(vector)<UInt_t> channels, STD(vector)<Float_t>* pLows, STD(vector)<Float_t>* pHighs); + CSpectrum* CreateSpectrum(STD(string) Name, + SpectrumType_t type, + DataType_t dataType, + STD(vector)<STD(string)> xParameters, + STD(vector)<STD(string)> yParameters, + STD(vector)<UInt_t> channels, + STD(vector)<Float_t>* pLows, + STD(vector)<Float_t>* pHighs); + + CSpectrum* CreateSpectrum(std::string Name, + SpectrumType_t type, + DataType_t dataType, + std::vector<std::vector<std::string> > parameters, + std::vector<UInt_t> channels, + std::vector<Float_t>* lows, + std::vector<Float_t>* highs); + + CSpectrum* CreateGammaSummary(std::string Name, + DataType_t dataType, + std::vector<std::vector<std::string> > parameters, + UInt_t nChannels, + std::vector<Float_t>* low, + std::vector<Float_t>* high); + + CSpectrum* CreateG2DDeluxe(STD(string) Name, + DataType_t dataType, + STD(vector)<STD(string)> xParameters, + STD(vector)<STD(string)> yParameters, + STD(vector)<UInt_t> channels, + STD(vector)<Float_t>* pLows, + STD(vector)<Float_t>* pHighs); CSpectrum* Create1D(STD(string) name, DataType_t dataType, CParameter& parameter, @@ -696,8 +727,54 @@ parameter. The other parameters must be sufficient in number and type to support the creation of the desired spectrum or else a \fBCSpectrumFactoryException\fR will be thrown. A pointer to the new spectrum -(dynamically created) will be returned. +(dynamically created) will be returned. + .TP +\fBCSpectrum* CreateSpectrum(STD(string) \fIName\fB, SpectrumType_t \fItype\fB, +DataType_t \fIdataType\fB, STD(vector)<STD(string)> \fIxParameters\fB, +STD(vector)<STD(string)> \fIyParameters\fB, +STD(vector)<UInt_t> \fIchannels\fB, STD(vector)<Float_t>* \fIpLows\fB, +STD(vector)<Float_t>* \fIpHighs\fB); + +This spectrum creation function is needed for spectra that require two separable +lists of parameters. This is specifically used to create gamma deluxe spectra. +Paramters are as for the previous creation function howeer the +\fIxParameters\fB and \fIyParameters\fB parameters are lists of parameters for the +X and Y axes respectively. + +.TP +CSpectrum* CreateSpectrum(std::string \fIName\fB, SpectrumType_t \fItype\fB, +DataType_t \fIdataType\fB, std::vector<std::vector<std::string> > \fIparameters\fB, +std::vector<UInt_t> \fIchannels\fB, std::vector<Float_t>* \fIlows\fB, +std::vector<Float_t>* \fIhighs\fB); + +Creates a spectrum that needs a list of lists of parameters. Currently this +means a gamma summary spectrum is created. + +.TP +CSpectrum* CreateGammaSummary(std::string \fIName\fB, DataType_t \fIdataType\fB, +std::vector<std::vector<std::string> > \fIparameters\fB, Int_t \fInChannels\fB, +std::vector<Float_t>* \fIlow\fB, std::vector<Float_t>* \fIhigh\fB); + +Creates a gamma summary spectrum. A gamma summary spectrum is a 2-d spectrum where +each vertical strip is a gamma 1-d spectrum. The \fIparameters\fB parameter is +a vector where each element is the vector of parameters that will be histogrammed +in that X channel's vertical strip. + +.TP +CSpectrum* CreateG2DDeluxe(STD(string) \fIName\fB, DataType_t \fIdataType\fB, +STD(vector)<STD(string)> \fIxParameters\fB, STD(vector)<STD(string)> \fIyParameters\fB, +STD(vector)<UInt_t> \fBchannels\fI, +STD(vector)<Float_t>* \fIpLows\fB, +STD(vector)<Float_t>* \fIpHighs\fB); + +Creates a gbamma 2d deluxe spectrum. This is a spectrum with a pair of +independent x and y parameter specifications. This spectrum in incremented for +all x/y parameter pairs. The \fIxParameters\fB parameter is a vector of the +names of the X parameters while \fIyParameters\fB is a vector of the names of the +y parameters. + +.TP \fBCSpectrum* Create1D(STD(string) \fIname\fB, DataType_t \fIdataType\fB, CParameter& \fIparameter\fB, UInt_t \fIchannels\fB);\fR Creates a 1D spectrum. A pointer to the new spectrum is returned. The \fIchannels\fR parameter not only determines the number of channels on the X This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-02-18 12:36:22
|
Revision: 1590 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1590&view=rev Author: ron-fox Date: 2009-02-18 12:25:37 +0000 (Wed, 18 Feb 2009) Log Message: ----------- Made the background of the button box a clear indicator of whether the system has a test software load. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Display/XMManagers.h trunk/SpecTcl/Display/Xamine.cc trunk/SpecTcl/Display/buttonsetup.cc trunk/SpecTcl/configure.in Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-01-15 18:14:52 UTC (rev 1589) +++ trunk/SpecTcl/CHANGELOG 2009-02-18 12:25:37 UTC (rev 1590) @@ -847,4 +847,7 @@ function pointers. - Document gamma summary spectra in the on-board html. - Document GUI gamma summary spectrum creator. - - Added API docs for gamma deluxe and gamma summary spectra \ No newline at end of file + - Added API docs for gamma deluxe and gamma summary spectra +February 18, 2008 + - Made the background of the button box a clear indicator of whether + or not SpecTcl is in a test system. Modified: trunk/SpecTcl/Display/XMManagers.h =================================================================== --- trunk/SpecTcl/Display/XMManagers.h 2009-01-15 18:14:52 UTC (rev 1589) +++ trunk/SpecTcl/Display/XMManagers.h 2009-02-18 12:25:37 UTC (rev 1590) @@ -1,280 +1,20 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' -*/ /* ** Facility: ** Motif/C++ class support. Modified: trunk/SpecTcl/Display/Xamine.cc =================================================================== --- trunk/SpecTcl/Display/Xamine.cc 2009-01-15 18:14:52 UTC (rev 1589) +++ trunk/SpecTcl/Display/Xamine.cc 2009-02-18 12:25:37 UTC (rev 1590) @@ -1,280 +1,19 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 */ + static const char* Copyright = "(C) Copyright Michigan State University 1994, All rights reserved"; /* ** Facility: @@ -305,6 +44,7 @@ #include <Xm/DrawingA.h> #include <Xm/ScrolledW.h> +#include <string> // // Below we deal with the fact that an inclusion of <exception> is done @@ -353,7 +93,7 @@ char *sbrk(int); } #endif - + /* ** Functional Description: ** MemGone: @@ -475,12 +215,16 @@ work_area.SetBottomPosition(panes, 94); Arg arg[10]; + Cardinal nArgs = 3; XtSetArg(arg[0], XmNscrollingPolicy, XmAUTOMATIC); XtSetArg(arg[1], XmNscrollBarDisplayPolicy, XmAS_NEEDED); XtSetArg(arg[2], XmNresizable, False); + + + XMWidget *cmd_area = new XMWidget("button_bar", xmScrolledWindowWidgetClass, main_win, - arg, 3); + arg, nArgs); XMMenuBar *mb; /* We need to set up the mechanism for getting Xt notification of */ Modified: trunk/SpecTcl/Display/buttonsetup.cc =================================================================== --- trunk/SpecTcl/Display/buttonsetup.cc 2009-01-15 18:14:52 UTC (rev 1589) +++ trunk/SpecTcl/Display/buttonsetup.cc 2009-02-18 12:25:37 UTC (rev 1590) @@ -60,7 +60,22 @@ static XMToggleButton *zoom_button; static XMToggleButton *log_button; static XMToggleButton *mapping_button; + +/* + See if this is a test system. +*/ +static bool +isTestSystem() +{ + std::string filename(HOME); + filename += "/../../TEST_VERSION"; + int result = access(filename.c_str(), F_OK); + + printf("Checking for: %s got %d\n",filename.c_str(), result); + return (result == 0); +} + /* ** Functional Description: ** Xamine_SetButtonBarLog: @@ -150,6 +165,8 @@ spectra = new XMFrame("Spectra_f", *manager, &frame_attribs, 1); grobs = new XMFrame("Grobj_f", *manager, &frame_attribs, 1); + + /* Produce the forms: */ XMForm *windows_rc, *spectra_rc, *grobs_rc; @@ -158,7 +175,17 @@ spectra_rc = new XMForm("Spectra_rc", *spectra); grobs_rc = new XMForm("Grobj_rc", *grobs); + // In a test systesm make the background of the button box an ugly black. + if (isTestSystem()) { + Pixel black = BlackPixelOfScreen(XtScreen(manager->getid())); + manager->SetAttribute(XmNbackground, black); + windows_rc->SetAttribute(XmNbackground, black); + spectra_rc->SetAttribute(XmNbackground, black); + grobs_rc->SetAttribute(XmNbackground, black); + } + + /* Create the buttons in windows category */ XMPushButton *pb; Modified: trunk/SpecTcl/configure.in =================================================================== --- trunk/SpecTcl/configure.in 2009-01-15 18:14:52 UTC (rev 1589) +++ trunk/SpecTcl/configure.in 2009-02-18 12:25:37 UTC (rev 1590) @@ -4,7 +4,7 @@ AC_CONFIG_AUX_DIR(config) AM_CONFIG_HEADER(config.h) AC_CANONICAL_HOST -AM_INIT_AUTOMAKE(SpecTcl, 3.3) +AM_INIT_AUTOMAKE(SpecTcl, 3.3pre1) AC_EXEEXT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-03-06 19:08:02
|
Revision: 1594 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1594&view=rev Author: ron-fox Date: 2009-03-06 19:07:40 +0000 (Fri, 06 Mar 2009) Log Message: ----------- Change the type of the event elements to double so extended ranges of parameter values, and computation on them from the rEvent array don't cause truncation/precision errors. This may be the issue with KSU's spikes? Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Events/Event.h trunk/SpecTcl/Gui/Makefile.am trunk/SpecTcl/configure.in Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-02-18 13:44:42 UTC (rev 1593) +++ trunk/SpecTcl/CHANGELOG 2009-03-06 19:07:40 UTC (rev 1594) @@ -851,3 +851,5 @@ February 18, 2008 - Made the background of the button box a clear indicator of whether or not SpecTcl is in a test system. +pre2: + March 6, 2009 - Make the rEvent array hold doubles not floats. \ No newline at end of file Modified: trunk/SpecTcl/Events/Event.h =================================================================== --- trunk/SpecTcl/Events/Event.h 2009-02-18 13:44:42 UTC (rev 1593) +++ trunk/SpecTcl/Events/Event.h 2009-03-06 19:07:40 UTC (rev 1594) @@ -47,7 +47,7 @@ #include <ValidValue.h> #endif -typedef Float_t ParamType; +typedef DFloat_t ParamType; typedef STD(vector)<CValidValue<ParamType> > CParameterVector; typedef CValidValue<ParamType> CParameterValue; typedef CParameterVector::iterator CEventIterator; Modified: trunk/SpecTcl/Gui/Makefile.am =================================================================== --- trunk/SpecTcl/Gui/Makefile.am 2009-02-18 13:44:42 UTC (rev 1593) +++ trunk/SpecTcl/Gui/Makefile.am 2009-03-06 19:07:40 UTC (rev 1594) @@ -93,4 +93,4 @@ editGammaDeluxe.tcl \ editGammaDeluxehelp.html \ editgsummary.tcl \ -gammasummery.html +gammasummary.html Modified: trunk/SpecTcl/configure.in =================================================================== --- trunk/SpecTcl/configure.in 2009-02-18 13:44:42 UTC (rev 1593) +++ trunk/SpecTcl/configure.in 2009-03-06 19:07:40 UTC (rev 1594) @@ -4,7 +4,7 @@ AC_CONFIG_AUX_DIR(config) AM_CONFIG_HEADER(config.h) AC_CANONICAL_HOST -AM_INIT_AUTOMAKE(SpecTcl, 3.3pre1) +AM_INIT_AUTOMAKE(SpecTcl, 3.3pre2) AC_EXEEXT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-03-18 19:17:01
|
Revision: 1600 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1600&view=rev Author: ron-fox Date: 2009-03-18 19:16:57 +0000 (Wed, 18 Mar 2009) Log Message: ----------- Fix tkcon so it does not implement a clear command that conflicts with the SpecTcl clear command. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Scripts/tkcon.tcl Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-03-18 19:11:53 UTC (rev 1599) +++ trunk/SpecTcl/CHANGELOG 2009-03-18 19:16:57 UTC (rev 1600) @@ -852,4 +852,6 @@ - Made the background of the button box a clear indicator of whether or not SpecTcl is in a test system. pre2: - March 6, 2009 - Make the rEvent array hold doubles not floats. \ No newline at end of file + March 6, 2009 - Make the rEvent array hold doubles not floats. + March 18, 2009 - Fix tkcon.tcl so it does not implement a clear command + that interferes with the SpecTcl clear command. Modified: trunk/SpecTcl/Scripts/tkcon.tcl =================================================================== --- trunk/SpecTcl/Scripts/tkcon.tcl 2009-03-18 19:11:53 UTC (rev 1599) +++ trunk/SpecTcl/Scripts/tkcon.tcl 2009-03-18 19:16:57 UTC (rev 1600) @@ -183,7 +183,7 @@ protocol exit showOnStartup 1 slaveprocs { - alias clear dir dump echo idebug lremove + alias tkconclear dir dump echo idebug lremove tkcon_puts tkcon_gets observe observe_var unalias which what } RCS {RCS: @(#) $Id$} @@ -1411,7 +1411,7 @@ $m add command -label "Close Console" -underline 0 -accel Ctrl-w \ -command ::tkcon::Destroy $m add command -label "Clear Console" -underline 1 -accel Ctrl-l \ - -command { clear; ::tkcon::Prompt } + -command { tkconclear; ::tkcon::Prompt } if {[string match unix $tcl_platform(platform)]} { $m add separator $m add command -label "Make Xauth Secure" -und 5 \ @@ -3735,7 +3735,7 @@ ## clear - clears the buffer of the console (not the history though) ## This is executed in the parent interpreter ## -proc clear {{pcnt 100}} { +proc tkconclear {{pcnt 100}} { if {![regexp {^[0-9]*$} $pcnt] || $pcnt < 1 || $pcnt > 100} { return -code error \ "invalid percentage to clear: must be 1-100 (100 default)" @@ -5071,7 +5071,7 @@ bind TkConsole <<TkCon_Clear>> { ## Clear console buffer, without losing current command line input set ::tkcon::PRIV(tmp) [::tkcon::CmdGet %W] - clear + tkconclear ::tkcon::Prompt {} $::tkcon::PRIV(tmp) } bind TkConsole <<TkCon_Previous>> { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-03-24 20:25:12
|
Revision: 1601 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1601&view=rev Author: ron-fox Date: 2009-03-24 20:25:06 +0000 (Tue, 24 Mar 2009) Log Message: ----------- Allow several graphical objects to be deleted in a single Grobj->Delete operation by: - Adding XMMultiSelectionList that is a dialog that allows the list selection policy to be set - Completely re-writing the delgrob module to use this (simplifies it too). Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Display/Makefile.am trunk/SpecTcl/Display/XMDialogs.h trunk/SpecTcl/Display/XMList.h trunk/SpecTcl/Display/delgrob.cc Added Paths: ----------- trunk/SpecTcl/Display/XMMultiSelectionList.cc trunk/SpecTcl/Display/XMMultiSelectionList.h Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-03-18 19:16:57 UTC (rev 1600) +++ trunk/SpecTcl/CHANGELOG 2009-03-24 20:25:06 UTC (rev 1601) @@ -855,3 +855,4 @@ March 6, 2009 - Make the rEvent array hold doubles not floats. March 18, 2009 - Fix tkcon.tcl so it does not implement a clear command that interferes with the SpecTcl clear command. + March 24, 2009 - Make the delgrob dialog a multiselect. Modified: trunk/SpecTcl/Display/Makefile.am =================================================================== --- trunk/SpecTcl/Display/Makefile.am 2009-03-18 19:16:57 UTC (rev 1600) +++ trunk/SpecTcl/Display/Makefile.am 2009-03-24 20:25:06 UTC (rev 1601) @@ -112,7 +112,8 @@ XMTab.h convert.h grobfile_lex.h pkgmgr.h trackcursor.h\ XMText.h copier.h grobjdisplay.h prccheck.h windfile_lex.h\ XMWidget.h copyatr.h grobjinput.h printer.h windfile_tab.h\ -XMWlist.h defaultfile_lex.h grobjio.h procede.h windio.h\ +XMWlist.h XMMultiSelectionList.h defaultfile_lex.h grobjio.h \ + procede.h windio.h\ Xamine.h delgrob.h grobjiomenu.h properties.h \ acceptgates.h dfltmgr.h grobjmgr.h ptlist.h winiomenu.h \ advprompt.h dispgrob.h guintegrate.h queue.h xaminegc.h \ @@ -129,7 +130,7 @@ Xamine_SOURCES = Xamine.cc XMWidget.cc XMCallback.cc XMMenus.cc XMText.cc \ XMDialogs.cc XMManagers.cc XMWlist.cc XMShell.cc XMPushbutton.cc XMTab.cc \ -XMLabel.cc XMList.cc XMScale.cc XMSeparators.cc \ +XMLabel.cc XMList.cc XMScale.cc XMSeparators.cc XMMultiSelectionList.cc \ dispwind.cc menusetup.cc exit.cc helpmenu.cc winiomenu.cc \ grobjiomenu.cc geometrymenu.cc errormsg.cc logging.cc toggles.cc \ spectra.cc specchoose.cc spcdisplay.cc advprompt.cc properties.cc \ Modified: trunk/SpecTcl/Display/XMDialogs.h =================================================================== --- trunk/SpecTcl/Display/XMDialogs.h 2009-03-18 19:16:57 UTC (rev 1600) +++ trunk/SpecTcl/Display/XMDialogs.h 2009-03-24 20:25:06 UTC (rev 1601) @@ -654,7 +654,7 @@ /* Destructors: */ - ~XMCustomDialog(); + virtual ~XMCustomDialog(); /* Operation on the skeleton dialog */ Modified: trunk/SpecTcl/Display/XMList.h =================================================================== --- trunk/SpecTcl/Display/XMList.h 2009-03-18 19:16:57 UTC (rev 1600) +++ trunk/SpecTcl/Display/XMList.h 2009-03-24 20:25:06 UTC (rev 1601) @@ -1,281 +1,18 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and - (2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' -*/ -/* + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*//* ** Facility: ** Xamine -- NSCL display program C++ widget support. ** Abstract: Added: trunk/SpecTcl/Display/XMMultiSelectionList.cc =================================================================== --- trunk/SpecTcl/Display/XMMultiSelectionList.cc (rev 0) +++ trunk/SpecTcl/Display/XMMultiSelectionList.cc 2009-03-24 20:25:06 UTC (rev 1601) @@ -0,0 +1,186 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 + +*/ +#include <config.h> +#include "XMMultiSelectionList.h" + +using namespace std; + +/*! + Constructor: + \param name - Name of the new widget. + \param parane - Reference to parent widget. + \param title - Widget title. + +*/ +XMMultiSelectionList::XMMultiSelectionList(char* name, XMWidget& parent, char* title) : + XMCustomDialogBox(name, parent, title) +{ + string listname(name); + XMForm* wa(WorkArea()); + + listname += "_list"; + m_pList = new XMList(const_cast<char*>(listname.c_str()), *wa); + wa->SetTopAttachment(*m_pList, XmATTACH_FORM); + wa->SetLeftAttachment(*m_pList, XmATTACH_FORM); + wa->SetRightAttachment(*m_pList, XmATTACH_FORM); + wa->SetBottomAttachment(*m_pList, XmATTACH_FORM); + + m_pList->Manage(); // So parent manage will already have us managed. + +} + + +/*! + Destroy the widget. +*/ +XMMultiSelectionList::~XMMultiSelectionList() +{ + delete m_pList; +} + + +///////////////////////////////////////////////////////////////////////////////// +// +// The member functions below just operate on the list: +// + +/*! + Return the list widget itself in case the remaining list operations don't provide + what's needed: + @return XMList* + @retval Pointer to the encapsulated list widget. +*/ +XMList* +XMMultiSelectionList::getList() +{ + return m_pList; +} +/*! + Set the number of rows of visible items. This should be set prio to managing + the dialog, as it affect the geometry calculations. + @param rows (int) Numer of desired rows. +*/ + +void +XMMultiSelectionList::SetRows(int rows) +{ + m_pList->SetRows(rows); +} + +/*! + Set the scrolling policy. This determines when and why the list box + will grow scroll bars. The deaftult XmAS_NEEDED grows scroll bars when the + size of the box is too big for the area it's allotted. + @param policy (int = XmAS_NEEDED) scroll bar policy. +*/ +void +XMMultiSelectionList::SetScrollPolicy(int policy) +{ + m_pList->SetScrollPolicy(policy); +} + +/*! + Set the selection policy. Supplying this for the dialog is the real reason we want + this + + @param policy (int = XmSINGLE_SELECT) The new policy. This can be one of: + XmSINGLE_SELECT - Only one item can be concurrently selected. + XmMULTIPLE_SELECT - Any number of items can be selected click toggles selection + state without modifying the selection state of any other. + XmBROWSE_SELECT - Only one item canb e selected but you can drag + to change which + XmEXTENDED_SELECT - Multiple itmes can be selected via shift drag, shift click etc. +*/ + +void +XMMultiSelectionList::SetSelectionPolicy(int policy) +{ + m_pList->SetSelectionPolicy(policy); +} +/*! + Get the number of items in the list..this is the number of items that can be + selected from, not the number that are selected. + @return int + @retval Number of items in the list. +*/ +int +XMMultiSelectionList::GetListCount() +{ + return m_pList->GetListCount(); +} +/*! + Get the set of values that are in the list. This is the set of values available, + not the selected set. + @return XmStringTable + @retval The 'list of strings' directly in the table. This should therefore not be + released by the caller. +*/ +XmStringTable +XMMultiSelectionList::GetListValues() +{ + return m_pList->GetListValues(); +} +/*! + Return the number of items currently selected in the list. + @return int + @retval Selected item count (anywhere from 0 to GetListCount). +*/ +int +XMMultiSelectionList::GetSelectedListCount() +{ + return m_pList->GetSelectedListCount(); +} +/*! + @return XmStringTable + @retval The set of selected items. This is a pointer into to resources of the widget + so don't free the pointer. +*/ +XmStringTable +XMMultiSelectionList::GetSelectedItems() +{ + return m_pList->GetSelectedItems(); +} +/*! + Sets the current list of items to the ordered vector of strings passed in. + @param items (std::vector<std::string>) The ites to put in the listbox. +*/ +void +XMMultiSelectionList::setItems(std::vector<std::string> items) +{ + Widget w = m_pList->getid(); + + // First empty the list: + + XmListDeleteAllItems(w); + + // Marshall the items into a set of XmString pointers: + + XmString* pStrings = new XmString[items.size()]; + + for(int i=0; i < items.size(); i++) { + pStrings[i] = XmStringCreateLocalized(const_cast<char*>(items[i].c_str())); + } + XmListAddItems(w, pStrings, items.size(), 0); + + // Release string storage: + + for (int i=0; i< items.size(); i++) { + XmStringFree(pStrings[i]); + } + + delete []pStrings; +} Added: trunk/SpecTcl/Display/XMMultiSelectionList.h =================================================================== --- trunk/SpecTcl/Display/XMMultiSelectionList.h (rev 0) +++ trunk/SpecTcl/Display/XMMultiSelectionList.h 2009-03-24 20:25:06 UTC (rev 1601) @@ -0,0 +1,78 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef XMDIALOGS_H +#include "XMDialogs.h" +#endif + +#ifndef XMLIST_H +#include "XMList.h" +#endif + +#ifndef __STL_STRING +#include <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif + +#ifndef __STL_VECTOR +#include <vector> +#ifndef __STL_VECTOR +#define __STL_VECTOR +#endif +#endif + + + +/*! + XMMultiSelectionList is a bit of a misnomer. What it actually is is a custom dialog + whose work area is just a list box. This supports access to the customization + resources of the list box directly.. specifically, the selection policy. + + You can use this dialog if you want a seletion list dialog that supports selecting + several items from the list (unlike the 'normal' selection list dialog. + +*/ +class XMMultiSelectionList : public XMCustomDialogBox +{ + protected: + XMList* m_pList; // The selection list. + + public: + XMMultiSelectionList(char* name, XMWidget& parent, char* title); + virtual ~XMMultiSelectionList(); + + // Expose the list box: + public: + XMList* getList(); // In case what's provided below is not sufficient: + + void AutoSelect(Boolean enable=True); + void SetDoubleClickTime(int ms = 100); + void SetRows(int rows); + void SetScrollPolicy(int policy = XmAS_NEEDED); + void SetSelectionPolicy(int policy = XmSINGLE_SELECT); + + int GetListCount(); + XmStringTable GetListValues(); + + void setItems(std::vector<std::string> items); + + int GetSelectedListCount(); + XmStringTable GetSelectedItems(); + + +}; Modified: trunk/SpecTcl/Display/delgrob.cc =================================================================== --- trunk/SpecTcl/Display/delgrob.cc 2009-03-18 19:16:57 UTC (rev 1600) +++ trunk/SpecTcl/Display/delgrob.cc 2009-03-24 20:25:06 UTC (rev 1601) @@ -1,281 +1,18 @@ /* - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: - Preamble + http://www.gnu.org/licenses/gpl.txt - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, - you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to -ask for permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and of -promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS ' -*/ -static const char* Copyright = "(C) Copyright Michigan State University 1994, All rights reserved"; + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/static const char* Copyright = "(C) Copyright Michigan State University 1994, All rights reserved"; /* ** Facility: ** Xamine -- NSCL Display program. @@ -303,6 +40,7 @@ #include "XMDialogs.h" +#include "XMMultiSelectionList.h" #include "dispgrob.h" #include "dispwind.h" @@ -317,6 +55,8 @@ */ extern char *upcase(char *s); +using namespace std; + /* ** Below we define the help text for the dialog: */ @@ -324,9 +64,8 @@ " This dialog deletes graphical objects. The list at the top of the\n", "work area is the set of deletable graphical objects defined on the\n", "spectrum at the time this dialog was popped up. To refresh the list\n", - "request the delete function again. You may either click on the object\n", - "you'd like to delete or type it's name or ID number in the prompt line\n", - "at the bottom of the work area.\n\n", + "request the delete function again. You may select several graphical\n", + "objects to delete.\n", " The buttons at the bottom of the dialog (action area) have the\n", "following meanings: \n\n", " Ok - Delete the indicated graphical object and dismiss the\n", @@ -351,338 +90,225 @@ */ static int specid; /* -** Below is the selection dialog pointer which must be instantiated the first -** call through. + */ -static XMSelectionDialog *dialog = NULL; - + /* -** Functional Description: -** SetObjectList: -** This function builds a selection list of the objects which are -** available to the choice widget. -** Formal Parameters: -** XMSelectionDialog *d: -** Dialog into which the list is built. -** int specid: -** Number of the spectrum for which the objects are being built. -** Returns: -** Number of objects in list. +** Make a specific class derived fromt he Multi Selection list for +** Selecting the set of grobs to delete: */ -static int SetObjectList(XMSelectionDialog *d, int specid) + +class MultiGrobSelectionList : public XMMultiSelectionList { + int m_spectrum; +public: + MultiGrobSelectionList(XMWidget& parent); + virtual ~MultiGrobSelectionList(); - /* First build the list of names. Each name is constructed from the - ** object type, the object id and object name. - */ +public: + void stockList(int spectrumId); - int nobject = Xamine_GetSpectrumObjectCount(specid); - if(nobject == 0) { - d->SetSelectionList(0, NULL); - return 0; - } + // Callback handlers: - grobj_name aname; - // char *names[GROBJ_MAXOBJECTS]; + virtual void OkPressed(XMWidget* pWid, XtPointer cli, XtPointer call); + virtual void ApplyPressed(XMWidget* pWid, XtPointer cli, XtPointer call); + virtual void CancelPressed(XMWidget* pWid, XtPointer cli, XtPointer call); - char** names = new char*[nobject]; - // grobj_generic *objects[GROBJ_MAXOBJECTS]; +protected: + + void scheduleDeletion(); // Delete this object in an idle process. + void deleteSelectedObjects(); // Delete the selected grobjs. - grobj_generic** objects = new grobj_generic*[nobject]; +private: + static Boolean deleteCallback(XtPointer theObject); +}; - Xamine_GetSpectrumObjects(specid, - objects, nobject, - True); - int i; - for(i = 0; i < nobject; i++) { - int l = strlen(objects[i]->getname(aname)) + 10; - names[i] = new char[l]; - sprintf(names[i], "[%c%d] %s", - typechars[objects[i]->type()], - objects[i]->getid(), - aname); - - } - /* Hand the name list over to the selection box dialog widget for display */ +////////////////////////////////////////////////////////////////////////////////////// +// +// Implementation of the dialog object: +// - d->SetSelectionList((Cardinal)nobject, names); +/*! + Construction: Just construct the base class with some pre-defined values for + the name and title: + and set the selection mode to extended: - /* Delete our copy of the list. */ - - for(i = 0; i < nobject; i++) { - delete [] names[i]; - } - delete []names; - delete []objects; - - return nobject; -} - -/* Functional Description: -** FindObject: -** This function locates an object in the graphical object database by -** name and spectrum id and returns the object id to the caller. -** Note that name comparisons are done case blind but multiple -** blanks are significant. -** Formal Parameters: -** int specid: -** Number of the spectrum to check. -** char *name: -** The object name... note, this is turned into upper case. -** int *id: -** integer to hold the object ident. -** Returns: -** True if a match was found, False otherwise. + @param parent XMWidget& - Widget that is the parent of this megawidget. */ -Boolean FindObject(int specid, char *name, int *id) +MultiGrobSelectionList::MultiGrobSelectionList(XMWidget& parent) : + XMMultiSelectionList("GrobjChooser", parent, "Select objects to delet") { - grobj_name aname; - grobj_database *db = Xamine_GetObjectDatabase(); - grobj_generic *o; - upcase(name); - - o = db->find_first(specid); /* Start the search. */ - while(o != NULL) { - upcase(o->getname(aname)); /* Get the object name. */ - if(strcmp(aname, name) == 0) { - *id = o->getid(); - return True; - } - o = db->find_next(); - } - return False; + SetSelectionPolicy(XmEXTENDED_SELECT); + SetHelpText(help_text); } - -/* -** Functional Description: -** GetGrobjId: -** Get the graphical object identifier associated with an id string -** of the form [tnum] name -** where t = object type. -** num= Ojbect id number. -** Formal Parameters; -** char *s: -** Name string. -** int *id: -** POinter to place to stuff id. -** Returns: -** True on success... that is if the object fits that format. -** False if not. + +/*! + Destruction just chains to the parent class destructors: */ -Boolean GetGrobjId(char *n, int *id) -{ - /* Skip leading whitespace. */ +MultiGrobSelectionList::~MultiGrobSelectionList() +{} - while(isspace(*n)) n++; - if(strlen(n) == 0) return False; /* Failed if no more string. */ +/*! + Stock the list box with the set of graphical objects defined on the specified spectrum: + @param spectrumId - Id of the spectrum whose objects will be listed: - /* Fail if the first character is not a [: */ - /* Skip 2 chars if so. (the [ and object type code. */ +*/ +void +MultiGrobSelectionList::stockList(int spectrumId) +{ + vector<string> objectNames; // Names of the objects. - if(*n != '[') return False; - n++;if(*n == '\000') return False; /* Skip char fail if no more. */ - n++;if(*n == '\000') return False; /* Skip char fail if no more. */ + // Get the names of the objects defined on this spectrum: + + m_spectrum = spectrumId; + int nObjects = Xamine_GetSpectrumObjectCount(m_spectrum); - /* Try to get the id: */ - if(sscanf(n, "%d", id) != 1) return False; - return True; -} - -/* Functional Description: -** DeleteObject: -** This function is called when it's actually time to delete an object -** from the list of graphical objects associated with a spectrum. -** Formal Parameters: -** XmString name: -** This is the motif compound string which is represents what the user -** selected or typed in. -** int specid: -** The id of the spectrum that we're deleting objects from. -** Returns: -** True on success, False on failure. -*/ -static Boolean DeleteObject(XmString name, int specid) -{ - /* First convert the string to an ASCIZ string. */ + grobj_generic** objects = new grobj_generic*[nObjects]; + Xamine_GetSpectrumObjects(m_spectrum, objects, nObjects, True); - char *cname; - if(!XmStringGetLtoR(name, XmSTRING_DEFAULT_CHARSET, &cname)) { - Xamine_error_msg(Xamine_Getpanemgr(), - "DeleteObject -- Unable to get selection from Motif"); - return False; + for (int i= 0; i < nObjects; i++) { + grobj_name aname; + objects[i]->getname(aname); + objectNames.push_back(string(aname)); } - /* Next we try to decode the name. First we try to decode the form - ** Expected from a double click on a name: - */ - int id; + // Set them as the list box entries: - if(!GetGrobjId(cname, &id)) { /* Try to get id from string itself. */ + setItems(objectNames); - /* Try to pick off the ID by just sscanf ing it */ + // Delete the dynamic storage: - if(sscanf(cname, "%d", &id) != 1) { - - /* treat cname as a name string and try to get a matching object id */ + delete []objects; - if(!FindObject(specid, cname, &id)) { - XtFree(cname); /* Free the string. */ - Xamine_error_msg(Xamine_Getpanemgr(), - "No such graphical object. Please choose one from the list"); - return False; - } - } - } - XtFree(cname); /* Free the string storage. */ - /* When control passes here, id contains the id of the object to delete */ - /* We locate and delete the object */ +} - if(!Xamine_DeleteGrobj(specid, id)) { - Xamine_error_msg(Xamine_Getpanemgr(), - "Graphical object no longer exists in the database"); - return False; - } - return True; +/*! + Handles the Ok button: + - Call deleteSelectedObjects + - Schedule our deletion (Ok dismisses the dialog) + @param pWid (XMWidget*) - Pointer to the encapsulated widget (I think this is the ok button). + @param cli (XtPointer) - Client data (not meaningful I think). + @param call (XtPointer) - Call data. Not so meaningful. +*/ +void +MultiGrobSelectionList::OkPressed(XMWidget* pWid, XtPointer cli, XtPointer call) +{ + deleteSelectedObjects(); + scheduleDeletion(); } - -/* -** Functional Description: -** TakeAction: -** This function is called under the following conditions: -** Cancel Button Clicked: -** We unmanage the dialog and return doing nothing else. -** Apply Button Clicked: -** We decode the selection and if it exists, delete the corresponding -** graphical object. -** Ok Button Clicked: -** Same as apply, but after words we unmanage the dialog. -** Double clicked name or CR in text field: -** indistinguishable from default button which is Ok. -** These cases are distinguishable by looking at the call data which -** contains a reason field defined as follows: -** XmCR_APPLY - apply button clicked. -** XmCR_CANCEL - Cancel button clicked. -** XmCR_OK - OK button clicked. -** The XmCR_NOMATCH option is not enabled at this time... and triggers -** a bug message for now. -** Formal Parameters: -** XMWidget *w: -** Actually points to an XMSelectionDialog widget which is invoking the -** callback. -** XtPointer ud: -** Unused user data. -** XtPointer cd: -** Call data which in this case is a pointer to an -** XmSelectionBoxCallbackStruct. +/*! + Handles the apply button. Same as the + OkPressed member but does not schedule deletion: */ -static void TakeAction(XMWidget *w, XtPointer ud, XtPointer cd) +void +MultiGrobSelectionList::ApplyPressed(XMWidget* pWid, XtPointer cli, XtPointer call) { - /* First cast the argument list entries to approprate types: */ - - XMSelectionDialog *d = (XMSelectionDialog *)w; - XmSelectionBoxCallbackStruct *cbd = (XmSelectionBoxCallbackStruct *)cd; - - /* Get the spectrum id by looking at the current spectrum. */ - - - - /* Next we branch out depending on the type of the callback. If we have - ** a callback that we don't handle then that's considered a non fatal error - */ - - switch(cbd->reason) { - case XmCR_CANCEL: /* Cancel button clicked. */ - d->UnManage(); - break;; - case XmCR_OK: - if(DeleteObject(cbd->value, specid)) { - d->SetText(""); - d->UnManage(); - Xamine_RedrawSelectedPane(); - } - break; - case XmCR_APPLY: - if(DeleteObject(cbd->value, specid)) { - if(SetObjectList(d, specid) <= 0) d->UnManage(); - d->SetText(""); - Xamine_RedrawSelectedPane(); - } - break; - case XmCR_NO_MATCH: - Xamine_error_msg(Xamine_Getpanemgr(), - "Non-fatal-bug: NOMATCH callback reason present [delobj]."); - break; - default: - Xamine_error_msg(Xamine_Getpanemgr(), - "Non-fatal-bug: Invalid callback reason present [delobj]. "); - break; - } - return; + deleteSelectedObjects(); } +/*! + Cancel callback, on the other hand just schedules deletion. +*/ +void +MultiGrobSelectionList::CancelPressed(XMWidget* pWid, XtPointer cli, XtPointer call) +{ + scheduleDeletion(); +} - /* -** Functional Description: -** Xamine_DeleteObject: -** This function prompts for a graphical object to delete from the -** local graphical object database. Only summing regions and markers -** are elligible for deletion. Histogrammer contributed graphical -** objects may not be deleted since that would require coordination -** with the histogrammer which is not supported by the AEDTSK. -** Formal Parameters: -** XMWidget *w: -** Widget which invoked us.. most likely some button somewhere. -** Used as the parent widget for the dialog. -** XtPointer ud, cd: -** User and call data which are ignored. +** Set up a work procedure that deletes this object. THis is done to ensure that +** nothing on the call stack is actively referencing the objects or its member data +** when it's being deleted. */ -void Xamine_DeleteObject(XMWidget *w, XtPointer ud, XtPointer cd) +void +MultiGrobSelectionList::scheduleDeletion() { - /* Get the list of graphical objects. Note that if there are none, then */ - /* we pop up an error message and return. */ + XtAppContext context = XtWidgetToApplicationContext(this->getid()); + XtAppAddWorkProc(context, MultiGrobSelectionList::deleteCallback, + reinterpret_cast<XtPointer>(this)); +} +/* + * Called to delete the set of objects that are currently selected in the list box. + */ +void +MultiGrobSelectionList::deleteSelectedObjects() +{ + // Delete each object that's selected: - XMWidget *m = Xamine_Getpanemgr(); - win_attributed *a = Xamine_GetSelectedDisplayAttributes(); - if(a == NULL) { - Xamine_error_msg(m, - "There is no spectrum in this pane"); - return; - } - specid = a->spectrum(); - int nobject= Xamine_GetSpectrumObjectCount(specid); - if(nobject == 0) { - Xamine_error_msg(m, - "There are no grahpical objects on this spectrum"); - return; - } + int numSelected = GetSelectedListCount(); + XmStringTable selections = GetSelectedItems(); - - /* If the dialog is NULL, then it must be created. */ + for (int i=0; i < numSelected; i++) { - if(dialog == NULL) { - dialog = new XMSelectionDialog("Delete_Grobj", - *w, - "Object name or ID", - TakeAction); - /* Add callbacsk for cancel and help: */ + char* name; + XmStringGetLtoR(selections[i], XmFONTLIST_DEFAULT_TAG, &name); + int nObjects = Xamine_GetSpectrumObjectCount(m_spectrum); + grobj_generic** objects = new grobj_generic*[nObjects]; + Xamine_GetSpectrumObjects(m_spectrum, objects, nObjects, True); - dialog->AddCancelCallback(TakeAction); - dialog->GetHelpButton()->Enable(); - dialog->GetHelpButton()->AddCallback(Xamine_display_help, (XtPointer)&help); - + for (int j=0; j < nObjects; j++) { + grobj_name objName; + objects[j]->getname(objName); + if (strcmp(name, objName) == 0) { + Xamine_DeleteGrobj(m_spectrum, objects[j]->getid()); + break; + } + + } + + delete []objects; + + XtFree(name); } - /* Now set the list of objects and manage the selection box. */ + // Restock the list: - SetObjectList(dialog, specid); + stockList(m_spectrum); - dialog->Manage(); + // Redraw the spectrum window: + Xamine_RedrawSelectedPane(); } +/* +** Callback for to delete the dialog in a work proc. +*/ +Boolean +MultiGrobSelectionList::deleteCallback(XtPointer theObject) +{ + MultiGrobSelectionList* pObject = reinterpret_cast<MultiGrobSelectionList*>(theObject); + pObject->UnManage(); + delete pObject; + return True; +} +//////////////////////////////////////////////////////////////////////////////////////////// +// +/*! + Called in response to the delete object menu entry. All we need to do is create the + MultiGrobSelectionList object, manage it and let nature take its course. + @param widget (XMWidget*) - Encasulated widget of the menu entry. + Used to parent the dialog. + @param cd (XtPointer) - Client data, unused. + @param ud (XtPointer) - User data includes the event e.g.(also ignored). + +*/ +void +Xamine_DeleteObject(XMWidget* widget, XtPointer ud, XtPointer cd) +{ + XMWidget* pManager = Xamine_Getpanemgr(); + win_attributed* pAtt = Xamine_GetSelectedDisplayAttributes(); + if (pAtt == NULL) { + Xamine_error_msg(pManager, + "There is no spectrum in this pane"); + return; + } + + MultiGrobSelectionList* pObject = new MultiGrobSelectionList(*widget); + pObject->stockList(pAtt->spectrum()); + pObject->Manage(); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-05-18 19:33:47
|
Revision: 1609 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1609&view=rev Author: ron-fox Date: 2009-05-18 19:33:35 +0000 (Mon, 18 May 2009) Log Message: ----------- Get this compiled and working on lenny/g++-4.2 with minimal warnings. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Display/XMDialogs.cc trunk/SpecTcl/Display/XMDialogs.h trunk/SpecTcl/Display/XMLabel.cc trunk/SpecTcl/Display/XMLabel.h trunk/SpecTcl/Display/XMList.cc trunk/SpecTcl/Display/XMList.h trunk/SpecTcl/Display/XMManagers.cc trunk/SpecTcl/Display/XMManagers.h trunk/SpecTcl/Display/XMMenus.cc trunk/SpecTcl/Display/XMMenus.h trunk/SpecTcl/Display/XMPushbutton.cc trunk/SpecTcl/Display/XMPushbutton.h trunk/SpecTcl/Display/XMScale.cc trunk/SpecTcl/Display/XMScale.h trunk/SpecTcl/Display/XMSeparators.cc trunk/SpecTcl/Display/XMSeparators.h trunk/SpecTcl/Display/XMTab.cc trunk/SpecTcl/Display/XMTab.h trunk/SpecTcl/Display/XMText.cc trunk/SpecTcl/Display/XMText.h trunk/SpecTcl/Display/XMWidget.cc trunk/SpecTcl/Display/XMWidget.h trunk/SpecTcl/Display/Xamine.cc trunk/SpecTcl/Display/acceptgates.cc trunk/SpecTcl/Display/advprompt.cc trunk/SpecTcl/Display/attribdefault.cc trunk/SpecTcl/Display/axisdefault.cc trunk/SpecTcl/Display/buttondlg.cc trunk/SpecTcl/Display/buttonreq.cc trunk/SpecTcl/Display/checklist.cc trunk/SpecTcl/Display/checklist.h trunk/SpecTcl/Display/colormgr.cc trunk/SpecTcl/Display/colorset.cc trunk/SpecTcl/Display/compatspec.cc trunk/SpecTcl/Display/copier.cc trunk/SpecTcl/Display/copyatr.cc trunk/SpecTcl/Display/delgrob.cc trunk/SpecTcl/Display/dfltmgr.cc trunk/SpecTcl/Display/dispshare.h trunk/SpecTcl/Display/dispwind.cc trunk/SpecTcl/Display/errormsg.cc trunk/SpecTcl/Display/errormsg.h trunk/SpecTcl/Display/exit.cc trunk/SpecTcl/Display/expand.cc trunk/SpecTcl/Display/geometrymenu.cc trunk/SpecTcl/Display/grafinput.cc trunk/SpecTcl/Display/grafinput.h trunk/SpecTcl/Display/griprint.cc trunk/SpecTcl/Display/griprint.h trunk/SpecTcl/Display/grobfile.cc trunk/SpecTcl/Display/grobjinput.cc trunk/SpecTcl/Display/grobjinput.h trunk/SpecTcl/Display/grobjiomenu.cc trunk/SpecTcl/Display/guintegrate.cc trunk/SpecTcl/Display/helpmenu.cc trunk/SpecTcl/Display/info.cc trunk/SpecTcl/Display/lblfont.cc trunk/SpecTcl/Display/logging.cc trunk/SpecTcl/Display/logging.h trunk/SpecTcl/Display/marker.cc trunk/SpecTcl/Display/objcopy.cc trunk/SpecTcl/Display/optionmenu.h trunk/SpecTcl/Display/panemgr.cc trunk/SpecTcl/Display/printer.cc trunk/SpecTcl/Display/properties.cc trunk/SpecTcl/Display/ptlist.cc trunk/SpecTcl/Display/ptlist.h trunk/SpecTcl/Display/reducedefault.cc trunk/SpecTcl/Display/refreshdefault.cc trunk/SpecTcl/Display/rend1default.cc trunk/SpecTcl/Display/rend2default.cc trunk/SpecTcl/Display/spcchoice.cc trunk/SpecTcl/Display/spcdisplay.cc trunk/SpecTcl/Display/specchoose.cc trunk/SpecTcl/Display/spectra.cc trunk/SpecTcl/Display/sumregion.cc trunk/SpecTcl/Display/sumregion.h trunk/SpecTcl/Display/superprompt.cc trunk/SpecTcl/Display/titledefault.cc trunk/SpecTcl/Display/trackcursor.cc trunk/SpecTcl/Display/winiomenu.cc trunk/SpecTcl/Display/winiomenu.h trunk/SpecTcl/Display/wysiwygPrint.cc trunk/SpecTcl/EventSource/PipeFile.cpp trunk/SpecTcl/EventSource/TapeException.h trunk/SpecTcl/Events/EventFormatError.cpp trunk/SpecTcl/NSCLException/StateException.cpp trunk/SpecTcl/NSCLException/StateException.h trunk/SpecTcl/NSCLException/StreamIOError.cpp trunk/SpecTcl/NSCLException/StreamIOError.h trunk/SpecTcl/Sorter/CSpectrum2Dm.cpp trunk/SpecTcl/Sorter/CSpectrum2Dm.h trunk/SpecTcl/Sorter/DictionaryException.cpp trunk/SpecTcl/Sorter/SpectrumFactoryException.cpp trunk/SpecTcl/Sorter/SpectrumFactoryException.h trunk/SpecTcl/SpecTcl/ApplyCommand.cpp trunk/SpecTcl/SpecTcl/AttachCommand.cpp trunk/SpecTcl/SpecTcl/BindCommand.cpp trunk/SpecTcl/SpecTcl/ClearCommand.cpp trunk/SpecTcl/SpecTcl/DocumentationException.cpp trunk/SpecTcl/SpecTcl/FilterCommand.cpp trunk/SpecTcl/SpecTcl/GateCommand.cpp trunk/SpecTcl/SpecTcl/GateCommand.h trunk/SpecTcl/SpecTcl/GateFactory.cpp trunk/SpecTcl/SpecTcl/GateFactoryException.cpp trunk/SpecTcl/SpecTcl/GateFactoryException.h trunk/SpecTcl/SpecTcl/GatePackage.cpp trunk/SpecTcl/SpecTcl/Globals.cpp trunk/SpecTcl/SpecTcl/Makefile.am trunk/SpecTcl/SpecTcl/ParameterCommand.cpp trunk/SpecTcl/SpecTcl/PseudoCommand.cpp trunk/SpecTcl/SpecTcl/PseudoScript.cpp trunk/SpecTcl/SpecTcl/ScalerProcessorCallbacks.cpp trunk/SpecTcl/SpecTcl/SpectrumCommand.cpp trunk/SpecTcl/SpecTcl/SpectrumPackage.cpp trunk/SpecTcl/SpecTcl/TCLAnalyzer.cpp trunk/SpecTcl/SpecTcl/TapeCommand.cpp trunk/SpecTcl/SpecTcl/UnbindCommand.cpp trunk/SpecTcl/SpecTcl/WriteCommand.cpp trunk/SpecTcl/SpectrumIO/NSCLAsciiSpectrumFormatter.cpp trunk/SpecTcl/SpectrumIO/SpectrumFormatError.cpp trunk/SpecTcl/SpectrumIO/SpectrumFormatError.h trunk/SpecTcl/SpectrumIO/nsclbinerror.cpp trunk/SpecTcl/SpectrumIO/nsclbinerror.h trunk/SpecTcl/TCL/CLanguageTraceCallbacks.cpp trunk/SpecTcl/TCL/CLanguageTraceCallbacks.h trunk/SpecTcl/TCL/TCLException.cpp trunk/SpecTcl/TCL/TCLObjectProcessor.cpp trunk/SpecTcl/TCL/TCLTracedVariable.cpp trunk/SpecTcl/TCL/TCLTracedVariable.h trunk/SpecTcl/TCL/TCLVariable.cpp trunk/SpecTcl/TCL/TCLVariable.h trunk/SpecTcl/TCL/VariableTraceCallback.h trunk/SpecTcl/TestFiles/ltwrite.cpp trunk/SpecTcl/TestFiles/testfile.cpp trunk/SpecTcl/TreeParam/CTreeException.h trunk/SpecTcl/TreeParam/CTreeParameterArray.cpp trunk/SpecTcl/Xamine/XamineButtonException.cpp trunk/SpecTcl/Xamine/XamineGateException.cpp trunk/SpecTcl/Xamine/Xamineplus.cpp trunk/SpecTcl/calibratedparams/CCalibratedParameter.cpp trunk/SpecTcl/configure.in trunk/SpecTcl/contrib/scriptable/CIntConfigParam.cpp Removed Paths: ------------- trunk/SpecTcl/NSCLException/BugCheck.cpp trunk/SpecTcl/NSCLException/BugCheck.h Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-05-18 14:49:57 UTC (rev 1608) +++ trunk/SpecTcl/CHANGELOG 2009-05-18 19:33:35 UTC (rev 1609) @@ -856,3 +856,8 @@ March 18, 2009 - Fix tkcon.tcl so it does not implement a clear command that interferes with the SpecTcl clear command. March 24, 2009 - Make the delgrob dialog a multiselect. + May 1, 2009 - CSpectrum2Dm.{h,cpp} Ensure these spectra get put in the + don't need a parameter list rather than some need a parameter list + which causes them to be grossly underincremented. +pre3: + May 2009 - Port to debian lenny with minimized compiler warnings. \ No newline at end of file Modified: trunk/SpecTcl/Display/XMDialogs.cc =================================================================== --- trunk/SpecTcl/Display/XMDialogs.cc 2009-05-18 14:49:57 UTC (rev 1608) +++ trunk/SpecTcl/Display/XMDialogs.cc 2009-05-18 19:33:35 UTC (rev 1609) @@ -47,8 +47,27 @@ #include <assert.h> #include <string.h> #include <ctype.h> + + /* +** This page contains help texts which are defaults for the self contained +** dialog objects. +*/ + +static const char *prompter_help[] = { + "You are being prompted for some text. Type the text in the text window.\n", + " When you have edited the text to look like what you want click: \n\n", + " Ok - To accept the text and remove the dialog.\n", + " Apply - To accept the text and leave the dialog displayed \n", + " Cancel- To cancel dismiss the dialog without accepting the text\n", + " Help - To display this message\n", + NULL +}; + + + +/* ** Functional Description: ** StripNonPrinting: ** Creates an output string which consists of the input string with all @@ -59,7 +78,7 @@ ** char* in: ** input string. */ -static void StripNonPrinting(char* out, char* in) +static void StripNonPrinting(char* out, const char* in) { int len = strlen(in); for(int i = 0; i < len; i++) { @@ -98,58 +117,881 @@ } /* -** Method Description: -** SetSelectionList - This function sets the selection list for a -** SelectionDialog object. -** In the special case that list_count == 0, -** We set the selection list pointer to NULL and -** zero the count. +** Implementation of functions previously implemented in XMDialogs.h +** in an attempt to get this to build on Tru64 +*/ + +void +XMMessageBox::GetButtons() +{ + Widget wid; + wid = XmMessageBoxGetChild(id, XmDIALOG_OK_BUTTON); + okbutton = new XMPushButton(wid); + + wid = XmMessageBoxGetChild(id, XmDIALOG_CANCEL_BUTTON); + cancelbutton = new XMPushButton(wid); + + wid = XmMessageBoxGetChild(id, XmDIALOG_HELP_BUTTON); + helpbutton = new XMPushButton(wid); +} + +XMMessageBox::~XMMessageBox() +{ + delete okbutton; + delete cancelbutton; + delete helpbutton; +} + +XMMessageBox::XMMessageBox(const char *n) : + XMManagedWidget(n) +{} + +XMMessageBox::XMMessageBox(Widget w) : + XMManagedWidget(w) +{ + GetButtons(); +} + +XMPushButton* +XMMessageBox::GetOkButton() +{ + return okbutton; +} + +XMPushButton* +XMMessageBox::GetCancelButton() +{ + return cancelbutton; +} + +XMPushButton* +XMMessageBox::GetHelpButton() +{ + return helpbutton; +} + +void +XMMessageBox::SetText(const char *txt) +{ + XmString s = XmStringCreateLtoR(const_cast<char*>(txt), + const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNmessageString, s); + XmStringFree(s); +} + +Callback_data* +XMMessageBox::AddOkCallback(void (*cb)(XMWidget *w, + XtPointer, + XtPointer), + XtPointer cd) +{ + return AddCallback(XmNokCallback, cb, cd); +} + +Callback_data* +XMMessageBox::AddCancelCallback(void (*cb)(XMWidget *w, + XtPointer, + XtPointer), + XtPointer cd) +{ + return AddCallback(XmNcancelCallback, cb, cd); +} + +void +XMMessageBox::LabelCancelButton(const char *txt) +{ + XmString str = XmStringCreateLtoR(const_cast<char*>(txt), + const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNcancelLabelString, str); + XmStringFree(str); +} + +void +XMMessageBox::LabelOkButton(const char *txt) +{ + XmString str = XmStringCreateLtoR(const_cast<char*>(txt), + const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNokLabelString, str); + XmStringFree(str); +} + +void +XMMessageBox::LabelHelpButton(const char *txt) +{ + helpbutton->Label(txt); +} + +void +XMMessageBox::DefaultToOk() +{ + SetAttribute(XmNdefaultButtonType, + XmDIALOG_OK_BUTTON); +} + +void +XMMessageBox::DefaultToCancel() +{ + SetAttribute(XmNdefaultButtonType, + XmDIALOG_CANCEL_BUTTON); +} + +void +XMMessageBox::DefaultToHelp() +{ + SetAttribute(XmNdefaultButtonType, + XmDIALOG_HELP_BUTTON); +} + +void +XMMessageBox::Show() +{ + Manage(); + Widget shell = XtParent(id); + XtPopup(shell, XtGrabNone); + Window w = XtWindow(shell); + Display* d = XtDisplay(shell); + XRaiseWindow(d,w); +} + +void +XMMessageBox::Hide() +{ + UnManage(); +} + +void +XMMessageBox::SetModal(unsigned char modality) +{ + SetAttribute(XmNdialogStyle, modality); +} + + + +/* +** Functions for class XMErrorDialog +*/ + +XMErrorDialog::XMErrorDialog(const char *n, Widget parent, const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + id = XmCreateErrorDialog(parent, + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMErrorDialog::XMErrorDialog(const char *n, XMWidget &parent, const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount): + XMMessageBox(n) +{ + id = XmCreateErrorDialog(parent.getid(), + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMErrorDialog::XMErrorDialog(Widget w) : + XMMessageBox(w) +{} + + + + +/* +** Functions for class XMInformationDialog +*/ + +XMInformationDialog::XMInformationDialog(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer) , + XtPointer cbd, + ArgList list, + Cardinal argcount) : + XMMessageBox(n) +{ + id = XmCreateInformationDialog(parent, + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMInformationDialog::XMInformationDialog(const char *n, XMWidget &parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer) , + XtPointer cbd, + ArgList list, + Cardinal argcount) : + XMMessageBox(n) +{ + id = XmCreateInformationDialog( + parent.getid(), + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMInformationDialog::XMInformationDialog(Widget w) : + XMMessageBox(w) +{} + + + +/* +** Functions from class XMMessageDialog +*/ + +XMMessageDialog::XMMessageDialog(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + id = XmCreateMessageDialog(parent, + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMMessageDialog::XMMessageDialog(const char *n, XMWidget &parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + id = XmCreateMessageDialog(parent.getid(), + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMMessageDialog::XMMessageDialog(Widget w) : + XMMessageBox(w) +{} + + + +/* +** Functions for class XMQuestionDialog +*/ + +void +XMQuestionDialog::Create(const char *n,Widget parent, const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) +{ + id = XmCreateQuestionDialog(parent, + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Yes"); + LabelCancelButton("No"); + helpbutton->Disable(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMQuestionDialog::XMQuestionDialog(const char *n,Widget parent, const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n, parent, msg, cb, cbd, list, argcount); +} + +XMQuestionDialog::XMQuestionDialog(const char *n, XMWidget &parent, char const *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n, parent.getid(), msg, cb, cbd, list, argcount); +} + +XMQuestionDialog::XMQuestionDialog(Widget w) : + XMMessageBox(w) +{} + + + +/* +** Functional Description: +** XMQuestioner::XMQuestioner: +** This method instantiates a dialog which poses a yes/no question +** The XMQuestioner class includes self contained behavior in the +** sense that the two buttons (labelled Yes and No by default) are +** associated with callback which are methods of the object. ** Formal Parameters: -** Cardinal list_count: -** The number of list items. -** char **selections: -** The set of selections to enter in the box. +** char *n: +** Name of the question dialog widget.. also shown in the title part of +** the widget banner. +** XMWidget parent: +** Widget &parent: +** Widget which is the parent of this widget. +** char *msg: +** Contains message text displayed in the dialog. This should be a +** question with a yes or no answer or the buttons should be re-labelled +** with the appropriate two answers. +** XtPointer cbd: +** Callback data which is passed to the Yes and No callback functions. +** Arglist list: +** Pointer to list of resources to override default widget resources +** Cardinal argcount: +** Number of resource entries in 'list' */ -void XMSelectionDialog::SetSelectionList(Cardinal list_count, - char **selections) +XMQuestioner::XMQuestioner(const char *n, Widget parent, const char *msg, XtPointer cbd, + ArgList list, Cardinal argcount) : + XMQuestionDialog(n, parent, msg, + NULL, cbd, list, + argcount) , + yescallback(this) , + nocallback(this) { - XmString *list; /* The LtoR'd strings. */ - XmString *l; - char **s; + yescallback.Register(this, XmNokCallback, &XMQuestioner::Yescb, cbd); + nocallback.Register(this, XmNcancelCallback, &XMQuestioner::Nocb, cbd); + +} +XMQuestioner::XMQuestioner(const char *n, XMWidget &parent, const char *msg, XtPointer cbd, + ArgList list, Cardinal argcount) : + XMQuestionDialog(n, parent, msg, + NULL, cbd, list, + argcount) , + yescallback(this) , + nocallback(this) +{ + yescallback.Register(this, XmNokCallback, &XMQuestioner::Yescb, cbd); + nocallback.Register(this, XmNcancelCallback, &XMQuestioner::Nocb, cbd); + +} - /* Handle special list_count == 0 case */ - /* Transform the chars to compound strings: */ + +/* +** Functional Description: +** XMQuestioner::~XMQuestioner: +** Destroys an instance of a questioner class. +*/ +XMQuestioner::~XMQuestioner() +{ + yescallback.UnRegister(); + nocallback.UnRegister(); +} + +/* +** Functional Descriptions: +** XMQuestioner::Yescb: +** Virtual function called when the yes button is pressed. +** default action is to unmanage the dialog box. This function +** is usually overridden. +** XMQuestioner::Nocb: +** Virtual method called when the no button is pressed. +** default action is to unmanage the dialog box. This function +** is sometimes overridden. +** Formal Parameters: +** XMWidget *wid: +** The dialog widget itself. +** XtPointer userd: +** User data ignored by us. +** XtPointer calld: +** Callback data of the form XmAnyCallbackStruct. +*/ +void XMQuestioner::Yescb(XMWidget *wid, XtPointer userd, XtPointer calld) +{ + UnManage(); +} + +void XMQuestioner::Nocb(XMWidget *wid, XtPointer userd, XtPointer calld) +{ + UnManage(); +} + +/* +** Functions for class XMWarningDialog +*/ + + +void +XMWarningDialog::Create(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) +{ + id = XmCreateWarningDialog(parent, + name, + list, + argcount); + SetText(msg); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + GetButtons(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + + +XMWarningDialog::XMWarningDialog(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n,parent,msg,cb,cbd,list,argcount); +} + +XMWarningDialog::XMWarningDialog(const char *n, XMWidget &parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n,parent.getid(),msg,cb,cbd,list,argcount); + +} + +XMWarningDialog::XMWarningDialog(Widget w) : + XMMessageBox(w) +{} + +/* +** Functions for class XMWorkingDialog +*/ +void +XMWorkingDialog::Create(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd , + ArgList list, Cardinal argcount) +{ + id = XmCreateWorkingDialog(parent, + name, + list, + argcount); + SetText(msg); + GetButtons(); + LabelOkButton("Dismiss"); + cancelbutton->Disable(); + helpbutton->Disable(); + GetButtons(); + if(cb) + AddOkCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} +XMWorkingDialog::XMWorkingDialog(const char *n,Widget parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd , + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n,parent,msg,cb,cbd,list,argcount); +} + +XMWorkingDialog::XMWorkingDialog(const char *n, XMWidget &parent, + const char *msg, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMMessageBox(n) +{ + Create(n,parent.getid(),msg,cb,cbd,list,argcount); + +} + +XMWorkingDialog::XMWorkingDialog(Widget w) : + XMMessageBox(w) +{} + + + +/* +** Implementation of functions from class XMSelection +*/ +void +XMSelection::GetButtons() +{ + Widget wid; + wid = XmSelectionBoxGetChild(id, XmDIALOG_OK_BUTTON); + okbutton = new XMPushButton(wid); - if(list_count == 0) { - list = NULL; - } - else { + wid = XmSelectionBoxGetChild(id, XmDIALOG_CANCEL_BUTTON); + cancelbutton = new XMPushButton(wid); + + wid = XmSelectionBoxGetChild(id, XmDIALOG_HELP_BUTTON); + helpbutton = new XMPushButton(wid); + + applybutton = new XMPushButton(XmSelectionBoxGetChild + (id, XmDIALOG_APPLY_BUTTON)); +} - l = list = (XmString *)XtMalloc(list_count*sizeof(XmString)); - s = selections; - for(int i = 0; i < list_count; i++) { - char* stripped = new char[strlen(*s) + 1]; - StripNonPrinting(stripped, *s); - *l++ = XmStringCreateSimple(stripped); - s++; - delete []stripped; - } - } - /* Set the resources: */ +XMSelection::XMSelection(const char *name) : XMMessageBox(name) {} - XtVaSetValues(id, XmNlistItems, list, - XmNlistItemCount, list_count, - NULL); - - if(list_count) { - l = list; - for(int i = 0; i < list_count; i++) - XmStringFree(*l++); - XtFree((char *)list); - } +XMSelection::XMSelection(Widget w) : + XMMessageBox(w) +{ + GetButtons(); } + +XMSelection::~XMSelection() +{ + delete applybutton; +} + +void +XMSelection::SetTextWidth(Cardinal n) { + SetAttribute(XmNtextColumns, (short)n); +} + +Callback_data* +XMSelection::AddDoCallback(void (*cb)(XMWidget *, /* Do callbacks are */ + XtPointer, /* attached to both the ok */ + XtPointer), /* and the apply button. */ + XtPointer client_data , + Callback_data **apply ) +{ + Callback_data *apcb; + apcb = AddCallback(XmNapplyCallback, cb, client_data); + if (apply != NULL) *apply = apcb; + return AddCallback(XmNokCallback, cb, client_data); +} + +Callback_data* +XMSelection::AddApplyCallback(void (*cb)(XMWidget *, + XtPointer, + XtPointer), + XtPointer client_data ) +{ + return AddCallback(XmNapplyCallback, cb, client_data); +} + +XMPushButton* +XMSelection::GetApplyButton() +{ + return applybutton; +} + +void +XMSelection::SetText(const char *txt) +{ + XmString s = XmStringCreateLtoR(const_cast<char*>(txt), const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNtextString, s); + XmStringFree(s); +} + +void +XMSelection::SetLabelString(const char *txt) +{ + XmString s = XmStringCreateLtoR(const_cast<char*>(txt), + const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNselectionLabelString, s); + XmStringFree(s); +} + +void +XMSelection::LabelApplyButton(const char *txt) +{ + XmString str = XmStringCreateLtoR(const_cast<char*>(txt), + const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNapplyLabelString, str); + XmStringFree(str); +} + +void +XMSelection::DefaultToOk() +{ + SetAttribute(XmNdefaultButton, okbutton->getid()); +} + +void +XMSelection::DefaultToCancel() +{ + SetAttribute(XmNdefaultButton, cancelbutton->getid()); +} + +void +XMSelection::DefaultToHelp() +{ + SetAttribute(XmNdefaultButton, helpbutton->getid()); +} + +void +XMSelection::DefaultToApply() +{ + SetAttribute(XmNdefaultButton, applybutton->getid()); +} + + +/* +** Implementation of functions from class XMPromptDialog +*/ + +void +XMPromptDialog::Create(const char *n, Widget parent, + const char *prompt, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) +{ + id = XmCreatePromptDialog(parent, name, + list, argcount); + GetButtons(); + if(prompt) SetLabelString(prompt); + helpbutton->Disable(); + if(cb) AddDoCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMPromptDialog::XMPromptDialog(const char *n, Widget parent, + const char *prompt, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, Cardinal argcount) : + XMSelection(n) +{ + Create(n, parent, prompt, cb, cbd, list, argcount); +} + +XMPromptDialog::XMPromptDialog(const char *n, XMWidget &parent, + const char *prompt, + void (*cb)(XMWidget *, + XtPointer, XtPointer) , + XtPointer cbd , + ArgList list , Cardinal argcount ) : + XMSelection(n) +{ + Create(n, parent.getid(), prompt, cb, cbd, list, argcount); +} + +XMPromptDialog::XMPromptDialog(Widget w) : + XMSelection(w) +{ } + +void +XMPromptDialog::GetButtons() +{ + Widget w; + w = XmSelectionBoxGetChild(id, XmDIALOG_HELP_BUTTON); + helpbutton = new XMPushButton(w); + + w = XmSelectionBoxGetChild(id, XmDIALOG_CANCEL_BUTTON); + cancelbutton = new XMPushButton(w); + + w = XmSelectionBoxGetChild(id, XmDIALOG_APPLY_BUTTON); + applybutton = new XMPushButton(w); + + w = XmSelectionBoxGetChild(id, XmDIALOG_OK_BUTTON); + okbutton = new XMPushButton(w); +} + + + +/* +** Functions that implement XMPrompter: +*/ +void +XMPrompter::Create(const char *name, + const char *prompt, + XtPointer calldata) +{ + /* Register the callbacks: */ + + ok.Register(this, XmNokCallback,&XMPrompter::OkCallback, calldata); + apply.Register(this, XmNapplyCallback, &XMPrompter::ApplyCallback, calldata); + cancel.Register(this, XmNcancelCallback, + &XMPrompter::CancelCallback, calldata); + help.Register(helpbutton, XmNactivateCallback, &XMPrompter::HelpCallback, + calldata); + + /* Register the default help text: */ + + + help_info.name = "Prompt_Help"; + help_info.dialog = NULL; + help_info.text = prompter_help; + + // Enale the help button: + + helpbutton->Enable(); +} + +/* +** Functional Description: +** XMPrompter::XMPrompter: +** This method constructs a new prompter object. The object is +** selfcontained in the sense that callbacks are mapped to method +** functions. There are two instantiators that work essentially +** the same way. The only difference is whether or not the parent +** widget is an objectified widget or an Xt Widget handle. +** Formal Parameters: +** char *name: +** Name of the widget. +** XMWidget &parent +** or Widget parent: +** Identifies the parent widget for this object. +** char *prompt: +** Points to the string which specifies the prompt, if non NULL. +** XtPointer calldata: +** Optional User data which will be passed to callback routines. +*/ +XMPrompter::XMPrompter(const char *name, Widget parent, + const char *prompt, + XtPointer calldata) : + XMPromptDialog(name, parent, prompt), + ok(this), + apply(this), + cancel(this), + help(this) +{ + + Create(name, prompt, calldata); +} +XMPrompter::XMPrompter(const char *name, XMWidget &parent, const char *prompt, + XtPointer calldata) : + XMPromptDialog(name, parent, prompt), + ok(this), + apply(this), + cancel(this), + help(this) +{ + Create(name, prompt, calldata); +} /* +** Functional Description: +** XMPrompter::~XMPrompter: +** This method is used to destroy a prompter. All of the callbacks +** must be unregistersed, and the help widget, if it exists must +** also be deleted. +*/ +XMPrompter::~XMPrompter() +{ + ok.UnRegister(); + apply.UnRegister(); + cancel.UnRegister(); + help.UnRegister(); + + if(help_info.dialog) delete help_info.dialog; + +} + +/* +** Functional Description: +** XMPrompter::SetHelpText: +** This function allows the user to set a dialog specific help text +** in for the prompter object. +** Formal Parameters: +** char **newhelp +** List of null terminated text strings to display in the dialog. +** The last string pointer should be NULL. +*/ +void XMPrompter::SetHelpText(const char **new_help) +{ + help_info.text = new_help; +} +/* +** Functional Description: +** XMPrompter::RevertHelpText: +** Revert to standard 'generic' help text. +*/ +void XMPrompter::RevertHelpText() +{ + help_info.text = prompter_help; +} + + + + + +/* ** Method Description: ** FileListDialog::GetDirectory - Get the current search directory for ** a file selectionbox. @@ -164,7 +1006,8 @@ GetAttribute(XmNdirectory, &dir_compound); - XmStringGetLtoR(dir_compound, XmSTRING_DEFAULT_CHARSET, &directory); + XmStringGetLtoR(dir_compound, + const_cast<char*>(XmSTRING_DEFAULT_CHARSET), &directory); XmStringFree(dir_compound); return directory; } @@ -181,7 +1024,8 @@ char *mask; GetAttribute(XmNdirMask, &mask_compound); - XmStringGetLtoR(mask_compound, XmSTRING_DEFAULT_CHARSET, &mask); + XmStringGetLtoR(mask_compound, + const_cast<char*>(XmSTRING_DEFAULT_CHARSET), &mask); XmStringFree(mask_compound); return mask; } @@ -201,7 +1045,8 @@ char *mask; GetAttribute(XmNdirSpec, &search_compound); - XmStringGetLtoR(search_compound, XmSTRING_DEFAULT_CHARSET, &mask); + XmStringGetLtoR(search_compound, + const_cast<char*>(XmSTRING_DEFAULT_CHARSET), &mask); XmStringFree(search_compound); return mask; } @@ -225,7 +1070,8 @@ ** Cardinal num_args: ** Count of resource argumnts which will be applied to the shell. */ -void XMCustomDialog::CreateDialog(char *name, Widget parent, char *title, +void XMCustomDialog::CreateDialog(const char *name, Widget parent, + const char *title, ArgList l, Cardinal num_args) { @@ -357,136 +1203,9 @@ shell_child->UnManage(); XtPopdown(id); } - -/* -** This page contains help texts which are defaults for the self contained -** dialog objects. -*/ -static char *prompter_help[] = { - "You are being prompted for some text. Type the text in the text window.\n", - " When you have edited the text to look like what you want click: \n\n", - " Ok - To accept the text and remove the dialog.\n", - " Apply - To accept the text and leave the dialog displayed \n", - " Cancel- To cancel dismiss the dialog without accepting the text\n", - " Help - To display this message\n", - NULL -}; - /* ** Functional Description: -** XMPrompter::XMPrompter: -** This method constructs a new prompter object. The object is -** selfcontained in the sense that callbacks are mapped to method -** functions. There are two instantiators that work essentially -** the same way. The only difference is whether or not the parent -** widget is an objectified widget or an Xt Widget handle. -** Formal Parameters: -** char *name: -** Name of the widget. -** XMWidget &parent -** or Widget parent: -** Identifies the parent widget for this object. -** char *prompt: -** Points to the string which specifies the prompt, if non NULL. -** XtPointer calldata: -** Optional User data which will be passed to callback routines. -*/ -XMPrompter::XMPrompter(char *name, Widget parent, char *prompt, - XtPointer calldata) : - XMPromptDialog(name, parent, prompt), - ok(this), - apply(this), - cancel(this), - help(this) -{ - /* Register the callbacks: */ - - ok.Register(this, XmNokCallback,&XMPrompter::OkCallback, calldata); - apply.Register(this, XmNapplyCallback, &XMPrompter::ApplyCallback, calldata); - cancel.Register(this, XmNcancelCallback, - &XMPrompter::CancelCallback, calldata); - help.Register(helpbutton, XmNactivateCallback, &XMPrompter::HelpCallback, - calldata); - - /* Register the default help text: */ - - - help_info.name = "Prompt_Help"; - help_info.dialog = NULL; - help_info.text = prompter_help; -} -XMPrompter::XMPrompter(char *name, XMWidget &parent, char *prompt, - XtPointer calldata) : - XMPromptDialog(name, parent, prompt), - ok(this), - apply(this), - cancel(this), - help(this) -{ - /* Register the callbacks: */ - - ok.Register(this, XmNokCallback, &XMPrompter::OkCallback, calldata); - apply.Register(this, XmNapplyCallback, &XMPrompter::ApplyCallback, calldata); - cancel.Register(this, XmNcancelCallback, &XMPrompter::CancelCallback, calldata); - help.Register(helpbutton, XmNactivateCallback, &XMPrompter::HelpCallback, calldata); - - /* Register the default help text: */ - - - help_info.name = "Prompt_Help"; - help_info.dialog = NULL; - help_info.text = prompter_help; - - /* If we have help we should enable the help button: */ - - helpbutton->Enable(); -} - -/* -** Functional Description: -** XMPrompter::~XMPrompter: -** This method is used to destroy a prompter. All of the callbacks -** must be unregistersed, and the help widget, if it exists must -** also be deleted. -*/ -XMPrompter::~XMPrompter() -{ - ok.UnRegister(); - apply.UnRegister(); - cancel.UnRegister(); - help.UnRegister(); - - if(help_info.dialog) delete help_info.dialog; - -} - -/* -** Functional Description: -** XMPrompter::SetHelpText: -** This function allows the user to set a dialog specific help text -** in for the prompter object. -** Formal Parameters: -** char **newhelp -** List of null terminated text strings to display in the dialog. -** The last string pointer should be NULL. -*/ -void XMPrompter::SetHelpText(char **new_help) -{ - help_info.text = new_help; -} -/* -** Functional Description: -** XMPrompter::RevertHelpText: -** Revert to standard 'generic' help text. -*/ -void XMPrompter::RevertHelpText() -{ - help_info.text = prompter_help; -} - -/* -** Functional Description: ** XMPrompter::Perform: ** This function is meant to be overridden by the person specializing ** this dialog. The override should perform the application specific @@ -575,102 +1294,143 @@ { Xamine_display_help( this, &help_info, NULL); } - + + /* -** Functional Description: -** XMQuestioner::XMQuestioner: -** This method instantiates a dialog which poses a yes/no question -** The XMQuestioner class includes self contained behavior in the -** sense that the two buttons (labelled Yes and No by default) are -** associated with callback which are methods of the object. -** Formal Parameters: -** char *n: -** Name of the question dialog widget.. also shown in the title part of -** the widget banner. -** XMWidget parent: -** Widget &parent: -** Widget which is the parent of this widget. -** char *msg: -** Contains message text displayed in the dialog. This should be a -** question with a yes or no answer or the buttons should be re-labelled -** with the appropriate two answers. -** XtPointer cbd: -** Callback data which is passed to the Yes and No callback functions. -** Arglist list: -** Pointer to list of resources to override default widget resources -** Cardinal argcount: -** Number of resource entries in 'list' +** Implementation of functions from class XMSelectionDialog */ -XMQuestioner::XMQuestioner(char *n, Widget parent, char *msg, XtPointer cbd, - ArgList list, Cardinal argcount) : - XMQuestionDialog(n, parent, msg, - NULL, cbd, list, - argcount) , - yescallback(this) , - nocallback(this) + +void +XMSelectionDialog::Create(const char *n, Widget parent, const char *prompt, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, + Cardinal argcount) { - yescallback.Register(this, XmNokCallback, &XMQuestioner::Yescb, cbd); - nocallback.Register(this, XmNcancelCallback, &XMQuestioner::Nocb, cbd); - + id = XmCreateSelectionDialog(parent, name, + list, argcount); + GetButtons(); + if(prompt) SetLabelString(prompt); + helpbutton->Disable(); + if(cb) AddDoCallback(cb, cbd); + Manage(); + XtPopup(XtParent(id), XtGrabNone); } -XMQuestioner::XMQuestioner(char *n, XMWidget &parent, char *msg, XtPointer cbd, - ArgList list, Cardinal argcount) : - XMQuestionDialog(n, parent, msg, - NULL, cbd, list, - argcount) , - yescallback(this) , - nocallback(this) +XMSelectionDialog::XMSelectionDialog(const char *n, Widget parent, + const char *prompt , + void (*cb)(XMWidget *, + XtPointer, XtPointer) , + XtPointer cbd , + ArgList list , + Cardinal argcount ) : + XMSelection(n) { - yescallback.Register(this, XmNokCallback, &XMQuestioner::Yescb, cbd); - nocallback.Register(this, XmNcancelCallback, &XMQuestioner::Nocb, cbd); - + Create(n, parent, prompt, cb, cbd, list); } - -/* -** Functional Description: -** XMQuestioner::~XMQuestioner: -** Destroys an instance of a questioner class. -*/ -XMQuestioner::~XMQuestioner() +XMSelectionDialog::XMSelectionDialog(const char *n, XMWidget &parent, + const char *prompt , + void (*cb)(XMWidget *, + XtPointer, XtPointer) , + XtPointer cbd, + ArgList list, + Cardinal argcount) : + XMSelection(n) { - yescallback.UnRegister(); - nocallback.UnRegister(); + + Create(n, parent.getid(), prompt, cb, cbd, list); + } - + +XMSelectionDialog::XMSelectionDialog(Widget w) : + XMSelection(w) +{ } + +void +XMSelectionDialog::SetVisibleItemCount(Cardinal num_visible) +{ + SetAttribute(XmNvisibleItemCount, num_visible); +} + +void +XMSelectionDialog::RestrictChoices() +{ + SetAttribute(XmNmustMatch, True); +} + +void +XMSelectionDialog::NoRestrictChoices() +{ + SetAttribute(XmNmustMatch, (XtArgVal)False); +} + +Callback_data* +XMSelectionDialog::AddNoMatchCallback(void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer client_data ) +{ + return AddCallback(XmNnoMatchCallback, cb, client_data); +} + /* -** Functional Descriptions: -** XMQuestioner::Yescb: -** Virtual function called when the yes button is pressed. -** default action is to unmanage the dialog box. This function -** is usually overridden. -** XMQuestioner::Nocb: -** Virtual method called when the no button is pressed. -** default action is to unmanage the dialog box. This function -** is sometimes overridden. +** Method Description: +** SetSelectionList - This function sets the selection list for a +** SelectionDialog object. +** In the special case that list_count == 0, +** We set the selection list pointer to NULL and +** zero the count. ** Formal Parameters: -** XMWidget *wid: -** The dialog widget itself. -** XtPointer userd: -** User data ignored by us. -** XtPointer calld: -** Callback data of the form XmAnyCallbackStruct. +** Cardinal list_count: +** The number of list items. +** char **selections: +** The set of selections to enter in the box. */ -void XMQuestioner::Yescb(XMWidget *wid, XtPointer userd, XtPointer calld) +void XMSelectionDialog::SetSelectionList(Cardinal list_count, + const char **selections) { - UnManage(); + XmString *list; /* The LtoR'd strings. */ + XmString *l; + const char **s; + + /* Handle special list_count == 0 case */ + /* Transform the chars to compound strings: */ + + if(list_count == 0) { + list = NULL; + } + else { + + l = list = (XmString *)XtMalloc(list_count*sizeof(XmString)); + s = selections; + for(int i = 0; i < list_count; i++) { + char* stripped = new char[strlen(*s) + 1]; + StripNonPrinting(stripped, *s); + *l++ = XmStringCreateSimple(stripped); + s++; + delete []stripped; + } + } + /* Set the resources: */ + + XtVaSetValues(id, XmNlistItems, list, + XmNlistItemCount, list_count, + NULL); + + if(list_count) { + l = list; + for(int i = 0; i < list_count; i++) + XmStringFree(*l++); + XtFree((char *)list); + } } -void XMQuestioner::Nocb(XMWidget *wid, XtPointer userd, XtPointer calld) -{ - UnManage(); -} /* ** Default help text for selection box widgets.: */ -static char *SelectionDefaultHelp[] = { +static const char *SelectionDefaultHelp[] = { " You are being asked to select an item from the list of choices\n", "in the list box part of the widget. You can select an item either by\n", "clicking on it with the mouse or by typing it into the text input\n", @@ -682,7 +1442,38 @@ " Help - Will display this text\n", NULL }; + + /* +** Functions that implement the XMSelector dialog class. +*/ + +void +XMSelector::Create(const char *name, const char *prompt, + XtPointer cbd, ArgList list, Cardinal argcount) +{ + /* Register the callbacks... */ + + + okbuttonCB.Register(this, XmNokCallback, &XMSelector::OkCb, cbd); + applybuttonCB.Register(this, XmNapplyCallback, &XMSelector::ApplyCb, cbd); + cancelbuttonCB.Register(this, XmNcancelCallback, &XMSelector::CancelCb, cbd); + nomatchCB.Register(this, XmNnoMatchCallback, &XMSelector::NoMatchCb, cbd); + helpbuttonCB.Register(helpbutton, XmNactivateCallback, &XMSelector::HelpCb, cbd); + + /* Set up the help button with the default help text.: */ + + helpbutton->Enable(); + helpinfo.name = "SelectionHelp"; + helpinfo.dialog = (XMInformationDialog *)NULL; + helpinfo.text = SelectionDefaultHelp; + + /* Set the initial list values: */ + + SetupList(); +} + +/* ** Functional Description: ** XMSelector::XMSelector: ** This method constructs an instance of a self contained selector @@ -707,7 +1498,8 @@ ** Cardinal argcount: ** Number of override resource value pairs in list. */ -XMSelector::XMSelector(char *name, Widget parent, char *prompt, +XMSelector::XMSelector(const char *name, Widget parent, + const char *prompt, XtPointer cbd, ArgList list, Cardinal argcount) : XMSelectionDialog(name, parent, prompt, NULL, cbd, list, argcount), @@ -717,29 +1509,11 @@ helpbuttonCB(this), nomatchCB(this) { + Create(name, prompt, cbd, list, argcount); - /* Register the callbacks... */ - - - okbuttonCB.Register(this, XmNokCallback, &XMSelector::OkCb, cbd); - applybuttonCB.Register(this, XmNapplyCallback, &XMSelector::ApplyCb, cbd); - cancelbuttonCB.Register(this, XmNcancelCallback, &XMSelector::CancelCb, cbd); - nomatchCB.Register(this, XmNnoMatchCallback, &XMSelector::NoMatchCb, cbd); - helpbuttonCB.Register(helpbutton, XmNactivateCallback, &XMSelector::HelpCb, cbd); - - /* Set up the help button with the default help text.: */ - - helpbutton->Enable(); - helpinfo.name = "SelectionHelp"; - helpinfo.dialog = (XMInformationDialog *)NULL; - helpinfo.text = SelectionDefaultHelp; - - /* Set the initial list values: */ - - SetupList(); - } -XMSelector::XMSelector(char *name, XMWidget &parent, char *prompt, +XMSelector::XMSelector(const char *name, XMWidget &parent, + const char *prompt, XtPointer cbd, ArgList list, Cardinal argcount) : XMSelectionDialog(name, parent, prompt, NULL, cbd, list, argcount), @@ -749,27 +1523,8 @@ helpbuttonCB(this), nomatchCB(this) { + Create(name, prompt, cbd, list, argcount); - /* Register the callbacks... */ - - - okbuttonCB.Register(this, XmNokCallback, &XMSelector::OkCb, cbd); - applybuttonCB.Register(this, XmNapplyCallback, &XMSelector::ApplyCb, cbd); - cancelbuttonCB.Register(this, XmNcancelCallback, &XMSelector::CancelCb, cbd); - nomatchCB.Register(this, XmNnoMatchCallback, &XMSelector::NoMatchCb, cbd); - helpbuttonCB.Register(helpbutton, XmNactivateCallback, &XMSelector::HelpCb, cbd); - - /* Set up the help button with the default help text.: */ - - helpbutton->Enable(); - helpinfo.name = "SelectionHelp"; - helpinfo.dialog = (XMInformationDialog *)NULL; - helpinfo.text = SelectionDefaultHelp; - - /* Set up the initial list values: */ - - /* This should be done by a derived class. */ - } /* ** Functional Description: @@ -811,7 +1566,7 @@ ** char **newhelp: ** New help text. */ -void XMSelector::SetHelpText(char **newhelp) +void XMSelector::SetHelpText(const char **newhelp) { helpinfo.text = newhelp; } @@ -923,13 +1678,159 @@ { return True; } + + +/* +** Implementation of functions from class XMFileListDialog +*/ + + +void +XMFileListDialog::Create(const char *n, Widget parent, + const char *directory, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list, + Cardinal argcount) +{ + id = XmCreateFileSelectionDialog(parent, name, + list, argcount); + GetButtons(); + helpbutton->Disable(); + SetLabelString("Filename: "); + if(cb) AddDoCallback(cb, cbd); + + /* Set the search path directory: */ + + DoSearch(directory); + Manage(); + XtPopup(XtParent(id), XtGrabNone); +} + +XMFileListDialog::XMFileListDialog(const char *n, Widget parent, + const char* directory, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list , + Cardinal argcount ) : + XMSelection(n) +{ + Create(n, parent, directory, cb, cbd, list, argcount); +} + +XMFileListDialog::XMFileListDialog(const char *n, XMWidget &parent, + const char *directory, + void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer cbd, + ArgList list , + Cardinal argcount) : + XMSelection(n) +{ + Create(n, parent.getid(), directory, cb, cbd, list, argcount); + +} + +XMFileListDialog::XMFileListDialog(Widget w) : XMSelection(w) { } + +void +XMFileListDialog::DoSearch(XmString dir) +{ + SetAttribute(XmNdirMask, &dir); + XmFileSelectionDoSearch(id, dir); +} + +void +XMFileListDialog::DoSearch(const char *dir) +{ + char* pDir = const_cast<char*>(dir); + XmString d; + d = XmStringCreateLtoR(const_cast<char*>(pDir), const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + XmFileSelectionDoSearch(id, d); + XmStringFree(d); +} + +void +XMFileListDialog::DoSearch() +{ /* Do search on current mask. */ + XmString dirmask; /* Will hold the directory search mask. */ + GetAttribute(XmNdirMask, &dirmask); + + XmFileSelectionDoSearch(id, dirmask); + XmStringFree(dirmask); /* Get rid of dirmask. */ +} + +void +XMFileListDialog::SetLabelString(const char *txt) +{ + XmString s = XmStringCreateLtoR(const_cast<char*>(txt), const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + XtVaSetValues(XmFileSelectionBoxGetChild(id, + XmDIALOG_SELECTION_LABEL), + XmNlabelString, s, + NULL); + XmStringFree(s); +} + +void +XMFileListDialog::SetFilterString(const char *txt) +{ + XmString s = XmStringCreateLtoR(const_cast<char*>(txt), const_cast<char*>(XmSTRING_DEFAULT_CHARSET)); + SetAttribute(XmNfilterLabelString, s); + XmStringFree(s); +} + +void +XMFileListDialog::SetFileTypes(unsigned char fileset) +{ + SetAttribute(XmNfileTypeMask, fileset); +} + +void +XMFileListDialog::RestrictChoices() +{ + SetAttribute(XmNmustMatch, True); +} + +void +XMFileListDialog::NoRestrictChoices() +{ + SetAttribute(XmNmustMatch, (XtArgVal)False); +} + +Callback_data* +XMFileListDialog::AddNoMatchCallback(void (*cb)(XMWidget *, + XtPointer, XtPointer), + XtPointer client_data) +{ + return AddCallback(XmNnoMatchCallback, cb, client_data); +} + +void +XMFileListDialog:: GetButtons() +{ + helpbutton = new + XMPushButton(XmFileSelectionBoxGetChild(id, + XmDIALOG_HELP_BUTTON)); + cancelbutton = new + XMPushButton(XmFileSelectionBoxGetChild(id, + XmDIALOG_CANCEL_BUTTON)); + okbutton = new + XMPushButton(XmFileSelectionBoxGetChild(id, + XmDIALOG_OK_BUTTON)); + applybutton = new + XMPushButton(XmFileSelectionBoxGetChild(id, + XmDIALOG_APPLY_BUTTON)); +} + /* ** The methods in the pages which follow implement the functions of the ** XMFileSelector dialog. */ -static char *FileSelectorHelp[] = // Default help text for file selector. +static const char *FileSelectorHelp[] = // Default help text for file selector. { " You are being prompted a filename. If you know the complete name of\n", "the file, you can type it in at the text box at the bottom of the work\n", @@ -962,6 +1863,34 @@ }; /* + * Functions that implement the XMFileSelector + */ +void +XMFileSelector::Create(const char *n, Widget parent, + XtPointer calld, + const char *directory) +{ + /* Register the callbacks, note that apply is usurped for the filter + ** function (Motif's decision, not mine). + */ + + okcb.Register(this, XmNokCallback, &XMFileSelector::FilterCb, calld); + nomatchcb.Register(this, XmNnoMatchCallback, // Requires XmNmustMatch to be + &XMFileSelector::NomatchCb, calld); // True to invoke. + filtercb.Register(this, XmNapplyCallback, &XMFileSelector::FilterCb, calld); + cancelcb.Register(this, XmNcancelCallback, &XMFileSelector::CancelCb, calld); + helpcb.Register(this, XmNhelpCallback, &XMFileSelector::HelpCb, calld); + + /* Set up the help info data structure */ + + helpinfo.name = "File_Selection_Help"; + helpinfo.dialog = (XMInformationDialog *)NULL; + RevertHelpText(); + + helpbutton->Enable(); +} + +/* ** Functional Description: ** XMFileSelector::XMFileSelector: ** This method constructs an instance of a file selector dialog. @@ -995,8 +1924,8 @@ ** There is more than one constructor binding. */ -XMFileSelector::XMFileSelector(char *n, Widget parent, XtPointer calld, - char *directory) : +XMFileSelector::XMFileSelector(const char *n, Widget parent, XtPointer calld, + const char *directory) : XMFileListDialog(n, parent, directory), okcb(this), nomatchcb(this), @@ -1004,26 +1933,11 @@ cancelcb(this), helpcb(this) { - /* Register the callbacks, note that apply is usurped for the filter - ** function (Motif's decision, not mine). - */ - - okcb.Register(this, XmNokCallback, &XMFileSelector::FilterCb, calld); - nomatchcb.Register(this, XmNnoMatchCallback, // Requires XmNmustMatch to be - &XMFileSelector::NomatchCb, calld); // True to invoke. - filtercb.Register(this, XmNapplyCallback, &XMFileSelector::FilterCb, calld); - cancelcb.Register(this, XmNcancelCallback, &XMFileSelector::CancelCb, calld); - helpcb.Register(this, XmNhelpCallback, &XMFileSelector::HelpCb, calld); - - /* Set up the help info data structure */ - - helpinfo.name = "File_Selection_Help"; - helpinfo.dialog = (XMInformationDialog *)NULL; - RevertHelpText(); + Create(n, parent, calld, directory); } -XMFileSelector::XMFileSelector(char *n, XMWidget &parent, +XMFileSelector::XMFileSelector(const char *n, XMWidget &parent, XtPointer calld, - char *directory) : + const char *directory) : XMFileListDialog(n, parent, directory), okcb(this), nomatchcb(this), @@ -1031,26 +1945,8 @@ cancelcb(this), helpcb(this) { - /* Register the callbacks, note that apply is usurped for the filter - ** function (Motif's decision, not mine). - */ + Create(n, parent.getid(), calld, directory); - okcb.Register(this, XmNokCallback, &XMFileSelector::OkCb, calld); - nomatchcb.Register(this, XmNnoMatchCallback, // Requires XmNmustMatch to be - &XMFileSelector::NomatchCb, calld); // True to invoke. - filtercb.Register(this, XmNapplyCallback, &XMFileSelector::FilterCb, calld); - cancelcb.Register(this, XmNcancelCallback, &XMFileSelector::CancelCb, calld); - helpcb.Register(this, XmNhelpCallback, &XMFileSelector::HelpCb, calld); - - /* Set up the help info data structure */ - - helpinfo.name = "File_Selection_Help"; - helpinfo.dialog = (XMInformationDialog *)NULL; - RevertHelpText(); - - /* Enable the help button: */ - - helpbutton->Enable(); } /* @@ -1079,7 +1975,7 @@ ** This is a list of character string pointers terminated by a null ** pointer. Each string itself is Null terminated. */ -void XMFileSelector::SetHelpText(char **text) +void XMFileSelector::SetHelpText(const char **text) { helpinfo.text = text; } @@ -1166,7 +2062,7 @@ char *filename; - if(!XmStringGetLtoR(calldata->value, XmSTRING_DEFAULT_CHARSET, + if(!XmStringGetLtoR(calldata->value, const_cast<char*>(XmSTRING_DEFAULT_CHARSET), &filename)) { Xamine_error_msg(this, "XMFileSelector::OkCb Unable to retreive file name string"); @@ -1267,7 +2163,7 @@ ** it is really difficult to generically describe a custom dialog box, ** the user will typically have to replace this text using SetHelpText. */ -static char *custom_help[] = { +static const char *custom_help[] = { " This is a custom dialog box which was created by a programmer that was\n", "too lazy to supply detailed help text about what the dialog does. Since\n", "the work area of the dialog box could be almost anything, I cannot be\n", @@ -1285,7 +2181,111 @@ NULL }; + /* +** Implementation of functions from class XMCustomDialog +*/ + +XMCustomDialog::XMCustomDialog(const char *name, XMWidget &parent, const char *title, + ArgList l, Cardinal num_args) : + XMWidget(name) +{ + CreateDialog(name, parent.getid(), title, l, num_args); +} + +XMCustomDialog::XMCustomDialog(const char *name, Widget parent, + const char *title, + ArgList l, Cardinal num_args) : + XMWidget(name) +{ + CreateDialog(name, parent, title, l, num_args); +} + +XMCustomDialog::~XMCustomDialog() +{ + delete Ok; + delete Apply; + delete Cancel; + delete Help; + delete action_area; + delete work_area; + delete top_manager; + delete shell_child; +} + +XMPanedWindow* +XMCustomDialog::TopManager() { return top_manager; } + +XMRowColumn* +XMCustomDialog::ActionArea() { return action_area; } + +XMForm* +XMCustomDialog::WorkArea() { return work_area; } + +XMPushButton* +XMCustomDialog::ok() { return Ok; } + +XMPushButton* +XMCustomDialog::apply() { return Apply; } + +XMPushButton* +XMCustomDialog::cancel() { return Cancel; } + +XMPushButton* +XMCustomDialog::help() { return Help; } + +Callback_data* +XMCustomDialog::AddDoCallback(void (*callback)(XMWidget *, XtPointer, + XtPointer), + XtPointer user_data , + Callback_data **okcb ) +{ + Callback_data *okc; + okc = Ok->AddCallback(callback, user_data); + if(okcb != NULL) *okcb = okc; + return Apply->AddCallback(callback, user_data); +} + +Callback_data* +XMCustomDialog::AddOkCallback(void (*callback)(XMWidget *, XtPointer, + XtPointer), + XtPointer user_data) +{ return Ok->AddCallback(callback, user_data); } + +Callback_data* +XMCustomDialog::AddApplyCallback(void (*callback)(XMWidget *, XtPointer, + XtPointer), + XtPointer user_data) +{ return Apply->AddCallback(callback, user_data); } + +Callback_data* +XMCustomDialog::AddCancelCallback(void (*callback)(XMWidget *, XtPointer, + XtPointer), + XtPointer user_data ) +{ return Cancel->AddCallback(callback, user_data); } + +Callback_data* +XMCustomDialog::AddHelpCallback(void (*callback)(XMWidget *, XtPointer, + XtPointer), + XtPointer user_data) +{ return Help->AddCallback(callback, user_data); } + +void +XMCustomDialog::SetModal(unsigned char modality) +{ + shell_child->SetAttribute(XmNdialogStyle, modality); +} + + + + +void +XMCustomDialogBox::Initialize() +{ + SetCallbacks(); // Register the callbacks + InitializeHelp(); // And set the default help text. +} +/* ** Functional Description: ** XMCustomDialogBox: ** These functions instantiate a custom dialog box. A custom dialog @@ -1307,7 +2307,7 @@ ** Number of arguments in l. */ -XMCustomDialogBox::XMCustomDialogBox(char *name,XMWidget &parent, char *title, +XMCustomDialogBox::XMCustomDialogBox(const char *name,XMWidget &parent, const char *title, ArgList l, Cardinal num_args) : XMCustomDialog(name, parent, title, l, num_args), OkCb(this), @@ -1315,11 +2315,10 @@ CancelCb(this), HelpCb(this) { - SetCallbacks(); // Register the callbacks. - InitializeHelp(); // And set the default help text. + Initialize(); } -XMCustomDialogBox::XMCustomDialogBox(char *name, Widget parent, char *title, +XMCustomDialogBox::XMCustomDialogBox(const char* name, Widget parent, const char* title, ArgList l, Cardinal num_args) : XMCustomDialog(name, parent, title, l, num_args), OkCb(this), @@ -1327,8 +2326,7 @@ CancelCb(this), HelpCb(this) { - SetCallbacks(); // Register the callbacks. - InitializeHelp(); // And set the default help text. + Initialize(); } @@ -1362,7 +2360,7 @@ ** Points to the help text string list. */ -void XMCustomDialogBox::SetHelpText(char **help) +void XMCustomDialogBox::SetHelpText(const char **help) { help_info.text = help; // Set new help text. } @@ -1546,949 +2544,10 @@ HelpCb.Register(Help, XmNactivateCallback, &XMCustomDialogBox::HelpPressed, NULL); } -/* -** Implementation of functions previously implemented in XMDialogs.h -** in an attempt to get this to build on Tru64 -*/ -void -XMMessageBox::GetButtons() -{ - Widget wid; - wid = XmMessageBoxGetChild(id, XmDIALOG_OK_BUTTON); - okbutton = new XMPushButton(wid); - - wid = XmMessageBoxGetChild(id, XmDIALOG_CANCEL_BUTTON); - cancelbutton = new XMPushButton(wid); - - wid = XmMessageBoxGetChild(id, XmDIALOG_HELP_BUTTON); - helpbutton = new XMPushButton(wid); -} -XMMessageBox::~XMMessageBox() -{ - delete okbutton; - delete cancelbutton; - delete helpbutton; -} -XMMessageBox::XMMessageBox(char *n) : - XMManagedWidget(n) -{} -XMMessageBox::XMMessageBox(Widget w) : - XMManagedWidget(w) -{ - GetButtons(); -} -XMPushButton* -XMMessageBox::GetOkButton() -{ - return okbutton; -} -XMPushButton* -XMMessageBox::GetCancelButton() -{ - return cancelbutton; -} -XMPushButton* -XMMessageBox::GetHelpButton() -{ - return helpbutton; -} - -void -XMMessageBox::SetText(char *txt) -{ - XmString s = XmStringCreateLtoR(txt, - XmSTRING_DEFAULT_CHARSET); - SetAttribute(XmNmessageString, s); - XmStringFree(s); -} - -Callback_data* -XMMessageBox::AddOkCallback(void (*cb)(XMWidget *w, - XtPointer, - XtPointe... [truncated message content] |
From: <ro...@us...> - 2009-05-20 20:33:26
|
Revision: 1612 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1612&view=rev Author: ron-fox Date: 2009-05-20 20:33:15 +0000 (Wed, 20 May 2009) Log Message: ----------- Restore newlines stripped from multiline defs Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Gui/newGui.tcl Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-05-20 20:31:11 UTC (rev 1611) +++ trunk/SpecTcl/CHANGELOG 2009-05-20 20:33:15 UTC (rev 1612) @@ -860,4 +860,7 @@ don't need a parameter list rather than some need a parameter list which causes them to be grossly underincremented. pre3: - May 2009 - Port to debian lenny with minimized compiler warnings. \ No newline at end of file + May 2009 - Port to debian lenny with minimized compiler warnings. + May 20,2009 - In source files add back the newline after each lineof + a multiline command to prevent syntax errors on e.g. + pseudo defs. Modified: trunk/SpecTcl/Gui/newGui.tcl =================================================================== --- trunk/SpecTcl/Gui/newGui.tcl 2009-05-20 20:31:11 UTC (rev 1611) +++ trunk/SpecTcl/Gui/newGui.tcl 2009-05-20 20:33:15 UTC (rev 1612) @@ -187,7 +187,7 @@ set info [getLine $fd] set fragment [lindex $info 0] - append command $fragment + append command $fragment "\n" incr lineNumber [lindex $info 1] } # If we got here, the command is complete or we've This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-05-27 14:01:44
|
Revision: 1613 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1613&view=rev Author: ron-fox Date: 2009-05-27 14:01:36 +0000 (Wed, 27 May 2009) Log Message: ----------- Fixed error in handling gates from Xamine when on gamma 2ds... case fall through mis-handled. Also added exception handling when gate factory throws an exception. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/SpecTcl/XamineEventHandler.cpp Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-05-20 20:33:15 UTC (rev 1612) +++ trunk/SpecTcl/CHANGELOG 2009-05-27 14:01:36 UTC (rev 1613) @@ -864,3 +864,5 @@ May 20,2009 - In source files add back the newline after each lineof a multiline command to prevent syntax errors on e.g. pseudo defs. + May 27, 2009 - Fix error switch/case for handling gate point scaling. + gamma gates resulted in no points being accepted. \ No newline at end of file Modified: trunk/SpecTcl/SpecTcl/XamineEventHandler.cpp =================================================================== --- trunk/SpecTcl/SpecTcl/XamineEventHandler.cpp 2009-05-20 20:33:15 UTC (rev 1612) +++ trunk/SpecTcl/SpecTcl/XamineEventHandler.cpp 2009-05-27 14:01:36 UTC (rev 1613) @@ -303,11 +303,6 @@ UInt_t yIndex = 1; // For typcial 2d, this index into the switch(spType) { - case keG2D: // For a gamma all x transforms are first. - { - CGamma2DW* pGSpectrum = (CGamma2DW*)pSpec; - yIndex = pGSpectrum->getnParams(); - } case ke1D: case keG1D: { @@ -334,10 +329,17 @@ } break; + // + // Thist must be contiguous with the case for ke2D keG2dd!!! + // + case keG2D: // For a gamma all x transforms are first. + { + CGamma2DW* pGSpectrum = (CGamma2DW*)pSpec; + yIndex = pGSpectrum->getnParams(); + } case ke2D: case keG2DD: { - Float_t x,y(0.0); @@ -370,39 +372,59 @@ vector<string> Names; // vector to hold spectrum name which is passed to // GateFactory on gamma gates - switch(spType) { - case ke1D: - case ke2D: - for(pid = pIds.begin(); pid != pIds.end(); pid++) { - CParameter* pParam = m_pHistogrammer->FindParameter(*pid); - if(!pParam) { - cerr << "Spectrum parameter " << *pid << "has been deleted!!\n"; - return; + + try { + switch(spType) { + case ke1D: + case ke2D: + for(pid = pIds.begin(); pid != pIds.end(); pid++) { + CParameter* pParam = m_pHistogrammer->FindParameter(*pid); + if(!pParam) { + cerr << "Spectrum parameter " << *pid << "has been deleted!!\n"; + return; + } + Parameters.push_back(pParam->getName()); } - Parameters.push_back(pParam->getName()); - } - // Use the gate factory creation mechanism to produce a dynamically - // allocated SpecTcl gate: - pSpecTclGate = Factory.CreateGate(gType, Parameters, ScaledPoints); - break; - case keG1D: - case keG2D: - case keG2DD: - for(pid = pIds.begin(); pid != pIds.end(); pid++) { - CParameter* pParam = m_pHistogrammer->FindParameter(*pid); - if(!pParam) { - cerr << "Spectrum parameter " << *pid << "has been deleted!!\n"; - return; + // Use the gate factory creation mechanism to produce a dynamically + // allocated SpecTcl gate: + pSpecTclGate = Factory.CreateGate(gType, Parameters, ScaledPoints); + break; + case keG1D: + case keG2D: + case keG2DD: + for(pid = pIds.begin(); pid != pIds.end(); pid++) { + CParameter* pParam = m_pHistogrammer->FindParameter(*pid); + if(!pParam) { + cerr << "Spectrum parameter " << *pid << "has been deleted!!\n"; + return; + } } + pSpecTclGate = Factory.CreateGate(gType, ScaledPoints, pIds); + break; + default: + cerr << "Spectrum type cannot accept a gate!!\n"; + return; } - pSpecTclGate = Factory.CreateGate(gType, ScaledPoints, pIds); - break; - default: - cerr << "Spectrum type cannot accept a gate!!\n"; + + } + catch (CException& e) { + cerr << "Could not create a new gate" << e.ReasonText() << endl; return; } - - + catch (std::string& msg) { + cerr << "Exception caught while creating a new gate from Xamine\n"; + cerr << msg << endl; + return; + } + catch (const char* msg ) { + cerr << "An Exception was caught while creating a new gate from Xamine\n"; + cerr << msg << endl; + return; + } + catch (...) { + cerr << "An unexpected exception was caught while creating a new gate from Xamine\n"; + return; + } // Now that we have a gate, we must enter it into the histogrammer. // This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-08-13 10:26:26
|
Revision: 1623 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1623&view=rev Author: ron-fox Date: 2009-08-13 10:26:17 +0000 (Thu, 13 Aug 2009) Log Message: ----------- Fix error in strip chart spectra, require both parameters to be present. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Sorter/SpectrumS.cpp Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-08-13 10:25:54 UTC (rev 1622) +++ trunk/SpecTcl/CHANGELOG 2009-08-13 10:26:17 UTC (rev 1623) @@ -865,4 +865,6 @@ a multiline command to prevent syntax errors on e.g. pseudo defs. May 27, 2009 - Fix error switch/case for handling gate point scaling. - gamma gates resulted in no points being accepted. \ No newline at end of file + gamma gates resulted in no points being accepted. + August 13, 2009 - Fix error in Strip chart spectrum was not requiring + that target parameter was defined. \ No newline at end of file Modified: trunk/SpecTcl/Sorter/SpectrumS.cpp =================================================================== --- trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-08-13 10:25:54 UTC (rev 1622) +++ trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-08-13 10:26:17 UTC (rev 1623) @@ -420,7 +420,7 @@ CParameterValue& rParam(rEvent[m_nParameter]); - if(rTime.isValid()) { // Only increment if param present. + if(rTime.isValid() && rParam.isValid()) { // Only increment if params present. Int_t nChannel = (Int_t)ParameterToAxis(0, rTime)- m_nOffset; if (nChannel > m_nChannels ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-08-13 11:25:08
|
Revision: 1625 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1625&view=rev Author: ron-fox Date: 2009-08-13 11:25:01 +0000 (Thu, 13 Aug 2009) Log Message: ----------- Fix error in shiftup/down when shift is larger than spectrum. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Sorter/SpectrumS.cpp Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-08-13 10:40:24 UTC (rev 1624) +++ trunk/SpecTcl/CHANGELOG 2009-08-13 11:25:01 UTC (rev 1625) @@ -867,4 +867,6 @@ May 27, 2009 - Fix error switch/case for handling gate point scaling. gamma gates resulted in no points being accepted. August 13, 2009 - Fix error in Strip chart spectrum was not requiring - that target parameter was defined. \ No newline at end of file + that target parameter was defined. + - Fix error in strip chart shift. If shift is larger than spectrum + channel count would segfault. \ No newline at end of file Modified: trunk/SpecTcl/Sorter/SpectrumS.cpp =================================================================== --- trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-08-13 10:40:24 UTC (rev 1624) +++ trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-08-13 11:25:01 UTC (rev 1625) @@ -566,12 +566,20 @@ /*! Is called when the Strip chart data goes off the rightt end of the time axis. All data is shifted to the left by nChannel's + If the shift is greater than the spectrum size the spectrum is just cleared. + */ void CSpectrumS::ShiftDataDown(int nShift) { UInt_t* p = (UInt_t*)getStorage(); + + if (nShift >= m_nChannels) { + Clear(); + return; + } + assert(p != (UInt_t*)kpNULL); for (int i = 0; i < m_nChannels-nShift; i++) { p[i] = p[i+nShift]; @@ -587,6 +595,12 @@ { UInt_t* p = (UInt_t*)getStorage(); assert(p != (UInt_t*)kpNULL); + + if (m_nChannels <= (-nShift)) { + Clear(); + return; + + } for (int i = m_nChannels ; i >= (nShift * -1); i--) { p[i] = p[i+nShift]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-10-11 15:11:01
|
Revision: 1636 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1636&view=rev Author: ron-fox Date: 2009-10-11 15:10:53 +0000 (Sun, 11 Oct 2009) Log Message: ----------- BZ 379 - When SpecTcl switched from single -> double precision parameter values, filter data broke. The fix auto-detects if a filter file is single or double precision and can read both data widths. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Filter/FilterBufferDecoder.cpp trunk/SpecTcl/Filter/FilterBufferDecoder.h trunk/SpecTcl/Filter/FilterEventProcessor.cpp trunk/SpecTcl/Filter/FilterEventProcessor.h Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-10-10 22:00:59 UTC (rev 1635) +++ trunk/SpecTcl/CHANGELOG 2009-10-11 15:10:53 UTC (rev 1636) @@ -869,4 +869,11 @@ August 13, 2009 - Fix error in Strip chart spectrum was not requiring that target parameter was defined. - Fix error in strip chart shift. If shift is larger than spectrum - channel count would segfault. \ No newline at end of file + channel count would segfault. + Sep 4, 2009 - Fix BZ 378 - Segfaults can happen when cutting down the + Y parameters of a g2d spectrum to generate the title. + +pre4: + October 11, 2009 - BZ 379 when SpecTcl started using double for parameters + in an event, filters broke. The fix allows both filters + from older and current versions of SpecTcl to be read. Modified: trunk/SpecTcl/Filter/FilterBufferDecoder.cpp =================================================================== --- trunk/SpecTcl/Filter/FilterBufferDecoder.cpp 2009-10-10 22:00:59 UTC (rev 1635) +++ trunk/SpecTcl/Filter/FilterBufferDecoder.cpp 2009-10-11 15:10:53 UTC (rev 1636) @@ -28,6 +28,13 @@ #endif +static int inline numBitmasks(Int_t nParameters) +{ + return (nParameters + sizeof(unsigned)*8 - 1)/ + (sizeof(unsigned)*8); +} + + /*! Simple constructor. The Decoder is constructed with: - A null translated buffer. @@ -289,7 +296,8 @@ delete []m_pTranslated; m_pTranslated = 0; // Not really necessary but good. - m_pTranslated = new char[nBytes]; + m_pTranslated = new char[nBytes * 2]; // If single this is needed since + // each float -> double delete m_pTranslator; m_pTranslator = new NonSwappingBufferTranslator(m_pTranslated); @@ -305,6 +313,9 @@ cerr << "Event source does not appear to be a filter file!! ending\n"; return; } + m_isSingle = dataWidth(nBytes, xdr.getBuffer()); + + } // The following attempt to detect unsuitable buffer types: @@ -348,6 +359,7 @@ int nItemSize; char* pCursor(m_pTranslated); // Insertion pointer. + bool testing = (&rAnalyzer == NULL); // Insert the header string... // In the line below, the extra space in the strlen is not @@ -355,9 +367,11 @@ // in the header string gets copied too. nItemSize = strlen("header "); - memcpy(pCursor, "header", nItemSize); - m_nBytes += nItemSize; - pCursor += nItemSize; + if (!testing) { + memcpy(pCursor, "header", nItemSize); + m_nBytes += nItemSize; + pCursor += nItemSize; + } // Next is the number of parameters that are in the filtered // data set, we need this in order to be able to @@ -365,19 +379,23 @@ xdr >> m_nParamCount; nItemSize = sizeof(int); - memcpy(pCursor, &m_nParamCount, nItemSize); - m_nBytes += nItemSize; - pCursor += nItemSize; + if (!testing) { + memcpy(pCursor, &m_nParamCount, nItemSize); + m_nBytes += nItemSize; + pCursor += nItemSize; + } // Now there will be m_nParamCount strings: for(int i =0; i < m_nParamCount; i++) { string name; xdr >> name; // Pull the name from the buffer - nItemSize = name.size() + 1; - memcpy(pCursor, name.c_str(), nItemSize); - m_nBytes += nItemSize; - pCursor += nItemSize; + if (!testing) { + nItemSize = name.size() + 1; + memcpy(pCursor, name.c_str(), nItemSize); + m_nBytes += nItemSize; + pCursor += nItemSize; + } } m_fSeenHeader = true; // We've seen a header. @@ -385,7 +403,9 @@ m_nEntities = m_nParamCount; // Each parameter is an entity. m_nCurrentType = PARAMDESCRIP; // Parameter description 'buffer'. - rAnalyzer.OnOther(m_nCurrentType, *this); + if (!testing) { + rAnalyzer.OnOther(m_nCurrentType, *this); + } } @@ -429,8 +449,8 @@ // Read the bitmasks and count the number of set bits. nItemSize = sizeof(unsigned); - int nBitmasks = (m_nParamCount + sizeof(unsigned)*8 - 1)/ - (sizeof(unsigned)*8); + int nBitmasks = numBitmasks(m_nParamCount); + int bits = 0; for(int i=0; i < nBitmasks; i++) { int mask; @@ -443,10 +463,17 @@ // Bits has the number of parameters that's present. // There's one float for each parameter. - int nItemSize = sizeof(float); + int nItemSize = sizeof(double); for (int i =0; i < bits; i++) { - float item; - xdr >> item; + double item; + float fitem; + if (m_isSingle) { + xdr >> fitem; + item = fitem; + } + else { + xdr >> item; + } memcpy(pCursor, &item, nItemSize); pCursor += nItemSize; nSize += nItemSize; @@ -537,3 +564,48 @@ m_pTranslator = rhs.m_pTranslator; } +/* +** returns true if the buffer is a single precision buffer +** this is the case if after processig the first event as single precision, +** We get to an 'event' header again: +** Parameters: +** UInt_t nBytes - Size of input buffer. +** void* pBuffer - Pointer to a 'header' buffer. +*/ +bool +CFilterBufferDecoder::dataWidth(UInt_t nBytes, void* pBuffer) +{ + CXdrMemInputStream xdr(nBytes, pBuffer); + xdr.Connect(); + + + string type; + xdr >> type; // 'header' + ProcessHeader(xdr, *(reinterpret_cast<CAnalyzer*>(NULL))); // Skip the header. + xdr >> type; // 'event' + int nBitmasks = numBitmasks(m_nParamCount); + + int bits=0; + + // Flip through the bit masks counting then number of parameters + // to expect: + + for (int i=0; i < nBitmasks; i++) { + int mask; + xdr >> mask; + bits += CountBits(mask); + } + // skip them as if they were floating: + + for (int i=0; i < bits; i++) { + float param; + xdr >> param; + } + // If it's single precision we are at an 'event' header except for + // the very pathological case of a single output event.. in that case + // alles ist verloren. + + + xdr >> type; + return type == "event"; +} Modified: trunk/SpecTcl/Filter/FilterBufferDecoder.h =================================================================== --- trunk/SpecTcl/Filter/FilterBufferDecoder.h 2009-10-10 22:00:59 UTC (rev 1635) +++ trunk/SpecTcl/Filter/FilterBufferDecoder.h 2009-10-11 15:10:53 UTC (rev 1636) @@ -115,7 +115,9 @@ UShort_t m_nEntities; //!< How many items in m_pTranslated. Bool_t m_fSeenHeader; //!< true once we've seen a header. BufferTranslator* m_pTranslator; //!< Buffer translator we hand out. + bool m_isSingle; //!< true if buffer is single precision. + // Constructors and other canonical functions. public: @@ -160,6 +162,7 @@ void ProcessEvents(CXdrInputStream& xdr, CAnalyzer& rAnalyzer); static int CountBits(unsigned mask); + bool dataWidth(UInt_t nBytes, void* pBuffer); }; #endif Modified: trunk/SpecTcl/Filter/FilterEventProcessor.cpp =================================================================== --- trunk/SpecTcl/Filter/FilterEventProcessor.cpp 2009-10-10 22:00:59 UTC (rev 1635) +++ trunk/SpecTcl/Filter/FilterEventProcessor.cpp 2009-10-11 15:10:53 UTC (rev 1636) @@ -256,7 +256,7 @@ int nPars = Placement.size(); for(int i =0; i < nPars; i++) { int nTarget = Placement[i]; - float parameter; + double parameter; pHere = GetFloat(pHere, parameter); if(nTarget >= 0) rEvent[nTarget] = parameter; @@ -318,8 +318,8 @@ Updated input pointer. */ void* -CFilterEventProcessor::GetFloat(void* p, Float_t& result) +CFilterEventProcessor::GetFloat(void* p, DFloat_t& result) { - memcpy(&result, p, sizeof(Float_t)); - return (void*)((ULong_t)p + sizeof(Float_t)); + memcpy(&result, p, sizeof(DFloat_t)); + return (void*)((ULong_t)p + sizeof(DFloat_t)); } Modified: trunk/SpecTcl/Filter/FilterEventProcessor.h =================================================================== --- trunk/SpecTcl/Filter/FilterEventProcessor.h 2009-10-10 22:00:59 UTC (rev 1635) +++ trunk/SpecTcl/Filter/FilterEventProcessor.h 2009-10-11 15:10:53 UTC (rev 1636) @@ -93,7 +93,7 @@ static void* GetInt(void* p, Int_t& i); //!< Retrieve an int. static void* GetFloat(void* p, - Float_t& f); //!< Retrieve a float. + DFloat_t& f); //!< Retrieve a float. }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-10-14 11:41:15
|
Revision: 1640 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1640&view=rev Author: ron-fox Date: 2009-10-14 11:40:53 +0000 (Wed, 14 Oct 2009) Log Message: ----------- Fix error in strip chart spectra. Offsets were miscomputed by one leading to holes in the spectrum for a slowly/continously/monotonically increasing time parameter. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Sorter/SpectrumS.cpp trunk/SpecTcl/configure.in Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-10-14 11:14:44 UTC (rev 1639) +++ trunk/SpecTcl/CHANGELOG 2009-10-14 11:40:53 UTC (rev 1640) @@ -877,3 +877,6 @@ October 11, 2009 - BZ 379 when SpecTcl started using double for parameters in an event, filters broke. The fix allows both filters from older and current versions of SpecTcl to be read. + October 14, 2009 - Strip chart spectrum was miscalculateing m_nOffset on + shifts to the left leaving gaps in the spectra for + continuously varying parameters. Modified: trunk/SpecTcl/Sorter/SpectrumS.cpp =================================================================== --- trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-10-14 11:14:44 UTC (rev 1639) +++ trunk/SpecTcl/Sorter/SpectrumS.cpp 2009-10-14 11:40:53 UTC (rev 1640) @@ -425,7 +425,7 @@ if (nChannel > m_nChannels ) { ShiftDataDown (static_cast<int>(nChannel + (.25 * m_nChannels) - m_nChannels)); - m_nOffset = static_cast<int>(m_nOffset + nChannel + (.25 * m_nChannels) - m_nChannels); + m_nOffset = static_cast<int>(m_nOffset + nChannel + (.25 * m_nChannels) - m_nChannels) +1; nChannel = nChannel - m_nOffset; }else if (nChannel < 0) { ShiftDataUp(nChannel); Modified: trunk/SpecTcl/configure.in =================================================================== --- trunk/SpecTcl/configure.in 2009-10-14 11:14:44 UTC (rev 1639) +++ trunk/SpecTcl/configure.in 2009-10-14 11:40:53 UTC (rev 1640) @@ -4,7 +4,7 @@ AC_CONFIG_AUX_DIR(config) AM_CONFIG_HEADER(config.h) AC_CANONICAL_HOST -AM_INIT_AUTOMAKE(SpecTcl, 3.3pre3) +AM_INIT_AUTOMAKE(SpecTcl, 3.3pre4) AC_EXEEXT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-12-03 11:43:41
|
Revision: 1641 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1641&view=rev Author: ron-fox Date: 2009-12-03 11:03:10 +0000 (Thu, 03 Dec 2009) Log Message: ----------- Fix error in XMDialogs.cc XMWarningDialog::Create - was referencing button objects prior to creating them. Modified Paths: -------------- trunk/SpecTcl/CHANGELOG trunk/SpecTcl/Display/XMDialogs.cc Modified: trunk/SpecTcl/CHANGELOG =================================================================== --- trunk/SpecTcl/CHANGELOG 2009-10-14 11:40:53 UTC (rev 1640) +++ trunk/SpecTcl/CHANGELOG 2009-12-03 11:03:10 UTC (rev 1641) @@ -880,3 +880,7 @@ October 14, 2009 - Strip chart spectrum was miscalculateing m_nOffset on shifts to the left leaving gaps in the spectra for continuously varying parameters. + December 4, 2009 - Fix error in XMWarningDialog::Create .. was referencing + button objects prior to ensuring they were created. + + Modified: trunk/SpecTcl/Display/XMDialogs.cc =================================================================== --- trunk/SpecTcl/Display/XMDialogs.cc 2009-10-14 11:40:53 UTC (rev 1640) +++ trunk/SpecTcl/Display/XMDialogs.cc 2009-12-03 11:03:10 UTC (rev 1641) @@ -144,8 +144,10 @@ XMMessageBox::XMMessageBox(const char *n) : XMManagedWidget(n) -{} +{ +} + XMMessageBox::XMMessageBox(Widget w) : XMManagedWidget(w) { @@ -598,9 +600,9 @@ argcount); SetText(msg); LabelOkButton("Dismiss"); + GetButtons(); cancelbutton->Disable(); helpbutton->Disable(); - GetButtons(); if(cb) AddOkCallback(cb, cbd); Manage(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |