Only in sites/all/modules/book_manager: .svn
Common subdirectories: sites/all/modules/book_manager_old/CVS and sites/all/modules/book_manager/CVS
diff -up sites/all/modules/book_manager_old/book_manager.module sites/all/modules/book_manager/book_manager.module
--- sites/all/modules/book_manager_old/book_manager.module	2009-01-14 21:21:10.000000000 -0500
+++ sites/all/modules/book_manager/book_manager.module	2009-02-18 13:08:39.000000000 -0500
@@ -118,6 +118,15 @@ function book_manager_menu() {
     'access arguments' => array(1),
     'type' => MENU_CALLBACK,
   );
+  
+  $items['personal-outline/book/chapter/delete/%node'] = array(
+    'title' => 'Delete a book page, chapter, or section of a book',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('book_manager_delete_chapter_confirm', 4),
+    'access callback' => '_book_manager_outline_access',
+    'access arguments' => array(4),
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
@@ -260,6 +269,13 @@ function book_manager_theme() {
 }
 
 /**
+ * Implementation of hook_theme_registry_alter()
+ */
+function book_manager_theme_registry_alter(&$theme_registry) {
+  $theme_registry['book_admin_table']['function'] = 'theme_book_manager_outline_table';
+}
+
+/**
  * This function heavily copied from theme_book_admin_table
  * @see theme_book_admin_table
 */
@@ -286,6 +302,7 @@ function theme_book_manager_outline_tabl
       else {
         $edit = TRUE;
         $delete = TRUE;
+        $node = node_load(array('nid' => $nid));
       }
 
       // Add special classes to be used with tabledrag.js.
@@ -299,7 +316,7 @@ function theme_book_manager_outline_tabl
         drupal_render($form[$key]['plid']) . drupal_render($form[$key]['mlid']),
         l(t('view'), $href),
         $edit ? l(t('edit'), 'node/'. $nid .'/edit', array('query' => $destination)) : '&nbsp',
-        $delete ? l(t('delete'), 'node/'. $nid .'/delete', array('query' => $destination) )  : '&nbsp',
+        $delete ? l(t('delete'), $node->book['has_children'] ? 'personal-outline/book/chapter/delete/'. $nid : 'node/'. $nid .'/delete', array('query' => $destination))  : '&nbsp',
       );
       
       $edit = FALSE;
@@ -796,4 +813,83 @@ function book_manager_block($op = 'list'
       variable_set('book_manager_block_mode', $edit['book_manager_block_mode']);
       break;
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Menu callback.  Ask for confirmation of chapter deletion.
+ */
+function book_manager_delete_chapter_confirm(&$form_state, $node) {
+  $form['nid'] = array(
+    '#type' => 'value',
+    '#value' => $node->nid,
+  );
+
+  return confirm_form($form,
+    t('Are you sure you want to delete the entire chapter %title?', array('%title' => $node->title)),
+    isset($_GET['destination']) ? $_GET['destination'] : 'personal-outline/'. $node->nid,
+    t('This action will delete every page in the chapter and cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Execute chapter deletion using batch processing.
+ */
+function book_manager_delete_chapter_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    $node_list = array();
+    $book_item = node_load($form_state['values']['nid']);
+    $tree = book_menu_subtree_data($book_item->book);
+    _book_manager_delete_chapter($tree, $node_list);
+    
+    $batch = array(
+     'title' => t('Deleting Book Pages'),
+     'operations' => array(
+        array('book_manager_delete', array($node_list)),
+      ),
+    );
+    batch_set($batch);
+    batch_process();
+  }
+}
+
+/**
+ * Creates list of book page nids to delete
+ */
+function _book_manager_delete_chapter($book_item, &$node_list) {
+  foreach($book_item as $key) {
+    $node_list[] = $key['link']['nid'];
+      if ($key['below']) {
+        _book_manager_delete_chapter($key['below'], $node_list);
+      }
+  }
+}
+
+/**
+ * Batch processing callback.  Delete an entire book 5 nodes at a time.
+ */
+function book_manager_delete($node_list, &$context) {
+  if (!isset($context['sandbox']['progress'])) {
+    $context['sandbox']['max'] = count($node_list);
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['node_list'] = $node_list;
+  }
+
+  $node_list = $context['sandbox']['node_list'];
+  for ($i = 0; $i < 5; $i++) {
+    if (!empty($node_list)) {
+      $nid = array_shift($node_list);
+      node_delete($nid);
+      $context['sandbox']['progress']++;
+    }
+  }
+  $context['sandbox']['node_list'] = $node_list;
+  if (empty($node_list)) {
+    $context['sandbox']['progress'] = $context['sandbox']['max'];
+  }
+  
+  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
+    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+  }
+}
