This patch adds more controls (two types of combo boxes and slider) to our JTable demo and fixes the noticed deviations of they behavior from the Sun's GUI. There are still some differences remaining when trying to manipulate controls with the keyboard.

2006-05-23  Audrius Meskauskas  <[EMAIL PROTECTED]>

   * examples/gnu/classpath/examples/swing/TableDemo.java:
   (SliderCell): New inner class. (setCustomEditors,
   setInformativeHeaders): New fields. (createContent):
   Rewritten.
   * javax/swing/DefaultCellEditor.java
   (JComboBoxDelegate.shouldSelectCell): New method.
   * javax/swing/JTable.java (editCellAt): Call shouldSelectCell.
   * javax/swing/plaf/basic/BasicTableUI.java
   (MouseInputHandler.mouseClicked): Start editing on a single
   click if the cell editor is not a default cell editor.
Index: examples/gnu/classpath/examples/swing/TableDemo.java
===================================================================
RCS file: /sources/classpath/classpath/examples/gnu/classpath/examples/swing/TableDemo.java,v
retrieving revision 1.6
diff -u -r1.6 TableDemo.java
--- examples/gnu/classpath/examples/swing/TableDemo.java	18 Mar 2006 16:24:16 -0000	1.6
+++ examples/gnu/classpath/examples/swing/TableDemo.java	23 May 2006 18:02:18 -0000
@@ -39,19 +39,34 @@
 package gnu.classpath.examples.swing;
 
 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.text.DateFormat;
+import java.util.Date;
 
+import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
+import javax.swing.DefaultCellEditor;
 import javax.swing.Icon;
+import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
+import javax.swing.JScrollBar;
 import javax.swing.JScrollPane;
+import javax.swing.JSlider;
 import javax.swing.JTable;
+import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
+import javax.swing.border.Border;
 import javax.swing.plaf.metal.MetalIconFactory;
 import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
 
 /**
  * Displays the editable table. The first column consists of check boxes.
@@ -144,6 +159,77 @@
   }
 
   /**
+   * The scroll bar renderer.
+   */
+  class SliderCell
+      extends AbstractCellEditor
+      implements TableCellEditor, TableCellRenderer
+  {
+    /**
+     * The editor bar.
+     */
+    JSlider bar;
+    
+    /**
+     * The renderer bar.
+     */
+    JSlider rendererBar;
+    
+    /**
+     * The border around the bar, if required.
+     */
+    Border border = BorderFactory.createLineBorder(table.getGridColor());
+
+    SliderCell()
+    {
+      bar = new JSlider();
+      bar.setOrientation(JScrollBar.HORIZONTAL);
+      bar.setMinimum(0);
+      bar.setMaximum(rows);      
+      bar.setBorder(border);
+      
+      rendererBar = new JSlider();
+      rendererBar.setMinimum(0);
+      rendererBar.setMaximum(rows);
+      rendererBar.setEnabled(false);
+    }
+
+    /**
+     * Get the editor.
+     */
+    public Component getTableCellEditorComponent(JTable table, Object value,
+                                                 boolean isSelected, int row,
+                                                 int column)
+    {
+      if (value instanceof Integer)
+        bar.setValue(((Integer) value).intValue());
+      return bar;
+    }
+    
+    /**
+     * Get the renderer.
+     */
+    public Component getTableCellRendererComponent(JTable table, Object value,
+                                                   boolean isSelected,
+                                                   boolean hasFocus, int row,
+                                                   int column)
+    {
+      rendererBar.setValue(((Integer) value).intValue());
+      if (hasFocus)
+        rendererBar.setBorder(border);
+      else
+        rendererBar.setBorder(null);
+      return rendererBar;
+    }
+
+    public Object getCellEditorValue()
+    {
+      return new Integer(bar.getValue());
+    }
+
+  }  
+  
+  /**
    * The table being displayed.
    */
   JTable table = new JTable();
@@ -184,23 +270,32 @@
         MetalIconFactory.getTreeComputerIcon(),
         MetalIconFactory.getTreeHardDriveIcon(),
         MetalIconFactory.getTreeFolderIcon(),
-      }; 
+      };
+    
+    String [] sides = new String[]
+      {
+        "north", "south", "east", "west"                           
+      };
     
     for (int i = 0; i < values.length; i++)
       {
         values[i] = new Object[cols];
-        for (int j = 2; j < cols; j++)
+        for (int j = 3; j < cols; j++)
           {
             values[i][j] = "" + ((char) ('a' + j)) + i;
           }
         values [i][0] = i % 2 == 0? Boolean.TRUE : Boolean.FALSE;
-        values [i][1] = icons [ i % icons.length ]; 
+        values [i][1] = icons [ i % icons.length ];
+        values [i][2] = sides [ i % sides.length ];
+        values [i][4] = new Integer(i);
       }
         
     table.setModel(model);        
         
     // Make the columns with gradually increasing width:
     DefaultTableColumnModel cm = new DefaultTableColumnModel();
