Axis--PSTable.php
Go to the documentation of this file.
00001 <?PHP 00002 00003 # 00004 # Axis--PSTable.php 00005 # A PHP Object for Adding a Table to a PostScript Document (PSDocument) 00006 # 00007 # Copyright 1999-2001 Axis Data 00008 # This code is free software that can be used or redistributed under the 00009 # terms of Version 2 of the GNU General Public License, as published by the 00010 # Free Software Foundation (http://www.fsf.org). 00011 # 00012 # Author: Edward Almasy (almasy@axisdata.com) 00013 # 00014 # Part of the AxisPHP library v1.2.4 00015 # For more information see http://www.axisdata.com/AxisPHP/ 00016 # 00017 00018 00019 class PSTable { 00020 00021 # ---- PUBLIC INTERFACE -------------------------------------------------- 00022 00023 # object constructor 00024 function PSTable(&$Document) 00025 { 00026 # save pointer to document we use for output 00027 $this->Doc = &$Document; 00028 } 00029 00030 # table parameter access functions 00031 function XOrigin($NewXOrigin = -1) { if ($NewXOrigin != -1) { $this->XOrigin = $NewXOrigin; } return (int)$this->XOrigin; } 00032 function YOrigin($NewYOrigin = -1) { if ($NewYOrigin != -1) { $this->YOrigin = $NewYOrigin; } return (int)$this->YOrigin; } 00033 function XSize($NewXSize = -1) { if ($NewXSize != -1) { $this->XSize = $NewXSize; $this->RecalcActualColumnWidths(); } return (int)$this->XSize; } 00034 function YSize($NewYSize = -1) { if ($NewYSize != -1) { $this->YSize = $NewYSize; $this->RecalcActualRowHeights(); } return (int)$this->YSize; } 00035 function NumCols($NewNumCols = -1) { if ($NewNumCols != -1) { $this->NumCols = $NewNumCols; $this->RecalcActualColumnWidths(); } return (int)$this->NumCols; } 00036 function NumRows($NewNumRows = -1) { if ($NewNumRows != -1) { $this->NumRows = $NewNumRows; $this->RecalcActualRowHeights(); } return (int)$this->NumRows; } 00037 function ShadeColumnHeadings($NewShadeColumnHeadings = -1) { if ($NewShadeColumnHeadings != -1) { $this->ShadeColumnHeadings = $NewShadeColumnHeadings; } return (int)$this->ShadeColumnHeadings; } 00038 00039 # return position of table cell on page 00040 function CellXPos($Col) { return $this->XOrigin + $this->ColumnStartPoints[$Col]; } 00041 function CellYPos($Row) { return $this->YOrigin - $this->RowStartPoints[$Row]; } 00042 00043 # set/get column/row width/height 00044 function ColWidth($Col, $Width = -1) 00045 { 00046 # if column width specified 00047 if ($Width >= 0) 00048 { 00049 # set requested column width 00050 $this->RequestedColumnWidths[$Col] = $Width; 00051 00052 # recalculate actual column widths 00053 $this->RecalcActualColumnWidths(); 00054 } 00055 00056 # return actual column width to caller 00057 return (int)$this->ColumnWidths[$Col]; 00058 } 00059 function RowHeight($Row, $Width = -1) 00060 { 00061 # if row width specified 00062 if ($Width >= 0) 00063 { 00064 # set requested row width 00065 $this->RequestedRowHeights[$Row] = $Width; 00066 00067 # recalculate actual row widths 00068 $this->RecalcActualRowHeights(); 00069 } 00070 00071 # return actual row width to caller 00072 return (int)$this->RowHeights[$Row]; 00073 } 00074 00075 function PrintTextInCell($Row, $Col, $TextToPrint) 00076 { 00077 # distance that text is printed from edge of cell 00078 $CellPadding = 3; 00079 00080 if ($this->Doc->TextAngle() == 90) 00081 { 00082 $this->Doc->PrintTextAt( 00083 ($this->CellXPos($Col + 1) - $CellPadding), 00084 ($this->CellYPos($Row) - $CellPadding), 00085 $TextToPrint); 00086 } 00087 else 00088 { 00089 $this->Doc->PrintTextAt( 00090 ($this->CellXPos($Col) + $CellPadding), 00091 ($this->CellYPos($Row) - $CellPadding), 00092 $TextToPrint); 00093 } 00094 } 00095 00096 # print table on document 00097 function PrintTable() 00098 { 00099 # write comment on what we're doing 00100 $this->Doc->PrintRaw(sprintf(" 00101 %% PSTable->Print() 00102 %% XOrigin=%3s YOrigin=%3s 00103 %% NumCols=%3s NumRows=%3s 00104 %% XSize=%3s YSize=%3s 00105 %% AdjXSize=%3s AdjYSize=%3s 00106 ", 00107 $this->XOrigin, $this->YOrigin, 00108 $this->NumCols, $this->NumRows, 00109 $this->XSize, $this->YSize, 00110 $this->AdjXSize,$this->AdjYSize)); 00111 00112 # move to start point 00113 $this->Doc->PrintRaw(sprintf(" 00114 %s %s moveto 00115 ", (int)$this->XOrigin, (int)$this->YOrigin)); 00116 00117 # start in positive direction (going right on page) 00118 $DirMult = 1; 00119 00120 # for each row 00121 for ($Index = 0; $Index <= $this->NumRows; $Index++) 00122 { 00123 # draw horizontal line and move to next row 00124 $this->Doc->PrintRaw(sprintf(" 00125 %s 0 rlineto 00126 0 %s rmoveto 00127 ", 00128 ($this->AdjXSize * $DirMult), 00129 (0 - $this->RowHeight($Index + 1)))); 00130 00131 # switch directions 00132 $DirMult = 0 - $DirMult; 00133 } 00134 00135 # move to start point 00136 $this->Doc->PrintRaw(sprintf(" 00137 %s %s moveto 00138 ", (int)$this->XOrigin, (int)$this->YOrigin)); 00139 00140 # start in negative direction (going down on page) 00141 $DirMult = -1; 00142 00143 # for each column 00144 for ($Index = 0; $Index <= $this->NumCols; $Index++) 00145 { 00146 # draw vertical line and move to next column 00147 $this->Doc->PrintRaw(sprintf(" 00148 0 %s rlineto 00149 %s 0 rmoveto 00150 ", 00151 ($this->AdjYSize * $DirMult), 00152 $this->ColWidth($Index + 1))); 00153 00154 # switch directions 00155 $DirMult = 0 - $DirMult; 00156 } 00157 00158 # shade column heading cells if requested 00159 if ($this->ShadeColumnHeadings == "TRUE") 00160 { 00161 $this->Doc->PrintRaw(sprintf(" 00162 0.90 setgray 00163 %% rectfill: X Y Width Height 00164 %d %d %d %d rectfill 00165 0.00 setgray 00166 ", 00167 $this->XOrigin, $this->CellYPos(2), 00168 $this->AdjXSize, $this->RowHeight(1))); 00169 } 00170 00171 # realize table 00172 $this->Doc->PrintRaw(" 00173 stroke 00174 "); 00175 } 00176 00177 00178 # ---- PRIVATE INTERFACE ------------------------------------------------- 00179 00180 # recalculate row heights and positions 00181 function RecalcActualRowHeights() 00182 { 00183 # total up requested height values 00184 $TotalHeight = 0; 00185 $NumSizedRows = 0; 00186 for ($Row = 1; $Row <= $this->NumRows; $Row++) 00187 { 00188 if ($this->RequestedRowHeights[$Row] > 0) 00189 { 00190 $TotalHeight += $this->RequestedRowHeights[$Row]; 00191 $NumSizedRows++; 00192 } 00193 } 00194 00195 # calculate size of remaining rows 00196 if ($this->NumRows == $NumSizedRows) 00197 { 00198 $HeightOfRemainingRows = 1; 00199 } 00200 else 00201 { 00202 $HeightOfRemainingRows = (int)(($this->YSize - $TotalHeight) 00203 / ($this->NumRows - $NumSizedRows)); 00204 } 00205 00206 # set actual row heights and row begin points 00207 $CurrentStartPoint = $this->YSize; 00208 $this->AdjYSize = 0; 00209 for ($Row = 1; $Row <= $this->NumRows; $Row++) 00210 { 00211 if ($this->RequestedRowHeights[$Row] > 0) 00212 { 00213 $this->RowHeights[$Row] = $this->RequestedRowHeights[$Row]; 00214 } 00215 else 00216 { 00217 $this->RowHeights[$Row] = $HeightOfRemainingRows; 00218 } 00219 00220 $CurrentStartPoint -= $this->RowHeights[$Row]; 00221 $this->RowStartPoints[$Row] = $this->AdjYSize; 00222 $this->AdjYSize += $this->RowHeights[$Row]; 00223 } 00224 } 00225 00226 # recalculate column widths and positions 00227 function RecalcActualColumnWidths() 00228 { 00229 # total up requested width values 00230 $TotalWidth = 0; 00231 $NumSizedColumns = 0; 00232 for ($Col = 1; $Col <= $this->NumCols; $Col++) 00233 { 00234 if ($this->RequestedColumnWidths[$Col] > 0) 00235 { 00236 $TotalWidth += $this->RequestedColumnWidths[$Col]; 00237 $NumSizedColumns++; 00238 } 00239 } 00240 00241 # calculate size of remaining columns 00242 $WidthOfRemainingColumns = (int)(($this->XSize - $TotalWidth) 00243 / ($this->NumCols - $NumSizedColumns)); 00244 00245 # set actual column widths and column begin points 00246 $CurrentStartPoint = 0; 00247 $this->AdjXSize = 0; 00248 for ($Col = 1; $Col <= $this->NumCols; $Col++) 00249 { 00250 if ($this->RequestedColumnWidths[$Col] > 0) 00251 { 00252 $this->ColumnWidths[$Col] = $this->RequestedColumnWidths[$Col]; 00253 } 00254 else 00255 { 00256 $this->ColumnWidths[$Col] = $WidthOfRemainingColumns; 00257 } 00258 00259 $this->ColumnStartPoints[$Col] = $CurrentStartPoint; 00260 $CurrentStartPoint += $this->ColumnWidths[$Col]; 00261 $this->AdjXSize += $this->ColumnWidths[$Col]; 00262 } 00263 00264 # save start point of one column beyond table so we'll have 00265 # it available for text positioning 00266 $this->ColumnStartPoints[$Col] = $CurrentStartPoint; 00267 } 00268 00269 # table size in points 00270 var $XSize = 300; 00271 var $YSize = 300; 00272 00273 # table size in points (adjusted to accomodate even row/column sizes) 00274 var $AdjXSize = 300; 00275 var $AdjYSize = 300; 00276 00277 # number of columns and rows 00278 var $NumCols = 3; 00279 var $NumRows = 3; 00280 00281 # requested column and row sizes 00282 var $RequestedColumnWidths; 00283 var $RequestedRowHeights; 00284 00285 # actual column and row sizes 00286 var $ColumnWidths; 00287 var $RowHeights; 00288 00289 # column and row start points 00290 var $ColumnStartPoints; 00291 var $RowStartPoints; 00292 00293 # table origin on page 00294 var $XOrigin = 100; 00295 var $YOrigin = 400; 00296 00297 # document to use for output 00298 var $Doc; 00299 00300 # whether to give column headings a grey background 00301 var $ShadeColumnHeadings = "FALSE"; 00302 } 00303 00304 00305 ?>