Hi there,

I fixed some more issues with JList and HORIZINTAL_WRAP and
VERTICAL_WRAP. It should now work mostly right and smooth. This
effectivly makes JFileChooser usable.


2006-01-05  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/plaf/basic/BasicListUI.java
        (getCellHeight): New helper method.
        (getCellBounds): Use new helper method for determining the cell
        height.
        (paint): Don't call list.indexToLocation() but instead call
        directly into the same UI method.
        (locationToIndex): Fixed calculation of # visible rows and
handling
        of cell heights.
        (indexToLocation): Fixed calculation of # visible rows and
handling
        of cell heights.

/Roman
Index: javax/swing/plaf/basic/BasicListUI.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicListUI.java,v
retrieving revision 1.48
diff -u -r1.48 BasicListUI.java
--- javax/swing/plaf/basic/BasicListUI.java	5 Jan 2006 15:48:38 -0000	1.48
+++ javax/swing/plaf/basic/BasicListUI.java	5 Jan 2006 22:52:15 -0000
@@ -721,13 +721,12 @@
     int maxIndex = Math.max(index1, index2);
     Point loc = indexToLocation(list, minIndex);
     Rectangle bounds = new Rectangle(loc.x, loc.y, cellWidth,
-                                     getRowHeight(minIndex));
-
+                                     getCellHeight(minIndex));
     for (int i = minIndex + 1; i <= maxIndex; i++)
       {
         Point hiLoc = indexToLocation(list, i);
         Rectangle hibounds = new Rectangle(hiLoc.x, hiLoc.y, cellWidth,
-                                       getRowHeight(i));
+                                           getCellHeight(i));
         bounds = bounds.union(hibounds);
       }
 
