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".  
+    # <hans@at.or.at.>
+    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" <hans@at.or.at>
+    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 # <hans@at.or.at>
-	 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 <hans@at.or.at>
+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
+	    # <hans@at.or.at>
+	    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"  <hans@at.or.at>
-		  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". <hans@at.or.at>
-		  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