Code

Changed some js comments
[gosa.git] / include / class_ObjectListViewport.inc
index 568ea0477b707e157780f4b9eb6e5d48f96fcf96..7ff0e655f0cddf1043281a7e5b36c679f436aae9 100644 (file)
@@ -25,10 +25,13 @@ class ObjectListViewportException extends Exception {
  */
 class ObjectListViewport {
 
-  # DUMMY values ---->
-  private $headline= "|{16px}|{90%}Name|{64px}Actions|";
-  private $footer= "Statistics with no information currently";
-  # <--- DUMMY values.
+  /* Dummy here ----> */
+  private $headline;
+  private $footer;
+  private $entryFormat;
+  private $attributes= array('cn', '_icon', '_actions', 'dn');
+
+  /* <---- Dummy here */
 
   /*!
     \brief Container for objects
@@ -37,6 +40,11 @@ class ObjectListViewport {
    */
        private $objects;
 
+  /*!
+    \brief Switch to handle multiselect or not
+   */
+       private $multiselect;
+
 
   /*! \brief ObjectListViewport constructor
 
@@ -44,7 +52,15 @@ class ObjectListViewport {
 
     \param config Config section that is used to configure this ObjectListViewport
    */
-       public function __construct($config){
+       public function __construct($config, $multiselect= TRUE){
+
+       $this->multiselect= $multiselect;
+    /* Dummy here */
+    $cr= Registry::getInstance("ConfigManager");
+    $cr->setSection($config);
+    $this->headline= $this->parseHeadline($cr->getValue("headline"));
+    $this->footer= $cr->getValue("footer");
+    $this->entryFormat= $cr->getValue("entryFormat");
 
     /* Load and instanciate classes, extract filter, icons, view hooks, etc. */
     $this->objects= new ObjectList($config);
@@ -68,9 +84,14 @@ class ObjectListViewport {
       \return HTML rendered headline
         */
   private function renderHeadline(){
-    # Dummy implementation. Use pre-defined headline.
-    $buffer= $this->headline."\n";
-
+    $buffer ="<table class='ObjectListViewport_Header_Table'>\n";
+    $buffer.="<tr>\n";
+    foreach($this->headline as $key => $value){
+      $buffer .= "<td  style='".$value['style']."'>".$value['name']."</td>\n";
+    }
+    $buffer.="<td style='width:13px;'>&nbsp;</td>";
+    $buffer.="</tr>\n";
+    $buffer.="</table>\n";
     return $buffer;
   }
 
@@ -82,47 +103,205 @@ class ObjectListViewport {
       \return HTML rendered footer
         */
   private function renderFooter(){
-    # Dummy implementation. Use pre-defined footer.
-    $buffer= $this->footer;
-    return "|".$buffer."|\n";
+    $buffer ="<table class='ObjectListViewport_Footer_Table'>\n"; 
+    $buffer.="<tr>\n";
+    $buffer.= "<td class='ObjectListViewport_Footer_Cell' colspan='".count($this->headline)."'>".$this->footer."</td>\n";
+    $buffer.="</tr>\n";
+    $buffer.="</table>\n";
+    return $buffer;
   }
 
 
-       /*! \brief Renders entries from the ObjectList iterator into a string
+  private function getEntryIcon($entry,$alt = ""){
+    return("<img src='images/".$entry['_icon']."' alt='".$alt."' class='center'>");
+  }
 
-           Gets the entry descriptions from the ObjectList object and renders them.
 
+       /*! \brief Renders entries from the ObjectList iterator into a string
+           Gets the entry descriptions from the ObjectList object and renders them.
       \return HTML rendered list entries
         */
   private function renderEntry($entry){
 
-    # Dummy implenetation. It is interested in icon, cn and action
-    $buffer= "|".$entry['_icon']."|".$entry['cn']."|".$entry['_actions']."|";
+    /* Copy template */
+    $buffer= $this->entryFormat;
+
+    /* Replace set of attributes */
+    foreach ($this->attributes as $attribute){
+      if (!isset($entry[$attribute])){
+        throw new ObjectListViewportException(sprintf(_("Can't locate attribute '%s' to replace in entry!"), $attribute));
+      } else {
+
+        if(preg_match("/_icon/i",$attribute)){
+          $buffer= preg_replace('/\{'.$attribute.'\}/', $this->getEntryIcon($entry),$buffer); 
+        }else{
+          $buffer= preg_replace('/\{'.$attribute.'\}/', $entry[$attribute],$buffer);
+        }
+      }
+    }
+
+    /* Execute optional filters */
+    preg_match_all ( '/\{_filter\(([^)]+)\)\}/', $buffer, $matches, PREG_SET_ORDER);
+    foreach ($matches as $match){
+      $filterName= preg_replace('/,.+$/', '', $match[1]);
+      $filterParameter= preg_replace('/^[^,]+,/', '', $match[1]);
+      $buffer= preg_replace('/\{_filter\('.normalizePreg($match[1]).'\)\}/', $this->applyEntryFilter($filterName, $filterParameter), $buffer);
+    }
+
+    #TODO: Make $buffer a proper HTML table output
+
+    $tmp = split("\|",trim($buffer,"|"));  
+
+
+    $buffer="<tr>\n";
+    foreach($tmp as $key => $value){
+
+      if(1 || empty($this->headline[$key]['width']) || preg_match("/\%/",$this->headline[$key]['width'])){
+        $buffer .= "<td class='ObjectListViewport_Entry_Cell' style='".$this->headline[$key]['style']."'>".
+          "<div style='overflow:hidden;".$this->headline[$key]['style']."'>".
+            $value.
+          "</div>".
+          "</td>\n";
+      }else{
+        $buffer .= "<td class='ObjectListViewport_Entry_Cell' style='".$this->headline[$key]['style']."'>".
+          $value.
+          "</td>\n";
+      }
+    }
+    $buffer.="</tr>\n";
 
     return $buffer."\n";
   }
 
 
+       /*! \brief Applies filter to the given entry format string.
+
+           Instanciates the given ObjectListEntryFilter and calls the method.
+
+      \return rendered output
+      \sa ObjectListEntryFilter
+        */
+  private function applyEntryFilter($filterName, $string){
+    $className= "ObjectListEntryFilter_".$filterName;
+    $cl= new $className;
+    return $cl->filter("$string");
+  }
+
+
        /*! \brief Renders complete ObjectList into a string
 
       \return HTML rendered list
         */
   public function render() {
-    /* Generate fixed headline */
-    $buffer= $this->renderHeadline();
+
+    $header = $this->renderHeadline();
+    $footer = $this->renderFooter();
 
     /* Apply current filter */
-    $filterIterator = new ObjectListFilterIterator($this->objects->getIterator(), 'dummy');
-    foreach ($this->objects as $value){
-      $buffer.= $this->renderEntry($value);
+    $entries = "";
+    $objects= new ObjectListFilterIterator($this->objects->getIterator());
+    foreach ($objects as $value){
+      $entries .= $this->renderEntry($value);
     }
 
-    /* Generate footer */
-    $buffer.= $this->renderFooter();
+    
+
+    /* Generate fixed headline */
+    $buffer = "
+    <table class='ObjectListViewport' id='ObjectListViewport' cellspacing=o cellpadding=0>
+      <tr>
+        <td>
+              <table class='ObjectListViewport_Table' id='ObjectListViewport_Table' cellpadding=0 cellspacing=0 >
+                <tr>
+                  <td class='ObjectListViewport_TD_Header' id='ObjectListViewport_TD_Header'>
+                    ".$header."
+                  </td>
+                </tr>
+                <tr>
+                  <td class='ObjectListViewport_TD_Entries' id='ObjectListViewport_TD_Entries'>
+                    <div style='overflow:auto' id='ObjectListViewport_Entry_Cover'> 
+                      <table class='ObjectListViewport_Entry_Table' id='ObjectListViewport_Entry_Table'>
+                        ".$entries."
+                      </table> 
+                    </div>
+                  </td>
+                </tr>
+                <tr>
+                  <td class='ObjectListViewport_TD_Footer' id='ObjectListViewport_TD_Footer'>
+                    ".$footer."
+                  </td>
+                </tr>
+              </table>
+
+        </td>
+      </tr>
+    </table>
+";
 
     return ($buffer);
   }
 
+
+       /*! \brief Parses the given headline format string 
+
+      \return Array with cell properties (width, alignment,name)
+        */
+  private function parseHeadline($data)
+  {
+    /* Each cell definition is seperated by | 
+     *  split by and go through each definition
+     */
+    $tmp = split("\|",trim($data,"|"));  
+    $cell_formats = array();
+    foreach($tmp as $key => $data){
+
+      $s_width    = "";
+      $s_alignment= "";
+      $s_name     = preg_replace("/\{[^\}]*+\}/","",$data);
+      $s_style    = "";
+    
+      /* Parse format string and detect width & alignment */
+      if(preg_match("/\{.*\}/",$data)){
+        $s_format=  preg_replace("/^[^\{]*+\{([^\}]*).*$/","\\1",$data);
+    
+        /* Get aligment */
+        if(preg_match("/:/",$s_format)){
+          $s_al = preg_replace("/^[^:]*+:([a-z]*).*$/i","\\1",$s_format);
+
+          if(preg_match("/T/i",$s_al)){
+            $s_alignment.= "top-"  ;
+            $s_style.= "vertical-align: top;";
+          }
+          if(preg_match("/B/i",$s_al)){
+            $s_alignment.= "bottom-"  ;
+            $s_style.= "vertical-align: bottom;";
+          }
+          if(preg_match("/R/i",$s_al)){
+            $s_alignment.= "right"  ;
+            $s_style.= "text-align: right;";
+          }elseif(preg_match("/L/i",$s_al)){
+            $s_alignment.= "left"  ;
+            $s_style.= "text-align: left;";
+          }elseif(preg_match("/C/i",$s_al) || preg_match("/M/i",$s_al) ){
+            $s_alignment.= "center"  ;
+            $s_style.= "text-align: center;";
+          }
+        }
+
+        /* Get width */
+        $s_width = preg_replace("/^([^:]*).*$/","\\1",$s_format);
+        if(!empty($s_width)){
+          $s_style = "width: ".$s_width.";";
+        }
+        
+        $cell_formats[$key] = array("name" => $s_name, "width" => $s_width, "alignment" => $s_alignment,"style" => $s_style);
+      }
+    }
+    return($cell_formats);
+  }
+
+
+  
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: