cellmap.cls.php

来自「国外很不错的一个开源OA系统Group-Office」· PHP 代码 · 共 696 行 · 第 1/2 页

PHP
696
字号
        $collapse = $this->_table->get_style()->border_collapse == "collapse";        // Recursively add the frames within tables, table-row-groups and table-rows    if ( $display == "table-row" ||         $display == "table" ||         in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) {      $start_row = $this->__row;      foreach ( $frame->get_children() as $child )         $this->add_frame( $child );      if ( $display == "table-row" )        $this->add_row();      $num_rows = $this->__row - $start_row - 1;      $key = $frame->get_id();      // Row groups always span across the entire table      $this->_frames[ $key ]["columns"] = range(0,max(0,$this->_num_cols-1));      $this->_frames[ $key ]["rows"] = range($start_row, max(0, $this->__row - 1));      $this->_frames[ $key ]["frame"] = $frame;      if ( $display != "table-row" && $collapse ) {        $bp = $style->get_border_properties();                // Resolve the borders        for ( $i = 0; $i < $num_rows+1; $i++) {          $this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]);          $this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]);        }        for ( $j = 0; $j < $this->_num_cols; $j++) {          $this->_resolve_border($start_row, $j, "horizontal", $bp["top"]);          $this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]);        }      }                  return;    }          // Determine where this cell is going    $colspan = $frame->get_node()->getAttribute("colspan");    $rowspan = $frame->get_node()->getAttribute("rowspan");        if ( !$colspan ) {      $colspan = 1;      $frame->get_node()->setAttribute("colspan",1);    }    if ( !$rowspan ) {      $rowspan = 1;      $frame->get_node()->setAttribute("rowspan",1);    }    $key = $frame->get_id();    $bp = $style->get_border_properties();            // Add the frame to the cellmap    $max_left = $max_right = 0;        // Rows:    for ( $i = 0; $i < $rowspan; $i++ ) {      $row = $this->__row + $i;      $this->_frames[ $key ]["rows"][] = $row;      for ( $j = 0; $j < $colspan; $j++)         $this->_cells[$row][$this->__col + $j] = $frame;      if ( $collapse ) {        // Resolve vertical borders        $max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"]));        $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"]));      }    }    $max_top = $max_bottom = 0;        // Columns:    for ( $j = 0; $j < $colspan; $j++ ) {      $col = $this->__col + $j;              $this->_frames[ $key ]["columns"][] = $col;      if ( $collapse ) {        // Resolve horizontal borders        $max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"]));        $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"]));      }    }        $this->_frames[ $key ]["frame"] = $frame;        // Handle seperated border model    if ( !$collapse ) {      list($h, $v) = $this->_table->get_style()->border_spacing;      // Border spacing is effectively a margin between cells      $v = $style->length_in_pt($v) / 2;      $h = $style->length_in_pt($h) / 2;      $style->margin = "$v $h";      // The additional 1/2 width gets added to the table proper          } else {      // Drop the frame's actual border      $style->border_left_width = $max_left / 2;      $style->border_right_width = $max_right / 2;      $style->border_top_width = $max_top / 2;      $style->border_bottom_width = $max_bottom / 2;      $style->margin = "none";    }    // Resolve the frame's width    list($frame_min, $frame_max) = $frame->get_min_max_width();        $width = $style->width;        if ( is_percent($width) ) {      $var = "percent";      $val = (float)rtrim($width, "% ") / $colspan;            } else if ( $width !== "auto" ) {      $var = "absolute";      $val = $style->length_in_pt($frame_min) / $colspan;    }    $min = 0;    $max = 0;    for ( $cs = 0; $cs < $colspan; $cs++ ) {      // Resolve the frame's width(s) with other cells      $col =& $this->get_column( $this->__col + $cs );      // Note: $var is either 'percent' or 'absolute'.  We compare the      // requested percentage or absolute values with the existing widths      // and adjust accordingly.      if ( isset($var) && $val > $col[$var] ) {        $col[$var] = $val;        $col["auto"] = false;      }      $min += $col["min-width"];      $max += $col["max-width"];    }            if ( $frame_min > $min ) {      // The frame needs more space.  Expand each sub-column      $inc = ($frame_min - $min) / $colspan;      for ($c = 0; $c < $colspan; $c++) {        $col =& $this->get_column($this->__col + $c);        $col["min-width"] += $inc;      }            }    if ( $frame_max > $max ) {      $inc = ($frame_max - $max) / $colspan;      for ($c = 0; $c < $colspan; $c++) {        $col =& $this->get_column($this->__col + $c);        $col["max-width"] += $inc;      }    }        $this->__col += $colspan;    if ( $this->__col > $this->_num_cols )      $this->_num_cols = $this->__col;      }  //........................................................................    function add_row() {    $this->__row++;    $this->_num_rows++;        // Find the next available column    $i = 0;    while ( isset($this->_cells[$this->__row][$i]) )      $i++;        $this->__col = $i;      }  //........................................................................  /**   * Remove a row from the cellmap.   *   * @param Frame   */  function remove_row(Frame $row) {    $key = $row->get_id();    if ( !isset($this->_frames[$key]) )      return;  // Presumably this row has alredy been removed        $this->_row = $this->_num_rows--;    $rows = $this->_frames[$key]["rows"];    $columns = $this->_frames[$key]["columns"];    // Remove all frames from this row    foreach ( $rows as $r ) {      foreach ( $columns as $c ) {        $frame = $this->_cells[$r][$c];        unset($this->_frames[ $frame->get_id() ]);        unset($this->_cells[$r][$c]);      }    }    unset($this->_frames[$key]);  }  /**   * Remove a row group from the cellmap.   *   * @param Frame $group  The group to remove   */  function remove_row_group(Frame $group) {    $key = $group->get_id();    if ( !isset($this->_frames[$key]) )      return;  // Presumably this row has alredy been removed    $iter = $group->get_first_child();    while ($iter) {      $this->remove_row($iter);      $iter = $iter->get_next_sibling();    }          unset($this->_frames[$key]);  }    /**   * Update a row group after rows have been removed   *   * @param Frame $group    The group to update   * @param Frame $last_row The last row in the row group   */  function update_row_group(Frame $group, Frame $last_row) {    $g_key = $group->get_id();    $r_key = $last_row->get_id();    $r_rows = $this->_frames[$r_key]["rows"];    $this->_frames[$g_key]["rows"] = range( $this->_frames[$g_key]["rows"][0], end($r_rows) );      }    //........................................................................    function assign_x_positions() {    // Pre-condition: widths must be resolved and assigned to columns and    // column[0]["x"] must be set.        $x = $this->_columns[0]["x"];    foreach ( array_keys($this->_columns) as $j ) {      $this->_columns[$j]["x"] = $x;      $x += $this->_columns[$j]["used-width"];    }  }  function assign_frame_heights() {    // Pre-condition: widths and heights of each column & row must be    // calcluated        foreach ( $this->_frames as $arr ) {      $frame = $arr["frame"];            $h = 0;      foreach( $arr["rows"] as $row ) {        if ( !isset($this->_rows[$row]) )          // The row has been removed because of a page split, so skip it.          continue;        $h += $this->_rows[$row]["height"];      }            if ( $frame instanceof Table_Cell_Frame_Decorator )        $frame->set_cell_height($h);      else         $frame->get_style()->height = $h;    }  }  //........................................................................  /**   * Re-adjust frame height if the table height is larger than its content   */  function set_frame_heights($table_height, $content_height) {       // Distribute the increased height proportionally amongst each row    foreach ( $this->_frames as $arr ) {      $frame = $arr["frame"];      $h = 0;      foreach ($arr["rows"] as $row ) {        if ( !isset($this->_rows[$row]) )          continue;        $h += $this->_rows[$row]["height"];      }           $new_height = ($h / $content_height) * $table_height;            if ( $frame instanceof Table_Cell_Frame_Decorator )        $frame->set_cell_height($new_height);      else        $frame->get_style()->height = $new_height;    }      }    //........................................................................  // Used for debugging:  function __toString() {    $str = "";    $str .= "Columns:<br/>";    $str .= pre_r($this->_columns, true);    $str .=  "Rows:<br/>";    $str .= pre_r($this->_rows, true);        $str .=  "Frames:<br/>";    $arr = array();    foreach ( $this->_frames as $key => $val )      $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]);                             $str .= pre_r($arr, true);    if ( php_sapi_name() == "cli" )      $str = strip_tags(str_replace(array("<br/>","<b>","</b>"),                                    array("\n",chr(27)."[01;33m", chr(27)."[0m"),                                    $str));    return $str;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?