class Balloonwidget {
inherit itk::Widgetitk_option define -balloonhelp balloonHelp BalloonHelp ""
private variable balloon_queue ""
private variable destroy_queue ""public method enter
public method leave public method balloonconstructor { args } {
bind $itk_component(hull) <Enter> [code $this enter] bind $itk_component(hull) <Leave> [code $this leave] eval itk_initialize $args }}body Balloonwidget::enter { } {
if {$balloon_queue != ""} { after cancel $balloon_queue } if {$itk_option(-balloonhelp) != ""} { set balloon_queue [after 750 [code $this balloon]] }}body Balloonwidget::leave { } {
if {$balloon_queue != ""} { after cancel $balloon_queue } set destroy_queue [after 100 {catch {destroy .balloon_help}}]}body Balloonwidget::balloon { } {
set t .balloon_help catch {destroy $t} toplevel $t wm overrideredirect $t 1if {[tk windowingsystem] == "aqua"} {
#unsupported1 style $itk_component(hull) floating sideTitlebar ::tk::unsupported::MacWindowStyle style $t help none }label $t.l \
-text " $itk_option(-balloonhelp) " \ -relief solid \ -bd 2 \ -bg gold \ -fg #000000 \ -font font_b pack $t.l -fill both set x [expr [winfo pointerx $itk_component(hull)] + 8] set y [expr [winfo pointery $itk_component(hull)] + 20] if {[expr $x + [winfo reqwidth $t.l]] > [winfo screenwidth $t.l]} { set x [expr [winfo screenwidth $t.l] - [winfo reqwidth $t.l] - 2] } if {[expr $y + [winfo reqheight $t.l]] > [winfo screenheight $t.l]} { set y [expr $y - 20 - [winfo reqheight $t.l] - 2] } wm geometry $t +$x\+$y #bind $t <Enter> [list [after cancel $destroy_queue]] #bind $t <Leave> "catch {destroy .balloon_help}"} class gEntry { inherit Balloonwidgetitk_option define -image image Image "" {
if {$itk_option(-image) != ""} { $itk_component(icon) configure \ -image $itk_option(-image) \ -width [expr [image width $itk_option(-image)] + 4] \ -height [expr [image height $itk_option(-image)] + 4] } }itk_option define -padxy padXY Pad 0 {
$itk_component(padding) configure -borderwidth $itk_option(-padxy) } itk_option define -disabledbackground disabledBackground Background "#dcdcdc" itk_option define -disabledforeground disabledForeground DisabledForeground "#a9a9a9" itk_option define -foreground foreground Foreground "#000000" { if {$itk_option(-state) != "disabled"} { $itk_component(entry) configure -foreground $itk_option(-foreground) } } itk_option define -textbackground textBackground Background "#ffffff" { if {$itk_option(-state) != "disabled"} { $itk_component(entry) configure -background $itk_option(-textbackground) $itk_component(icon) configure -background $itk_option(-textbackground) } $itk_component(frame) configure -background $itk_option(-textbackground) } itk_option define -entryfont entryFont Font font_e { $itk_component(entry) configure -font $itk_option(-entryfont) } itk_option define -state state State "normal" { if {$itk_option(-state) == "disabled"} { $itk_component(entry) configure \ -state disabled \ -background $itk_option(-disabledbackground) \ -foreground $itk_option(-disabledforeground) $itk_component(frame) configure \ -background $itk_option(-disabledbackground) $itk_component(icon) configure \ -background $itk_option(-disabledbackground) } else { $itk_component(entry) configure \ -state normal \ -background $itk_option(-textbackground) \ -foreground $itk_option(-foreground) $itk_component(frame) configure \ -background $itk_option(-textbackground) $itk_component(icon) configure \ -background $itk_option(-textbackground) } } itk_option define -type type Type "string" itk_option define -defaultvalue defaultValue DefaultValue "" itk_option define -precision precision Precision "2" itk_option define -maximum maximum Maximum "" itk_option define -minimum minimum Minimum "" itk_option define -allowblank allowBlank AllowBlank "1" itk_option define -linkcommand linkCommand Command "" itk_option define -editcommand editCommand Command "" itk_option define -command command Command ""public method validate
public method focusOut public method update public method query public method keystrokeconstructor { args } {
itk_component add padding { frame $itk_interior.p \ -relief flat \ } pack $itk_component(padding) -fill x itk_component add frame { frame $itk_interior.p.f \ -borderwidth 2 \ -relief sunken } { usual keep -borderwidth keep -relief } pack $itk_component(frame) -fill x itk_component add icon { label $itk_interior.p.f.icon \ -anchor c \ -padx 0 \ -pady 0 \ -bd 0 } pack $itk_component(icon) -side leftitk_component add entry {
entry $itk_interior.p.f.entry \ -relief flat \ -borderwidth 0 \ -highlightthickness 0 \ -selectborderwidth 0 \ -validate all \ -validatecommand [code $this validate %V %P] } { keep -insertbackground -insertborderwidth -insertwidth keep -insertontime -insertofftime keep -selectbackground -selectforeground keep -textvariable keep -width keep -justify keep -show } pack $itk_component(entry) -side right -fill x -expand true bind $itk_component(entry) <FocusOut> [code $this focusOut] bind $itk_component(entry) <Return> [code $this focusOut] bind $itk_component(entry) <KeyPress> [code $this keystroke]eval itk_initialize $args
} }body gEntry::query { } {
return [$itk_component(entry) get]}body gEntry::update { a_value } {
if {[validate "focusout" $a_value]} { $itk_component(entry) configure -state normal $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $a_value $itk_component(entry) configure -state $itk_option(-state) focusOut -nolink }}body gEntry::validate { reason new_string } {
switch -- $reason { key { switch -- $itk_option(-type) { real { if {[regexp -- {^-?\d*\.?\d*$} $new_string]} { return 1 } else { bell return 0 } } int { if {[regexp -- {^-?\d*$} $new_string]} { return 1 } else { bell return 0 } } default { return 1 } } } forced { # Trust myself to only force it to accept well-formed values return 1 } focusout { switch -- $itk_option(-type) { real { if {[regexp -- {^-?\.?$} $new_string]} {set new_string ""} if {$new_string == ""} { if {$itk_option(-allowblank)} { return 1 } elseif {$itk_option(-defaultvalue) != ""} { set new_string $itk_option(-defaultvalue) } else { set new_string 0 } } if {$itk_option(-maximum) != ""} { if {$new_string > $itk_option(-maximum)} { set new_string $itk_option(-maximum) } } if {$itk_option(-minimum) != ""} { if {$new_string < $itk_option(-minimum)} { set new_string $itk_option(-minimum) } } $itk_component(entry) delete 0 end $itk_component(entry) insert 0 [format %.$itk_option(-precision)f $new_string] # Need to turn valistaion back on, as setting the entry content # here will have turned it off. after idle [list $itk_component(entry) configure -validate all] return 1 } int { if {[regexp -- {^-?$} $new_string]} {set new_string ""} if {$new_string == ""} { if {$itk_option(-allowblank)} { return 1 } elseif {$itk_option(-defaultvalue) != ""} { set new_string $itk_option(-defaultvalue) } else { set new_string 0 } } if {$itk_option(-maximum) != ""} { if {$new_string > $itk_option(-maximum)} { set new_string $itk_option(-maximum) } } if {$itk_option(-minimum) != ""} { if {$new_string < $itk_option(-minimum)} { set new_string $itk_option(-minimum) } } $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $new_string # Need to turn validation back on, as setting the entry content # here will have turned it off. after idle [list $itk_component(entry) configure -validate all] return 1 } default { return 1 } } } default { return 1 } }}body gEntry::focusOut { { a_link "-link" } } {
$itk_component(entry) selection clear if {$itk_option(-command) != ""} { uplevel #0 [list $itk_option(-command) "[$itk_component(entry) get]"] } if { $a_link != "-nolink" } { if {$itk_option(-linkcommand) != ""} { uplevel #0 $itk_option(-linkcommand) } }}body gEntry::keystroke { } {
if {$itk_option(-editcommand) != ""} { uplevel #0 $itk_option(-editcommand) }}usual gEntry {
#rename -disabledbackground -background background Background keep -textbackground -background keep -selectforeground -selectbackground keep -disabledbackground -disabledforeground keep -entryfont keep -padxy}# ###############################################################################
# FILEENTRY# ###############################################################################class SettingWidget {
# Common variables private common widgets ; # array# Procedures
public proc refresh { a_parameter } public proc refreshAll { }# Member variables
protected variable parameter "" private variable old_value "" private variable canbeblank 0# Methods protected method getValue ; # virtual public method setValue ; # virtual public method downloadFromSession protected method uploadToSessionIfChanged
constructor { a_parameter } { }
}
body SettingWidget::constructor { a_parameter } {
set parameter $a_parameter lappend widgets($a_parameter) $this}body SettingWidget::refresh { a_parameter } {
if {[info exists widgets($a_parameter)]} { foreach i_widget $widgets($a_parameter) { $i_widget downloadFromSession } }}body SettingWidget::refreshAll { } {
foreach i_parameter [array names widgets] { refresh $i_parameter }} body SettingWidget::getValue { } { error "Virtual method SettingWidget::getValue not overridden" }body SettingWidget::setValue { } { error "Virtual method SettingWidget::getValue not overridden" }
body SettingWidget::uploadToSessionIfChanged { } {
#added by luke on 9 November 2007.
# If one presses return in a setting entry while it is blank, the interpreter gave an error # See bug 42. The if statement below catches that case and leaves the old_value unchanged if {([getValue] == "") && ($canbeblank == 0)} { $::session updateSetting $parameter $old_value 1 1 } ####################################################### # if the current value doesn't match the old value if {[getValue] != $old_value} { # update the session with the current value $::session updateSetting $parameter [getValue] 1 1 # update the old value set old_value [getValue]#added by luke on 3 December 2007
#A hack to send the detector and reversephi keywords. reversephi should only #be sent to ipmosflm if the detector manufacturer is already set. if {$parameter == "detector_manufacturer"} { $::mosflm sendCommand "detector $old_value" } if {$parameter == "reverse_phi"} { if {([$::session getReversePhi]) && ([$::session getDetectorManufacturer] != "")} { $::mosflm sendCommand "detector [$::session getDetectorManufacturer] reversephi" } else { $::mosflm sendCommand "detector [$::session getDetectorManufacturer]" } } ################################################################### } else { }}body SettingWidget::downloadFromSession { } {
set l_new_value [$::session getParameterValue $parameter] set old_value $l_new_value setValue $l_new_value}class SettingEntry {
inherit gEntry SettingWidget# itk_option define -parameter parameter Parameter "" {
# set parameter $itk_option(-parameter)# }public method update
public method getValue public method setValue public method publicUploadToSessionIfChangedconstructor { a_parameter args } {
eval gEntry::constructor $args SettingWidget::constructor $a_parameter } { bind $itk_component(entry) <FocusOut> +[code $this uploadToSessionIfChanged] bind $itk_component(entry) <Return> +[code $this uploadToSessionIfChanged] }}body SettingEntry::update { a_value } {
gEntry::update $a_value uploadToSessionIfChanged}body SettingEntry::getValue { } {
return [$itk_component(entry) get]}body SettingEntry::setValue { a_value } {
$itk_component(entry) configure -state normal $itk_component(entry) delete 0 end $itk_component(entry) insert end $a_value $itk_component(entry) configure -state $itk_option(-state)}usual SettingEntry {
usual gEntry}body SettingEntry::publicUploadToSessionIfChanged {} {
uploadToSessionIfChanged# puts "did it"} class Indexwizard { inherit itk::Widget constructor {args} { }}
body Indexwizard::constructor { args } {
# Toolbars ###############################################
itk_component add spotfinding_toolbar {
frame .c.spot }# Divider
itk_component add spotfinding_divider1 {
frame $itk_component(spotfinding_toolbar).div1 \ -width 2 \ -relief sunken \ -bd 1 }itk_component add beam_x_e {
SettingEntry $itk_component(spotfinding_toolbar).bxe beam_x \ -image ::img::beam_x16x16 \ -balloonhelp "Beam x position" \ -type real \ -precision 2 \ -width 6 \ -justify right }itk_component add beam_y_e {
SettingEntry $itk_component(spotfinding_toolbar).bye beam_y \ -image ::img::beam_y16x16 \ -balloonhelp "Beam y position" \ -type real \ -precision 2 \ -width 6 \ -justify right }itk_component add distance_e {
SettingEntry $itk_component(spotfinding_toolbar).de distance \ -image ::img::distance16x16 \ -balloonhelp "Crystal to detector distance" \ -type real \ -precision 2 \ -width 6 \ -justify right }itk_component add spotfinding_divider2 {
frame $itk_component(spotfinding_toolbar).div2 \ -width 2 \ -relief sunken \ -bd 1 }# Frames
# pack $itk_component(spotfinding_toolbar) -side top -fill both # Spot finding panel ############################################################### grid $itk_component(spotfinding_toolbar) -row 0 -column 0 -sticky nswe pack $itk_component(spotfinding_divider1) -side top -fill both pack $itk_component(beam_x_e) -side top -fill both pack $itk_component(beam_y_e) -side top -fill both pack $itk_component(distance_e) -side top -fill both eval itk_initialize $args}
# Launch and completion methods #####################################
usual Indexwizard { }#Indexwizard .c
#pack .c class test { inherit itk::Widget constructor { args } { itk_option add hull.width hull.height $itk_component(hull) configure -width 1050 -height 768 wm minsize [winfo toplevel $itk_component(hull)] 1050 768 pack propagate $itk_interior 0 itk_component add spot { frame .c.spott } itk_component add index { Indexwizard $itk_component(spot).kk } itk_component add indexing { label $itk_component(spot).ttt \ -text "aaaa" } pack $itk_component(spot) -side top -fill both grid $itk_component(spot) -row 1 -column 0 -sticky nswe pack $itk_component(indexing) -side top -fill both # pack $itk_component(index) -side top -fill both }}test .cpack .c