Index: admin-functions.php
===================================================================
RCS file: /cvsroot/cafelog/wordpress/wp-admin/admin-functions.php,v
retrieving revision 1.78
diff -u -r1.78 admin-functions.php
--- admin-functions.php	1 Feb 2005 06:59:44 -0000	1.78
+++ admin-functions.php	6 Feb 2005 06:35:09 -0000
@@ -773,14 +773,16 @@
 }
 
 function add_menu_page($page_title, $menu_title, $access_level, $file) {
-	global $menu;
+	global $menu, $admin_page_hooks;
 
 	$file = plugin_basename($file);
 
 	$menu[] = array($menu_title, $access_level, $file, $page_title);
+
+	$admin_page_hooks[$file] = sanitize_title($menu_title);
 }
 
-function add_submenu_page($parent, $page_title, $menu_title, $access_level, $file) {
+function add_submenu_page($parent, $page_title, $menu_title, $access_level, $file, $function = '') {
 	global $submenu;
 	global $menu;
 
@@ -800,14 +802,20 @@
 	}
 	
 	$submenu[$parent][] = array($menu_title, $access_level, $file, $page_title);
+
+	$hookname = get_plugin_page_hookname($file, $parent);
+	if ( !empty($function) && !empty($hookname) )
+		add_action($hookname, $function);
+
+	return $hookname;
 }
 
-function add_options_page($page_title, $menu_title, $access_level, $file) {
-	add_submenu_page('options-general.php', $page_title, $menu_title, $access_level, $file);
+function add_options_page($page_title, $menu_title, $access_level, $file, $function = '') {
+	return add_submenu_page('options-general.php', $page_title, $menu_title, $access_level, $file, $function);
 }
 
-function add_management_page($page_title, $menu_title, $access_level, $file) {
-	add_submenu_page('edit.php', $page_title, $menu_title, $access_level, $file);
+function add_management_page($page_title, $menu_title, $access_level, $file, $function = '') {
+	return add_submenu_page('edit.php', $page_title, $menu_title, $access_level, $file, $function);
 }
 
 function validate_file($file, $allowed_files = '') {
@@ -999,4 +1007,28 @@
 	return $wp_plugins;
 }
 
+function get_plugin_page_hookname($plugin_page, $parent_page) {
+	global $admin_page_hooks;
+
+	if ( isset($admin_page_hooks[$parent_page]) )
+		$page_type = $admin_page_hooks[$parent_page];
+	else
+		$page_type = 'admin';
+
+	$plugin_name = preg_replace('!\.php!', '', $plugin_page);
+
+	return $page_type . '_page_' . $plugin_name;
+}
+
+function get_plugin_page_hook($plugin_page, $parent_page) {
+	global $wp_filter;
+
+	$hook = get_plugin_page_hookname($plugin_page, $parent_page);
+
+	if ( isset($wp_filter[$hook]) )
+		return $hook;
+	else
+		return '';
+}
+
 ?>
Index: admin.php
===================================================================
RCS file: /cvsroot/cafelog/wordpress/wp-admin/admin.php,v
retrieving revision 1.7
diff -u -r1.7 admin.php
--- admin.php	27 Jan 2005 15:20:47 -0000	1.7
+++ admin.php	6 Feb 2005 06:35:10 -0000
@@ -41,19 +41,30 @@
 // Handle plugin admin pages.
 if (isset($_GET['page'])) {
 	$plugin_page = plugin_basename($_GET['page']);
-	if ( validate_file($plugin_page) ) {
-		die(__('Invalid plugin page'));
-	}
-
-	if (! file_exists(ABSPATH . "wp-content/plugins/$plugin_page"))
-		die(sprintf(__('Cannot load %s.'), $plugin_page));
+	$page_hook = get_plugin_page_hook($plugin_page, $pagenow);
 
-	if (! isset($_GET['noheader']))
-		require_once(ABSPATH . '/wp-admin/admin-header.php');
+	if ( $page_hook ) {
+		if (! isset($_GET['noheader']))
+			require_once(ABSPATH . '/wp-admin/admin-header.php');
+		
+		do_action($page_hook);
+	} else {
+		if ( validate_file($plugin_page) ) {
+			die(__('Invalid plugin page'));
+		}
+		
+		if (! file_exists(ABSPATH . "wp-content/plugins/$plugin_page"))
+			die(sprintf(__('Cannot load %s.'), $plugin_page));
 
-	include(ABSPATH . "wp-content/plugins/$plugin_page");
+		if (! isset($_GET['noheader']))
+			require_once(ABSPATH . '/wp-admin/admin-header.php');
+		
+		include(ABSPATH . "wp-content/plugins/$plugin_page");
+	}
+	
+	include(ABSPATH . 'wp-admin/admin-footer.php');
 
-	include(ABSPATH . 'wp-admin/admin-footer.php');	
+	exit();
 }
 
 ?>
\ No newline at end of file
Index: menu-header.php
===================================================================
RCS file: /cvsroot/cafelog/wordpress/wp-admin/menu-header.php,v
retrieving revision 1.4
diff -u -r1.4 menu-header.php
--- menu-header.php	24 Dec 2004 20:55:36 -0000	1.4
+++ menu-header.php	6 Feb 2005 06:35:10 -0000
@@ -35,14 +35,19 @@
 		 continue;
 	 }
 
-if ( (substr($self, -10) == substr($item[2], -10)) || (isset($plugin_page) && $plugin_page == $item[2]) ) $class = ' class="current"';
+if ( (isset($plugin_page) && $plugin_page == $item[2]) || (!isset($plugin_page) && substr($self, -10) == substr($item[2], -10)) ) $class = ' class="current"';
 else if (isset($submenu_file) && $submenu_file == substr($item[2], -10)) $class = ' class="current"';	 
 else $class = '';
 
-if (file_exists(ABSPATH . "wp-content/plugins/{$item[2]}"))
-	echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";			
- else
+if (file_exists(ABSPATH . "wp-content/plugins/{$item[2]}")) {
+	$page_hook = get_plugin_page_hook($item[2], $parent_file);
+	if ( $page_hook )
+		echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/{$parent_file}?page={$item[2]}'$class>{$item[0]}</a></li>";		
+	else
+		echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
+ } else {
 	echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/{$item[2]}'$class>{$item[0]}</a></li>";
+ }
 endforeach;
 ?>
 
Index: menu.php
===================================================================
RCS file: /cvsroot/cafelog/wordpress/wp-admin/menu.php,v
retrieving revision 1.39
diff -u -r1.39 menu.php
--- menu.php	5 Feb 2005 04:53:19 -0000	1.39
+++ menu.php	6 Feb 2005 06:35:10 -0000
@@ -48,6 +48,11 @@
 $submenu['themes.php'][5] = array(__('Themes'), 8, 'themes.php');
 $submenu['themes.php'][10] = array(__('Theme Editor'), 8, 'theme-editor.php');
 
+// Create list of page plugin hook names.
+foreach ($menu as $menu_page) {
+	$admin_page_hooks[$menu_page[2]] = sanitize_title($menu_page[0]);
+}
+
 do_action('admin_menu', '');
 ksort($menu); // make it all pretty
 

