123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383 |
- # 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 <Configure> "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 <Configure> "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 <B1-Motion> "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 <Configure> "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 <Button-1> "
- $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 <Button-1> "
- $panel_cmd mdown 2 \[%W index @%x,%y]
- "
-
- bind $pn <ButtonRelease-1> "
- panel_cancel_repeat
- $panel_cmd mup 2 \[%W index @%x,%y]"
- bind $pn <Double-1> "
- panel_cancel_repeat
- $panel_cmd double 2 \[%W index @%x,%y]"
- bind $pn <B1-Motion> "
- set mc_x %x
- set mc_y %y
- $panel_cmd motion 2 \[%W index @%x,%y]
- "
- bind $pn <B1-Leave> "
- set mc_x %x
- set mc_y %y
- panel_drag %W $panel_cmd 2
- "
- bind $pn <B1-Enter> panel_cancel_repeat
- if $setup(b2_marks) {
- bind $pn <Button-2> "
- $panel_cmd mdown 1 \[%W index @%x,%y]"
- bind $pn <ButtonRelease-2> "
- $panel_cmd mup 1 \[%W index @%x,%y]
- panel_cancel_repeat
- "
- bind $pn <B2-Motion> "
- set mc_x %x
- set mc_y %y
- $panel_cmd motion 1 \[%W index @%x,%y]
- "
- bind $pn <B2-Leave> "
- 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 <Button-3> "
- $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 <B2-Enter> 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 <Leave>
- }
- proc keyboard_bindings {} {
- # Remove the Tab binding.
- bind all <Tab> {}
- bind all <KeyPress> "tkmc r %A"
- # Remove the Alt-key binding and put a sensible one instead
- bind all <Alt-KeyPress> "tkmc a %A"
- bind all <Control-KeyPress> "tkmc c %A"
- bind all <Meta-KeyPress> "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 <Key-$i> "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 <Enter> {}
- #bind Text <FocusIn> {}
- # bind Entry <Enter> {}
- # bind Entry <FocusIn> {}
- 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
|