Index: u_main.tk =================================================================== RCS file: /cvsroot/pure-data/pd/src/u_main.tk,v retrieving revision 1.7.2.4 diff -u -w -r1.7.2.4 u_main.tk --- u_main.tk 21 Feb 2005 04:20:20 -0000 1.7.2.4 +++ u_main.tk 28 Nov 2005 15:27:03 -0000 @@ -24,6 +24,14 @@ # Tearoff is set to true by default: set pd_tearoff 1 + +# a menu on the main menubar named $whatever.help while be treated +# as a special menu with specific behaviors on different platforms. +# See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm +# this is the default name for the Help menu +set help_menu_name "help" + +#################### init for Windows #################### if {$pd_nt == 1} { global pd_guidir global pd_tearoff @@ -32,8 +40,12 @@ set pd_guidir $pd_gui3/.. load $pd_guidir/bin/pdtcl.dll set pd_tearoff 1 + set help_top_directory $pd_guidir/doc + # init last help directory browsed + set help_directory $help_top_directory } +##################### init for Mac OS X/Darwin #################### if {$pd_nt == 2} { # turn on James Tittle II's fast drawing (wait until I can test this...): # set tk::mac::useCGDrawing 1 @@ -43,6 +55,39 @@ set pd_guidir $pd_gui2/.. load $pd_guidir/bin/pdtcl set pd_tearoff 0 + set help_top_directory $pd_guidir/doc + + + # This procedure generates a temporary mirror of the documentation directory + # in /tmp so that it can be opened from the Help->Pure Documentation... menu + # under Mac OS X. It is meant to be run at startup. + # Damn you Apple and your hide-stuff-from-the-user "features". + # + regsub -all "/" $help_top_directory "." help_directory_alias + set help_directory_alias /tmp/.pd_help_directory_alias-$help_directory_alias + set help_directory_tmpdir $help_directory_alias/doc + # if something other than a directory exists, delete it + if [file exists $help_directory_alias] { + file delete -force -- $help_directory_alias + } + if { ! [ file isdirectory $help_directory_tmpdir ] } { + file mkdir $help_directory_tmpdir + } + foreach file [ lsort [ glob -dir $help_top_directory * ] ] { + regsub -all ".*/" $file "" link_file_name + file link -symbolic $help_directory_tmpdir/$link_file_name $file + } + # init last help directory browsed + set help_directory $help_directory_tmpdir + + + # a menu on the main menubar named "$whatever.help" while be treated + # as a special menu with specific behaviors on different platforms. + # See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm + # Apple doesn't allow cascading menus in their Help so I had to call this + # one "docs" + set help_menu_name "docs" + # tk::mac::OpenDocument is called with the filenames put into the # var args whenever docs are either dropped on the Pd.app icon or @@ -60,14 +105,22 @@ # hack so you can easily test-run this script in linux... define pd_guidir # (which is normally defined at startup in pd under linux...) +#################### init for GNU/Linux #################### if {$pd_nt == 0} { if {! [info exists pd_guidir]} { global pd_guidir puts stderr {setting pd_guidir to '.'} set pd_guidir . } + set help_top_directory $pd_guidir/doc + # init last help directory browsed + set help_directory $help_top_directory } +#################### init for all platforms #################### + + + # it's unfortunate but we seem to have to turn off global bindings # for Text objects to get control-s and control-t to do what we want for # "text" dialogs below. Also we have to get rid of tab's changing the focus. @@ -95,25 +148,15 @@ if {$pd_nt != 2} { .mbar add cascade -label "Windows" -menu .mbar.windows .mbar add cascade -label "Media" -menu .mbar.audio -# a menu on the main menubar named $whatever.help while be treated -# as a special menu with specific behaviors on different platforms. -# See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm - menu .mbar.help -tearoff $pd_tearoff - .mbar add cascade -label "Help" -menu .mbar.help } else { menu .mbar.apple -tearoff 0 .mbar add cascade -label "Apple" -menu .mbar.apple # arrange menus according to Apple HIG .mbar add cascade -label "Media" -menu .mbar.audio .mbar add cascade -label "Window" -menu .mbar.windows -# a menu on the main menubar named "$whatever.help" while be treated -# as a special menu with specific behaviors on different platforms. -# See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm -# Apple doesn't allow cascading menus in their Help so I had to call this -# one $mbar.docs # - menu .mbar.docs -tearoff $pd_tearoff - .mbar add cascade -label "Help" -menu .mbar.docs } +menu .mbar.$help_menu_name -tearoff $pd_tearoff +.mbar add cascade -label "Help" -menu .mbar.$help_menu_name set ctrls_audio_on 0 set ctrls_meter_on 0 @@ -371,25 +414,15 @@ } } -set help_directory $pd_guidir/doc -set help_top_directory $pd_guidir/doc - +################## menu_documentation ######################### proc menu_documentation {} { global help_directory global pd_nt global pd_guidir - if {$pd_nt == 2} { - exec rm -rf /tmp/pd-documentation - exec cp -pr $pd_guidir/doc /tmp/pd-documentation set filename [tk_getOpenFile -defaultextension .pd \ - -filetypes { {{documentation} {.pd .txt .htm}} } \ - -initialdir /tmp/pd-documentation] - } else { - set filename [tk_getOpenFile -defaultextension .pd \ - -filetypes { {{documentation} {.pd .txt .htm}} } \ + -filetypes { {{documentation} {.pd .txt .htm .html}} } \ -initialdir $help_directory] - } if {$filename != ""} { if {[string first .txt $filename] >= 0} { menu_opentext $filename @@ -411,42 +444,69 @@ set dirname $pd_guidir/$subdir + set file_type [file type $dirname/$basename] + if { $file_type == "directory" } { + pd [concat pd open [pdtk_enquote $basename] \ + [pdtk_enquote $dirname] \;] + } else { if {[regexp ".*\.(txt|c)$" $basename]} { menu_opentext $dirname/$basename + } elseif {[regexp ".*\.(pd|max)$" $basename]} { + pd [concat pd open [pdtk_enquote $basename] \ + [pdtk_enquote $dirname] \;] } elseif {[regexp ".*\.html?$" $basename]} { menu_openhtml $dirname/$basename } else { - pd [concat pd open [pdtk_enquote $basename] \ - [pdtk_enquote $dirname] \;] + menu_openhtml $dirname/$basename } } +} + -proc doc_submenu {helpmenu subdir} { - global help_top_directory pd_tearoff +################## menu_doc_submenu ######################### - set menudir $help_top_directory/$subdir +# this is a recursive function to generation a nested menu in the help menu +# which shows the complete contents of the doc directory +proc menu_doc_submenu {helpmenu base_dir sub_dir} { + global pd_tearoff + global help_top_directory + + set menu_dir $help_top_directory/$base_dir/$sub_dir - regsub -all "\\\." $subdir "" submenu + catch { + foreach file [ lsort [ glob -nocomplain -dir $menu_dir * ] ] { + set file_type [file type $file] + regsub {.*/(.*$)} $file {\1} file_name + # If links are going to be used then there needs to be a check to + # see if each link might cause this function to recurse forever + # + if { $file_type == "link"} { + puts stderr "Warning doc_submenu found a link: $file" + } + if { $file_type == "file" } { + # only put certain file types on the menu + if {[regexp ".*\.(htm|html|c|pd|txt|tk|pdf|wav|aif|aiff)$" $file]} { + $helpmenu add command -label $file_name \ + -command "menu_doc_open doc/$base_dir/$sub_dir $file_name" + } + } elseif { $file_type == "directory" } { + regsub -all "\\\." [string tolower $file_name] "" submenu menu $helpmenu.$submenu -tearoff $pd_tearoff - regsub -all "\\\." $subdir " " submenuname + regsub -all "\\\." $file_name " " submenuname $helpmenu add cascade -label $submenuname \ -menu $helpmenu.$submenu - -# use this glob pattern to exclude the supporting files -# foreach file [ lsort [ glob -dir $menudir {*[0-9][0-9]*} ] ] - foreach file [ lsort [ glob -dir $menudir * ] ] { - set filename "" - regsub {.*/(.*\..+$)} $file {\1} filename - $helpmenu.$submenu add command -label $filename \ - -command "menu_doc_open doc/$subdir $filename" + menu_doc_submenu $helpmenu.$submenu $base_dir/$sub_dir \ + [file tail $file] + } + } } } ############# routine to add media, help, and apple menu items ############### proc menu_addstd {mbar} { - global pd_apilist pd_nt pd_tearoff + global pd_apilist pd_nt pd_tearoff help_menu_name # the "Audio" menu $mbar.audio add command -label {audio ON} -accelerator [accel_munge "Ctrl+/"] \ -command {menu_audio 1} @@ -490,34 +550,17 @@ -command {pd pd audio-properties \;} $mbar.apple.preferences add command -label "MIDI settings..." \ -command {pd pd midi-properties \;} - } - - -# the "Help" menu - if {$pd_nt != 2} { -# a menu on the main menubar named "$whatever.help" while be treated -# as a special menu with specific behaviors on different platforms. -# See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm - $mbar.help add command -label {About Pd} \ - -command {menu_doc_open doc/1.manual 1.introduction.txt} - $mbar.help add command -label {Pure Documentation...} \ - -command {menu_documentation} - # add menu items for each section instead of using Pd patches - $mbar.help add separator - set helpmenuname help } else { -# Apple doesn't allow cascading menus in their Help so I had to call this -# one "docs" - set helpmenuname docs + $mbar.$help_menu_name add command -label "About Pd..." -command \ + {menu_doc_open doc/1.manual 1.introduction.txt} } - $mbar.$helpmenuname add command -label {1 manual...} \ + $mbar.$help_menu_name add command -label {Browse Documentation...} \ + -command {menu_documentation} + $mbar.$help_menu_name add command -label {Pd HTML Manual...} \ -command {menu_doc_open doc/1.manual index.htm} - doc_submenu $mbar.$helpmenuname 2.control.examples - doc_submenu $mbar.$helpmenuname 3.audio.examples - doc_submenu $mbar.$helpmenuname 4.fft.examples - doc_submenu $mbar.$helpmenuname 5.reference - doc_submenu $mbar.$helpmenuname 6.externs + $mbar.$help_menu_name add separator + menu_doc_submenu $mbar.$help_menu_name "." "." } #################### the "File" menu for the Pd window ############## @@ -820,6 +863,7 @@ global pd_opendir global pd_tearoff global pd_nt + global help_menu_name toplevel $name -menu $name.m # puts stderr [concat geometry: $geometry] @@ -1078,13 +1122,11 @@ # as a special menu with specific behaviors on different platforms. # See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm if {$pd_nt != 2} { - menu $name.m.help -tearoff $pd_tearoff - $name.m add cascade -label Help -menu $name.m.help + menu $name.m.$help_menu_name -tearoff $pd_tearoff + $name.m add cascade -label Help -menu $name.m.$help_menu_name } else { - # Apple doesn't allow cascading menus in their Help - # so I had to call this one "docs". - menu $name.m.docs -tearoff $pd_tearoff - $name.m add cascade -label Help -menu $name.m.docs + menu $name.m.$help_menu_name -tearoff $pd_tearoff + $name.m add cascade -label Help -menu $name.m.$help_menu_name } menu_addstd $name.m