Index: form_builder.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/form_builder/form_builder.module,v
retrieving revision 1.16
diff -u -p -r1.16 form_builder.module
--- form_builder.module	12 Jan 2011 04:00:19 -0000	1.16
+++ form_builder.module	19 Jan 2011 05:14:33 -0000
@@ -66,28 +66,20 @@ function form_builder_menu() {
  */
 function form_builder_theme() {
   return array(
-    'form_builder_preview' => array(
-      'arguments' => array('form' => NULL),
-      'file' => 'includes/form_builder.admin.inc',
-    ),
-    'form_builder_element_prefix' => array(
-      'arguments' => array('element' => NULL),
-      'file' => 'includes/form_builder.admin.inc',
-    ),
-    'form_builder_element_suffix' => array(
-      'arguments' => array('element' => NULL),
+    'form_builder_empty_fieldset' => array(
+      'variables' => array(),
       'file' => 'includes/form_builder.admin.inc',
     ),
-    'form_builder_empty_fieldset' => array(
-      'arguments' => array(),
+    'form_builder_field_palette' => array(
+      'variables' => array('fields' => NULL, 'groups' => NULL, 'form_type' => NULL, 'form_id' => NULL),
       'file' => 'includes/form_builder.admin.inc',
     ),
-    'form_builder_field_configure' => array(
-      'arguments' => array('form' => NULL),
+    'form_builder_element_wrapper' => array(
+      'render element' => 'element',
       'file' => 'includes/form_builder.admin.inc',
     ),
-    'form_builder_field_palette' => array(
-      'arguments' => array('fields' => NULL, 'groups' => NULL, 'form_type' => NULL, 'form_id' => NULL),
+    'form_builder_wrapper' => array(
+      'render element' => 'element',
       'file' => 'includes/form_builder.admin.inc',
     ),
   );
Index: includes/form_builder.admin.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/form_builder/includes/form_builder.admin.inc,v
retrieving revision 1.20
diff -u -p -r1.20 form_builder.admin.inc
--- includes/form_builder.admin.inc	12 Jan 2011 04:05:28 -0000	1.20
+++ includes/form_builder.admin.inc	19 Jan 2011 05:14:33 -0000
@@ -160,12 +160,7 @@ function form_builder_preview($f, &$form
 
   // Add a pre_render to the entire form itself.
   $form['#pre_render'][] = 'form_builder_pre_render_form';
-
-  // Save the original form theming so that we can call it later.
-  if (!empty($form['#theme'])) {
-    $form['#theme-original'] = $form['#theme'];
-  }
-  $form['#theme'] = 'form_builder_preview';
+  $form['#theme_wrappers'] = array('form_builder_wrapper');
 
   // Add required jQuery UI elements.
   $form['#attached']['library'][] = array('system', 'ui.draggable');
@@ -282,58 +277,53 @@ function form_builder_positions_submit(&
   form_builder_cache_save($form_type, $form_id, $preview_form);
 }
 
-function theme_form_builder_preview($vars) {
-  global $theme;
-
-  // Pick out the form structure.
-  $form = array_shift($vars);
-
-  // Check if the Form Builder block is enabled.
-  // Otherwise make our own columns.
-  $block_enabled = db_query("SELECT status FROM {block} WHERE module = 'form_builder' AND theme = :theme", array(':theme' => $theme))->fetchField();
+/**
+ * Adds a wrapper around the form_builder preview and optionally will add the
+ * field palette if it is not already available as a block.
+ */
+function theme_form_builder_wrapper($vars) {
+  $element = $vars['element'];
 
-  if ($block_enabled && ($theme == 'garland' || $theme == 'minnelli')) {
-    // @todo: move this to an #attached
-    drupal_add_css(drupal_get_path('module', 'form_builder') .'/form_builder.garland.css', 'theme');
-  }
+  // Open the wrapper.
+  $output = '<div id="form-builder-wrapper" class="' . ($element['#block_enabled'] ? 'no-palette' : 'with-palette') . '">';
 
-  $output = '';
-  $output .= '<div id="form-builder-wrapper" class="' . ($block_enabled ? 'no-palette' : 'with-palette') . '">';
-  if (!$block_enabled) {
-    $fields = form_builder_get_form_type($form['#form_builder']['form_type']);
+  // If we need to add the field palette add it here.
+  if (!$element['#block_enabled']) {
+    $fields = form_builder_get_form_type($element['#form_builder']['form_type']);
     $groups = module_invoke_all('form_builder_palette_groups');
     $output .= '<div id="form-builder-fields">';
     $output .= '<div class="block">';
-    $output .= theme('form_builder_field_palette', array('fields' => $fields, 'groups' => $groups, 'form_type' => $form['#form_builder']['form_type'], 'form_id' => $form['#form_builder']['form_id']));
+    $output .= theme('form_builder_field_palette', array('fields' => $fields, 'groups' => $groups, 'form_type' => $element['#form_builder']['form_type'], 'form_id' => $element['#form_builder']['form_id']));
     $output .= '</div>';
     $output .= '</div>';
   }
+
   $output .= '<div id="form-builder">';
-  $output .= '<h3>' . t('Form preview') . '</h3>';
+  if (isset($element['#title'])) {
+    $output .= '<h3>' . $element['#title'] . '</h3>';
+  }
+
+  // Add the contents of the form and close the wrappers.
+  $output .= $element['#children'];
+  $output .= '</div></div>';
 
-  // Reset the original form theming, but allow form_builder implementations to
-  // alter the form output.
-  $form['#theme'] = isset($form['#theme-original']) ? $form['#theme-original'] : NULL;
-
-  // @todo: we cannot render ourselves again, so ideally this whole function with the
-  // above code would be in theme_wrappers, but I could not make that execute.
-  $output .= drupal_render_children($form);
-  $output .= '</div>';
-  $output .= '</div>';
   return $output;
 }
 
-function theme_form_builder_element_prefix($vars) {
+/**
+ * Theme the wrapper around a form_builder element and add configure and remove
+ * links as appropriate.
+ */
+function theme_form_builder_element_wrapper($vars) {
   $element = $vars['element'];
 
   $removable = isset($element['#form_builder']['removable']) ? $element['#form_builder']['removable'] : TRUE;
   $configurable  = isset($element['#form_builder']['configurable']) ? $element['#form_builder']['configurable'] : TRUE;
 
-  $output = '';
-  $output .= '<div class="form-builder-wrapper">';
-  $output .= '<div class="form-builder-title-bar">';
+  $output = '<div class="form-builder-wrapper">';
+
   if ($removable || $configurable) {
-    $output .= '<span class="form-builder-links">';
+    $output .= '<div class="form-builder-title-bar"><span class="form-builder-links">';
     if ($removable) {
       $output .= l('<span class="remove">'. t('Remove') .'</span>', 'admin/build/form-builder/remove/' . $element['#form_builder']['form_type'] . '/' . $element['#form_builder']['form_id'] . '/' . $element['#form_builder']['element_id'], array('html' => TRUE, 'attributes' => array('class' => array('remove'), 'title' => t('Remove')), 'query' => drupal_get_destination()));
     }
@@ -343,24 +333,24 @@ function theme_form_builder_element_pref
     if ($configurable) {
       $output .= l('<span class="configure">'. t('Configure') .'</span>', 'admin/build/form-builder/configure/' . $element['#form_builder']['form_type'] . '/' . $element['#form_builder']['form_id'] . '/' . $element['#form_builder']['element_id'], array('html' => TRUE, 'attributes' => array('class' => array('configure'), 'title' => t('Configure')), 'query' => drupal_get_destination()));
     }
-    $output .= '</span>';
+    $output .= '</span></div>';
   }
-  $output .= '</div>';
-  $output .= '<div class="form-builder-element" id="form-builder-element-' . $element['#form_builder']['element_id'] . '">';
+
+  $output .= '<div class="form-builder-element form-builder-element-' . $element['#type'] . '" id="form-builder-element-' . $element['#form_builder']['element_id'] . '">';
   // TODO: Overlay image: good idea or bad idea? Prevents any interaction with
   // form elements in the preview.
   //$output .= theme('image', drupal_get_path('module', 'form_builder') .'/images/blank.gif', '', '', array('width' => '1', 'height' => '1', 'class' => 'form-builder-disable'));
-  return $output;
-}
+  $output .= $element['#children'];
+
+  $output .= '</div></div>';
 
-function theme_form_builder_element_suffix($vars) {
-  return '</div></div>';
+  return $output;
 }
 
 /**
  * Placeholder for empty fieldsets during drag and drop.
  */
-function theme_form_builder_empty_fieldset($vars = array()) {
+function theme_form_builder_empty_fieldset($vars) {
   $output = '';
   $output .= '<div class="form-builder-wrapper form-builder-empty-placeholder">';
   $output .= '<span>' . t('This fieldset is empty. Drag a form element into it.') .'</span>';
@@ -426,25 +416,25 @@ function theme_form_builder_field_palett
  * Take a form structure and add a prebuild function to every element.
  */
 function form_builder_pre_render($element) {
-  // Allow modules to make modifications to this element.
-  drupal_alter('form_builder_preview', $element, $element['#form_builder']['form_type'], $element['#form_builder']['form_id']);
-
-  $element['#prefix'] = isset($element['#prefix']) ? theme('form_builder_element_prefix', array('element' => $element)) . $element['#prefix'] : theme('form_builder_element_prefix', array('element' => $element));
-  $element['#suffix'] = isset($element['#suffix']) ? $element['#suffix'] . theme('form_builder_element_suffix', array('element' => $element)) : theme('form_builder_element_suffix', array('element' => $element));
+  $element['#theme_wrappers'][] = 'form_builder_element_wrapper';
 
   if ($element['#form_builder']['element_type'] == 'fieldset') {
-    $element['#attributes']['class'] = array(isset($element['#attributes']['class']) ? $element['#attributes']['class'] . ' form-builder-fieldset' : 'form-builder-fieldset');
+    $element['#attributes']['class'][] = 'form-builder-fieldset';
+    if (count(element_children($element)) == 0) {
+      $element['#children'] = theme('form_builder_empty_fieldset');
+    }
   }
 
-  if (isset($element['#type']) && $element['#type'] == 'fieldset' && count(element_children($element)) == 0) {
-    $element['#children'] = theme('form_builder_empty_fieldset');
-  }
+  // Allow modules to make modifications to this element.
+  drupal_alter('form_builder_preview', $element, $element['#form_builder']['form_type'], $element['#form_builder']['form_id']);
 
   return $element;
 }
 
 /**
- * Change the type of the entire form to "markup" before rendering.
+ * This changes the type to markup before rendering.  Also sets a default title
+ * and sets a variable to indicate to the theme wrapper that the field palette
+ * should be added.
  */
 function form_builder_pre_render_form($form) {
   // We can't have forms inside of forms, so change this entire form a markup.
@@ -455,6 +445,17 @@ function form_builder_pre_render_form($f
   unset($form['form_token']);
   unset($form['form_builder_preview']);
 
+  global $theme;
+  // Check if the Form Builder block is enabled.
+  // Otherwise make our own columns.
+  $form['#block_enabled'] = db_query("SELECT status FROM {block} WHERE module = 'form_builder' AND theme = :theme", array(':theme' => $theme))->fetchField();
+
+  if ($form['#block_enabled'] && ($theme == 'garland' || $theme == 'minnelli')) {
+    $form['#attached']['css'][] = drupal_get_path('module', 'form_builder') .'/form_builder.garland.css';
+  }
+
+  $form['#title'] = t('Form preview');
+
   return $form;
 }
 
@@ -542,16 +543,12 @@ function form_builder_field_configure($f
     '#weight' => 100,
   );
 
+  $form['#pre_render'][] = 'form_builder_pre_render_field_configure';
+
   return $form;
 }
 
-/**
- * Theme function for the display of field configuration.
- */
-function theme_form_builder_field_configure($vars) {
-  $form = array_shift($vars);
-
-  // Group the properties into separate fieldsets (converted to tabs later).
+function form_builder_pre_render_field_configure($form) {
   $groups = module_invoke_all('form_builder_property_groups', $form['#form_type']);
 
   foreach (element_children($form) as $key) {
@@ -583,7 +580,7 @@ function theme_form_builder_field_config
     }
   }
 
-  return drupal_render_children($form);
+  return $form;
 }
 
 function form_builder_field_configure_submit(&$form, &$form_state) {
@@ -696,17 +693,11 @@ function form_builder_field_render($form
   // Get only the element wanted and render it.
   $element = form_builder_get_element($form, $element_id);
 
-  $content = drupal_render($element);
-
-  $prefix = isset($element['#prefix']) ? $element['#prefix'] : '';
-  $suffix = isset($element['#suffix']) ? $element['#suffix'] : '';
-
   if ($wrapper) {
-    $prefix .= theme('form_builder_element_prefix', array('element' => $element));
-    $suffix .= theme('form_builder_element_suffix', array('element' => $element));
+    $element['#theme_wrappers'][] = 'form_builder_element_wrapper';
   }
 
-  return $suffix . $content . $suffix;
+  return drupal_render($element);
 }
 
 /**
