# Midnight Commander Tk code. # Copyright (C) 1995, 1996, 1997 Miguel de Icaza # # # Todo: # Fix the internal viewer # Missing commands: mc_file_info, mc_open_with # The default buttons have a problem with the new frame around them: # they don't display the focus. # # 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ wm iconname . tkmc wm title . "Midnight Commander (TK edition)" # # Menu routines # proc create_top_menu {} { global top_menus global setup set top_menus "" frame .mbar -relief raised -bd 2 pack .mbar -side top -fill x } # # Widget: WMenu # proc create_menu {str topmenu} { global top_menus global setup menubutton .mbar.$topmenu -text $str -underline 0 -menu .mbar.$topmenu.menu pack .mbar.$topmenu -side left menu .mbar.$topmenu.menu -tearoff $setup(tearoff) set top_menus "$top_menus $topmenu" } proc create_mentry {topmenu entry cmd idx} { .mbar.$topmenu.menu add command -label "$entry" -command "$cmd $idx" } proc add_separator {topmenu} { .mbar.$topmenu.menu add separator } # # Widget: WButton # proc newbutton {name cmd text isdef} { if $isdef { frame $name -relief sunken -bd 1 set name "$name.button" } button $name -text "$text" -command $cmd -justify left if $isdef { pack $name -padx 1m -pady 1m } } # # Widget: WGauge # proc newgauge {win} { global setup canvas $win -height $setup(heightc) -width 250 -relief sunken -border 2 $win create rectangle 0 0 0 0 -tags gauge -fill black -stipple gray50 # So that we can tell the C code, which is the gauge size currently bind $win "x$win %w" } # Used to show the gauge information proc gauge_shown {win} { # $win configure -relief sunken -border 2 } # Used to hide the gauge information. proc gauge_hidden {win} { # $win configure -relief flat -border 0 $win coords gauge 0 0 0 0 } # # Widget: WView # proc view_size {cmd w h} { global setup $cmd dim [expr $w/$setup(widthc)] [expr $h/$setup(heightc)] } proc newview {is_panel container winname cmd} { global setup # FIXME: The trick to get the window without too much # movement/flicker is to use an extra frame, and use the placer # like it was done in WInfo. if $is_panel { set width [expr [winfo width $container]/$setup(widthc)] set height [expr [winfo height $container]/$setup(heightc)] } frame $winname frame $winname.v frame $winname.v.status eval text $winname.v.view $setup(view_normal) -font $setup(panelfont) # Create the tag names for the viewer attributes eval $winname.v.view tag configure bold $setup(view_bold) eval $winname.v.view tag configure underline $setup(view_underline) eval $winname.v.view tag configure mark $setup(view_mark) eval $winname.v.view tag configure normal $setup(view_normal) # Make the status fields label $winname.v.status.filename label $winname.v.status.column label $winname.v.status.size label $winname.v.status.flags pack $winname.v.status.filename -side left pack $winname.v.status.column -anchor w -side left -fill x -expand 1 pack $winname.v.status.size -anchor w -side left -fill x -expand 1 pack $winname.v.status.flags -anchor w -side left -fill x -expand 1 # Pack the main components pack $winname.v.status -side top -fill x pack $winname.v.view -side bottom -expand 1 -fill both pack $winname.v -expand 1 -fill both bindtags $winname.v.view "all . $winname.v.view" bind $winname.v.view "view_size $cmd %w %h" if $is_panel { $winname.v.view configure -width $width -height $height pack $winname } } proc view_update_info {win fname col size flags} { $win.v.status.filename configure -text "File: $fname" $win.v.status.column configure -text "Column: $col" $win.v.status.size configure -text "$size bytes" $win.v.status.flags configure -text "$flags" } # # Hack: remove all the text on the window and then insert # new lines. Maybe the newlines proc cleanview {win} { $win delete 1.0 end $win insert 1.0 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" } # # Widget: WRadio # proc newradio {name} { frame $name global last_radio set last_radio $name } proc radio_item {idx text cmd act} { global last_radio radiobutton $last_radio.$idx -text "$text" -variable v$last_radio -value $idx -command "$cmd select $idx" if $act { $last_radio.$idx select } pack $last_radio.$idx -side top -anchor w } # # Widget: Input # # proc entry_save_sel {win} { global sel if [$win selection present] { set sel(pres) 1 set sel(first) [$win index sel.first] set sel(last) [$win index sel.last] } else { set sel(pres) 0 } } proc entry_restore_sel {win} { global sel if $sel(pres) { $win selection from $sel(first) $win selection to $sel(last) } } proc entry_click {win x} { global sel set p [$win index @$x] x$win mouse $p x$win setmark set sel(from) $p } proc entry_move {win x} { global sel set p [$win index @$x] $win selection from $sel(from) $win selection to $p x$win mouse $p } proc bind_entry {win} { bind $win <1> "entry_click $win %x" bind $win "entry_move $win %x" } proc newinput {name text} { entry $name -relief sunken -background white -foreground black $name insert 0 "$text" bindtags $name "all . $name " bind_entry $name } # # Widget: WCheck # proc newcheck {name cmd text act} { checkbutton $name -text "$text" -command "$cmd" if $act { $name select } } # # Widget: WInfo # # window is the container name and widget name: .left.o2 # container is the container name: .left # proc info_entry {win name text} { frame $win.b.finfo.$name label $win.b.finfo.$name.label -text "$text" label $win.b.finfo.$name.info grid $win.b.finfo.$name.label -row 0 -column 0 -sticky we grid $win.b.finfo.$name.info -row 0 -column 1 -sticky w grid columnconfigure $win.b.finfo.$name 0 -minsize 100 } proc newinfo {container window version} { global setup set width [winfo width $container] set height [winfo height $container] frame $window -width $width -height $height \ -borderwidth [expr $setup(widthc)/2] frame $window.b frame $window.b.v frame $window.b.finfo -relief groove -borderwidth 2 frame $window.b.fs -relief groove -borderwidth 2 label $window.b.v.version -text " The Midnight Commander $version " \ -relief groove pack $window.b.v.version -fill x info_entry $window fname "File:" info_entry $window location "Location:" info_entry $window mode "Mode:" info_entry $window links "Links:" info_entry $window owner "Owner:" info_entry $window size "Size:" info_entry $window created "Created:" info_entry $window modified "Modified:" info_entry $window access "Access:" pack $window.b.finfo.fname \ $window.b.finfo.location $window.b.finfo.mode $window.b.finfo.links \ $window.b.finfo.owner $window.b.finfo.size $window.b.finfo.created \ $window.b.finfo.modified $window.b.finfo.access \ -side top -anchor w label $window.b.fs.fsys label $window.b.fs.dev label $window.b.fs.type frame $window.b.fs.free label $window.b.fs.free.label newcanvas $window.b.fs.free.canvas pack $window.b.fs.free.label -side left pack $window.b.fs.free.canvas -side left frame $window.b.fs.freeino label $window.b.fs.freeino.label newcanvas $window.b.fs.freeino.canvas pack $window.b.fs.freeino.label -side left pack $window.b.fs.freeino.canvas -side left pack $window.b.fs.fsys \ $window.b.fs.dev $window.b.fs.type \ $window.b.fs.free \ $window.b.fs.freeino -side top -anchor w -padx $setup(widthc) pack $window.b.v -side top -anchor w -fill x -expand 1 pack $window.b.fs -side bottom -anchor w -fill x -expand 1 pack $window.b.finfo -side top -anchor w \ -fill x -expand 1 pack $window.b pack $window -fill both -expand 1 # pack $window.b place $window.b -in $window -relx 0 -rely 0 -relheight 1 -relwidth 1 } proc info_bar {win percent} { global setup set w [winfo width $win] set s [expr (100-$percent)*$w/100] $win coords bar 0 0 $s 50 # puts stderr "Width: $w $s\n\r" } proc info_none {win} { $win coords bar 0 0 0 0 } proc newcanvas {win} { global setup canvas $win -height $setup(heightc) -relief sunken -border 2 $win create rectangle 0 0 0 0 -tags bar -fill black -stipple gray50 } proc infotext {win text} { $win configure -text $text } proc xinfotext {win text} { $win.info configure -text $text } # w containes the window name *and* the .b frame (like: .left.o2.b) # FIXME: We should also display the rdev information proc info_update {w fname dev ino mode mode_oct links owner group have_blocks blocks size have_rdev rdev rdev2 create modify access fsys dev type have_space avail percent total have_ino nfree inoperc inotot} { # # Set all the text information # xinfotext $w.finfo.fname "$fname" xinfotext $w.finfo.location "${dev}h:${ino}h" xinfotext $w.finfo.mode "$mode ($mode_oct)" xinfotext $w.finfo.links "$links" xinfotext $w.finfo.owner "$owner/$group" if $have_blocks { xinfotext $w.finfo.size "$size ($blocks blocks)" } else { xinfotext $w.finfo.size "$size" } xinfotext $w.finfo.created "$create" xinfotext $w.finfo.modified "$modify" xinfotext $w.finfo.access "$access" infotext $w.fs.fsys "Filesystem:\t$fsys" infotext $w.fs.dev "Device:\t\t$dev" infotext $w.fs.type "Type:\t\t$type" if $have_space { infotext $w.fs.free.label \ "Free Space $avail ($percent%) of $total" info_bar $w.fs.free.canvas $percent } else { infotext $w.fs.free.label "No space information" info_none $w.fs.free.canvas } if $have_ino { infotext $w.fs.freeino.label \ "Free inodes $nfree ($inoperc%) of $inotot" info_bar $w.fs.freeino.canvas $inoperc } else { infotext $w.fs.freeino.label "No inode information" info_none $w.fs.freeino.canvas } } # # Widget: listbox # proc listbox_sel {win item} { $win selection clear 0 end $win selection set $item $win see $item } # # Widget: WPanel # proc panel_select {w pos cback} { $w.m.p.panel tag add selected $pos.0 "$pos.0 lineend" $w.m.p.panel see $pos.0 $cback top [$w.m.p.panel index @0,0] } proc panel_scroll {win cback args} { eval "$win yview $args" $cback top [$win index @0,0] } proc cmd_sort_add {name menu cmd} { $menu add command -label $name -command "$cmd sort $name" } proc panel_setup {which cmd} { global setup frame $which set m $which.cwd.menu menubutton $which.cwd -text "loading..." -bd 1 -relief raised \ -menu $m -indicatoron 0 menu $m -tearoff 0 menu [set mm $m.sort] -tearoff 0 $m add command -label "Reverse sort order" -command "$cmd reverse" $m add cascade -label "Sort" -menu $mm cmd_sort_add "Name" $mm $cmd cmd_sort_add "Extension" $mm $cmd cmd_sort_add "Size" $mm $cmd cmd_sort_add "Modify Time" $mm $cmd cmd_sort_add "Access Time" $mm $cmd cmd_sort_add "Change Time" $mm $cmd cmd_sort_add "Inode" $mm $cmd cmd_sort_add "Type" $mm $cmd cmd_sort_add "Links" $mm $cmd cmd_sort_add "NGID" $mm $cmd cmd_sort_add "NUID" $mm $cmd cmd_sort_add "Owner" $mm $cmd cmd_sort_add "Group" $mm $cmd cmd_sort_add "Unsorted" $mm $cmd $m add command -label "Refresh" -command "$cmd refresh" $m add separator $m add command -label "Set mask" -command "$cmd setmask" $m add command -label "No mask" -command "$cmd nomask" frame $which.m label $which.mini scrollbar $which.m.scroll -width 3m frame $which.m.p -relief sunken -borderwidth 2 # The sort bar if $setup(with_sortbar) { canvas $which.m.p.types \ -borderwidth 0\ -back $setup(def_back) \ -highlightthickness 0 -height 0 pack $which.m.p.types -side top -fill x } scrollbar $which.m.p.scroll -width 3m -orient horizontal # The file listing panel text $which.m.p.panel -width $setup(cols) -yscroll "$which.m.scroll set" \ -fore $setup(def_fore) -back $setup(def_back) \ -wrap none -height $setup(lines) -font $setup(panelfont) \ -relief flat -borderwidth 0 -highlightthickness 0 \ -xscroll "$which.m.p.scroll set" bindtags $which.m.p.panel "all . $which.m.p.panel" proc x$which.m.p.panel {x} "$cmd \$x" pack $which.m.p.panel -side top -fill both -expand 1 pack $which.m.p.scroll -side top -fill x pack $which.m.p -side left -fill both -expand 1 pack $which.m.scroll -side right -fill y pack $which.cwd -side top -anchor w pack $which.m -side top -fill both -expand 1 pack $which.mini -side top -fill x pack $which -fill both -expand 1 config_colors $which.m.p.panel } # # Draging the panels: # mc_x and mc_y contains the last positions where the mouse was # mc_repeat contains the id of the after command. # proc panel_cancel_repeat {} { global mc_repeat after cancel $mc_repeat set mc_repeat {} } proc panel_drag {w cmd n} { global mc_y global mc_x global mc_repeat if {$mc_y >= [winfo height $w]} { $w yview scroll 1 units } elseif {$mc_y < 0} { $w yview scroll -1 units } else { return } $cmd top [$w index @0,0] $cmd motion $n [$w index @$mc_x,$mc_y] set mc_repeat [after 50 panel_drag $w $cmd $n] } # # This routine passes the size of the text widget back to the C code # proc panel_size {cmd panel w h} { global setup set setup(real_height) $h set setup(real_width) $w if $setup(with_icons) { set setup(height) [expr $h-setup(iconheight)] set setup(width) [expr $w-$setup(iconwidth)] set setup(lines) [expr $setup(height)/$setup(heightc)] set setup(cols) [expr $setup(width)/$setup(widthc)] } else { set setup(height) $h set setup(width) $w set setup(lines) [expr $h/$setup(heightc)] set setup(cols) [expr $w/$setup(widthc)] } $cmd resize $panel } # # Called on the first idle loop to configure the sizes of the thing # proc panel_conf {panel cmd} { global setup set font [lindex [$panel configure -font] 4] set fontinfo [$cmd fontdim $font $panel] set setup(heightc) [lindex $fontinfo 0] set setup(widthc) [lindex $fontinfo 1] bind $panel "panel_size $cmd $panel %w %h" } # # Manage the bar that keeps the sort orders # proc panel_reset_sort_labels {win} { # $win.m.p.types delete all } proc panel_sort_label_start {win} { # $win.m.p.types delete all } # # This right now uses a canvas, creates labels and places them # on the canvas. The button emulation is done with a manual # bind. # proc panel_add_sort {win text_len text pos end_pos tag} { global setup if {$setup(with_sortbar) == 0} return catch { destroy $win.m.p.types.$pos } label $win.m.p.types.$pos -text $text -borderwidth 2 \ -font $setup(panelfont) -relief raised $win.m.p.types create window $pos 0 -window $win.m.p.types.$pos -anchor nw $win.m.p.types configure -height [expr $setup(heightc)+8] $win.m.p.types create line $end_pos 1 $end_pos [expr $setup(heightc)-1] -fill gray # Simulate the button. bind $win.m.p.types.$pos " $win.m.p.types.$pos configure -relief sunken x$win sort $tag after 100 { $win.m.p.types.$pos configure -relief raised } " } # # Called back from the action menu # proc popup_add_action {filename cmd idx} { global setup menu [set m .m.action] -tearoff 0 .m add cascade -foreground $setup(action_foreground) -label "$filename" -menu $m $m add command -label "Info" -command "mc_file_info \"$filename\"" $m add command -label "Open with..." -command "mc_open_with \"$filename\"" $m add separator $m add command -label "Copy..." -command "$cmd invoke %d Copy" $m add command -label "Rename, move..." -command "$cmd invoke %d Move" $m add command -label "Delete..." -command "$cmd invoke %d Delete" $m add separator $m add command -label "Open" -command "$cmd invoke %d Open" $m add command -label "View" -command "$cmd invoke %d View" } proc start_drag {mode panel_cmd W x y X Y} { global drag_mode global drag_text set drag_mode $mode set drag_text [$panel_cmd dragtext [$W index @$x,$y]] set drag_text "$mode $drag_text" catch {destroy .drag} toplevel .drag wm overrideredirect .drag 1 wm withdraw .drag label .drag.text -text "$drag_text" pack .drag.text wm deiconify .drag wm geometry .drag +$X+$Y } proc drag_test {token} { if {[winfo children $token] == ""} { label $token.value -text "Zonzo" pack $token.value } $token.value configure -text Hla return "caca"; } proc mc_drag_target {} { global DragDrop set data $DragDrop(text) } proc mc_drag_send {} { # puts "drag send" } # # Mouse bindings for the panels # proc panel_bind {the_panel panel_cmd} { global setup set pn "$the_panel.m.p.panel" bind $pn " $panel_cmd mdown 2 \[%W index @%x,%y] " bind $pn " panel_cancel_repeat $panel_cmd mup 2 \[%W index @%x,%y]" bind $pn " panel_cancel_repeat $panel_cmd double 2 \[%W index @%x,%y]" bind $pn " set mc_x %x set mc_y %y $panel_cmd motion 2 \[%W index @%x,%y] " bind $pn " set mc_x %x set mc_y %y panel_drag %W $panel_cmd 2 " bind $pn panel_cancel_repeat if $setup(b2_marks) { bind $pn " $panel_cmd mdown 1 \[%W index @%x,%y]" bind $pn " $panel_cmd mup 1 \[%W index @%x,%y] panel_cancel_repeat " bind $pn " set mc_x %x set mc_y %y $panel_cmd motion 1 \[%W index @%x,%y] " bind $pn " set mc_x %x set mc_y %y panel_drag %W $panel_cmd 1 " } else { # We have blt # blt_drag&drop source $pn config -button 2 -packagecmd drag_test \ # -selftarget 1 # blt_drag&drop source $pn handler text dd_send_file } # Menu popup. bind $pn " $panel_cmd mdown 2 \[%W index @%x,%y] catch {destroy .m} menu .m -tearoff 0 $panel_cmd load \[%W index @%x,%y] %X %Y #Buggy Tk8.0 catch {tk_popup .m %X %Y} " bind $pn panel_cancel_repeat $the_panel.m.scroll configure \ -command "panel_scroll $pn $panel_cmd" $the_panel.m.p.scroll configure \ -command "$pn xview" panel_conf $pn $panel_cmd } proc panel_info {item} { global setup return $setup($item) } proc panel_mark {tag panel n} { config_colors $panel $panel tag add $tag "${n}.0" "${n}.0 lineend" } # op is add or remove proc panel_mark_entry {win op line} { $win.m.p.panel tag $op marked $line.0 "$line.0 lineend" } proc panel_unmark_entry {win line} { $win.m.p.panel tag remove selected $line.0 "$line.0 lineend" } # # Misc routines # # Configure the panel tags proc config_colors {which} { global setup # se -- selected file $which tag configure selected -back $setup(panelcolor,selected_back) foreach v {marked directory executable regular selected} { $which tag configure $v -fore $setup(panelcolor,$v) } $which tag configure directory -font $setup(paneldir) $which tag raise marked } proc tclerror {msg} { puts stderr "TkError: [$msg]\n\r" } # # FIXME: This is not finished, have to deal with activefore, activeback # highlight{fore,back} # proc error_colors {wins} { global setup foreach widget $wins { catch "$widget configure -foreground $setup(errorfore)" catch "$widget configure -background $setup(errorback)" } } # # # Layout routines # # proc layout_midnight {} { global one_window global wlist #puts $wlist # # we want to make the prompt and the input line sunken # so we sunk the frame, and set a borderwidth for it # while removing the sunken attribute set by the newinput .p.i0 configure -relief flat .p configure -relief sunken -borderwidth 2 pack .p.l5 -side left pack .p.i0 -side left -expand 1 -fill x -anchor e pack .n4 -side bottom -fill x pack .p -side bottom -fill x if $one_window { pack .left -side top -side left -fill both -expand 1 pack .right -side top -side right -fill both -expand 1 } } proc layout_query {} { global wlist # puts "$wlist" set t [llength $wlist] if {$t == 2} { pack .query.l1 -side top -pady 2m -padx 2m pack .query.b0 -side right -ipadx 2m -padx 4m -pady 2m -expand 1 } else { pack .query.l1 -side top -pady 2m -padx 2m for {set b 2} {$b != 1} {incr b} { if {$b == $t} { set b 0 } pack .query.b$b -side right -ipadx 2m -padx 4m -pady 2m -expand 1 } } } proc layout_listbox {} { scrollbar .listbox.s -width 3m -command {.listbox.x0 yview} .listbox.x0 configure -yscroll {.listbox.s set} pack .listbox.s -fill y -side right pack .listbox.x0 -expand 1 -fill both -padx 4m -pady 4m -side left } proc layout_quick_confirm {} { pack .quick_confirm.c.c1 .quick_confirm.c.c2 .quick_confirm.c.c3 \ -side top -anchor w pack .quick_confirm.b.b0 .quick_confirm.b.b4 -side left -padx 4m -expand 1 pack .quick_confirm.c -side top -pady 4m pack .quick_confirm.b -side top -pady 2m } proc layout_quick_file_mask {} { global wlist # puts stderr "$wlist" # We add some space .quick_file_mask configure -borderwidth 5m pack .quick_file_mask.b.b1 .quick_file_mask.b.b2 \ -side left -expand 1 -padx 4m pack .quick_file_mask.l3 -side top -anchor w -expand 1 pack .quick_file_mask.s.i5 -fill x -expand 1 -anchor w pack .quick_file_mask.s.c6 -anchor e -padx 4m -pady 1m pack .quick_file_mask.s -expand 1 -fill x -side top pack .quick_file_mask.d.l7 -pady 4m pack .quick_file_mask.d -side top -anchor w pack .quick_file_mask.i4 -expand 1 -fill x -side top pack .quick_file_mask.t.c8 .quick_file_mask.t.c0 -side top -anchor e catch {pack .quick_file_mask.t.c9 -side top -anchor e} pack .quick_file_mask.t -side top -anchor e frame .quick_file_mask.space -height 4m pack .quick_file_mask.space -side top pack .quick_file_mask.b -fill x -expand 1 -side top } proc layout_quick_vfs {} { global wlist # puts stderr "$wlist" pack .quick_vfs.t.l1 -side left pack .quick_vfs.t.i2 -side left -expand 1 -fill x -padx 2m pack .quick_vfs.t.l3 -side left pack .quick_vfs.l.l4 -side top -anchor w pack .quick_vfs.l.r5 -side left -anchor w pack .quick_vfs.l.i6 -side right -anchor se pack .quick_vfs.b.b7 .quick_vfs.b.b0 -padx 4m -side left -expand 1 pack .quick_vfs.t -side top -expand 1 -fill x -pady 4m -padx 4m pack .quick_vfs.l -side top -expand 1 -fill x -padx 4m pack .quick_vfs.b -side top -expand 1 -fill x -padx 4m -pady 4m } proc layout_dbits {} { pack .dbits.r1 -anchor w -padx 4m -pady 4m -side top pack .dbits.b0 -side top } proc layout_chown {} { global setup pack .chown.b.b8 .chown.b.b0 -side left -padx 4m -expand 1 # May be invoked with different number of buttons # There is already a problem: the cancel button is # not close to the ok button, I will have to look into this. catch { pack .chown.b.b9 .chown.b.b10 .chown.b.b11 \ -side left -padx 4m -expand 1 } label .chown.l.fname -text {File name} label .chown.l.owner -text {Owner name} label .chown.l.group -text {Group name} label .chown.l.size -text {Size} label .chown.l.perm -text {Permission} pack \ .chown.l.fname .chown.l.l7 \ .chown.l.owner .chown.l.l6 \ .chown.l.group .chown.l.l5 \ .chown.l.size .chown.l.l4 \ .chown.l.perm .chown.l.l3 -side top -anchor w -padx 2m foreach i {l3 l4 l5 l6 l7} { .chown.l.$i configure -fore $setup(high) } pack .chown.l.l3 .chown.l.l4 .chown.l.l5 .chown.l.l6 .chown.l.l7 \ -side top -pady 1m -padx 4m -anchor w # Configure the listboxes scrollbar .chown.f.s -width 3m -command {.chown.f.x2 yview} .chown.f.x2 configure -yscroll {.chown.f.s set} label .chown.f.l -text {Group name} pack .chown.f.l -side top -anchor w pack .chown.f.x2 -side left -fill y -expand 1 pack .chown.f.s -side right -fill y -expand 1 scrollbar .chown.g.s -width 3m -command {.chown.g.x1 yview} .chown.g.x1 configure -yscroll {.chown.g.s set} label .chown.g.l -text {User name} pack .chown.g.l -side top -anchor w pack .chown.g.x1 -side left -fill y -expand 1 pack .chown.g.s -side right -fill y -expand 1 .chown.b configure -relief sunken pack .chown.b -side bottom -pady 4m -fill x pack .chown.g .chown.f -side left -padx 4m -pady 4m -expand 1 -fill y pack .chown.l -side right -padx 4m } proc layout_chmod {} { global wlist # puts stderr "$wlist \n\r" pack .chmod.c.c5 .chmod.c.c6 .chmod.c.c7 .chmod.c.c8 .chmod.c.c9 \ .chmod.c.c10 \ .chmod.c.c11 .chmod.c.c12 .chmod.c.c13 .chmod.c.c14 .chmod.c.c15 \ .chmod.c.c16 -side top -anchor w pack .chmod.b.b17 .chmod.b.b0 -side left -padx 4m -pady 4m -side left catch { pack .chmod.b.b18 .chmod.b.b19 .chmod.b.b19 .chmod.b.b20 \ .chmod.b.b21 -side left -padx 4m -pady 4m -side left } label .chmod.l.msg -text {Use "t" or Insert to\nmark attributes} label .chmod.l.fname -text {Name} label .chmod.l.perm -text {Permission (octal)} label .chmod.l.owner -text {Owner name} label .chmod.l.group -text {Group name} pack \ .chmod.l.fname .chmod.l.l4 \ .chmod.l.perm .chmod.l.l1 \ .chmod.l.owner .chmod.l.l3 \ .chmod.l.group .chmod.l.l2 .chmod.l.msg -side top -anchor w -padx 2m pack .chmod.b -side bottom pack .chmod.l -side right -padx 4m -anchor n -pady 4m pack .chmod.c -side left -padx 4m -pady 4m } proc layout_view {} { global wlist pack [lindex $wlist 0] -side bottom -fill x pack [lindex $wlist 1] -side top -expand 1 -fill both } proc layout_replace {} { global wlist error_colors "$wlist .replace" set alist {} set plist {} set ilist {} foreach a $wlist { if [regexp ^.replace.p.l $a] { set plabel $a } elseif [regexp ^.replace.p $a] { set plist "$plist $a" } elseif [regexp ^.replace.a.l $a] { set alabel $a } elseif [regexp ^.replace.a $a] { set alist "$alist $a" } elseif [regexp ^.replace.i $a] { set ilist "$ilist $a" } elseif [regexp ^.replace.b $a] { set abortbutton $a } else { set fname $a } } # puts stderr "$wlist\n\r" # puts stderr "alist: $alist\n\rplist: $plist\n\rilist: $ilist\n\r" # puts stderr "plabel: $plabel\n\rfname: $fname" pack $fname -side top -fill x -anchor w -pady 6m -padx 12m pack $abortbutton -side bottom -anchor e -padx 8m -pady 4m eval pack $ilist -side top -anchor w pack .replace.i -padx 10m -pady 2m -anchor w pack $plabel -side left -anchor w -padx 10m eval pack $plist -side left -anchor e -fill x pack .replace.p -side top -fill x -padx 10m pack $alabel -side left -anchor w -padx 10m eval pack $alist -side left -anchor e -fill x pack .replace.a -side top -fill x -padx 10m } proc layout_complete {} { global wlist eval pack $wlist -side top } proc layout_opwin {} { global wlist global setup pack .opwin.b.b0 .opwin.b.b14 -side left -expand 1 pack .opwin.f0.l1 .opwin.f0.l2 -side left -anchor w pack .opwin.f1.l3 .opwin.f1.l4 -side left -anchor w foreach a {.opwin.2.l11 .opwin.1.l8 .opwin.0.l5} { $a configure -width 8 } pack .opwin.2.l11 .opwin.2.g13 -side left -fill x pack .opwin.1.l8 .opwin.1.g10 -side left -fill x pack .opwin.0.l5 .opwin.0.l6 -side left -fill x pack .opwin.b -side bottom -pady 4m -fill x pack .opwin.f0 -side top -padx 10m -anchor w pack .opwin.f1 -side top -padx 10m -pady 4m -anchor w pack .opwin.0 .opwin.1 .opwin.2 -side top -padx 4m } proc dummy_layout {name} { eval "proc layout_$name {} { global wlist # puts stderr \"\$wlist \\n\" eval pack \$wlist -side top}" } # # the achown commands will have to be rewriten # to use only widgets and no writing callbacks. # foreach i { achown tree } { dummy_layout $i } proc layout_quick_input {} { global wlist # puts stderr "$wlist \n\r" .quick_input.i1 configure -width 60 label .quick_input.dummy pack .quick_input.b.b2 .quick_input.b.b3 -side left -padx 4m -expand 1 pack .quick_input.b -side bottom -pady 4m pack .quick_input.dummy -side top pack .quick_input.l0 -side top -expand 1 -ipadx 2m -ipady 2m pack .quick_input.i1 -side bottom -fill x -padx 4m } proc create_drop_target {name icon} { toplevel .drop-$name button .drop-$name.b -text "Drop target" pack .drop-$name.b wm group .drop-$name . wm overrideredirect .drop-$name 1 wm withdraw .drop-$name wm deiconify .drop-$name wm geometry .drop-$name +0+0 # blt_drag&drop target .drop-$name.b handler file mc_drag_target # blt_drag&drop target .drop-$name.b handler text mc_drag_target } # # Creates the container # proc create_container {container} { canvas $container pack $container -fill both -expand 1 } # # Removes all of the widgets in a container (.left or .right) # proc container_clean {container} { set widgets [winfo children $container] foreach widget $widgets { destroy $widget } } # # Setups the binding called after the layout procedure # proc bind_setup {win} { flush stderr bindtags $win {all $win} wm protocol $win WM_DELETE_WINDOW "tkmc e scape" bind $win } proc keyboard_bindings {} { # Remove the Tab binding. bind all {} bind all "tkmc r %A" # Remove the Alt-key binding and put a sensible one instead bind all "tkmc a %A" bind all "tkmc c %A" bind all "tkmc a %A" foreach i {Left Right Up Down End R13 Home F27 F29 Prior \ Next F35 Return KP_Enter Delete Insert BackSpace \ F1 F2 F3 F4 F5 F6 F7 F8 F9 F10} { bind all "tkmc k %K" } } # Centers a window based on . proc center_win {win} { global center_toplevels wm transient $win [winfo toplevel [winfo parent $win]] wm withdraw $win update idletasks if {$center_toplevels} { set ch [winfo reqheight $win] set cw [winfo reqwidth $win] set geo [split [wm geometry .] +x] set pw [lindex $geo 0] set ph [lindex $geo 1] set px [lindex $geo 2] set py [lindex $geo 3] set x [expr $px+(($pw-$cw)/2)] set y [expr $py+(($ph-$ch)/2)] wm geometry $win +$x+$y } wm deiconify $win grab $win tkwait visibility $win } # # Busy window handling # proc win_busy {w} { $w configure -cursor watch } # # Color configurations # proc tk_colors {} { } proc color_model {} { } # gray85 is the background for the new tk4 proc gray_colors {base} { global setup global have_blt # # set setup(def_back) [tkDarken $base 90] # set setup(def_fore) black # set setup(selected) [tkDarken $base 110] # set setup(marked) SlateBlue # set setup(high) $setup(def_back) if {0} { set dark_color [tkDarken $base 90] set setup(def_back) [tkDarken $base 110] set setup(selected) NavyBlue set setup(selected_fg) white } else { set dark_color $base set setup(def_back) #d9d9d9 set setup(selected) white set setup(selected_fg) black } set setup(def_fore) black set setup(high) yellow # # Panel colors: # # Marked files set setup(panelcolor,marked) yellow set setup(panelcolor,directory) blue set setup(panelcolor,executable) red set setup(panelcolor,regular) black set setup(panelcolor,selected_back) white set setup(panelcolor,selected) black # Viewer colors set setup(view_bold) "-fore yellow -back $dark_color" set setup(view_underline) "-fore red -back $dark_color" set setup(view_mark) "-fore cyan -back $dark_color" set setup(view_normal) "-fore black -back $dark_color" # The percentage bars on info: set setup(percolor) "blue" # The sort bar colors set setup(sort_fg) $setup(def_fore) set setup(sort_bg) $setup(def_back) set setup(with_sortbar) 1 # We use BLT only for drag and drop, if this is not available, # then we use the 2nd button for regular file marking. set have_blt 0 if $have_blt { set setup(b2_marks) 0 } else { set setup(b2_marks) 1 } # The errors set setup(errorfore) white set setup(errorback) red } proc bisque_colors {} { global setup set setup(def_back) bisque3 set setup(def_fore) black set setup(selected) bisque2 set setup(marked) SlateBlue set setup(high) gray } proc sanity_check {} { if [catch {bindtags .}] { puts stderr "The Midnight Commander requires Tk 4.0 beta 3 or 4\n\r" puts stderr "You can get it from: ftp://ftp.smli.com/pub/tcl" exit 1 } } #sanity_check # Until I figure out how to remove specific bindings from a widget # I remove all of the classes bindings. #bind Text {} #bind Text {} # bind Entry {} # bind Entry {} keyboard_bindings set setup(tearoff) 0 set setup(action_foreground) blue set setup(lines) 24 set setup(cols) 40 set setup(with_icons) 0 set setup(widthc) 0 set setup(heightc) 0 set setup(real_width) 0 # Determine Tk version set beta_4 ![catch tk_bisque] if $beta_4 { tk_setPalette gray85 gray_colors gray70 } else { bisque_colors } ## Some globals set mc_repeat {} set mc_x 0 set mc_y 0 set center_toplevels 1 #set center_toplevels 0 # button .testbutton [lindex [.testbutton configure -font] 3] #set setup(panelfont) lucidasanstypewriter-bold-14 set setup(panelfont) lucidasanstypewriter-14 set setup(paneldir) lucidasanstypewriter-bold-14 set setup(font) "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*" # # # This variable if set, will make the program load gui.*.tcl files # instead of the gui.tcl file created during instalaltion. set use_separate_gui_files 0 if [file exist ~/.mc/tkmc] {source ~/.mc/tkmc} catch { # option add *font $setup(font) userDefault # option add *Menu*activeBackground NavyBlue # option add *Menu*activeForeground white # option add *Menubutton*activeBackground NavyBlue # option add *Menubutton*activeForeground white # option add *Button*activeBackground NavyBlue # option add *Button*activeForeground white ## set setup(panelfont) $setup(font) } proc run_gui_design {root} { global components create_workspace $root gui_design $root $components } source $LIBDIR/gd.tcl set tk_strictMotif 1 create_top_menu create_drop_target Hola Zonzo