Index: modules/block/block.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v
retrieving revision 1.58
diff -u -p -r1.58 block.admin.inc
--- modules/block/block.admin.inc	30 Sep 2009 13:09:29 -0000	1.58
+++ modules/block/block.admin.inc	2 Oct 2009 10:01:57 -0000
@@ -7,6 +7,14 @@
  */
 
 /**
+ * Menu callback for admin/structure/block/demo.
+ */
+function block_admin_demo($theme = NULL) {
+  drupal_add_css(drupal_get_path('module', 'block') . '/block.css', array('preprocess' => FALSE));
+  return '';
+}
+
+/**
  * Menu callback for admin/structure/block.
  */
 function block_admin_display($theme = NULL) {
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.380
diff -u -p -r1.380 block.module
--- modules/block/block.module	30 Sep 2009 13:09:29 -0000	1.380
+++ modules/block/block.module	2 Oct 2009 10:01:57 -0000
@@ -29,13 +29,15 @@ function block_help($path, $arg) {
       $output .= '<li>' . t('some dynamic blocks, such as those generated by modules, will be displayed only on certain pages.') . '</li></ul>';
       $output .= '<p>' . t('For more information, see the online handbook entry for <a href="@block">Block module</a>.', array('@block' => 'http://drupal.org/handbook/modules/block/')) . '</p>';
       return $output;
-    case 'admin/structure/block':
-      $output = '<p>' . t('This page provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page.') . '</p>';
-      $output .= '<p>' . t('Click the <em>configure</em> link next to each block to configure its specific title and visibility settings. Use the <a href="@add-block">add block page</a> to create a custom block.', array('@add-block' => url('admin/structure/block/add'))) . '</p>';
-      return $output;
     case 'admin/structure/block/add':
       return '<p>' . t('Use this page to create a new custom block. New blocks are disabled by default, and must be moved to a region on the <a href="@blocks">blocks administration page</a> to be visible.', array('@blocks' => url('admin/structure/block'))) . '</p>';
   }
+  if ($arg[0] == 'admin' && $arg[1] == 'structure' && $arg['2'] == 'block' && (empty($arg[3]) || $arg[3] == 'list')) {  
+    $demo_theme = !empty($arg[4]) ? $arg[4] : variable_get('theme_default', 'garland');
+    $output = '<p>' . t('This page provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page.') . '</p>';
+    $output .= '<p>' . t('Click the <em>configure</em> link next to each block to configure its specific title and visibility settings. Use the <a href="@add-block">add block page</a> to create a custom block. A <a href="@demo">demonstration of the placement of regions</a> is also available.', array('@add-block' => url('admin/structure/block/add'), '@demo' => url('admin/structure/block/demo/' . $demo_theme))) . '</p>';
+    return $output;
+  }
 }
 
 /**
@@ -76,7 +78,6 @@ function block_menu() {
     'description' => 'Configure what block content appears in your site\'s sidebars and other regions.',
     'page callback' => 'block_admin_display',
     'access arguments' => array('administer blocks'),
-    'theme callback' => '_block_custom_theme',
     'file' => 'block.admin.inc',
   );
   $items['admin/structure/block/list'] = array(
@@ -124,6 +125,15 @@ function block_menu() {
       'weight' => $key == $default ? -10 : 0,
       'access callback' => '_block_themes_access',
       'access arguments' => array($theme),
+      'file' => 'block.admin.inc',
+    );
+    $items['admin/structure/block/demo/' . $key] = array(
+      'title' => check_plain($theme->info['name']),
+      'page callback' => 'block_admin_demo',
+      'page arguments' => array($key),
+      'type' => MENU_CALLBACK,
+      'access callback' => '_block_themes_access',
+      'access arguments' => array($theme),
       'theme callback' => '_block_custom_theme',
       'theme arguments' => array($key),
       'file' => 'block.admin.inc',
@@ -200,7 +210,7 @@ function block_block_view($delta = 0, $e
 }
 
 /**
- * Implement hook_page_alter().
+ * Implement hook_page_build().
  *
  * Render blocks into their regions.
  */
@@ -213,19 +223,23 @@ function block_page_build(&$page) {
   // Populate all block regions
   $all_regions = system_region_list($theme);
 
-  // Load all region content assigned via blocks.
-  foreach (array_keys($all_regions) as $region) {
-    $page[$region] = array();
-    // Assign blocks to region.
-    if ($blocks = block_get_blocks_by_region($region)) {
-      $page[$region] = $blocks;
+  $item = menu_get_item();
+  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
+    // Load all region content assigned via blocks.
+    foreach (array_keys($all_regions) as $region) {
+      $page[$region] = array();
+      // Assign blocks to region.
+      if ($blocks = block_get_blocks_by_region($region)) {
+        $page[$region] = $blocks;
+      }
     }
-
-    // Append region description if we are rendering the block admin page.
+  }
+  else {
+    // Append region description if we are rendering the regions demo page.
     $item = menu_get_item();
-    if ($item['path'] == 'admin/structure/block') {
-      $visible_regions = system_region_list($theme, REGIONS_VISIBLE);
-      if (isset($visible_regions[$region])) {
+    if ($item['path'] == 'admin/structure/block/demo/' . $theme) {
+      $visible_regions = array_keys(system_region_list($theme, REGIONS_VISIBLE));
+      foreach ($visible_regions as $region) {
         $description = '<div class="block-region">' . $all_regions[$region] . '</div>';
         $page[$region]['block_description'] = array(
           '#markup' => $description,