+    table.setColumnModel(cm);
+    
     for (int i = 0; i < cols; i++)
       {
         TableColumn column = new TableColumn(i);
@@ -215,8 +310,9 @@
             
         cm.addColumn(column);            
       }
-
-    table.setColumnModel(cm);
+    
+    setCustomEditors(sides);
+    setInformativeHeaders();
 
     // Create the table, place it into scroll pane and place
     // the pane into this frame.
@@ -229,6 +325,45 @@
   }
   
   /**
+   * Set the more informative column headers for specific columns.
+   */
+  void setInformativeHeaders()
+  {
+    TableColumnModel cm = table.getColumnModel();
+
+    cm.getColumn(0).setHeaderValue("check");
+    cm.getColumn(1).setHeaderValue("icon");
+    cm.getColumn(2).setHeaderValue("combo");
+    cm.getColumn(3).setHeaderValue("edit combo");
+    cm.getColumn(4).setHeaderValue("slider");
+  }
+  
+  /**
+   * Set the custom editors for combo boxes. This method also sets one
+   * custom renderer.
+   * 
+   * @param sides the array of the possible choices for the combo boxes.
+   */
+  void setCustomEditors(String[] sides)
+  {
+    TableColumnModel cm = table.getColumnModel();    
+    // Set the simple combo box editor for the third column:
+    JComboBox combo1 = new JComboBox(sides);
+    cm.getColumn(2).setCellEditor(new DefaultCellEditor(combo1));
+    
+    // Set the editable combo box for the forth column:
+    JComboBox combo2 = new JComboBox(sides);
+    combo2.setEditable(true);
+    cm.getColumn(3).setCellEditor(new DefaultCellEditor(combo2));
+    
+    SliderCell scrollView = new SliderCell();
+    cm.getColumn(4).setCellEditor(scrollView);
+    cm.getColumn(4).setCellRenderer(scrollView);    
+
+    table.setColumnModel(cm);
+  }
+  
+  /**
    * The executable method to display the editable table.
    * 
    * @param args
@@ -266,3 +401,4 @@
     };
   }
 }
+
Index: javax/swing/DefaultCellEditor.java
===================================================================
RCS file: /sources/classpath/classpath/javax/swing/DefaultCellEditor.java,v
retrieving revision 1.23
diff -u -r1.23 DefaultCellEditor.java
--- javax/swing/DefaultCellEditor.java	10 Mar 2006 16:42:28 -0000	1.23
+++ javax/swing/DefaultCellEditor.java	23 May 2006 18:02:41 -0000
@@ -313,7 +313,24 @@
     {
       JComboBox c = (JComboBox) editorComponent;
       return value = c.getSelectedItem();
-    }     
+    } 
+    
+    /**
+     * Returns true to indicate that the editing cell can be selected. If the
+     * check box is not editable, expands it. If it is editable, brings
+     * focus to the editor field.
+     * 
+     * @param event unused in default method
+     *
+     * @return true always
+     */
+    public boolean shouldSelectCell(EventObject event)
+    {
+      JComboBox c = (JComboBox) editorComponent;
+      if (!c.isEditable)
+        c.showPopup();
+      return true;
+    }    
   }
 
   /**
Index: javax/swing/JTable.java
===================================================================
RCS file: /sources/classpath/classpath/javax/swing/JTable.java,v
retrieving revision 1.108
diff -u -r1.108 JTable.java
--- javax/swing/JTable.java	23 May 2006 12:53:20 -0000	1.108
+++ javax/swing/JTable.java	23 May 2006 18:02:50 -0000
@@ -3905,7 +3905,9 @@
         moveToCellBeingEdited(editorComp);
         scrollRectToVisible(editorComp.getBounds());
         editorComp.requestFocusInWindow();
-        return true;
+        
+        // Deliver the should select event.
+        return editor.shouldSelectCell(null);        
       }
   }
 
Index: javax/swing/plaf/basic/BasicTableUI.java
===================================================================
RCS file: /sources/classpath/classpath/javax/swing/plaf/basic/BasicTableUI.java,v
retrieving revision 1.51
diff -u -r1.51 BasicTableUI.java
--- javax/swing/plaf/basic/BasicTableUI.java	16 May 2006 19:27:37 -0000	1.51
+++ javax/swing/plaf/basic/BasicTableUI.java	23 May 2006 18:02:55 -0000
@@ -228,8 +228,6 @@
               if (e.getClickCount() < ce.getClickCountToStart())
                 return;
             }
-          else if (e.getClickCount() < 2)
-            return;
           table.editCellAt(row, col);
         }
     }

Reply via email to