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 / BasicTabbedPaneUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  25.0 KB  |  1,312 lines

  1. package com.sun.java.swing.plaf.basic;
  2.  
  3. import com.sun.java.swing.Icon;
  4. import com.sun.java.swing.JComponent;
  5. import com.sun.java.swing.JTabbedPane;
  6. import com.sun.java.swing.KeyStroke;
  7. import com.sun.java.swing.LookAndFeel;
  8. import com.sun.java.swing.SwingConstants;
  9. import com.sun.java.swing.SwingUtilities;
  10. import com.sun.java.swing.UIManager;
  11. import com.sun.java.swing.event.ChangeEvent;
  12. import com.sun.java.swing.event.ChangeListener;
  13. import com.sun.java.swing.plaf.ComponentUI;
  14. import com.sun.java.swing.plaf.TabbedPaneUI;
  15. import java.awt.Color;
  16. import java.awt.Component;
  17. import java.awt.Container;
  18. import java.awt.Dimension;
  19. import java.awt.Font;
  20. import java.awt.FontMetrics;
  21. import java.awt.Graphics;
  22. import java.awt.Insets;
  23. import java.awt.LayoutManager;
  24. import java.awt.Rectangle;
  25. import java.awt.Toolkit;
  26. import java.awt.event.FocusListener;
  27. import java.awt.event.MouseListener;
  28. import java.io.Serializable;
  29. import java.util.EventObject;
  30.  
  31. public class BasicTabbedPaneUI extends TabbedPaneUI implements LayoutManager, ChangeListener, Serializable, SwingConstants {
  32.    protected static int spacingHeight = 2;
  33.    protected static int spacingWidth = 4;
  34.    protected static int iconSpacingWidth = 4;
  35.    protected static int selectedTabRaisePad = 3;
  36.    protected static int selectedTabWidenPad = 4;
  37.    protected static Insets contentBorderInsets = new Insets(2, 2, 3, 3);
  38.    protected static Insets tabsOnTopTabInsets = new Insets(3, 2, 0, 2);
  39.    protected static Insets tabsOnLeftTabInsets = new Insets(2, 3, 2, 0);
  40.    protected static Insets tabsOnBottomTabInsets = new Insets(0, 2, 3, 2);
  41.    protected static Insets tabsOnRightTabInsets = new Insets(2, 0, 2, 3);
  42.    protected int overlay = 2;
  43.    protected int xNudge;
  44.    protected int yNudge;
  45.    protected Color tabHighlight;
  46.    protected Color tabShadow;
  47.    protected Color tabDarkShadow;
  48.    protected Color focus;
  49.    protected int[] tabRuns = new int[10];
  50.    protected int runCount;
  51.    protected int selectedRun;
  52.    protected Rectangle[] rects = new Rectangle[0];
  53.    protected int maxTabHeight;
  54.    protected int maxTabWidth;
  55.    protected Component visibleComponent;
  56.    protected MouseListener mouseGetter;
  57.    protected FocusListener focusGetter;
  58.    protected ChangeListener tabChangeListener;
  59.  
  60.    public static ComponentUI createUI(JComponent var0) {
  61.       return new BasicTabbedPaneUI();
  62.    }
  63.  
  64.    public void installUI(JComponent var1) {
  65.       ((Container)var1).setLayout(this);
  66.       this.installDefaults(var1);
  67.       this.installListeners(var1);
  68.       this.installKeyboardActions(var1);
  69.    }
  70.  
  71.    public void uninstallUI(JComponent var1) {
  72.       this.uninstallKeyboardActions(var1);
  73.       this.uninstallListeners(var1);
  74.       this.uninstallDefaults(var1);
  75.       ((Container)var1).setLayout((LayoutManager)null);
  76.    }
  77.  
  78.    protected void installDefaults(JComponent var1) {
  79.       LookAndFeel.installColorsAndFont(var1, "TabbedPane.tabBackground", "TabbedPane.tabForeground", "TabbedPane.font");
  80.       this.tabHighlight = UIManager.getColor("TabbedPane.tabHighlight");
  81.       this.tabShadow = UIManager.getColor("TabbedPane.tabShadow");
  82.       this.tabDarkShadow = UIManager.getColor("TabbedPane.tabDarkShadow");
  83.       this.focus = UIManager.getColor("TabbedPane.focus");
  84.    }
  85.  
  86.    protected void uninstallDefaults(JComponent var1) {
  87.    }
  88.  
  89.    protected void installListeners(JComponent var1) {
  90.       if ((this.mouseGetter = this.createMouseListener(var1)) != null) {
  91.          ((Component)var1).addMouseListener(this.mouseGetter);
  92.       }
  93.  
  94.       if ((this.focusGetter = this.createFocusListener(var1)) != null) {
  95.          ((Component)var1).addFocusListener(this.focusGetter);
  96.       }
  97.  
  98.       if ((this.tabChangeListener = this.createChangeListener(var1)) != null) {
  99.          ((JTabbedPane)var1).addChangeListener(this.tabChangeListener);
  100.       }
  101.  
  102.    }
  103.  
  104.    protected void uninstallListeners(JComponent var1) {
  105.       if (this.mouseGetter != null) {
  106.          ((Component)var1).removeMouseListener(this.mouseGetter);
  107.          this.mouseGetter = null;
  108.       }
  109.  
  110.       if (this.focusGetter != null) {
  111.          ((Component)var1).removeFocusListener(this.focusGetter);
  112.          this.focusGetter = null;
  113.       }
  114.  
  115.       if (this.tabChangeListener != null) {
  116.          ((JTabbedPane)var1).removeChangeListener(this.tabChangeListener);
  117.       }
  118.  
  119.    }
  120.  
  121.    protected MouseListener createMouseListener(JComponent var1) {
  122.       return new MouseGetter(this);
  123.    }
  124.  
  125.    protected FocusListener createFocusListener(JComponent var1) {
  126.       return new FocusGetter(this);
  127.    }
  128.  
  129.    protected ChangeListener createChangeListener(JComponent var1) {
  130.       return this;
  131.    }
  132.  
  133.    protected void installKeyboardActions(JComponent var1) {
  134.       JTabbedPane var2 = (JTabbedPane)var1;
  135.       var1.registerKeyboardAction(new 1(var2, this), KeyStroke.getKeyStroke(39, 0), 0);
  136.       var1.registerKeyboardAction(new 2(var2, this), KeyStroke.getKeyStroke(37, 0), 0);
  137.       var1.registerKeyboardAction(new 3(var2, this), KeyStroke.getKeyStroke(38, 0), 0);
  138.       var1.registerKeyboardAction(new 4(var2, this), KeyStroke.getKeyStroke(40, 0), 0);
  139.    }
  140.  
  141.    protected void uninstallKeyboardActions(JComponent var1) {
  142.       var1.resetKeyboardActions();
  143.    }
  144.  
  145.    public void paint(Graphics var1, JComponent var2) {
  146.       JTabbedPane var3 = (JTabbedPane)var2;
  147.       int var4 = var3.getSelectedIndex();
  148.       int var5 = var3.getTabPlacement();
  149.       int var6 = var3.getTabCount();
  150.       if (var6 != this.rects.length) {
  151.          this.calculateLayoutInfo(var3);
  152.       }
  153.  
  154.       Rectangle var7 = new Rectangle();
  155.       Rectangle var8 = new Rectangle();
  156.       Rectangle var9 = var1.getClipBounds();
  157.       ((JComponent)var3).getInsets();
  158.  
  159.       for(int var10 = this.runCount - 1; var10 >= 0; --var10) {
  160.          int var11 = this.tabRuns[var10];
  161.          int var12 = this.tabRuns[var10 == this.runCount - 1 ? 0 : var10 + 1];
  162.          int var13 = var12 != 0 ? var12 - 1 : var6 - 1;
  163.  
  164.          for(int var14 = var11; var14 <= var13; ++var14) {
  165.             if (this.rects[var14].intersects(var9)) {
  166.                this.paintTab(var1, var3, var5, this.rects, var14, var7, var8);
  167.             }
  168.          }
  169.       }
  170.  
  171.       if (var4 >= 0 && this.getRunForTab(var3, var6, var4) == 0 && this.rects[var4].intersects(var9)) {
  172.          this.paintTab(var1, var3, var5, this.rects, var4, var7, var8);
  173.       }
  174.  
  175.       this.paintContentBorder(var1, var3, var5, var4);
  176.    }
  177.  
  178.    protected void paintTab(Graphics var1, JTabbedPane var2, int var3, Rectangle[] var4, int var5, Rectangle var6, Rectangle var7) {
  179.       Rectangle var8 = var4[var5];
  180.       int var9 = var2.getSelectedIndex();
  181.       boolean var10 = var9 == var5;
  182.       this.xNudge = this.calculateXNudge(var2, var3, var5, var10);
  183.       this.yNudge = this.calculateYNudge(var2, var3, var5, var10);
  184.       this.paintTabBackground(var1, var2, var3, var5, var8.x, var8.y, var8.width, var8.height, var10);
  185.       this.paintTabBorder(var1, var2, var3, var5, var8.x, var8.y, var8.width, var8.height, var10);
  186.       String var11 = var2.getTitleAt(var5);
  187.       Font var12 = ((Component)var2).getFont();
  188.       FontMetrics var13 = var1.getFontMetrics(var12);
  189.       Icon var14 = this.getIconForTab(var2, var5);
  190.       this.layoutLabel(var3, var13, var11, var14, var8, var6, var7, var10);
  191.       this.paintText(var1, var2, var3, var12, var13, var5, var11, var7, var10);
  192.       this.paintIcon(var1, var2, var3, var5, var14, var6, var10);
  193.       this.paintFocusIndicator(var1, var2, var3, var4, var5, var6, var7, var10);
  194.    }
  195.  
  196.    protected void layoutLabel(int var1, FontMetrics var2, String var3, Icon var4, Rectangle var5, Rectangle var6, Rectangle var7, boolean var8) {
  197.       var7.x = var7.y = var6.x = var6.y = 0;
  198.       SwingUtilities.layoutCompoundLabel(var2, var3, var4, 0, 0, 0, 4, var5, var6, var7, iconSpacingWidth);
  199.    }
  200.  
  201.    protected void paintIcon(Graphics var1, JTabbedPane var2, int var3, int var4, Icon var5, Rectangle var6, boolean var7) {
  202.       if (var5 != null) {
  203.          var5.paintIcon(var2, var1, var6.x + this.xNudge, var6.y + this.yNudge);
  204.       }
  205.  
  206.    }
  207.  
  208.    protected void paintText(Graphics var1, JTabbedPane var2, int var3, Font var4, FontMetrics var5, int var6, String var7, Rectangle var8, boolean var9) {
  209.       var1.setFont(var4);
  210.       if (var2.isEnabledAt(var6)) {
  211.          var1.setColor(var2.getForegroundAt(var6));
  212.          var1.drawString(var7, var8.x + this.xNudge, var8.y + var5.getAscent() + this.yNudge);
  213.       } else {
  214.          var1.setColor(var2.getBackgroundAt(var6).brighter());
  215.          var1.drawString(var7, var8.x + this.xNudge, var8.y + var5.getAscent() + this.yNudge);
  216.          var1.setColor(var2.getBackgroundAt(var6).darker());
  217.          var1.drawString(var7, var8.x + this.xNudge - 1, var8.y + var5.getAscent() + this.yNudge - 1);
  218.       }
  219.    }
  220.  
  221.    protected int calculateXNudge(JTabbedPane var1, int var2, int var3, boolean var4) {
  222.       Rectangle var5 = this.rects[var3];
  223.       int var6 = 0;
  224.       switch (var2) {
  225.          case 1:
  226.          case 3:
  227.          default:
  228.             var6 = var5.width % 2;
  229.             break;
  230.          case 2:
  231.             var6 = var4 ? -1 : 1;
  232.             break;
  233.          case 4:
  234.             var6 = var4 ? 1 : -1;
  235.       }
  236.  
  237.       return var6;
  238.    }
  239.  
  240.    protected int calculateYNudge(JTabbedPane var1, int var2, int var3, boolean var4) {
  241.       Rectangle var5 = this.rects[var3];
  242.       int var6 = 0;
  243.       switch (var2) {
  244.          case 1:
  245.          default:
  246.             var6 = var4 ? -1 : 1;
  247.             break;
  248.          case 2:
  249.          case 4:
  250.             var6 = var5.height % 2;
  251.             break;
  252.          case 3:
  253.             var6 = var4 ? 1 : -1;
  254.       }
  255.  
  256.       return var6;
  257.    }
  258.  
  259.    protected void paintFocusIndicator(Graphics var1, JTabbedPane var2, int var3, Rectangle[] var4, int var5, Rectangle var6, Rectangle var7, boolean var8) {
  260.       Rectangle var9 = var4[var5];
  261.       if (((JComponent)var2).hasFocus() && var8) {
  262.          var1.setColor(this.focus);
  263.          int var10;
  264.          int var11;
  265.          int var12;
  266.          int var13;
  267.          switch (var3) {
  268.             case 1:
  269.             default:
  270.                var10 = var9.x + 3;
  271.                var11 = var9.y + 3;
  272.                var12 = var9.width - 6;
  273.                var13 = var9.height - 5;
  274.                break;
  275.             case 2:
  276.                var10 = var9.x + 3;
  277.                var11 = var9.y + 3;
  278.                var12 = var9.width - 5;
  279.                var13 = var9.height - 6;
  280.                break;
  281.             case 3:
  282.                var10 = var9.x + 3;
  283.                var11 = var9.y + 2;
  284.                var12 = var9.width - 6;
  285.                var13 = var9.height - 5;
  286.                break;
  287.             case 4:
  288.                var10 = var9.x + 2;
  289.                var11 = var9.y + 3;
  290.                var12 = var9.width - 5;
  291.                var13 = var9.height - 6;
  292.          }
  293.  
  294.          BasicGraphicsUtils.drawDashedRect(var1, var10, var11, var12, var13);
  295.       }
  296.  
  297.    }
  298.  
  299.    Rectangle getFocusedTabBounds(JTabbedPane var1) {
  300.       if (this.rects.length != var1.getTabCount()) {
  301.          this.calculateLayoutInfo(var1);
  302.       }
  303.  
  304.       return this.rects[var1.getSelectedIndex()];
  305.    }
  306.  
  307.    protected void paintTabBorder(Graphics var1, JTabbedPane var2, int var3, int var4, int var5, int var6, int var7, int var8, boolean var9) {
  308.       var1.setColor(this.tabHighlight);
  309.       switch (var3) {
  310.          case 1:
  311.          default:
  312.             var1.drawLine(var5, var6 + 2, var5, var6 + var8 - 1);
  313.             var1.drawLine(var5 + 1, var6 + 1, var5 + 1, var6 + 1);
  314.             var1.drawLine(var5 + 2, var6, var5 + var7 - 3, var6);
  315.             var1.setColor(this.tabShadow);
  316.             var1.drawLine(var5 + var7 - 2, var6 + 2, var5 + var7 - 2, var6 + var8 - 1);
  317.             var1.setColor(this.tabDarkShadow);
  318.             var1.drawLine(var5 + var7 - 1, var6 + 2, var5 + var7 - 1, var6 + var8 - 1);
  319.             var1.drawLine(var5 + var7 - 2, var6 + 1, var5 + var7 - 2, var6 + 1);
  320.             return;
  321.          case 2:
  322.             var1.drawLine(var5 + 1, var6 + var8 - 2, var5 + 1, var6 + var8 - 2);
  323.             var1.drawLine(var5, var6 + 2, var5, var6 + var8 - 3);
  324.             var1.drawLine(var5 + 1, var6 + 1, var5 + 1, var6 + 1);
  325.             var1.drawLine(var5 + 2, var6, var5 + var7 - 1, var6);
  326.             var1.setColor(this.tabShadow);
  327.             var1.drawLine(var5 + 2, var6 + var8 - 2, var5 + var7 - 1, var6 + var8 - 2);
  328.             var1.setColor(this.tabDarkShadow);
  329.             var1.drawLine(var5 + 2, var6 + var8 - 1, var5 + var7 - 1, var6 + var8 - 1);
  330.             return;
  331.          case 3:
  332.             var1.drawLine(var5, var6, var5, var6 + var8 - 3);
  333.             var1.drawLine(var5 + 1, var6 + var8 - 2, var5 + 1, var6 + var8 - 2);
  334.             var1.setColor(this.tabShadow);
  335.             var1.drawLine(var5 + 2, var6 + var8 - 2, var5 + var7 - 3, var6 + var8 - 2);
  336.             var1.drawLine(var5 + var7 - 2, var6, var5 + var7 - 2, var6 + var8 - 3);
  337.             var1.setColor(this.tabDarkShadow);
  338.             var1.drawLine(var5 + 2, var6 + var8 - 1, var5 + var7 - 3, var6 + var8 - 1);
  339.             var1.drawLine(var5 + var7 - 2, var6 + var8 - 2, var5 + var7 - 2, var6 + var8 - 2);
  340.             var1.drawLine(var5 + var7 - 1, var6, var5 + var7 - 1, var6 + var8 - 3);
  341.             return;
  342.          case 4:
  343.             var1.drawLine(var5, var6, var5 + var7 - 3, var6);
  344.             var1.setColor(this.tabShadow);
  345.             var1.drawLine(var5, var6 + var8 - 2, var5 + var7 - 3, var6 + var8 - 2);
  346.             var1.drawLine(var5 + var7 - 2, var6 + 2, var5 + var7 - 2, var6 + var8 - 3);
  347.             var1.setColor(this.tabDarkShadow);
  348.             var1.drawLine(var5 + var7 - 2, var6 + 1, var5 + var7 - 2, var6 + 1);
  349.             var1.drawLine(var5 + var7 - 2, var6 + var8 - 2, var5 + var7 - 2, var6 + var8 - 2);
  350.             var1.drawLine(var5 + var7 - 1, var6 + 2, var5 + var7 - 1, var6 + var8 - 3);
  351.             var1.drawLine(var5, var6 + var8 - 1, var5 + var7 - 3, var6 + var8 - 1);
  352.       }
  353.    }
  354.  
  355.    protected void paintTabBackground(Graphics var1, JTabbedPane var2, int var3, int var4, int var5, int var6, int var7, int var8, boolean var9) {
  356.       var1.setColor(var2.getBackgroundAt(var4));
  357.       switch (var3) {
  358.          case 1:
  359.          default:
  360.             var1.fillRect(var5 + 1, var6 + 1, var7 - 3, var8 - 1);
  361.             return;
  362.          case 2:
  363.             var1.fillRect(var5 + 1, var6 + 1, var7 - 2, var8 - 3);
  364.             return;
  365.          case 3:
  366.             var1.fillRect(var5 + 1, var6, var7 - 3, var8 - 1);
  367.             return;
  368.          case 4:
  369.             var1.fillRect(var5, var6 + 1, var7 - 2, var8 - 3);
  370.       }
  371.    }
  372.  
  373.    protected void paintContentBorder(Graphics var1, JTabbedPane var2, int var3, int var4) {
  374.       Rectangle var5 = ((Component)var2).getBounds();
  375.       Insets var6 = ((JComponent)var2).getInsets();
  376.       int var7 = var5.height - (var6.top + var6.bottom);
  377.       int var8 = var5.width - (var6.left + var6.right);
  378.       int var9 = 0;
  379.       int var10 = 0;
  380.       int var11 = var8;
  381.       int var12 = var7;
  382.       switch (var3) {
  383.          case 1:
  384.          default:
  385.             var10 = this.totalTabHeight(var2, var3, this.runCount);
  386.             var12 = var7 - var10;
  387.             break;
  388.          case 2:
  389.             var9 = this.totalTabWidth(var2, var3, this.runCount);
  390.             var11 = var8 - var9;
  391.             break;
  392.          case 3:
  393.             var12 = var7 - this.totalTabHeight(var2, var3, this.runCount);
  394.             break;
  395.          case 4:
  396.             var11 = var8 - this.totalTabWidth(var2, var3, this.runCount);
  397.       }
  398.  
  399.       this.paintContentBorderTopEdge(var1, var3, var4, var9, var10, var11, var12);
  400.       this.paintContentBorderLeftEdge(var1, var3, var4, var9, var10, var11, var12);
  401.       this.paintContentBorderBottomEdge(var1, var3, var4, var9, var10, var11, var12);
  402.       this.paintContentBorderRightEdge(var1, var3, var4, var9, var10, var11, var12);
  403.    }
  404.  
  405.    protected void paintContentBorderTopEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  406.       var1.setColor(this.tabHighlight);
  407.       if (var2 == 1 && var3 >= 0 && this.rects[var3].y + this.rects[var3].height + 1 >= var5) {
  408.          Rectangle var8 = this.rects[var3];
  409.          var1.drawLine(var4, var5, var8.x - 1, var5);
  410.          if (var8.x + var8.width < var4 + var6 - 2) {
  411.             var1.drawLine(var8.x + var8.width, var5, var4 + var6 - 2, var5);
  412.          } else {
  413.             var1.setColor(this.tabShadow);
  414.             var1.drawLine(var4 + var6 - 2, var5, var4 + var6 - 2, var5);
  415.          }
  416.       } else {
  417.          var1.drawLine(var4, var5, var4 + var6 - 2, var5);
  418.       }
  419.    }
  420.  
  421.    protected void paintContentBorderLeftEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  422.       var1.setColor(this.tabHighlight);
  423.       if (var2 == 2 && var3 >= 0 && this.rects[var3].x + this.rects[var3].width + 1 >= var4) {
  424.          Rectangle var8 = this.rects[var3];
  425.          var1.drawLine(var4, var5, var4, var8.y - 1);
  426.          if (var8.y + var8.height < var5 + var7 - 2) {
  427.             var1.drawLine(var4, var8.y + var8.height, var4, var5 + var7 - 2);
  428.          }
  429.  
  430.       } else {
  431.          var1.drawLine(var4, var5, var4, var5 + var7 - 2);
  432.       }
  433.    }
  434.  
  435.    protected void paintContentBorderBottomEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  436.       var1.setColor(this.tabShadow);
  437.       if (var2 == 3 && var3 >= 0 && this.rects[var3].y - 1 <= var7) {
  438.          Rectangle var8 = this.rects[var3];
  439.          var1.drawLine(var4 + 1, var5 + var7 - 2, var8.x - 1, var5 + var7 - 2);
  440.          var1.setColor(this.tabDarkShadow);
  441.          var1.drawLine(var4, var5 + var7 - 1, var8.x - 1, var5 + var7 - 1);
  442.          if (var8.x + var8.width < var4 + var6 - 2) {
  443.             var1.setColor(this.tabShadow);
  444.             var1.drawLine(var8.x + var8.width, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  445.             var1.setColor(this.tabDarkShadow);
  446.             var1.drawLine(var8.x + var8.width, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  447.          }
  448.  
  449.       } else {
  450.          var1.drawLine(var4 + 1, var5 + var7 - 2, var4 + var6 - 2, var5 + var7 - 2);
  451.          var1.setColor(this.tabDarkShadow);
  452.          var1.drawLine(var4, var5 + var7 - 1, var4 + var6 - 1, var5 + var7 - 1);
  453.       }
  454.    }
  455.  
  456.    protected void paintContentBorderRightEdge(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  457.       var1.setColor(this.tabShadow);
  458.       if (var2 == 4 && var3 >= 0 && this.rects[var3].x - 1 <= var6) {
  459.          Rectangle var8 = this.rects[var3];
  460.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var8.y - 1);
  461.          var1.setColor(this.tabDarkShadow);
  462.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var8.y - 1);
  463.          if (var8.y + var8.height < var5 + var7 - 2) {
  464.             var1.setColor(this.tabShadow);
  465.             var1.drawLine(var4 + var6 - 2, var8.y + var8.height, var4 + var6 - 2, var5 + var7 - 2);
  466.             var1.setColor(this.tabDarkShadow);
  467.             var1.drawLine(var4 + var6 - 1, var8.y + var8.height, var4 + var6 - 1, var5 + var7 - 2);
  468.          }
  469.  
  470.       } else {
  471.          var1.drawLine(var4 + var6 - 2, var5 + 1, var4 + var6 - 2, var5 + var7 - 3);
  472.          var1.setColor(this.tabDarkShadow);
  473.          var1.drawLine(var4 + var6 - 1, var5, var4 + var6 - 1, var5 + var7 - 1);
  474.       }
  475.    }
  476.  
  477.    public Dimension getPreferredSize(JComponent var1) {
  478.       JTabbedPane var2 = (JTabbedPane)var1;
  479.       return this.calculateSize(var2, var2.getTabPlacement(), false);
  480.    }
  481.  
  482.    public Dimension getMinimumSize(JComponent var1) {
  483.       JTabbedPane var2 = (JTabbedPane)var1;
  484.       return this.calculateSize(var2, var2.getTabPlacement(), true);
  485.    }
  486.  
  487.    protected Dimension calculateSize(JTabbedPane var1, int var2, boolean var3) {
  488.       Insets var4 = ((JComponent)var1).getInsets();
  489.       Insets var5 = this.getContentBorderInsets(var1, var2);
  490.       Dimension var6 = new Dimension(0, 0);
  491.       int var7 = var5.top + var5.bottom;
  492.       int var8 = var5.left + var5.right;
  493.       int var9 = 0;
  494.       int var10 = 0;
  495.  
  496.       for(int var11 = 0; var11 < var1.getTabCount(); ++var11) {
  497.          Component var12 = var1.getComponentAt(var11);
  498.          if (var12 instanceof JComponent) {
  499.             if (var12.getFont() == null) {
  500.                var12.setFont(((Component)var1).getFont());
  501.             }
  502.  
  503.             Dimension var13 = var3 ? var12.getMinimumSize() : var12.getPreferredSize();
  504.             if (var13 != null) {
  505.                var10 = Math.max(var13.height, var10);
  506.                var9 = Math.max(var13.width, var9);
  507.             }
  508.          }
  509.       }
  510.  
  511.       var8 += var9;
  512.       var7 += var10;
  513.       int var16 = 0;
  514.       switch (var2) {
  515.          case 1:
  516.          case 3:
  517.          default:
  518.             var16 = this.preferredTotalTabHeight(var1, var2, this.getMetrics(var1), var8);
  519.             var7 += var16;
  520.             break;
  521.          case 2:
  522.          case 4:
  523.             var16 = this.preferredTotalTabWidth(var1, var2, this.getMetrics(var1), var7);
  524.             var8 += var16;
  525.       }
  526.  
  527.       return new Dimension(var8 + var4.left + var4.right, var7 + var4.bottom + var4.top);
  528.    }
  529.  
  530.    public Dimension getMaximumSize(JComponent var1) {
  531.       return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
  532.    }
  533.  
  534.    public void addLayoutComponent(String var1, Component var2) {
  535.    }
  536.  
  537.    public void removeLayoutComponent(Component var1) {
  538.    }
  539.  
  540.    public Dimension preferredLayoutSize(Container var1) {
  541.       return new Dimension(((Component)var1).getBounds().width, ((Component)var1).getBounds().height);
  542.    }
  543.  
  544.    public Dimension minimumLayoutSize(Container var1) {
  545.       return new Dimension(0, 0);
  546.    }
  547.  
  548.    public void layoutContainer(Container var1) {
  549.       JTabbedPane var2 = (JTabbedPane)var1;
  550.       this.layoutTabbedPane(var2, var2.getTabPlacement());
  551.    }
  552.  
  553.    protected void layoutTabbedPane(JTabbedPane var1, int var2) {
  554.       Insets var3 = ((JComponent)var1).getInsets();
  555.       Insets var4 = this.getContentBorderInsets(var1, var2);
  556.       int var5 = var1.getSelectedIndex();
  557.       if (var5 < 0) {
  558.          if (this.visibleComponent != null) {
  559.             this.setVisibleComponent(var1, (Component)null);
  560.             return;
  561.          }
  562.       } else {
  563.          int var10 = 0;
  564.          int var11 = 0;
  565.          Component var12 = var1.getComponentAt(var5);
  566.          boolean var13 = false;
  567.          if (var12 != null) {
  568.             if (var12.getParent() == null && this.visibleComponent != null && SwingUtilities.findFocusOwner(this.visibleComponent) != null) {
  569.                var13 = true;
  570.             }
  571.  
  572.             this.calculateLayoutInfo(var1);
  573.             Rectangle var14 = ((Component)var1).getBounds();
  574.             this.setVisibleComponent(var1, var12);
  575.             int var6;
  576.             int var7;
  577.             switch (var2) {
  578.                case 1:
  579.                default:
  580.                   var11 = this.totalTabHeight(var1, var2, this.runCount);
  581.                   var6 = var3.left + var4.left;
  582.                   var7 = var3.top + var11 + var4.top;
  583.                   break;
  584.                case 2:
  585.                   var10 = this.totalTabWidth(var1, var2, this.runCount);
  586.                   var6 = var3.left + var10 + var4.left;
  587.                   var7 = var3.top + var4.top;
  588.                   break;
  589.                case 3:
  590.                   var11 = this.totalTabHeight(var1, var2, this.runCount);
  591.                   var6 = var3.left + var4.left;
  592.                   var7 = var3.top + var4.top;
  593.                   break;
  594.                case 4:
  595.                   var10 = this.totalTabWidth(var1, var2, this.runCount);
  596.                   var6 = var3.left + var4.left;
  597.                   var7 = var3.top + var4.top;
  598.             }
  599.  
  600.             int var8 = var14.width - var10 - var3.left - var3.right - var4.left - var4.right;
  601.             int var9 = var14.height - var11 - var3.top - var3.bottom - var4.top - var4.bottom;
  602.             var12.setBounds(var6, var7, var8, var9);
  603.             var12.validate();
  604.             if (var13) {
  605.                if (var12.isFocusTraversable()) {
  606.                   var12.requestFocus();
  607.                   var13 = false;
  608.                } else if (var12 instanceof JComponent && ((JComponent)var12).requestDefaultFocus()) {
  609.                   var13 = false;
  610.                }
  611.  
  612.                if (var13) {
  613.                   ((JComponent)var1).requestFocus();
  614.                }
  615.             }
  616.          }
  617.       }
  618.  
  619.    }
  620.  
  621.    public void stateChanged(ChangeEvent var1) {
  622.       JTabbedPane var2 = (JTabbedPane)((EventObject)var1).getSource();
  623.       ((Container)var2).doLayout();
  624.       ((Component)var2).repaint();
  625.    }
  626.  
  627.    protected Component getVisibleComponent(JTabbedPane var1) {
  628.       int var2 = var1.getTabCount();
  629.  
  630.       while(var2-- > 0) {
  631.          Component var3 = var1.getComponentAt(var2);
  632.          if (var3 != null && var3.getParent() == var1) {
  633.             return var3;
  634.          }
  635.       }
  636.  
  637.       return null;
  638.    }
  639.  
  640.    protected void setVisibleComponent(JTabbedPane var1, Component var2) {
  641.       if (this.visibleComponent != var2) {
  642.          if (this.visibleComponent != null) {
  643.             ((Container)var1).remove(this.visibleComponent);
  644.          }
  645.  
  646.          if (var2 != null) {
  647.             ((Container)var1).add(var2);
  648.          }
  649.  
  650.          this.visibleComponent = var2;
  651.       }
  652.    }
  653.  
  654.    protected void calculateLayoutInfo(JTabbedPane var1) {
  655.       this.calculateLayoutInfo(var1, var1.getTabPlacement());
  656.    }
  657.  
  658.    protected void calculateLayoutInfo(JTabbedPane var1, int var2) {
  659.       Font var3 = ((Component)var1).getFont();
  660.       int var4 = var1.getTabCount();
  661.       int var5 = var1.getSelectedIndex();
  662.       this.assureRectsCreated(var4);
  663.       this.arrangeTabs(var1, var2, var4, var3);
  664.       this.padSelectedTab(var1, var2, var5);
  665.    }
  666.  
  667.    protected void assureRectsCreated(int var1) {
  668.       int var2 = this.rects.length;
  669.       if (var1 != var2) {
  670.          Rectangle[] var3 = new Rectangle[var1];
  671.          System.arraycopy(this.rects, 0, var3, 0, Math.min(var2, var1));
  672.          this.rects = var3;
  673.  
  674.          for(int var4 = var2; var4 < var1; ++var4) {
  675.             this.rects[var4] = new Rectangle();
  676.          }
  677.       }
  678.  
  679.    }
  680.  
  681.    protected void expandTabRunsArray() {
  682.       int var1 = this.tabRuns.length;
  683.       int[] var2 = new int[var1 + 10];
  684.       System.arraycopy(this.tabRuns, 0, var2, 0, this.runCount);
  685.       this.tabRuns = var2;
  686.    }
  687.  
  688.    protected void arrangeTabs(JTabbedPane var1, int var2, int var3, Font var4) {
  689.       FontMetrics var5 = Toolkit.getDefaultToolkit().getFontMetrics(var4);
  690.       Dimension var6 = ((Component)var1).getSize();
  691.       Insets var7 = ((JComponent)var1).getInsets();
  692.       Insets var8 = this.getTabAreaInsets(var1, var2);
  693.       int var9 = var5.getHeight();
  694.       int var10 = var1.getSelectedIndex();
  695.       boolean var17 = var2 == 2 || var2 == 4;
  696.       int var14;
  697.       int var15;
  698.       int var16;
  699.       switch (var2) {
  700.          case 1:
  701.          default:
  702.             this.maxTabHeight = this.maxTabHeight(var1, var5);
  703.             var14 = var7.left + var8.left;
  704.             var15 = var7.top + var8.top;
  705.             var16 = var6.width - (var7.right + var8.right);
  706.             break;
  707.          case 2:
  708.             this.maxTabWidth = this.maxTabWidth(var1, var5);
  709.             var14 = var7.left + var8.left;
  710.             var15 = var7.top + var8.top;
  711.             var16 = var6.height - (var7.bottom + var8.bottom);
  712.             break;
  713.          case 3:
  714.             this.maxTabHeight = this.maxTabHeight(var1, var5);
  715.             var14 = var7.left + var8.left;
  716.             var15 = var6.height - var7.bottom - var8.bottom - this.maxTabHeight;
  717.             var16 = var6.width - (var7.right + var8.right);
  718.             break;
  719.          case 4:
  720.             this.maxTabWidth = this.maxTabWidth(var1, var5);
  721.             var14 = var6.width - var7.right - var8.right - this.maxTabWidth;
  722.             var15 = var7.top + var8.top;
  723.             var16 = var6.height - (var7.bottom + var8.bottom);
  724.       }
  725.  
  726.       int var11 = this.getTabOverlay(var1, var2);
  727.       this.runCount = 0;
  728.       this.selectedRun = -1;
  729.  
  730.       for(int var12 = 0; var12 < var3; ++var12) {
  731.          Rectangle var18 = this.rects[var12];
  732.          if (!var17) {
  733.             if (var12 > 0) {
  734.                var18.x = this.rects[var12 - 1].x + this.rects[var12 - 1].width;
  735.             } else {
  736.                this.tabRuns[0] = 0;
  737.                this.runCount = 1;
  738.                this.maxTabWidth = 0;
  739.                var18.x = var14;
  740.             }
  741.  
  742.             var18.width = this.tabWidth(var1, var12, var5);
  743.             this.maxTabWidth = Math.max(this.maxTabWidth, var18.width);
  744.             if (var18.x != 2 + var7.left && var18.x + var18.width > var16) {
  745.                if (this.runCount > this.tabRuns.length - 1) {
  746.                   this.expandTabRunsArray();
  747.                }
  748.  
  749.                this.tabRuns[this.runCount] = var12;
  750.                ++this.runCount;
  751.                var18.x = var14;
  752.             }
  753.  
  754.             var18.y = var15;
  755.             var18.height = this.maxTabHeight;
  756.          } else {
  757.             if (var12 > 0) {
  758.                var18.y = this.rects[var12 - 1].y + this.rects[var12 - 1].height;
  759.             } else {
  760.                this.tabRuns[0] = 0;
  761.                this.runCount = 1;
  762.                this.maxTabHeight = 0;
  763.                var18.y = var15;
  764.             }
  765.  
  766.             var18.height = this.tabHeight(var1, var12, var9);
  767.             this.maxTabHeight = Math.max(this.maxTabHeight, var18.height);
  768.             if (var18.y != 2 + var7.top && var18.y + var18.height > var16) {
  769.                if (this.runCount > this.tabRuns.length - 1) {
  770.                   this.expandTabRunsArray();
  771.                }
  772.  
  773.                this.tabRuns[this.runCount] = var12;
  774.                ++this.runCount;
  775.                var18.y = var15;
  776.             }
  777.  
  778.             var18.x = var14;
  779.             var18.width = this.maxTabWidth;
  780.          }
  781.  
  782.          if (var12 == var10) {
  783.             this.selectedRun = this.runCount - 1;
  784.          }
  785.       }
  786.  
  787.       if (this.runCount > 1) {
  788.          this.normalizeTabRuns(var1, var2, var3, var17 ? var15 : var14, var16);
  789.          this.selectedRun = this.getRunForTab(var1, var3, var10);
  790.          this.rotateTabRuns(var1, var2, this.selectedRun);
  791.       }
  792.  
  793.       for(int var22 = this.runCount - 1; var22 >= 0; --var22) {
  794.          int var19 = this.tabRuns[var22];
  795.          int var20 = this.tabRuns[var22 == this.runCount - 1 ? 0 : var22 + 1];
  796.          int var21 = var20 != 0 ? var20 - 1 : var3 - 1;
  797.          if (!var17) {
  798.             for(int var23 = var19; var23 <= var21; ++var23) {
  799.                Rectangle var25 = this.rects[var23];
  800.                var25.y = var15;
  801.                var25.x += this.getRunIndent(var1, var2, var22);
  802.             }
  803.  
  804.             if (this.shouldPadRun(var1, var2, var22)) {
  805.                this.padRun(var1, var2, var19, var21, var16);
  806.             }
  807.  
  808.             if (var2 == 3) {
  809.                var15 -= this.maxTabHeight - var11;
  810.             } else {
  811.                var15 += this.maxTabHeight - var11;
  812.             }
  813.          } else {
  814.             for(int var13 = var19; var13 <= var21; ++var13) {
  815.                Rectangle var24 = this.rects[var13];
  816.                var24.x = var14;
  817.                var24.y += this.getRunIndent(var1, var2, var22);
  818.             }
  819.  
  820.             if (this.shouldPadRun(var1, var2, var22)) {
  821.                this.padRun(var1, var2, var19, var21, var16);
  822.             }
  823.  
  824.             if (var2 == 4) {
  825.                var14 -= this.maxTabWidth - var11;
  826.             } else {
  827.                var14 += this.maxTabWidth - var11;
  828.             }
  829.          }
  830.       }
  831.  
  832.    }
  833.  
  834.    protected int getTabOverlay(JTabbedPane var1, int var2) {
  835.       return this.overlay;
  836.    }
  837.  
  838.    protected int getRunForTab(JTabbedPane var1, int var2, int var3) {
  839.       for(int var4 = 0; var4 < this.runCount; ++var4) {
  840.          int var5 = this.tabRuns[var4];
  841.          int var6 = this.lastIndexInRun(var4, var2);
  842.          if (var3 >= var5 && var3 <= var6) {
  843.             return var4;
  844.          }
  845.       }
  846.  
  847.       return 0;
  848.    }
  849.  
  850.    protected void rotateTabRuns(JTabbedPane var1, int var2, int var3) {
  851.       for(int var4 = 0; var4 < var3; ++var4) {
  852.          int var5 = this.tabRuns[0];
  853.  
  854.          for(int var6 = 1; var6 < this.runCount; ++var6) {
  855.             this.tabRuns[var6 - 1] = this.tabRuns[var6];
  856.          }
  857.  
  858.          this.tabRuns[this.runCount - 1] = var5;
  859.       }
  860.  
  861.    }
  862.  
  863.    protected int getRunIndent(JTabbedPane var1, int var2, int var3) {
  864.       return 0;
  865.    }
  866.  
  867.    protected void normalizeTabRuns(JTabbedPane var1, int var2, int var3, int var4, int var5) {
  868.       boolean var6 = var2 == 2 || var2 == 4;
  869.       int var7 = this.runCount - 1;
  870.       boolean var8 = true;
  871.       double var9 = (double)1.25F;
  872.  
  873.       while(var8) {
  874.          int var11 = this.lastIndexInRun(var7, var3);
  875.          int var12 = this.lastIndexInRun(var7 - 1, var3);
  876.          int var13;
  877.          int var14;
  878.          if (!var6) {
  879.             var13 = this.rects[var11].x + this.rects[var11].width;
  880.             var14 = (int)((double)this.maxTabWidth * var9);
  881.          } else {
  882.             var13 = this.rects[var11].y + this.rects[var11].height;
  883.             var14 = (int)((double)this.maxTabHeight * var9 * (double)2.0F);
  884.          }
  885.  
  886.          if (var5 - var13 > var14) {
  887.             this.tabRuns[var7] = var12;
  888.             if (!var6) {
  889.                this.rects[var12].x = var4;
  890.             } else {
  891.                this.rects[var12].y = var4;
  892.             }
  893.  
  894.             for(int var15 = var12 + 1; var15 <= var11; ++var15) {
  895.                if (!var6) {
  896.                   this.rects[var15].x = this.rects[var15 - 1].x + this.rects[var15 - 1].width;
  897.                } else {
  898.                   this.rects[var15].y = this.rects[var15 - 1].y + this.rects[var15 - 1].height;
  899.                }
  900.             }
  901.          } else if (var7 == this.runCount - 1) {
  902.             var8 = false;
  903.          }
  904.  
  905.          if (var7 - 1 > 0) {
  906.             --var7;
  907.          } else {
  908.             var7 = this.runCount - 1;
  909.             var9 += (double)0.25F;
  910.          }
  911.       }
  912.  
  913.    }
  914.  
  915.    protected int lastIndexInRun(int var1, int var2) {
  916.       if (this.runCount == 1) {
  917.          return var2 - 1;
  918.       } else {
  919.          int var3 = var1 == this.runCount - 1 ? 0 : var1 + 1;
  920.          return this.tabRuns[var3] == 0 ? var2 - 1 : this.tabRuns[var3] - 1;
  921.       }
  922.    }
  923.  
  924.    protected boolean shouldPadRun(JTabbedPane var1, int var2, int var3) {
  925.       return this.runCount > 1;
  926.    }
  927.  
  928.    protected void padRun(JTabbedPane var1, int var2, int var3, int var4, int var5) {
  929.       Rectangle var6 = this.rects[var4];
  930.       if (var2 != 1 && var2 != 3) {
  931.          int var12 = var6.y + var6.height - this.rects[var3].y;
  932.          int var13 = var5 - (var6.y + var6.height);
  933.          float var14 = (float)var13 / (float)var12;
  934.  
  935.          for(int var15 = var3; var15 <= var4; ++var15) {
  936.             Rectangle var16 = this.rects[var15];
  937.             if (var15 > var3) {
  938.                var16.y = this.rects[var15 - 1].y + this.rects[var15 - 1].height;
  939.             }
  940.  
  941.             var16.height += Math.round((float)var16.height * var14);
  942.          }
  943.  
  944.          var6.height = var5 - var6.y;
  945.       } else {
  946.          int var7 = var6.x + var6.width - this.rects[var3].x;
  947.          int var8 = var5 - (var6.x + var6.width);
  948.          float var9 = (float)var8 / (float)var7;
  949.  
  950.          for(int var10 = var3; var10 <= var4; ++var10) {
  951.             Rectangle var11 = this.rects[var10];
  952.             if (var10 > var3) {
  953.                var11.x = this.rects[var10 - 1].x + this.rects[var10 - 1].width;
  954.             }
  955.  
  956.             var11.width += Math.round((float)var11.width * var9);
  957.          }
  958.  
  959.          var6.width = var5 - var6.x;
  960.       }
  961.    }
  962.  
  963.    protected void padSelectedTab(JTabbedPane var1, int var2, int var3) {
  964.       if (var3 >= 0) {
  965.          Rectangle var4 = this.rects[var3];
  966.          switch (var2) {
  967.             case 1:
  968.             default:
  969.                var4.y -= selectedTabRaisePad - 1;
  970.                var4.height += selectedTabRaisePad;
  971.                var4.x -= selectedTabWidenPad / 2;
  972.                var4.width += selectedTabWidenPad;
  973.                break;
  974.             case 2:
  975.                var4.x -= selectedTabRaisePad - 1;
  976.                var4.width += selectedTabRaisePad;
  977.                var4.y -= selectedTabWidenPad / 2;
  978.                var4.height += selectedTabWidenPad;
  979.                return;
  980.             case 3:
  981.                --var4.y;
  982.                var4.height += selectedTabRaisePad;
  983.                var4.x -= selectedTabWidenPad / 2;
  984.                var4.width += selectedTabWidenPad;
  985.                return;
  986.             case 4:
  987.                --var4.x;
  988.                var4.width += selectedTabRaisePad;
  989.                var4.y -= selectedTabWidenPad / 2;
  990.                var4.height += selectedTabWidenPad;
  991.                return;
  992.          }
  993.       }
  994.  
  995.    }
  996.  
  997.    protected int tabHeight(JTabbedPane var1, int var2, int var3) {
  998.       int var4 = var3;
  999.       Icon var5 = this.getIconForTab(var1, var2);
  1000.       if (var5 != null) {
  1001.          var4 = Math.max(var3, var5.getIconHeight());
  1002.       }
  1003.  
  1004.       var4 += 2 * spacingHeight + 2;
  1005.       return var4;
  1006.    }
  1007.  
  1008.    protected int maxTabHeight(JTabbedPane var1) {
  1009.       return this.maxTabHeight(var1, this.getMetrics(var1));
  1010.    }
  1011.  
  1012.    protected int maxTabHeight(JTabbedPane var1, FontMetrics var2) {
  1013.       int var3 = var1.getTabCount();
  1014.       int var4 = 0;
  1015.       int var5 = var2.getHeight();
  1016.  
  1017.       for(int var6 = 0; var6 < var3; ++var6) {
  1018.          var4 = Math.max(this.tabHeight(var1, var6, var5), var4);
  1019.       }
  1020.  
  1021.       return var4;
  1022.    }
  1023.  
  1024.    protected int tabWidth(JTabbedPane var1, int var2, FontMetrics var3) {
  1025.       String var4 = var1.getTitleAt(var2);
  1026.       Icon var5 = this.getIconForTab(var1, var2);
  1027.       int var6 = 2 * spacingWidth + 3;
  1028.       if (var5 != null) {
  1029.          var6 += var5.getIconWidth() + iconSpacingWidth;
  1030.       }
  1031.  
  1032.       var6 += var3.stringWidth(var4);
  1033.       return var6;
  1034.    }
  1035.  
  1036.    protected int maxTabWidth(JTabbedPane var1) {
  1037.       return this.maxTabWidth(var1, this.getMetrics(var1));
  1038.    }
  1039.  
  1040.    protected int maxTabWidth(JTabbedPane var1, FontMetrics var2) {
  1041.       int var3 = var1.getTabCount();
  1042.       int var4 = 0;
  1043.  
  1044.       for(int var5 = 0; var5 < var3; ++var5) {
  1045.          var4 = Math.max(this.tabWidth(var1, var5, var2), var4);
  1046.       }
  1047.  
  1048.       return var4;
  1049.    }
  1050.  
  1051.    protected Icon getIconForTab(JTabbedPane var1, int var2) {
  1052.       return !var1.isEnabledAt(var2) && var1.getDisabledIconAt(var2) != null ? var1.getDisabledIconAt(var2) : var1.getIconAt(var2);
  1053.    }
  1054.  
  1055.    protected Insets getContentBorderInsets(JTabbedPane var1, int var2) {
  1056.       return contentBorderInsets;
  1057.    }
  1058.  
  1059.    protected Insets getTabAreaInsets(JTabbedPane var1, int var2) {
  1060.       Insets var3;
  1061.       switch (var2) {
  1062.          case 1:
  1063.          default:
  1064.             var3 = tabsOnTopTabInsets;
  1065.             break;
  1066.          case 2:
  1067.             var3 = tabsOnLeftTabInsets;
  1068.             break;
  1069.          case 3:
  1070.             var3 = tabsOnBottomTabInsets;
  1071.             break;
  1072.          case 4:
  1073.             var3 = tabsOnRightTabInsets;
  1074.       }
  1075.  
  1076.       return var3;
  1077.    }
  1078.  
  1079.    protected FontMetrics getMetrics(JTabbedPane var1) {
  1080.       Font var2 = ((Component)var1).getFont();
  1081.       return Toolkit.getDefaultToolkit().getFontMetrics(var2);
  1082.    }
  1083.  
  1084.    public Rectangle getTabBounds(JTabbedPane var1, int var2) {
  1085.       this.calculateLayoutInfo(var1);
  1086.       return this.rects[var2];
  1087.    }
  1088.  
  1089.    public int getTabRunCount(JTabbedPane var1) {
  1090.       return this.runCount;
  1091.    }
  1092.  
  1093.    protected int totalTabHeight(JTabbedPane var1, int var2, int var3) {
  1094.       Insets var4 = this.getTabAreaInsets(var1, var2);
  1095.       int var5 = this.getTabOverlay(var1, var2);
  1096.       return var3 * (this.maxTabHeight - var5) + var5 + var4.top + var4.bottom;
  1097.    }
  1098.  
  1099.    protected int totalTabWidth(JTabbedPane var1, int var2, int var3) {
  1100.       Insets var4 = this.getTabAreaInsets(var1, var2);
  1101.       int var5 = this.getTabOverlay(var1, var2);
  1102.       return var3 * (this.maxTabWidth - var5) + var5 + var4.left + var4.right;
  1103.    }
  1104.  
  1105.    protected int preferredTotalTabHeight(JTabbedPane var1, int var2, FontMetrics var3, int var4) {
  1106.       int var5 = var1.getTabCount();
  1107.       int var6 = 0;
  1108.       if (var5 > 0) {
  1109.          int var7 = 1;
  1110.          byte var8 = 0;
  1111.          this.maxTabHeight = this.maxTabHeight(var1, var3);
  1112.  
  1113.          for(int var9 = 0; var9 < var5; ++var9) {
  1114.             int var10 = this.tabWidth(var1, var9, var3);
  1115.             if (var8 != 0 && var8 + var10 > var4) {
  1116.                ++var7;
  1117.                var8 = 0;
  1118.             }
  1119.          }
  1120.  
  1121.          var6 = this.totalTabHeight(var1, var2, var7);
  1122.       }
  1123.  
  1124.       return var6;
  1125.    }
  1126.  
  1127.    protected int preferredTotalTabWidth(JTabbedPane var1, int var2, FontMetrics var3, int var4) {
  1128.       int var5 = var1.getTabCount();
  1129.       int var6 = 0;
  1130.       if (var5 > 0) {
  1131.          int var7 = 1;
  1132.          byte var8 = 0;
  1133.          int var9 = var3.getHeight();
  1134.          this.maxTabWidth = this.maxTabWidth(var1, var3);
  1135.  
  1136.          for(int var10 = 0; var10 < var5; ++var10) {
  1137.             int var11 = this.tabHeight(var1, var10, var9);
  1138.             if (var8 != 0 && var8 + var11 > var4) {
  1139.                ++var7;
  1140.                var8 = 0;
  1141.             }
  1142.          }
  1143.  
  1144.          var6 = this.totalTabWidth(var1, var2, var7);
  1145.       }
  1146.  
  1147.       return var6;
  1148.    }
  1149.  
  1150.    protected void navigateSelectedTab(JTabbedPane var1, int var2, int var3) {
  1151.       int var4 = var1.getSelectedIndex();
  1152.       int var5 = var1.getTabCount();
  1153.       switch (var2) {
  1154.          case 1:
  1155.          case 3:
  1156.          default:
  1157.             switch (var3) {
  1158.                case 1:
  1159.                   int var9 = this.getTabRunOffset(var1, var2, var5, var4, false);
  1160.                   this.selectAdjacentRunTab(var1, var2, var4, var9);
  1161.                   return;
  1162.                case 3:
  1163.                   this.selectNextTab(var1, var4);
  1164.                   return;
  1165.                case 5:
  1166.                   int var8 = this.getTabRunOffset(var1, var2, var5, var4, true);
  1167.                   this.selectAdjacentRunTab(var1, var2, var4, var8);
  1168.                   return;
  1169.                case 7:
  1170.                   this.selectPrevTab(var1, var4);
  1171.                   return;
  1172.                default:
  1173.                   return;
  1174.             }
  1175.          case 2:
  1176.          case 4:
  1177.             switch (var3) {
  1178.                case 1:
  1179.                   this.selectPrevTab(var1, var4);
  1180.                   return;
  1181.                case 3:
  1182.                   int var7 = this.getTabRunOffset(var1, var2, var5, var4, true);
  1183.                   this.selectAdjacentRunTab(var1, var2, var4, var7);
  1184.                   return;
  1185.                case 5:
  1186.                   this.selectNextTab(var1, var4);
  1187.                   return;
  1188.                case 7:
  1189.                   int var6 = this.getTabRunOffset(var1, var2, var5, var4, false);
  1190.                   this.selectAdjacentRunTab(var1, var2, var4, var6);
  1191.                   return;
  1192.                default:
  1193.             }
  1194.       }
  1195.    }
  1196.  
  1197.    public int getPrevTabIndex(JTabbedPane var1, int var2) {
  1198.       int var3 = var2 - 1;
  1199.       if (var3 < 0) {
  1200.          var3 = var1.getTabCount() - 1;
  1201.       }
  1202.  
  1203.       return var3;
  1204.    }
  1205.  
  1206.    public int getNextTabIndex(JTabbedPane var1, int var2) {
  1207.       return (var2 + 1) % var1.getTabCount();
  1208.    }
  1209.  
  1210.    public void selectNextTab(JTabbedPane var1, int var2) {
  1211.       int var3;
  1212.       for(var3 = this.getNextTabIndex(var1, var2); !var1.isEnabledAt(var3) && var3 != var2; var3 = this.getNextTabIndex(var1, var3)) {
  1213.       }
  1214.  
  1215.       var1.setSelectedIndex(var3);
  1216.    }
  1217.  
  1218.    public void selectPrevTab(JTabbedPane var1, int var2) {
  1219.       int var3;
  1220.       for(var3 = this.getPrevTabIndex(var1, var2); !var1.isEnabledAt(var3) && var3 != var2; var3 = this.getPrevTabIndex(var1, var3)) {
  1221.       }
  1222.  
  1223.       var1.setSelectedIndex(var3);
  1224.    }
  1225.  
  1226.    protected void selectAdjacentRunTab(JTabbedPane var1, int var2, int var3, int var4) {
  1227.       if (this.runCount >= 2) {
  1228.          Rectangle var6 = this.rects[var3];
  1229.          int var5;
  1230.          switch (var2) {
  1231.             case 1:
  1232.             case 3:
  1233.             default:
  1234.                var5 = this.tabForCoordinate(var1, var6.x + var6.width / 2, var6.y + var6.height / 2 + var4);
  1235.                break;
  1236.             case 2:
  1237.             case 4:
  1238.                var5 = this.tabForCoordinate(var1, var6.x + var6.width / 2 + var4, var6.y + var6.height / 2);
  1239.          }
  1240.  
  1241.          if (var5 != -1) {
  1242.             while(!var1.isEnabledAt(var5) && var5 != var3) {
  1243.                var5 = this.getNextTabIndex(var1, var5);
  1244.             }
  1245.  
  1246.             var1.setSelectedIndex(var5);
  1247.          }
  1248.  
  1249.       }
  1250.    }
  1251.  
  1252.    protected int getTabRunOffset(JTabbedPane var1, int var2, int var3, int var4, boolean var5) {
  1253.       int var6 = this.getRunForTab(var1, var3, var4);
  1254.       int var7;
  1255.       switch (var2) {
  1256.          case 1:
  1257.          default:
  1258.             if (var6 == 0) {
  1259.                var7 = var5 ? -(this.totalTabHeight(var1, var2, this.runCount) - this.maxTabHeight(var1)) : -this.maxTabHeight(var1);
  1260.             } else if (var6 == this.runCount - 1) {
  1261.                var7 = var5 ? this.maxTabHeight(var1) : this.totalTabHeight(var1, var2, this.runCount) - this.maxTabHeight(var1);
  1262.             } else {
  1263.                var7 = var5 ? this.maxTabHeight(var1) : -this.maxTabHeight(var1);
  1264.             }
  1265.             break;
  1266.          case 2:
  1267.             if (var6 == 0) {
  1268.                var7 = var5 ? -(this.totalTabWidth(var1, var2, this.runCount) - this.maxTabWidth(var1)) : -this.maxTabWidth(var1);
  1269.             } else if (var6 == this.runCount - 1) {
  1270.                var7 = var5 ? this.maxTabWidth(var1) : this.totalTabWidth(var1, var2, this.runCount) - this.maxTabWidth(var1);
  1271.             } else {
  1272.                var7 = var5 ? this.maxTabWidth(var1) : -this.maxTabWidth(var1);
  1273.             }
  1274.             break;
  1275.          case 3:
  1276.             if (var6 == 0) {
  1277.                var7 = var5 ? this.maxTabHeight(var1) : this.totalTabHeight(var1, var2, this.runCount) - this.maxTabHeight(var1);
  1278.             } else if (var6 == this.runCount - 1) {
  1279.                var7 = var5 ? -(this.totalTabHeight(var1, var2, this.runCount) - this.maxTabHeight(var1)) : -this.maxTabHeight(var1);
  1280.             } else {
  1281.                var7 = var5 ? this.maxTabHeight(var1) : -this.maxTabHeight(var1);
  1282.             }
  1283.             break;
  1284.          case 4:
  1285.             if (var6 == 0) {
  1286.                var7 = var5 ? this.maxTabWidth(var1) : this.totalTabWidth(var1, var2, this.runCount) - this.maxTabWidth(var1);
  1287.             } else if (var6 == this.runCount - 1) {
  1288.                var7 = var5 ? -(this.totalTabWidth(var1, var2, this.runCount) - this.maxTabWidth(var1)) : -this.maxTabWidth(var1);
  1289.             } else {
  1290.                var7 = var5 ? this.maxTabWidth(var1) : -this.maxTabWidth(var1);
  1291.             }
  1292.       }
  1293.  
  1294.       return var7;
  1295.    }
  1296.  
  1297.    public int tabForCoordinate(JTabbedPane var1, int var2, int var3) {
  1298.       int var4 = var1.getTabCount();
  1299.       if (var4 != this.rects.length) {
  1300.          this.calculateLayoutInfo(var1);
  1301.       }
  1302.  
  1303.       for(int var5 = 0; var5 < var4; ++var5) {
  1304.          if (this.rects[var5].contains(var2, var3)) {
  1305.             return var5;
  1306.          }
  1307.       }
  1308.  
  1309.       return -1;
  1310.    }
  1311. }
  1312.