⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.tcl

📁 genesis 2000 v9.1软件下载
💻 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 + -