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 / BasicTableHeaderUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  9.0 KB  |  359 lines

  1. package com.sun.java.swing.plaf.basic;
  2.  
  3. import com.sun.java.swing.CellRendererPane;
  4. import com.sun.java.swing.JComponent;
  5. import com.sun.java.swing.JTable;
  6. import com.sun.java.swing.LookAndFeel;
  7. import com.sun.java.swing.SwingUtilities;
  8. import com.sun.java.swing.plaf.ComponentUI;
  9. import com.sun.java.swing.plaf.TableHeaderUI;
  10. import com.sun.java.swing.table.JTableHeader;
  11. import com.sun.java.swing.table.TableCellRenderer;
  12. import com.sun.java.swing.table.TableColumn;
  13. import com.sun.java.swing.table.TableColumnModel;
  14. import java.awt.Color;
  15. import java.awt.Component;
  16. import java.awt.Cursor;
  17. import java.awt.Dimension;
  18. import java.awt.Graphics;
  19. import java.awt.Point;
  20. import java.awt.Rectangle;
  21. import java.awt.event.FocusEvent;
  22. import java.awt.event.FocusListener;
  23. import java.awt.event.InputEvent;
  24. import java.awt.event.MouseEvent;
  25. import java.awt.event.MouseListener;
  26. import java.awt.event.MouseMotionListener;
  27. import java.io.Serializable;
  28. import java.util.Enumeration;
  29.  
  30. public class BasicTableHeaderUI extends TableHeaderUI implements MouseListener, MouseMotionListener, FocusListener, Serializable {
  31.    protected JTableHeader header;
  32.    protected CellRendererPane rendererPane = new CellRendererPane();
  33.    protected transient int hitColumnIndex;
  34.    protected transient TableColumn hitColumn;
  35.    protected transient boolean isResizing;
  36.    protected transient int originalWidth;
  37.    protected transient int widthDelta;
  38.    protected transient int lastMouseX;
  39.    protected transient int realDraggedDistance;
  40.    protected transient boolean isReordering;
  41.    protected transient boolean okToReorder;
  42.    protected transient boolean fireAction;
  43.    protected transient boolean hasPress = false;
  44.    static final Cursor defaultCursor = Cursor.getPredefinedCursor(0);
  45.    static final Cursor resizeCursor = Cursor.getPredefinedCursor(11);
  46.  
  47.    public static ComponentUI createUI(JComponent var0) {
  48.       return new BasicTableHeaderUI();
  49.    }
  50.  
  51.    public void installUI(JComponent var1) {
  52.       this.header = (JTableHeader)var1;
  53.       this.header.add(this.rendererPane);
  54.       ((Component)var1).addMouseListener(this);
  55.       ((Component)var1).addMouseMotionListener(this);
  56.       ((Component)var1).addFocusListener(this);
  57.       LookAndFeel.installColorsAndFont(this.header, "TableHeader.background", "TableHeader.foreground", "TableHeader.font");
  58.    }
  59.  
  60.    public void uninstallUI(JComponent var1) {
  61.       this.header.remove(this.rendererPane);
  62.       this.header = null;
  63.       ((Component)var1).removeMouseListener(this);
  64.       ((Component)var1).removeMouseMotionListener(this);
  65.       ((Component)var1).removeFocusListener(this);
  66.    }
  67.  
  68.    public void focusGained(FocusEvent var1) {
  69.    }
  70.  
  71.    public void focusLost(FocusEvent var1) {
  72.    }
  73.  
  74.    public void mouseMoved(MouseEvent var1) {
  75.       if (this.getResizingColumn(var1.getPoint()) != -1) {
  76.          if (this.header.getCursor() != resizeCursor) {
  77.             this.header.setCursor(resizeCursor);
  78.             return;
  79.          }
  80.       } else if (this.header.getCursor() != defaultCursor) {
  81.          this.header.setCursor(defaultCursor);
  82.       }
  83.  
  84.    }
  85.  
  86.    public void mouseDragged(MouseEvent var1) {
  87.       this.fireAction = false;
  88.       int var2 = var1.getX();
  89.       if (var2 != this.lastMouseX) {
  90.          if (this.isResizing) {
  91.             this.widthDelta += var2 - this.lastMouseX;
  92.             int var3 = this.originalWidth + this.widthDelta;
  93.             this.hitColumn.setWidth(var3);
  94.             this.header.revalidate();
  95.             this.header.repaint();
  96.             if (this.header.getUpdateTableInRealTime()) {
  97.                JTable var4 = this.header.getTable();
  98.                ((JComponent)var4).revalidate();
  99.                ((Component)var4).repaint();
  100.             }
  101.          } else if (this.okToReorder || this.isReordering) {
  102.             this.isReordering = true;
  103.             this.move(var1);
  104.          }
  105.  
  106.          this.lastMouseX = var2;
  107.       }
  108.    }
  109.  
  110.    public void mouseClicked(MouseEvent var1) {
  111.    }
  112.  
  113.    public void mousePressed(MouseEvent var1) {
  114.       if (!this.hasPress) {
  115.          this.hasPress = true;
  116.          TableColumnModel var2 = this.header.getColumnModel();
  117.          int var4 = 0;
  118.          this.isReordering = false;
  119.          this.isResizing = false;
  120.          this.fireAction = true;
  121.          this.hitColumnIndex = -1;
  122.          this.hitColumn = null;
  123.          Point var5 = var1.getPoint();
  124.          if ((var4 = var2.getColumnIndexAtX(var5.x)) != -1) {
  125.             Rectangle var3 = this.header.getHeaderRect(var4);
  126.             int var6 = this.getResizingColumn(var5);
  127.             if (this.header.getResizingAllowed() && var6 != -1) {
  128.                this.hitColumn = var2.getColumn(var6);
  129.                if (this.hitColumn.getResizable()) {
  130.                   this.isResizing = true;
  131.                   this.fireAction = false;
  132.                   this.hitColumnIndex = var6;
  133.                   this.originalWidth = this.hitColumn.getWidth();
  134.                   this.widthDelta = 0;
  135.                   this.header.setResizingColumn(this.hitColumn);
  136.                   this.lastMouseX = var5.x;
  137.                   this.hitColumn.disableResizedPosting();
  138.                   return;
  139.                }
  140.  
  141.                this.hitColumn = null;
  142.                return;
  143.             }
  144.  
  145.             boolean var7 = ((InputEvent)var1).isControlDown();
  146.             if (this.header.getReorderingAllowed() && var3.contains(var5)) {
  147.                this.okToReorder = var2.getColumnCount() > 1;
  148.                if (var7) {
  149.                   this.okToReorder = false;
  150.                   this.fireAction = false;
  151.                }
  152.             }
  153.  
  154.             JTable var8 = this.header.getTable();
  155.             if (var2.getColumnSelectionAllowed() && var3.contains(var5) && var8 != null) {
  156.                if (var7) {
  157.                   if (var8.isColumnSelected(var4)) {
  158.                      var8.removeColumnSelectionInterval(var4, var4);
  159.                   } else {
  160.                      var8.addColumnSelectionInterval(var4, var4);
  161.                   }
  162.                } else {
  163.                   var8.setColumnSelectionInterval(var4, var4);
  164.                }
  165.             }
  166.  
  167.             this.hitColumnIndex = var4;
  168.             this.header.setDraggedColumn(this.hitColumn);
  169.             this.header.setDraggedDistance(0);
  170.             this.lastMouseX = var5.x;
  171.             this.realDraggedDistance = 0;
  172.          }
  173.  
  174.       }
  175.    }
  176.  
  177.    public void mouseReleased(MouseEvent var1) {
  178.       this.hasPress = false;
  179.       if (this.isResizing) {
  180.          this.isResizing = false;
  181.          this.originalWidth = 0;
  182.          this.header.setResizingColumn((TableColumn)null);
  183.          int var2 = this.hitColumn.getWidth();
  184.          this.hitColumn.setWidth(this.originalWidth);
  185.          this.hitColumn.enableResizedPosting();
  186.          this.hitColumn.setWidth(var2);
  187.       } else if (this.isReordering) {
  188.          this.isReordering = false;
  189.          this.originalWidth = this.widthDelta = 0;
  190.          this.realDraggedDistance = 0;
  191.       } else if (this.fireAction) {
  192.          this.fireAction = false;
  193.       }
  194.  
  195.       this.header.setDraggedColumn((TableColumn)null);
  196.       this.header.setDraggedDistance(0);
  197.       this.header.repaint();
  198.       JTable var3 = this.header.getTable();
  199.       if (var3 != null) {
  200.          ((Component)var3).repaint();
  201.       }
  202.  
  203.       this.okToReorder = false;
  204.       this.hitColumnIndex = -1;
  205.       this.hitColumn = null;
  206.    }
  207.  
  208.    public void mouseEntered(MouseEvent var1) {
  209.    }
  210.  
  211.    public void mouseExited(MouseEvent var1) {
  212.    }
  213.  
  214.    public void paint(Graphics var1, JComponent var2) {
  215.       JTableHeader var3 = (JTableHeader)var2;
  216.       Rectangle var4 = var1.getClipBounds();
  217.       Dimension var5 = ((Component)var3).getSize();
  218.       Object var6 = null;
  219.       if (var3.getColumnModel() != null) {
  220.          Color var7 = ((Component)var3).getBackground();
  221.          if (var7 != null) {
  222.             var1.setColor(var7);
  223.             var1.fillRect(var4.x, var4.y, var4.width, var4.height);
  224.          }
  225.  
  226.          Rectangle var8 = new Rectangle(0, 0, var5.width, var5.height);
  227.          int var9 = 0;
  228.          boolean var10 = false;
  229.          Rectangle var11 = null;
  230.          Object var13 = null;
  231.          int var15 = var3.getColumnModel().getColumnMargin();
  232.  
  233.          for(Enumeration var16 = var3.getColumnModel().getColumns(); var16.hasMoreElements(); ++var9) {
  234.             TableColumn var12 = (TableColumn)var16.nextElement();
  235.             var8.width = var12.getWidth() + var15;
  236.             if (var8.intersects(var4)) {
  237.                var10 = true;
  238.                if (var12 != var3.getDraggedColumn()) {
  239.                   TableCellRenderer var14 = var12.getHeaderRenderer();
  240.                   Component var17 = var14.getTableCellRendererComponent(var3.getTable(), var12.getHeaderValue(), false, false, -1, var9);
  241.                   this.rendererPane.add(var17);
  242.                   this.rendererPane.paintComponent(var1, var17, var3, var8.x, var8.y, var8.width, var8.height, true);
  243.                } else {
  244.                   var1.setColor(((Component)var3).getParent().getBackground());
  245.                   var1.fillRect(var8.x, var8.y, var8.width, var8.height);
  246.                   var11 = new Rectangle(var8);
  247.                }
  248.             } else if (var10) {
  249.                break;
  250.             }
  251.  
  252.             var8.x += var8.width;
  253.          }
  254.  
  255.          TableColumn var19 = var3.getDraggedColumn();
  256.          if (var19 != null && var11 != null) {
  257.             TableCellRenderer var20 = var19.getHeaderRenderer();
  258.             Component var18 = var20.getTableCellRendererComponent(var3.getTable(), var19.getHeaderValue(), false, false, -1, var9);
  259.             var11.x += var3.getDraggedDistance();
  260.             SwingUtilities.paintComponent(var1, var18, var3, var11);
  261.          }
  262.  
  263.       }
  264.    }
  265.  
  266.    public Dimension getMinimumSize(JComponent var1) {
  267.       return this.getPreferredSize(var1);
  268.    }
  269.  
  270.    public Dimension getPreferredSize(JComponent var1) {
  271.       JTableHeader var2 = (JTableHeader)var1;
  272.       JTable var3 = var2.getTable();
  273.       Dimension var4 = ((JComponent)var3).getPreferredSize();
  274.       Dimension var5 = new Dimension();
  275.       var5.width = var4.width;
  276.       int var6 = 0;
  277.  
  278.       for(Enumeration var7 = var2.getColumnModel().getColumns(); var7.hasMoreElements(); ++var6) {
  279.          TableColumn var8 = (TableColumn)var7.nextElement();
  280.          TableCellRenderer var9 = var8.getHeaderRenderer();
  281.          Component var10 = var9.getTableCellRendererComponent(var2.getTable(), var8.getHeaderValue(), false, false, -1, var6);
  282.          var5.height = Math.max(var5.height, var10.getPreferredSize().height);
  283.       }
  284.  
  285.       return var5;
  286.    }
  287.  
  288.    public Dimension getMaximumSize(JComponent var1) {
  289.       return this.getPreferredSize(var1);
  290.    }
  291.  
  292.    private void move(MouseEvent var1) {
  293.       TableColumnModel var2 = this.header.getColumnModel();
  294.       int var4 = var2.getColumnCount() - 1;
  295.       Rectangle var5 = this.header.getHeaderRect(this.hitColumnIndex);
  296.       var5.x += this.header.getDraggedDistance();
  297.       int var6 = var1.getX() - this.lastMouseX;
  298.       this.realDraggedDistance += var6;
  299.       Rectangle var7 = this.header.getHeaderRect(this.hitColumnIndex);
  300.       var7.x += this.realDraggedDistance;
  301.       var5 = var5.union(var7);
  302.       if (this.realDraggedDistance < 0 && this.hitColumnIndex != 0) {
  303.          int var10 = var2.getColumnMargin() + var2.getColumn(this.hitColumnIndex - 1).getWidth();
  304.          if (-this.realDraggedDistance > var10 / 2) {
  305.             var2.moveColumn(this.hitColumnIndex, this.hitColumnIndex - 1);
  306.             this.realDraggedDistance += var10;
  307.             --this.hitColumnIndex;
  308.          }
  309.       } else if (this.realDraggedDistance > 0 && this.hitColumnIndex != var4) {
  310.          int var3 = var2.getColumnMargin() + var2.getColumn(this.hitColumnIndex + 1).getWidth();
  311.          if (this.realDraggedDistance > var3 / 2) {
  312.             var2.moveColumn(this.hitColumnIndex, this.hitColumnIndex + 1);
  313.             this.realDraggedDistance = -(var3 - this.realDraggedDistance);
  314.             ++this.hitColumnIndex;
  315.          }
  316.       }
  317.  
  318.       int var8 = this.realDraggedDistance;
  319.       if (this.hitColumnIndex == 0) {
  320.          if (var8 < 0) {
  321.             var8 = 0;
  322.          }
  323.       } else if (this.hitColumnIndex == var4 && var8 > 0) {
  324.          var8 = 0;
  325.       }
  326.  
  327.       this.header.setDraggedColumn(var2.getColumn(this.hitColumnIndex));
  328.       this.header.setDraggedDistance(var8);
  329.       this.header.repaint(var5.x, 0, var5.width, var5.height);
  330.       if (this.header.getUpdateTableInRealTime()) {
  331.          JTable var9 = this.header.getTable();
  332.          if (var9 != null) {
  333.             ((Component)var9).repaint(var5.x, 0, var5.width, (var9.getRowHeight() + var9.getIntercellSpacing().height) * var9.getRowCount());
  334.          }
  335.       }
  336.  
  337.    }
  338.  
  339.    private int getResizingColumn(Point var1) {
  340.       int var2 = 0;
  341.       Rectangle var3 = new Rectangle(-3, 0, 6, this.header.getSize().height);
  342.       int var4 = this.header.getColumnModel().getColumnMargin();
  343.  
  344.       for(Enumeration var5 = this.header.getColumnModel().getColumns(); var5.hasMoreElements(); ++var2) {
  345.          TableColumn var6 = (TableColumn)var5.nextElement();
  346.          var3.x += var6.getWidth() + var4;
  347.          if (var3.x > var1.x) {
  348.             break;
  349.          }
  350.  
  351.          if (var3.contains(var1)) {
  352.             return var2;
  353.          }
  354.       }
  355.  
  356.       return -1;
  357.    }
  358. }
  359.