Index: modules/filter/filter.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.admin.inc,v
retrieving revision 1.9
diff -u -p -r1.9 filter.admin.inc
--- modules/filter/filter.admin.inc	14 Feb 2008 18:39:18 -0000	1.9
+++ modules/filter/filter.admin.inc	15 Feb 2008 15:14:06 -0000
@@ -19,6 +19,7 @@ function filter_admin_overview() {
   $formats = filter_formats();
   $error = FALSE;
 
+  $form = array('#tree' => TRUE);
   foreach ($formats as $id => $format) {
     $roles = array();
     foreach (user_roles() as $rid => $name) {
@@ -29,13 +30,14 @@ function filter_admin_overview() {
     }
     $default = ($id == variable_get('filter_default_format', 1));
     $options[$id] = '';
-    $form[$format->name]['id'] = array('#value' => $id);
-    $form[$format->name]['roles'] = array('#value' => $default ? t('All roles may use default format') : ($roles ? implode(', ', $roles) : t('No roles may use this format')));
-    $form[$format->name]['configure'] = array('#value' => l(t('configure'), 'admin/settings/filters/'. $id));
-    $form[$format->name]['delete'] = array('#value' => $default ? '' : l(t('delete'), 'admin/settings/filters/delete/'. $id));
+    $form[$id]['name'] = array('#value' => $format->name);
+    $form[$id]['roles'] = array('#value' => $default ? t('All roles may use default format') : ($roles ? implode(', ', $roles) : t('No roles may use this format')));
+    $form[$id]['configure'] = array('#value' => l(t('configure'), 'admin/settings/filters/'. $id));
+    $form[$id]['delete'] = array('#value' => $default ? '' : l(t('delete'), 'admin/settings/filters/delete/'. $id));
+    $form[$id]['weight'] = array('#type' => 'weight', '#default_value' => $format->weight);
   }
   $form['default'] = array('#type' => 'radios', '#options' => $options, '#default_value' => variable_get('filter_default_format', 1));
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Set default format'));
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Save changes'));
   return $form;
 }
 
@@ -45,6 +47,13 @@ function filter_admin_overview_submit($f
     drupal_set_message(t('Default format updated.'));
     variable_set('filter_default_format', $form_state['values']['default']);
   }
+  foreach ($form_state['values'] as $id => $data) {
+    if (is_array($data) && isset($data['weight'])) {
+      // Only update if this is a form element with weight.
+      db_query("UPDATE {filter_formats} SET weight = %d WHERE format = %d", $data['weight'], $id);
+    }
+  }
+  drupal_set_message(t('The input format ordering has been saved.'));
 }
 
 /**
@@ -54,22 +63,29 @@ function filter_admin_overview_submit($f
  */
 function theme_filter_admin_overview($form) {
   $rows = array();
-  foreach ($form as $name => $element) {
+  foreach ($form as $id => $element) {
     if (isset($element['roles']) && is_array($element['roles'])) {
+      $element['weight']['#attributes']['class'] = 'input-format-order-weight';
       $rows[] = array(
-        drupal_render($form['default'][$element['id']['#value']]),
-        check_plain($name),
-        drupal_render($element['roles']),
-        drupal_render($element['configure']),
-        drupal_render($element['delete'])
+        'data' => array(
+          check_plain($element['name']['#value']),
+          drupal_render($element['roles']),
+          drupal_render($form['default'][$id]),
+          drupal_render($element['weight']),
+          drupal_render($element['configure']),
+          drupal_render($element['delete']),
+        ),
+        'class' => 'draggable',
       );
-      unset($form[$name]);
+      unset($form[$id]);
     }
   }
-  $header = array(t('Default'), t('Name'), t('Roles'), array('data' => t('Operations'), 'colspan' => 2));
-  $output = theme('table', $header, $rows);
+  $header = array(t('Name'), t('Roles'), t('Default'), t('Weight'), array('data' => t('Operations'), 'colspan' => 2));
+  $output = theme('table', $header, $rows, array('id' => 'input-format-order'));
   $output .= drupal_render($form);
 
+  drupal_add_tabledrag('input-format-order', 'order', 'sibling', 'input-format-order-weight');
+
   return $output;
 }
 
Index: modules/filter/filter.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.install,v
retrieving revision 1.5
diff -u -p -r1.5 filter.install
--- modules/filter/filter.install	18 Dec 2007 12:59:21 -0000	1.5
+++ modules/filter/filter.install	15 Feb 2008 15:14:06 -0000
@@ -78,6 +78,13 @@ function filter_schema() {
         'size' => 'tiny',
         'description' => t('Flag to indicate whether format is cachable. (1 = cachable, 0 = not cachable)'),
       ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => t('Weight of input format to use when listing.'),
+      )
     ),
     'primary key' => array('format'),
     'unique keys' => array('name' => array('name')),
@@ -89,3 +96,11 @@ function filter_schema() {
   return $schema;
 }
 
+/**
+ * Add a weight column to the filter formats table.
+ */
+function filter_update_7000() {
+  $ret = array();
+  db_add_field($ret, 'filter_formats', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'));
+  return $ret;
+}
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.204
diff -u -p -r1.204 filter.module
--- modules/filter/filter.module	21 Jan 2008 15:08:24 -0000	1.204
+++ modules/filter/filter.module	15 Feb 2008 15:14:08 -0000
@@ -308,7 +308,7 @@ function filter_formats($index = NULL) {
       $args[] = variable_get('filter_default_format', 1);
     }
 
-    $result = db_query($query, $args);
+    $result = db_query($query .' ORDER by weight', $args);
     while ($format = db_fetch_object($result)) {
       $formats[$format->format] = $format;
     }
