home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 144 / DPCS0200.iso / Internet / Supanet / system / swing.jar / javax / swing / plaf / basic / BasicTabbedPaneUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-05  |  20.0 KB  |  921 lines

  1. package javax.swing.plaf.basic;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.Graphics;
  10. import java.awt.Insets;
  11. import java.awt.LayoutManager;
  12. import java.awt.Rectangle;
  13. import java.awt.Toolkit;
  14. import java.awt.event.FocusListener;
  15. import java.awt.event.MouseListener;
  16. import java.beans.PropertyChangeListener;
  17. import javax.swing.Icon;
  18. import javax.swing.JComponent;
  19. import javax.swing.JTabbedPane;
  20. import javax.swing.KeyStroke;
  21. import javax.swing.LookAndFeel;
  22. import javax.swing.SwingConstants;
  23. import javax.swing.SwingUtilities;
  24. import javax.swing.UIManager;
  25. import javax.swing.event.ChangeListener;
  26. import javax.swing.plaf.ComponentUI;
  27. import javax.swing.plaf.TabbedPaneUI;
  28.  
  29. public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants {
  30.    protected JTabbedPane tabPane;
  31.    protected Color highlight;
  32.    protected Color lightHighlight;
  33.    protected Color shadow;
  34.    protected Color darkShadow;
  35.    protected Color focus;
  36.    protected int textIconGap;
  37.    protected int tabRunOverlay;
  38.    protected Insets tabInsets;
  39.    protected Insets selectedTabPadInsets;
  40.    protected Insets tabAreaInsets;
  41.    protected Insets contentBorderInsets;
  42.    protected KeyStroke upKey;
  43.    protected KeyStroke downKey;
  44.    protected KeyStroke leftKey;
  45.    protected KeyStroke rightKey;
  46.    protected int[] tabRuns = new int[10];
  47.    protected int runCount;
  48.    protected int selectedRun;
  49.    protected Rectangle[] rects = new Rectangle[0];
  50.    protected int maxTabHeight;
  51.    protected int maxTabWidth;
  52.    protected ChangeListener tabChangeListener;
  53.    protected PropertyChangeListener propertyChangeListener;
  54.    protected MouseListener mouseListener;
  55.    protected FocusListener focusListener;
  56.    private Insets currentPadInsets = new Insets(0, 0, 0, 0);
  57.    private Insets currentTabAreaInsets = new Insets(0, 0, 0, 0);
  58.    private Component visibleComponent;
  59.  
  60.    protected void assureRectsCreated(int var1) {
  61.       int var2 = this.rects.length;
  62.       if (var1 != var2) {
  63.          Rectangle[] var3 = new Rectangle[var1];
  64.          System.arraycopy(this.rects, 0, var3, 0, Math.min(var2, var1));
  65.          this.rects = var3;
  66.  
  67.          for(int var4 = var2; var4 < var1; ++var4) {
  68.             this.rects[var4] = new Rectangle();
  69.          }
  70.       }
  71.  
  72.    }
  73.  
  74.    protected int calculateMaxTabHeight(int var1) {
  75.       FontMetrics var2 = this.getFontMetrics();
  76.       int var3 = this.tabPane.getTabCount();
  77.       int var4 = 0;
  78.       int var5 = var2.getHeight();
  79.  
  80.       for(int var6 = 0; var6 < var3; ++var6) {
  81.          var4 = Math.max(this.calculateTabHeight(var1, var6, var5), var4);
  82.       }
  83.  
  84.       return var4;
  85.    }
  86.  
  87.    protected int calculateMaxTabWidth(int var1) {
  88.       FontMetrics var2 = this.getFontMetrics();
  89.       int var3 = this.tabPane.getTabCount();
  90.       int var4 = 0;
  91.  
  92.       for(int var5 = 0; var5 < var3; ++var5) {
  93.          var4 = Math.max(this.calculateTabWidth(var1, var5, var2), var4);
  94.       }
  95.  
  96.       return var4;
  97.    }
  98.  
  99.    protected int calculateTabAreaHeight(int var1, int var2, int var3) {
  100.       Insets var4 = this.getTabAreaInsets(var1);
  101.       int var5 = this.getTabRunOverlay(var1);
  102.       return var2 > 0 ? var2 * (var3 - var5) + var5 + var4.top + var4.bottom : 0;
  103.    }
  104.  
  105.    protected int calculateTabAreaWidth(int var1, int var2, int var3) {
  106.       Insets var4 = this.getTabAreaInsets(var1);
  107.       int var5 = this.getTabRunOverlay(var1);
  108.       return var2 > 0 ? var2 * (var3 - var5) + var5 + var4.left + var4.right : 0;
  109.    }
  110.  
  111.    protected int calculateTabHeight(int var1, int var2, int var3) {
  112.       int var4 = var3;
  113.       Icon var5 = this.getIconForTab(var2);
  114.       Insets var6 = this.getTabInsets(var1, var2);
  115.       if (var5 != null) {
  116.          var4 = Math.max(var3, var5.getIconHeight());
  117.       }
  118.  
  119.       var4 += var6.top + var6.bottom + 2;
  120.       return var4;
  121.    }
  122.  
  123.    protected int calculateTabWidth(int var1, int var2, FontMetrics var3) {
  124.       String var4 = this.tabPane.getTitleAt(var2);
  125.       Icon var5 = this.getIconForTab(var2);
  126.       Insets var6 = this.getTabInsets(var1, var2);
  127.       int var7 = var6.left + var6.right + 3;
  128.       if (var5 != null) {
  129.          var7 += var5.getIconWidth() + this.textIconGap;
  130.       }
  131.  
  132.       var7 += SwingUtilities.computeStringWidth(var3, var4);
  133.       return var7;
  134.    }
  135.  
  136.    protected ChangeListener createChangeListener() {
  137.       return new TabSelectionHandler(this);
  138.    }
  139.  
  140.    protected FocusListener createFocusListener() {
  141.       return new FocusHandler(this);
  142.    }
  143.  
  144.    protected LayoutManager createLayoutManager() {
  145.       return new TabbedPaneLayout(this);
  146.    }
  147.  
  148.    protected MouseListener createMouseListener() {
  149.       return new MouseHandler(this);
  150.    }
  151.  
  152.    protected PropertyChangeListener createPropertyChangeListener() {
  153.       return new PropertyChangeHandler(this);
  154.    }
  155.  
  156.    public static ComponentUI createUI(JComponent var0) {
  157.       return new BasicTabbedPaneUI();
  158.    }
  159.  
  160.    private void ensureCurrentLayout() {
  161.       if (this.tabPane.getTabCount() != this.rects.length) {
  162.          TabbedPaneLayout var1 = (TabbedPaneLayout)this.tabPane.getLayout();
  163.          var1.calculateLayoutInfo();
  164.       }
  165.  
  166.    }
  167.  
  168.    protected void expandTabRunsArray() {
  169.       int var1 = this.tabRuns.length;
  170.       int[] var2 = new int[var1 + 10];
  171.       System.arraycopy(this.tabRuns, 0, var2, 0, this.runCount);
  172.       this.tabRuns = var2;
  173.    }
  174.  
  175.    protected Insets getContentBorderInsets(int var1) {
  176.       return this.contentBorderInsets;
  177.    }
  178.  
  179.    protected FontMetrics getFontMetrics() {
  180.       Font var1 = this.tabPane.getFont();
  181.       return Toolkit.getDefaultToolkit().getFontMetrics(var1);
  182.    }
  183.  
  184.    protected Icon getIconForTab(int var1) {
  185.       return (!this.tabPane.isEnabled() || !this.tabPane.isEnabledAt(var1)) && this.tabPane.getDisabledIconAt(var1) != null ? this.tabPane.getDisabledIconAt(var1) : this.tabPane.getIconAt(var1);
  186.    }
  187.  
  188.    public Dimension getMaximumSize(JComponent var1) {
  189.       return null;
  190.    }
  191.  
  192.    public Dimension getMinimumSize(JComponent var1) {
  193.       return null;
  194.    }
  195.  
  196.    protected int getNextTabIndex(int var1) {
  197.       return (var1 + 1) % this.tabPane.getTabCount();
  198.    }
  199.  
  200.    public Dimension getPreferredSize(JComponent var1) {
  201.       return null;
  202.    }
  203.  
  204.    protected int getPreviousTabIndex(int var1) {
  205.       int var2 = var1 - 1 >= 0 ? var1 - 1 : this.tabPane.getTabCount() - 1;
  206.       return var2 >= 0 ? var2 : 0;
  207.    }
  208.  
  209.    protected int getRunForTab(int var1, int var2) {
  210.       for(int var3 = 0; var3 < this.runCount; ++var3) {
  211.          int var4 = this.tabRuns[var3];
  212.          int var5 = this.lastTabInRun(var1, var3);
  213.          if (var2 >= var4 && var2 <= var5) {
  214.             return var3;
  215.          }
  216.       }
  217.  
  218.       return 0;
  219.    }
  220.  
  221.    protected Insets getSelectedTabPadInsets(int var1) {
  222.       rotateInsets(this.selectedTabPadInsets, this.currentPadInsets, var1);
  223.       return this.currentPadInsets;
  224.    }
  225.  
  226.    protected Insets getTabAreaInsets(int var1) {
  227.       rotateInsets(this.tabAreaInsets, this.currentTabAreaInsets, var1);
  228.       return this.currentTabAreaInsets;
  229.    }
  230.  
  231.    public Rectangle getTabBounds(JTabbedPane var1, int var2) {
  232.       this.ensureCurrentLayout();
  233.       return new Rectangle(this.rects[var2]);
  234.    }
  235.  
  236.    protected Insets getTabInsets(int var1, int var2) {
  237.       return this.tabInsets;
  238.    }
  239.  
  240.    protected int getTabLabelShiftX(int var1, int var2, boolean var3) {
  241.       Rectangle var4 = this.rects[var2];
  242.       int var5 = 0;
  243.       switch (var1) {
  244.          case 1:
  245.          case 3:
  246.          default:
  247.             var5 = var4.width % 2;
  248.             break;
  249.          case 2:
  250.             var5 = var3 ? -1 : 1;
  251.             break;
  252.          case 4:
  253.             var5 = var3 ? 1 : -1;
  254.       }
  255.  
  256.       return var5;
  257.    }
  258.  
  259.    protected int getTabLabelShiftY(int var1, int var2, boolean var3) {
  260.       Rectangle var4 = this.rects[var2];
  261.       int var5 = 0;
  262.       switch (var1) {
  263.          case 1:
  264.          default:
  265.             var5 = var3 ? -1 : 1;
  266.             break;
  267.          case 2:
  268.          case 4:
  269.             var5 = var4.height % 2;
  270.             break;
  271.          case 3:
  272.             var5 = var3 ? 1 : -1;
  273.       }
  274.  
  275.       return var5;
  276.    }
  277.  
  278.    public int getTabRunCount(JTabbedPane var1) {
  279.       return this.runCount;
  280.    }
  281.  
  282.    protected int getTabRunIndent(int var1, int var2) {
  283.       return 0;
  284.    }
  285.  
  286.    protected int getTabRunOffset(int var1, int var2, int var3, boolean var4) {
  287.       int var5 = this.getRunForTab(var2, var3);
  288.       int var6;
  289.       switch (var1) {
  290.          case 1:
  291.          default:
  292.             if (var5 == 0) {
  293.                var6 = var4 ? -(this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight) : -this.maxTabHeight;
  294.             } else if (var5 == this.runCount - 1) {
  295.                var6 = var4 ? this.maxTabHeight : this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight;
  296.             } else {
  297.                var6 = var4 ? this.maxTabHeight : -this.maxTabHeight;
  298.             }
  299.             break;
  300.          case 2:
  301.             if (var5 == 0) {
  302.                var6 = var4 ? -(this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth) : -this.maxTabWidth;
  303.             } else if (var5 == this.runCount - 1) {
  304.                var6 = var4 ? this.maxTabWidth : this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth;
  305.             } else {
  306.                var6 = var4 ? this.maxTabWidth : -this.maxTabWidth;
  307.             }
  308.             break;
  309.          case 3:
  310.             if (var5 == 0) {
  311.                var6 = var4 ? this.maxTabHeight : this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight;
  312.             } else if (var5 == this.runCount - 1) {
  313.                var6 = var4 ? -(this.calculateTabAreaHeight(var1, this.runCount, this.maxTabHeight) - this.maxTabHeight) : -this.maxTabHeight;
  314.             } else {
  315.                var6 = var4 ? this.maxTabHeight : -this.maxTabHeight;
  316.             }
  317.             break;
  318.          case 4:
  319.             if (var5 == 0) {
  320.                var6 = var4 ? this.maxTabWidth : this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth;
  321.             } else if (var5 == this.runCount - 1) {
  322.                var6 = var4 ? -(this.calculateTabAreaWidth(var1, this.runCount, this.maxTabWidth) - this.maxTabWidth) : -this.maxTabWidth;
  323.             } else {
  324.                var6 = var4 ? this.maxTabWidth : -this.maxTabWidth;
  325.             }
  326.       }
  327.  
  328.       return var6;
  329.    }
  330.  
  331.    protected int getTabRunOverlay(int var1) {
  332.       return this.tabRunOverlay;
  333.    }
  334.  
  335.    protected Component getVisibleComponent() {
  336.       return this.visibleComponent;
  337.    }
  338.  
  339.    protected void installDefaults() {
  340.       LookAndFeel.installColorsAndFont(this.tabPane, "TabbedPane.background", "TabbedPane.foreground", "TabbedPane.font");
  341.       this.highlight = UIManager.getColor("TabbedPane.highlight");
  342.       this.lightHighlight = UIManager.getColor("TabbedPane.lightHighlight");
  343.       this.shadow = UIManager.getColor("TabbedPane.shadow");
  344.       this.darkShadow = UIManager.getColor("TabbedPane.darkShadow");
  345.       this.focus = UIManager.getColor("TabbedPane.focus");
  346.       this.textIconGap = UIManager.getInt("TabbedPane.textIconGap");
  347.       this.tabInsets = UIManager.getInsets("TabbedPane.tabInsets");
  348.       this.selectedTabPadInsets = UIManager.getInsets("TabbedPane.selectedTabPadInsets");
  349.       this.tabAreaInsets = UIManager.getInsets("TabbedPane.tabAreaInsets");
  350.       this.contentBorderInsets = UIManager.getInsets("TabbedPane.contentBorderInsets");
  351.       this.tabRunOverlay = UIManager.getInt("TabbedPane.tabRunOverlay");
  352.    }
  353.  
  354.    protected void installKeyboardActions() {
  355.       this.rightKey = KeyStroke.getKeyStroke(39, 0);
  356.       this.tabPane.registerKeyboardAction(new 1(this), this.rightKey, 0);
  357.       this.leftKey = KeyStroke.getKeyStroke(37, 0);
  358.       this.tabPane.registerKeyboardAction(new 2(this), this.leftKey, 0);
  359.       this.upKey = KeyStroke.getKeyStroke(38, 0);
  360.       this.tabPane.registerKeyboardAction(new 3(this), this.upKey, 0);
  361.       this.downKey = KeyStroke.getKeyStroke(40, 0);
  362.       this.tabPane.registerKeyboardAction(new 4(this), this.downKey, 0);
  363.       this.tabPane.registerKeyboardAction(new 5(this), KeyStroke.getKeyStroke(34, 2), 1);
  364.       this.tabPane.registerKeyboardAction(new 6(this), KeyStroke.getKeyStroke(33, 2), 1);
  365.       this.tabPane.registerKeyboardAction(new 7(this), KeyStroke.getKeyStroke(38, 2), 1);
  366.       this.tabPane.registerKeyboardAction(new 8(this), KeyStroke.getKeyStroke(40, 2), 0);
  367.    }
  368.  
  369.    protected void installListeners() {
  370.       if ((this.propertyChangeListener = this.createPropertyChangeListener()) != null) {
  371.          this.tabPane.addPropertyChangeListener(this.propertyChangeListener);
  372.       }
  373.  
  374.       if ((this.tabChangeListener = this.createChangeListener()) != null) {
  375.          this.tabPane.addChangeListener(this.tabChangeListener);
  376.       }
  377.  
  378.       if ((this.mouseListener = this.createMouseListener()) != null) {
  379.          this.tabPane.addMouseListener(this.mouseListener);
  380.       }
  381.  
  382.       if ((this.focusListener = this.createFocusListener()) != null) {
  383.          this.tabPane.addFocusListener(this.focusListener);
  384.       }
  385.  
  386.    }
  387.  
  388.    public void installUI(JComponent var1) {
  389.       this.tabPane = (JTabbedPane)var1;
  390.       ((Container)var1).setLayout(this.createLayoutManager());
  391.       this.installDefaults();
  392.       this.installListeners();
  393.       this.installKeyboardActions();
  394.       this.runCount = 0;
  395.       this.selectedRun = -1;
  396.    }
  397.  
  398.    protected int lastTabInRun(int var1, int var2) {
  399.       if (this.runCount == 1) {
  400.          return var1 - 1;
  401.       } else {
  402.          int var3 = var2 == this.runCount - 1 ? 0 : var2 + 1;
  403.          return this.tabRuns[var3] == 0 ? var1 - 1 : this.tabRuns[var3] - 1;
  404.       }
  405.    }
  406.  
  407.    protected void layoutLabel(int var1, FontMetrics var2, int var3, String var4, Icon var5, Rectangle var6, Rectangle var7, Rectangle var8, boolean var9) {
  408.       var8.x = var8.y = var7.x = var7.y = 0;
  409.       SwingUtilities.layoutCompoundLabel(this.tabPane, var2, var4, var5, 0, 0, 0, 4, var6, var7, var8, this.textIconGap);
  410.       int var10 = this.getTabLabelShiftX(var1, var3, var9);
  411.       int var11 = this.getTabLabelShiftY(var1, var3, var9);
  412.       var7.x += var10;
  413.       var7.y += var11;
  414.       var8.x += var10;
  415.       var8.y += var11;
  416.    }
  417.  
  418.    protected void navigateSelectedTab(int var1) {
  419.       int var2 = this.tabPane.getTabPlacement();
  420.       int var3 = this.tabPane.getSelectedIndex();
  421.       int var4 = this.tabPane.getTabCount();
  422.       switch (var2) {
  423.          case 1:
  424.          case 3:
  425.          default:
  426.             switch (var1) {
  427.                case 1:
  428.                   int var8 = this.getTabRunOffset(var2, var4, var3, false);
  429.                   this.selectAdjacentRunTab(var2, var3, var8);
  430.                   return;
  431.                case 2:
  432.                case 4:
  433.                case 6:
  434.                default:
  435.                   return;
  436.                case 3:
  437.                   this.selectNextTab(var3);
  438.                   return;
  439.                case 5:
  440.                   int var7 = this.getTabRunOffset(var2, var4, var3, true);
  441.                   this.selectAdjacentRunTab(var2, var3, var7);
  442.                   return;
  443.                case 7:
  444.                   this.selectPreviousTab(var3);
  445.                   return;
  446.             }
  447.          case 2:
  448.          case 4:
  449.             switch (var1) {
  450.                case 1:
  451.                   this.selectPreviousTab(var3);
  452.                case 2:
  453.                case 4:
  454.                case 6:
  455.                default:
  456.                   break;
  457.                case 3:
  458.                   int var6 = this.getTabRunOffset(var2, var4, var3, true);
  459.                   this.selectAdjacentRunTab(var2, var3, var6);
  460.                   break;
  461.                case 5:
  462.                   this.selectNextTab(var3);
  463.                   break;
  464.                case 7:
  465.                   int var5 = this.getTabRunOffset(var2, var4, var3, false);
  466.                   this.selectAdjacentRunTab(var2, var3, var5);
  467.             }
  468.       }
  469.  
  470.    }
  471.  
  472.    public void paint(Graphics var1, JComponent var2) {
  473.       int var3 = this.tabPane.getSelectedIndex();
  474.       int var4 = this.tabPane.getTabPlacement();
  475.       int var5 = this.tabPane.getTabCount();
  476.       this.ensureCurrentLayout();
  477.       Rectangle var6 = new Rectangle();
  478.       Rectangle var7 = new Rectangle();
  479.       Rectangle var8 = var1.getClipBounds();
  480.       Insets var9 = this.tabPane.getInsets();
  481.  
  482.       for(int var10 = this.runCount - 1; var10 >= 0; --var10) {
  483.          int var11 = this.tabRuns[var10];
  484.          int var12 = this.tabRuns[var10 == this.runCount - 1 ? 0 : var10 + 1];
  485.          int var13 = var12 != 0 ? var12 - 1 : var5 - 1;
  486.  
  487.          for(int var14 = var11; var14 <= var13; ++var14) {
  488.             if (this.rects[var14].intersects(var8)) {
  489.                this.paintTab(var1, var4, this.rects, var14, var6, var7);
  490.             }
  491.          }
  492.       }
  493.  
  494.       if (var3 >= 0 && this.getRunForTab(var5, var3) == 0 && this.rects[var3].intersects(var8)) {
  495.          this.paintTab(var1, var4, this.rects, var3, var6, var7);
  496.       }
  497.  
  498.       this.paintContentBorder(var1, var4, var3);
  499.    }
  500.  
  501.    protected void paintContentBorder(Graphics var1, int var2, int var3) {
  502.       int var4 = this.tabPane.getWidth();
  503.       int var5 = this.tabPane.getHeight();
  504.       Insets var6 = this.tabPane.getInsets();
  505.       int var7 = var6.left;
  506.       int var8 = var6.top;
  507.       int var9 = var4 - var6.right - var6.left;
  508.       int var10 = var5 - var6.top - var6.bottom;
  509.       switch (var2) {
  510.          case 1:
  511.          default:
  512.             var8 += this.calculateTabAreaHeight(var2, this.runCount, this.maxTabHeight);
  513.             var10 -= var8 - var6.top;
  514.             break;
  515.          case 2:
  516.             var7 += this.calculateTabAreaWidth(var2, this.runCount, this.maxTabWidth);
  517.             var9 -= var7 - var6.left;
  518.             break;
  519.          case 3:
  520.             var10 -= this.calculateTabAreaHeight(var2, this.runCount, this.maxTabHeight);
  521.             break;
  522.          case 4:
  523.             var9 -= this.calculateTabAreaWidth(var2, this.runCount, this.maxTabWidth);
  524.       }
  525.  
  526.       this.paintContentBorderTopEdge(var1, var2, var3, var7, var8, var9, var10);
  527.       this.paintContentBorderLeftEdge(var1, var2, var3, var7, var8, var9, var10);
  528.       this.paintContentBorderBottomEdge(var1, var2, var3, var7, var8, var9, var10);
  529.       this.paintContentBorderRightEdge(var1, var2, var3, var7, var8, var9, var10);
  530.    }
  531.  
  532.    protected void paintContentBorderBottomEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  533.       var1.setColor(this.shadow);
  534.       if (var2 == 3 && var3 >= 0 && this.rects[var3].y - 1 <= var7) {
  535.          Rectangle var8 = this.rects[var3];
  536.          var1.drawLine(var4 + 1, var5 + var7 - 2, var8.x - 1, var5 + var7 - 2);
  537.          var1.setColor(this.darkShadow);
  538.          var1.drawLine(var4, var5 + var7 - 1, var8.x - 1, var5 + var7 - 1);
  539.          if (var8.x + var8.width < var4 + var6 - 2) {
  540.             var1.setColor(this.shadow);
  541.             var1.drawLine(var8.x + var8.width, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  542.             var1.setColor(this.darkShadow);
  543.             var1.drawLine(var8.x + var8.width, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  544.          }
  545.       } else {
  546.          var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  547.          var1.setColor(this.darkShadow);
  548.          var1.drawLine(var4, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  549.       }
  550.  
  551.    }
  552.  
  553.    protected void paintContentBorderLeftEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  554.       var1.setColor(this.lightHighlight);
  555.       if (var2 == 2 && var3 >= 0 && this.rects[var3].x + this.rects[var3].width + 1 >= var4) {
  556.          Rectangle var8 = this.rects[var3];
  557.          var1.drawLine(var4, var5, var4, var8.y - 1);
  558.          if (var8.y + var8.height < var5 + var7 - 2) {
  559.             var1.drawLine(var4, var8.y + var8.height, var4, var5 + var7 - 2);
  560.          }
  561.       } else {
  562.          var1.drawLine(var4, var5, var4, var5 + var7 - 2);
  563.       }
  564.  
  565.    }
  566.  
  567.    protected void paintContentBorderRightEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  568.       var1.setColor(this.shadow);
  569.       if (var2 == 4 && var3 >= 0 && this.rects[var3].x - 1 <= var6) {
  570.          Rectangle var8 = this.rects[var3];
  571.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var8.y - 1);
  572.          var1.setColor(this.darkShadow);
  573.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var8.y - 1);
  574.          if (var8.y + var8.height < var5 + var7 - 2) {
  575.             var1.setColor(this.shadow);
  576.             var1.drawLine(var4 + var6 - 2, var8.y + var8.height, var4 + var6 - 2, var5 + var7 - 2);
  577.             var1.setColor(this.darkShadow);
  578.             var1.drawLine(var4 + var6 - 1, var8.y + var8.height, var4 + var6 - 1, var5 + var7 - 2);
  579.          }
  580.       } else {
  581.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + var7 - 3);
  582.          var1.setColor(this.darkShadow);
  583.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var5 + var7 - 1);
  584.       }
  585.  
  586.    }
  587.  
  588.    protected void paintContentBorderTopEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  589.       var1.setColor(this.lightHighlight);
  590.       if (var2 == 1 && var3 >= 0 && this.rects[var3].y + this.rects[var3].height + 1 >= var5) {
  591.          Rectangle var8 = this.rects[var3];
  592.          var1.drawLine(var4, var5, var8.x - 1, var5);
  593.          if (var8.x + var8.width < var4 + var6 - 2) {
  594.             var1.drawLine(var8.x + var8.width, var5, var4 + var6 - 2, var5);
  595.          } else {
  596.             var1.setColor(this.shadow);
  597.             var1.drawLine(var4 + var6 - 2, var5, var4 + var6 - 2, var5);
  598.          }
  599.       } else {
  600.          var1.drawLine(var4, var5, var4 + var6 - 2, var5);
  601.       }
  602.  
  603.    }
  604.  
  605.    protected void paintFocusIndicator(Graphics var1, int var2, Rectangle[] var3, int var4, Rectangle var5, Rectangle var6, boolean var7) {
  606.       Rectangle var8 = var3[var4];
  607.       if (this.tabPane.hasFocus() && var7) {
  608.          var1.setColor(this.focus);
  609.          int var9;
  610.          int var10;
  611.          int var11;
  612.          int var12;
  613.          switch (var2) {
  614.             case 1:
  615.             default:
  616.                var9 = var8.x + 3;
  617.                var10 = var8.y + 3;
  618.                var11 = var8.width - 6;
  619.                var12 = var8.height - 5;
  620.                break;
  621.             case 2:
  622.                var9 = var8.x + 3;
  623.                var10 = var8.y + 3;
  624.                var11 = var8.width - 5;
  625.                var12 = var8.height - 6;
  626.                break;
  627.             case 3:
  628.                var9 = var8.x + 3;
  629.                var10 = var8.y + 2;
  630.                var11 = var8.width - 6;
  631.                var12 = var8.height - 5;
  632.                break;
  633.             case 4:
  634.                var9 = var8.x + 2;
  635.                var10 = var8.y + 3;
  636.                var11 = var8.width - 5;
  637.                var12 = var8.height - 6;
  638.          }
  639.  
  640.          BasicGraphicsUtils.drawDashedRect(var1, var9, var10, var11, var12);
  641.       }
  642.  
  643.    }
  644.  
  645.    protected void paintIcon(Graphics var1, int var2, int var3, Icon var4, Rectangle var5, boolean var6) {
  646.       if (var4 != null) {
  647.          var4.paintIcon(this.tabPane, var1, var5.x, var5.y);
  648.       }
  649.  
  650.    }
  651.  
  652.    protected void paintTab(Graphics var1, int var2, Rectangle[] var3, int var4, Rectangle var5, Rectangle var6) {
  653.       Rectangle var7 = var3[var4];
  654.       int var8 = this.tabPane.getSelectedIndex();
  655.       boolean var9 = var8 == var4;
  656.       this.paintTabBackground(var1, var2, var4, var7.x, var7.y, var7.width, var7.height, var9);
  657.       this.paintTabBorder(var1, var2, var4, var7.x, var7.y, var7.width, var7.height, var9);
  658.       String var10 = this.tabPane.getTitleAt(var4);
  659.       Font var11 = this.tabPane.getFont();
  660.       FontMetrics var12 = var1.getFontMetrics(var11);
  661.       Icon var13 = this.getIconForTab(var4);
  662.       this.layoutLabel(var2, var12, var4, var10, var13, var7, var5, var6, var9);
  663.       this.paintText(var1, var2, var11, var12, var4, var10, var6, var9);
  664.       this.paintIcon(var1, var2, var4, var13, var5, var9);
  665.       this.paintFocusIndicator(var1, var2, var3, var4, var5, var6, var9);
  666.    }
  667.  
  668.    protected void paintTabBackground(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
  669.       var1.setColor(this.tabPane.getBackgroundAt(var3));
  670.       switch (var2) {
  671.          case 1:
  672.          default:
  673.             var1.fillRect(var4 + 1, var5 + 1, var6 - 3, var7 - 1);
  674.             break;
  675.          case 2:
  676.             var1.fillRect(var4 + 1, var5 + 1, var6 - 2, var7 - 3);
  677.             break;
  678.          case 3:
  679.             var1.fillRect(var4 + 1, var5, var6 - 3, var7 - 1);
  680.             break;
  681.          case 4:
  682.             var1.fillRect(var4, var5 + 1, var6 - 2, var7 - 3);
  683.       }
  684.  
  685.    }
  686.  
  687.    protected void paintTabBorder(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
  688.       var1.setColor(this.lightHighlight);
  689.       switch (var2) {
  690.          case 1:
  691.          default:
  692.             var1.drawLine(var4, var5 + 2, var4, var5 + var7 - 1);
  693.             var1.drawLine(var4 + 1, var5 + 1, var4 + 1, var5 + 1);
  694.             var1.drawLine(var4 + 2, var5, var4 + var6 - 3, var5);
  695.             var1.setColor(this.shadow);
  696.             var1.drawLine(var4 + var6 - 2, var5 + 2, var4 + var6 - 2, var5 + var7 - 1);
  697.             var1.setColor(this.darkShadow);
  698.             var1.drawLine(var4 + var6 - 1, var5 + 2, var4 + var6 - 1, var5 + var7 - 1);
  699.             var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + 1);
  700.             break;
  701.          case 2:
  702.             var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + 1, var5 + var7 - 2);
  703.             var1.drawLine(var4, var5 + 2, var4, var5 + var7 - 3);
  704.             var1.drawLine(var4 + 1, var5 + 1, var4 + 1, var5 + 1);
  705.             var1.drawLine(var4 + 2, var5, var4 + var6 - 1, var5);
  706.             var1.setColor(this.shadow);
  707.             var1.drawLine(var4 + 2, var5 + var7 - 2, var4 + var6 - 1, var5 + var7 - 2);
  708.             var1.setColor(this.darkShadow);
  709.             var1.drawLine(var4 + 2, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  710.             break;
  711.          case 3:
  712.             var1.drawLine(var4, var5, var4, var5 + var7 - 3);
  713.             var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + 1, var5 + var7 - 2);
  714.             var1.setColor(this.shadow);
  715.             var1.drawLine(var4 + 2, var5 + var7 - 2, var4 + var6 - 3, var5 + var7 - 2);
  716.             var1.drawLine(var4 + var6 - 2, var5, var4 + var6 - 2, var5 + var7 - 3);
  717.             var1.setColor(this.darkShadow);
  718.             var1.drawLine(var4 + 2, var5 + var7 - 1, var4 + var6 - 3, var5 + var7 - 1);
  719.             var1.drawLine(var4 + var6 - 2, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  720.             var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var5 + var7 - 3);
  721.             break;
  722.          case 4:
  723.             var1.drawLine(var4, var5, var4 + var6 - 3, var5);
  724.             var1.setColor(this.shadow);
  725.             var1.drawLine(var4, var5 + var7 - 2, var4 + var6 - 3, var5 + var7 - 2);
  726.             var1.drawLine(var4 + var6 - 2, var5 + 2, var4 + var6 - 2, var5 + var7 - 3);
  727.             var1.setColor(this.darkShadow);
  728.             var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + 1);
  729.             var1.drawLine(var4 + var6 - 2, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  730.             var1.drawLine(var4 + var6 - 1, var5 + 2, var4 + var6 - 1, var5 + var7 - 3);
  731.             var1.drawLine(var4, var5 + var7 - 1, var4 + var6 - 3, var5 + var7 - 1);
  732.       }
  733.  
  734.    }
  735.  
  736.    protected void paintText(Graphics var1, int var2, Font var3, FontMetrics var4, int var5, String var6, Rectangle var7, boolean var8) {
  737.       var1.setFont(var3);
  738.       if (this.tabPane.isEnabled() && this.tabPane.isEnabledAt(var5)) {
  739.          var1.setColor(this.tabPane.getForegroundAt(var5));
  740.          var1.drawString(var6, var7.x, var7.y + var4.getAscent());
  741.       } else {
  742.          var1.setColor(this.tabPane.getBackgroundAt(var5).brighter());
  743.          var1.drawString(var6, var7.x, var7.y + var4.getAscent());
  744.          var1.setColor(this.tabPane.getBackgroundAt(var5).darker());
  745.          var1.drawString(var6, var7.x - 1, var7.y + var4.getAscent() - 1);
  746.       }
  747.  
  748.    }
  749.  
  750.    boolean requestFocusForVisibleComponent() {
  751.       Component var1 = this.getVisibleComponent();
  752.       if (var1.isFocusTraversable()) {
  753.          var1.requestFocus();
  754.          return true;
  755.       } else {
  756.          return var1 instanceof JComponent && ((JComponent)var1).requestDefaultFocus();
  757.       }
  758.    }
  759.  
  760.    protected static void rotateInsets(Insets var0, Insets var1, int var2) {
  761.       switch (var2) {
  762.          case 1:
  763.          default:
  764.             var1.top = var0.top;
  765.             var1.left = var0.left;
  766.             var1.bottom = var0.bottom;
  767.             var1.right = var0.right;
  768.             break;
  769.          case 2:
  770.             var1.top = var0.right;
  771.             var1.left = var0.top;
  772.             var1.bottom = var0.left;
  773.             var1.right = var0.bottom;
  774.             break;
  775.          case 3:
  776.             var1.top = var0.bottom;
  777.             var1.left = var0.right;
  778.             var1.bottom = var0.top;
  779.             var1.right = var0.left;
  780.             break;
  781.          case 4:
  782.             var1.top = var0.left;
  783.             var1.left = var0.bottom;
  784.             var1.bottom = var0.right;
  785.             var1.right = var0.top;
  786.       }
  787.  
  788.    }
  789.  
  790.    protected void selectAdjacentRunTab(int var1, int var2, int var3) {
  791.       if (this.runCount >= 2) {
  792.          Rectangle var5 = this.rects[var2];
  793.          int var4;
  794.          switch (var1) {
  795.             case 1:
  796.             case 3:
  797.             default:
  798.                var4 = this.tabForCoordinate(this.tabPane, var5.x + var5.width / 2, var5.y + var5.height / 2 + var3);
  799.                break;
  800.             case 2:
  801.             case 4:
  802.                var4 = this.tabForCoordinate(this.tabPane, var5.x + var5.width / 2 + var3, var5.y + var5.height / 2);
  803.          }
  804.  
  805.          if (var4 != -1) {
  806.             while(!this.tabPane.isEnabledAt(var4) && var4 != var2) {
  807.                var4 = this.getNextTabIndex(var4);
  808.             }
  809.  
  810.             this.tabPane.setSelectedIndex(var4);
  811.          }
  812.  
  813.       }
  814.    }
  815.  
  816.    protected void selectNextTab(int var1) {
  817.       int var2;
  818.       for(var2 = this.getNextTabIndex(var1); var2 != var1 && !this.tabPane.isEnabledAt(var2); var2 = this.getNextTabIndex(var2)) {
  819.       }
  820.  
  821.       this.tabPane.setSelectedIndex(var2);
  822.    }
  823.  
  824.    protected void selectPreviousTab(int var1) {
  825.       int var2;
  826.       for(var2 = this.getPreviousTabIndex(var1); var2 != var1 && !this.tabPane.isEnabledAt(var2); var2 = this.getPreviousTabIndex(var2)) {
  827.       }
  828.  
  829.       this.tabPane.setSelectedIndex(var2);
  830.    }
  831.  
  832.    protected void setVisibleComponent(Component var1) {
  833.       if (this.visibleComponent != var1) {
  834.          if (this.visibleComponent != null) {
  835.             this.visibleComponent.setVisible(false);
  836.          }
  837.  
  838.          if (var1 != null) {
  839.             var1.setVisible(true);
  840.          }
  841.  
  842.          this.visibleComponent = var1;
  843.       }
  844.    }
  845.  
  846.    protected boolean shouldPadTabRun(int var1, int var2) {
  847.       return this.runCount > 1;
  848.    }
  849.  
  850.    protected boolean shouldRotateTabRuns(int var1) {
  851.       return true;
  852.    }
  853.  
  854.    public int tabForCoordinate(JTabbedPane var1, int var2, int var3) {
  855.       int var4 = this.tabPane.getTabCount();
  856.  
  857.       for(int var5 = 0; var5 < var4; ++var5) {
  858.          if (this.rects[var5].contains(var2, var3)) {
  859.             return var5;
  860.          }
  861.       }
  862.  
  863.       return -1;
  864.    }
  865.  
  866.    protected void uninstallDefaults() {
  867.       this.highlight = null;
  868.       this.lightHighlight = null;
  869.       this.shadow = null;
  870.       this.darkShadow = null;
  871.       this.focus = null;
  872.       this.tabInsets = null;
  873.       this.selectedTabPadInsets = null;
  874.       this.tabAreaInsets = null;
  875.       this.contentBorderInsets = null;
  876.    }
  877.  
  878.    protected void uninstallKeyboardActions() {
  879.       this.tabPane.unregisterKeyboardAction(this.upKey);
  880.       this.tabPane.unregisterKeyboardAction(this.downKey);
  881.       this.tabPane.unregisterKeyboardAction(this.leftKey);
  882.       this.tabPane.unregisterKeyboardAction(this.rightKey);
  883.       this.upKey = this.downKey = this.rightKey = this.leftKey = null;
  884.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(34, 2));
  885.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(33, 2));
  886.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(40, 2));
  887.       this.tabPane.unregisterKeyboardAction(KeyStroke.getKeyStroke(38, 2));
  888.    }
  889.  
  890.    protected void uninstallListeners() {
  891.       if (this.mouseListener != null) {
  892.          this.tabPane.removeMouseListener(this.mouseListener);
  893.          this.mouseListener = null;
  894.       }
  895.  
  896.       if (this.focusListener != null) {
  897.          this.tabPane.removeFocusListener(this.focusListener);
  898.          this.focusListener = null;
  899.       }
  900.  
  901.       if (this.tabChangeListener != null) {
  902.          this.tabPane.removeChangeListener(this.tabChangeListener);
  903.          this.tabChangeListener = null;
  904.       }
  905.  
  906.       if (this.propertyChangeListener != null) {
  907.          this.tabPane.removePropertyChangeListener(this.propertyChangeListener);
  908.          this.propertyChangeListener = null;
  909.       }
  910.  
  911.    }
  912.  
  913.    public void uninstallUI(JComponent var1) {
  914.       this.uninstallKeyboardActions();
  915.       this.uninstallListeners();
  916.       this.uninstallDefaults();
  917.       ((Container)var1).setLayout((LayoutManager)null);
  918.       this.tabPane = null;
  919.    }
  920. }
  921.