#command.tcl
# Copyright (c) 2001-2004 Digi International Inc., All Rights Reserved
# 
# This software contains proprietary and confidential information of Digi
# International Inc.  By accepting transfer of this copy, Recipient agrees
# to retain this software in confidence, to prevent disclosure to others,
# and to make no use of this software other than that for which it was
# delivered.  This is an unpublished copyrighted work of Digi International
# Inc.  Except as permitted by federal law, 17 USC 117, copying is strictly
# prohibited.
# 
# Restricted Rights Legend
#
# Use, duplication, or disclosure by the Government is subject to
# restrictions set forth in sub-paragraph (c)(1)(ii) of The Rights in
# Technical Data and Computer Software clause at DFARS 252.227-7031 or
# subparagraphs (c)(1) and (2) of the Commercial Computer Software -
# Restricted Rights at 48 CFR 52.227-19, as applicable.
#
# Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
#
# ***************************************************************************

namespace eval ::dg::command {}

proc ::dg::command::Install {numIndex} {
    eval $::install($::dg::strOS,[lindex $::softw($::dg::strOS) $numIndex])
}

proc ::dg::command::CmdDgFinder {strPath} {
    set pathFull [file join $::dg::dirRoot $strPath]
    ::dg::install::Exe $pathFull
}

proc ::dg::command::CmdWin2kNtXp_rp {strPath} {
    set numBtnWidth 10
    set pathFull [file join $::dg::dirRoot $strPath]
    set strDriverType service
    toplevel .driver
    wm resizable .driver 0 0
    wm transient .driver .

    wm title .driver [mc $::dg::strOS.title]

    frame .driver.text

    label .driver.text.main -justify left -text [mc $::dg::strOS.instructions.main]

    frame .driver.text.install
    label .driver.text.install.title -justify right -text [::string::convert [mc $::dg::strOS.instructions.install.title]]
    label .driver.text.install.instructions -justify left -text [::string::convert [mc $::dg::strOS.$strDriverType.instructions.install]]
    pack .driver.text.install.title .driver.text.install.instructions -anchor n -side left -padx 8

    frame .driver.text.update
    label .driver.text.update.title -justify right -text [::string::convert [mc $::dg::strOS.instructions.update.title]]
    label .driver.text.update.instructions -justify left -text [::string::convert [mc $::dg::strOS.$strDriverType.instructions.update]]
    pack .driver.text.update.title .driver.text.update.instructions -anchor n -side left -padx 8

    label .driver.text.path -justify left -text [mc $::dg::strOS.instructions.path.format [list $pathFull]]

    pack .driver.text.main .driver.text.install .driver.text.update .driver.text.path -anchor w -pady 4 -padx 8

    frame .driver.button

    set strRun [mc $::dg::strOS.run]

    button .driver.button.run -text [::string::clean $strRun] \
     -underline [::string::underline $strRun] -command [list ::dg::command::_Launch $pathFull]
    button .driver.button.close -width $numBtnWidth -text [mc close] -default active \
     -command {destroy .driver}

    set charKey [::string::hotkey $strRun]
    bind .driver <Alt-KeyPress-$charKey> {.driver.button.run invoke}

    pack .driver.button.run .driver.button.close -side left -pady 8 -padx 8
    pack .driver.text .driver.button -pady 8

    regsub -all -- {/} $pathFull \\\\ pathFull
    clipboard clear
    clipboard append $pathFull

    ::window::center .driver
    focus .driver.button.close
    grab set .driver
    tkwait window .driver
    focus -force .l
    grab set .l
}

proc ::dg::command::wheelEvent { x y delta } {
    # Find out what's the widget we're on
    set act 0
    set widget [winfo containing $x $y]

    if {$widget != ""} {
        # Make sure we've got a vertical scrollbar for this widget
        if {[catch "$widget cget -yscrollcommand" cmd]} return

        if {$cmd != ""} {
            # Find out the scrollbar widget we're using
            set scroller [lindex $cmd 0]

            # Make sure we act
            set act 1
        }
    }

    if {$act == 1} {
        # Now we know we have to process the wheel mouse event
        set xy [$widget yview]
        set factor [expr [lindex $xy 1]-[lindex $xy 0]]

        # Make sure we activate the scrollbar's command
        set cmd "[$scroller cget -command] scroll [expr -int($delta/(60*$factor))] units"
        eval $cmd
    }
}

