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