Index: includes/display_edit.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/panels/includes/Attic/display_edit.inc,v
retrieving revision 1.1.2.55
diff -u -p -r1.1.2.55 display_edit.inc
--- includes/display_edit.inc	13 Jun 2008 22:34:00 -0000	1.1.2.55
+++ includes/display_edit.inc	14 Jun 2008 21:47:21 -0000
@@ -635,6 +635,9 @@ function panels_show_pane($display, $pan
     $block->title = '<em>' . t('Missing content type') . '</em>';
     $block->content = t('This pane\'s content type is either missing or has been deleted. This pane will not render.');
   }
+  elseif (function_exists($content_type['editor render callback'])) {
+    $block = $content_type['editor render callback']($display, $pane);
+  }
   else {
     $block = _panels_render_preview_pane_disabled($pane, $display->context);
   }
@@ -1158,8 +1161,15 @@ function panels_content_config_add_form_
 }
 
 function panels_content_config_edit_form_submit($form_values, $cache, $pane) {
-  $block = _panels_render_preview_pane_disabled($pane, $cache->display->context);
-
+  // If this content type defines its own 'editor render callback', we need to
+  // invoke that again, since we're not doing a full panels_show_pane().
+  $content_type = $cache->content_config[$pane->pid]['ct_data']['type'];
+  if (function_exists($content_type['editor render callback'])) {
+    $block = $content_type['editor render callback']($cache->display, $pane);
+  }
+  else {
+    $block = _panels_render_preview_pane_disabled($pane, $cache->display->context);
+  }
   $ajax_vars = new stdClass();
   $ajax_vars->type   = 'replace';
   $ajax_vars->output = theme('panels_pane_collapsible', $block, $cache->display);
Index: docs/sample_plugin_ct.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/panels/docs/Attic/sample_plugin_ct.inc,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 sample_plugin_ct.inc
--- docs/sample_plugin_ct.inc	3 Jun 2008 01:48:03 -0000	1.1.2.1
+++ docs/sample_plugin_ct.inc	14 Jun 2008 21:47:22 -0000
@@ -35,6 +35,7 @@ function panels_SAMPLE_CT_panels_content
     'add submit callback' => 'panels_admin_submit_SAMPLE_CT',
     'edit submit callback' => 'panels_admin_submit_SAMPLE_CT',
     'title callback' => 'panels_admin_title_SAMPLE_CT',
+    'editor render callback' => 'panels_admin_pane_render_SAMPLE_CT',
     'render last' => TRUE,
     'visibility control' => 'panels_admin_visibility_control_SAMPLE_CT',
     'visibility submit' => 'panels_admin_visibility_submit_SAMPLE_CT',
@@ -616,6 +617,32 @@ function panels_admin_title_SAMPLE_CT($c
 }
 @endcode
 
+@SSECplug{content_types,callbacks,editor-render-callback,Callback Property: 'editor render callback'}
+Callback function set by the @LAP{content_types,t-editor-render-callback,editor render callback} property in the plugin definition array.
+
+Returns object used to populate the content area of the pane in the display
+editor ONLY. 
+
+@param object $display
+ The full display object being edited.
+@param object $pane
+ The pane object being rendered for display editing.
+
+@return object
+ The object containing the data to use when rendering the pane. The two fields in the object that are used for rendering are @code $obj->title @endcode, which is used as the title on the collapsible fieldset, and @code $obj->content @endcode, which is the contents of fieldset (if any).
+
+@code
+function panels_admin_pane_render_SAMPLE_CT($display, $pane) {
+  // Pretend your content type stores a node id in the $configuration array
+  // and that you want the title of that node as the fieldset title, and the
+  // teaser for that node as the content.
+  $node = node_load($pane->configuration['nid']);
+  $block = new stdClass();
+  $block->title = check_plain($node->title);
+  $block->content = node_view($node, TRUE);
+  return $block;
+}
+@endcode
 
 <hr>
 
