? LICENSE.txt
? mode-defaults.patch
Index: mode.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/mode/Attic/mode.admin.inc,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 mode.admin.inc
--- mode.admin.inc	27 Feb 2009 20:29:25 -0000	1.1.2.1
+++ mode.admin.inc	5 Aug 2009 16:22:11 -0000
@@ -5,21 +5,49 @@
  * Menu callback: Mode module settings form.
  */
 function mode_list() {
-  $header = array(t('Name'), t('Status'), array('data' => t('Operations'), 'colspan' => 3));
   $rows = array();
-  $modes = mode_modes_load();
+  
+  //Load modes from Database
+  $mode_groups['normal'] = mode_modes_load();
+  $mode_groups['default'] = mode_modes_load_defaults();
+  
+  //Normal Modes Table
+  $rows = array();
+  foreach ($mode_groups['normal'] as $mode) {
+    $row = array();
+    $row[] = check_plain($mode->name);
+    $row[] = $mode->active ? t('Enabled') : t('Disabled');
+    $row[] = implode(' | ', array(
+        l(t('Edit'), 'admin/settings/mode/edit/'. $mode->mid),
+        l(t('Delete'), 'admin/settings/mode/delete/'. $mode->mid),
+        l(t('Export'), 'admin/settings/mode/export/'. $mode->mid),
+        $mode->active ? l(t('Reapply'), 'admin/settings/mode/switch/'. $mode->mid) : l(t('Apply'), 'admin/settings/mode/switch/'. $mode->mid),
+      ));
+    
+    $rows[] = $row;
+  }
 
-  foreach ($modes as $mode) {
-    $rows[] = array(
-      check_plain($mode->name),
-      $mode->active ? t('Enabled') : t('Disabled'),
-      l(t('Edit'), 'admin/settings/mode/edit/'. $mode->mid),
-      l(t('Delete'), 'admin/settings/mode/delete/'. $mode->mid),
-      $mode->active ? l(t('Reapply'), 'admin/settings/mode/switch/'. $mode->mid) : l(t('Apply'), 'admin/settings/mode/switch/'. $mode->mid)
-    );
+  $header = array(t('Name'), t('Status'), array('data' => t('Operations'), 'colspan' => 3));
+  $caption = t('Normal Modes (Stored in Database)'); 
+  $output .= theme_table($header, $rows, array(), $caption);
+
+  //Default Modes Table
+  $rows = array();
+  foreach ($mode_groups['default'] as $mode) {
+    $row = array();
+    $row[] = check_plain($mode->module);
+    $row[] = check_plain($mode->name);
+    $row[] = implode(' | ', array(
+        l(t('Import'), 'admin/settings/mode/add/import/'. $mode->module .'/'. $mode->name),
+      ));
+    $rows[] = $row;
   }
 
-  return theme_table($header, $rows);
+  $header = array(t('Module'), t('Name'), array('data' => t('Operations'), 'colspan' => 3));
+  $caption = t('Default Modes (Provided by Modules)');
+  $output .= theme_table($header, $rows, array(), $caption);
+  
+  return $output;
 }
 
 /**
@@ -48,8 +76,22 @@ function mode_settings_form($form_state)
 /**
  * Menu callback: Mode add/edit form.
  */
-function mode_edit_form($form_state, $mode_id = NULL) {
-  $mode = $mode_id ? mode_modes_load($mode_id) : NULL;
+function mode_edit_form($form_state, $mode_id = NULL, $module = NULL, $name = NULL) {
+  
+  //Import Form (add w/defaults loaded) 
+  if ($mode_id == 'import' && $module && $name){
+    $mode = mode_modes_load_defaults($module, $name);
+    drupal_set_title(t('Mode Import: %name', array('%name' => $mode->name)));
+  }
+  //Edit Form
+  elseif ($mode_id != NULL) {
+    $mode = mode_modes_load($mode_id);
+    drupal_set_title(t('Mode edit: %name', array('%name' => $mode->name)));
+  }
+  //Add form
+  else {
+    $mode = NULL;
+  }
 
   require_once(drupal_get_path('module', 'user') .'/user.admin.inc');
   $form = user_admin_perm(NULL);
@@ -72,8 +114,6 @@ function mode_edit_form($form_state, $mo
   $form['submit']['#weight'] = 3;
 
   if ($mode) {
-    drupal_set_title(t('Mode edit: %name', array('%name' => $mode->name)));
-
     $form['name']['#default_value'] = $mode->name;
     $form['message']['#default_value'] = $mode->message;
     foreach ($form['checkboxes'] as $rid => $options) {
@@ -91,6 +131,16 @@ function mode_edit_form($form_state, $mo
   return $form;
 }
 
+function mode_edit_form_validate(&$form, &$form_state){
+  
+  $mid = db_result(db_query("SELECT mid FROM {mode} WHERE name = '%s'", $form_state['values']['name']));
+  
+  if($mid){
+    form_set_error('name', t('A Mode with that name already exists.  Please choose another.'));
+  }
+  
+}
+
 /**
  * Process mode edit form submissions.
  */
@@ -142,6 +192,51 @@ function mode_delete_form_submit($form, 
   $form_state['redirect'] = 'admin/settings/mode';
 }
 
+
+/**
+ * Menu callback: Mode export form.
+ */
+function mode_export_form($form_state, $mode_id = NULL) {
+  
+  
+  if ($mode_id == NULL){
+    $modes = mode_modes_load();
+  } else {
+    $modes[] = (array) mode_modes_load($mode_id);
+  }
+  
+  $code[] = "/**                ";
+  $code[] = " * Implementation of hook_mode_defaults().   ";
+  $code[] = " */                ";
+  $code[] = "function MODULE_mode_defaults(){      ";
+  
+  foreach($modes as $mode){
+    $mode = (array) $mode;
+    unset($mode['mid'], $mode['active']);
+    
+    $mode['module'] = 'MODULE';
+    $export = var_export($mode, 1);
+    $code[] = "  \$modes['{$mode['name']}'] = (object) $export;      ";
+  }
+  
+  $code[] = "  return \$modes;                     ";
+  $code[] = "}";
+ 
+  $code = implode("\n", $code);
+  $lines = substr_count($code, "\n");
+
+  
+  $form['code'] = array(
+    '#type' => 'textarea',
+    '#title' => $mode->name,
+    '#default_value' => $code,
+    '#rows' => $lines,
+  );
+  return $form;
+  
+  
+}
+
 /**
  * Switch to a different mode.
  *
Index: mode.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/mode/mode.info,v
retrieving revision 1.1
diff -u -p -r1.1 mode.info
--- mode.info	10 Feb 2009 20:16:03 -0000	1.1
+++ mode.info	5 Aug 2009 16:22:11 -0000
@@ -2,3 +2,10 @@
 name = Mode
 description = Switch between permission modes for the site.
 core = 6.x
+
+; Information added by drupal.org packaging script on 2009-03-08
+version = "6.x-1.0-beta2"
+core = "6.x"
+project = "mode"
+datestamp = "1236535838"
+
Index: mode.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/mode/mode.module,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 mode.module
--- mode.module	1 Mar 2009 06:59:56 -0000	1.1.2.2
+++ mode.module	5 Aug 2009 16:22:11 -0000
@@ -66,6 +66,15 @@ function mode_menu() {
     'file' => 'mode.admin.inc',
     'weight' => 2
   );
+  $items['admin/settings/mode/export'] = array(
+    'title' => 'Export',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('mode_export_form', 4),
+    'access arguments' => array('administer permissions'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'mode.admin.inc',
+    'weight' => 5,
+  );
   $items['admin/settings/mode/edit/%'] = array(
     'title' => 'Edit',
     'page callback' => 'drupal_get_form',
@@ -172,6 +181,37 @@ function mode_modes_load($mode = NULL, $
   }
 }
 
+
+/**
+ * Load default modes provided by other modules 
+ *
+ * @param $mode
+ *   Name or mode ID of the mode to load.
+ * @param $active
+ *   Boolean to indicate if the retrieved mode is currently enabled. If set to
+ * TRUE, the $mode parameter is ignored.
+ * @return
+ *   A mode object or an array of modes.
+ */
+function mode_modes_load_defaults($module = null, $name = null){
+  
+  if ($module) {
+    $modes = module_invoke($module, 'mode_defaults');
+  } else {
+    $modes = module_invoke_all('mode_defaults');
+  }
+
+  if ($module && $name){
+    return $modes[$name];
+  } elseif ($module){
+    return $modes;
+  } else {
+    return $modes;
+  }
+}
+
+
+
 /**
  * Add / update a mode.
  *
