huawei-utils/cmd-generator/cmdgen.tcl

1068 lines
40 KiB
Tcl
Raw Normal View History

2015-10-19 14:59:26 +03:00
#!/usr/bin/wish
######################################################
# HUAWEI command generator
# Distributed under GNU Public License
# Author: Sergey Kalinin
# Copyright (c) "Vimpelcom ltd", 2010,
######################################################
set ver 1.1.2
package require tablelist
package require BWidget
package require Ttk
#BWidget::use -package ttk -setoptdb 1 -style default
set dirWork [pwd]
set rootDir $dirWork
set dirFields $dirWork
set fontNormal "tahoma 10 normal roman"
# Bold Font #
set fontBold "tahoma 10 bold roman"
######################################################
# создаём файло со списком полей каждой таблицы из кучи файлов.
######################################################
proc ReadField {dir} {
global dirWork dirFields
cd $dir
set lstFiles [glob -nocomplain *.txt]
#set filesCount [llength $lstFiles]
#ProgressDlg .prg -textvariable PROGTXT -variable PROGINC \
-type nonincremental_infinite -maximum 100
destroy .frmStatus.frmActive.prg
ProgressBar .frmStatus.frmActive.prg -variable PROGINC -type nonincremental_infinite -maximum 100
pack .frmStatus.frmActive.lblActive -fill x -side left
pack .frmStatus.frmActive.prg -side left
set ::PROGTXT "Reading the files"
set ::PROGINC -1
foreach file [lsort $lstFiles] {
set ::PROGTXT "Reading the - $file"
set f [open $file r]
while {[gets $f line]>=0} {
if [regexp -nocase -all -- {([a-zA-Z]+)\s([a-zA-Z0-9]+):(.+?)} $line match command table params] {
set l [split $params ", "]
for {set i 1} {$i < [llength $l]} {incr i} {
if [regexp -nocase -all -- {([a-zA-Z0-9]+)=(.+?)} [lindex $l $i] match par val] {
if {[info exists lst($table)] == 0} {
lappend lst($table) "$par"
} else {
if {[lsearch -exact $lst($table) $par] < 0} {
lappend lst($table) "$par"
} else {
}
}
}
}
}
incr ::PROGINC
}
}
update
set fOut [open [file join $dirFields fields] w]
foreach n [array names lst] {puts $fOut "$n : [string toupper $lst($n)]"}
close $fOut
destroy .frmStatus.frmActive.prg
destroy .frmStatus.frmActive.lblActive
}
#########################################
## Читаем файл со списком полей и делаем массив списков #
########################################
proc ReadHeader {file} {
global arrFields dirWork
if [info exists arrFields] {
unset arrFields
}
if {[file exists $file] == 0} {
set dir [tk_chooseDirectory -title "Select directory with CVTMML files"]
ReadField $dir
}
set f [open $file r]
while {[gets $f line]>=0} {
if [regexp -nocase -all -- {([a-zA-Z0-9]+)\s:\s(.+?)} $line match table params] {
set l [split $params " "]
for {set i 0} {$i < [llength $l]} {incr i} {
set par [lindex $l $i]
lappend arrFields($table) "$par"
}
}
}
}
proc ReadFile {file} {
global lst
if [info exists lst] {
unset lst
}
set f [open $file r]
gets $f line
if [regexp -nocase -all -- {([a-zA-Z]+)\s([a-zA-Z0-9]+):(.+?)} $line match command table params] {
set l [split $params ", "]
for {set i 1} {$i < [llength $l]} {incr i} {
if [regexp -nocase -all -- {([a-zA-Z]+)=(.+?)} [lindex $l $i] match par val] {
lappend lst($table) "$par=$val"
}
}
}
}
proc CloseFile {} {
global noteBook bookmarkList
set node [$noteBook raise]
if {$node eq ""} {
return
}
set index [$noteBook index $node]
$noteBook delete $node 1
unset bookmarkList($node)
set firstNode [$noteBook pages 0]
$noteBook raise $firstNode
if {$firstNode eq ""} {
.frmTool.btnFileClose configure -state disable
.frmTool.btnSaveTable configure -state disable
.frmTool.btnSaveText configure -state disable
.frmTool.entFilter configure -text ""
.frmTool.entFilter configure -state disabled
.frmTool.btnFilterOn configure -state disable
.frmTool.btnFilterOff configure -state disable
.frmStatus.frmLine.lblLine configure -text ""
}
}
proc CloseAllFile {} {
global noteBook bookmarkList
foreach node [$noteBook pages] {
set index [$noteBook index $node]
$noteBook delete $node 1
if [info exists bookmarkList($node)] {
unset bookmarkList($node)
}
}
.frmTool.btnFileClose configure -state disable
.frmTool.btnSaveTable configure -state disable
.frmTool.btnSaveText configure -state disable
.frmTool.entFilter configure -text ""
.frmTool.entFilter configure -state disabled
.frmTool.btnFilterOn configure -state disable
.frmTool.btnFilterOff configure -state disable
.frmStatus.frmLine.lblLine configure -text ""
.frmStatus.frmFilter.lblFilter configure -text ""
}
##################################
## Centered window ##
##################################
proc CentreWindow {w {width 640} {height 480} } {
set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }]
set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }]
wm geometry $w ${width}x${height}+${x}+${y}
}
# sync scroll
proc Scroll {lst txt args} {
if {[lindex $args 0] eq "scroll"} {
$lst yview [lindex $args 0] [lindex $args 1] [lindex $args 2]
$txt yview [lindex $args 0] [lindex $args 1] [lindex $args 2]
#.frmBody.frmCat.lst yview [lindex $args 0] [lindex $args 1] [lindex $args 2]
#.frmBody.frmCat.txt yview [lindex $args 0] [lindex $args 1] [lindex $args 2]
} elseif {[lindex $args 0] eq "moveto"} {
#.frmBody.frmCat.lst yview [lindex $args 0] [lindex $args 1]
#.frmBody.frmCat.txt yview [lindex $args 0] [lindex $args 1]
$lst yview [lindex $args 0] [lindex $args 1]
$txt yview [lindex $args 0] [lindex $args 1]
}
}
##################################
## Create Pane Widget ##
##################################
namespace eval pane {
namespace export create
proc create { f1 f2 args } {
set t(-orient) vertical
set t(-percent) 0.25
set t(-gripcolor) gray75
set t(-gripposition) 0.95
set t(-gripcursor) crosshair
set t(-in) [winfo parent $f1]
array set t $args
set master $t(-in)
upvar #0 [namespace current]::Pane$master pane
array set pane [array get t]
if {! [string match v* $pane(-orient)] } {
set pane(-gripcursor) sb_v_double_arrow
set height 5 ; set width 3000
} else {
set pane(-gripcursor) sb_h_double_arrow
set height 3000 ; set width 5
}
set pane(1) $f1
set pane(2) $f2
set pane(grip) [frame $master.grip -background $pane(-gripcolor) \
-width $width -height $height \
-bd 1 -relief raised -cursor $pane(-gripcursor)]
if {! [string match v* $pane(-orient)] } {
set pane(D) Y
place $pane(1) -in $master -x 0 -rely 0.0 -anchor nw -relwidth 1.0 -height -1
place $pane(2) -in $master -x 0 -rely 1.0 -anchor sw -relwidth 1.0 -height -1
place $pane(grip) -in $master -anchor c -relx $pane(-gripposition)
} else {
set pane(D) X
place $pane(1) -in $master -relx 0.0 -y 0 -anchor nw -relheight 1.0 -width -1
place $pane(2) -in $master -relx 1.0 -y 0 -anchor ne -relheight 1.0 -width -1
place $pane(grip) -in $master -anchor c -rely 0 ;#$pane(-gripposition)
}
$master configure -background gray50
bind $master <Configure> [list [namespace current]::PaneGeometry $master]
bind $pane(grip) <ButtonPress-1> \
[list [namespace current]::PaneDrag $master %$pane(D)]
bind $pane(grip) <B1-Motion> \
[list [namespace current]::PaneDrag $master %$pane(D)]
bind $pane(grip) <ButtonRelease-1> \
[list [namespace current]::PaneStop $master]
[namespace current]::PaneGeometry $master
}
proc PaneDrag { master D } {
upvar #0 [namespace current]::Pane$master pane
if {[info exists pane(lastD)]} {
set delta [expr double($pane(lastD) - $D) \
/ $pane(size)]
set pane(-percent) [expr $pane(-percent) - $delta]
if {$pane(-percent) < 0.0} {
set pane(-percent) 0.0
} elseif {$pane(-percent) > 1.0} {
set pane(-percent) 1.0
}
[namespace current]::PaneGeometry $master
}
set pane(lastD) $D
}
proc PaneStop { master } {
upvar #0 [namespace current]::Pane$master pane
catch {unset pane(lastD)}
}
proc PaneGeometry { master } {
upvar #0 [namespace current]::Pane$master pane
if {$pane(D) == "X"} {
place $pane(1) -relwidth $pane(-percent)
place $pane(2) -relwidth [expr 1.0 - $pane(-percent)]
place $pane(grip) -relx $pane(-percent)
set pane(size) [winfo width $master]
} else {
place $pane(1) -relheight $pane(-percent)
place $pane(2) -relheight [expr 1.0 - $pane(-percent)]
place $pane(grip) -rely $pane(-percent)
set pane(size) [winfo height $master]
}
}
}
##################################
## Exit procedure ##
#################################
proc Quit {} {
global bookmarkList rootDir tcl_platform
set f [open [file join $rootDir .bookmarks] w]
foreach item [array names bookmarkList] {
puts $f [file nativename $bookmarkList($item)]
}
close $f
if {$tcl_platform(os) eq "Windows NT"} {
#file attributes [file join $rootDir .bookmarks] -hidden true
}
exit
}
proc PopupMenuTable {x y} {
global fontNormal
if [winfo exists .popupTbl] {
destroy .popupTbl
}
set m .popupTbl
set menu [menu $m -font $fontNormal -title Clipboard]
$m add command -label "Copy cell" -command {Copy cell}\
-font $fontNormal -accelerator "Ctrl+C"
$m add command -label "Copy row" -command {Copy row}\
-font $fontNormal
$m add command -label "Copy command" -command CopySelectedCommand\
-font $fontNormal
$m add separator
$m add command -label "Filter" -command {FilterOn menu}\
-font $fontNormal
tk_popup $menu $x $y
}
##################################
## Opened file procedure ##
##################################
proc OpenFile {{file_ ""}} {
global arrFields dirWork dirFields noteBook fontNormal bookmarkList lstColumnWidth
set types {
{{Text Files} {.txt} }
{{All Files} * }
}
if {$file_ eq ""} {
set file [tk_getOpenFile -filetypes $types -initialdir $dirWork]
} else {
set file $file_
}
if {$file eq ""} {
return
}
set dirWork [file dirname $file]
# заменяем пробелы в имени файла для удобства работы
regsub -all -- {\s} [file rootname [file tail $file]] "_" nodeName
# открываем файл и читаем до тех пор пока не попадется строка соответствующая шаблону
# и вставляем страницу в noteBook
set f [open $file r]
while [gets $f l] {
if [regexp -nocase -all -- {([a-zA-Z]+)\s([a-zA-Z0-9]+):(.+?)} $l match command tableName params] {
set node [$noteBook insert end $nodeName -text "$tableName" -raisecmd RaisedNodeService]
break ;# дальше можно не читать - название таблицы получено
}
}
# переместим указатель в файле на начало
seek $f 0 start
## CREATE PANE ##
set frmBody [frame $node.frm -border 1 -relief raised]
pack $frmBody -side top -expand true -fill both
set frmText [frame $frmBody.frmText -relief sunken -border 1]
#set frmText [ScrollableFrame $frmBody.frmText -xscrollincrement 0 -yscrollincrement 0]
pack $frmText -side left -fill both -expand true
#set frmTable [frame $frmBody.frmTable -border 1 -relief sunken]
set frmTable [ScrolledWindow $node.frmTable]
pack $frmTable -side left -fill both -expand true
pane::create $frmText $frmTable -orient horizontal
set listBox [text $frmText.lst -yscrollcommand "$frmText.yscroll set" -width 6 -borderwidth 0 -relief flat -font $fontNormal]
set txt [text $frmText.txt -wrap none -yscrollcommand "$frmText.yscroll set" -borderwidth 0 -relief flat -font $fontNormal -width 30]
scrollbar $frmText.yscroll -relief sunken -borderwidth {1} -width {10} -takefocus 0 -command "Scroll $listBox $txt"
#scrollbar $frmBody.xscroll -relief sunken -borderwidth {1} -width {10} -takefocus 0 -command "$txt xview"
#pack $frmText.yscroll -side top -fill y
pack $listBox -side left -fill y
pack $txt -side left -fill both -expand true
pack $frmText.yscroll -side left -fill y
# $frmText setwidget $listBox
#$frmText setwidget $txt
#bind $txt <Button-4> "$listBox yview scroll -3 units"
#bind $listBox <Button-5> "$listBox yview scroll 3 units"
#bind $txt <Button-4> "Scroll $listBox $txt"
#bind $listBox <Button-5> "Scroll $listBox $txt"
if [info exists arrFields($tableName)] {
set tbl [CreateTable $arrFields($tableName) $frmTable $txt]
} else {
set doit [MessageDlg .msg -type yesno -title "Info message" -message "$tableName not found in =fields= file. Needed reinitialisation. Do it?"]
switch -exact $doit {
0 {
CloseAllFile
ReadField [file dirname $file]
ReadHeader [file join $dirFields fields]
#CloseFile
#OpenFile $file
return
}
1 {$noteBook delete $nodeName; return}
# tk_messageBox -title Error -icon error -type ok -message "Reinitialisation needed"
}
}
## TABS popups ##
set bookmarkList($nodeName) $file
#ProgressDlg .prg -textvariable PROGTXT -variable PROGINC -type infinite -maximum 1000
ProgressBar .frmStatus.frmActive.prg -variable PROGINC -type nonincremental_infinite -maximum 100
pack .frmStatus.frmActive.prg -fill x -side left
set ::PROGTXT "Reading the file"
set ::PROGINC -1
$listBox delete 0.0 end
$txt delete 0.0 end
set rowCount 0
if [info exists lstColumnName] {
unset lstColumnName
}
# список с размерами полей, для первого максимально 6 знаков
set lstColumnWidth($nodeName,0) 6
for {set col 1} {$col < [$tbl columncount]} {incr col} {
set lstColumnWidth($nodeName,$col) 0
# делаем список содержащий имена параметров
# опосля, их заменим на значения и сунем в таблицу
lappend lstColumnName "=[$tbl columncget $col -name]="
}
while {[gets $f line]>=0} {
$txt insert end "$line\n"
set line [string trim $line ";"]
$listBox insert end "$rowCount\n"
if [info exists lstVal] {
unset lstVal
}
lappend lstVal $rowCount
set lstVal [concat $lstVal $lstColumnName]
if [regexp -nocase -all -- {([a-zA-Z]+)\s([a-zA-Z0-9]+):(.+?)} $line match command table params] {
set l [split $params ", "]
set y 1
for {set i 0} {$i < [llength $l]} {incr i} {
if [regexp -nocase -all -- {([a-zA-Z0-9]+)=(.+?)} [lindex $l $i] match par val] {
##### FUCK ########
# заменяем в списке имена параметров на их значения
set item [lsearch -exact $lstVal "=[string toupper $par]="]
# проверяем наличие параметра из командника в fields если нету запустим переинициализацию
if {$item eq -1} {
set doit [MessageDlg .msg -type yesnocancel -title "Info message" -message "Parametr =$par= not found in =fields= file. Needed reinitialisation. Do it?"]
switch -exact $doit {
0 {
CloseAllFile
ReadField [file dirname $file]
ReadHeader [file join $dirFields fields]
OpenFile $file
#return
}
1 {}
2 { update; destroy .prg; return}
}
}
set lstVal [lreplace $lstVal $item $item [string trim $val "\""]]
# вычисляем макс. кол-во символов для каждого столбца
set length [string length $val]
if [info exists lstColumnWidth($nodeName,$y)] {
if {$lstColumnWidth($nodeName,$y) < $length} {
set lstColumnWidth($nodeName,$y) $length
}
}
incr y
}
}
# меняем оставшиеся потроха на пустое значение
while {[lsearch -glob $lstVal "=*="] !=-1} {
set item [lsearch -glob $lstVal "=*="]
set lstVal [lreplace $lstVal $item $item " "]
#puts "$item $lstVal"
}
$tbl insert end $lstVal
}
incr ::PROGINC
incr rowCount
}
update
destroy .frmStatus.frmActive.prg
close $f
$noteBook raise $nodeName
# уберём упомнинание о включенном фильтре
.frmStatus.frmFilter.lblFilter configure -text ""
# включим нужные кнопочки окошечки
.frmTool.btnFileClose configure -state normal
.frmTool.btnSaveTable configure -state normal
.frmTool.btnSaveText configure -state normal
.frmTool.entFilter configure -state normal
.frmTool.btnFilterOn configure -state normal
.frmStatus.frmLine.lblLine configure -text "$rowCount str."
}
##################################
## Created table widget ##
##################################
proc CreateTable {lstHeader frmTbl text} {
set tbl [tablelist::tablelist $frmTbl.tbl -stretch all -selectmode extended -selecttype cell -background white \
-showseparators yes -stripebackground #ecf6eb -xscrollcommand "" -yscrollcommand ""]
$frmTbl setwidget $tbl
#pack $frmTbl -side left -fill both -expand true
set i 1
$tbl insertcolumns end 0 "#"
foreach n $lstHeader {
set n [string toupper $n]
$tbl insertcolumns end 0 "$n"
$tbl columnconfigure $i -sortmode ascii -name $n
incr i
}
$tbl columnconfigure 0 -sortmode integer -name "number"
bind [$tbl bodytag] <Double-Button-1> {
foreach {tablelist::W tablelist::x tablelist::y} \
[tablelist::convEventFields %W %x %y] {}
#puts "clicked on cell [$tbl containingcell $tablelist::x $tablelist::y]"
SearchText
}
bind [$tbl bodytag] <Button-3> {catch [PopupMenuTable %X %Y]}
return $tbl
}
##################################
#### ищем текст и подсвечиваем его #####
##################################
proc SearchText {} {
global noteBook
set txt .frmBody.noteBook.f[$noteBook raise].frm.frmText.txt
set tbl .frmBody.noteBook.f[$noteBook raise].frmTable.tbl
set listBox .frmBody.noteBook.f[$noteBook raise].frm.frmText.lst
set row [$tbl containing $tablelist::y]
if {$row eq "-1"} {
return
}
set ind [expr [$tbl getcells $row,0] +1]
$txt tag delete select
$txt tag configure select -background grey
$txt tag add select $ind.0 $ind.end
$listBox tag delete select
$listBox tag configure select -background grey
$listBox tag add select $ind.0 $ind.end
$txt see $ind.0
$listBox see $ind.0
}
############################################
#### ищем команды в тексте для фильтрованных записей #####
###########################################
proc SearchFilteredText {} {
global noteBook
set txt .frmBody.noteBook.f[$noteBook raise].frm.frmText.txt
set tbl .frmBody.noteBook.f[$noteBook raise].frmTable.tbl
set listBox .frmBody.noteBook.f[$noteBook raise].frm.frmText.lst
$txt tag delete filtered
$txt tag configure filtered -background #abedbb
$listBox tag delete filtered
$listBox tag configure filtered -background #abedbb
# получаем индексы строк
foreach ind [$tbl getkeys 0 end] {
# проверям скрыты или нет
if {[$tbl rowcget $ind -hide] == 0} {
set index [expr [$tbl getcells $ind,0] +1]
#puts "$index - visible"
#set ind [expr [$tbl getcells $row,0] +1]
$txt tag add filtered $index.0 $index.end
$listBox tag add filtered $index.0 $index.end
$txt see $index.0
$listBox see $index.0
}
}
}
##############################################
#### Копируем в буфер команды на основе выделенных ячеек #####
##############################################
proc CopySelectedCommand {} {
global noteBook
clipboard clear
set txt .frmBody.noteBook.f[$noteBook raise].frm.frmText.txt
set tbl .frmBody.noteBook.f[$noteBook raise].frmTable.tbl
set listBox .frmBody.noteBook.f[$noteBook raise].frm.frmText.lst
#$tbl selection includes index
#puts
foreach ind [$tbl curselection ] {
# проверям скрыты или нет
if {[$tbl rowcget $ind -hide] == 0} {
set index [expr [$tbl getcells $ind,0] +1]
append selectedCommand "[string trim [$txt get $index.0 $index.end]]\n"
#$listBox tag add filtered $index.0 $index.end
#$txt see $index.0
#$listBox see $index.0
}
}
clipboard append [string trim $selectedCommand]
}
##########################################
#### Копируем в буфер содержимое выделенных ячеек #####
##########################################
proc Copy {type} {
global noteBook
clipboard clear
set txt .frmBody.noteBook.f[$noteBook raise].frm.frmText.txt
set tbl .frmBody.noteBook.f[$noteBook raise].frmTable.tbl
switch $type {
"cell" {
foreach row [$tbl curselection ] {
foreach ind [$tbl curcellselection ] {
set rowInd [lindex [split $ind ","] 0]
if {$rowInd eq $row} {
append selectedData "[string trim [$tbl getcells $ind]]\t"
}
}
append selectedData "\n"
}
}
"row" {
foreach ind [$tbl curselection ] {
append selectedData "[string trim [$tbl getcells $ind,0 $ind,end]]\n"
puts [regsub -all -- "\{ \}" $selectedData " " selectedData]
}
}
}
clipboard append [string trim $selectedData]
}
##################################
#### главная процедурка в программе #####
##################################
proc AboutDialog {} {
global ver fontNormal fontBold
set w ".about"
set w_exist [winfo exists $w]
if !$w_exist {
toplevel $w
wm title $w "About"
wm overrideredirect $w 0
wm positionfrom $w program
wm resizable $w 0 0
CentreWindow $w 500 200
#frame $w.frmImg -borderwidth 2 -relief ridge -background white
#set imgAbout [image create photo -data $picturedata]
#image create photo imgAbout -format gif -file $homeDir/img/mytcladmin.gif
frame $w.frm -borderwidth 2 -relief ridge
#label $w.frm.lblImg -image $imgAbout
#pack $w.frmImg.lblImg -side top -expand true -fill both
frame $w.frm.frmlbl -borderwidth 0 -relief ridge
label $w.frm.frmlbl.lblHeader -font $fontNormal -text "This is visual tool for working with files generated by HUAWEI CVTmml"
label $w.frm.frmlbl.lblVersion -font $fontNormal -text "Version: $ver"
label $w.frm.frmlbl.lblLicense -font $fontNormal -text "Licensed by GNU Public License"
label $w.frm.frmlbl.lblCompany -font $fontNormal -text "Copyright: Sergey Kalinin, 2010"
label $w.frm.frmlbl.lblAuthor -font $fontNormal -text "Author: Sergey Kalinin"
label $w.frm.frmlbl.lblEmail -font $fontNormal -cursor hand1 -text "E-Mail: banzaj28@gmail.com"
pack $w.frm.frmlbl.lblHeader $w.frm.frmlbl.lblVersion $w.frm.frmlbl.lblLicense $w.frm.frmlbl.lblCompany \
$w.frm.frmlbl.lblAuthor $w.frm.frmlbl.lblEmail -side top -padx 5
frame $w.frmBtn -borderwidth 2 -relief ridge
button $w.frmBtn.btnOk -text "Close" -font $fontNormal -borderwidth {1} \
-command "destroy .about"
bind $w <KeyRelease-Return> "destroy .about"
pack $w.frmBtn.btnOk -pady 5
#pack $w.frm.lblImg $w.frm.frmlbl -side left -expand true -fill x -anchor center
pack $w.frm.frmlbl -side left -expand true -fill x -anchor center
pack $w.frm -side top -expand true -fill both
pack $w.frmBtn -side top -fill x
focus $w.frmBtn.btnOk
bind .about <Escape> {destroy .about}
}
}
proc HelpDialog {} {
global ver fontNormal fontBold tcl_platform
set w ".help"
set w_exist [winfo exists $w]
if !$w_exist {
toplevel $w
wm title $w "Help"
wm overrideredirect $w 0
wm positionfrom $w user
wm resizable $w 1 1
CentreWindow $w 640 480
frame $w.frmTxtHelp -borderwidth 2 -relief ridge
frame $w.frmBtn -borderwidth 2 -relief ridge
pack $w.frmTxtHelp -expand true -fill both
pack $w.frmBtn -fill x
set helpText [text $w.frmTxtHelp.txt -wrap none -yscrollcommand "$w.frmTxtHelp.yscroll set" -borderwidth 0 -relief flat -wrap word -font $fontNormal]
scrollbar $w.frmTxtHelp.yscroll -relief sunken -borderwidth {1} -width {10} -takefocus 0 -command {$helpText yview }
pack $helpText -fill both -expand true -side left
pack $w.frmTxtHelp.yscroll -fill y -expand true -side left
button $w.frmBtn.btnOk -text "Close" -font $fontNormal -borderwidth {1} -command "destroy .help"
bind $w <KeyRelease-Return> "destroy .help"
pack $w.frmBtn.btnOk -pady 5
focus $w.frmBtn.btnOk
bind .help <Escape> {destroy .help}
set text "See README.html"
$helpText insert end $text
}
}
#######################################################
#### включаем фильтру для отображения записей согласно критерия ########
######################################################
proc FilterOn {args} {
global noteBook filtered
set tblName [$noteBook raise]
set txt .frmBody.noteBook.f$tblName.frm.frmText.txt
set tbl .frmBody.noteBook.f$tblName.frmTable.tbl
set listBox .frmBody.noteBook.f$tblName.frm.frmText.lst
switch $args {
"menu" {
$tbl sortbycolumn [lindex [split [$tbl curcellselection ] ","] 1] -increasing
set data [string trim [$tbl getcells [$tbl curcellselection ]]]
.frmTool.entFilter configure -text "$data"
}
}
set text [.frmTool.entFilter get ]
if {$text eq ""} {
MessageDlg .msg -type ok -title "Info message" -message "Enter filter criteria"
return
}
set colindex [$tbl sortcolumn]
if {$colindex == -1} {
MessageDlg .msg -type ok -title "Info message" -message "Select sorting column first."
return
}
set rowIndex 0
foreach item [$tbl getcells 0,$colindex end,$colindex] {
if {[string match [string tolower $text] [string tolower $item]] == 0 } {
$tbl rowconfigure $rowIndex -hide 1
}
incr rowIndex
}
set filtered($tblName) [list [string toupper [$tbl columncget $colindex -title]] $text]
.frmStatus.frmFilter.lblFilter configure -text "[string toupper [$tbl columncget $colindex -title]]=\"$text\""
.frmTool.btnFilterOff configure -state normal
SearchFilteredText
}
proc FilterOff {} {
global noteBook filtered
set tblName [$noteBook raise]
set tbl .frmBody.noteBook.f$tblName.frmTable.tbl
set txt .frmBody.noteBook.f$tblName.frm.frmText.txt
set listBox .frmBody.noteBook.f$tblName.frm.frmText.lst
foreach ind [$tbl getkeys 0 end] {
$tbl rowconfigure $ind -hide 0
}
.frmStatus.frmFilter.lblFilter configure -text ""
unset filtered($tblName)
.frmTool.btnFilterOff configure -state disable
$txt tag delete filtered
$listBox tag delete filtered
}
###################################
## сохраняем все данные из таблици в текстовик ##
proc SaveTable {} {
global noteBook lstColumnWidth
set nodeName [$noteBook raise]
set tbl .frmBody.noteBook.f$nodeName.frmTable.tbl
#global tbl
if {[info exists tbl] == 0} {
return
}
set types {
{{Tabbed text file} {.txt}}
{{CSV file} {.csv}}
}
set file [tk_getSaveFile -filetypes $types -defaultextension ".txt"]
if {$file eq ""} {
return
}
set f [open $file w]
if {[file extension $file] eq ".csv"} {
set separator ";"
} elseif {[file extension $file] eq ".txt"} {
set separator "\t"
}
foreach i [$tbl cget -columntitles] {
set i [string toupper $i]
puts -nonewline $f "$i$separator"
}
puts $f ""
foreach ind [$tbl getkeys 0 end] {
if {[$tbl rowcget $ind -hide] == 0} {
set colInd 0
foreach j [$tbl get $ind] {
# хитрый выебон для добавления пробелов до необходимой ширины
if {[string length $j] < $lstColumnWidth($nodeName,$colInd)} {
set delta [expr $lstColumnWidth($nodeName,$colInd) - [string length $j]]
for {set y 0} {$y < $delta} {incr y} {
append j " "
}
#puts "$j - $lstColumnWidth($nodeName,$colInd) - $delta"
}
puts -nonewline $f "$j\t"
incr colInd
}
puts $f ""
}
}
close $f
}
########################################
## сохраняем меченные данные из текстового поля в текстовик ##
########################################
proc SaveTextMarked {} {
global noteBook
set nodeName [$noteBook raise]
set txt .frmBody.noteBook.f$nodeName.frm.frmText.txt
set tbl .frmBody.noteBook.f$nodeName.frmTable.tbl
#global tbl
if {[info exists txt] == 0} {
return
}
set types {
{{Text file} {.txt}}
}
set file [tk_getSaveFile -filetypes $types -defaultextension ".txt"]
if {$file eq ""} {
return
}
set f [open $file w]
# получаем индексы строк
foreach ind [$tbl getkeys 0 end] {
# проверям скрыты или нет
if {[$tbl rowcget $ind -hide] == 0} {
set index [expr [$tbl getcells $ind,0] +1]
puts $f [$txt get $index.0 $index.end]
puts [$txt get $index.0 $index.end]
}
}
close $f
}
########################################
## сохраняем все данные из текстового поля в текстовик ##
########################################
proc SaveText {} {
global noteBook
set nodeName [$noteBook raise]
set txt .frmBody.noteBook.f$nodeName.frm.frmText.txt
#global tbl
if {[info exists txt] == 0} {
return
}
set types {
{{Tabbed text file} {.txt}}
}
set file [tk_getSaveFile -filetypes $types -defaultextension ".txt"]
if {$file eq ""} {
return
}
set f [open $file w]
puts $f [$txt get 0.0 end]
close $f
}
########################################
## обновление строки статуса при активации закладок ##
########################################
proc RaisedNodeService {} {
global noteBook filtered
set nodeName [$noteBook raise]
set tbl .frmBody.noteBook.f$nodeName.frmTable.tbl
.frmStatus.frmLine.lblLine configure -text "[$tbl index end] str."
if [info exists filtered($nodeName)] {
.frmTool.entFilter configure -text [lindex $filtered($nodeName) 1]
.frmStatus.frmFilter.lblFilter configure -text "[lindex $filtered($nodeName) 0]=\"[lindex $filtered($nodeName) 1]\""
.frmTool.btnFilterOff configure -state normal
} else {
.frmTool.entFilter configure -text ""
.frmStatus.frmFilter.lblFilter configure -text ""
.frmTool.btnFilterOff configure -state disable
}
}
###################################################
## GUI ####################################
##################################################
wm geometry . 800x600+0+0
wm title . "Msoft Command Generator: $ver"
wm iconname . "MCG $ver"
wm protocol . WM_DELETE_WINDOW Quit
wm overrideredirect . 0
wm positionfrom . program
CentreWindow . 800 600
#wm resizable . 0 0
option add *Tablelist.labelCommand tablelist::sortByColumn
option add *Tablelist.labelCommand2 tablelist::addToSortColumns
#option add *Tablelist.setGrid yes
option add *Tablelist.movableColumns yes
frame .frmMenu -border 1 -relief raised
frame .frmTool -border 1 -relief raised
frame .frmBody -border 1 -relief raised
frame .frmStatus -border 1 -relief sunken
pack .frmMenu -side top -padx 1 -fill x
pack .frmTool -side top -padx 1 -fill x
pack .frmBody -side top -padx 1 -fill both -expand true
pack .frmStatus -side top -padx 1 -fill x
########## CREATE MENU LINE ##########
menubutton .frmMenu.mnuFile -text "File" -menu .frmMenu.mnuFile.m -font $fontNormal
set m [menu .frmMenu.mnuFile.m]
$m add command -label "Open command file" -command {OpenFile} -font $fontNormal -accelerator "Ctrl+O"
$m add command -label "Close file" -command {CloseFile} -font $fontNormal -accelerator "Ctrl+W"
$m add command -label "Close all files" -command {CloseAllFile} -font $fontNormal
$m add separator
$m add command -label "Exit" -command Quit -font $fontNormal -accelerator "Ctrl+Q"
menubutton .frmMenu.mnuService -text "Service" -menu .frmMenu.mnuService.m -font $fontNormal
set m [menu .frmMenu.mnuService.m]
$m add cascade -label "Text" -menu $m.text -font $fontNormal
$m add cascade -label "Table" -menu $m.table -font $fontNormal
$m add separator
$m add command -label "Reread files structure" -font $fontNormal -command {
CloseAllFile
ReadField [tk_chooseDirectory -title "Select directory with CVTMML files"]
ReadHeader [file join $dirFields fields]
}
set m1 [menu $m.text]
$m1 add command -label "Save all text" -command SaveText -font $fontNormal -accelerator "Ctrl+T"
$m1 add command -label "Save market text" -command SaveTextMarked -font $fontNormal -accelerator "Ctrl+M"
set m2 [menu $m.table]
$m2 add command -label "Export table" -command SaveTable -font $fontNormal -accelerator "Ctrl+S"
$m2 add command -label "Copy selected cells" -command {Copy cell} -font $fontNormal -accelerator "Ctrl+C"
$m2 add command -label "Copy row" -command {Copy row} -font $fontNormal
$m2 add command -label "Copy command" -command CopySelectedCommand -font $fontNormal
menubutton .frmMenu.mnuHelp -text "Help" -menu .frmMenu.mnuHelp.m -underline 0 -font $fontNormal
set m [menu .frmMenu.mnuHelp.m]
$m add command -label "Help" -command HelpDialog -accelerator F1 -font $fontNormal
$m add command -label "About ..." -command AboutDialog -font $fontNormal
#pack .frmMenu.mnuFile .frmMenu.mnuEdit .frmMenu.mnuView .frmMenu.mnuService -side left
pack .frmMenu.mnuFile .frmMenu.mnuService -side left
pack .frmMenu.mnuHelp -side right
################ toolbar ######################
Button .frmTool.btnFileOpen -text "Open" -command OpenFile -relief link -helptext "Open cvtMML command file"
Button .frmTool.btnFileClose -text "Close" -command CloseFile -relief link -state disable -helptext "Close file"
Button .frmTool.btnSaveTable -text "Export table" -command SaveTable -relief link -state disable -helptext "Export table into file"
#Button .frmTool.btnSaveText -text "Save text" -command SaveText -relief link -state disable -helptext "Save text as file"
menubutton .frmTool.btnSaveText -text "Save text" -menu .frmTool.btnSaveText.m -state disabled
set m [menu .frmTool.btnSaveText.m]
$m add command -label "Save all" -command SaveText -font $fontNormal
$m add command -label "Save marked" -command SaveTextMarked -font $fontNormal
label .frmTool.lblSeparator1 -relief groove -text ""
Entry .frmTool.entFilter -state disabled -helptext "Enter here filter criteria"
Button .frmTool.btnFilterOn -text "Filter on" -command FilterOn -relief link -state disable -helptext "Data filter on"
Button .frmTool.btnFilterOff -text "Filter off" -command FilterOff -relief link -state disable -helptext "Data filter off"
label .frmTool.lblSeparator2 -relief groove -text ""
Button .frmTool.btnExit -text "Exit" -command Quit -relief link
pack .frmTool.btnFileOpen .frmTool.btnFileClose .frmTool.btnSaveTable .frmTool.btnSaveText -side left
pack .frmTool.lblSeparator1 -fill y -side left
pack .frmTool.entFilter .frmTool.btnFilterOn .frmTool.btnFilterOff -side left
pack .frmTool.lblSeparator2 -fill y -side left
pack .frmTool.btnExit -side right
set noteBook [NoteBook .frmBody.noteBook -font $fontNormal -side bottom]
pack $noteBook -fill both -expand true -padx 2 -pady 2
#set frmCat [frame .frmBody.frmCat -border 1 -relief sunken]
#pack $frmCat -side left -fill y -fill both
set frmWork [frame .frmBody.frmWork -border 1 -relief sunken]
pack $frmWork -side left -fill both -expand true
## Create StatusBAr ##
set frm2 [frame .frmStatus.frmActive -relief groove]
set frm4 [frame .frmStatus.frmLine]
set frm5 [frame .frmStatus.frmFile]
set frm6 [frame .frmStatus.frmFilter]
pack $frm4 -side left -fill x
pack $frm5 -side left
pack $frm6 -side left -fill x -expand true
pack $frm2 -side left -fill x
#pack -side left -fill x -expand true
label $frm4.lblLine -width 10 -relief sunken -font $fontNormal -anchor center
pack $frm4.lblLine -fill x
label $frm2.lblActive -relief sunken -font $fontNormal -anchor center -textvariable ::PROGTXT
label $frm5.lblFile -width 10 -relief sunken -font $fontNormal -anchor e -text Filter:
pack $frm5.lblFile
label $frm6.lblFilter -relief sunken -font $fontBold -anchor w
pack $frm6.lblFilter -fill x -expand true
bind . <Control-q> Quit
bind . <Control-s> SaveTable
bind . <Control-t> SaveText
bind . <Control-o> OpenFile
bind . <F1> HelpDialog
bind . <Control-w> CloseFile
bind .frmTool.entFilter <KeyRelease-Return> FilterOn
## startup procedure ##
ReadHeader [file join $dirWork fields]
if [file exists [file join $dirWork .bookmarks]] {
set f [open [file join $dirWork .bookmarks] r]
while {[gets $f line]>=0} {
OpenFile $line
}
}