diff options
Diffstat (limited to 'lib/maintab.tcl')
-rwxr-xr-x | lib/maintab.tcl | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/lib/maintab.tcl b/lib/maintab.tcl new file mode 100755 index 0000000..57f0351 --- /dev/null +++ b/lib/maintab.tcl @@ -0,0 +1,425 @@ +#!/usr/bin/tclsh +# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net ) + +############################################################################ +# Copyright (C) 2007-2009 by Martin Ošmera # +# martin.osmera@gmail.com # +# # +# 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; if not, write to the # +# Free Software Foundation, Inc., # +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # +############################################################################ + +# -------------------------------------------------------------------------- +# DESCRIPTION +# Manages central widget of this program, each instance of this class +# stands for one project +# -------------------------------------------------------------------------- + +source "${::LIB_DIRNAME}/pale/pale.tcl" ;# Peripheral Abstraction Layer Engine + +class MainTab { + inherit FileList BottomNoteBook Pale + + public variable fileList_Pane ;# ID of pane window containing list of files and editor + public variable top_Pane ;# ID of pane window containing fileList_Pane and right panel + public variable main_Pane ;# ID of pane window containing top_Pane and bottom panel + public variable rightPanel ;# ID of right panel container + + public variable projectName ;# Name of project related to this instance + public variable projectPath ;# Path to directory where the project file is located + public variable projectFile ;# Name of the project file + public variable procData ;# Processor definition list + public variable avaliable_SFR ;# List of SFR and SFB which are avaliable on the choosen MCU + + # Compiler configuration related variables + private variable PCC_native_assembler ;# --> ::Compiler::Settings::* + private variable PCC_selected_assembler ;# --> ::ExternalCompiler::selected_assembler + private variable PCC_ASEM51_config ;# --> ::ExternalCompiler::assembler_ASEM51_config + private variable PCC_ASEM51_addcfg ;# --> ::ExternalCompiler::assembler_ASEM51_addcfg + private variable PCC_ASL_config ;# --> ::ExternalCompiler::assembler_ASL_config + private variable PCC_ASL_addcfg ;# --> ::ExternalCompiler::assembler_ASL_addcfg + private variable PCC_AS31_config ;# --> ::ExternalCompiler::assembler_AS31_config + private variable PCC_AS31_addcfg ;# --> ::ExternalCompiler::assembler_AS31_addcfg + private variable PCC_sdcc_bool_opt ;# --> ::ExternalCompiler::sdcc_bool_options + private variable PCC_sdcc_str_opt ;# --> ::ExternalCompiler::sdcc_string_options + private variable PCC_sdcc_opt_str_opt ;# --> ::ExternalCompiler::sdcc_optional_string_options + private variable PCC_sdcc_scs_str_opt ;# --> ::ExternalCompiler::sdcc_scs_string_options + + ## Project information variables + # (P - project; G - general) + public variable P_information_version ;# Project version + public variable P_information_date ;# Date of last project update + public variable G_information_authors ;# List of project authors + public variable G_information_copyright ;# Project copyright information + public variable G_information_licence ;# Project licence information + public variable P_option_mcu_type ;# Processor type (e.g. AT89C51RC) + public variable P_option_clock ;# Project default simulator clock rate + public variable P_option_mcu_xdata ;# Size of external data memory + public variable P_option_mcu_xcode ;# Size of external program memory + public variable P_option_main_file ;# Project main source file + + public variable project_description ;# Project decription text + public variable todoText ;# Content of TODO list + public variable calculatorList ;# List of values for calculator (see class Calculator) + public variable other_options ;# Other options + public variable projectFiles ;# List of project source code files + + private variable mainTab ;# NoteBook tab identifier (container) + + ## Object constructor + # @parm String projectpath - Path to directory where the project file is located + # @parm String projectfile - Name of the project file + # @parm List dataList - Data extracted from project file (see NS Project) + constructor {ProjectName projectpath projectfile dataList} { + set projectName $ProjectName + + # + ## PARSE PROJECT DATA + # + + set i 0 + foreach info {version date} { + regsub -all {\\\}} [regsub -all {\\\{} [lindex $dataList "0 $i"] "{"] "}" P_information_$info + incr i + } + + set i 0 + foreach info {authors copyright licence} { + regsub -all {\\\}} [regsub -all {\\\{} [lindex $dataList "1 $i"] "{"] "}" G_information_$info + incr i + } + + set P_option_mcu_type [lindex $dataList {2 0}] + set P_option_clock [lindex $dataList {2 1}] + set P_option_mcu_xdata [lindex $dataList {2 2}] + set P_option_mcu_xcode [lindex $dataList {2 3}] + + set watches_file [lindex $dataList {3 0}] + set scenario_file [lindex $dataList {3 1}] + set P_option_main_file [lindex $dataList {3 2}] + set editor_sw_lock [lindex $dataList {3 3}] + set graphList [lindex $dataList 4] + + set project_description [lindex $dataList {5 0}] + regsub -all {\\\{} $project_description "{" project_description + regsub -all {\\\}} $project_description "}" project_description + set todoText [lindex $dataList {5 1}] + regsub -all {\\\{} $todoText "{" todoText + regsub -all {\\\}} $todoText "}" todoText + set calculatorList [lindex $dataList 6] + set other_options [lindex $dataList 7] + + # Load compiler configurations + if {[llength [lindex $dataList 8]]} { + array set PCC_native_assembler [lindex $dataList {8 0}] + set PCC_selected_assembler [lindex $dataList {8 1}] + array set PCC_ASEM51_config [lindex $dataList {8 2}] + array set PCC_ASEM51_addcfg [lindex $dataList {8 3}] + array set PCC_ASL_config [lindex $dataList {8 4}] + array set PCC_ASL_addcfg [lindex $dataList {8 5}] + array set PCC_sdcc_bool_opt [lindex $dataList {8 6}] + array set PCC_sdcc_str_opt [lindex $dataList {8 7}] + array set PCC_sdcc_opt_str_opt [lindex $dataList {8 8}] + array set PCC_sdcc_scs_str_opt [lindex $dataList {8 9}] + + if {[llength [lindex $dataList 8]] > 10} { + array set PCC_AS31_config [lindex $dataList {8 10}] + array set PCC_AS31_addcfg [lindex $dataList {8 11}] + } + } { + retrieve_compiler_settings + } + + set projectFiles [lindex $dataList 9] + + # Load default values if the given values is not valid + if {[lsearch ${::X::avaliable_processors} $P_option_mcu_type] == -1} { + set P_option_mcu_type [lindex ${X::project_edit_defaults} {0 1}] + puts stderr "Unsupported processor type -- setting to [lindex ${X::project_edit_defaults} {0 1}]" + } + set procData [SelectMCU::get_processor_details $P_option_mcu_type] + if {$procData == {}} { + wm withdraw . + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "FATAL ERROR"] \ + -message [mc "MCUs database file is currupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE."] + exit 1 + } + refresh_project_avaliable_SFR + if {![string is digit -strict $P_option_mcu_xdata] || $P_option_mcu_xdata > 0xFFFF} { + set P_option_mcu_xdata 0 + puts "Invalid XDATA capacity -- setting to 0" + } + if { + ![string is digit -strict $P_option_mcu_xcode] + || + $P_option_mcu_xcode > [expr {0xFFFF - ([lindex $procData 2] * 1024)}] + } { + set P_option_mcu_xcode 0 + puts "Invalid XCODE capacity -- setting to 0" + } + if {[lindex $procData 0] != {yes}} { + set P_option_mcu_xdata 0 + } + if {[lindex $procData 1] != {yes}} { + set P_option_mcu_xcode 0 + } + if {[regexp {^\d+$} $P_option_clock]} { + if {$P_option_clock > 99999} { + set P_option_clock [lindex ${X::project_edit_defaults} {1 1}] + puts stderr "Clock value must be below 99999 -- setting to [lindex ${X::project_edit_defaults} {1 1}]" + } + } { + set P_option_clock [lindex ${X::project_edit_defaults} {1 1}] + puts stderr "Invalid clock value -- setting to [lindex ${X::project_edit_defaults} {1 1}]" + } + if {![string is boolean -strict $editor_sw_lock]} { + puts stderr "Invalid file switching lock value -- setting to 1" + set editor_sw_lock 1 + } + + # set some object variables + set projectPath $projectpath + set projectFile $projectfile + + # create higher-level container + set mainTab [.mainFrame.mainNB insert end \ + [string trimleft $this {:}] \ + -text $projectName \ + -image ::ICONS::16::kcmdevices \ + -raisecmd "X::switch_project $this" \ + ] + + # Some workaround -- only a "cosmetic" matter + catch { + .mainFrame.mainNB.c bind p:[string trimleft $this {:}] <Enter> {} + } + + # create paned windows + set main_Pane [panedwindow $mainTab.main_Pane \ + -orient vertical \ + -sashwidth 2 \ + -showhandle 0 \ + -opaqueresize 1 \ + -sashrelief flat \ + ] + set top_Pane [panedwindow $main_Pane.top_Pane \ + -orient horizontal \ + -sashwidth 2 \ + -showhandle 0 \ + -opaqueresize 1 \ + -sashrelief flat \ + ] + set fileList_Pane [panedwindow $top_Pane.fileList_Pane \ + -orient horizontal \ + -sashwidth 2 \ + -showhandle 0 \ + -opaqueresize 1 \ + -sashrelief flat \ + ] + + # Initalize mainTab + set bottom_pane [frame $main_Pane.bottomNB] + set rightPanel [frame $top_Pane.rightPanel] + + # Insert all widgets at places where there should be + $top_Pane add $fileList_Pane + $top_Pane add $rightPanel + $main_Pane add $top_Pane + $main_Pane add $bottom_pane + + # Intialize all panels + simulator_initialize_mcu + Initialize_rightPanel $rightPanel $top_Pane $watches_file + initiate_BottomNoteBook $bottom_pane $main_Pane $todoText $calculatorList $graphList + initiate_FileList $fileList_Pane $projectPath $projectFiles $editor_sw_lock + + # Adjust progress dialog invoked from procedure initiate_FileList + catch {.prgDl configure -command {puts stderr "Unable to abort at this stage !"}} + set ::FileList::open_files_cur_file {Finishing ...} + + # Pack main pane + pack $main_Pane -expand 1 -fill both + + # Raise last tab in mainNB + .mainFrame.mainNB raise [string trimleft $this {:}] + + # Take care of proper geometry management + bottomNB_redraw_pane + right_panel_redraw_pane + todo_panel_redraw_pane + filelist_adjust_size_of_tabbar + + # Highlight all loaded source codes, import breakpoints and bookmarks etc. + filelist_global_highlight + + ensure_that_both_editors_are_properly_initialized + + # Load scenario file + if {[pale_open_scenario $scenario_file] == 1} { + tk_messageBox \ + -type ok \ + -icon error \ + -title [mc "IO Error"] \ + -message [mc "Unable to open VHW file:\n\"%s\"" $filename] + } + + # (just workaround ...) + $this rightPanel_refresh_font_settings 1 + + # Destroy progress dialog invoked from procedure initiate_FileList + catch {destroy .prgDl} + } + + ## Object destructor + destructor { + .mainFrame.mainNB delete [string trimleft $this {:}] + } + + ## Kill all child processes + # @return void + public method kill_childern {} { + $this terminal_kill_childern + $this filelist_kill_childern + $this hw_man_kill_childern + } + + ## Refresh list of avaliable SFR and SFB + # @return void + public method refresh_project_avaliable_SFR {} { + set avaliable_SFR [concat [lindex $procData 43] { + R0 R1 R2 R3 R4 R5 R6 R7 + B ACC A TMOD TH0 TH1 SP DPL DPH PCON + TL0 TL1 AB DPTR + RXD TXD INT0 INT1 T0 T1 WR RD + + PSW C CY AC F0 RS1 RS0 OV P + IE EA ET1 EX1 ET0 EX0 + IP PT1 PX1 PT0 PX0 + TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 + }] ;# REGISTER BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 + + foreach editor [$this cget -editors] { + $editor refresh_avaliable_SFR + } + } + + ## Adjust the compilers settings to the current project configuration + # @return void + public method adjust_compiler_settings {} { + # Native assembler + foreach key [array names PCC_native_assembler] { + set ::Compiler::Settings::$key $PCC_native_assembler($key) + } + + ## Preferred assembler + set ::ExternalCompiler::selected_assembler $PCC_selected_assembler + ## ASEM-51 + array set ::ExternalCompiler::assembler_ASEM51_config \ + [array get PCC_ASEM51_config] + array set ::ExternalCompiler::assembler_ASEM51_addcfg \ + [array get PCC_ASEM51_addcfg] + ## ASL + array set ::ExternalCompiler::assembler_ASL_config \ + [array get PCC_ASL_config] + array set ::ExternalCompiler::assembler_ASL_addcfg \ + [array get PCC_ASL_addcfg] + ## AS31 + array set ::ExternalCompiler::assembler_AS31_config \ + [array get PCC_AS31_config] + array set ::ExternalCompiler::assembler_AS31_addcfg \ + [array get PCC_AS31_addcfg] + ## SDCC + # Copy boolean options + array set ::ExternalCompiler::sdcc_bool_options \ + [array get PCC_sdcc_bool_opt] + # Copy string options + array set ::ExternalCompiler::sdcc_string_options \ + [array get PCC_sdcc_str_opt] + # Copy optional strings + array set ::ExternalCompiler::sdcc_optional_string_options \ + [array get PCC_sdcc_opt_str_opt] + # Copy semicolon separated optional string options + array set ::ExternalCompiler::sdcc_scs_string_options \ + [array get PCC_sdcc_scs_str_opt] + } + + ## Adjust the current project configuration to the compilers settings + # @return void + public method retrieve_compiler_settings {} { + # Native assembler + foreach key ${::configDialogs::compiler::defaults} { + set key [lindex $key 0] + set PCC_native_assembler($key) [subst "\$::Compiler::Settings::$key"] + } + set PCC_native_assembler(WARNING_LEVEL) \ + ${::Compiler::Settings::WARNING_LEVEL} + set PCC_native_assembler(max_ihex_rec_length) \ + ${::Compiler::Settings::max_ihex_rec_length} + + ## Preferred assembler + set PCC_selected_assembler $::ExternalCompiler::selected_assembler + ## ASEM-51 + array set PCC_ASEM51_config \ + [array get ::ExternalCompiler::assembler_ASEM51_config] + array set PCC_ASEM51_addcfg \ + [array get ::ExternalCompiler::assembler_ASEM51_addcfg] + ## ASL + array set PCC_ASL_config \ + [array get ::ExternalCompiler::assembler_ASL_config] + array set PCC_ASL_addcfg \ + [array get ::ExternalCompiler::assembler_ASL_addcfg] + ## AS31 + array set PCC_AS31_config \ + [array get ::ExternalCompiler::assembler_AS31_config] + array set PCC_AS31_addcfg \ + [array get ::ExternalCompiler::assembler_AS31_addcfg] + + ## SDCC + # Copy boolean options + array set PCC_sdcc_bool_opt \ + [array get ::ExternalCompiler::sdcc_bool_options] + # Copy string options + array set PCC_sdcc_str_opt \ + [array get ::ExternalCompiler::sdcc_string_options] + # Copy optional strings + array set PCC_sdcc_opt_str_opt \ + [array get ::ExternalCompiler::sdcc_optional_string_options] + # Copy semicolon separated optional string options + array set PCC_sdcc_scs_str_opt \ + [array get ::ExternalCompiler::sdcc_scs_string_options] + } + + ## Get compilers configuration (intended for project saving) + # @return void + public method get_compiler_config {} { + return [list \ + [array get PCC_native_assembler]\ + $PCC_selected_assembler \ + [array get PCC_ASEM51_config] \ + [array get PCC_ASEM51_addcfg] \ + [array get PCC_ASL_config] \ + [array get PCC_ASL_addcfg] \ + [array get PCC_sdcc_bool_opt] \ + [array get PCC_sdcc_str_opt] \ + [array get PCC_sdcc_opt_str_opt]\ + [array get PCC_sdcc_scs_str_opt]\ + [array get PCC_AS31_config] \ + [array get PCC_AS31_addcfg] \ + ] + } +} |