home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / plaf / basic / BasicTableUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  14.0 KB  |  513 lines

  1. package com.sun.java.swing.plaf.basic;
  2.  
  3. import com.sun.java.swing.Action;
  4. import com.sun.java.swing.CellRendererPane;
  5. import com.sun.java.swing.JComponent;
  6. import com.sun.java.swing.JScrollPane;
  7. import com.sun.java.swing.JTable;
  8. import com.sun.java.swing.JTextField;
  9. import com.sun.java.swing.JViewport;
  10. import com.sun.java.swing.KeyStroke;
  11. import com.sun.java.swing.ListSelectionModel;
  12. import com.sun.java.swing.LookAndFeel;
  13. import com.sun.java.swing.SwingUtilities;
  14. import com.sun.java.swing.UIManager;
  15. import com.sun.java.swing.plaf.ComponentUI;
  16. import com.sun.java.swing.plaf.TableUI;
  17. import com.sun.java.swing.plaf.UIResource;
  18. import com.sun.java.swing.table.JTableHeader;
  19. import com.sun.java.swing.table.TableCellEditor;
  20. import com.sun.java.swing.table.TableCellRenderer;
  21. import com.sun.java.swing.table.TableColumn;
  22. import com.sun.java.swing.text.JTextComponent;
  23. import com.sun.java.swing.text.Keymap;
  24. import java.awt.Color;
  25. import java.awt.Component;
  26. import java.awt.Container;
  27. import java.awt.Dimension;
  28. import java.awt.Graphics;
  29. import java.awt.Point;
  30. import java.awt.Rectangle;
  31. import java.awt.event.ActionEvent;
  32. import java.awt.event.FocusEvent;
  33. import java.awt.event.FocusListener;
  34. import java.awt.event.InputEvent;
  35. import java.awt.event.KeyEvent;
  36. import java.awt.event.KeyListener;
  37. import java.awt.event.MouseEvent;
  38. import java.awt.event.MouseListener;
  39. import java.awt.event.MouseMotionListener;
  40. import java.io.Serializable;
  41. import java.util.Enumeration;
  42.  
  43. public class BasicTableUI extends TableUI implements MouseListener, MouseMotionListener, FocusListener, Serializable {
  44.    protected JTable table;
  45.    private boolean phantomMousePressed = false;
  46.    private KeyListener tableKeyListener;
  47.    protected transient Component dispatchComponent;
  48.    protected CellRendererPane rendererPane;
  49.  
  50.    private void registerKeyboardActions() {
  51.       this.table.registerKeyboardAction(new 1(this), KeyStroke.getKeyStroke(39, 0), 0);
  52.       this.table.registerKeyboardAction(new 2(this), KeyStroke.getKeyStroke(37, 0), 0);
  53.       this.table.registerKeyboardAction(new 3(this), KeyStroke.getKeyStroke(38, 0), 0);
  54.       this.table.registerKeyboardAction(new 4(this), KeyStroke.getKeyStroke(40, 0), 0);
  55.       this.tableKeyListener = new TableKeyListener(this);
  56.       this.table.addKeyListener(this.tableKeyListener);
  57.    }
  58.  
  59.    private void unregisterKeyboardActions() {
  60.       this.table.unregisterKeyboardAction(KeyStroke.getKeyStroke(38, 0));
  61.       this.table.unregisterKeyboardAction(KeyStroke.getKeyStroke(40, 0));
  62.       this.table.unregisterKeyboardAction(KeyStroke.getKeyStroke(39, 0));
  63.       this.table.unregisterKeyboardAction(KeyStroke.getKeyStroke(37, 0));
  64.       this.table.removeKeyListener(this.tableKeyListener);
  65.    }
  66.  
  67.    protected void moveAnchor(int var1, int var2) {
  68.       if (this.table.isEditing()) {
  69.          TableCellEditor var3 = this.table.getCellEditor();
  70.          if (var3 != null) {
  71.             boolean var4 = var3.stopCellEditing();
  72.             if (!var4) {
  73.                return;
  74.             }
  75.          }
  76.       }
  77.  
  78.       this.table.clearSelection();
  79.       this.updateSelection(var1, var2, false, true);
  80.    }
  81.  
  82.    private void dispatchKeyboardEvent(KeyEvent var1) {
  83.       int var2 = this.table.getSelectedRow();
  84.       int var3 = this.table.getSelectedColumn();
  85.       if (var2 != -1 && var3 != -1 && !this.table.isEditing()) {
  86.          boolean var4 = this.table.editCellAt(var2, var3);
  87.          this.table.requestFocus();
  88.          if (!var4) {
  89.             return;
  90.          }
  91.       }
  92.  
  93.       Component var11 = this.table.getEditorComponent();
  94.       if (this.table.isEditing() && var11 != null) {
  95.          char var5 = var1.getKeyChar();
  96.          if (var11 instanceof JTextField) {
  97.             JTextField var6 = (JTextField)var11;
  98.             Keymap var7 = ((JTextComponent)var6).getKeymap();
  99.             KeyStroke var8 = KeyStroke.getKeyStroke(var5, 0);
  100.             Action var9 = var7.getAction(var8);
  101.             if (var9 == null) {
  102.                var9 = var7.getDefaultAction();
  103.             }
  104.  
  105.             if (var9 != null) {
  106.                ActionEvent var10 = new ActionEvent(var6, 1001, String.valueOf(var5));
  107.                var9.actionPerformed(var10);
  108.             }
  109.          }
  110.       }
  111.  
  112.    }
  113.  
  114.    private void configureTable() {
  115.       LookAndFeel.installColorsAndFont(this.table, "Table.background", "Table.foreground", "Table.font");
  116.       Color var1 = this.table.getSelectionBackground();
  117.       if (var1 == null || var1 instanceof UIResource) {
  118.          this.table.setSelectionBackground(UIManager.getColor("Table.selectionBackground"));
  119.       }
  120.  
  121.       Color var2 = this.table.getSelectionForeground();
  122.       if (var2 == null || var2 instanceof UIResource) {
  123.          this.table.setSelectionForeground(UIManager.getColor("Table.selectionForeground"));
  124.       }
  125.  
  126.       Color var3 = this.table.getGridColor();
  127.       if (var3 == null || var3 instanceof UIResource) {
  128.          this.table.setGridColor(UIManager.getColor("Table.gridColor"));
  129.       }
  130.  
  131.       Container var4 = this.table.getParent();
  132.       if (var4 != null) {
  133.          var4 = ((Component)var4).getParent();
  134.          if (var4 != null && var4 instanceof JScrollPane) {
  135.             LookAndFeel.installBorder((JScrollPane)var4, "Table.scrollPaneBorder");
  136.          }
  137.       }
  138.  
  139.    }
  140.  
  141.    public static ComponentUI createUI(JComponent var0) {
  142.       return new BasicTableUI();
  143.    }
  144.  
  145.    public void installUI(JComponent var1) {
  146.       this.table = (JTable)var1;
  147.       ((Component)var1).addMouseListener(this);
  148.       ((Component)var1).addMouseMotionListener(this);
  149.       ((Component)var1).addFocusListener(this);
  150.       this.rendererPane = new CellRendererPane();
  151.       this.table.add(this.rendererPane);
  152.       this.configureTable();
  153.       this.registerKeyboardActions();
  154.    }
  155.  
  156.    public void uninstallUI(JComponent var1) {
  157.       this.table.remove(this.rendererPane);
  158.       ((Component)var1).removeMouseListener(this);
  159.       ((Component)var1).removeMouseMotionListener(this);
  160.       ((Component)var1).removeFocusListener(this);
  161.       this.unregisterKeyboardActions();
  162.       this.rendererPane = null;
  163.       this.table = null;
  164.    }
  165.  
  166.    private void repaintAnchorCell() {
  167.       int var1 = this.table.getSelectedRow();
  168.       int var2 = this.table.getSelectedColumn();
  169.       Rectangle var3 = this.table.getCellRect(var1, var2, false);
  170.       this.table.repaint(var3);
  171.    }
  172.  
  173.    public void focusGained(FocusEvent var1) {
  174.       if (this.table.getSelectedColumn() == -1) {
  175.          this.table.setColumnSelectionInterval(0, 0);
  176.       }
  177.  
  178.       if (this.table.getSelectedRow() == -1) {
  179.          this.table.setRowSelectionInterval(0, 0);
  180.       }
  181.  
  182.       this.repaintAnchorCell();
  183.    }
  184.  
  185.    public void focusLost(FocusEvent var1) {
  186.       this.repaintAnchorCell();
  187.    }
  188.  
  189.    public void mouseMoved(MouseEvent var1) {
  190.       if (this.dispatchComponent != null) {
  191.          this.dispatchComponent = null;
  192.       }
  193.  
  194.    }
  195.  
  196.    public void mouseClicked(MouseEvent var1) {
  197.    }
  198.  
  199.    public void mouseEntered(MouseEvent var1) {
  200.       if (this.dispatchComponent != null) {
  201.          this.dispatchComponent = null;
  202.       }
  203.  
  204.    }
  205.  
  206.    public void mouseExited(MouseEvent var1) {
  207.       if (this.dispatchComponent != null) {
  208.          this.dispatchComponent = null;
  209.       }
  210.  
  211.    }
  212.  
  213.    public void mousePressed(MouseEvent var1) {
  214.       if (this.phantomMousePressed) {
  215.          System.err.println("BasicTableUI recieved two consecutive mousePressed events.");
  216.       } else {
  217.          this.phantomMousePressed = true;
  218.          Point var2 = var1.getPoint();
  219.          int var3 = this.table.rowAtPoint(var2);
  220.          int var4 = this.table.columnAtPoint(var2);
  221.          if (var4 != -1 && var3 != -1) {
  222.             Rectangle var5 = this.table.getCellRect(var3, var4, false);
  223.             if (var5.contains(var2)) {
  224.                this.table.editCellAt(var3, var4, var1);
  225.             }
  226.  
  227.             if (this.table.isEditing()) {
  228.                Component var9 = this.table.getEditorComponent();
  229.                Point var10 = SwingUtilities.convertPoint(this.table, new Point(var1.getX(), var1.getY()), var9);
  230.                this.dispatchComponent = SwingUtilities.getDeepestComponentAt(var9, var10.x, var10.y);
  231.                this.dispatchComponent.dispatchEvent(SwingUtilities.convertMouseEvent(this.table, var1, this.dispatchComponent));
  232.             } else {
  233.                this.table.requestFocus();
  234.                boolean var6 = ((InputEvent)var1).isControlDown();
  235.                boolean var7 = ((InputEvent)var1).isShiftDown();
  236.                boolean var8 = var6 && this.table.isCellSelected(var3, var4);
  237.                if (!var6 && !var7) {
  238.                   this.table.clearSelection();
  239.                }
  240.  
  241.                this.updateSelection(var3, var4, var8, !var7 || var8);
  242.             }
  243.          }
  244.       }
  245.    }
  246.  
  247.    public void mouseDragged(MouseEvent var1) {
  248.       if (this.table.isEditing()) {
  249.          if (this.dispatchComponent != null) {
  250.             this.dispatchComponent.dispatchEvent(SwingUtilities.convertMouseEvent(this.table, var1, this.dispatchComponent));
  251.          }
  252.  
  253.       } else {
  254.          Point var2 = var1.getPoint();
  255.          int var3 = this.table.rowAtPoint(var2);
  256.          int var4 = this.table.columnAtPoint(var2);
  257.          if (var4 != -1 && var3 != -1) {
  258.             this.updateSelection(var3, var4, false, false);
  259.          }
  260.       }
  261.    }
  262.  
  263.    public void mouseReleased(MouseEvent var1) {
  264.       this.phantomMousePressed = false;
  265.       if (this.table.isEditing()) {
  266.          if (this.dispatchComponent != null) {
  267.             this.dispatchComponent.dispatchEvent(SwingUtilities.convertMouseEvent(this.table, var1, this.dispatchComponent));
  268.          }
  269.  
  270.          this.dispatchComponent = null;
  271.       }
  272.    }
  273.  
  274.    public void paint(Graphics var1, JComponent var2) {
  275.       JTable var3 = (JTable)var2;
  276.       Rectangle var4 = var1.getClipBounds();
  277.       ((Component)var3).getSize();
  278.       if (var3.getColumnModel() != null) {
  279.          Dimension var5 = this.getPreferredSize(var3);
  280.          Rectangle var6 = new Rectangle(0, 0, var5.width, var5.height);
  281.          var6 = var6.intersection(var4);
  282.          var1.setColor(((Component)var3).getParent().getBackground());
  283.          var1.fillRect(var4.x, var4.y, var4.width, var4.height);
  284.          if (var6.height >= 0 && var6.width >= 0) {
  285.             Color var7 = ((Component)var3).getBackground();
  286.             if (var7 != null) {
  287.                var1.setColor(var7);
  288.                var1.fillRect(var6.x, var6.y, var6.width, var6.height);
  289.             }
  290.  
  291.             this.drawGridInClipRect(var6, var1);
  292.             Rectangle var11 = var1.getClipBounds();
  293.             int var12 = var3.rowAtPoint(new Point(0, var11.y));
  294.             int var13 = this.lastVisibleRow(var11);
  295.             Rectangle var9 = new Rectangle(0, 0, var3.getColumnModel().getTotalColumnWidth(), var3.getRowHeight() + var3.getIntercellSpacing().height);
  296.             var9.y = var12 * var9.height;
  297.  
  298.             for(int var8 = var12; var8 <= var13; ++var8) {
  299.                if (var9.intersects(var6)) {
  300.                   Rectangle var10 = var9.intersection(var6);
  301.                   this.drawRowInClipRect(var8, var10, var1);
  302.                }
  303.  
  304.                var9.y += var9.height;
  305.             }
  306.  
  307.          }
  308.       }
  309.    }
  310.  
  311.    public Dimension getMinimumSize(JComponent var1) {
  312.       return this.getPreferredSize(var1);
  313.    }
  314.  
  315.    public Dimension getPreferredSize(JComponent var1) {
  316.       JTable var2 = (JTable)var1;
  317.       Dimension var3 = new Dimension();
  318.       int var4 = var2.getAutoResizeMode();
  319.       Container var5 = ((Component)var2).getParent();
  320.       if (var4 != 0 && var5 instanceof JViewport) {
  321.          var3.width = ((Component)var5).getBounds().width;
  322.          var2.sizeColumnsToFit(var4 == 1);
  323.       } else {
  324.          var3.width = var2.getColumnModel().getTotalColumnWidth();
  325.       }
  326.  
  327.       var3.height = var2.getRowCount() * (var2.getRowHeight() + var2.getIntercellSpacing().height);
  328.       return var3;
  329.    }
  330.  
  331.    public Dimension getMaximumSize(JComponent var1) {
  332.       return this.getPreferredSize(var1);
  333.    }
  334.  
  335.    private int lastVisibleRow(Rectangle var1) {
  336.       int var2 = this.table.rowAtPoint(new Point(0, var1.y + var1.height - 1));
  337.       if (var2 == -1) {
  338.          var2 = this.table.getRowCount() - 1;
  339.       }
  340.  
  341.       return var2;
  342.    }
  343.  
  344.    protected void drawGridInClipRect(Rectangle var1, Graphics var2) {
  345.       var2.setColor(this.table.getGridColor());
  346.       if (this.table.getShowHorizontalLines()) {
  347.          this.drawHorizontalLinesInClipRect(var1, var2);
  348.       }
  349.  
  350.       if (this.table.getShowVerticalLines()) {
  351.          this.drawVerticalLinesInClipRect(var1, var2);
  352.       }
  353.  
  354.    }
  355.  
  356.    protected void drawHorizontalLinesInClipRect(Rectangle var1, Graphics var2) {
  357.       int var3 = this.table.getRowHeight() + this.table.getIntercellSpacing().height;
  358.       Rectangle var4 = var2.getClipBounds();
  359.       int var5 = this.table.rowAtPoint(new Point(0, var4.y));
  360.       int var6 = this.lastVisibleRow(var4);
  361.       int var7 = var3 * var5 + (var3 - 1);
  362.  
  363.       for(int var8 = var5; var8 <= var6; ++var8) {
  364.          if (var7 >= var1.y && var7 <= var1.y + var1.height) {
  365.             var2.drawLine(var1.x, var7, var1.x + var1.width - 1, var7);
  366.          }
  367.  
  368.          var7 += var3;
  369.       }
  370.  
  371.    }
  372.  
  373.    protected void drawVerticalLinesInClipRect(Rectangle var1, Graphics var2) {
  374.       int var3 = 0;
  375.       int var4 = this.table.getColumnCount();
  376.  
  377.       for(int var5 = 0; var5 <= var4; ++var5) {
  378.          if (var3 > 0 && var3 - 1 >= var1.x && var3 - 1 <= var1.x + var1.width) {
  379.             var2.drawLine(var3 - 1, var1.y, var3 - 1, var1.y + var1.height - 1);
  380.          }
  381.  
  382.          if (var5 < var4) {
  383.             var3 += this.table.getColumnModel().getColumn(var5).getWidth() + this.table.getIntercellSpacing().width;
  384.          }
  385.       }
  386.  
  387.    }
  388.  
  389.    protected void drawRowInClipRect(int var1, Rectangle var2, Graphics var3) {
  390.       int var4 = 0;
  391.       boolean var5 = false;
  392.       Rectangle var7 = null;
  393.       int var9 = -1;
  394.       Enumeration var11 = this.table.getColumnModel().getColumns();
  395.       Dimension var12 = this.table.getIntercellSpacing();
  396.       JTableHeader var13 = this.table.getTableHeader();
  397.       Rectangle var6 = new Rectangle();
  398.       var6.height = this.table.getRowHeight() + var12.height;
  399.  
  400.       for(var6.y = var1 * var6.height; var11.hasMoreElements(); ++var4) {
  401.          TableColumn var8 = (TableColumn)var11.nextElement();
  402.          var6.width = var8.getWidth() + var12.width;
  403.          if (var6.intersects(var2)) {
  404.             var5 = true;
  405.             if (var13 != null && var8 == var13.getDraggedColumn()) {
  406.                var3.setColor(this.table.getParent().getBackground());
  407.                var3.fillRect(var6.x, var6.y, var6.width, var6.height);
  408.                var7 = new Rectangle(var6);
  409.                var9 = var4;
  410.             } else {
  411.                TableCellRenderer var10 = this.getCellRenderer(var4);
  412.                Component var14 = this.prepareRenderer(var10, this.table, var1, var4);
  413.                this.drawWithComponent(var3, var14, var6);
  414.             }
  415.          } else if (var5) {
  416.             break;
  417.          }
  418.  
  419.          var6.x += var6.width;
  420.       }
  421.  
  422.       if (var9 != -1 && var7 != null) {
  423.          TableCellRenderer var20 = this.getCellRenderer(var9);
  424.          if (var20 != null) {
  425.             Component var21 = this.prepareRenderer(var20, this.table, var1, var9);
  426.             var7.x += var13.getDraggedDistance();
  427.             Color var15 = this.table.getBackground();
  428.             if (var15 != null) {
  429.                var3.setColor(var15);
  430.                var3.fillRect(var7.x, var7.y, var7.width, var7.height);
  431.             }
  432.  
  433.             var3.setColor(this.table.getGridColor());
  434.             int var16 = var7.x;
  435.             int var17 = var7.y;
  436.             int var18 = var16 + var7.width - 1;
  437.             int var19 = var17 + var7.height - 1;
  438.             if (this.table.getShowVerticalLines()) {
  439.                var3.drawLine(var18, var17, var18, var19);
  440.             }
  441.  
  442.             if (this.table.getShowHorizontalLines()) {
  443.                var3.drawLine(var16, var19, var18, var19);
  444.             }
  445.  
  446.             this.drawWithComponent(var3, var21, var7);
  447.          }
  448.       }
  449.  
  450.    }
  451.  
  452.    protected TableCellRenderer getCellRenderer(int var1) {
  453.       TableColumn var2 = this.table.getColumnModel().getColumn(var1);
  454.       TableCellRenderer var3 = var2.getCellRenderer();
  455.       if (var3 == null) {
  456.          Class var4 = this.table.getColumnClass(var1);
  457.          var3 = this.table.getDefaultRenderer(var4);
  458.       }
  459.  
  460.       return var3;
  461.    }
  462.  
  463.    protected Component prepareRenderer(TableCellRenderer var1, JTable var2, int var3, int var4) {
  464.       Object var5 = var2.getValueAt(var3, var4);
  465.       boolean var6 = var2.isCellSelected(var3, var4);
  466.       boolean var7 = var2.getSelectedRow() == var3;
  467.       boolean var8 = var2.getSelectedColumn() == var4;
  468.       boolean var9 = var7 && var8 && ((JComponent)var2).hasFocus();
  469.       return var1.getTableCellRendererComponent(var2, var5, var6, var9, var3, var4);
  470.    }
  471.  
  472.    protected void drawWithComponent(Graphics var1, Component var2, Rectangle var3) {
  473.       Dimension var4 = this.table.getIntercellSpacing();
  474.       var3.setBounds(var3.x + var4.width / 2, var3.y + var4.height / 2, var3.width - var4.width, var3.height - var4.height);
  475.       if (var2.getParent() == null) {
  476.          this.rendererPane.add(var2);
  477.       }
  478.  
  479.       this.rendererPane.paintComponent(var1, var2, this.table, var3.x, var3.y, var3.width, var3.height, true);
  480.       var3.setBounds(var3.x - var4.width / 2, var3.y - var4.height / 2, var3.width + var4.width, var3.height + var4.height);
  481.    }
  482.  
  483.    private void updateSelectionModel(ListSelectionModel var1, int var2, boolean var3, boolean var4) {
  484.       if (var4) {
  485.          if (var3) {
  486.             var1.removeSelectionInterval(var2, var2);
  487.             return;
  488.          }
  489.  
  490.          var1.addSelectionInterval(var2, var2);
  491.       }
  492.  
  493.       var1.setLeadSelectionIndex(var2);
  494.    }
  495.  
  496.    private void updateSelection(int var1, int var2, boolean var3, boolean var4) {
  497.       Rectangle var5 = this.table.getCellRect(var1, var2, false);
  498.       if (var5 != null) {
  499.          this.table.scrollRectToVisible(var5);
  500.       }
  501.  
  502.       ListSelectionModel var6 = this.table.getSelectionModel();
  503.       ListSelectionModel var7 = this.table.getColumnModel().getSelectionModel();
  504.       this.updateSelectionModel(var7, var2, var3, var4);
  505.       this.updateSelectionModel(var6, var1, var3, var4);
  506.    }
  507.  
  508.    // $FF: synthetic method
  509.    static void access$0(BasicTableUI var0, KeyEvent var1) {
  510.       var0.dispatchKeyboardEvent(var1);
  511.    }
  512. }
  513.