Index: modules/filter/filter.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.admin.inc,v
retrieving revision 1.43
diff -u -p -r1.43 filter.admin.inc
--- modules/filter/filter.admin.inc	5 Sep 2009 13:22:13 -0000	1.43
+++ modules/filter/filter.admin.inc	10 Sep 2009 15:18:58 -0000
@@ -118,7 +118,8 @@ function filter_admin_format_form(&$form
     $form['default_format'] = array('#type' => 'hidden', '#value' => 1);
   }
 
-  $form['name'] = array('#type' => 'textfield',
+  $form['name'] = array(
+    '#type' => 'textfield',
     '#title' => t('Name'),
     '#default_value' => $format->name,
     '#description' => t('Specify a unique name for this text format.'),
@@ -144,7 +145,7 @@ function filter_admin_format_form(&$form
   }
   // Table with filters
   $filter_info = filter_get_filters();
-  $filters = filter_list_format($format->format);
+  $filters = filter_list_format($format->format, TRUE);
 
   $form['filters'] = array('#type' => 'fieldset',
     '#title' => t('Filters'),
@@ -152,10 +153,10 @@ function filter_admin_format_form(&$form
     '#tree' => TRUE,
   );
   foreach ($filter_info as $name => $filter) {
-    $form['filters'][$name] = array(
+    $form['filters'][$name]['status'] = array(
       '#type' => 'checkbox',
       '#title' => $filter['title'],
-      '#default_value' => isset($filters[$name]),
+      '#default_value' => !empty($filters[$name]->status),
       '#description' => $filter['description'],
     );
   }
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.287
diff -u -p -r1.287 filter.module
--- modules/filter/filter.module	30 Aug 2009 06:04:09 -0000	1.287
+++ modules/filter/filter.module	10 Sep 2009 15:31:25 -0000
@@ -70,6 +70,13 @@ function filter_theme() {
  * Implement hook_menu().
  */
 function filter_menu() {
+  $items['filter/tips'] = array(
+    'title' => 'Compose tips',
+    'page callback' => 'filter_tips_long',
+    'access callback' => TRUE,
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'filter.pages.inc',
+  );
   $items['admin/config/content/formats'] = array(
     'title' => 'Text formats',
     'description' => 'Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.',
@@ -90,13 +97,6 @@ function filter_menu() {
     'weight' => 1,
     'file' => 'filter.admin.inc',
   );
-  $items['filter/tips'] = array(
-    'title' => 'Compose tips',
-    'page callback' => 'filter_tips_long',
-    'access callback' => TRUE,
-    'type' => MENU_SUGGESTED_ITEM,
-    'file' => 'filter.pages.inc',
-  );
   $items['admin/config/content/formats/%filter_format'] = array(
     'type' => MENU_CALLBACK,
     'title callback' => 'filter_admin_format_title',
@@ -185,15 +185,14 @@ function filter_format_save($format) {
   // to the bottom.
   $current = filter_list_format($format->format);
   $filters = $format->filters;
-
-  foreach ($filters as $name => $status) {
+  foreach ($filters as $name => $filter) {
     $fields = array();
     // Add new filters to the bottom.
     $fields['weight'] = isset($current[$name]->weight) ? $current[$name]->weight : 10;
-    $fields['status'] = $status;
+    $fields['status'] = $filter['status'];
     // Only update settings if there are any.
-    if (!empty($format->settings[$name])) {
-      $fields['settings'] = serialize($format->settings[$name]);
+    if (!empty($filter['settings'])) {
+      $fields['settings'] = serialize($filter['settings']);
     }
     db_merge('filter')
       ->key(array(
@@ -211,6 +210,8 @@ function filter_format_save($format) {
     module_invoke_all('filter_format_update', $format);
   }
 
+  // Clear the filter cache whenever a text format is saved.
+  drupal_static_reset('filter_list_format');
   cache_clear_all($format->format . ':', 'cache_filter', TRUE);
 
   return $return;
@@ -386,6 +387,7 @@ function _filter_html_escape_tips($filte
 /**
  * @} End of "Tips callback for filters".
  */
+
 /**
  * Retrieve a list of text formats.
  */
@@ -472,47 +474,52 @@ function filter_format_allowcache($forma
 }
 
 /**
- * Retrieve a list of filters for a certain format.
+ * Retrieve a list of filters for a given text format.
  *
  * @param $format
  *   The format ID.
+ * @param $include_disabled
+ *   (optional) Boolean whether to retrieve all filters associated with the
+ *   given format, including those that are disabled. Defaults to FALSE.
  * @return
  *   An array of filter objects assosiated to the given format.
  */
-function filter_list_format($format) {
-  static $filters = array();
+function filter_list_format($format, $include_disabled = FALSE) {
+  $filters = &drupal_static(__FUNCTION__, array());
   $filter_info = filter_get_filters();
 
-  if (!isset($filters[$format])) {
-    $filters[$format] = array();
-    $result = db_select('filter', 'filter')
+  if (!isset($filters[$format]) || $include_disabled) {
+    $format_filters = array();
+    $query = db_select('filter', 'filter')
       ->fields('filter')
       ->condition('format', $format)
-      ->condition('status', 1)
       ->orderBy('weight')
       ->orderBy('module')
-      ->orderBy('name')
-      ->execute();
-    foreach ($result as $filter) {
-      if (isset($filter_info[$filter->name])) {
-        $filter->title = $filter_info[$filter->name]['title'];
+      ->orderBy('name');
+    if (!$include_disabled) {
+      $query->condition('status', 1);
+    }
+    $result = $query->execute()->fetchAllAssoc('name');
+    foreach ($result as $name => $filter) {
+      if (isset($filter_info[$name])) {
+        $filter->title = $filter_info[$name]['title'];
         // Unpack stored filter settings.
-        if (isset($filter->settings)) {
-          $filter->settings = unserialize($filter->settings);
-        }
-        else {
-          $filter->settings = array();
-        }
+        $filter->settings = (isset($filter->settings) ? unserialize($filter->settings) : array());
         // Apply default filter settings.
-        if (isset($filter_info[$filter->name]['default settings'])) {
-          $filter->settings = array_merge($filter_info[$filter->name]['default settings'], $filter->settings);
+        if (isset($filter_info[$name]['default settings'])) {
+          $filter->settings = array_merge($filter_info[$name]['default settings'], $filter->settings);
         }
-        $filters[$format][$filter->name] = $filter;
+        $format_filters[$name] = $filter;
       }
     }
+    // Prevent statically caching of disabled filters.
+    if ($include_disabled) {
+      return $format_filters;
+    }
+    $filters[$format] = $format_filters;
   }
 
-  return $filters[$format];
+  return isset($filters[$format]) ? $filters[$format] : array();
 }
 
 /**
