Index: galleryapi.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/galleryapi/galleryapi.module,v
retrieving revision 1.2.2.1
diff -u -p -r1.2.2.1 galleryapi.module
--- galleryapi.module	26 Oct 2009 15:03:26 -0000	1.2.2.1
+++ galleryapi.module	11 Jul 2010 06:07:24 -0000
@@ -10,46 +10,55 @@
  * Implementation of hook_menu().
  */
 function galleryapi_menu() {
-  $items['admin/settings/galleryapi'] = array(      
-    'type' => MENU_NORMAL_ITEM,
+  $items['admin/settings/galleryapi'] = array(
     'title' => t('Gallery API'),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer site configuration'),     
-    'page callback' => 'galleryapi_admin_settings_callback',
+    'access arguments' => array('administer galleryapi'),
+    'page callback' => 'galleryapi_admin_preset_list',
     'file' => 'galleryapi.admin.inc',
   );
-  $items['admin/settings/galleryapi/%galleryapi_preset/edit'] = array(      
+  $items['admin/settings/galleryapi/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+
+  $items['admin/settings/galleryapi/add'] = array(
+    'title' => 'Add new preset',
+    'file' => 'galleryapi.admin.inc',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('galleryapi_admin_preset_edit'),
+    'access arguments' => array('administer galleryapi'),
+    'type' => MENU_LOCAL_TASK,
+  );
+
+  $items['admin/settings/galleryapi/%galleryapi_preset/edit'] = array(
     'type' => MENU_CALLBACK,
     'title' => t('Edit Gallery API preset'),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer site configuration'),     
+    'access arguments' => array('administer galleryapi'),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('galleryapi_admin_preset_edit', 3),
     'file' => 'galleryapi.admin.inc',
   );
-  $items['admin/settings/galleryapi/%galleryapi_preset/configure'] = array(      
+  $items['admin/settings/galleryapi/%galleryapi_preset/configure'] = array(
     'type' => MENU_CALLBACK,
     'title callback' => 'galleryapi_admin_preset_configure_title',
     'title arguments' => array(3),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer site configuration'),     
+    'access arguments' => array('administer galleryapi'),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('galleryapi_admin_preset_configure', 3),
     'file' => 'galleryapi.admin.inc',
   );
-  $items['admin/settings/galleryapi/%galleryapi_preset/delete'] = array(      
+  $items['admin/settings/galleryapi/%galleryapi_preset/delete'] = array(
     'type' => MENU_CALLBACK,
     'title' => t('Delete Gallery API preset'),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer site configuration'),     
+    'access arguments' => array('administer galleryapi'),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('galleryapi_presets_delete', 3),
     'file' => 'galleryapi.admin.inc',
-  );    
+  );
   $items['admin/settings/galleryapi/ahah-settings/%'] = array(
     'type' => MENU_CALLBACK,
-    'access callback' => 'user_access',
-    'access arguments' => array('administer site configuration'),
+    'access arguments' => array('administer galleryapi'),
     'page callback' => 'galleryapi_admin_settings_ahah',
     'page arguments' => array(4),
     'file' => 'galleryapi.admin.inc',
@@ -59,18 +68,14 @@ function galleryapi_menu() {
 }
 
 /**
- * Implementation of hook_theme().
+ * Implementation of hook_perm().
  */
-function galleryapi_theme() {
-  return array(
-    'galleryapi_preset_list' => array(
-      'arguments' => array('presets' => NULL),
-    ),
-  );
+function galleryapi_perm() {
+  return array('administer galleryapi');
 }
 
 function galleryapi_admin_preset_configure_title($preset) {
-  return t('Configure (!preset_name) Gallery API preset', array('!preset_name' => $preset['name']));
+  return t('Configure (@preset_name) Gallery API preset', array('@preset_name' => $preset['name']));
 }
 
 /**
@@ -136,30 +141,30 @@ function galleryapi_preset_load($preset_
       if (!empty($preset)) {
         $preset['input_data'] = unserialize($preset['input_data']);
         $preset['output_data'] = unserialize($preset['output_data']);
-        
-        // hook_galleryapi_methodapi (operation: preset load)      
+
+        // hook_galleryapi_methodapi (operation: preset load)
         module_invoke_all('galleryapi_methodapi', 'preset load', $pid, $preset);
-        
+
         $presets[$preset['pid']] = $preset;
         return $presets[$preset['pid']];
       }
       return FALSE;
     }
-  } 
+  }
   elseif (!$array_full) {
     $all_presets = db_query("SELECT * FROM {galleryapi_presets}");
     while ($preset = db_fetch_array($all_presets)) {
       $preset['input_data'] = unserialize($preset['input_data']);
       $preset['output_data'] = unserialize($preset['output_data']);
-      
-      // hook_galleryapi_methodapi (operation: preset load)      
+
+      // hook_galleryapi_methodapi (operation: preset load)
       module_invoke_all('galleryapi_methodapi', 'preset load', $pid, $preset);
-      
+
       $presets[$preset['pid']] = $preset;
     }
     $array_full = TRUE;
     return $presets;
-  } 
+  }
   else {
     return $presets;
   }
@@ -169,30 +174,30 @@ function galleryapi_slides_load($pid, $s
   $slides = array();
   if ($pid && (!is_array($sids) || !empty($sids))) {
     $preset = galleryapi_preset_load($pid);
-    if ($preset) {   
-      
-      $input_method = galleryapi_get_input($preset['input_name']);  
+    if ($preset) {
+
+      $input_method = galleryapi_get_input($preset['input_name']);
       $function = $input_method['module'] .'_galleryapi_'. $preset['input_name'] .'_slides_load';
       if (function_exists($function)) {
-     
+
         $slide_ids = is_array($sids) ? $sids : array($sids);
-      
+
         if (!is_array($types)) {
-          $types = array($types);  
+          $types = array($types);
         }
 
         $slides = $function($pid, $slide_ids, $types);
-      }  
+      }
     }
   }
-  
-  return is_array($sids) ? $slides : (array)$slides[$sids];   
+
+  return is_array($sids) ? $slides : (array)$slides[$sids];
 }
 
 function galleryapi_build_gallery($pid = 0, $data = array()) {
   $output = '';
   static $gallery_ids;
-  
+
   if ($pid && is_array($data) && count($data)) {
     $preset = galleryapi_preset_load($pid);
 
@@ -202,16 +207,16 @@ function galleryapi_build_gallery($pid =
     else {
       $gallery_ids[$pid] = 0;
     }
-    
+
     foreach ($data as $slide_id => $slide) {
       if (!is_array($slide)) {
         $data[$slide_id] = array();
       }
     }
-    
+
     $output_method = galleryapi_get_output($preset['output_name']);
-    $name = $output_method['module'] .'_galleryapi_'. $preset['output_name'];    
-    $output = theme($name, 'galleryapi_gallery_'. $pid .'_'. $gallery_ids[$pid], $pid, $data);  
+    $name = $output_method['module'] .'_galleryapi_'. $preset['output_name'];
+    $output = theme($name, 'galleryapi_gallery_'. $pid .'_'. $gallery_ids[$pid], $pid, $data);
   }
   return $output;
 }
\ No newline at end of file
Index: galleryapi.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/galleryapi/galleryapi.admin.inc,v
retrieving revision 1.2
diff -u -p -r1.2 galleryapi.admin.inc
--- galleryapi.admin.inc	19 Oct 2009 12:04:06 -0000	1.2
+++ galleryapi.admin.inc	11 Jul 2010 06:07:24 -0000
@@ -4,72 +4,97 @@
 /**
  * @file
  * Administrative functions for Gallery API.
- */ 
+ */
+
+function galleryapi_admin_preset_list() {
+  // Get availiable presets.
+  // TODO: replace this to more intuitive galleryapi_presets().
+  $presets = galleryapi_preset_load();
+  if ($presets) {
+    $input_methods = galleryapi_get_input();
+    $output_methods = galleryapi_get_output();
+
+    $header = array(t('Preset'), t('Input method'), t('Output method'), array('data' => t('Operations'), 'colspan' => 3));
+    $rows = array();
+
+    foreach ($presets as $preset) {
+      $row = array();
+      $row[] = check_plain($preset['name']);
+      $row[] = isset($input_methods[$preset['input_name']]['name']) ? $input_methods[$preset['input_name']]['name'] : t('Broken input method');
+      $row[] = isset($output_methods[$preset['output_name']]['name']) ? $output_methods[$preset['output_name']]['name'] : t('Broken output method');
+      $row[] = l(t('Edit'), 'admin/settings/galleryapi/'. $preset['pid'] .'/edit');
+      $row[] = l(t('Configure'), 'admin/settings/galleryapi/'. $preset['pid'] .'/configure');
+      $row[] = l(t('Delete'), 'admin/settings/galleryapi/'. $preset['pid'] .'/delete');
+
+      $rows[] = $row;
+    }
+
+    $output = theme('table', $header, $rows);
+  }
+  else {
+    $output = t('No presets defined. <a href="!url">Add new preset</a>', array('!url' => url('admin/settings/galleryapi/add')));
+  }
 
-function galleryapi_admin_settings_callback() {
-  $output = '';
-  
-  $output .= theme('galleryapi_preset_list', galleryapi_preset_load());
-  $output .= drupal_get_form('galleryapi_admin_preset_edit');
-  
   return $output;
 }
 
 function galleryapi_admin_preset_edit($form_state, $preset = array()) {
-  $form_state['pid'] = $preset['pid'];
-
   $form = array();
-  $form['create_presets'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Create gallery preset'),
-    '#collapsible' => TRUE,    
-  );
-  $form['create_presets']['name'] = array(
+  $form['name'] = array(
     '#type' => 'textfield',
     '#size' => 40,
-    '#title' => t('Name'),
+    '#title' => t('Preset name'),
     '#required' => TRUE,
     '#default_value' => $preset['name']
   );
-  $form['create_presets']['input'] = array(
+  $form['input_name'] = array(
     '#type' => 'select',
     '#title' => t('Input method'),
-    '#options' => galleryapi_get_input_names(),
+    '#options' => galleryapi_get_input_options(),
     '#required' => TRUE,
     '#default_value' => $preset['input_name'],
   );
-  $form['create_presets']['output'] = array(
+  $form['output_name'] = array(
     '#type' => 'select',
     '#title' => t('Output method'),
-    '#options' => galleryapi_get_output_names(),
+    '#options' => galleryapi_get_output_options(),
     '#required' => TRUE,
     '#default_value' => $preset['output_name'],
   );
-  $form['create_presets']['submit'] = array(
+  if (isset($preset['pid'])) {
+    $form['pid'] = array('#type' => 'value', '#value' => $preset['pid']);
+  }
+  $form['buttons']['submit'] = array(
     '#type' => 'submit',
-    '#value' => $preset['pid'] ? t('Save') : t('Create'),
+    '#value' => isset($preset['pid']) ? t('Save') : t('Create'),
   );
-  
+
   return $form;
 }
 
-function galleryapi_admin_preset_edit_submit($form, &$form_state) {
-  if (!$form_state['pid']) {
-    db_query("INSERT INTO {galleryapi_presets} (pid, name, input_name, output_name) VALUES (%d, '%s', '%s', '%s')", '', $form_state['values']['name'], $form_state['values']['input'], $form_state['values']['output']);
-    $pid = db_last_insert_id('galleryapi_presets', 'pid');    
-
-    // hook_galleryapi_methodapi (operation: preset insert)      
-    module_invoke_all('galleryapi_methodapi', 'preset insert', $pid, $form_state['value']);    
+function galleryapi_admin_preset_edit_validate($form, &$form_state) {
+  $pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : '';
+  // TODO: replace query with API call to get presets from code too.
+  $found = db_result(db_query("SELECT pid FROM {galleryapi_presets} WHERE name = '%s'", $form_state['values']['name']));
+  if ($found && $found != $pid) {
+    form_error($form['name'], t('Preset name already exists.'));
   }
-  else {
-    $pid = $form_state['pid'];
-    db_query("UPDATE {galleryapi_presets} SET name = '%s', input_name = '%s', output_name = '%s' WHERE pid = %d", $form_state['values']['name'], $form_state['values']['input'], $form_state['values']['output'], $pid);
-  
-    // hook_galleryapi_methodapi (operation: preset save)      
-    module_invoke_all('galleryapi_methodapi', 'preset save', $pid, $form_state['value']);
+}
+
+function galleryapi_admin_preset_edit_submit($form, &$form_state) {
+  $values = $form_state['values'];
+  $result = drupal_write_record('galleryapi_presets', $values, isset($values['pid']) ? 'pid' : NULL);
+  if ($result) {
+    if ($result == SAVED_NEW) {
+      // hook_galleryapi_methodapi (operation: preset insert)
+      module_invoke_all('galleryapi_methodapi', 'preset insert', $values['pid'], $values);
+    }
+    else {
+      // hook_galleryapi_methodapi (operation: preset save)
+      module_invoke_all('galleryapi_methodapi', 'preset save', $values['pid'], $values);
+    }
+    $form_state['redirect'] = 'admin/settings/galleryapi/'. $values['pid'] .'/configure';
   }
-  
-  $form_state['redirect'] = 'admin/settings/galleryapi/'. $pid .'/configure';
 }
 
 function galleryapi_admin_preset_configure($form_state, $preset) {
@@ -77,7 +102,7 @@ function galleryapi_admin_preset_configu
 
   $input_method = galleryapi_get_input($preset['input_name']);
   $output_method = galleryapi_get_output($preset['output_name']);
-  
+
   $form = array();
   $form['#tree'] = TRUE;
   $form['input'] = array(
@@ -90,9 +115,9 @@ function galleryapi_admin_preset_configu
   }
   $function = $input_method['module'] .'_galleryapi_'. $preset['input_name'] .'_form';
   if (function_exists($function)) {
-    $form['input']['settings']['entries'] = $function($form['input']['settings']['entries']);    
+    $form['input']['settings']['entries'] = $function($form['input']['settings']['entries']);
   }
-  
+
   $form['input']['settings']['entries']['slide_types'] = array();
   if (is_array($output_method['slide_types']) && is_array($input_method['formatters'])) {
     foreach ($output_method['slide_types'] as $slide_type) {
@@ -101,13 +126,13 @@ function galleryapi_admin_preset_configu
         '#title' => t('Select formatter for %type slide type', array('%type' => $slide_type)),
         '#options' => array('' => t('--Select formatter--'), -1 => t('Empty')) + $input_method['formatters'],
         '#default_value' => '',
-        '#required' => TRUE,      
+        '#required' => TRUE,
       );
     }
   }
-  
+
   _galleryapi_apply_settings($form['input']['settings']['entries'], $preset['input_data']);
-  
+
   $form['output'] = array(
    '#type' => 'fieldset',
    '#title' => t('Output method %output_name settings', array('%output_name' => $output_method['name'])),
@@ -116,19 +141,15 @@ function galleryapi_admin_preset_configu
   if ($output_method['admin_file']) {
     require_once drupal_get_path('module', $output_method['module']) .'/'. $output_method['admin_file'];
   }
-  $function = $output_method['module'] .'_galleryapi_'. $preset['output_name'] .'_form';  
+  $function = $output_method['module'] .'_galleryapi_'. $preset['output_name'] .'_form';
   if (function_exists($function)) {
     $form['output']['settings']['entries'] = $function();
     _galleryapi_apply_settings($form['output']['settings']['entries'], $preset['output_data']);
-  } 
+  }
   $form['save'] = array(
     '#type' => 'submit',
     '#value' => t('Save'),
   );
-  $form['delete'] = array(
-    '#type' => 'submit',
-    '#value' => t('Delete'),
-  );
   return $form;
 }
 
@@ -136,91 +157,48 @@ function galleryapi_admin_preset_configu
   switch ($form_state['clicked_button']['#parents'][0]) {
     case 'save':
       $input_data = $form_state['values']['input']['settings']['entries'];
-      $output_data = $form_state['values']['output']['settings']['entries']; 
+      $output_data = $form_state['values']['output']['settings']['entries'];
       db_query("UPDATE {galleryapi_presets} SET input_data = '%s', output_data = '%s' WHERE pid = %d",
       serialize($input_data), serialize($output_data), $form_state['pid']);
       drupal_set_message(t('The preset have been updated.'));
       $form_state['redirect'] = 'admin/settings/galleryapi';
-      
-      // hook_galleryapi_methodapi (operation: preset save)  		
+
+      // hook_galleryapi_methodapi (operation: preset save)
       module_invoke_all('galleryapi_methodapi', 'preset save', $form_state['pid'], $form_state['value']);
     break;
-    case 'delete':
-      db_query("DELETE FROM {galleryapi_presets} WHERE pid = %d", $form_state['pid']);
-      drupal_set_message(t('The preset have been deleted.'));
-      $form_state['redirect'] = 'admin/settings/galleryapi';
-      
-      // hook_galleryapi_methodapi (operation: preset delete)
-      module_invoke_all('galleryapi_methodapi', 'preset delete', $form_state['pid']);
-    break;
   }
+  // Rebuild Theme Registry
+  drupal_rebuild_theme_registry();
 }
 
 
 function galleryapi_presets_delete($form_state, $preset) {
-  $form_state['pid'] = $preset['pid'];
+  $form['preset'] = array('#type' => 'value', '#value' => $preset);
   return confirm_form($form,
-                      t('Are you sure you want to delete this preset?'),
-                      'admin/settings/galleryapi/', t('This action cannot be undone.'),
-                      t('Delete'), t('Cancel'));
+    t('Are you sure you want to delete preset %preset?', array('%preset' => $preset['name'])),
+    'admin/settings/galleryapi', t('This action cannot be undone.'),
+    t('Delete'), t('Cancel'));
 }
 
 function galleryapi_presets_delete_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
-    db_query("DELETE FROM {galleryapi_presets} WHERE pid = %d", $form_state['pid']);
-    drupal_set_message(t('The preset have been deleted.'));
-  }
-  $form_state['redirect'] = 'admin/settings/galleryapi';
-  return;
-}
-
-function theme_galleryapi_preset_list($presets = array()) {
-  $output = '<div class="gallery-table">';
-  
-  if (!empty($presets)) {
-    $inputs = galleryapi_get_input();
-    $outputs = galleryapi_get_output();
-    
-    $header = array(t('Preset'), t('Input method'), t('Output method'), t('Actions'));
-    $rows = array();
-    
-    foreach ($presets as $preset) {
-      $row = array();
-      $row[] = $preset['name'];
-      $row[] = $inputs[$preset['input_name']]['name'];
-      $row[] = $outputs[$preset['output_name']]['name'];
-      $links = array(
-        0 => array(
-          'href' => 'admin/settings/galleryapi/'. $preset['pid'] .'/edit',
-          'title' => 'edit',
-        ),
-        1 => array(
-          'href' => 'admin/settings/galleryapi/'. $preset['pid'] .'/configure',
-          'title' => 'configure',
-        ),
-        2 => array(
-          'href' => 'admin/settings/galleryapi/'. $preset['pid'] .'/delete',
-          'title' => 'delete',
-        ),
-      ); 
-      $row[] = theme('links', $links);
-      
-      $rows[] = $row;     
-    }
-    
-    $output .= theme('table', $header, $rows);    
+    $preset = $form_state['values']['preset'];
+    db_query("DELETE FROM {galleryapi_presets} WHERE pid = %d", $preset['pid']);
+    drupal_set_message(t('The preset %preset have been deleted.', array('%preset' => $preset['name'])));
+    // hook_galleryapi_methodapi (operation: preset delete)
+    module_invoke_all('galleryapi_methodapi', 'preset delete', $preset['pid'], $preset);
+    // Rebuild Theme Registry
+    drupal_rebuild_theme_registry();
+    $form_state['redirect'] = 'admin/settings/galleryapi';
   }
-  
-  $output .= '</div>';
-  return $output;
 }
 
-function galleryapi_get_input_names() { 
+function galleryapi_get_input_options() {
   $result = galleryapi_get_input();
   if ($result) {
     $options[''] = t('--Select input method--');
     foreach ( $result as $key => $method) {
-      $options[$key] = $method['name']; 
+      $options[$key] = $method['name'];
     }
   }
   else {
@@ -229,12 +207,12 @@ function galleryapi_get_input_names() { 
   return $options;
 }
 
-function galleryapi_get_output_names() {
+function galleryapi_get_output_options() {
   $result = galleryapi_get_output();
   if ($result) {
     $options[''] = t('--Select output method--');
-    foreach ( $result as $key => $method) {
-      $options[$key] = $method['name']; 
+    foreach ($result as $key => $method) {
+      $options[$key] = $method['name'];
     }
   }
   else {
@@ -254,4 +232,4 @@ function _galleryapi_apply_settings(&$fo
       }
     }
   }
-}
\ No newline at end of file
+}
