Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/tcl/dialog.tcl
3203 views
#/*****************************************************************************
# *
# *  Elmer, A Finite Element Software for Multiphysical Problems
# *
# *  Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
# * 
# *  This program is free software; you can redistribute it and/or
# *  modify it under the terms of the GNU General Public License
# *  as published by the Free Software Foundation; either version 2
# *  of the License, or (at your option) any later version.
# * 
# *  This program is distributed in the hope that it will be useful,
# *  but WITHOUT ANY WARRANTY; without even the implied warranty of
# *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# *  GNU General Public License for more details.
# *
# *  You should have received a copy of the GNU General Public License
# *  along with this program (in file fem/GPL-2); if not, write to the 
# *  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
# *  Boston, MA 02110-1301, USA.
# *
# *****************************************************************************/

#*******************************************************************************
#*
#  Dialog box widget .
#*
#*******************************************************************************
#*
#*                     Author:       Juha Ruokolainen
#*
#*                    Address: CSC - IT Center for Science Ltd.
#*                                Keilaranta 14, P.O. BOX 405
#*                                  02101 Espoo, Finland
#*                                  Tel. +358 0 457 2723
#*                                Telefax: +358 0 457 2302
#*                              EMail: [email protected]
#*
#*                       Date: 26 Sep 1995
#*
#*                Modified by:
#*
#*       Date of modification:
#*
#*******************************************************************************

proc dl_dialog {title text bitmap default args} {
    global button

    toplevel .dl_dialog -class dialog

    place_window .dl_dialog
    wm title .dl_dialog $title
    wm iconname .dl_dialog Dialog

    frame .dl_dialog.top -relief raised -bd 1
    pack .dl_dialog.top -side top -fill both

    frame .dl_dialog.bot -relief raised -bd 1
    pack .dl_dialog.bot -side bottom -fill both

    message .dl_dialog.top.msg -width 3i -text $text -font -Adobe-Times-Medium-R-Normal-*-140-*

    if { $bitmap != "" } {
        pack .dl_dialog.top.msg -side right -expand 1 -fill both -padx 5m -pady 5m

        label .dl_dialog.top.bitmap -bitmap $bitmap
        pack .dl_dialog.top.bitmap -side left -padx 5m -pady 5m
    } else {
        pack .dl_dialog.top.msg -expand 1 -fill both -padx 5m -pady 5m
    } 

    set i 0
    foreach but $args {
        if { $i == $default } {
            button .dl_dialog.bot.button$i -bg gray -text $but -command "set button $i"
            pack .dl_dialog.bot.button$i -side left -expand 1 -padx 5m -pady 5m -ipadx 2m -ipady 1m
        } else {
            button .dl_dialog.bot.button$i -text $but -command "set button $i"
            pack .dl_dialog.bot.button$i  -side left -expand 1 -padx 5m -pady 5m -ipadx 2m -ipady 1m
        }
        incr i
    }

    if { $default >= 0 } {
        bind .dl_dialog <Return> ".dl_dialog.bot.button$default flash; set button $default"
        bind .dl_dialog <Destroy> "set button $default"
    }

    set oldfocus [focus]
    grab .dl_dialog
    focus .dl_dialog

    tkwait variable button
    if { [winfo exists .dl_dialog] } { bind .dl_dialog <Destroy> {}; destroy .dl_dialog }
    focus $oldfocus

    return $button
}

proc dl_dialog_int_set { window inc min max } {
   global dl_dialog_ret

   set val [@ [$window get]+$inc];

   if { $val < $min } { set val $min };
   if { $val > $max } { set val $max };

   set dl_dialog_ret $val
}

#
# Get an integer value from user
# 
# 18 Sep 1995
#
proc dl_dialog_int { title text {default 0} {min 0} {max 512} } {
    global dl_dialog_ret dl_dialog_dummy

    set win .dl_dialog_int_win

    toplevel $win -class dialog
    place_window $win

    wm minsize $win 300 200
    wm title $win "Give an Integer"

    frame $win.top -relief raised -bd 2
    frame $win.mid -relief raised -bd 2
    frame $win.bot -relief raised -bd 2

    message $win.top.msg -text $text -font -Adobe-Times-Medium-R-Normal-*-180-* -width 300

    entry $win.mid.entry -relief sunken -textvariable dl_dialog_ret -width 6

    button $win.mid.down_slow  -text "<"  -command "dl_dialog_int_set $win.mid.entry -1 $min $max"
    button $win.mid.down_fast  -text "<<" -command "dl_dialog_int_set $win.mid.entry -5 $min $max"

    button $win.mid.up_slow    -text ">"  -command "dl_dialog_int_set $win.mid.entry +1 $min $max"
    button $win.mid.up_fast    -text ">>" -command "dl_dialog_int_set $win.mid.entry +5 $min $max"

    pack $win.top.msg

    pack $win.mid.down_slow -side left
    pack $win.mid.down_fast -side left

    pack $win.mid.entry -side left

    pack $win.mid.up_fast -side left
    pack $win.mid.up_slow -side left

    button $win.bot.cancel -text CANCEL -command "set dl_dialog_ret {}; destroy $win"
    button $win.bot.ok -text OK -command "destroy $win"

    pack $win.bot.cancel -side left -expand 1 -padx 5m -pady 5m -ipadx 2m -ipady 1m
    pack $win.bot.ok -side left -expand 1 -padx 5m -pady 5m -ipadx 2m -ipady 1m

    pack $win.bot -side bottom
    pack $win.mid -side bottom
    pack $win.top -side bottom -fill both -expand 1
     
    set dl_dialog_ret $default

    bind $win <Return> "destroy $win"

    set oldfocus [focus]

    grab  $win
    focus $win

    tkwait window $win

    if { [winfo exists $win] } {
        bind $win <Destroy> {};
        destroy $win
    }
    focus $oldfocus

    return $dl_dialog_ret
}