proc ::dg::command::CmdWin_rp {strPath} {
    set numBtnWidth 10
    set pathFull [file join $::dg::dirRoot $strPath]
    if {$::dg::strOS == "win03"} {
        set strMCOS winxp
    } else {
        set strMCOS $::dg::strOS
    }
    toplevel .driver
    wm resizable .driver 0 0
    wm transient .driver .

    wm title .driver [mc $strMCOS.title]

    set frmMain [frame .driver.main]

    set lblMain [label $frmMain.main -justify left -text [mc $strMCOS.instructions.main]]
    set frmText [frame $frmMain.frmtext]
    set ys $frmText.ys
    set t [text $frmText.instructions -wrap word -yscrollcommand [list $ys set] \
     -background #E0E0E0 -tabs {20p 35p}]
    
    ##Disable text selection and editing
    set t_bind [bindtags $t] 
    set text_pos [lsearch $t_bind Text] 
    bindtags $t [lreplace $t_bind $text_pos $text_pos] 

    ## Re-enable the mouse wheel
    bind all <MouseWheel> "+::dg::command::wheelEvent %X %Y %D"
    
    $t tag configure tagBodyI -lmargin1 5p -lmargin2 20p -rmargin 5p -spacing1 3p -background white
    $t tag configure tagTitleI -lmargin1 5p -underline true -background white
    $t tag configure tagBodyU -lmargin1 5p -lmargin2 20p -rmargin 5p -spacing1 3p -background #EEE
    $t tag configure tagTitleU -lmargin1 5p -underline true -background #EEE

    $t insert end [::string::convert [mc $strMCOS.rp.instructions.installt]] tagTitleI
    $t insert end [::string::convert [mc $strMCOS.rp.instructions.install]] tagBodyI
    $t insert end [::string::convert [mc $strMCOS.rp.instructions.updatet]] tagTitleU
    $t insert end [::string::convert [mc $strMCOS.rp.instructions.update]] tagBodyU

    scrollbar $ys -command [list $t yview] -orient vertical
    grid $t $ys -sticky news
    grid columnconfigure $frmText 0 -weight 1
    set lblPath [label $frmMain.path -justify left -text [mc $strMCOS.instructions.path.format [list $pathFull]]]
    set frmButtons [frame .driver.button]

    set strRun [mc $strMCOS.run]
    
    set btnRun [button $frmButtons.run -text [::string::clean $strRun] \
     -underline [::string::underline $strRun] -command [list ::dg::command::_Launch $pathFull]]
    set btnClose [button $frmButtons.close -width $numBtnWidth -text [mc close] -default active \
     -command {destroy .driver}]

    grid $lblMain -pady 5
    grid $lblPath -pady 5
    grid $frmMain
    grid $frmButtons -pady 10
    grid $frmText -sticky news
    grid $btnRun $btnClose -padx 5
    grid columnconfigure $frmMain 0 -weight 1
    
    set charKey [::string::hotkey $strRun]
    bind .driver <Alt-KeyPress-$charKey> {.driver.button.run invoke}

    regsub -all -- {/} $pathFull \\\\ pathFull
    clipboard clear
    clipboard append $pathFull

    ::window::center .driver
    focus .driver.button.close
    grab set .driver
    tkwait window .driver
    focus -force .l
    grab set .l
}

proc ::dg::command::_unix {pathInstaller pathImage strProduct strPackage} {
    catch {exec -- xterm -fg black -bg white -e $pathInstaller $pathImage $strProduct $strPackage}
}

proc ::dg::command::_Launch {pathFull} {
    ## We don't want to rely on %PATH% 
    if { $::dg::strOS == "win9598" } {
        set cpl [file join $::env(windir) control.exe]
    } else {
        set cpl [file join $::env(systemroot) system32 control.exe]  
    }
    if { $::dg::strOS == "winnt" } {
        exec $cpl ncpa.cpl &
    } elseif { $::dg::strOS == "win9598"} {
        exec command /c [file join $pathFull digirpcl.bat] &
        exec $cpl sysdm.cpl add new hardware &
    } else {
        ## Win2k and WinXp
        set dgcln [file join $pathFull dgrpcln.cmd]
        exec command /c $dgcln &
        exec $cpl HdwWiz.CPL &
    }

}

namespace eval ::string {

proc underline {str} {

    set pos [string first & $str]
    if {$pos == -1} {

        set pos 0
    }

    return $pos
}

proc clean {str} {

    regsub -all -- & $str "" str
    return $str
}

proc hotkey {str} {

    return [string tolower [string index [string::clean $str] [::string::underline $str]]]
}

proc convert {str} {
    regsub -all -- {\\n} $str "\n" str
    regsub -all -- {\\t} $str "\t" str
    return $str
}
        
# end namespace
}
