/* * @(#)WindowsTabbedPaneUI.java * * Copyright 2002 JIDE Software Inc. All rights reserved. */ package com.jidesoft.plaf.vsnet; import com.jidesoft.plaf.UIDefaultsLookup; import com.jidesoft.plaf.basic.BasicJideTabbedPaneUI; import com.jidesoft.plaf.basic.ThemePainter; import com.jidesoft.swing.JideTabbedPane; import com.jidesoft.swing.TabColorProvider; import com.jidesoft.utils.ColorUtils; import javax.swing.*; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import java.awt.*; /** * JideTabbedPane UI implementation */ public class VsnetJideTabbedPaneUI extends BasicJideTabbedPaneUI { protected Color _backgroundSelectedColorStart; protected Color _backgroundSelectedColorEnd; protected Color _backgroundUnselectedColorStart; protected Color _backgroundUnselectedColorEnd; public static ComponentUI createUI(JComponent c) { return new VsnetJideTabbedPaneUI(); } @Override public void installColorTheme() { super.installColorTheme(); int tabStyle = getTabShape(); int colorTheme = getColorTheme(); switch (tabStyle) { case JideTabbedPane.SHAPE_BOX: if (colorTheme == JideTabbedPane.COLOR_THEME_VSNET) { _selectColor1 = _shadow; _selectColor2 = _selectColor1; } else if (colorTheme == JideTabbedPane.COLOR_THEME_WINXP) { _selectColor1 = UIDefaultsLookup.getColor("TextArea.selectionBackground"); _selectColor2 = _selectColor1; } _unselectColor1 = getPainter().getControlShadow(); _unselectColor2 = _lightHighlight; break; case JideTabbedPane.SHAPE_EXCEL: if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET) { _selectColor2 = null; _selectColor3 = null; _unselectColor2 = _lightHighlight; _unselectColor3 = _shadow; } break; case JideTabbedPane.SHAPE_WINDOWS: case JideTabbedPane.SHAPE_WINDOWS_SELECTED: if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET) { _selectColor1 = getPainter().getTabbedPaneSelectDk(); _selectColor2 = getPainter().getTabbedPaneSelectLt(); _selectColor3 = getPainter().getControlDk(); _unselectColor1 = getPainter().getControlDk(); _unselectColor2 = null; _unselectColor3 = null; } if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) { _selectColor1 = getPainter().getTabbedPaneSelectDk(); _selectColor2 = getPainter().getTabbedPaneSelectLt(); _selectColor3 = getPainter().getControlDk(); _unselectColor1 = getPainter().getControlDk(); _unselectColor2 = null; _unselectColor3 = null; } break; } installBackgroundColor(); } protected void installBackgroundColor() { int colorTheme = getColorTheme(); switch (getTabShape()) { case JideTabbedPane.SHAPE_VSNET: _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; break; case JideTabbedPane.SHAPE_ROUNDED_VSNET: if (colorTheme == JideTabbedPane.COLOR_THEME_WIN2K) { _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } else { _backgroundSelectedColorStart = _background; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } break; case JideTabbedPane.SHAPE_FLAT: case JideTabbedPane.SHAPE_ROUNDED_FLAT: _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = _highlight; _backgroundUnselectedColorEnd = _highlight; break; case JideTabbedPane.SHAPE_BOX: if (colorTheme == JideTabbedPane.COLOR_THEME_WIN2K) { _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } else if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET) { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } else if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } break; case JideTabbedPane.SHAPE_EXCEL: if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = _lightHighlight; _backgroundUnselectedColorEnd = _lightHighlight; } else if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET) { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = _highlight; _backgroundUnselectedColorEnd = _highlight; } else /*if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP)*/ { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = _lightHighlight; _backgroundUnselectedColorEnd = _highlight; } break; case JideTabbedPane.SHAPE_WINDOWS: case JideTabbedPane.SHAPE_WINDOWS_SELECTED: if (colorTheme == JideTabbedPane.COLOR_THEME_VSNET || colorTheme == JideTabbedPane.COLOR_THEME_WINXP) { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = _lightHighlight; _backgroundUnselectedColorEnd = _highlight; } else /*if (colorTheme == JideTabbedPane.COLOR_THEME_WIN2K)*/ { _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = _highlight; _backgroundUnselectedColorEnd = _highlight; } break; case JideTabbedPane.SHAPE_OFFICE2003: if (colorTheme == JideTabbedPane.COLOR_THEME_WIN2K) { _backgroundSelectedColorStart = _highlight; _backgroundSelectedColorEnd = _highlight; _backgroundUnselectedColorStart = _highlight; _backgroundUnselectedColorEnd = _highlight; } else if (colorTheme == JideTabbedPane.COLOR_THEME_WINXP) { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = _lightHighlight; _backgroundUnselectedColorEnd = _highlight; } else { _backgroundSelectedColorStart = _lightHighlight; _backgroundSelectedColorEnd = _lightHighlight; _backgroundUnselectedColorStart = _lightHighlight; _backgroundUnselectedColorEnd = _highlight; } break; } } @Override public void uninstallColorTheme() { super.uninstallColorTheme(); _backgroundSelectedColorStart = null; _backgroundSelectedColorEnd = null; _backgroundUnselectedColorStart = null; _backgroundUnselectedColorEnd = null; } @Override protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) { super.paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, isSelected); if (tabRegion != null) { Color[] colors = getGradientColors(tabIndex, isSelected); if (colors != null) { getPainter().paintTabBackground(_tabPane, g, tabRegion, colors, SwingConstants.HORIZONTAL, ThemePainter.STATE_DEFAULT); } } if (getTabShape() == JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (_mouseEnter && tabIndex == _indexMouseOver && !isSelected && _tabPane.isEnabledAt(_indexMouseOver)) { paintTabBackgroundMouseOver(g, tabPlacement, tabIndex, x, y, w, h, isSelected, _backgroundUnselectedColorStart, _backgroundUnselectedColorEnd); } } } @Override protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { if (!PAINT_CONTENT_BORDER_EDGE) { return; } if (selectedIndex < 0 || selectedIndex >= _tabPane.getTabCount()) { return; } Rectangle selRect = getTabBounds(selectedIndex, _calcRect); Rectangle viewRect = _tabScroller.viewport.getViewRect(); Rectangle r = _rects[selectedIndex]; int tabShape = getTabShape(); Insets contentInsets = getContentBorderInsets(tabPlacement); if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) {// the color set is default g.setColor(_shadow); } else {// the color set is office2003 g.setColor(_selectColor1); } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y, x + w - 1, y);// top } else { g.drawLine(x, y, selRect.x - selRect.height + 2, y);// top left g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right } } else if (tabShape == JideTabbedPane.SHAPE_EXCEL) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(Color.BLACK); } else {// the color set is vsnet g.setColor(getPainter().getControlShadow()); } g.drawLine(x, y, selRect.x - selRect.height / 2 + 4, y);// top left if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y, x + w - 1, y);// top } else { if (!_tabPane.isShowIconsOnTab() && !_tabPane.isUseDefaultShowIconsOnTab()) { g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 4, y, x + w - 1, y);// top right } else { g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 6, y, x + w - 1, y);// top right } } } else if (tabShape == JideTabbedPane.SHAPE_WINDOWS || tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET || _tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) {// the color set is winxp g.setColor(getPainter().getControlDk()); } else {// the color set is default or office2003 g.setColor(getBorderEdgeColor()); } if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET || _tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) {// the color set is winxp g.drawLine(x, y, selRect.x - 1, y);// top left } else {// the color set is default or office2003 g.drawLine(x, y, selRect.x - 1, y);// top left } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET || _tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) {// the color set is winxp g.setColor(getPainter().getControlDk()); } else {// the color set is default or office2003 g.setColor(_lightHighlight); } g.drawLine(x, y, x + w - 1, y);// top } else { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET || _tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) {// the color set is winxp g.setColor(getPainter().getControlDk()); g.drawLine(selRect.x + selRect.width + 2, y, x + w - 1, y);// top right } else {// the color set is default or office2003 g.setColor(_lightHighlight); g.drawLine(selRect.x + selRect.width + 2, y, x + w - 1, y);// top right } } if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(new Color(115, 109, 99)); g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else {// the color set is winxp g.setColor(getPainter().getControlDk()); if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } } } else if (tabShape == JideTabbedPane.SHAPE_VSNET) { g.setColor(_selectColor1); // Break line to show visual connection to selected tab g.drawLine(x, y, selRect.x, y);// top left if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.setColor(_selectColor1); g.drawLine(x, y, x + w - 1, y);// top } else { g.setColor(_selectColor2); g.drawLine(selRect.x + selRect.width - 1, y, selRect.x + selRect.width - 1, y);// a point g.setColor(_selectColor1); g.drawLine(selRect.x, y, selRect.x, y);// a point g.setColor(_selectColor1); g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right } g.setColor(_selectColor2); if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } } else if (tabShape == JideTabbedPane.SHAPE_ROUNDED_VSNET) { g.setColor(_selectColor1); // Break line to show visual connection to selected tab g.drawLine(x, y, selRect.x, y);// top left if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y, x + w - 1, y);// top } else { g.drawLine(selRect.x + selRect.width - 1, y, selRect.x + selRect.width - 1, y);// a point g.drawLine(selRect.x, y, selRect.x, y);// a point g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right } g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);// right g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else if (tabShape == JideTabbedPane.SHAPE_FLAT || tabShape == JideTabbedPane.SHAPE_ROUNDED_FLAT) { g.setColor(_shadow); if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.drawLine(x, y, selRect.x, y);// top left if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y, x + w - 1, y);// top } else { g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right } } else { super.paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h); } } @Override protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { if (!PAINT_CONTENT_BORDER_EDGE) { return; } if (selectedIndex < 0 || selectedIndex >= _tabPane.getTabCount()) { return; } Rectangle selRect = getTabBounds(selectedIndex, _calcRect); Rectangle viewRect = _tabScroller.viewport.getViewRect(); Rectangle r = _rects[selectedIndex]; int tabShape = getTabShape(); Insets contentInsets = getContentBorderInsets(tabPlacement); if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) {// the color set is default g.setColor(_shadow); } else {// the color set is office2003 g.setColor(_selectColor1); } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else { if (!_tabPane.isTabShown()) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else { g.drawLine(x, y + h - 1, selRect.x - selRect.height + 2, y + h - 1);// bottom left g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y + h - 1);// bottom right } } } else if (tabShape == JideTabbedPane.SHAPE_EXCEL) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(Color.BLACK); } else {// the color set is vsnet g.setColor(getPainter().getControlShadow()); } g.drawLine(x, y + h - 1, selRect.x - selRect.height / 2 + 4, y + h - 1);// bottom left if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else { if (!_tabPane.isShowIconsOnTab() && !_tabPane.isUseDefaultShowIconsOnTab()) { g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 4, y + h - 1, x + w - 1, y + h - 1);// bottom right } else { g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 6, y + h - 1, x + w - 1, y + h - 1);// bottom right } } } else if (tabShape == JideTabbedPane.SHAPE_WINDOWS || tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(new Color(113, 111, 100)); g.drawLine(x, y + h - 1, selRect.x - 2, y + h - 1); if (contentInsets.right > 0) { g.drawLine(x + w - 1, y + h - 1, x + w - 1, y); } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); } else { g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y + h - 1); g.setColor(UIDefaultsLookup.getColor("control")); g.drawLine(selRect.x, y + h - 1, selRect.x + selRect.width - 2, y + h - 1); g.drawLine(selRect.x, y + h - 2, selRect.x + selRect.width, y + h - 2); } g.setColor(new Color(255, 255, 255)); if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2); } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y); } } else {// the color set is winxp g.setColor(getPainter().getControlDk()); g.drawLine(x, y + h - 1, selRect.x - 1, y + h - 1); if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); } else { g.drawLine(selRect.x + selRect.width + 2, y + h - 1, x + w - 1, y + h - 1); } g.drawLine(selRect.x - 1, y + h - 1, selRect.x - 1, y + h - 1); g.drawLine(selRect.x + selRect.width + 2, y + h - 1, selRect.x + selRect.width + 2, y + h - 1); if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2); } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y); } if (contentInsets.left > 0) { g.drawLine(x + w - 1, y + h - 1, x + w - 1, y); } } } else if (tabShape == JideTabbedPane.SHAPE_VSNET) { // Break line to show visual connection to selected tab g.setColor(_selectColor2); g.drawLine(x, y + h - 1, selRect.x - 1, y + h - 1);// bottom left g.setColor(_selectColor1); g.drawLine(selRect.x, y + h - 1, selRect.x, y + h - 1); if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.setColor(_selectColor2); g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else { g.setColor(_selectColor2); g.drawLine(selRect.x + selRect.width - 1, y + h - 1, x + w - 2, y + h - 1); // bottom right } g.setColor(_selectColor2); if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } g.setColor(_selectColor1); if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2);// left } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y);// top } } else if (tabShape == JideTabbedPane.SHAPE_ROUNDED_VSNET) { // Break line to show visual connection to selected tab g.setColor(_selectColor1); g.drawLine(x, y + h - 1, selRect.x - 1, y + h - 1);// bottom left g.drawLine(selRect.x, y + h - 1, selRect.x, y + h - 1); if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } else { g.drawLine(selRect.x + selRect.width - 1, y + h - 1, x + w - 2, y + h - 1); // bottom right } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y);// top } } else if (tabShape == JideTabbedPane.SHAPE_FLAT || tabShape == JideTabbedPane.SHAPE_ROUNDED_FLAT) { g.setColor(_shadow); g.drawLine(x, y + h - 1, selRect.x - 1, y + h - 1);// bottom left if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } g.drawLine(selRect.x, y + h - 1, selRect.x, y + h - 1);// a point if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y + h - 1, x + w - 2, y + h - 1);// bottom } else { g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 2, y + h - 1);// bottom right } } else { super.paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h); } } @Override protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { if (!PAINT_CONTENT_BORDER_EDGE) { return; } if (selectedIndex < 0 || selectedIndex >= _tabPane.getTabCount()) { return; } Rectangle selRect = getTabBounds(selectedIndex, _calcRect); Rectangle viewRect = _tabScroller.viewport.getViewRect(); Rectangle r = _rects[selectedIndex]; int tabShape = getTabShape(); Insets contentInsets = getContentBorderInsets(tabPlacement); if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) {// the color set is default g.setColor(_shadow); } else {// the color set is office2003 g.setColor(_selectColor1); } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x, y, x, y + h - 1);// left } else { g.drawLine(x, y, x, selRect.y - selRect.width + 2);// left top g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left bottom } } else if (tabShape == JideTabbedPane.SHAPE_EXCEL) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(Color.BLACK); } else {// the color set is vsnet g.setColor(getPainter().getControlShadow()); } g.drawLine(x, y, x, selRect.y - selRect.width / 2 + 4);// left top if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x, y, x, y + h - 1);// left } else { g.drawLine(x, selRect.y + selRect.height + selRect.width / 2 - 4, x, y + h - 1);// left bottom } } else if (tabShape == JideTabbedPane.SHAPE_WINDOWS || tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(new Color(115, 109, 99)); if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.setColor(new Color(255, 255, 255)); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y); } g.drawLine(x, y, x, selRect.y - 1); if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x, y, x, y + h - 2); } else { g.drawLine(x, selRect.y + selRect.height + 1, x, y + h - 2); } } else {// the color set is winxp g.setColor(getPainter().getControlDk()); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.drawLine(x, y, x, selRect.y - 2); if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x, y, x, y + h - 2); } else { g.drawLine(x, selRect.y + selRect.height + 2, x, y + h - 2); } } } else if (tabShape == JideTabbedPane.SHAPE_VSNET) { g.setColor(_selectColor1); // Break line to show visual connection to selected tab g.drawLine(x, y, x, selRect.y);// left top if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.setColor(_selectColor1); g.drawLine(x, y, x, y + h - 1);// left } else { g.setColor(_selectColor1); g.drawLine(x, selRect.y, x, selRect.y);// a point g.setColor(_selectColor2); g.drawLine(x, selRect.y + selRect.height - 1, x, selRect.y + selRect.height - 1);// a point g.setColor(_selectColor1); g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left // bottom } g.setColor(_selectColor2); if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } } else if (tabShape == JideTabbedPane.SHAPE_ROUNDED_VSNET) { g.setColor(_selectColor1); // Break line to show visual connection to selected tab g.drawLine(x, y, x, selRect.y);// left top if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x, y, x, y + h - 1);// left } else { g.drawLine(x, selRect.y, x, selRect.y);// a point g.drawLine(x, selRect.y + selRect.height - 1, x, selRect.y + selRect.height - 1);// a point g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left // bottom } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } } else if (tabShape == JideTabbedPane.SHAPE_FLAT || tabShape == JideTabbedPane.SHAPE_ROUNDED_FLAT) { g.setColor(_shadow); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.right > 0) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.drawLine(x, y, x, selRect.y);// left top if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x, y, x, y + h - 1);// left } else { g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left bottom } } else { super.paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h); } } @Override protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { if (!PAINT_CONTENT_BORDER_EDGE) { return; } if (selectedIndex < 0 || selectedIndex >= _tabPane.getTabCount()) { return; } Rectangle selRect = getTabBounds(selectedIndex, _calcRect); Rectangle viewRect = _tabScroller.viewport.getViewRect(); Rectangle r = _rects[selectedIndex]; int tabShape = getTabShape(); Insets contentInsets = getContentBorderInsets(tabPlacement); if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) {// the color set is default g.setColor(_shadow); } else {// the color set is office2003 g.setColor(_selectColor1); } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } else { g.drawLine(x + w - 1, y, x + w - 1, selRect.y - selRect.width + 2);// right top g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom } } else if (tabShape == JideTabbedPane.SHAPE_EXCEL) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(Color.BLACK); } else {// the color set is vsnet g.setColor(getPainter().getControlShadow()); } g.drawLine(x + w - 1, y, x + w - 1, selRect.y - selRect.width / 2 + 4);// right top if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } else { g.drawLine(x + w - 1, selRect.y + selRect.height + selRect.width / 2 - 4, x + w - 1, y + h - 1);// right bottom } } else if (tabShape == JideTabbedPane.SHAPE_WINDOWS || tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WIN2K) { g.setColor(new Color(115, 109, 99)); g.drawLine(x + w - 1, y, x + w - 1, selRect.y - 2); if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1); g.setColor(new Color(173, 170, 156)); g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2); } else { g.drawLine(x + w - 1, selRect.y + selRect.height + 1, x + w - 1, y + h - 1); g.setColor(UIDefaultsLookup.getColor("control")); g.drawLine(x + w - 1, selRect.y, x + w - 1, selRect.y + selRect.height - 1); g.drawLine(x + w - 2, selRect.y, x + w - 2, selRect.y + selRect.height + 1); } g.setColor(new Color(255, 255, 255)); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2);// left } } else {// the color set is winxp g.setColor(getPainter().getControlDk()); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.drawLine(x + w - 1, y, x + w - 1, selRect.y - 2); if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 2); } else { g.drawLine(x + w - 1, selRect.y + selRect.height + 2, x + w - 1, y + h - 2); } } } else if (tabShape == JideTabbedPane.SHAPE_VSNET) { g.setColor(getBorderEdgeColor()); // Break line to show visual connection to selected tab g.setColor(_selectColor2); g.drawLine(x + w - 1, y, x + w - 1, selRect.y);// right top if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } else { g.setColor(_selectColor2); g.drawLine(x + w - 1, selRect.y + selRect.height - 1, x + w - 1, selRect.y + selRect.height - 1);// a point g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom } g.setColor(_selectColor1); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 2, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2);// left } } else if (tabShape == JideTabbedPane.SHAPE_ROUNDED_VSNET) { g.setColor(_selectColor1); // Break line to show visual connection to selected tab g.drawLine(x + w - 1, y, x + w - 1, selRect.y - 1);// right top if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } else { g.drawLine(x + w - 1, selRect.y, x + w - 1, selRect.y);// a point g.drawLine(x + w - 1, selRect.y + selRect.height - 1, x + w - 1, selRect.y + selRect.height - 1);// a point g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom } if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 2);// left } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } } else if (tabShape == JideTabbedPane.SHAPE_FLAT || tabShape == JideTabbedPane.SHAPE_ROUNDED_FLAT) { g.setColor(_shadow); if (contentInsets.top > 0) { g.drawLine(x, y, x + w - 1, y);// top } if (contentInsets.left > 0) { g.drawLine(x, y, x, y + h - 1);// left } if (contentInsets.bottom > 0) { g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom } g.drawLine(x + w - 1, y, x + w - 1, selRect.y);// right top if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) { g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right } else { g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom } } else { super.paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h); } } @Override protected void paintContentBorder(Graphics g, int x, int y, int w, int h) { if (!PAINT_CONTENT_BORDER) { return; } Insets insets = getContentBorderInsets(_tabPane.getTabPlacement()); Color backgroundAt = null; int selectedIndex = _tabPane.getSelectedIndex(); if (selectedIndex < 0 || selectedIndex >= _tabPane.getTabCount()) { return; } Component comp = selectedIndex == -1 ? null : _tabPane.getComponentAt(selectedIndex); if (comp instanceof TabColorProvider) { backgroundAt = ((TabColorProvider) comp).getTabBackground(); } JideTabbedPane.ColorProvider colorProvider = _tabPane.getTabColorProvider(); boolean useDefault = true; if (colorProvider != null || backgroundAt != null) { if (backgroundAt == null) { backgroundAt = _tabPane.getBackground(); if (selectedIndex != -1) backgroundAt = colorProvider.getBackgroundAt(selectedIndex); } if (backgroundAt != null) { g.setColor(backgroundAt); g.fillRect(x, y, w, h); useDefault = false; } } if (useDefault) { Color[] colors = getGradientColors(selectedIndex, true); if (colors != null) { g.setColor(colors[1]); g.fillRect(x, y, w, insets.top); // top g.fillRect(x, y, insets.left, h); // left g.fillRect(x, y + h - insets.bottom, w, insets.bottom); // bottom g.fillRect(x + w - insets.right, y, insets.right, h); // right } } } protected Color[] getGradientColors(int tabIndex, boolean isSelected) { Color backgroundEnd = null; Color backgroundStart = null; Boolean highContrast = UIManager.getBoolean("Theme.highContrast"); if (highContrast) { backgroundStart = isSelected ? UIDefaultsLookup.getColor("JideButton.selectedBackground") : UIDefaultsLookup.getColor("JideButton.background"); backgroundEnd = backgroundStart; } else { Color color = null; Component comp = null; if (tabIndex >= 0 && tabIndex < _tabPane.getTabCount()) { comp = _tabPane.getComponentAt(tabIndex); } if (comp instanceof TabColorProvider) { color = ((TabColorProvider) comp).getTabBackground(); } JideTabbedPane.ColorProvider colorProvider = _tabPane.getTabColorProvider(); if (color == null && colorProvider != null) { backgroundEnd = colorProvider.getBackgroundAt(tabIndex); if (colorProvider instanceof JideTabbedPane.GradientColorProvider) { backgroundStart = ((JideTabbedPane.GradientColorProvider) colorProvider).getTopBackgroundAt(tabIndex); } else { backgroundStart = backgroundEnd != null ? ColorUtils.getDerivedColor(backgroundEnd, colorProvider.getGradientRatio(tabIndex)) : null; } } else { if (color == null) { color = _tabPane.getBackground(); if (tabIndex != -1) color = _tabPane.getBackgroundAt(tabIndex); } if (!(color instanceof UIResource) && color != _tabPane.getBackground()) { backgroundEnd = color; if (getColorTheme() == JideTabbedPane.COLOR_THEME_OFFICE2003) { backgroundStart = ColorUtils.getDerivedColor(color, 0.8f); } else { backgroundStart = color; } } } if (isSelected) { if (showFocusIndicator()) { if (backgroundEnd == null) { backgroundEnd = _backgroundSelectedColorEnd; } if (backgroundStart == null) { backgroundStart = _backgroundSelectedColorStart; } } else { if (getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET) { if (backgroundEnd == null) { backgroundEnd = _backgroundSelectedColorEnd; } if (backgroundStart == null) { backgroundStart = _backgroundSelectedColorStart; } } else { if (backgroundEnd == null) { backgroundEnd = ColorUtils.getDerivedColor(_backgroundUnselectedColorEnd, 0.7f); } if (backgroundStart == null) { backgroundStart = ColorUtils.getDerivedColor(_backgroundUnselectedColorStart, 0.8f); } } } } else { if (getTabShape() != JideTabbedPane.SHAPE_WINDOWS_SELECTED) { if (backgroundEnd == null) { backgroundEnd = _backgroundUnselectedColorEnd; } if (backgroundStart == null) { backgroundStart = _backgroundUnselectedColorStart; } } } } return new Color[]{backgroundStart, backgroundEnd}; } }