@@ -735,6 +734,29 @@
   }
 
   /**
+   * Calculates the maximum cell height.
+   *
+   * @param index the index of the cell
+   *
+   * @return the maximum cell height
+   */
+  private int getCellHeight(int index)
+  {
+    int height = cellHeight;
+    if (height <= 0)
+      {
+        if (list.getLayoutOrientation() == JList.VERTICAL)
+          height = getRowHeight(index);
+        else
+          {
+            for (int j = 0; j < cellHeights.length; j++)
+              height = Math.max(height, cellHeights[j]);
+          }
+      }
+    return height;
+  }
+
+  /**
    * Calculate the Y coordinate of the upper edge of a particular row,
    * considering the Y coordinate <code>0</code> to occur at the top of the
    * list.
@@ -1141,9 +1163,10 @@
     int lead = sel.getLeadSelectionIndex();
     Rectangle clip = g.getClipBounds();
 
-    int startIndex = list.locationToIndex(new Point(clip.x, clip.y));
-    int endIndex = list.locationToIndex(new Point(clip.x + clip.width,
-                                                  clip.y + clip.height));
+    int startIndex = locationToIndex(list, new Point(clip.x, clip.y));
+    int endIndex = locationToIndex(list, new Point(clip.x + clip.width,
+                                             clip.y + clip.height));
+    
     for (int row = startIndex; row <= endIndex; ++row)
       {
         Rectangle bounds = getCellBounds(list, row, row);
@@ -1174,71 +1197,27 @@
         break;
       case JList.HORIZONTAL_WRAP:
         // determine visible rows and cells per row
-        // FIXME: We really should not use getVisibleRowCount() here. Please
-        // refer to the (Sun) API docs of JList.setVisibleRowCount() for
-        // details.
-        int visibleRows = list.getVisibleRowCount();
+        int maxCellHeight = getCellHeight(0);
+        int visibleRows = list.getHeight() / maxCellHeight;
         int cellsPerRow = -1;
         int numberOfItems = list.getModel().getSize();
-        Dimension listDim = list.getSize();
-        if (visibleRows <= 0)
-          {
-            try
-              {
-                cellsPerRow = listDim.width / cellWidth;
-              }
-            catch (ArithmeticException ex)
-              {
-                cellsPerRow = 1;
-              }
-          }
-        else
-          {
-            cellsPerRow = numberOfItems / visibleRows + 1;
-          }
+        cellsPerRow = numberOfItems / visibleRows + 1;
 
         // determine index for the given location
         int cellsPerColumn = numberOfItems / cellsPerRow + 1;
         int gridX = Math.min(location.x / cellWidth, cellsPerRow - 1);
-        int gridY;
-        if (cellHeight > 0)
-          gridY = Math.min(location.y / cellHeight, cellsPerColumn);
-        else
-          {
-            int posY = 0;
-            for (gridY = 0; posY + cellHeights[gridY] < location.y;)
-              {
-                posY += cellHeights[gridY];
-                gridY++;
-              }
-          }
+        int gridY = Math.min(location.y / maxCellHeight, cellsPerColumn);
         index = gridX + gridY * cellsPerRow;
         break;
       case JList.VERTICAL_WRAP:
         // determine visible rows and cells per column
-        int visibleRows2 = list.getVisibleRowCount();
-        if (visibleRows2 <= 0)
-          {
-            Dimension listDim2 = list.getSize();
-            visibleRows2 = listDim2.height / cellHeight;
-          }
+        int maxCellHeight2 = getCellHeight(0);
+        int visibleRows2 = list.getHeight() / maxCellHeight2;
         int numberOfItems2 = list.getModel().getSize();
         int cellsPerRow2 = numberOfItems2 / visibleRows2 + 1;
 
         int gridX2 = Math.min(location.x / cellWidth, cellsPerRow2 - 1);
-        int gridY2;
-        if (cellHeight > 0)
-          gridY2 = Math.min(location.y / cellHeight, visibleRows2);
-        else
-          {
-            int posY = 0;
-            for (gridY2 = 0; gridY2 <= cellHeights.length
-                             && posY + cellHeights[gridY2] < location.y;)
-              {
-                posY += cellHeights[gridY2];
-                gridY2++;
-              }
-          }
+        int gridY2 = Math.min(location.y / maxCellHeight2, visibleRows2);
         index = gridY2 + gridX2 * visibleRows2;
         break;
       }
@@ -1256,59 +1235,31 @@
         break;
       case JList.HORIZONTAL_WRAP:
         // determine visible rows and cells per row
-        // FIXME: We really should not use getVisibleRowCount() here. Please
-        // refer to the (Sun) API docs of JList.setVisibleRowCount() for
-        // details.
-        int visibleRows = list.getVisibleRowCount();
+        int maxCellHeight = getCellHeight(0);
+        int visibleRows = list.getHeight() / maxCellHeight;
         int numberOfCellsPerRow = -1;
-        if (visibleRows <= 0)
-          {
-            Dimension listDim = list.getSize();
-            numberOfCellsPerRow = Math.max(listDim.width / cellWidth, 1);
-          }
-        else
-          {
-            int numberOfItems = list.getModel().getSize();
-            numberOfCellsPerRow = numberOfItems / visibleRows + 1;
-          }
+        int numberOfItems = list.getModel().getSize();
+        numberOfCellsPerRow = numberOfItems / visibleRows + 1;
+
         // compute coordinates inside the grid
         int gridX = index % numberOfCellsPerRow;
         int gridY = index / numberOfCellsPerRow;
         int locX = gridX * cellWidth;
         int locY;
-        if (cellHeight > 0)
-          locY = gridY * cellHeight;
-        else
-          {
-            locY = 0;
-            for (int y = 0; y < gridY; y++)
-              locY += cellHeights[gridY];
-          }
+        locY = gridY * maxCellHeight;
         loc = new Point(locX, locY);
         break;
       case JList.VERTICAL_WRAP:
         // determine visible rows and cells per column
-        int visibleRows2 = list.getVisibleRowCount();
-        if (visibleRows2 <= 0)
-          {
-            Dimension listDim2 = list.getSize();
-            visibleRows2 = listDim2.height / cellHeight;
-          }
+        int maxCellHeight2 = getCellHeight(0);
+        int visibleRows2 = list.getHeight() / maxCellHeight2;
         // compute coordinates inside the grid
         if (visibleRows2 > 0)
           {
             int gridY2 = index % visibleRows2;
             int gridX2 = index / visibleRows2;
             int locX2 = gridX2 * cellWidth;
-            int locY2;
-            if (cellHeight > 0)
-              locY2 = gridY2 * cellHeight;
-            else
-              {
-                locY2 = 0;
-                for (int y = 0; gridY2 < cellHeights.length && y < gridY2; y++)
-                  locY2 += cellHeights[gridY2];
-              }
+            int locY2 = gridY2 * maxCellHeight2;
             loc = new Point(locX2, locY2);
           }
         else
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to