📄 plugin.tcl
字号:
#---------------------------------------------------
#
# Module : plugin.tcl
# Author : MK
# Date : 09 Sep 1997
#
# Description :
#
# This script provides the envelope routines for an install plugin.
# The plugin should call the main routine plugin_install_main with the
# name of the global table which contains all the specific plugin
# data. Some of the data includes the stages which will be listed and
# from which the name of the callback routines are derived.
#
# The members of the array at this time are:
#
# PLUGIN_NAME - Name of the product (e.g. get_ver)
# DEST_PATH - Destination path (starting as empty)
# DEFAULTS_PATH - Path of the defaults for the plugin values
# SAVED_DEFAULTS - Member of the global array to be saved as defaults
# TITLE - Title to be displayed on the plugin screen
# MODE - Standard or Custom
# WP_STAGE - Initially empty
# STAGES - A list of stages and their titles
# XXXX_INFO - Information strings, matching the stages in STAGES
#
# See get_ver.ins for a proper setup of the array.
#---------------------------------------------------
#
# Change History
# --------------
# 970909 - First Version
#
#################################################################
#################################################################
set VPIG(OFF_STAGE_PREFIX) "::"
proc plugin_install_main {PLUGIN_G_NAME} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
catch {source $PLUGIN_G(DEFAULTS_PATH)}
############# Title
set WP_TITLE $VPIG(WPLUGIN_FRAME).title
frame $WP_TITLE -bg [c_dblue]
label $WP_TITLE.l -text $PLUGIN_G(TITLE) \
-bg [c_dblue] -font [tbi18]
pack $WP_TITLE.l -fill x -pady 10
############# Destination
set WP_DEST $VPIG(WPLUGIN_FRAME).dest
frame $WP_DEST -bg [c_dblue] -relief groove -bd 2
button $WP_DEST.b -text "安装路径:" -bg [c_yellow] -font [cbr14] \
-command [list plugin.wp_dest_cb $PLUGIN_G_NAME] \
-highlightbackground [c_dblue]
entry $WP_DEST.e -bg [c_yellow] -font [cbr14] \
-textvariable [set PLUGIN_G_NAME](DEST_PATH) -width 50
bind $WP_DEST.e <Return> [list plugin_save_defaults $PLUGIN_G_NAME]
pack $WP_DEST.b -side top -pady 5
pack $WP_DEST.e -side top -fill x
set PATH $PLUGIN_G(DEST_PATH)
set PATH [string trim $PATH]
if { [string length $PATH] == 0 } {
set PLUGIN_G(DEST_PATH) [tclu_get_tmp_dir]
}
############# Mode (Standard/Custom)
set WP_MODE $VPIG(WPLUGIN_FRAME).mode
frame $WP_MODE -bg [c_dblue] -relief groove -bd 2
label $WP_MODE.label -text "安装模式:" -bg [c_dblue] -bd 1 \
-font [tbr14]
radiobutton $WP_MODE.b_standard -text "标准" \
-highlightbackground [c_dblue] \
-value "Standard" \
-variable [set PLUGIN_G_NAME](MODE) \
-bg [c_dblue] -font [tbr14] \
-command [list plugin.mode_cb $PLUGIN_G_NAME]
radiobutton $WP_MODE.b_custom -text "自定义" \
-highlightbackground [c_dblue] \
-value "Custom" \
-variable [set PLUGIN_G_NAME](MODE) \
-bg [c_dblue] -font [tbr14] \
-command [list plugin.mode_cb $PLUGIN_G_NAME]
pack $WP_MODE.label $WP_MODE.b_standard $WP_MODE.b_custom -side left
############# Stages
set PLUGIN_G(WP_STAGES) $VPIG(WPLUGIN_FRAME).stages
plugin.show_installation_stages $PLUGIN_G_NAME
############# Buttons
set WP_ACT $VPIG(WPLUGIN_FRAME).act
frame $WP_ACT -bg [c_dblue] -relief groove -bd 2
button $WP_ACT.start -text "Start" -font [tbr14] -bg [c_aqua] \
-highlightbackground [c_dblue] \
-command [list plugin.start_cb $PLUGIN_G_NAME $WP_ACT.start]
pack $WP_ACT.start -side left -expand 1 -pady 5
pack $WP_TITLE $WP_DEST $WP_MODE $PLUGIN_G(WP_STAGES) $WP_ACT -fill x
set INIT_CB ""
if [info exists PLUGIN_G(INIT_CB)] {
set STATUS [$PLUGIN_G(INIT_CB) -2]
}
}
#####################################################################
proc plugin_save_defaults {PLUGIN_G_NAME} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
set VAR_LIST $PLUGIN_G(SAVED_DEFAULTS)
if {[catch {open $PLUGIN_G(DEFAULTS_PATH) w} FP]} {
puts "Defaults cannot be written to $PLUGIN_G(DEFAULTS_PATH)"
return
}
foreach VAR $VAR_LIST {
set VALUE $PLUGIN_G($VAR)
if [string length $VALUE] {
set VALUE [tclu_quote_backslashes $VALUE]
set COMMAND [format "set PLUGIN_G(%s) \"%s\"" $VAR $VALUE]
} else {
set COMMAND [format "set PLUGIN_G(%s) \"\"" $VAR]
}
puts $FP $COMMAND
}
close $FP
}
#####################################################################
proc plugin.show_installation_stages {PLUGIN_G_NAME} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
frame $PLUGIN_G(WP_STAGES) -bg [c_dblue] -relief groove -bd 2
set MODE $PLUGIN_G(MODE)
foreach {STAGE STAGE_TEXT} $PLUGIN_G(STAGES) {
set STAGE [plugin.get_stage_name $STAGE]
set STAGE_CB [plugin.get_cb_name $PLUGIN_G_NAME $STAGE]
set STAGE_INFO [plugin.get_info_name $STAGE]
set WP_STAGE $PLUGIN_G(WP_STAGES).s_$STAGE
set PLUGIN_G(_SEL_$STAGE) 0
frame $WP_STAGE -bg [c_dblue]
frame $WP_STAGE.bf -bg [c_dblue] -width 20 -height 20 -bg [c_dblue]
checkbutton $WP_STAGE.bf.b -bg [c_dblue] \
-highlightbackground [c_dblue] \
-variable [set PLUGIN_G_NAME](_SEL_$STAGE)
button $WP_STAGE.info -bitmap info -bg [c_dblue] \
-highlightbackground [c_dblue] \
-command [list plugin.info_cb $PLUGIN_G_NAME $STAGE_INFO]
if { $MODE == "Custom" } {
pack $WP_STAGE.bf.b -side left
}
button $WP_STAGE.l -text $STAGE_TEXT \
-highlightbackground [c_dblue] \
-bg [c_dblue] -font [cbr14] -justify left \
-command [list plugin.start_one_cb $PLUGIN_G_NAME \
$STAGE_TEXT $STAGE_CB $WP_STAGE "Custom"]
label $WP_STAGE.stat -text "Not done" -font [cbr14] \
-fg [c_black] -bg [c_dblue] -relief sunken -bd 2
pack $WP_STAGE.bf -side left
pack $WP_STAGE.info -side left
pack $WP_STAGE.stat -side right
pack $WP_STAGE.l -side left -fill x
pack $WP_STAGE -fill x -expand 1
}
}
#####################################################################
proc plugin.set_stage_onoff {PLUGIN_G_NAME STAGE ONOFF} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
if { $ONOFF == "off" } {
set OLD_STAGE "$STAGE"
set NEW_STAGE "$VPIG(OFF_STAGE_PREFIX)$STAGE"
} else {
set OLD_STAGE "$VPIG(OFF_STAGE_PREFIX)$STAGE"
set NEW_STAGE "$STAGE"
}
set STAGE_INDEX [lsearch $PLUGIN_G(STAGES) $OLD_STAGE]
if { $STAGE_INDEX < 0 } {
return 0
}
set PLUGIN_G(STAGES) \
[lreplace $PLUGIN_G(STAGES) $STAGE_INDEX $STAGE_INDEX $NEW_STAGE]
set WP_STAGES $PLUGIN_G(WP_STAGES)
foreach {STAGE STAGE_TEXT} $PLUGIN_G(STAGES) {
if [plugin.is_stage_active $STAGE] {
set FG [c_black]
set AFG [c_black]
set ABG [c_white]
} else {
set FG [c_gray]
set AFG [c_gray]
set ABG [c_dblue]
}
set TRUE_STAGE [plugin.get_stage_name $STAGE]
set WP_STAGE $WP_STAGES.s_$TRUE_STAGE
$WP_STAGE.l configure -fg $FG \
-activeforeground $AFG \
-activebackground $ABG
}
return 0
}
#####################################################################
proc plugin.wp_dest_cb {PLUGIN_G_NAME} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
set PATH [tk_getOpenFile -initialdir \
\"[tclu_get_dir_for_file $PLUGIN_G(DEST_PATH)]\"]
if { [string length $PATH] > 0 } {
set PLUGIN_G(DEST_PATH) "$PATH"
plugin_save_defaults $PLUGIN_G_NAME
}
}
#####################################################################
proc plugin.mode_cb {PLUGIN_G_NAME} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
set WP_STAGES $PLUGIN_G(WP_STAGES)
set MODE $PLUGIN_G(MODE)
foreach {STAGE STAGE_TEXT} $PLUGIN_G(STAGES) {
set TRUE_STAGE [plugin.get_stage_name $STAGE]
set STAGE_CB [plugin.get_cb_name $PLUGIN_G_NAME $TRUE_STAGE]
set STAGE_INFO [plugin.get_info_name $TRUE_STAGE]
set WP_STAGE $WP_STAGES.s_$TRUE_STAGE
switch -- $MODE {
"Standard" {
pack forget $WP_STAGE.bf.b -side left
}
"Custom" {
pack $WP_STAGE.bf.b
}
default { bgerror "Switch error plugin.tcl (0)" }
}
}
plugin_save_defaults $PLUGIN_G_NAME
}
#####################################################################
proc plugin.info_cb {PLUGIN_G_NAME STAGE_INFO} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
set MESSAGE $PLUGIN_G($STAGE_INFO)
set WLOGS [tku_popup_log_open "Entrprise/Genesis Plug-in: $STAGE_INFO"]
set W [lindex $WLOGS 0]
set WTEXT [lindex $WLOGS 1]
tku_popup_log $WTEXT normal $MESSAGE
tku_popup_log_show $W
}
#####################################################################
proc plugin.start_cb {PLUGIN_G_NAME W} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
plugin_save_defaults $PLUGIN_G_NAME
set MODE $PLUGIN_G(MODE)
set INIT_CB ""
if [info exists PLUGIN_G(INIT_CB)] {
set STATUS [$PLUGIN_G(INIT_CB) -1]
if { $STATUS != 0} {
return
}
}
set WP_STAGES $PLUGIN_G(WP_STAGES)
foreach {STAGE STAGE_TEXT} $PLUGIN_G(STAGES) {
set TRUE_STAGE [plugin.get_stage_name $STAGE]
set STAGE_CB [plugin.get_cb_name $PLUGIN_G_NAME $TRUE_STAGE]
set STAGE_INFO [plugin.get_info_name $TRUE_STAGE]
set WP_STAGE $WP_STAGES.s_$TRUE_STAGE
if { $MODE != "Standard" && \
$PLUGIN_G(_SEL_$TRUE_STAGE) == 0} continue
$WP_STAGE.stat configure -text "Not done" -bg [c_dblue]
}
if { $VPIG(PRODUCTS_OR_BEANS) == "products" } {
set LIC_MESSAGE \
"Please read the license information below and press 'Accept'.It\
\ncontains conditions under which the Program is being licensed \
\nto you. Use the scrollbar as necessary in order to view the full\
\ntext. Pressing 'Decline' will stop the installation process now."
set LIC_PATH [file join $VPIG(INSTALL_PATH) .. license.txt]
set CHOICE [tku_popup_message info [list Accept Decline] \
$LIC_MESSAGE $LIC_PATH]
if { $CHOICE != "Accept" } {
return
}
}
foreach {STAGE STAGE_TEXT} $PLUGIN_G(STAGES) {
if { ! [plugin.is_stage_active $STAGE]} continue
set STAGE_CB [plugin.get_cb_name $PLUGIN_G_NAME $STAGE]
set STAGE_INFO [plugin.get_info_name $STAGE]
set WP_STAGE $WP_STAGES.s_$STAGE
if { $MODE != "Standard" && \
$PLUGIN_G(_SEL_$STAGE) == 0} continue
set STATUS [plugin.start_one_cb $PLUGIN_G_NAME \
$STAGE_TEXT $STAGE_CB $WP_STAGE $MODE]
if { $STATUS == "cancel" } {
break
}
if { $MODE == "Standard" } {
if { $STATUS != "ok" && $STATUS != "undone"} {
break
}
}
}
}
#..................................................................#
proc plugin.start_one_cb \
{PLUGIN_G_NAME STAGE_TEXT STAGE_CB WP_STAGE MODE} {
upvar #0 $PLUGIN_G_NAME PLUGIN_G
global VPIG
set NO_DEST_MESSAGE \
"Please Fill the destination parameter with the \
\nlocation where you wish the product to be installed \
\nor where it is now (for checks)."
set STAGE_INDEX [lsearch $PLUGIN_G(STAGES) $STAGE_TEXT]
if {$STAGE_INDEX > 0} {
incr STAGE_INDEX -1
set STAGE [lindex $PLUGIN_G(STAGES) $STAGE_INDEX]
if { ! [plugin.is_stage_active $STAGE] } {
tku_popup_message error ok \
"This stage is currently disabled.\
\nThe Plug-In has to be reloaded\
\nin order to re-enable it."
return undone
}
}
set INIT_CB ""
if [info exists PLUGIN_G(INIT_CB)] {
set STATUS [$PLUGIN_G(INIT_CB) SSTAGE_INDEX]
if { $STATUS != 0} {
return
}
}
plugin_save_defaults $PLUGIN_G_NAME
set DEST_PATH [string trim $PLUGIN_G(DEST_PATH)]
if { [string length $DEST_PATH] == 0 } {
tku_popup_message error ok $NO_DEST_MESSAGE
return 1
}
set PLUGIN_G(DEST_PATH) $DEST_PATH
$WP_STAGE.stat configure -text "Working " -bg [c_lblue]
. configure -cursor watch
update idletasks
tclu_log_message "Stage: $STAGE_TEXT" normal
tclu_log_message " Starting..." normal
set STATUS [$STAGE_CB $MODE]
switch -- $STATUS {
"ok" {
set TEXT "Done "
set BG [c_aqua]
set STAGE_STATUS normal
}
"undone" {
set TEXT "Not done"
set BG [c_dblue]
set STAGE_STATUS normal
}
"cancel" {
set TEXT "Cancel "
set BG [c_eggyellow]
set STAGE_STATUS error
}
"error" {
set TEXT "Error "
set BG [c_red]
set STAGE_STATUS error
}
default { bgerror "Switch error plugin.tcl (1)" }
}
tclu_log_message \
"Stage: $STAGE_TEXT" $STAGE_STATUS
tclu_log_message \
" Ended with status: $TEXT" $STAGE_STATUS
$WP_STAGE.stat configure -text $TEXT -bg $BG
. configure -cursor left_ptr
update idletasks
return $STATUS
}
proc plugin.is_stage_active {STAGE} {
global VPIG
if [string match $VPIG(OFF_STAGE_PREFIX)* $STAGE] {
return 0
} else {
return 1
}
}
proc plugin.get_stage_name {STAGE} {
global VPIG
set TRUE_STAGE $STAGE
if [string match $VPIG(OFF_STAGE_PREFIX)* $STAGE] {
set TRUE_STAGE [string range $STAGE 2 end]
}
return $TRUE_STAGE
}
proc plugin.get_cb_name {PLUGIN_G_NAME STAGE} {
global VPIG
upvar #0 $PLUGIN_G_NAME PLUGIN_G
set TRUE_STAGE $STAGE
if [string match $VPIG(OFF_STAGE_PREFIX)* $STAGE] {
set TRUE_STAGE [string range $STAGE 2 end]
}
return [format "%s_%s_cb" $PLUGIN_G(PLUGIN_NAME) $TRUE_STAGE]
}
proc plugin.get_info_name {STAGE} {
global VPIG
set TRUE_STAGE $STAGE
if [string match $VPIG(OFF_STAGE_PREFIX)* $STAGE] {
set TRUE_STAGE [string range $STAGE 2 end]
}
return [format "%s_INFO" [string toupper $TRUE_STAGE]]
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -