panels pane cloning, duplicating, etc

  1. /**
  2.  * Forms the basis of a panel display
  3.  *
  4.  * @ingroup mainapi
  5.  */
  6. class panels_display {
  7.   var $args = array();
  8.   var $content = array();
  9.   var $panels = array();
  10.   var $incoming_content = NULL;
  11.   var $css_id = NULL;
  12.   var $context = array();
  13.  
  14.   function add_pane($pane, $location = FALSE) {
  15.     $pane->pid = $this->next_new_pid();
  16.     if (!$location || !isset($this->panels[$location])) {
  17.       foreach ($this->panels as $panel_name => $panel) {
  18.         if (array_key_exists($pid, $panel)) {
  19.           $this->panels[$panel_name][] = $pid;
  20.         }
  21.       }
  22.     }
  23.     else {
  24.       $this->panels[$location][] = $pane->pid;
  25.     }
  26.   }
  27.  
  28.   function duplicate_pane($pid, $location = FALSE) {
  29.     $pane = $this->clone_pane($pid);
  30.     $this->add_pane($pid, $location);
  31.   }
  32.  
  33.   function clone_pane($pid) {
  34.     $pane = drupal_clone($this->content[$pid]);
  35.     foreach (array_keys($this->content) as $pidcheck)
  36.     unset($pane->position); // necessary?
  37.     return $pane;
  38.   }
  39.  
  40.   function next_new_pid() {
  41.     // necessary if/until we use this method and ONLY this method for adding temporary pids.
  42.     // then we can do it with a nice static var.
  43.     foreach (array_keys($this->content) as $pid) {
  44.       if (!is_numeric($pid)) {
  45.         $id[] = substr($pid, 4);
  46.       }
  47.     }
  48.     return ++end($id);
  49.   }
  50. }
  51.  
  52. function panels_export_pane_across_displays($source_display, &$target_display, $pid, $location = FALSE) {
  53.   $pane = $source_display->clone_pane($pid);
  54.   $target_display->add_pane($pane, $location);
  55. }