KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > calipso > reportgenerator > userinterface > RowHeaderTableUI


1 package com.calipso.reportgenerator.userinterface;
2
3 import com.calipso.reportgenerator.common.DimensionValueNode;
4
5 import javax.swing.*;
6 import java.awt.*;
7 import java.util.Vector JavaDoc;
8 import java.util.Iterator JavaDoc;
9
10 /**
11  * Se encarga de dibujar las tablas con encabezados agrupados con las particularidades de la tabla de los encabezados
12  * de filas.
13  */

14
15 public class RowHeaderTableUI extends HeaderTableUI{
16
17   //Margen estimado de los ROWS
18
private static final double ESTIMATED_MARGIN = 0.01;
19   private static final int ROWS_ERROR_MARGIN = 4;
20
21   /**
22    * Retorna la cantidad de filas visibles de la tabla
23    * @return
24    */

25   protected int getVisibleCellCount() {
26     return (table.getParent().getParent().getHeight()/table.getRowHeight()) + ROWS_ERROR_MARGIN;
27   }
28
29   /**
30    * retorna la fila a partir de la cual se debe comenzar el dibujo
31    * @return fila donde comienza a pintar la tabla
32    */

33   protected int getFromCell(){
34     int result = ((JScrollPane)table.getParent().getParent()).getVerticalScrollBar().getValue();
35     return (int)Math.floor(result / (table.getRowHeight() + ESTIMATED_MARGIN)); //table.getRowMargin() no sirve porque devuelve 1, pero realmente es menor
36
}
37
38   /**
39    * retorna la fila hasta la cual se debe realizar el dibujo
40    * @return fila hasta donde se debe pintar la tabla
41    */

42   protected int getToCell() {
43     int from = ((JScrollPane)table.getParent().getParent()).getVerticalScrollBar().getValue();
44     from = (int)Math.floor(from/table.getRowHeight());
45     int to = from + getVisibleCellCount();
46     if((getModel().getRowCount() - to) <= 0){
47       to = getModel().getRowCount();
48     }else{
49       if(getModel().getDimensionCount() == 1){
50         return to;
51       }else{
52         int rows = to;
53         to = getLastRowForGroup(from);
54         while(to < rows){
55           to = getLastRowForGroup(to + 1);
56         }
57       }
58     }
59     return ++to;
60   }
61
62   /**
63    * Retorna la ultima fila del grupo (es decir, completa el modelo hasta la
64    * primer dimension que este en row)
65    * @param from: la fila inicial del dibujo
66    * @return ultima fila del grupo
67    */

68   private int getLastRowForGroup(int from) {
69     DimensionValueNode node = getModel().getDimensionValueNode();
70     if(!node.getSubNodesList().isEmpty()){
71       if(node.getDimensionCount()==1){
72         //Si solo hay una metrica
73
return from + getVisibleCellCount();
74       }else{
75         Vector JavaDoc endings = getEndingsVector();
76         int i=0;
77         while(i<endings.size() && ((Integer JavaDoc)endings.elementAt(i)).intValue() < from){
78           i++;
79         }
80         return ((Integer JavaDoc)endings.elementAt(i)).intValue();
81       }
82 /* if(getModel().getWithTotals()){
83         return getLastRowFromTotals(from, node);
84       }else{
85         return doGetLastRowForGroup(from, node);
86       } */

87     }else{
88       return from + getVisibleCellCount();
89     }
90   }
91
92
93
94
95   /**
96    * Inicia la recorrida del arbol de grupos para pintar cada nodo y si no hay atributos que agrupen por fila
97    * incluye el encabezado del total general
98    * @param g
99    */

100   protected void paintCells(Graphics g) {
101     super.paintCells(g);
102     if (getModel().getDimensionCount() == 0){
103       DimensionValueNode root = getModel().getDimensionValueNode();
104       int[] cell = new int[] {0, 0};
105       Rectangle rect = table.getCellRect(cell[0], cell[0], true);
106       paintRectangle(rect, g, getGroupFooterCaption(root), false, false);
107     }
108   }
109
110   /**
111    * Calcula las filas donde terminan los grupos y llena un vector con los resultados
112    * @param endings
113    * @param withTotals
114    * @param node
115    */

116   protected void fillEndingCellForGroups(Vector JavaDoc endings,boolean withTotals, DimensionValueNode node){
117     if(node.getSubNodesList().isEmpty() || node.getCollapsed()){
118       iterations++;
119       if(node.getCollapsed()){
120         endings.add(new Integer JavaDoc(iterations));
121       }
122       return;
123     }
124     Iterator JavaDoc iterator = node.getSubNodesList().iterator();
125     while (iterator.hasNext()) {
126       DimensionValueNode current = (DimensionValueNode) iterator.next();
127       fillEndingCellForGroups(endings, withTotals, current);
128     }
129     if(withTotals){
130       iterations++;
131       if(node.getDimesionIndex() == 0){
132         endings.add(new Integer JavaDoc(iterations));
133       }
134     }else{
135       if(!endings.isEmpty()){
136         if(node.getDimesionIndex() == 0){
137           if(((Integer JavaDoc)endings.lastElement()).intValue() != iterations){
138             endings.add(new Integer JavaDoc(iterations));
139           }
140         }
141       }else if(node.getDimesionIndex() == 0){
142         endings.add(new Integer JavaDoc(iterations));
143       }
144     }
145   }
146
147   /**
148    * Pinta la celda (o grupo de celdas) que representan a un nodo. Tanto el que representa al grupo como el total (si es
149    * necesario). Pinta solo las celdas que se encuentren entre los parametros from y to.
150    * @param node
151    * @param g
152    * @param rowIndexes
153    * @param rowSizes
154    * @param from Número de celda inicial
155    * @param to Número de celda final
156    */

157   protected void doPaintNode(DimensionValueNode node, Graphics g, int[] rowIndexes, int[] rowSizes, int from, int to) {
158     Rectangle rect = null;
159     int nodeDimIndex = node.getDimesionIndex();
160     int dimCount = getModel().getDimensionCount();
161     boolean isLastDim = nodeDimIndex == dimCount - 1;
162     if (isLastDim) {
163       for (int i = 0; i < dimCount - 1; i++) {
164         rowSizes[i]++;
165       }
166     }
167     if (getModel().getWithTotals() && !isLastDim) {
168       if (node.getCollapsed()) {
169         for (int i = 0; i <= nodeDimIndex; i++) {
170           rowSizes[i]++;
171         }
172         for (int i = nodeDimIndex + 1; i < dimCount; i++) {
173           rowIndexes[i]++;
174         }
175         count++;
176       }
177       else {
178         int index = rowIndexes[nodeDimIndex + 1];
179         rect = getTotalRectangleFromNode(node, index);
180         getAllSubNodes().put(new Integer JavaDoc(index), node);
181         if ((count >= from) && (count <= to)){
182           paintRectangle(rect, g, getGroupFooterCaption(node), false, false);
183         }
184         count++;
185         for (int i = 0; i <= nodeDimIndex; i++) {
186           rowSizes[i]++;
187         }
188         for (int i = nodeDimIndex + 1; i < dimCount; i++) {
189           rowIndexes[i]++;
190         }
191       }
192     }
193     if (nodeDimIndex >= 0) {
194       int size = Math.max(rowSizes[nodeDimIndex], 1);
195       int index = rowIndexes[nodeDimIndex];
196       rect = getRectangleFromNode(node, index, size);
197       if ((count >= from) && (count <= to)){
198         paintRectangle(rect, g, node.getValue(), getNodeIsCollapsable(node), node.getCollapsed());
199       }
200       if (isLastDim) {
201         getAllSubNodes().put(new Integer JavaDoc(index), node);
202         count++;
203       }
204       rowIndexes[nodeDimIndex] += size;
205     }
206   }
207
208 }
209
Popular Tags