From 6d48f13d1bc68b4ad4e7db6e89d982d1bb94d3fe Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Sat, 29 Sep 2018 13:32:31 +0100 Subject: [PATCH] Included JTattoo sources in tree and cleaned up warnings --- deps/JTattoo-1.6.10.jar | Bin 1133022 -> 0 bytes licenses/jtattoo/APACHE-LICENSE-2.0.txt | 177 + licenses/jtattoo/classpath-exception.txt | 17 + licenses/jtattoo/gpl-2.0.txt | 280 ++ licenses/jtattoo/lgpl-2.0.txt | 437 ++ licenses/jtattoo/license.txt | 21 + .../com/jtattoo/plaf/hifi/icons/HorRubber.gif | Bin 0 -> 858 bytes .../plaf/hifi/icons/SplitterDownArrow.gif | Bin 0 -> 827 bytes .../plaf/hifi/icons/SplitterHorBumps.gif | Bin 0 -> 866 bytes .../plaf/hifi/icons/SplitterLeftArrow.gif | Bin 0 -> 826 bytes .../plaf/hifi/icons/SplitterRightArrow.gif | Bin 0 -> 828 bytes .../plaf/hifi/icons/SplitterUpArrow.gif | Bin 0 -> 827 bytes .../plaf/hifi/icons/SplitterVerBumps.gif | Bin 0 -> 868 bytes .../com/jtattoo/plaf/hifi/icons/VerRubber.gif | Bin 0 -> 857 bytes .../hifi/icons/large/arrow_down_11x10.png | Bin 0 -> 926 bytes .../hifi/icons/large/arrow_left_10x11.png | Bin 0 -> 913 bytes .../hifi/icons/large/arrow_right_10x11.png | Bin 0 -> 914 bytes .../plaf/hifi/icons/large/arrow_up_11x10.png | Bin 0 -> 924 bytes .../hifi/icons/large/check_symbol_16x15.png | Bin 0 -> 969 bytes .../hifi/icons/large/tree_collapsed_14x14.png | Bin 0 -> 169 bytes .../hifi/icons/large/tree_expanded_14x14.png | Bin 0 -> 136 bytes .../plaf/hifi/icons/medium/arrow_down_9x8.png | Bin 0 -> 922 bytes .../plaf/hifi/icons/medium/arrow_left_8x9.png | Bin 0 -> 914 bytes .../hifi/icons/medium/arrow_right_8x9.png | Bin 0 -> 912 bytes .../plaf/hifi/icons/medium/arrow_up_9x8.png | Bin 0 -> 920 bytes .../hifi/icons/medium/check_symbol_14x13.png | Bin 0 -> 957 bytes .../icons/medium/tree_collapsed_11x11.png | Bin 0 -> 156 bytes .../hifi/icons/medium/tree_expanded_11x11.png | Bin 0 -> 133 bytes .../plaf/hifi/icons/small/arrow_down_7x6.png | Bin 0 -> 915 bytes .../plaf/hifi/icons/small/arrow_left_6x7.png | Bin 0 -> 914 bytes .../plaf/hifi/icons/small/arrow_right_6x7.png | Bin 0 -> 912 bytes .../plaf/hifi/icons/small/arrow_up_7x6.png | Bin 0 -> 918 bytes .../hifi/icons/small/check_symbol_12x11.png | Bin 0 -> 949 bytes .../hifi/icons/small/tree_collapsed_9x9.png | Bin 0 -> 137 bytes .../hifi/icons/small/tree_expanded_9x9.png | Bin 0 -> 128 bytes .../com/jtattoo/plaf/hifi/icons/thumb_hor.gif | Bin 0 -> 958 bytes .../plaf/hifi/icons/thumb_hor_rollover.gif | Bin 0 -> 950 bytes .../com/jtattoo/plaf/hifi/icons/thumb_ver.gif | Bin 0 -> 959 bytes .../plaf/hifi/icons/thumb_ver_rollover.gif | Bin 0 -> 947 bytes .../com/jtattoo/plaf/icons/MenuArrow.gif | Bin 0 -> 844 bytes .../com/jtattoo/plaf/icons/MenuLeftArrow.gif | Bin 0 -> 842 bytes .../com/jtattoo/plaf/icons/MenuRightArrow.gif | Bin 0 -> 844 bytes .../jtattoo/plaf/icons/SplitterDownArrow.gif | Bin 0 -> 827 bytes .../jtattoo/plaf/icons/SplitterHorBumps.gif | Bin 0 -> 858 bytes .../plaf/icons/SplitterHorBumpsSmall.gif | Bin 0 -> 832 bytes .../jtattoo/plaf/icons/SplitterLeftArrow.gif | Bin 0 -> 826 bytes .../jtattoo/plaf/icons/SplitterRightArrow.gif | Bin 0 -> 828 bytes .../jtattoo/plaf/icons/SplitterUpArrow.gif | Bin 0 -> 827 bytes .../jtattoo/plaf/icons/SplitterVerBumps.gif | Bin 0 -> 860 bytes .../plaf/icons/SplitterVerBumpsSmall.gif | Bin 0 -> 832 bytes .../com/jtattoo/plaf/icons/computer_16x16.png | Bin 0 -> 575 bytes .../com/jtattoo/plaf/icons/empty_8x8.png | Bin 0 -> 935 bytes .../jtattoo/plaf/icons/floppy_drive_16x16.png | Bin 0 -> 556 bytes .../jtattoo/plaf/icons/folder_new_22x22.png | Bin 0 -> 1413 bytes .../jtattoo/plaf/icons/folder_up_22x22.png | Bin 0 -> 1448 bytes .../jtattoo/plaf/icons/hard_drive_16x16.png | Bin 0 -> 632 bytes .../com/jtattoo/plaf/icons/home_22x22.png | Bin 0 -> 1044 bytes .../plaf/icons/large/arrow_down_11x8.png | Bin 0 -> 925 bytes .../icons/large/arrow_down_inverse_11x8.png | Bin 0 -> 917 bytes .../plaf/icons/large/arrow_left_8x11.png | Bin 0 -> 929 bytes .../icons/large/arrow_left_inverse_8x11.png | Bin 0 -> 926 bytes .../plaf/icons/large/arrow_right_8x11.png | Bin 0 -> 928 bytes .../icons/large/arrow_right_inverse_8x11.png | Bin 0 -> 924 bytes .../plaf/icons/large/arrow_up_11x8.png | Bin 0 -> 927 bytes .../icons/large/arrow_up_inverse_11x8.png | Bin 0 -> 923 bytes .../plaf/icons/large/check_symbol_14x14.png | Bin 0 -> 941 bytes .../large/check_symbol_disabled_14x14.png | Bin 0 -> 933 bytes .../jtattoo/plaf/icons/large/closer_12x12.png | Bin 0 -> 979 bytes .../jtattoo/plaf/icons/large/cup_24x24.png | Bin 0 -> 1427 bytes .../plaf/icons/large/document_24x24.png | Bin 0 -> 980 bytes .../jtattoo/plaf/icons/large/error_48x48.png | Bin 0 -> 2989 bytes .../plaf/icons/large/folder_closed_24x24.png | Bin 0 -> 1379 bytes .../plaf/icons/large/folder_opened_24x24.png | Bin 0 -> 1297 bytes .../plaf/icons/large/iconizer_12x12.png | Bin 0 -> 945 bytes .../plaf/icons/large/information_48x48.png | Bin 0 -> 3820 bytes .../plaf/icons/large/maximizer_12x12.png | Bin 0 -> 950 bytes .../plaf/icons/large/minimizer_12x12.png | Bin 0 -> 950 bytes .../plaf/icons/large/pearl_green_32x32.png | Bin 0 -> 1289 bytes .../plaf/icons/large/pearl_grey_32x32.png | Bin 0 -> 1399 bytes .../plaf/icons/large/pearl_red_32x32.png | Bin 0 -> 1278 bytes .../plaf/icons/large/pearl_yellow_32x32.png | Bin 0 -> 1284 bytes .../plaf/icons/large/question_48x48.png | Bin 0 -> 3913 bytes .../plaf/icons/large/tree_collapsed_14x14.png | Bin 0 -> 189 bytes .../plaf/icons/large/tree_expanded_14x14.png | Bin 0 -> 169 bytes .../plaf/icons/large/warning_48x48.png | Bin 0 -> 2741 bytes .../plaf/icons/medium/arrow_down_9x6.png | Bin 0 -> 918 bytes .../icons/medium/arrow_down_inverse_9x6.png | Bin 0 -> 918 bytes .../plaf/icons/medium/arrow_left_6x9.png | Bin 0 -> 921 bytes .../icons/medium/arrow_left_inverse_6x9.png | Bin 0 -> 921 bytes .../plaf/icons/medium/arrow_right_6x9.png | Bin 0 -> 922 bytes .../icons/medium/arrow_right_inverse_6x9.png | Bin 0 -> 922 bytes .../plaf/icons/medium/arrow_up_9x6.png | Bin 0 -> 920 bytes .../icons/medium/arrow_up_inverse_9x6.png | Bin 0 -> 920 bytes .../plaf/icons/medium/check_symbol_12x12.png | Bin 0 -> 936 bytes .../medium/check_symbol_disabled_12x12.png | Bin 0 -> 927 bytes .../plaf/icons/medium/closer_12x12.png | Bin 0 -> 979 bytes .../jtattoo/plaf/icons/medium/cup_20x20.png | Bin 0 -> 1229 bytes .../plaf/icons/medium/document_20x20.png | Bin 0 -> 885 bytes .../jtattoo/plaf/icons/medium/error_32x32.png | Bin 0 -> 1907 bytes .../plaf/icons/medium/folder_closed_20x20.png | Bin 0 -> 1184 bytes .../plaf/icons/medium/folder_opened_20x20.png | Bin 0 -> 1156 bytes .../plaf/icons/medium/iconizer_12x12.png | Bin 0 -> 945 bytes .../plaf/icons/medium/information_32x32.png | Bin 0 -> 2289 bytes .../plaf/icons/medium/maximizer_12x12.png | Bin 0 -> 950 bytes .../plaf/icons/medium/minimizer_12x12.png | Bin 0 -> 950 bytes .../plaf/icons/medium/pearl_green_28x28.png | Bin 0 -> 1213 bytes .../plaf/icons/medium/pearl_grey_28x28.png | Bin 0 -> 1201 bytes .../plaf/icons/medium/pearl_red_28x28.png | Bin 0 -> 1202 bytes .../plaf/icons/medium/pearl_yellow_28x28.png | Bin 0 -> 1217 bytes .../plaf/icons/medium/question_32x32.png | Bin 0 -> 2120 bytes .../icons/medium/tree_collapsed_11x11.png | Bin 0 -> 193 bytes .../plaf/icons/medium/tree_expanded_11x11.png | Bin 0 -> 177 bytes .../plaf/icons/medium/warning_32x32.png | Bin 0 -> 1654 bytes .../plaf/icons/small/arrow_down_7x4.png | Bin 0 -> 912 bytes .../icons/small/arrow_down_inverse_7x4.png | Bin 0 -> 911 bytes .../plaf/icons/small/arrow_left_4x7.png | Bin 0 -> 915 bytes .../icons/small/arrow_left_inverse_4x7.png | Bin 0 -> 914 bytes .../plaf/icons/small/arrow_right_4x7.png | Bin 0 -> 917 bytes .../icons/small/arrow_right_inverse_4x7.png | Bin 0 -> 915 bytes .../jtattoo/plaf/icons/small/arrow_up_7x4.png | Bin 0 -> 915 bytes .../plaf/icons/small/arrow_up_inverse_7x4.png | Bin 0 -> 914 bytes .../plaf/icons/small/check_symbol_10x10.png | Bin 0 -> 930 bytes .../small/check_symbol_disabled_10x10.png | Bin 0 -> 922 bytes .../jtattoo/plaf/icons/small/closer_10x10.png | Bin 0 -> 959 bytes .../jtattoo/plaf/icons/small/cup_16x16.png | Bin 0 -> 772 bytes .../plaf/icons/small/document_16x16.png | Bin 0 -> 662 bytes .../plaf/icons/small/folder_closed_16x16.png | Bin 0 -> 739 bytes .../plaf/icons/small/folder_opened_16x16.png | Bin 0 -> 811 bytes .../plaf/icons/small/iconizer_10x10.png | Bin 0 -> 945 bytes .../plaf/icons/small/maximizer_10x10.png | Bin 0 -> 949 bytes .../plaf/icons/small/minimizer_10x10.png | Bin 0 -> 949 bytes .../plaf/icons/small/pearl_green_24x24.png | Bin 0 -> 745 bytes .../plaf/icons/small/pearl_grey_24x24.png | Bin 0 -> 804 bytes .../plaf/icons/small/pearl_red_24x24.png | Bin 0 -> 799 bytes .../plaf/icons/small/pearl_yellow_24x24.png | Bin 0 -> 720 bytes .../plaf/icons/small/tree_collapsed_9x9.png | Bin 0 -> 235 bytes .../plaf/icons/small/tree_expanded_9x9.png | Bin 0 -> 165 bytes .../com/jtattoo/plaf/icons/thumb_hor.gif | Bin 0 -> 958 bytes .../jtattoo/plaf/icons/thumb_hor_rollover.gif | Bin 0 -> 962 bytes .../com/jtattoo/plaf/icons/thumb_ver.gif | Bin 0 -> 952 bytes .../jtattoo/plaf/icons/thumb_ver_rollover.gif | Bin 0 -> 960 bytes .../jtattoo/plaf/icons/view_detail_22x22.png | Bin 0 -> 1104 bytes .../jtattoo/plaf/icons/view_list_22x22.png | Bin 0 -> 1127 bytes .../jtattoo/plaf/icons/workplace_16x16.png | Bin 0 -> 792 bytes src/com/jtattoo/plaf/About.java | 97 + .../jtattoo/plaf/AbstractBorderFactory.java | 71 + src/com/jtattoo/plaf/AbstractIconFactory.java | 118 + src/com/jtattoo/plaf/AbstractLookAndFeel.java | 715 +++ src/com/jtattoo/plaf/AbstractTheme.java | 1448 ++++++ src/com/jtattoo/plaf/AbstractToolBarUI.java | 258 ++ src/com/jtattoo/plaf/BaseBorders.java | 896 ++++ src/com/jtattoo/plaf/BaseButtonListener.java | 62 + src/com/jtattoo/plaf/BaseButtonUI.java | 241 + .../jtattoo/plaf/BaseCheckBoxMenuItemUI.java | 44 + src/com/jtattoo/plaf/BaseCheckBoxUI.java | 47 + src/com/jtattoo/plaf/BaseComboBoxUI.java | 186 + src/com/jtattoo/plaf/BaseDesktopPaneUI.java | 53 + src/com/jtattoo/plaf/BaseEditorPaneUI.java | 129 + src/com/jtattoo/plaf/BaseFileChooserUI.java | 134 + .../plaf/BaseFormattedTextFieldUI.java | 108 + src/com/jtattoo/plaf/BaseIcons.java | 1514 +++++++ .../plaf/BaseInternalFrameTitlePane.java | 516 +++ src/com/jtattoo/plaf/BaseInternalFrameUI.java | 203 + src/com/jtattoo/plaf/BaseLabelUI.java | 76 + src/com/jtattoo/plaf/BaseMenuBarUI.java | 45 + src/com/jtattoo/plaf/BaseMenuItemUI.java | 112 + src/com/jtattoo/plaf/BaseMenuUI.java | 182 + src/com/jtattoo/plaf/BasePanelUI.java | 92 + src/com/jtattoo/plaf/BasePasswordFieldUI.java | 124 + src/com/jtattoo/plaf/BasePopupMenuUI.java | 153 + src/com/jtattoo/plaf/BaseProgressBarUI.java | 274 ++ .../plaf/BaseRadioButtonMenuItemUI.java | 44 + src/com/jtattoo/plaf/BaseRadioButtonUI.java | 196 + src/com/jtattoo/plaf/BaseRootPaneUI.java | 997 ++++ src/com/jtattoo/plaf/BaseScrollBarUI.java | 399 ++ src/com/jtattoo/plaf/BaseScrollButton.java | 127 + src/com/jtattoo/plaf/BaseScrollPaneUI.java | 39 + src/com/jtattoo/plaf/BaseSeparatorUI.java | 76 + src/com/jtattoo/plaf/BaseSliderUI.java | 377 ++ src/com/jtattoo/plaf/BaseSpinnerUI.java | 265 ++ .../jtattoo/plaf/BaseSplitPaneDivider.java | 330 ++ src/com/jtattoo/plaf/BaseSplitPaneUI.java | 66 + src/com/jtattoo/plaf/BaseTabbedPaneUI.java | 3994 +++++++++++++++++ src/com/jtattoo/plaf/BaseTableHeaderUI.java | 481 ++ src/com/jtattoo/plaf/BaseTableUI.java | 47 + src/com/jtattoo/plaf/BaseTextAreaUI.java | 150 + src/com/jtattoo/plaf/BaseTextFieldUI.java | 127 + src/com/jtattoo/plaf/BaseTitleButton.java | 61 + src/com/jtattoo/plaf/BaseTitlePane.java | 994 ++++ src/com/jtattoo/plaf/BaseToggleButtonUI.java | 206 + src/com/jtattoo/plaf/BaseToolTipUI.java | 206 + src/com/jtattoo/plaf/BaseTreeUI.java | 49 + src/com/jtattoo/plaf/ColorHelper.java | 205 + src/com/jtattoo/plaf/DecorationHelper.java | 146 + src/com/jtattoo/plaf/JTattooUtilities.java | 577 +++ src/com/jtattoo/plaf/LazyImageIcon.java | 89 + .../jtattoo/plaf/LazyMenuArrowImageIcon.java | 107 + src/com/jtattoo/plaf/NoFocusButton.java | 59 + src/com/jtattoo/plaf/TitlePane.java | 37 + src/com/jtattoo/plaf/XPScrollBarUI.java | 148 + src/com/jtattoo/plaf/XPScrollButton.java | 160 + .../jtattoo/plaf/hifi/HiFiBorderFactory.java | 122 + src/com/jtattoo/plaf/hifi/HiFiBorders.java | 329 ++ src/com/jtattoo/plaf/hifi/HiFiButtonUI.java | 103 + src/com/jtattoo/plaf/hifi/HiFiCheckBoxUI.java | 47 + src/com/jtattoo/plaf/hifi/HiFiComboBoxUI.java | 98 + .../jtattoo/plaf/hifi/HiFiDefaultTheme.java | 161 + .../jtattoo/plaf/hifi/HiFiIconFactory.java | 217 + src/com/jtattoo/plaf/hifi/HiFiIcons.java | 480 ++ .../plaf/hifi/HiFiInternalFrameTitlePane.java | 57 + .../plaf/hifi/HiFiInternalFrameUI.java | 49 + src/com/jtattoo/plaf/hifi/HiFiLabelUI.java | 77 + .../jtattoo/plaf/hifi/HiFiLookAndFeel.java | 211 + src/com/jtattoo/plaf/hifi/HiFiMenuBarUI.java | 52 + src/com/jtattoo/plaf/hifi/HiFiPanelUI.java | 53 + .../jtattoo/plaf/hifi/HiFiRadioButtonUI.java | 90 + src/com/jtattoo/plaf/hifi/HiFiRootPaneUI.java | 43 + .../jtattoo/plaf/hifi/HiFiScrollBarUI.java | 80 + .../jtattoo/plaf/hifi/HiFiScrollButton.java | 49 + .../jtattoo/plaf/hifi/HiFiScrollPaneUI.java | 43 + src/com/jtattoo/plaf/hifi/HiFiSliderUI.java | 62 + .../jtattoo/plaf/hifi/HiFiTabbedPaneUI.java | 103 + src/com/jtattoo/plaf/hifi/HiFiTitlePane.java | 58 + .../jtattoo/plaf/hifi/HiFiToggleButtonUI.java | 74 + src/com/jtattoo/plaf/hifi/HiFiToolBarUI.java | 57 + src/com/jtattoo/plaf/hifi/HiFiUtils.java | 56 + 226 files changed, 22360 insertions(+) delete mode 100644 deps/JTattoo-1.6.10.jar create mode 100644 licenses/jtattoo/APACHE-LICENSE-2.0.txt create mode 100644 licenses/jtattoo/classpath-exception.txt create mode 100644 licenses/jtattoo/gpl-2.0.txt create mode 100644 licenses/jtattoo/lgpl-2.0.txt create mode 100644 licenses/jtattoo/license.txt create mode 100644 resources/com/jtattoo/plaf/hifi/icons/HorRubber.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterDownArrow.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterHorBumps.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterLeftArrow.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterRightArrow.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterUpArrow.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/SplitterVerBumps.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/VerRubber.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/arrow_down_11x10.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/arrow_left_10x11.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/arrow_right_10x11.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/arrow_up_11x10.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/check_symbol_16x15.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/tree_collapsed_14x14.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/large/tree_expanded_14x14.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/arrow_down_9x8.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/arrow_left_8x9.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/arrow_right_8x9.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/arrow_up_9x8.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/check_symbol_14x13.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/tree_collapsed_11x11.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/medium/tree_expanded_11x11.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/arrow_down_7x6.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/arrow_left_6x7.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/arrow_right_6x7.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/arrow_up_7x6.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/check_symbol_12x11.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/tree_collapsed_9x9.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/small/tree_expanded_9x9.png create mode 100644 resources/com/jtattoo/plaf/hifi/icons/thumb_hor.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/thumb_hor_rollover.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/thumb_ver.gif create mode 100644 resources/com/jtattoo/plaf/hifi/icons/thumb_ver_rollover.gif create mode 100644 resources/com/jtattoo/plaf/icons/MenuArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/MenuLeftArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/MenuRightArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterDownArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterHorBumps.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterHorBumpsSmall.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterLeftArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterRightArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterUpArrow.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterVerBumps.gif create mode 100644 resources/com/jtattoo/plaf/icons/SplitterVerBumpsSmall.gif create mode 100644 resources/com/jtattoo/plaf/icons/computer_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/empty_8x8.png create mode 100644 resources/com/jtattoo/plaf/icons/floppy_drive_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/folder_new_22x22.png create mode 100644 resources/com/jtattoo/plaf/icons/folder_up_22x22.png create mode 100644 resources/com/jtattoo/plaf/icons/hard_drive_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/home_22x22.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_down_11x8.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_down_inverse_11x8.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_left_8x11.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_left_inverse_8x11.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_right_8x11.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_right_inverse_8x11.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_up_11x8.png create mode 100644 resources/com/jtattoo/plaf/icons/large/arrow_up_inverse_11x8.png create mode 100644 resources/com/jtattoo/plaf/icons/large/check_symbol_14x14.png create mode 100644 resources/com/jtattoo/plaf/icons/large/check_symbol_disabled_14x14.png create mode 100644 resources/com/jtattoo/plaf/icons/large/closer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/large/cup_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/large/document_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/large/error_48x48.png create mode 100644 resources/com/jtattoo/plaf/icons/large/folder_closed_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/large/folder_opened_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/large/iconizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/large/information_48x48.png create mode 100644 resources/com/jtattoo/plaf/icons/large/maximizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/large/minimizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/large/pearl_green_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/large/pearl_grey_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/large/pearl_red_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/large/pearl_yellow_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/large/question_48x48.png create mode 100644 resources/com/jtattoo/plaf/icons/large/tree_collapsed_14x14.png create mode 100644 resources/com/jtattoo/plaf/icons/large/tree_expanded_14x14.png create mode 100644 resources/com/jtattoo/plaf/icons/large/warning_48x48.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_down_9x6.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_down_inverse_9x6.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_left_6x9.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_left_inverse_6x9.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_right_6x9.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_right_inverse_6x9.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_up_9x6.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/arrow_up_inverse_9x6.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/check_symbol_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/check_symbol_disabled_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/closer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/cup_20x20.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/document_20x20.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/error_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/folder_closed_20x20.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/folder_opened_20x20.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/iconizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/information_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/maximizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/minimizer_12x12.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/pearl_green_28x28.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/pearl_grey_28x28.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/pearl_red_28x28.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/pearl_yellow_28x28.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/question_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/tree_collapsed_11x11.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/tree_expanded_11x11.png create mode 100644 resources/com/jtattoo/plaf/icons/medium/warning_32x32.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_down_7x4.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_down_inverse_7x4.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_left_4x7.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_left_inverse_4x7.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_right_4x7.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_right_inverse_4x7.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_up_7x4.png create mode 100644 resources/com/jtattoo/plaf/icons/small/arrow_up_inverse_7x4.png create mode 100644 resources/com/jtattoo/plaf/icons/small/check_symbol_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/check_symbol_disabled_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/closer_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/cup_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/small/document_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/small/folder_closed_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/small/folder_opened_16x16.png create mode 100644 resources/com/jtattoo/plaf/icons/small/iconizer_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/maximizer_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/minimizer_10x10.png create mode 100644 resources/com/jtattoo/plaf/icons/small/pearl_green_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/small/pearl_grey_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/small/pearl_red_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/small/pearl_yellow_24x24.png create mode 100644 resources/com/jtattoo/plaf/icons/small/tree_collapsed_9x9.png create mode 100644 resources/com/jtattoo/plaf/icons/small/tree_expanded_9x9.png create mode 100644 resources/com/jtattoo/plaf/icons/thumb_hor.gif create mode 100644 resources/com/jtattoo/plaf/icons/thumb_hor_rollover.gif create mode 100644 resources/com/jtattoo/plaf/icons/thumb_ver.gif create mode 100644 resources/com/jtattoo/plaf/icons/thumb_ver_rollover.gif create mode 100644 resources/com/jtattoo/plaf/icons/view_detail_22x22.png create mode 100644 resources/com/jtattoo/plaf/icons/view_list_22x22.png create mode 100644 resources/com/jtattoo/plaf/icons/workplace_16x16.png create mode 100644 src/com/jtattoo/plaf/About.java create mode 100644 src/com/jtattoo/plaf/AbstractBorderFactory.java create mode 100644 src/com/jtattoo/plaf/AbstractIconFactory.java create mode 100644 src/com/jtattoo/plaf/AbstractLookAndFeel.java create mode 100644 src/com/jtattoo/plaf/AbstractTheme.java create mode 100644 src/com/jtattoo/plaf/AbstractToolBarUI.java create mode 100644 src/com/jtattoo/plaf/BaseBorders.java create mode 100644 src/com/jtattoo/plaf/BaseButtonListener.java create mode 100644 src/com/jtattoo/plaf/BaseButtonUI.java create mode 100644 src/com/jtattoo/plaf/BaseCheckBoxMenuItemUI.java create mode 100644 src/com/jtattoo/plaf/BaseCheckBoxUI.java create mode 100644 src/com/jtattoo/plaf/BaseComboBoxUI.java create mode 100644 src/com/jtattoo/plaf/BaseDesktopPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseEditorPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseFileChooserUI.java create mode 100644 src/com/jtattoo/plaf/BaseFormattedTextFieldUI.java create mode 100644 src/com/jtattoo/plaf/BaseIcons.java create mode 100644 src/com/jtattoo/plaf/BaseInternalFrameTitlePane.java create mode 100644 src/com/jtattoo/plaf/BaseInternalFrameUI.java create mode 100644 src/com/jtattoo/plaf/BaseLabelUI.java create mode 100644 src/com/jtattoo/plaf/BaseMenuBarUI.java create mode 100644 src/com/jtattoo/plaf/BaseMenuItemUI.java create mode 100644 src/com/jtattoo/plaf/BaseMenuUI.java create mode 100644 src/com/jtattoo/plaf/BasePanelUI.java create mode 100644 src/com/jtattoo/plaf/BasePasswordFieldUI.java create mode 100644 src/com/jtattoo/plaf/BasePopupMenuUI.java create mode 100644 src/com/jtattoo/plaf/BaseProgressBarUI.java create mode 100644 src/com/jtattoo/plaf/BaseRadioButtonMenuItemUI.java create mode 100644 src/com/jtattoo/plaf/BaseRadioButtonUI.java create mode 100644 src/com/jtattoo/plaf/BaseRootPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseScrollBarUI.java create mode 100644 src/com/jtattoo/plaf/BaseScrollButton.java create mode 100644 src/com/jtattoo/plaf/BaseScrollPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseSeparatorUI.java create mode 100644 src/com/jtattoo/plaf/BaseSliderUI.java create mode 100644 src/com/jtattoo/plaf/BaseSpinnerUI.java create mode 100644 src/com/jtattoo/plaf/BaseSplitPaneDivider.java create mode 100644 src/com/jtattoo/plaf/BaseSplitPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseTabbedPaneUI.java create mode 100644 src/com/jtattoo/plaf/BaseTableHeaderUI.java create mode 100644 src/com/jtattoo/plaf/BaseTableUI.java create mode 100644 src/com/jtattoo/plaf/BaseTextAreaUI.java create mode 100644 src/com/jtattoo/plaf/BaseTextFieldUI.java create mode 100644 src/com/jtattoo/plaf/BaseTitleButton.java create mode 100644 src/com/jtattoo/plaf/BaseTitlePane.java create mode 100644 src/com/jtattoo/plaf/BaseToggleButtonUI.java create mode 100644 src/com/jtattoo/plaf/BaseToolTipUI.java create mode 100644 src/com/jtattoo/plaf/BaseTreeUI.java create mode 100644 src/com/jtattoo/plaf/ColorHelper.java create mode 100644 src/com/jtattoo/plaf/DecorationHelper.java create mode 100644 src/com/jtattoo/plaf/JTattooUtilities.java create mode 100644 src/com/jtattoo/plaf/LazyImageIcon.java create mode 100644 src/com/jtattoo/plaf/LazyMenuArrowImageIcon.java create mode 100644 src/com/jtattoo/plaf/NoFocusButton.java create mode 100644 src/com/jtattoo/plaf/TitlePane.java create mode 100644 src/com/jtattoo/plaf/XPScrollBarUI.java create mode 100644 src/com/jtattoo/plaf/XPScrollButton.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiBorderFactory.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiBorders.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiButtonUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiCheckBoxUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiComboBoxUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiDefaultTheme.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiIconFactory.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiIcons.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiInternalFrameTitlePane.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiInternalFrameUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiLabelUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiLookAndFeel.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiMenuBarUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiPanelUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiRadioButtonUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiRootPaneUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiScrollBarUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiScrollButton.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiScrollPaneUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiSliderUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiTabbedPaneUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiTitlePane.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiToggleButtonUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiToolBarUI.java create mode 100644 src/com/jtattoo/plaf/hifi/HiFiUtils.java diff --git a/deps/JTattoo-1.6.10.jar b/deps/JTattoo-1.6.10.jar deleted file mode 100644 index 4ebf7352006a8343469617a533bbd57a6a679d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133022 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≺Im&d6_RQLH7dy?_nq27b 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 q?H#KGb} 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 z z5VCkp;Kn;y1oHg7Q|&AxEN!#5@dsu}FjYRcw#P;GE}RvOi5>R!F#bX|Jw*t^sDahK|(%iJst?B71x9Rxm;P*BC_P6q15hugt z{tVyUM1p}-f}sO4g2Kp@-}i~g@*~^BB=BS%n1-jA<2EsXgNQk7HVb;jfW-UGHHgci zv&#%u1)m;+46s2NYAx7=XeA)P^S;!kT4iEA^i6WTl>&K!tHadBqIRqoyFXlyktZ~w z>neFkNAKQeRDn9Rwa8MnMcRC+vE$))Rgv}4{Lm1LcW8gBFo4tL_pG-O(($RzF>~J2y>6MwNNtF^%OzXU?V4H2|x^sA4U*uC_z7#Q042Rogw0 zT60eO4ij7!Ig3y|p`cer2Hat=qNAh1&=Gf^mPqCX2MS|uH2xLe1*$Hl7{rv6yDvL9 z%$3;Q>WB>bt;#deQBQfU@#-i8F&b1;Fg+=nUeJxonkop#l|My> zWVV~lbG=-pCoDn4v$@dC=(6L4^(GW7mzm!EAva^aQ?cdFiqUnmz36RN5bSSAf4 zq=rwcu{nPRW*3RA4$!{BJOuI?0C~xbjUHOWZxL(egzq3PP&^19lF)+6qv0t41oXOm zAp&=Z?rA__mJWMNHLMoXpf&#ov;ww>Ye;-TM|W)otc#LBOT`bI+C8iqX0-OXatHBn zB+aG@EY8P-0@4oFPn4j27D&F?pK({lXG|UN1WFHriD6cV2=48nwvI`=Ko8_@9u{r( zQ}gKdz)u?xGANHobvdISOsIJ!zi{xKvF1Yj^#a+&#rMfVE65F>vPcpZ|-E@Q=aKU=g6q?y5g7ZhE7@Y zmq>o8D9;k<+aZ>tq1LNMn%F}#4j%TmEigAj%oi^d@6`1nJYNK@-1gtDerW_sKLuTM za&T<*t=dQ9t@>bertV83>Pd4Ught46Cc#J!J_?u&L!{DU@xV*Dob2rJ;5>&Z z4Jat689<=a0IF;xA?CD&ss@jJ`@VXrCc|^jc#LL7td$9i&(HN*z`*KWX-{VlVAbfx ztU7RdHV37&M}zwK&l&s-_QC0t1{T|+yGr|G$ij7U@D$LkQ?Y7K9QEOhD5#DMU~0EX zA(TH5ateeEb%J;guX}mq z3wbHHxk`FwgmR;z}aCqrZ1vMNF#o zF#zOBOK&cjH>Zf!g-?rk7Ab}+loC!07%nO13jHomEJ$Lk&T1W$iK$Mw@nm%j3PyXY z^Ay@uJtXpi6e!S(e|zo|uitEbj87q27rWMHegwNna`R17UA>nj;P0*1U4zRlnho=% zmqG+RD3bfN^dwR{6AU%`)zIIjOy*ph-r*A|%i_F2np1C%)xY2>j(NshV+-oWb@>JJ z`CR|^0t7X$P^Tz@qUF1A`6@+9#6DqZ_%G&`;(5*>64O&HDa454-^PjKVZcCxjWXDz z#TC#<3u0>o53yahtT!10%($DCBE&nY*bk8ZNi6=6GE&4(LVJHD7ARkd#lO3(sPtbF z`R_`d;+Q0;0HRM$^q8^sUJt%9A~HhjxW%?_1oCVy9-da4= zPzCIc{qdZU6U8NtXmDv3O;<*EJbNL(q)s`@pye!-w|80a9C$!0$NclgFfZ6B@7mkF zj8^Ux1?kuQAau~BsG|8DCactvl>_mW`n)HllYeEeQPmh7z60v#+M@IW! zM~OQio@0+L(2#FXFaUlA(mI8fvDKMh+T285e}j6TL+rj@o59V#0Ew4#38vx~*z-WF zlNU<)Pa=77?0gmR%8{*qF3IE)(n%jX)r){xcJ0P)Oh2TM0x=cJ-WH+fJ>@v{TRR$MDJ zfCKfQ(Y$Y@D;A7{UNV_tn41;cbTYD z5%EG1MxC5lXkFZa)5{oTK+tbTwwiU--WIIKxaV4YSSV-sqVI*Y^?b+fkI&=t*|^eLPIPXXPQLw)b?RTn)hRNx+Rl<7amUb~ihrkOp@p`u z^;~OSd?$1?3U^aVKBZF%r?Yjk>$$ziCd&6h`dS6&LF7u6XWd?~cGn@jT_Co@A;fy*)++#jU<_9}T5$j|Eqc<(8$Z zb{`H!Z#0W+D{*lBIW%IQ-C$3F!y8HNtlera>p3;TZl8;@$7&C^i+WZitR~~4SVxgE z(;Z=(i6PjDOw?Xs^hxIZ+aQ@QMHv2WSH#n;5iTFYt&(^Cz8TrFz1)tu&iJ6}*j7f7 ze{SNRghPwnF*A3#af`dhqetWEvu3n#F7(pq&`M*uoV-bGO4w?_^!pDj%sTh6R-I*8 zL#KogG2-+&O%zQn=S)65LX+mRZ|37+px|a zF6ycQv70jGst%I4pRni&J?HF9&I_#*GAxZBhj>l(E1vu;&=@JPtP;N4x_JaB#SE;U7QgaRh=mtZ)Z zSP=)p%0E5VBNHB%BA96;ZG$%`5o@aPEp8X}*t9acmV!^#Vl2up^4F3K^X7KZcBc?u z?Dz4YhYXuzt=R&H+L}C*jA$*x;}7C%g9{5$$Iu2?2b^JoyXU~jraBxc(i!GB z8-Hy~J2p~q3x{ylT!JNGiPjBCbd&>O_BOYgf|5Ebl*=`6&0t^}V&5Eo`{5l?Xs zZsp}F_vA$-cB!h&i!rowe0#J*?%5|UoU^sQ-6qYjM{@42(CGs#__0km=ONy}&u=zQ z`1vWZNt;}RE5Pf2^LCJ zo&3;|URaxyAZ`r-1>v_TJjerAegehY{INC}4W>J4^b^9uJq*SK+YDVNF{XviFkwB; z)tp)6IboUt^1ZB+S9h2(FCZFX$MvoNQBP<~&y{dj*0`8E$QoyJDV+CJb;3K#$0T*T zK#I!zruUt9uDBZjN~SX*{4U~lu4NCMw>Q>0L!sIzyVe4AjDpO$WwT)&v8@F=^0uvG z<@YTF=9MRlj7op!DJ{-sAF;$GF^+_kYIlp#xjPr8O<$d`m@gsb`cxdc+i9G##xUoS zauEOeIf8FzdEH*PU{`?IT%?3+IOSFa=2imr(4!Mz^xmFfA}-mgJqqKNP<@Z_()1BF-f)LAKo~j z?t1-Q84rh-zAoDR5j^tso8gj0NN4)6E>f`z!%$bzRiG1pA^s;5`p09TdLrGS=qn47 z|JpM9cU$=XvRIa)vZ;v8hWcrYjh-rlB50YoI7=3?ywXPo_remtMiO6Qn;968T1C@p zN!_3}sR{p}@cQHDsf-z?Z7GJ2e~;*P(E@Re1Hrj;>AA+`+{?=YZVvIwwcp=&82>0A z?EUmMhwm_~=(}s}0a>g)1GKcX7K1iC8*?3Rvq;y^e8De2TT7ZY2B^A4|VOM9l2sE zS~ZSfPN#|V<+*A?a92M=$jocgOjK@f{1GZR<}s0E5zgw55qg`Fje>O1w7nIsgj_lZ zg#rt0rWri&DrY3&4BTCVpk&Ify5qmCUnI=)ZzpMTdV@6z>w#332xY-zEH0vT_#i&C z4gNF`QeG$1QZ-8l=oMhU@X#x=`WW_n`PCBya+m%tdNK~XnKM%doX z2)b@K)YrnMYPU2P?WcRhdCzD0LLVFK`l&=4c$MTgW4$eJYDH@&yooCl>oxK(GY{AAR8zGGI$~(dPy=8OL>Gh3pS>L zF*c*?dp1g7f%tJt=@hL$&kCfoEkTMHm!==SAVb^5ex|1ijC{L=Tk@q0-4v%h3QBOu zRt0{=Gnhdse@^E76}CN8FoD{58*W&pmA$o;0%LVO)nSb&i=HrX!QD)PVHB-4S!hhF z3Wb!(JIQ4=6~Z}V@}9>a8c8)mn6s4Bu=yz07Zh=BkhK%>d4%lP>+J%*?V@a3><>vG z3uXZ$Qq1@9#rXP%clUn&AEJgJ_zUI>80q~$(*&~9reAPL?biA<+WjgZbMxfC;@zN? z(y#ib7u42~$MoL92St-u%w>%)3mCj5pA`-mUQSce9Cb*1`$OKbNjk+{7#^^W3&(&m zcM^?S6<9IE35&xgT8|d6nCR%}kV~YxYz|SMpz|Z9H*XmVR(@02Tl83WT zgR(VP{{G9@PE0d2L)jN|-u;U?&;D-~2$b#2%&blRrTg?hKli`O2juu_$5I1cNrcoGoza*s_6{x4ekbp0YL8C*!Lsd( z!Ll8glI{#~XuD%PBERpkYSuqH~uUz&+mH$sBovr-f-uwWTL4atD4;;i28sHX^H9w(v{XY?^+T%fe*= zGj-O0avHqR@6EVidEF1LxN0O8^=?XNcFz;=RAiVyQr|*rfWU4oiB=wO#SYyYSq3NO zXSqWGUQ=KytY&teijBvZNnfinUA{Q;?44kO_kt z{F@p{1OUNs5B;eVK4gz?oE5RFN?fteHF=}MO$w|luX!EVEG5QWnhTra>?hHDN)}np>_;AI?U!FX>dhN5hzGJe#L-69NP!wIh4^lDNR<_WF6I(H)h*%;kAiP8q*47sxW#~DJ zOPn(A3tgnMS(3Cd)t9@THLR75X@|VUCa%jT4y9s5$ZUp{!KBymjoJJPeObIrB`!*h za$K~P!z$u2gIfr;pAk||xtB`A)8S}Is_G&iRvDjSL=!uX%8K}&`wb>)&t9-@3U;9)eTZUa*_tR z%o|pi5^(iVyKEYBcr3GfE|(v@0ZES2fj~qiH)cOtERD{C=2E8LGgX^o+ttt?DLC`& zfssU{BJvN~JTDgv8UN$%&z&7L09@dj>&s{;ImEEajx25mQetfMxN+Hio!XINPBs1^ zW4MNpH6ae2xOQ#akF&_eWjl7&U^{;5|A5Uu5uDqwWv6E-aJzM6j%jAP#otDTJY>y$ zj2#8+9Ann#yjLan1oo6jjSyau^7ngw`j97t8G+VxO!&vF203rXl(VC6C-FO)g+bs61kNaddydcW;%!`VoD z%sZGz(`(5@^$ZAEc_>+Y5SN?Zfp=R>nkxovb(c#QRgRGtbeGE-m73q7oL4h61n>rs z(UxD15*oELs=t0Sg^4zR7jgnrrt<@1e#(6E7=CA%!5%~|oibZ1fL#JAw_?DAgI!Br zAuv3v#-^(UV34|>0G_>Jnu-V0AHsiNFu40o#}PaFF8*lIQ0ERnxPO9tRh`b{$91}P z-qg%;s^T#7U}d6D5af7F!fbN}nP7}eJ*22|a-3He8d*sk8#yxFP**(=&3O1*PS*R* zdNneTIi9+n55}F6(zeg-cy~f>@)#>?^kQpWhww$awB(-iA4SROW3cuLiB_HE3NTtw z{|TXjoQy|9EIgZqBEHXV=d$o4lhSP~KXrs^`sy}uY`@|bIVmmUai_q)jJZRwO3uhd zX_dEnwGn|ILN{`!^*?|qV0pnv&KzO)ng=%ZS z-yMRX1a&<*Bb*wBp?s0B00&A-BZ9C5)Qr-ABqhc^nYTC@36?s|Q1~Zu(YWn}yzL;z zc+UUF*f}+c0&K~;ZQHhO+qP}nwyoVZciXmY+qS!BUqsw{o@O5EA5=uGRrzHmhq~mU z&#|LUK2LabO1fkH0~Vd)&QJ*{>6)fe+@!SGJf%nZmRymsLel|BHcTwdvH`Rlp#|~H zURPObam_>h^>&$|*=}J9Fx%p>YIQ3Aj1oc^p@Lq{qbA z+Vf4<0b`3$s`C`O!awcV@sj4x1{doy@|lFOZubSLn10Gymr6#CH^Pi8_iwS~sHo%@ zwPveSH^Ng|S_7+o3S*CrZO8EmdEnQae!pYCs>@$pmZsWLtdf4t_E$t-`kg5U*AnKlqG|rRH6H# zDWz}=w<|aF4+Z@bRAD54AHHdJ4qfvTalhWwRIYO_bEY}>=jUv^K7dV%EQSWF!>$NW z71>H19xOH)-d;hVc*qp=jq`g_!W23jLBoB&Olk{_{7Ep@fm@BAw<%F5sBn$Gj*`3 zMBgNZju|;#&5PeU9s)h~`3pK-y7DWFCWjnctR(Ns-zUV^t{w#;$3j0`ER}dyS40?* zUKomnaxvvy)MvG&Y`Wawo+?ow_5-5wNu!GS3)Fx7mR0TmjorvyT4kKmdY*(2kNCqT zLN8~ZIb*mdD>dTSun*}Dk89u(gEo$V^8HST_TkzSgEr>m&WO=enlW4A7ng_~Y(gYo zdk8n^uD*qB1{->F3sxFo`|F=XgR^8G-Wf}Fy&digUo*ohe42Pfrf=SbWBrzWuL|Djy z!A24wyyVFAVXTWm`&1TUuCk_Cwz;LHWu>s0$hM^U4^0k$V!cX@*146tR_A*6_bz|) z=@vU7b7q?i(`%0RZ2PI7dAGgZ`|i6rAjrKvDj^99iE44e$$mE#Q=N(lWAOn&m?y_k zD1LY**MZ*WZqb+LS~T{3k5d!Sm>^w#(ic*eaTs{6jM-c~F;^D|mK?=rIJmY_Ba)o=Ei0&&`YkNL zd^^l{U$zE&1zN=&?gIQ-SkQV+1`cF!UZp`azoEI&+;_DHvZ9iY*UNw)8B6LV9Qh-F zkU{na`eJZBU#CF#X4!0E>Mx=Lh?P48$EMOZiN>-eS?siMB;P;f%cRc7@0TacG8gV7c;)K1nFF5 zLBb650tmUB&E&~tDn^SISz4V$8zYZHWS1ew29Bi#`c0~ptz{82&c#hMv0Yo4%rYTH z4Dj|R25&m6f+UcBb6ZfjNu!GvRo--sTaiq{>f=VqER%CeI7Y|*96Z)9a*3(&C?hlZ z?vd&m!Sdq;y?%2#B(X^bQ_wM^2N;OC)B(b=u*9oGe~juJM$iGIK=a2A7poMWd)az0 z{?9oPxy$GiOVNu+UZF<{zG{zUzqj^{i$AB{rVtiD7EgG^VPXH5!nB0-%%EBpxHhQL6akk zmC@E|r5Q9*@IT(S$NGu$w|FC0#&(GATPA(ptib1_(FS2hN6IKSPe!ZW6S3Ch%fK_J z`9*3oYe>PH#maOQEd*-5?a)+UlQKRuF>sLHCCJn|OAo?3z+`CPp8m0sd11VO*VAen zW&k%D($R4;u+B?8hMUWj!nKfnamNtbTA4>?MmlO04cu5rW9yNeXp%W@B7(G%D`hqO zR7+xJ8mE-MJ_?a#Z!8r&QAaAKBc7>A?@aA$4y433w#-|!Fc%k-$JjnW zENUB-Yp<({3`90#Rn6>LgV~ z(^onA8}v;^zaB&Do0iCFVWP!xwp?-o(H3UwaHD~z>X{-%X?^rO12Y#`vTDSc$pjZk zgjt@`K-vk!rsYnsE2%rkxc<8doQzcx1Fb7-U*FYPbmV8~iZ@w@4fQ+;6zepOw%6Gt zy%LIqVSg&sYdN24ymn97mTHEYrRYIF-P5pvB|rKUM0*wPuuzDGT%svUu%(z^sFBe) zL&atPa+D#>=y~{L{AlSH=>K|{Qe%nQn^<3fy34oNYLjZ#OJC+)#POXxpa96b|m`t`5kQV7-d z>|D~I{yMH>?!fXkB6?y06~AQ;{(br9oDfFzmlfP9%TXOiFycMy_!%EAc|=?tkCbZ1QL8@ydf^#w{}o#c{XqeVZOBXfrcc(;hHX#Cl* zTRlE^NMz2yfbD^s$k6s0>CK?sJ-|zZ@fvmR5TDeho+FsA5sIQC;P(OPRr^ z9=(rl>CqVy%wb-_&@ z5cfJ)BoopU=zDA;`AE56m>~_zX~fl4Hk?!F@JLb9N5iBCepe%SZS^uSciL2`aHw!Q z!M-7B6?$hXYIOHJ9}t$9mR$i9 zJWOE*COZ<-5wn~J&ap8E9g5Wuo?mz;@2FWvb7$_Kyqqk{ik5ovO+rs1cj$@r0g?vb zih;lyQ5>PXg8Q;biIh;rT3nv-um)QYg*L<)MrA3IR<$fa73C~Jlx(A-ADhMXc3h^c zpmqV-4JmT*{{l%ru)7v2?UJwpvKXslRM_KkPZ#oy*CDbGW0Eqr~{+n7TOJjRG=YRdDE~ZXG zhQ`+BPWG;LCUjN~=Dh0A9Lcwz_=!$ahH{)Jk@F%>Xq;1qL}q^okr+p^Yba8XPJF0F zm)OeIji!bkrY(J?$AsXb6{O?}BqDx$R&P6gX1#e|pLuS*duP9W_-?)VUw!do@TUOc z1Z{C`0C{+L0Q7G_Iradm0l&iE-rnHuok98ee+>cmiGjAr$VgmNG<0Nygmh$dbd@}xT6>sRF}HMF)#r#{3NRBDQ# z3X@k|XKit0fa1Q&YysDJZ*B+pY(JmkkZWYU2ffc17RtlMIiOi<9>EotlQc^L{XvTa zEJU$jv~p*oekIE@Ca@iT*_ z?$>65PgN(CjHYgfVwz_nRK5;jbp3US*5(t z@edl)!t-Es~t_R4Ex>UYdV?9S8Ic81hnvWB}D&iiXPE_KSp|EF=Zel z0CacVyIok=ybI!NpKtqjS0So@{TM)$r14-4+0>%qvfhx!W_;2a>4DZRuoGy6uHsNy z>E)vK`K4Ss;UO%i)CXJKlDChSsb=bS%G zLmH05!RPxRLd=!ax0KE-yr?pK&r3AssO(teBL=63<|r_0OF-|z!4$Q9kMXzftGvoy zn^IkVx@byv)#mIgha>(WuVrte*jhg?SFs@{y6D1kyqnuz%kE1~zXTeS7hy$x^NYhG zJlfOb-~znhq7@T`vbtemvZ!G5T6Y93-iOJh5nTkAE^dg!M7K_a^y^4GlH?~#b8G49 zDEV zO{y{wU;H%IuFP|P_)Tx%2tEK4&8VEaQ9|J}n`)STb3S1aLD?JE9MH1~t=Hz_#_=}R zHy~Kkz>MjrkIM(9=QWpsDpRcA7W5D=0^C4M9QP{uypT$qCj-R(&y z7p>N*g4A_TssZM%2)U`Uyqr(2m^2$q5T+_lTSwO@4zW1G+z-!+Kr1;Ca=~RpPW53l zG7F*VG{Zj=Kx7p);1jpD{|@3nI-%D_yIzocwh5@23UDnoNoxtEH+^X^J8pZu-2efP zD1YNce(JRWfKJA4Cq|*|d#=MgvL>a|Zy;~AojO%bb<3vRw_vjLx3s6AGzlo09o(Jw z&MQqRRBX?^I>(l^pdwHPce76X-g&cN0M17t#HSP&rXWY>|BS19kj6r4;uVs`xRJ@FIpzNx+jL+dU z&nk#xY*mqBDKZqduNJ{&UuHZ}RkI3xbCNv*?6Lf{YAQcRS=Ag3^*owjdh*+mDMmLI z&<1AztN4Ho%X6PD?0((~p*5!9;f+^978`)DsKqOVPp+Y{WX%FAX7yIgFbkgXg95>;)m5bX1G}9?wTgp={I4}t zq;oEZs(LGBqGTbH>}rTq#6SqN!9;o&IreQIt;wXv@=l@+T3a45P+l*QPAv3(vLxkV z)j)c-DDbbrIb@+KK~!IZxeEC5o1KY!1pO*1zne^Dyd0ygC^Ziger_aB!?Sg)%evTb z!A|H?R9HF-K8gMYE8$gJ0b&feE=~KgfNbP4i^dy&qP+=bjC~NBL-(h8kKf!Tu>4aD zqTIgqrvLf@0^2Ju!h$94_jJNhRkInZQeMvA8GYPOzFVX&4kc3f>kRkxK(kL?@4Q`v zQ-N8_7`m^tHYUa()e;IH`P41ZKOCAmA7M=n81n5IjY=9;ojR=BO$TYLV-KN6i;Y;P z;c+p?pqXElM3~hDFiwX)6R5mfY@kr5SZIjyiKo;AjG9)Qjtnt}9i@VPeD!bZb)LdF z4U2^FJe^enZd;peHBc9O zV&gr&jXl`2;Y5-toJtN6+b8RKL5t(fh=o6qtcN{@85tVcv|d}~2sO2POqy9W?|;2# zNe>^S-fiaedB4tubC_8JCtVL)LFr`A-b+gaA(JAdnUP^hzud~BbA)BM*Ot>l;*t$L6=oBTJXDytTA_RQwy zu2JgC8MGD*btj%S40FPCzX6b3E-{JW)15}f3RJ`XL_aO3b=0;Ow>@{~?SOGU#Yg_t zSWYd89T4o;v3=-eINEttX}nG+OF1Jg^1?JJ<|Z3D`&j}0JIwNJFHSEDC#KN#LkliX zyHyK#PVG2k*?ITb+WB|CY7dE1=CC;PLE_uAPjNi(Vg=4Z8P_ZU& zdta-5`2jo<&-!eUd2>d`#pzD#l}GxUIjKIS{2V8Un^GN-i#%1)eyfJuip?67Qlil_ zE{12}o^pxmG>rWxN%F#T6s2rmNx9Z7ji1HFQlOIA2r1kWMVh+|5b8mzag&dADHeg)>^2M7DSnoG>AQl9KRA$@YX z>lfQUV%LQNrp$(p5ASWIvt5Irx3kd`^BQ4J-1-b4z3b?;j`uR5nVT4qplZm!VCrmN z#5qlTP6-9HYAwdz$Tb*{-@d9mi*gD%W4ju)=Sp?yX+uKXJ3!J2PB(Qqt610 z6N^RU5tl&ml<5*3jirmp0x@B)Q0mfqNSyZ?gWsoV%&uD0ZWA<2JA(da^HYv|cd+o> z2~p&a#ZP>VckwS+MPM`?uZiMd0lOcv*<}T3O`~o^biXRX!@3@cds7bj=RWXERz5ID z=QO&2$&@-`#U?@Ea=IBPZ4Bzf%2!L7SN$Lb{u`CH?~B5yr!eoRu_6AP>-}77ThCMDHK<%`-=59+%*Yiv6~SU zaup*=!dlLJ{_D;;+$<7Vl}YKCr)2o0P3f4;py-FGdWP3^*y*|Z?t|q=q$9cMUWb{d zdl}V1ACCVeyCA*&*LzaMRLX8Zq$6xFNSoXZ22D%S@draMxzHljYrL&3J9@mlLT>P6 z`S&LX0}i_neD0B?bnE64p6eb^(jDBuT&m-j)Z!339Oqws2|3VneI}+cZ)~?eT87Up zpu49!Do*xMeZO2%o-5ZVk$w1RdrvjR98Id&UB`d<4~mJIuS9RUch&JXe>>e9rEIoq z^^VfTciqS9VD@U})eI_L&Aq!T&n;yF5mKozKVrb*=GlgJ zb+O`65q;y`v|@E5y~_)Wy&xy%DfwHye|c0MJ=H_qV`BxEsWIOaN3>$w-{a_(Xi`Fb zQ2aEUqYqv9v(sCWnY{*n?Aec#t#<(fMx4fkfWMLNYuO+%xUap+c78&E0hlVy7U6R{ zWEUxBKJv|OVf#;U0g9J{j?gVuw&c-8oG%5Qle52MT~xilb1Qe3o|o)MBMw(ge>;pN zzyVf6e@M;M?&8aX#-@xDaV?HZYkQF`%4-yPHeIeVs|0tsZN+A4I36mb1f{>0h`{sA z>jXNPaOE(*W=m^^&C_(=a;hVbONeu*>j{o@59&faEr%43*v>EkytxZmtsP))7KV^nh{^b ze@ud_{pc0+hRWWo4m<=9SdMmvV|~ZF;G}8X3CAOyregEM?eSDu zKOJEND);pQH@=^a_AUHa&(#r&)k-CAaOhq@ReY8mHiTc4UZqIre-TlsrzP>9Ik4qZJ-7B-D%uA@ zJ}fQQeFRDu6Ez=Su8|df^D&d$A&x{Oh=yER%f@zm3aL5P7*vn5MSVil_jc`F3NLOa zgo5uZl|z!>Tnepk;O941*{Ps$vFUt$a3PeA>us2pa(lUe=Gwa6eW~RxjA``4VMS^)r@O$$z#y zq!fJBPu+Y?tEB3yS*sp1rT#APBPG9X`7Zo{;zc=>m+d(4=(0B7s&6$g-L!i0C8pBN ze{BNFIMHq9xv1Bb`Q?Inv`+wCnW7x2I;W?v_cb?P8HGr5{$(KoW`_q5sNXBm1ZI|B z?`DP~+d7DXXz1*S^U3>mnwfO6fmf8!xCT(8Lstj19HGaz$eGkX1ltQh3jcG{?_D=~ zd9=?|ZO)PggDDHSB(Hdl%K(P$^_aI4tLwpb#49#8x%MUWan=srk{}oub3wVV5sr0p z*ldvSJ`a&upT@RDITNU?5wp7Lo3)nwKWZ8N-ct-jN4En_o72$_nd#?jmNmYYr{Xyk5@bc7bxK=VRM zsO6oNnWW6Nu2@{Zzc&av z-KC`T*n&o{``PtMJ*oAxb>Z{+6ZbCW7+NilR|77!x~s@FOBhSe%3nwRRL*VOV78~{ zHirUYy>bj$BBxXZzMcfFz?F;cx_#3#y12?tco-S|pd#spf@n1FzzN{3IIi;azO1e4 z&L-s#@$6@}u&V4b**h1T>y7&gkln@ggBU=lc_Mg#%+0h}_Re=YzLN_NY^b@hAE+2y zo5kd}_s=+{VdtZJz(AgKCb{FjXoHQ8lA$U9@b@Th!XZ3N-^U-9`T1@?J5kXZvGPYF zv0&2`t$pq1@NQ|jv7MWBP_vNy_Qu2?&EQVD;J#z6riATp68+cS7Q|u3)>}+Mr%Qey z-^@iM>gi^QOzqzb{mb!g$-xvFD*`2(ieNM1sL&Z#&Es;oNM&bCe zX&(epcuv%Y(=_yW*xB&mjGj7-biVOBDsWn#?9}cBers3TlcMD%lhNv{(I3s@X~a9f z*!k6#F1hZMOY|Xd5B``lQ{#M`~* zQQz}r8%~crymX&}7`4AiPZNcRLx)TrS0NAkB>JttZBzZc-`=YQ4_c6QCe&aRaoTA# zxl}?uT4`;QNB#|3QWX_y_?zI-QKtn&OpEPyQSs<<>^Loi24PE29sz zW5-syd~1(Mz9(^S9SF~ea`%UqG%NKE1hDTS3sh0@Z>>ZO9hKHAv;iq ztL0f$`Dun6c-WnO^kYheJTg}zmC9gUMVu{0UI3qcLG|moOmvEbmGYFjYq+Y0Kgo+) z1p&kw+BLwY+`?Kynuwop>l#X&4f{LR&L984CQ-Uk!Psz7HcZ~Qrkf8wi2^Fj^84Ah ztWUA_{w-Nr@~dSC52x|M%RG4V3B*9G0;mx~;7nsUEkvAL7`1>Z8W!;Mr*DtFzakwK ziX2wC9gxX${RSm&&d?nSSHaMIB47h02bOh~xaXaaBAIZb%JDenyx#jb%mUkGZ9t|J z9hp3Ww~NRa=x7_ zlayIzZk-{!=FKF^^Xf*{nY^kpa|p7fnb&)VBl9qdqsIlj%!IYBSZ zG_b3ir~qo^R8GnKBYJoh2=ud5l;nniQ2t{Af=!4-nHjxv^_~lNScOqc zY=07O47tdn2Ou-wW#=Ma#!vo-IGj@LwlO-sMvs&QY*|=F+qYzT4Jw@T|Kaq)u1uf0hB=bZ#2ON{*T}e>U{)( z78VSr=o_7d&?=D-N-}ndQOONR@t#l_6Cwa3WAE*rrCNa1scQ;feU*rijwkMLKB;@t z2b)1oNA@R&XPNYAXUs&Fz(kA-#NY&LA7o-YSLLEes8-SNi?Ki?s{6RS4z=ePoycQR zIQA=l!9_F7JZ!`Q`~=X&^coETJTaPQoA{{SS>WDg&0hvNay$>B05mdO0BF|_T!*a6S3U9S z3HEv)fCRMaSGjTIS1*PUSk7Iv>NKe*DrRT!EWQ+flVmOA6lLr#XG)=FVlt5@f@hlu zO~tl?U`e9H5j2x$skBhg-~r?{D3V({Bx)gf*bQj3>}UIx_<(D^PoK*7W(9WVraVu9 z1IqOocUyp(G$RwLy35D0WJN&8*Y1`6g4v+MW}fyMwtMK4_u_#+htna>|>H!eJRn)IwmM$GXq5 z^*1iz<=n0J>tCIJHC#KKQnAlkeOVHwIVmz+g?x2X{ZU+$dBI0bl`;q<3Fd1TsemWOVb!Q|Uq?ABPjZIN7u`qQUN(y-I1<6R0R zcpC-51DI2VNQoAn=xey?v2E=BdF4Oylj&&vU2*@yNgu~j@u23*-tXIR4?(Y*4dIu7 zwy|Ed&+RKx>0`qB{WEtEwK*PiD1h4dg8;yFVH3?!GzfT`R`n+F3(|o^xL-zL1?LT`P_?a@(rOOxB49 zJfxzHvXq$%tN|Hw*vc6xRp%m5`ljBwyEwxIbZrdm&45P@|2Sg5f*NyW+oz}kz>~54*D7s!|tNEgt4l^<4AZyCrm3e|sNroT*{Vo7hU zF+hYK4p~yka>o>dyLS*}x(#kzPQEMB-8(2X)zj}>^5@8Y~7%4{SF+Dm`Q=cI6qx!Ki~+utgo|jXYb(M0>Q> zLLQ;7wF?w%*54CyF$YC1?1LCD9s>UO@dZ(|7Ki9i)_D3;*MCsCUtI|t$KgZqTIVe_<(Y6YC(OXgFD4}miFTikgFvZ$ojID? zl#=Z3W>^SR4SC+wPM6mcMU*Gl7?Xvq$>*DQx3l(K$n9%+VLhmOj5l)m8GxRwN@A2+5dvNE zhG(;6`?dbZ=o)BPf@QlFwbO)I$UW$%6eTmvJ2rp=FDJj=q-A?d=;MaYe#g8B89TYx zrZ#kDuJ7c+$ImxdJogYh{wVL-NzXB?!Y0dVgt|lsrAbzx5Xkv%IdPuc&Ha;kSYGvE zVPTbJs&v2VatN~4mHniurDlxYPL>srVHxJZq@{d z$58@TeClZTNf4QzjUjmzwGDnMLSB!fnc|JxhokrKxkV`ocUJ+$M^YPDs3{a z6JAt1!^}(hw{Ps`_j?ag8Jd-(i1Vt6Rgh6!-e$W$w)N8tgD2({l-@$$D++_6wAy6E zfi^^c9ftpojZrW?1rn5r{c>PJcD z!C#~h7mW>U1W5EKq!ME)8q--sNaf^p%U=$yEq4McO=KvY(O0<%{fsHfa$d^r@!G=X zGOD->5Nu!hK`-5saoPNiIk6qlDEW-8%hMJ)^3Oq(!3gb)`!3XNKamzWk5s);-a2by7T6+CPX}q^-2+INd7~ zuj%d|bW!-6fq4Vc#X9K~{DPU26z95bv?3joA8p#Om7mSe#qq0lHGhD1Ve}Ft;&mv9 z#58)cJbx@|Qt^4Q-AwX7i&V4@e>>!600Fj+N9`#`x7S)HQcm{{$FEK|TCWlkvkVSH z3$-;sJ;0Vx-q<+4Rj$FQ3$7yIKow5Yy$ZOWfqW1ke5{f6sH5p8t>}mc!1|m81trH$uCOFE ztW+Ragj6=Lu&_Y0*f5Uo_hbDHAAQ<&*=64S$@7`r`1;uQa`ZwCsROO_V5G6q+)d0X|S%g6^}N53c1*d0U0Sx$O?rh`3mxMa(Zr3zF8_1)v4Jl|c~5prAQd;dY(EcjOW3(B#jE`mo=J9f zo<#>L?j;tPZ{&rZlq)8#&j^x;7@Ym;ZETBC z;wI(xf|CY+YMABQNf~=e()wwYdmP(30z$z@3!F;kMvu)>OLBSJ!f!ukyEqj!y^!UN}G?M8mOEk1+!)bJL#lqL2o4leON0wo3JND3@JGecnnJrMJRZ=wMq zPdJzB@kXXENGcgQ)#580QS!%qb9_7b=th~0+rue>^i~B7OC~0Ttqh5GHD9KJpZYe3 zP(DvmSp2ED(H6a&0e}xA&(c1hDg|v(Ng=M?mfTqE1M}9_jgJ0~mEHy^Zz2cfgK4#5& zN$n)Mo$a+#pz9GzqgaPCgK2(*>)hic^KtG{G%DCnnf2=jWrA&87xx4}q|OIinm4b# zDFj&YFGo9+`dJ`ADQE*PzrnqpJd98g3Od6De9RJX*PXX2rUVjUyHlaclO^t5o#e~5 z)2F2+CKL=Mo;3tRTD^-o?#vtg)M3_(zhToLeC0k5Ye(q(CO%%U-(!rVQ!>95C|U7< zB;;|N%vK&M2e2sZ4215xc4Y zz5Zv5s5;jfx8t^gm-c~%tik7pEPU)gIDhp0F zphjRcotrho2*0}c#58bDEvW#CGn_C)W0o?l@> zl1Dz?sbJ-ipqb>+x4|ZCrk%fv{ZymEjfxZiY`QhRr9f+=Uta>wmw;Lcd(#luw~^kW ze^JyPLYMz-EMIP@tyZawgGVWWXWU-*{s!GPk6$|k+BxpkcJtya4@#wyY8Pz16ET!E zL$K`;Qjo&y8skZ1{?Qm3Y=8PbbEG;+7x{2CZ{nFVxdW^^?31)^N6m()mGq2Uz(t-@EGXoK zDzl$UL)F1fyy@eWC}g8*JSn6*S!){+gL9}Px~Qts0GdOcaU_FFx;_sCe_JizRi#d7 z=aSXFo&53*nzTI}TdT6KzGi&e;UO3@@Xq7u@GD}-=@tme^a3g5A|0U7RxDECUdZU zyVo+MJMR+rI5HoLkRd+nc=lmab+=HQQ_T{NY!+DEX?B1AuCedxEfL>8)G41(aIx;% zub%?lc(1U$%hArNH^LZ_{y`a2fofHF+Ichq3TCr9g~;!hlMmXx2O{FVqn7HvWn(c7 z`!ba8W`vY95_-~mu!=|rpYe<03v-a|AxJHLDS9m-nE5Kpa84KLnk{} zgc{3M!Vh)y(W5rWoXb?E!GG&E#&`5L^WO!~%E4(Jz3Hl6WU0+Dmeh6^D<9iq| zZgUkL2aG4ASHVbORH$yh#?N&MOR~p#n~T@##l|Ku9%mD=XX;iUIyzr`+KSeI(hW%tD)urc z)TiG?>w=+iiznjA6$**qq?PR;1FZw!#nI{-MnJ+0+0eLmrh^48a& zlt6{UAvsZ>14KgCcbDQN%0V}|5Bsd+Jj3fz@Yk0onc!-r1L)X5X{ugu1FcEB_B;|K zDc(EavBSc=VNhq~w6tnNFT8>O}{7ZaRmmWJk^(C5U zW_oH!7v_kp88`!Cy=g2IAKE+8HC@l(L=5jK$>lZmmsh_aJ;bm8^( z%u&+Jtzo5tn(Mh^PPG0CI$%|pRgt^#U;FoKvDEYx#dg?(i7L34{Eab^-FC|`R=y3_ zk~-$B9LsW(UJU8H*duzd7?m`6RM&ngOuBY_QtP=aQ(SL2{=J7|Mof;d=$Rb=Fh4T8 z$bG}KhVv|M%H*dqLe8ILGnJERBHY{e z>ySt{nvyvV&J+aydrH`JHTP1fA}U!^)myKb;DeWd<{7WzNYHfV4Q8xF`=>N{N#oN| zTA)`ZdS0ph5Rw%nTe$i;6jmPVkxr-vwWkE zPB0p!6jI&~okGO&OrdHyx%X)E9vxCh$^1Q7$~Mlr3)!elQ|64bi`ZWo(|&lUD!@k< zaYov!Q5@w>_8?9-c?m&U+Vcr5P7r$x)3Y^KyAuFb;{qO48iRe@HHIzuMr^p`0F7T* z>fmQ-AX&a99r@Diyinc;3N|2&%$d@e7HD~{J5{CXkkGe7bd#rQFFGsLw$&jCxifF0 zFop~9aS&%grn}C2FlWdlEia`3!NSJ#%3igmG^9^;<7V0Jxj#%Le{{w+oDKglwu@DI zovp%j-ARj%h_T2TQKt{3?m!fyk3+~iyQ%GPo`Tbf)*`(tad|&JEx~}Xt<&| z>C8PrVud=lA1aT=xT7&jy->n4(yq@>g0yp2HhHE<%x!L=oxEejgx<;-;%} ztPPqEJDhW8x+ROxM0_VaITlD8@7s|rzPoqx7oBakf^_p3lG(K)|B6&RUno{Pqwk^z zrchnF`NAh}2vA~}=3SHK`YX8UDBrviZhBqXSG_-3Ex)=>zSQD!Ie?WJ$tQ5)jC$`j zn%rtwlKy+jI*WKnsTC`j^ouU_zPPlK-WzxO#b@QG1CRnTsQcbQvB{glPIW$pMr*rZ z%(G&?$}BD=KjBlTxcSGkl>5BM`Gru&OqIQxPX2^DRAIB`+DL^9ke1uG&(e8&xBNj--sQ%QZa?v^{?555A z>gm{7vy$}LyhX>}i;CA`O!;pt<(_}BMmj?^u7CD1jO`d8jx?Wh{|zrL!x1<2jWORK zlkGg=i5SfMvd#{5Q+BYBWCeBg6H<05?z1mR(=ozZT?{WPe{vj_U+6ek@&-fHi7vKm z`!C+!F}kv^S@iC7Y}>YN?AW$#yMvBxr(?Tg+fK*UjypCxx%uDc;?aH2Iqw+ve%X7E zu|BNYHLF(DnpLxYKOkWToxaTdkz9f z&I>6Kr`IZ7moOHIA1nds4h%AS)^rLT??f&8tt6e4xMoz+La~q9Jtsnm;0S$*+FPXn zZ-OHdO`Nf_~qVf?+%C(9^a42q_B%)m0XbhWeOm|`DcPxdQguHy+; zB6QxvtwO6i-fBGCGbLnvYPv=1R;();C$3(*%<=BlM|+@4@5GI_^!{hJU&iNs;_0cr z-jL4cEzqU`-ia1I+=2!?T1nzH1ncu{1oXFF2W~T^XB_$hqO*$7?|Sidd>T;3;7_Tmhgi9LjQn(!drfm zqq5=WUxz;4{>eHYIigatPsvP=a7%Dk-zl2;97CS~N((wOe~8f~QE%dfB`d!m5$=(v zsZ_o=V0NzX^LDG>hh3EV_AcrOqkD<V*Pw2S5MMT>beY{nQ@es z=bKy6;KSJ%Lrjm|3&x4M2*8I|(k!QZ4#Ti#Y~;Hw*R8fg6&wuvV#{%B0tfge*bV81 z8|#m5aM37Jlu2?Paa+;70H;N9wZ+w~O;r)YEXozr?E|&Ul*S__6)S^jSuo zv>}C3?Uv@1-27i+V)irUg@|Lj%tP6}+xO?1QmXGtyiw^*M?G$)xFRi@YSpYGN_soo zA^ru0$yxfNUTNMvv65xnq}a1b~OOU0(Oo;{G{kWwlO_b;I>`9I{H)q%pWr4PXIj>(G>rJ=9^Jquqz`Ay( zLN3EC#e13o35pZVDKYil^}1=AgFTHaT0mmZ^}}_|*<}sS*em>vZ!6@|sph zIf>?sYIn=r$eTLb1?0r&wXfr^zYy+b2U$(Q1vYokHFU+YWU-KvJkej0^7%QnW|n&|5+ zdb1yI>fPu^moQ*3tx){wU*|LTB>QlgEdSb-_#qsvLp;i!_r<$4+sH9UHzKg6mErK} z)C8C!XcFv=KcFY?U)5j!$$23RSwpPQ7#c?oOPcEPa-(}{9uPU!=yH7_*|a1te!y~TDMJD^wxC;cE9)-^6A-dYqeleNLe?_!we z_c`0P_rm%`9h`^Jg-+g~MrIC{CMHpQ^>r|f{?FNg(@N9NPBHHuxj8_X#F8SyyF__b z%)65(iK^EAWVnyvVM0pNcunx*`Z0sFz;pJ!dcBbjiH*{Y^$l`&zioY2!0Sw^7K*YqFIusE(Bg)IjsP&j&`p{lWcBSR0Dndggx(74VG&*GjG|fj40{vdpdapFF>dtOMmvk9acwP}c^ZL4^ot@^ z%g7L?1@VWj%zi@Uhv9l?DmkvYw4OGLpu-ty$Pc|A^WOJe$m2Jd(0KM@p|0Q82D%4@ zgKd+TD=^oelzHm<8_kqhdmC$_H4~FVU6|!^VB^on*;LCzoF^N8VvMGHjULJwv?~dn z;MNj;^Q+M!WeotR9&ER%K_b6g9Vj@5AC2L^N~TW|AAsZ{ZTBnGCiZ6gc!iSZ@b5VG zK04Vx*Kp0Vc>mg$IQdd-)doQD?)N(oUZ4B}Y!Dz}D0Z^ZFB&~dki=>_}EO~9DTPqfG?dYj9Z zdsSPP>S@+ij%dM#Kb=*yE8|*sB|S$Gdf4M+o-S`skLx}WU|2o&%pz*I#lY+vm2Z_U z?JPnI*~m{ZKN+~?*bQx;WQ^%~pUk4R6Lrk=fRB4;GF0OP9fEk-VTq*Yrt!0k&40H# zpBN9BW@w^2#W#5nifwn7w;*}6=rJxB+E}Dc5vOBoh)bs%muz;u#Tw%h(`gP02va@R zs?J`bb_;g@ViR!waqVakH`9W5Tbhj|*?UkLo4hP9jCE=Ct7;UsX{G zi`UygZkl*MX6vvgr~}Ye7V?#nfm@uikMhMdU{1O{>2v(AQC{1sL33CBhnU=ghzSjP zh|o^^LTG=y@O^GTR!lAJV{bYSDya`sRWN=Aq&uG8RyMU?sQ_~Hpf^dx>n9W@0iQR~ zC@P#H;-3rmwy%D;?@Z|yBL1^THB;BvloqW0+i`ZCom%B(QgR5Ech_PQyUAWzMq^RaHLA5O#kilgg zg(QHd!GLu0&4p^&9lhU%2|A%DBNwjTcZs=omJo86Nmi@(K_zL<*0Fp{Z@d7p1-3<2 zB0q1M_Zd1>zn=79UAbA5&zVZ6BAv9Ls{02^O32-L_-uF9@Wg|3-A?iAutA}48jY{k zS5|N_tL0XszxB1-?dBHu^vhpj+h3E;5@xlYFBwA)*WQfnix5EwOIb&|xHzuDKOFP* zk39)2n{^aCpYn27@)kh`39%fO!VZ26pNIcu0Nff-xUQjRkV=W|;uG~Jt0P+_T zW3NQ_W%2Bhidc3qVuoK4GYvKfnJPCzDyV&}IltG_YlFlxPaTAnEen@U4UiE3=4&Ky z&cFC7zow(DzQB}{YVQLj-uyZgPaZ)S?eV($FgjqYKA4$#r>ZMyV3Fe?^EL2p7>|ZH zq0kaaHGFY7nk|eNPtg{D z*F+AoL~&Zc>D)TQSNc3pT*c0?O?ZE9pyuCtN8}tReDLBt5ee+Ax$!W;mx-j-HZ83K zUl&&ugfq|tGn7LQ=E3A+>t?JLN^L@~SyP{mmZp^m>j>l;RaDOc3iik& z2uiteL~{a`U!WY%SY%1`b{x51yDE7sj|l1TkJ(uB?Saeb24s!}>5T`pqj%IXC^J(( zIr3;uuH}3ApmY;1O43lvnO?U|0FA@_dn=3PKk6IVjJIpGfG2ySmSF&)JLw)44eV$< zi=63Xz2FRCH_Se5MLm$=$=Edg`=1Xi+F88pyE;VEks*6~&JS~g8(at^JdYZQ_#X!L!d(^c&&<0cr=_j~c1? z;cKLQ-W~%rYh?C0=gJ?o(sgKj$2)YIFxC)5yP$}4FDhnPv7oQ-_trYVE(NA<*);?? z8Iyw_20{9m_v0yyG5WyAB$I5O(B5OKq$k|n64!JhS>GaPw{p;S|s#R62`BVR0~Lc@xR$R24#h z;b6E0ek!pEitr?l=8l`94YcupjX{^-+uA(NL8Tk?$gy{0>NRVcW?F2hF#^PERe$1{ zInslS5*4gW!;9Eq>d{EJGYUQviJ?muzKB*n_imSJ=6oJ>fXsuWEiC$O-%HfUlD12M zGZQ?fd^K=q=5zt@NhJQlo1|st;2~G+o+)#LZ1A`-%3PN)#9+vA6YRN^G>UER$p16l zi|Z9om?~JXfRzaB4K3^oiLs~c4RqsS)0h36u6h0Tr~)r~RP(GjyWJFS_O0MItTL#R z|J2!>(lQ?Qq^SLlPuYDEngrI%!q-sll=Yv`LgQbYs8R4Nb}AY?0%jIfY0QVyC!%}D zSaCM5`qKlHwaavt1FRvs!Mo%Kh}jY^<{aC}Ln@8^c9|njC6b&z_FBx_MP#e&c=RS) zPu;pZqD}R+J&rZ9iF%f6n12y5#*KZR-`F}wbRGDTk`@~-I9fLY$r4a=qeUYON*&m7 zYPMr(pO*#hvXecA)lDE(qLLw;lRyQ9n1$89asSzUVg?{ zFsp;V52qYcG4d?~14noIS8mcFnZ}ZK_hVx{g(EGiOL;K>%YooG`O6K^0dH_!`wWi5 ziYthqwU1{-jQOGK#O|=G1t-f_@oqpO_fOy!+@5FTFDl*VI*m$O^Q-&$D^(IWIoOsW zMY~(c@0aREnXL!Yor@@?Ot3o%#_wp7%`|%srrAi0LGuyjm0= z!?vq6%WIIE}aFoIRE1iSZ%y&orRy*Ax0fwGSH zB`*m;e*$3`!xANx4ppZOat#sifA_iWTI0<%m=Mq~ag69yLs;Dkjb=IG48TPB_{RzH zSPl@!bDTJSqT*vKvr&HqTvy4!OqZyH=zP8`q(iSXrSTClPq{`qpUQ&q8&MvcKg6~9 zrk7G?Ykc3X9V=1waICW%e;OW)Pmcl-S9PA!MiBBizAsoCE~ww)V(SS|XXo93$DxCY z`bAZ12?MmBPO6h|>=kU#O!$t&%6`Uf1rSP51+V$`4HR2u*f zA&`1oq7<^E*n`6YVQ6X1u=aFpMIN40{i>@A5dRM?T^ z7W?i_miflBPjA?TaDZ1R$N8#1hrerp5jg|n zWVs~hcJ}J)pILh6sm1pvP|GLiOD7q_%2rOLj!oC?nXK>WrA0$*!(6h{fL3VfdC(wE zV1e&Xj2lVDl7B=A z_K5YAo+T|fsC;1r3-tr6rrSkTtBE~WID<-0Fw3cf;FUGPPNW$4IEdtsWE>I_QuHlc zEP6-KIhDazTTGNd7Msfy4;*+FiB4VVzOA|CPmr_&%kLX<;KmCFNOE-2)->yy#^U@6 zSrK(Yo5`nXSsAPMh2C1ohr4YRMSFhKw5l<>$ZuBPNa;cCfcs@Vc(%DwM1gBAcCSM> zJR_UZ@GVn8%jA4`gw%i2n7^D24(f8wI5N>AJH1^0`Hd9T zxT9k&X(yKMM|a25p@N#wAWZaqN5nkF^+XrOu(e(eN6+x*&|)F+^BykN!tx}7$3I&V z>Csw?A{SIcoWYSR-^Y5SuVc23$Tk(Ke4mQbiBSB)qGJb?~qkc6N5~V6d<mU@2G`;4Tb_0eJYpul#S=VDx0jCx$8g6W@c#dAIdg}ozAU^g@VDx##}r4RD~qz zYHx040o?gl(SArM9cJYpDOZr2naTTK{uN)g1p>Y5%ze{Ztwn2Ne@jeXWa_r;q2( z!f@XH5D8JQA^blrsL#gn3Bo61ulG}H4FBJhiN9&h)zZz**uc`k`F|VPz8TVAMuvoh z^fx>E2n2^srPpb;UaW9CU9wwiw3eK=qD zxY%g>_INQ8M~E%nM}-9xx~7CB1qDS7LI?*PM}@<4!Pdkk zmg1;qS)dzrUx`)h8V(}N9;GR_4=iu4PdpuOt2u-`LVr8$uCHU#1pOz?7L@MzuzqTG z;6H1R|4Xw5f3cAr+&}rA|I3g6Ma2mM)$>VB4m0yTEkYmHC_xTCWV;3TP#g2GByl4M_Y5F#MxcVU!JW>LKzBXL0HC*w$Kxq<9`~na$Np;;{;Ao2W8wdz;{W#+ z&H|y10sZ+L$NM3cVd~0-ldjF3khfwTm6V7I zEj%UnC$fS91UfghRxYJ+#j!ZR2pcp=i6VCpWMlyIkn2ZDXE>UVQ|R)ly2yiYp$k+T z7bfUP5ViH$oA4pL26qp>wWiIsE?UD&!F2WWR}>sxyyl-#o73c0`$~>^C-3i}w=>EX zc!q|i$4E;xl^jo=W!&O9*&+X6=YP>sJ%d%YF(JQvN&m!a{#&51h>?q#h=cPdH`s;j zuisMkpE-lQk*&D1k=_5e@IQdU>YJa4P4tiInxYgA+-rIrpA`^Zaj06`Wv-e!%O|Kh zs9`LoW|Je61Po2ObCh#q-J8XdXZf{~6Ut}nts6zbMphw~G1(En6M*^6N=El1F0YRl0E|G&&`aH$iQwYQHrX9 z!@}t2-Pz_d7GY@H^9%tfXr)C5_Im6$(Shw(^&d^dmpKe>f$Cf%4|2aKf!fX z=&mEP4c&52oklp*-@y{jGEbkCZTf-l}fnd8r!=O`Q&+|u5L50l=K&uIhlBpZTYxQlB33JYb zv?lYr$Za%jev^04Z*>-%sx5{}P?-tWZ}(ftX52}cW9!N_KF(=2CV%F)NLM^(B|FJ2ICI%$l5wBZT&* zDGM%CRZr56fFd$a)Z;xJbY=4vY;`()R7ZTSrwp#c_HY_vh6y#fQkhM}+s?IXnL!`O zS%USRp1oBC-9THqY4y`#gv;dKbf<%%Fkd0KKM=5yy*Qx@MTr%Y!_R3L4ImMdGMpdI z?4~V2E-d@eY?PtKtkwutd+b5hLd7an<1D47vV#ive8k7-Eli~l$EZX8sic{G;eA6n zFMXU&t5g>;etgD{Q?AXMNz%zrJkme)rzLEhmnefo@jgLa81ImCpy8Qbb z*|e(#^ZKD6W2pmuBur5zmJ$hRYTpyqxBwl#0NxIW#4~8*8Y$tZ+_)Eg+`9*ass~ar zL`XQP-~}=8ILQ=kd?`K74Z{Lw2{wXqjb{s_lpIH4CdDcSJ0ZKa|0UO()cWNeGVfTW zUm3$hRQyZJ722>>>Tw3mylTUb5>m6w-xq~`_-=HY0RBI|A)y@xJJ4}$q8V+&vZp*G zU0ddJg|%I>M)SUd5frHx#M5lPA)p?Qzg)8{rBUT5!%LF5sN{FkxnfWY5PgAg(-9*~ zMAOEaSp#CTanw#Zmg7irprZ46GV|aS4Oj@q{l(>Rrg0P$M<^5#S=40jklbm$&LvFe z38+vB?2EYzdh5wjN;Qb~M7uLnGl-r(_Z}KBd1j#1d@XjnNDe9zn^Art_#;kmibErO-s7=^xF`UC)ksr>~@txi=H)8 zB#Mq*iM3Wj@$Qv2^4|L0m9%}5n>VS#Ca6+c-HY6Fpu+OV!j;$}C}(LH6b~$B8HcG- z6n5)d!*PwjX0`^iGe;~Bn)wiwTqmUW9RXq9$;|7BYk<5?@cx*~*9uOcA1IvHU7q6B zNHfy(K<;vx{f)bA(PVGZ^Tz;jlv2TPcnzFln2)V(_+6LIJq(d}R2>Ge#7+?;WfWFZ zT%jbi5%febtCOH}LCZ@OVKB>_eICi0!X$&51&DrKoQs76xv4GDOa0@S?wGUH(VV|N zy5&Mzu+qvjg+%EJB7h0am= zA$h&g8F83%j@u=%B%(>D0^0q(m1>sMMg^7U;+z_>#rfM@Pj>O?f-MNoc0j2V3fZ=! zlY{Yh^N_0cYgALDKZyVPE&Z=>OVX{=Cj5!#8$$a((5(MC+$uUax;e_3*}MHM2LCP8 z7HdL#{soMfnf&3Ek(P$^HAtL8O8`Gnl4htFIy^pH6jb|bLXN zdm|7G{X-Cbfw?%XU}>ROtZ%xhY2b*t2=^9-^bDNo9@(+9aH_k~pgp~6U-j&E(ptsy z450g(Sad1BE#tO=aKae-I<6cj5({-H2D1AGe%!Qk zhPUg8-RTiGTNl!Cj@{VjZ_-Uf)3rb?Fp~A8?h;^MEIReXR`U=LB@brHTht^;qJ}on zwWw>msT;J*bKpQ7ICYS2_Jd7DBxlPbhaO37&{N=~M!UJg=fMo~^-8*FDV6?YcdwVr zGasG|CpSJBfO;QICI_pYjaVz-O0C7bb8lH46I0j8@}SYla;NPclpZ!cx3fN}!GgtS z9+6%h;o6q7R;j=5Ak5ySlZQ=PHJXI_& z$3P-78B@HlCQXB9^iy(cOT4sWL~6x{Q6-l2$-5o;8|`P^UDbeYR?95+NfDE4qc{54_PIOfTzd9 zbnf>_WK$_l=CeZQ&Sln;C=_CG`qE(?Wyz8mS_a-Vt}4i?4jxvO$foj*|8zc?yR z$A_{yTE=xeA|+W&iZ*59=8!PIS?#*MrAiisFWlHqim=Gjk5 zH*DPu|Lf!^8t7{6=ACr@u#s*G5EJH8KnJ17bV9>r>gCOHmSc`OM?d30ZD0`37&WO(9C$ngbPxbay4A3e7Qoh;4LFd~Fe8F$3+88bYwf2Kcyx}SJ1eje8@j99)7 zjkw%>rHD=2Rj^#VE{PD_lR|aaW#rl7xYp=20qUJ`Tywtp){1erq6H`4RuD8XD;sk9gL;gr>&#S=Se9Arjv{qq?BOMlDG|v`t+-yA0hc|Qz&qYUmPrw%P zSoZ0dF8J6sd7c|;-ug_&Cb`)~1 z&{dFz1*;pBRF^1dyfWYBH2?WFOi@D$lP084w>c|wHU}qB{|q{}V(EJ`GARdKqO(&U zxmBACkHE+`s2{|wEN(doq{tT|`avPO+C)Wkl)*ZUw7~)gt<*hEc#03d*bDb3PmnWCFJvw6>k92-fx*oRxAUDn^p&3EjdAos)1QG zZ#Al*h_!l0M^foRZ?+&QwHHa*ixEHUvl&Zwqu?%{;^y%yn?GfT^sGI_&t5kCnU!~r zz35jTP{8UrIBQRuu{;jKV*IyrDD5be_N=`FnAkL0=FpmcvUVKES@v|{2ZK z?eo|zoRn0CWIlKVOqe)>2f zZ-4fm7-7>*$1vqc;9A%~Q(WKv#8;Xg4~h?%vS48X^(a8qqcV&9fjr>+u*0Vth7Ok! z(c&!Jv<^!X06bPFZo!2vd7vFNl2lPd1b~2NkH(8iu;7BfTMH;r8%Wm@LN1*CN!K>$ z|0TI_zt{VsSl#NCdAbruF5m6NSwd*L5DRZ(1TYz~JWCF$uvri%!kgULS@XjK*0WMx z;!gBuHrv{A)zTrMQw0HR$c3;*hzrVz@l1R>b@sGTf5eHOKS1sd?P!qI^GD7A<=t1cxhS-fG)ulN+4*DiOtFr# z5dC7Ru3>|spYzyv5Y_pdR`gwBoOA20f?Wd(9oXJ8n0b$C4B3;P!xqF5 zJGSOb`(_XT{eSqfHwW_xX0yngt{0SG1d!W4ziN)f-^sskT}xk?$dY2W3|Hoiv`HzG zW;>BeUkt;s%WLe())-8nEf67jOu;kgNzR6#=}}2w;)qyK@c?GAxp@k|GaR)l86)|Q zhMbea6~;M1VZNXqHw1P!QfP=Q?Y}4!%HP20OtC3*kkC9}E)euebDFeIvT~S&PQw3~ zCAyuQO4s_aT(!nT3w1-D`s#yqaBGsKFyPlMR0H3zk@X;1^IdGET5b|&Khy^X;1{Z( z=BzMK_nXjrFfRMGl{oAj_8*hd^4{SDY=|#k+~Gd!ApdSR|Noejs#qGCI(YnjYFe$X z<$$Y(_I{BOLFsP3K~avYo9PO>LnmhmLrzA{2Aj`duaek!79YVcRpQ1s%xX1`V79HF z5Fa1!xf=q>k?{p(-2|LbQu2xrNr8`KXMd?~tGk5cOXZ3hn#gL%|wV zN3=kE7bdvBuCv(paW^$`ohFx@ukz_+vgj{O=QhdIEYOPcYdZP{?1!K8mUaP^uZvVP zGqr17wr;{T#<|HsSoNs5if22|Ul9PWtXd9rkGh7C0Y~>3w-35Mv+xT3JkX-R!?2;* zwIEg9JQT4Uox!^Q?83W?^^Owzxq}wi=eC|r-qE^a{-=-a!_+jngNkVGt@X`upSPLB zaJf_H7K86B0W9viVRGiHg>AQkERj;wIj)K8Mhhd?C(y4WK&2z6k)>vO8WYo29@zd( zQ@etBwv+QR#@j0nbX#9;0K;9UfreUo$`ki~56@1P-f3x?@tR|h3%8`RSa}KC0gN!{AZ$t(k{yvhbh|`j)2NI7QrZUj~?NzCjC=t^fd7dK7jP2 z`a78Y+YzcpDVu{;%yXp2xNla2#Wb(*BJriHo2~EUIeR7I%!}~YGz9hxub}Q|46nR? zUd~AgW|mmV+Kj43RuPlzy1Scbt6g{ujZvMhkA~T=f6=+AiSv7kK!DXwo zUgmq~jtpHA>!W?IQDOpu*!u%uDsYf!xE7I35_Va2Un9r1UKX$L4polxnhd+aV4L z_GWjcTvodJct-D3M*uBu?!gPT1w;A+#X)HEXo|HU{-ev~0n&i-UXbJ0oNoh5D{dxG z`{xepra+ABBQ@?&ZqD4?{S8>G^2JmvHGKAgt`OK3XAyQtm0a4@i5r(*`l)+>q||0a zB%^6HZHUuQ24$y*248-KO_=Xng0;#vM_{~f*!HU??!M9$*7+M;{}b3$UJfDN*+1}&Af#5w`G^Y=>WUf=Juv~6bCTi{ zWg4l+Lbl*_0ioz@XW!cbpT4hVN2kow!b_I$`_BE{9Pm#I$mar>vlFqtum#5S<@LJLIOxxc}i_&~Kur(~z zZ8)&wE0**W_DvBTM_Htit3Ix)0j zRL@Lzy|H6^E_M*r$-O&_l7wE}ZMVjb3i*hvmZ_nyc6cmvty{DzW3?5XXRuk5K2hZ%nXSwp|e#rr7c2~C&4#nPAU`}QQ`JnujdMzSoA<(ZK0+2k2-w2E9N^fq( z$!9%~)ClP?tKSKDy@JN?Jz9u$IPrcHp?;IjE=Xt}BDxQk;vpj_7C`=G

3#ayd5z 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

G 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 vWynK4xWz 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

>=4*v-U^(0s?JS_m_c43 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

Gg5Yon2>pNMXpn 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

Ez>nWaBf;$^5l&S2O?scbB7(gU2)bq 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ੰZl?M<|(;4QwLDO}r+?D-M;=@C|U4*{lpLJ?0IF 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%0Av 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

E<(~D1GEP(V^<}%L%^POvWQs?^Mn^jo;Ovso) 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�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 T;6+u-VM}d?Anh-JXxje({MTK4 diff --git a/licenses/jtattoo/APACHE-LICENSE-2.0.txt b/licenses/jtattoo/APACHE-LICENSE-2.0.txt new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/licenses/jtattoo/APACHE-LICENSE-2.0.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/licenses/jtattoo/classpath-exception.txt b/licenses/jtattoo/classpath-exception.txt new file mode 100644 index 0000000..30c7acd --- /dev/null +++ b/licenses/jtattoo/classpath-exception.txt @@ -0,0 +1,17 @@ +Classpath is distributed under the terms of the GNU General Public License +with the following clarification and special exception. + +Linking this library statically or dynamically with other modules is making +a combined work based on this library. Thus, the terms and conditions of the +GNU General Public License cover the whole combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent modules, +and to copy and distribute the resulting executable under terms of your +choice, provided that you also meet, for each linked independent module, +the terms and conditions of the license of that module. An independent module +is a module which is not derived from or based on this library. If you modify +this library, you may extend this exception to your version of the library, +but you are not obligated to do so. If you do not wish to do so, delete this +exception statement from your version. diff --git a/licenses/jtattoo/gpl-2.0.txt b/licenses/jtattoo/gpl-2.0.txt new file mode 100644 index 0000000..2f13e52 --- /dev/null +++ b/licenses/jtattoo/gpl-2.0.txt @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/licenses/jtattoo/lgpl-2.0.txt b/licenses/jtattoo/lgpl-2.0.txt new file mode 100644 index 0000000..e3284a4 --- /dev/null +++ b/licenses/jtattoo/lgpl-2.0.txt @@ -0,0 +1,437 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/licenses/jtattoo/license.txt b/licenses/jtattoo/license.txt new file mode 100644 index 0000000..d08ef32 --- /dev/null +++ b/licenses/jtattoo/license.txt @@ -0,0 +1,21 @@ +Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + +JTattoo is multiple licensed. If your are an open source developer you can use +it under the terms and conditions of the GNU General Public License version 2.0 +or later as published by the Free Software Foundation. + +see: gpl-2.0.txt + +If you pay for a license you will become a registered user who could use the +software under the terms and conditions of the GNU Lesser General Public License +version 2.0 or later with classpath exception as published by the Free Software +Foundation. + +see: lgpl-2.0.txt +see: classpath-exception.txt + +Registered users could also use JTattoo under the terms and conditions of the +Apache License, Version 2.0 as published by the Apache Software Foundation. + +see: APACHE-LICENSE-2.0.txt + \ No newline at end of file diff --git a/resources/com/jtattoo/plaf/hifi/icons/HorRubber.gif b/resources/com/jtattoo/plaf/hifi/icons/HorRubber.gif new file mode 100644 index 0000000000000000000000000000000000000000..c54e653276c98c48c0b83e6f9b2659dd8c6e78ee GIT binary patch literal 858 zcmZ?wbhEHbWMhzG_|Cwfp`lS$R`#FaKf@>(4S|st0*XIb7#SFt7<52h2jvL{4s!-( z4hf9_hK5EqP9>L$00+l*W@)vS9R-gLHwj7GrL5SHe5{Y#RO!fxiAf$4RFs=^Dg#rG JG%zq&0{|~D8+HHy literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/SplitterDownArrow.gif b/resources/com/jtattoo/plaf/hifi/icons/SplitterDownArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd8dcc12b05efa17339541bcaca26269a32d006e GIT binary patch literal 827 zcmZ?wbhEHbWM^Py_|50S0RT2T=_# literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/SplitterHorBumps.gif b/resources/com/jtattoo/plaf/hifi/icons/SplitterHorBumps.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd4d4bddea25635244a217fd63a6d1d45c08e922 GIT binary patch literal 866 zcmZ?wbhEHbWMMF2_|5W93@6WU}S}W;!hSv1_nk39gw#{d4hq%9?0bo za9F_5#Kb2Qb7F&{VtT1G7oyh0u_oSm};i(C_ P`g~`07&$mFFjxZsl0O}m literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/SplitterLeftArrow.gif b/resources/com/jtattoo/plaf/hifi/icons/SplitterLeftArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7c543885802c115b23dd7ace993b6aaff1bccca GIT binary patch literal 826 zcmZ?wbhEHbWMyDy_|5J0J# literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/SplitterRightArrow.gif b/resources/com/jtattoo/plaf/hifi/icons/SplitterRightArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8bf53adc8cf2b5493f4289a9922cabfe70d40c6 GIT binary patch literal 828 zcmZ?wbhEHbWMyDy_|5W93@6WU}S}W;!hSv1_nk39gw#{d4hq%5y<6m zn6ThL6C1md&5nRX$2NXhH6Dck2j^})p5Fp R|EW2io0pxP$;ilH4FJy=9v%Py literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/VerRubber.gif b/resources/com/jtattoo/plaf/hifi/icons/VerRubber.gif new file mode 100644 index 0000000000000000000000000000000000000000..3312324103b90277a8b156186f1c216c8f93f4cc GIT binary patch literal 857 zcmZ?wbhEHblwx3G_|Cwfp`lS$R`#FaKf@>(4S|st0*XIb7#SFt7<52h2jvL{4l@Q; z76FHX1ji;OK`EaI0S2db7DcWJ9v>B*+9brYLMk>Uxpd1r%gM}~sC<$^PQ58a^HQP% H1A{dH#s?Rr literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/large/arrow_down_11x10.png b/resources/com/jtattoo/plaf/hifi/icons/large/arrow_down_11x10.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d3d9425efd15f9b1ba385660a353526dc64d20 GIT binary patch literal 926 zcmeAS@N?(olHy`uVBq!ia0vp^+(695!3-or^+GlRDfSXiUsv|KJlwq6hVh>l1_FgR z3p^r=fl7rynDNrxx<3pI%nSiOA+A8l0|yQO$x$#G0wXX43YNY42lO^$NswPKgTu2M zX+VyOr;B4q#jWH72euxLSrY{hFJaRo{qIB)<+j)Kt;7=a;Bu4xl z@Q5r1DiZ=>#!GkW{xC2wGX(gAxB?{)95?_ZN5NkxdV_F*30GGsvANWD5s{lc%en%Q~loCIDO>C*c49 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/large/arrow_up_11x10.png b/resources/com/jtattoo/plaf/hifi/icons/large/arrow_up_11x10.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9ee350ec9d3a53e5ac0d4933bd255936238645 GIT binary patch literal 924 zcmeAS@N?(olHy`uVBq!ia0vp^+(695!3-or^+GlRDfSXiUsv|KJlwq6mVp|Y$v`2_ z0*}aIpi&_aX1sK_?hgY4Gedw+h$~R?z<~omauke)zz7V1f@QD%0lm#w666=m;PC85 z8jz#p>EaktaVt5&fxXAW$IVSet%o_u!BT+B=g<;G8K2D;fO)KnLC!dP*Huu6dAj8(! literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/large/check_symbol_16x15.png b/resources/com/jtattoo/plaf/hifi/icons/large/check_symbol_16x15.png new file mode 100644 index 0000000000000000000000000000000000000000..26196a891c95a1444f762c44d0dea1718aece2b4 GIT binary patch literal 969 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3-pCt=%sRq}WS5eO=k_@(2oXNuFc({|6M} zEbxddW?Ptn%>pNlV-|RKu>Lk) zuvO%N8iPI48>Y>f><14m=T1sDSDcn^b_1M`njxgN@xNAxVubD literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/large/tree_collapsed_14x14.png b/resources/com/jtattoo/plaf/hifi/icons/large/tree_collapsed_14x14.png new file mode 100644 index 0000000000000000000000000000000000000000..c5330cb2c2f590e7e1aa04f82ec1f1a6d89e483b GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Ea{HEjtmSN`?>!lvI6-Do-U3d z8o_IW9Jvk{aD3LZeYfNP{68~KZ)n+KVU}pwDj+0!Hp;?2flZF-t;QF{22-UwvMHC} zPnj25J=04tamdKI;Vst0DZ_g-v9sr literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/large/tree_expanded_14x14.png b/resources/com/jtattoo/plaf/hifi/icons/large/tree_expanded_14x14.png new file mode 100644 index 0000000000000000000000000000000000000000..219bc7720d65b79d5050ca79f774ff5b55d5bb7e GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Ea{HEjtmSN`?>!lvI6<`o-U3d z8o|j43Y-!Gj0@PZfP|N52SbYH(f8&H)^Y?luK91l5Wp4tl2L}CJIE%_!EkDV!~{_$ f6N9NISeO}lPlR|f&TI(=8pYu0>gTe~DWM4f@$4dq literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/medium/arrow_down_9x8.png b/resources/com/jtattoo/plaf/hifi/icons/medium/arrow_down_9x8.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d03b5f48482841fb2097d37777243d8f2469f9 GIT binary patch literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRM!3-p2gjL&t6nlxMuPggq9&TP;UbSOY0U$L6 z9+AZi4BSE>%y{W;-5&-9W`+Qt5Lck&fddDCB|mLR^882M!znlA~ZW1V&&86fAr759n>ik|4ie28U-i z(tsQZPZ!6Kid)GE42*7U90@5YN4$ko3=M!;<}HJSP;kT!P&j$I`njxgN@xNAOw1&n literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/medium/arrow_right_8x9.png b/resources/com/jtattoo/plaf/hifi/icons/medium/arrow_right_8x9.png new file mode 100644 index 0000000000000000000000000000000000000000..1c52ab53a8a983dc6429b91b577d547654af2359 GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^96-#;!3-oVdgsajDfSXiUsv|KJlwoGmU5Z;5n>Ff#=Bgt!7F4;(lEBuBw$2#mlGC|LIDAJE&3B|(0{3=Yq3 zqyaf{o-U3d6}OTT92k2F*p!v$FeWx>7ziI~HwZLkWMp8T%OElB@`9_N(DHQkb6Mw< G&;$ShCMUT7 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/medium/check_symbol_14x13.png b/resources/com/jtattoo/plaf/hifi/icons/medium/check_symbol_14x13.png new file mode 100644 index 0000000000000000000000000000000000000000..74aba004ab16437b963dfb288bf325c3113db71e GIT binary patch literal 957 zcmeAS@N?(olHy`uVBq!ia0vp^d>}RlGmu=zwB8p;v6p!Iy0YKp5ftJwOTAXK94N$D z;1OBOz`!j8!i<;h*8O2%U}gyL32_BVDkvy8I5_-g`2XR>6NM!5h0 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/medium/tree_collapsed_11x11.png b/resources/com/jtattoo/plaf/hifi/icons/medium/tree_collapsed_11x11.png new file mode 100644 index 0000000000000000000000000000000000000000..834ff93d04b90f6d7e1467017a87b1d94d41db01 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBynSifzsVg&aIx978mMlM@u!Bn~jd81Cv|<6#K>^Z&oRhf;UL7EPcS>n4s} y+6rk2j1HVW4Z)gXoQK{i__7}1s;N6z!ouKp(2UDU-C_&SECx?kKbLh*2~7avXDH49 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/medium/tree_expanded_11x11.png b/resources/com/jtattoo/plaf/hifi/icons/medium/tree_expanded_11x11.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fb1bdc4ed6f734fb6012de238e2ab0a9110c68 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBynSifzsVg)}`~978mMlM@u!Bp$E@yp`I)7}Cm==g=dZko7N_d5MI>4cRLJ cjrUy{w6<{9 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/small/arrow_down_7x6.png b/resources/com/jtattoo/plaf/hifi/icons/small/arrow_down_7x6.png new file mode 100644 index 0000000000000000000000000000000000000000..a62df9c5488ad35ea32572b033564b6a8867ea4f GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)M!3-oVE|j={1WG)8UD@yQaP#VDGT&Q&04T&+ z;1OBOz`!j8!i<;h*8O2%U}gyL32_BV9ykC}G73gRU<8Ih!LnEXfZk>-3GxeOaCmkj z4akx7ba4!+xRspH!05)2mXgAfEWo%(L8(BLfpHCk&^BXfMo>U`y85}Sb4q9e0P%h# A&;S4c literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/small/arrow_left_6x7.png b/resources/com/jtattoo/plaf/hifi/icons/small/arrow_left_6x7.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6dad8e0ae61aa50d53d90c1923d6ecbf8dc878 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ;!3-p2{Lb75aY{UWUD@yQaP#UYR56LC0EIXU zJR*x37`TN%nDNrxx<3pI%nSiOA+A8l0|yQO$x$#G0wXX43YNY42lO^$NswPKgTu2M xX+VyIr;B4q#jWH7AV^_gbaQhv5#m030I2FJgOD=IJ5a7;@O1TaS?83{1OQs*B%}ZU literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/small/arrow_right_6x7.png b/resources/com/jtattoo/plaf/hifi/icons/small/arrow_right_6x7.png new file mode 100644 index 0000000000000000000000000000000000000000..511a37a1ee8b55249e47139a8b37dd5d4974f708 GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ;!3-p2{Lb75aY{UWUD@yQaP#VjAKJeu8z{tC z;1OBOz`!j8!i<;h*8O2%U}gyL32_BV9yo9SNREQh5Ey|WP_XRPKcKf6OM?7@862M7 zNCR@jJY5_^DsCkwB&0Afy1C_;7@cGY_E)M!3-oVE|j={1WG)8UD@yQaP#UIq;CaDGjJAo zL>4nJa0`Jjum8Ywp%Q~loCIE#^ BB>MmW literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/small/check_symbol_12x11.png b/resources/com/jtattoo/plaf/hifi/icons/small/check_symbol_12x11.png new file mode 100644 index 0000000000000000000000000000000000000000..6696f5e8dd9905b7b650087396f8b85932fb9899 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!3-p8*3HQUQtTz3zOL+dc?5;Hg&fW;HwOxF z7I;J!1CB|mLR^883JMAi4i5hr{(t!J;s5{tK#@@}8UiCE1b*)h z)C78!r6kBN7?k)Ov{rrr@+~}F978H@`SwPNF(_~_bw2qQu4gR1KkW+pjpPekq7rl( vS3W61SIo6Pjm-TEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBv>jkDsUl3h8>fIEF}sCnp@>=h?uxLX1`7$N&HKbA0E>1h5-1yi)U%KO$B0 h?VxOvf$(&G#x1?tW~bNnhXOS+c)I$ztaD0e0swpQC7%EQ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/small/tree_expanded_9x9.png b/resources/com/jtattoo/plaf/hifi/icons/small/tree_expanded_9x9.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d3df3158b4fc59a4748a3ff535246ccbbfdb0d GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1SIo6Pjm-TEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBv>jkDsUl3aNOyIEF}sCnp@>=h?uxLX0)1!D8qC6$}{yg})4PRh;DYgTe~DWM4f`=%ga literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/thumb_hor.gif b/resources/com/jtattoo/plaf/hifi/icons/thumb_hor.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c88f538cf5a89b2b6d14882e16455e33ff7b4c0 GIT binary patch literal 958 zcmZ?wbhEHb4+pWK~^;NKDNVkMV&JC-r4o$2Q+lqL1H8dPzl{)e& rCZOT@%`K7%n^LnbGu+}7d?se2?U;XXSKa?>OSOM6BsMZKGFSruHKBiw literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/thumb_hor_rollover.gif b/resources/com/jtattoo/plaf/hifi/icons/thumb_hor_rollover.gif new file mode 100644 index 0000000000000000000000000000000000000000..95ed5116e546d5e5aae253e33ebf6a05ae9a80a2 GIT binary patch literal 950 zcmZ?wbhEHba{N=4yA+UeEB|01}_ho?NZG4v{OX= z!d&OMQmLx6I+wTb7VXlt*mm$vQ|9|e QTRY3%AK1>!%*0>~0RHx3`v3p{ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/thumb_ver.gif b/resources/com/jtattoo/plaf/hifi/icons/thumb_ver.gif new file mode 100644 index 0000000000000000000000000000000000000000..84764693befac105b3ab3eb2074406d6de866290 GIT binary patch literal 959 zcmZ?wbhEHb6l36J_|CxK=<4U_=Hue-=iw9T6C9maSW#Y8|DWN1?}Vv+6Q?a(wRXkI zwQDwP+puNpmL2=|A2_t>)5HbE3=V8= zIzQho_g+cmf`*GsB9pXywM-7PaEfuta5$Jcw5*QUoD>`2@QRUv`H+)@_qI0?>*Dqc tMZ8|H_V#wZ3u-JIrZF_{uK0Y)S7X7t`}?bff9XE>kZ^qq2Qw3cH2~K0f`tG8 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/hifi/icons/thumb_ver_rollover.gif b/resources/com/jtattoo/plaf/hifi/icons/thumb_ver_rollover.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3517a041de3de37c71cc6dcdd24db8f34e5cf3c GIT binary patch literal 947 zcmZ?wbhEHb6l36J_|CxK=<4U_=Hue-=iw9T6C9maSW#Y8zodv^OD)5HhW|Sn81^(X z9O-2Eu!7;^I+2f?1GkBU*OrWn%*-4r90yDo znwJMGc5+>1!q~tVA)ayfRH$}n3j;?-sKd53k*x6tyHpz%ti8QGQ;;jddwX6?O9{8d M7R|DJ2L=Xf0AB}Q;{X5v literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/MenuArrow.gif b/resources/com/jtattoo/plaf/icons/MenuArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b7e29fb31c1ed8ed544826c4e379ab0692241f GIT binary patch literal 844 zcmZ?wbhEHb=e94+n!a00J!*a{vGU literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/MenuLeftArrow.gif b/resources/com/jtattoo/plaf/icons/MenuLeftArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..72e394a457a2c66d65b965627de34ad7195cbf73 GIT binary patch literal 842 zcmZ?wbhEHbc u49pxN77hm-nizQaWEd149%|!bHfYHxP;zY%H*`C);zQ!`RyJlP25SKG!59Dl literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/MenuRightArrow.gif b/resources/com/jtattoo/plaf/icons/MenuRightArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b7e29fb31c1ed8ed544826c4e379ab0692241f GIT binary patch literal 844 zcmZ?wbhEHb=e94+n!a00J!*a{vGU literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/SplitterDownArrow.gif b/resources/com/jtattoo/plaf/icons/SplitterDownArrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..431228b47b85c6290f60a2bd1d12b8752549bcbd GIT binary patch literal 827 zcmZ?wbhEHbWM^Py_|CxapW*+OEnEKo|IaWAMnhoag@EEu7DkY-bwC6tPcU#uFfen- bXaqDkHZwA?Sj-S;aAM?@)tVw9z+epkerOO7 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/SplitterHorBumps.gif b/resources/com/jtattoo/plaf/icons/SplitterHorBumps.gif new file mode 100644 index 0000000000000000000000000000000000000000..152e12ee1f2992f1158f2d1838e005c1473e4dba GIT binary patch literal 858 zcmZ?wbhEHbWM(j7_|CvkTwMI0;s4~xlmGw!&oBx`Ltuo3fZ|UUMg|5(1|5*UL3x6K z!<>PYgF~Ufp@ET&StI7ega-$j*oDnTu? ND+5xGG%zq&0{~&8|IaWAMnhoag@EEu7DkY-bwC6tPcU%EGBC3+ gC&8|IaWAMnhoag@EEu7DkY-bwC6tPcU#;GBC3+ zI80b@poxuL$!14DqGKDstQw0#fP-_lprP6o4?~9IUE%H34oy<=RSJompz1hX JgPDoJ8UXmD8`S^+ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/SplitterVerBumpsSmall.gif b/resources/com/jtattoo/plaf/icons/SplitterVerBumpsSmall.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c0bfe9efa9613d34cd17e880176d358b34dd462 GIT binary patch literal 832 zcmZ?wbhEHb6l7p#_|CxapW*-H$&>&8|IaWAMnhoag@EEu7DkY-bwC6tPcU%EGBC3+ gI80b@poxv0OQfM7@h}4qtAUG#pdv#jBO`+~0L!Qmi2wiq literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/computer_16x16.png b/resources/com/jtattoo/plaf/icons/computer_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d596d203283bde16cdb52204e042abd5c9cf1826 GIT binary patch literal 575 zcmV-F0>J%=P)K~y-6os&C`6G0G$zv{<~B^ zSp|MoiOhqwU=3&kS|^kilmZWwA@Sw=d>1e)7c?#cxfQe(Lk1a)=a}zOI1wnsS>O>_%)r1c1j3A$?$-TbU|?nl@CkAK z|NlQweiV#`z{m^%ZsqL{fj(y}3GxeOaCmkj4ani~ba4!+xRso+fDg#?U|Jq literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/floppy_drive_16x16.png b/resources/com/jtattoo/plaf/icons/floppy_drive_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d929b6a957c639355e2f4626a962174f5fe9ea GIT binary patch literal 556 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 Nv!|<{%Q~loCIAa9eDnYS literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/arrow_down_11x8.png b/resources/com/jtattoo/plaf/icons/large/arrow_down_11x8.png new file mode 100644 index 0000000000000000000000000000000000000000..c279cfbb9ae08277e1f34d8c5de9806ef5a6507f GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^+(691!3-oNo_*Z~q}WS5eO=k_@^EwNbM?+uT?-WA zEbxdd1}YT-Va7{$>;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>crNswRge}<>q z4ZMInB~KT}kcwN$2`&t5DF-@^G;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>c*NswPKgTu2M zX+Vy&r;B4q#jWH72c{m5h9i!X9D~}Hu%BdLD*@)TBMhqlLydSrLFMV{=d#Wzp$Py_ C0w@Up literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/arrow_left_8x11.png b/resources/com/jtattoo/plaf/icons/large/arrow_left_8x11.png new file mode 100644 index 0000000000000000000000000000000000000000..99fc794e57bbc4268fa8031812b74c61ac745542 GIT binary patch literal 929 zcmeAS@N?(olHy`uVBq!ia0vp^96-#?!3-ozU2VjH6nlxMuPggq9&S#3hFp&`n}I@{ z1s;*bKxIN8%y{W;-5&-9W`+Qt5Lck&|NsAi1A({f!<~+3Gxg6&+v4+ zfftac=IP=XQgJIefrXh(f#q@l8}pQd451A({f!<~;3GxeOaCmkj z4aiaPba4!+xRsp1!0g7Rah7ATWTJ_3Pg=`G4J8g!j#!Rj2Q_8}b~6UmlIiA~L1E_U L>gTe~DWM4fqa7z1 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/arrow_right_8x11.png b/resources/com/jtattoo/plaf/icons/large/arrow_right_8x11.png new file mode 100644 index 0000000000000000000000000000000000000000..f661de7b713ff5924c0e76c3f620ddd5ea1a64fc GIT binary patch literal 928 zcmeAS@N?(olHy`uVBq!ia0vp^96-#?!3-ozU2VjH6nlxMuPggq9&S!OUBjM*?LZ;U z0*}aIpfVv4X1sK_?hgY4Gedw+h$~R?|Ns9$auke)zz7V1^s+a}KyNdZ1o;L3XL!2Z zzzfJz^>lFzskoJ#kdnZ{%;v_%X3@-eE}_9#;sFm^iC{^rL9v1wGXs|&gXw0y=3r2$ NdAjO>_3{)xv!i<;h*8O2%U}gyL32_BV{{R0UNREQh5Ey|WkY4sC8R%`Mk|4j}{|ryJ z8+ZYEDxNNmAr-fh6I>YBN+vZnG9F7yXef|a;3Lq^cr3*s$?@tzU`9H^V5;>d%?K1| Mp00i_>zopr0DT-SwEzGB literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/arrow_up_inverse_11x8.png b/resources/com/jtattoo/plaf/icons/large/arrow_up_inverse_11x8.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea935df72b9c63a00b1ab2027efb5eff517acb6 GIT binary patch literal 923 zcmeAS@N?(olHy`uVBq!ia0vp^+(691!3-oNo_*Z~q}WS5eO=k_@^EwNn_vB!xd$l3 zS>O>_3{)xv!i<;h*8O2%U}gyL32_BV{{R0UNREQh5Ey|WkY4sC8R%`sk|4ie28U-i z(tsRAPZ!6Kid)GE4(vT1K5lL*YCVTfa6C6KI%L_?;~~Ssz`$C=plbWgNfZ=dp00i_ I>zopr07OMA5C8xG literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/check_symbol_14x14.png b/resources/com/jtattoo/plaf/icons/large/check_symbol_14x14.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1361295031c952bf438634468cc5bf1fd96f72 GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD@yQ2nvcBf9y@w0Sa*z zctjR6FmMZjFyp1Wb$=Kbm>B|mLR^88|ABB6jE2C741sB;?zey*XDSKu3;xgWbi08U zkZ0uS;uunKD>=c1k>|$_9-b98Y$0;YTKtL(X@`Cau=&WjE!0YKFlAacf$?Oh$Fap$ Zq73#H41I65I#z-L(bLt>Wt~$(698nsFF^nR literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/check_symbol_disabled_14x14.png b/resources/com/jtattoo/plaf/icons/large/check_symbol_disabled_14x14.png new file mode 100644 index 0000000000000000000000000000000000000000..9a541412391f94c91533eb363673983f8af87c35 GIT binary patch literal 933 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD@yQ2nvc>{||dB2NdEg z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt-1^_}|db08}yxMnhl(hCukfcQQb4GnNGT1v5B2 zyO9RuXnVRihE&{2PEe3DSoBFEu(D@`jav(o0slItL(YpIL5^K|udS?83{1OSLIF+l(T literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/closer_12x12.png b/resources/com/jtattoo/plaf/icons/large/closer_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..7909acca4d95a760044173019df54d0632500e21 GIT binary patch literal 979 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%0Ar|}J)03TX5-l!$M%+XK;W&J~VFSh({xpAnK~xb! zFm~ZWv{D>dzrKLLb)^#dxlpXMG~8AFZu)d8rcEmlX2G{_+Qi}JX52*L(*9RU4y;;* zOsAQ!Xi*M$YaZ4VzuUO6U&k^>HcR^ad6Gkh5KAQdTqxKdMD1A!!I7304sYIk zX#;Qb`=I^&rI+y1Y5u%)X-?7tg}`JWZ7oOnFk3rE8v_*twS=ih7A6dfZucyNvh6*D7Czyq?W zRH`SLOqNGYsBFxbFwM;`C!3pd?zNQAht`XggR58f`I{4qG4zf*3O+8UQmG#NQydR2 zEo2$sTxVzJsbn(gg9+^4?cbl<=FPimP&cYfeBlN94H}dasa)5kv$OLQ{t;9rO27lo zx3{;Swx=Y~6}fuuTxu392+iYW7AF?t?=QZ{-c)ej5M$%!9y$j4?(C z(cRY8cJ#5w9=m7c$dMd6bSNhxRnMPK-Q- zP;5xTaUAyT+jp?OzWx{tp-8$&l-`Lo=Bb7?^R8&+jV#J6XLB&p2F4y;Ko)457 zE|#fOs;9BBaR;#9M2=na<5E{gN5`j&7cYLtk{CB`9HphDK;cg9W|FWU2ZRveAzyG( z*%bwR)yJ$_``_p7L4(y${%+~l^hMKdTdwJtHA3Pyeb5blbaH_~0g++&e>bSWKN)er z|8N$xM6T_9;kr-w#oPo{NA7jdW`Hxm|M27ee}SI?6;v6;ECO3|1JLoH&98BwA5a>! zZr<;1kv`k+1mF}P^QtP+p8+lcY5Z89|Bej$vw-Yt2Am?*jkK4mP5|D%M?k<<6{%5T jD)0CFcQl|)9^n527h2`aUR|C200000NkvXXu0mjf?~knO literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/folder_closed_24x24.png b/resources/com/jtattoo/plaf/icons/large/folder_closed_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..743f33d8ce3d488b32e61ec3a0c8aceb7ab207fb GIT binary patch literal 1379 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 g78IW_b^rhX literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/minimizer_12x12.png b/resources/com/jtattoo/plaf/icons/large/minimizer_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..54057a8e7c02b859bedaf1e8b9c58d377e05fb8a GIT binary patch literal 950 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1OL`z&FN}P*Q6H7Al^Atidb5j}E z?{IUn>smjW?-vMEz+U3%>k1Y!R6f+2p#>D;EbxddW?F!$q6n@JOYy%P578) g78IW_E;1#yvu zAYu?f5D6whF>16OFl~4HlDzIWzgJcFUKd>%7D?#VxH1P0)Z$jv@BYtd_`lnA1>}Dp z0=3oijfG^N7XM_7>Mn_Fk3fjDQSn8i3HGfa`j5v9BW_O~Wdhl6x?Yx!3=Y$Z6 zF<$tL7KPD{KhK`#!_VHO{p-+=+vW4?KTh7e8pPF-P;I-%?z2wbY~JqlWA{Bpnq{o4 zFQJq|sZ04IF+z+H>okwu|0IX?2U-?+y|~%`GFU3V0LEJ_Lv4+FwRvk=U$|`nZK0E& zV^DTByy#x`xs$iS1Qu?)gXZqEUc1S?0Nk)u1=Nna>-)1=`)Ga6F+DR&ujn9vh#*QX zQGpA$4>1rzAOO?T(=={yOxFCvwe?w`6l>8dY@%`2kXcJ+5}a{ZYcQe_wNXUD2g=~dy+@Y~*$SaT7;`#>2>CVqmHk(dWc8z@I5lWvJ0 z@za&s@|6JmsGWa0YUMBa5R^^@;|$I?oJmNv#frVCK#b&}AbN%OFqRTi7WiRg*eXJQ zdGuA)4dZ43%D+wwzHi=A`=obf{K)iN9qlw?HEH6gnUq91bOlhv5)%dT$fPXLN(h5M zuQj5-JU-I-ZE^}2Yy}_y{myTLH&%})ho*Pd>WyX%Nx?cHb&gCsL~Xq8f=9d}mmJ9> zzV!6hN30&}4bGhGy$vh_t5Dy=vUTSYIK)vLugJe1uik~Az?n$fTsQ@Tki7AFQR zijm6ch5>7nF0Iuy7C$@VS5K_JeD>t<2=LcG0szX+@8dshL;o>s7l%UT9a%}V3hOkf zv3T*cLzk6Ni{-TzzyH``@zd5|Wr~9;i>4o;s{Ua+Udhc|99e!O&KfF>2Zh9dB5?}_H-+o7J z&$d0ydv#_Ow2d=F@MY}eo$}|k#s1N?#nBH{&tI>GPq-#4Srx7XXaLPhne$2Pff3NJ zd|bsm{ufK^d5{`Vue=7N6_Db(UAHaR-{}J$vxG*BbpQYWD|AIzbVF}&d2(rIXmkKW zZ*X~XX=iA3AgLfSFfceRGB7bQAW2R`Pf}ALM{QzA5RM^F00000NkvXXu0mjfTa;ST literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/pearl_grey_32x32.png b/resources/com/jtattoo/plaf/icons/large/pearl_grey_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..303f312f6debcd4f0bf06c0f090cc0603552160a GIT binary patch literal 1399 zcmV--1&I2IP)QGeDZj02#bA@(u{}lkn-NfAGRf z@bbuIh{s|e5b{iEV{;RxXC4Z3^YasORvQoc0`IS{t$dDKg+|6{cXxL~=NE^^-jx;Y zvsnC`a_!BlFg$!26j_FH*?_X4Ls{3MRMtUN6*$)yhu(M`a)pvysaCG~{Qkt=?#@c1 zOf&*OE)IISD8S;j zdnOPJKqMLk&8H2Zh7W2dcryT~B#Ip&jNa$dFi3PvsLOc)qZKIq3xs2lIn9W<_BpfM zJyq2(6AVJ3FvwJD$4$8v0BBnTSy4dK{2<`Xrc`imxbyj60G#O28N>EyBO_cvmN2{% zI#QHM^*erD7NGq-$Do2Bs3f`0MG1k(9sqIxfVk1SV%7kdn10LoOif_iVIR-o8*2ps zw`_Z%SlWL}6eX;o&y8G`WSlV*5=FmQ4q8)Y$N+{}VCdAs$SKaOTEW%~P%IR&KNxkJ zQ9S_mZYFbUH=VwYbtIaq0(DZ4*$^>$5gj|uiC0ndjrGPuXw9@uumlS@>gm`mchV`g zmE5`uwU*5P>8M_Dti`#R#cU@1O=c(UI#3aWqEe8N&6pIxL?A1?nby`M+*7b&sjBRj zCzDP?DwUkvdc5H@qEagWoO%`4*4IB?oSiP^b9>GUNkukYk4(1;G zR$5w^{}h+&w&F(50-oJT?+3#jDSX7f9_{K9g2-zXAyW_eVL4cp~T~jEiDk-%$x zWtwJwe?Pan{^-%v#@fmf>ZMQ|?i-DqHw)kZ1oeOfP=Zjqj|Viiy-16m7+%f!QHGoS zQOZ4owr4!&0V0R?*&&@H9k&YLFc905|79He|AG?$e**M=BwB$SmKgv5002ovPDHLk FV1f#(gns}4 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/pearl_red_32x32.png b/resources/com/jtattoo/plaf/icons/large/pearl_red_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2e35b7311285af08162494c4d32e9c942105cd GIT binary patch literal 1278 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 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/tree_collapsed_14x14.png b/resources/com/jtattoo/plaf/icons/large/tree_collapsed_14x14.png new file mode 100644 index 0000000000000000000000000000000000000000..aa21702d04874fe81969ce533ff18dcd3dca8789 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3Ea{HEjtmSN`?>!lvI6-fo-U3d z8o|An9Jv}41X>e!H?z-kt~enUh_{#Ka~Zdz63rbo!kVkM z__+MK^+6|3r8Z|lp32@_5D~Svydn6~=BtY>RBdy19PeGSoA*lZlGz~QS7Q6bb;6;m f_IJm%Y5rymJ>Id`tZ9)T(0&F_S3j3^P6#3Ea{HEjtmSN`?>!lvI6-Do-U3d z8o|An4EY)iI9eZ8vGbi#v{=G?QKI+Q6~|lqwm$sp&AxBth8Z(=PuCIDT=h$kHG7Lt z<35)K{DLohS*pIK)f+5Zke=^$T;z)a)7?%7bEOLrIZ`jYu4K&dw#htLcddHW*9~UJ R)&T8d@O1TaS?83{1OTnAJS6}C literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/large/warning_48x48.png b/resources/com/jtattoo/plaf/icons/large/warning_48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec446456adb48a074922184a2eb24ec98258fe01 GIT binary patch literal 2741 zcmV;m3QF~fP)K17Mahrmb3=t3`ki;swyQapT75 zE3drr*dvcT5^iZ}2?4;BD_3H}!^1a^A3uKK^5x5)1GvN(Q&y#6#@LDtKm~xuqtWP_ zb8~YE#u(Eyjb$>D{X(pU5F483Wvi#y>#i) zFFB5@=6N2BF&Kv7YREpWsi^^_G}YGDcJSuSn}1=9#a7ZjT_N}?0GkH}2A=nNz14ys zfKm!Vh*R2TA14wC0H_`q7Jpp3I%Juv9?c3Sa)zvOZQUO??j0o^R03mRZ zNG6l$>gsCWw{PE00PC%~O2biV7b1kL1+Y6FkH1x0TN{)l$>}Q4)9^}Pfif8YV32ZT zxOV99IrsSeeh5Nls;;iSAHd%jW9d?Gl%#;|{odZ*r-Q*@P*v4D?*rbK(M#B_i3y^g_0DoyuWK~?8a{cfnZ2g)tvW*e}bkj0E7c< zOpF0AAbYn!DQj^Cc4cKHgiK;86n?M|z~4(zVc7~;o(k{ZzyFzVczwt)jGXt02Eq@4 z88VnIf$6eohFN;0Ve=mAenAlMKp-64zkmNT0K%oHP>ccu=Iek>U@d@M*REarRVWl{ z)OFqQzJBKmu+)&{eXihf1~46JMF*6M#~l^Q%gd2UrN)|@n}2~4R47IP&O+hxep6FZ zqjk>mz6yQrT+ZvdXqA#_nh2&#@CaXlqd661Sw<)nYAjWSViYK|2q^j9Z)$3Cd0(0N z1lsL0mggxlGR2=hH?ed_fyxR4UeQ)wyQK|}y z5ulcl_uhMN?d0U-#@^oEr!-A-`n_Qo$Xt61**pJ$F5Cdq1c!vKWg*KlWLbu;Wz9)V zm!XMcQ0@%DkYdm$fA4yCDn*6G2yg(nL?YoickW#H*=L{K*3i%p(lpH(e7eFTbM1Ek z)1e7BkWG9IEj>+92$QaO5$s1>8oIdxt7rS!u7XdsHxmjOoJ{@L(5!4;?{Q< z9UaAu8#llwV$kJjFkN&t!ZaTGEIa+4F$QV;nA`jF5b*hY@cDd;63AD7{BgE`~c1j;`B^wa8iJl^`!OD}B|1i`f|%*KwwQ0^=WYB?LzQcx!j zyH;_cC>EsxwSc=!6veW^!NG7e8tn`QgAI}-c6KUx&{stSGH{lzwQ;s}V5o1KeMfx^sRuCa*>4-fk< zUcC6w3opFzXfl~}#eF?~6iiJN1*Wq#i4FB4Hq?vgY)uyROuh;>iKSGq33vgl$!4?U zqmMqir@g)Xu|OcukjZ3nOGQHhn|`+_AOPU6((rcAb-dkk9sa7~yPFa_0*b6dLen&? zU%!4q73@h%2Oyn1d6Etd4Mkpj@x><+iG(Ze8&k&sec`yjS{u`n$lg5Uib%37FQ@_q zAOH|ksg!v5@Zo!Q?AY-{Fc=KGGHkjCGV_PK4&L6fYj>d+5l> zNb{?&zS=oEJL`)3n0a^E-oHHu?ESfEx965efN4p{`rHh5^cdvHaEn)UE^m_@-&K>q@Eu2LG*VFf+ywi9{MZIyzbathEUMK=twvSmx1onpyXAX~lXhr$om(jaZob2QY70?EU%I z0f6&Gz*V*6CQ`szS5#G1*^@8vFvb`mWb(+7BVRrD+;dOX*4C0+w{C$_>X6WgA4cVq zPUD3iF_?AEu+A|XBq1R4+&^C(h1US&#-W9Uo=$Du6VQmm4L7tO3yW@WT)9I(_=| z&l(yU>H$F4bqIn0`wL8dKP~Lrt9>qiDJn^laNxj!KY#GS2PXiG*!fdea+jE2+MDmY z@4l|rUVCj@M@L7vwY9ZA5C{b5QVZL=u<<;fyn6NO#K_1+gEU&n`gi9oShuAzi=2ZU)!~L%EEp7Sh7e+*0Gv*T>+pKb|K_7Y6Ef- vUGspQ4|G0oTZMeD>x&R5yf&XPmIwMjdMr~y-)M+q00000NkvXXu0mjfqRtr# literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_down_9x6.png b/resources/com/jtattoo/plaf/icons/medium/arrow_down_9x6.png new file mode 100644 index 0000000000000000000000000000000000000000..a516eb0eab67ca1bbbf8e99f940c152c949e0df2 GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!3-qTBwfA(DfSXiUsv|KJlvc@9GulW_8>I{ z9+AZi4BSE>%y{W;-5&-9W`+Qt5Lck&|NsAi1A({f!<~+3Gxg6&+v4+ zfftY`?djqeQgJIep@or+C86bVK%$#Kx8NCu%?d0G%;5}jZzss?2ZfcVtDnm{r-UW| D0c|EF literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_down_inverse_9x6.png b/resources/com/jtattoo/plaf/icons/medium/arrow_down_inverse_9x6.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce4185afdbb6713b2cc7b6e18efdab0ea8a9003 GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!3-qTBwfA(DfSXiUsv|KJlvc@hGBIr<{&i% z9+AZi4BSE>%y{W;-5&-9W`+Qt5ZC|z{{!WLBpW*3t z11}&?+SA1`q~ca`LJK1sOG3-#fJ8TeZoxAQn-y3Xn8O+5-cFF&4^+nB>FVdQ&MBb@ E00N>N!TBpW*3t z11}&?&eO#)q~ca`0t+J>8^=ioMM(t}=9ZSv2}K4|9i$kTKQhSm^BwsP3NBAqKbLh* G2~7Y8*C*xx literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_left_inverse_6x9.png b/resources/com/jtattoo/plaf/icons/medium/arrow_left_inverse_6x9.png new file mode 100644 index 0000000000000000000000000000000000000000..365c98614855ec790255cb00af94c50ba62386b2 GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!3-qTT-L4!QtTz3zOL+ddAK=61blpr--F}} zJR*x37`TN%nDNrxx<3pI%nSiOA+G=b{|Cwg$x$#G0wXX4vNHm@fEj?PB*-uLKf}}Q z23|m(oTrOpNX4z>1Qtd%Hja}FijoQ{%q=aS6N(I`I!G}ve`JvB=R5KpsFK0c)z4*} HQ$iB}YAqgn literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_right_6x9.png b/resources/com/jtattoo/plaf/icons/medium/arrow_right_6x9.png new file mode 100644 index 0000000000000000000000000000000000000000..68cead1da46014b4ddf8b8e167e1f856457824e4 GIT binary patch literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!3-qTT-L4!QtTz3zOL+ddAK=6bdr_)GeGhM z9+AZi4BSE>%y{W;-5&-9W`+Qt5Lck&|NsAi1A({f!<~+3Gxg6&+v4+ zfftY`@9E+gQgJIeAtix@iOr3TP2(uTQi%m3%tri?svhzT%qJP-4!n334hk<%S3j3^ HP6B|mLR|m<{|}T0lA~ZW1V&&8WM>3)0W$zoNswRge}<>q z4ZMInc~2L|kcwN$2`LFIOl)p!Y#K)ymP#xTVK(BARP~T&U_Qwpci_dVaG+8KPgg&e IbxsLQ07RS~EdT%j literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_up_9x6.png b/resources/com/jtattoo/plaf/icons/medium/arrow_up_9x6.png new file mode 100644 index 0000000000000000000000000000000000000000..4001da53a22bb274ffcd05c1679cc4f1a28f48d3 GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!3-qTBwfA(DfSXiUsv|KJlvdO9J%5rtwCxE zJR*x37`TN%nDNrxx<3pI%nSiOA+A8l|Ns93$x$#G0wXX4(#zf?1HH{u666>BpW*3t z11}&?*3-o?q~ca`LJK3CNK<1Y~6@vd$@? F2>`5JCI|ok literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/arrow_up_inverse_9x6.png b/resources/com/jtattoo/plaf/icons/medium/arrow_up_inverse_9x6.png new file mode 100644 index 0000000000000000000000000000000000000000..e095a11677795e05ae5e3a96f5e5cc166c498bf2 GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!3-qTBwfA(DfSXiUsv|KJlvdOO54^jyalN# z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt-3y{~st1BuBw$2#mlG$j%7p0%icFk|4j}{|ryJ z8+ZYEvYsxEAr-fh6IvMAM4B2K84o2TFc?cJ@UU6%vM{hbXOPP}64(h;$l&Sf=d#Wz Gp$PziKOLO_ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/check_symbol_12x12.png b/resources/com/jtattoo/plaf/icons/medium/check_symbol_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..314a8965241ddf0b81ff54e4a69e4d2c7ed21f04 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1O*h@TpUD@yQ2nwB|mLR^88|ABB6jE2C741sB;?zey*XDSKu3;xgWbi08U zkf-bE;uunK%eT)Fn9(>6J^ODj+j7+Eir0k>F5|Q_Kk8ne>w0@l`;%pU^W?vdY)b76 UdHw68+Cbsw>FVdQ&MBb@05rHXc>n+a literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/check_symbol_disabled_12x12.png b/resources/com/jtattoo/plaf/icons/medium/check_symbol_disabled_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..19d9ced6d20811d2eacd083d8223367a37acf420 GIT binary patch literal 927 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1O*h@TpUD@yQ2nw=kuTXxk4HV)m z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt-1^_}|db08}yxMnhl(hCukfcQQb4GnNGT1v5B2 zyO9RusCv3MhE&{2PB_3QG4W>4i5#~Ovnl+7?rMrAPPWR*ZEk1LlSd}n&Jy3|Vz$3Dlfq`2Hgc&d0t^32kz|0Wf6XFV# zG%zr5aB%ql|38pD3PwXW%Js_ug~v1^(|wJ%3TD zRJe3HT_A4Gw(YFrx|x38<{ig&Xqu@-!h*rF><0O_GCw~rKOfINaZ05UJ3Bl3+RV(% zyZQ0SaRQRsRFt@^XmMWPxlAVGh^bU7BMx^N_k1=pG*PcBfNLR@h$1s0vbphMI+IQ#9^vv+d#6!3ba?LftG|_f-~Z(L z_3Nuo0n6ob@a);QPKRUhS*f~ASxZ-uZ7*TBZ-9n_{<4eCBL@#@22yeinW`?z)V!e5Y$R&gGEO`$9BPum+*MumOWW2iS@cPT$3b?d4k;Obc|SRsCewy@yf2xNBDuo|jU9%cDq}lRf84OK88q}ZCdLb4Vz_hX&JC@hYEMaNsA^ZP*REFA z*56Ac5YB*Ia1b4L%JKKu5^Q>EfNL{}l6=Mj!Xkb7YiCIM449ZlVURI7vZ8LQP*xUP%R z)E zK1|aj8F!FOBr%rF>=3nkvVcN9M;>vqYD4{$jVFdr=5slU=ZP#h4uN10gZ>T7a~(9B zO)RfUxVv~4b-4~PEg~9AAP`_soX9~O8G#^#VUtI7-Pl97b^TI+Wp{c;6c5kwkP#E0 zX%=mx3%zAviK=Zm5F3LkqHL5ILVi{dRDO8?a=Cf r&~(f7eMwa|AFi*hZT#0e_}|&z+zIM=`43XN00000NkvXXu0mjfWjHz0 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/document_20x20.png b/resources/com/jtattoo/plaf/icons/medium/document_20x20.png new file mode 100644 index 0000000000000000000000000000000000000000..3f268b6653581c384e5d0e3390e907c908200b03 GIT binary patch literal 885 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 g78IW_b^rhX literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/minimizer_12x12.png b/resources/com/jtattoo/plaf/icons/medium/minimizer_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..54057a8e7c02b859bedaf1e8b9c58d377e05fb8a GIT binary patch literal 950 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 QumAu607*qoM6N<$g3Jp%g8%>k literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/pearl_yellow_28x28.png b/resources/com/jtattoo/plaf/icons/medium/pearl_yellow_28x28.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee0777479b496bc69170858d8fe36c52c88d889 GIT binary patch literal 1217 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 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/medium/tree_expanded_11x11.png b/resources/com/jtattoo/plaf/icons/medium/tree_expanded_11x11.png new file mode 100644 index 0000000000000000000000000000000000000000..c08eb74bc19d5c6dde5b7265622cc71eda6b67db GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBynSifzsVg+e`D978mMOD}BXJYc}%5}3};yX2xt%Q7A%2@xhm-*W|XcV6dM z6E7h?^meyq5LbNp) z0%JC5$wdZj>~+Ko8SExlBT!0XFNEFnE-by-MK4y&#%Q4IVz7%CuY{#(oqAms>b9P} zM6sNYDVC!n%hJ&~=Y4h|$vBQ}$z@{?{CN-OocDSE&+i=G4<#b}Kg0iZIw_^*fd(P(twnU?2Tl~QP}A^B&-UBD&;Rw>li*O#TR zkpUmz8y_Ek;q>X#{rP+zV+{7vXXNgEKz{KW?($c7**KPEkxVA>GIQjYJ|&<07%%x3 zbnZ*E)?~BUvJ}=EP=No!g$oTwj~@L|Q&Ur$F$T}`NZtAc0OI9vGq-V4H<_84VQy{? zC;bJ+{`YE<{Ont+6dD>DwxqD$Kow9mF)`6|>eQ*eTrP((1~)y8vv~EX&Y@6zysoZpZ>jqH>?q=8DeOD87rB`?S1B|#HFZRz(G%+_lnexcnk!eX z^qe?x;s>czs<7H+rty*!n+|@c+u~5SwIu~srqNoH&*wL!pn+N-I6gie>g??74+ev) z)w};Xw`GOr2Vh*Ii?2C9!7IkMkz z96Zm%7=uxDWfN{Uv=T~7x`@!<-`@k&_yOfOj#pP#hf)g9^RR<2;dV~o_a3fxDoH7Y z&*!7GJ1TcyYmKU^N7r^?i~+#s^P#o&0a^j7y1M#kB9VA6pU*eOVzJd^r34#YmwUec zT@k?;gHj3+$#rye{45@i|6YrT*tY$*bLYZ**^~ zch?l_E)I!3-ozC9e8|1WG)8UD@yQaB~_NMScFL4;11o z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>crNswRge}<>q x4ZMInQBN1gkcwN$2@Onc8YelD44N_w*ccclF!0X*`y>PuN}jHMF6*2UngBkbCc*#! literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_down_inverse_7x4.png b/resources/com/jtattoo/plaf/icons/small/arrow_down_inverse_7x4.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ebca8ac0b11f51247b3bf257bf441fcf7c173b GIT binary patch literal 911 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3-ozC9e8|1WG)8UD@yQaB~_PIlnlN2NdEg z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>c*NswPKgTu2M wX+Vysr;B4q#jWIo76vvp4c0V+2F4C12F3yg!D)K;4M2h9>FVdQ&MBb@0FenJ%m4rY literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_left_4x7.png b/resources/com/jtattoo/plaf/icons/small/arrow_left_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..2723c85e7ad02aa0d29c23c7616467cd239b30c5 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3-oNcFQ~haY{UWUD@yQaB~`IdCt$Q1PXB$ zctjR6FmMZjFyp1Wb$=Kbm>B|mLR^88|Ns97lA~ZW1V&&8q?f%(26~&RB*-uLKf}}Q z23|m(gr|#RNX4z>gp`z&1cpR5fi?yMZY4GqMuz_kyp0v7w}S%8)78&qol`;+0K!fs A?f?J) literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_left_inverse_4x7.png b/resources/com/jtattoo/plaf/icons/small/arrow_left_inverse_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..026ca702bb0e0129dfc7a9a8edc0b3b2f208b83d GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3-oNcFQ~haY{UWUD@yQaB~`K1++w10EIXU zJR*x37`TN%nDNrxx<3pI%nSiOA+A8l|Ns93$x$#G0wXX4(#zf?1HH{y666=m;PC85 x8jvI5>EaktaVt3i2v`!`1kzX%HMo`7R2Ufz83c{fyA(m;=ljBJBVG literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_right_4x7.png b/resources/com/jtattoo/plaf/icons/small/arrow_right_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6c8d76870439fb2e6ae0a56b9cb7f323d8affd GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3-oNcFQ~haY{UWUD@yQaB~_dxw|~{1`2T& zctjR6FmMZjFyp1Wb$=Kbm>B|mLR^88|Ns97lA~ZW1V&&8q?f%(26~&RB*-uLKf}}Q z23|m(l&6bhNX4z>goKool!OEZVV;C0#$!yKjH!$auNio&6h4H2g38m?&t;ucLK6Va C^d}hr literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_right_inverse_4x7.png b/resources/com/jtattoo/plaf/icons/small/arrow_right_inverse_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..15f31e9bd0ed62945a55ad250f79418081c28bfd GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3-oNcFQ~haY{UWUD@yQaB~_fYeqbn0~F#c z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>c*NswPKgTu2M zX+Vyor;B4q#jWIo6b2?YH-m#5Y7&V$6C?zf85ms|1U)aL-30}dr>mdKI;Vst05AU} A_5c6? literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_up_7x4.png b/resources/com/jtattoo/plaf/icons/small/arrow_up_7x4.png new file mode 100644 index 0000000000000000000000000000000000000000..1007bee6a96cd3b7b0acd19d2b85adade197b37a GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3-ozC9e8|1WG)8UD@yQaB~_n{;^nC0Tkja z@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt!7F|Ns9FBuBw$2#mlGNH2Sn4D>crNswRge}<>q z4ZMIn2~QWtkcwN$2`MQl4GC;)0*s3!7N`g?FfbZ0@aAb6se=N_)78&qol`;+0CjpK Ab^rhX literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/arrow_up_inverse_7x4.png b/resources/com/jtattoo/plaf/icons/small/arrow_up_inverse_7x4.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d48b86113c0612935f21ce0469a6846a0f48e7 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3-ozC9e8|1WG)8UD@yQaB~_EaktaVt3i2vQiB-Q3(XSd$E#fHD^t1l?R$T?K`cr>mdKI;Vst06UN)rT_o{ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/check_symbol_10x10.png b/resources/com/jtattoo/plaf/icons/small/check_symbol_10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbc1a3582a8349d4c09ca34efb26be2e3676d58 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&v6p!Iy0YKp5fo%sJKwqJI#7tS zz$3C4sO$p>Gdis?nZdxo%n;xc;tG`f4}_y&Gz3Ou2uw3|zXkL-Q%R6t@PCG<+YP*c zJatbO$B>F!$q6mYY%JZ32a_B&NC+ee@XbhZc+_mk6L2^|N;5n>Ff#=Bgt-1^_}|db08}yxMnhl(hCukfcQQb4GnNGT1v5B2 zyO9RuD0sR!hE&{2PB_3MA*kcV(k(cX^_k%z&lx((%CoFOgc(_tcnp@ye4htYz+U3%>&kwci=9`{>YqFRQjh@!9+AaBvp#?@qthCb84L`}3;{kN zu0YBEKsX9ULtsRPz%*0$TR@L9l?3?(|7Uo*-M|aTQ}%Rm45_%4oY2C|mZHWygIz`P pfC@{q>j5K!NVk%}mZ%+^47?8+92Ml-fVql+!PC{xWt~$(698BXG86y+ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/cup_16x16.png b/resources/com/jtattoo/plaf/icons/small/cup_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d76894eb73dbe84c0f6bdafa8b96b43c23753d09 GIT binary patch literal 772 zcmV+f1N;1mP)A;R$lY<3rPdIQ7_3cP0X&_U^7_xSMOVZp#r`z$u6kjEE#m2GMqrh)V!5Q+c5 zqQixLqY3p*DlnMkC}(kCcdVegP7WSlU=@i(XK50Nw6UdCjb*z7o^>y_Lt&)Tz-Ax> z%d!jlp>eP{)p+uv4Ccu>)RRh>Cugv+;Rh*KOwx!(d1`Ili)bv4pUEVg?k%`hJ(#yG zL8<8mgIS9EkDlUHr2wt!PB>j|r2oXMsjW}bxO{;pu)U2)G=_L0foMDd-)0aKGxO-` z8GuyL21%n5Dzz5V(=!MJLjVASaTJ%cuMW}(g2>QlG!sL{VXV46i0vk@oA`xrBm$q$ z2dmYF**OcWi%XcZETC8455{xm!Ht|-ZP{5_XO32oN~JjjLDV!iH;=b>c5RZRA}J7x zQOT)FvEH&{FN@2*G8oSWbMx{`>2&&qlk>pec7oea>NBey0000hbVXQnLvL_-a%pF1 zbO1wdaCvfRXJ~XFsUR{iFgPtTFflP8NlrsgQd1yDZDL3ejv-F~0000|yo*1Eav}q=*L5xCazXs!2^6SVA_cL5-Z&xQIqIX%IDN z5`<6`8jgZnWMHK=FjBm2O)Kl7e?hZz^ZZ^|#Og*%u|(&#%~bbwlh5ZlcJlPmwmA3f{JFEu8GwbLrMCn^ zm>Du*vC&p8v1j)#PMkV(*q1jv$^cvxIRNh?f*CGJ6Oc1H+BY&h@|IeyMtN=PkyR9! z0XQ5!a>OCvNFc$Wt7|6*s{1+E)6LB6oMiw})R z5JGAO$#6L8u^~B}96@5f9w-!xq;3IdV8svwn1nMhff;x&7J?B>n9>0o$|#U2NDxfa zO$h#Wje`gVmiqC26+j$9WGO(1kQT)u$xVrZ^jgM(a25yoIQ!**O*t_8ozI_?Tukkb$nkW>S$mMfLE>Q)` z16Zk`@6yFX0|Qq}t(Ep_R literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/folder_closed_16x16.png b/resources/com/jtattoo/plaf/icons/small/folder_closed_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..434e927aab5993c07c266af73535022503d51662 GIT binary patch literal 739 zcmV<90v!E`P)AccP=xTWHOV^OeLE%v`xLxtq4+eBe*Grx^*Q&(T!bH5UIEkZ#xyt!j-yl zRdE-zOIM0W#7hWC+Coh0kk&DC=5o%Q?|a|ZMP<@%MCb$W_V;Yw$MJxf0w28j!s^jv zaKWVL<;C!i{>a}7;&v)2Z(Uyfar~dayBD87Rc+dLuf2VFacYJ!-OUYFKm7Eni;^G2 z+qS~i?(OdOmuokB_W>Wh^YU&wxxKV>VwvNQtZ;O3fmUY$DV4oz*V+DUlhJU*cwfUVQa^vi)29xx2;QjXi$(ex2bUqxDdWGf$spzSY4+ zF~o`c>Wj6rzyG}c4A4jbH00oiH0m*pM^9p9pM20E&$<+O!HgRcGC>sLD4{uG?{O95T8To5%EZrlE#iZ{fsGKegu=hkWn9`M5I894B{FH zh6{lC`u%DIO-=}hg6nmjjGO`l4gd+g@^_|oTBH$QpMHS-T{3{$VA zm192u001j=MObu0Z*X~XX=iA307GwZd2(rIXmlW{ATls8I4v?TF)<)XPD4*pQy@oe VVn`5gM5OcFxZ4#l3j3(>FId{|9L$CM~_vluf0=M?zB21 z(P&ptYXVB^mK0CY{#_>?zxgMid|mN}iX#_?K@e!9GuS||Dag61qaW+5YqAeNCH7aq zw(TWuyRD^m=fOjRP~U-85C*K?T&X%qU0rj1sJY>DINa9I9*xz@n10d2!JbWX8@KH% zAE;C(7=tAQ!V+M+00-bA7XC`;YnUAy${vWVYyD@!fiKf7!G}Kau5aFPdGlw_pN7*& z9zJ+QV?zs(NR;f{EXMe}pcS^$f!!;K#f6Jci%lg{?(eNA8Q;+sqUlo|)zz;7C;j`! zlb@T(z_diLk~n{%nmG##ux%R)gK@Z7wY2Pj*s^-!mK7`g`$lDXFfj=jl+PD9K(~X0D{u|yiD6jjf_c@R7k0QY4@KxD3$wnpOZ1T zA1;?osI`llyHBnPfQpSXE|xAEzaSyW-3?HGI#4L35k_7-|*@$6kYm6d1L z2!Qg^Ny~Fbq@FJFk0hoImH?#t9)jIBIHMuw;p!ljk0p_UMmUzk5)&Jbz}SqieIv zW@1`O-`<%S9{;)EH>;_9#-G59icjV|}Vi7i+Ej ziSD@3$)0#uO0pYoPC6YwBrd0u!>8`uJbvwM;Xl_{Fl|WOXivgq+hI?S$>=;!KX>-G z){aPLSQnqT`R4Y2&-o{8Pfm~mKOI{D001j=MObu0Z*X~XX=iA307GwZd2(rIXmlW{ pATls8I4v?TF)<)XPD4*pQy@oeVn`5k1K47yNYhFHnfHz$3Dlfq`2Hgc&d0t^32kz|0Wf6XFV# z{Qv(ykQ@c0Aus|%AieBOGSJ&hB|(0{{~4ZcH}C@TL_J*`Ln>}1C$uoLO`5?I&~Qp+ a0WX8F7DK4kp15bAQ1W#3b6Mw<&;$TwvoSaT literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/maximizer_10x10.png b/resources/com/jtattoo/plaf/icons/small/maximizer_10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..b4dabaae4629d65bf5bf4bcf9a1850cbdac4ed92 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&iI%uVlsFfqCYEI8=P86_=B6^R z-{IzDHxiaAcwq`uz+U3%>k1Y!7Qe{;PZlV|S>O>_%)r1c1j3A$?$-TbU|?nl@Ck7R zO8)=2$rjj7P;QtIyw;Ol?d6J$kjv*Ddk`r2(*$fUg^q*v4 fUE$Mo>j47;|1$>9C=UBeppf!(^>bP0l+XkKebF+w literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/minimizer_10x10.png b/resources/com/jtattoo/plaf/icons/small/minimizer_10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f998754d77126d56a2aefc813cb00accc02da7 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&iI%uVlsFfqCYEI8=P86_=B6^R z-{I!u;FI{u%U=&vz+U3%>k1JvOxjnH3>4xl@Q5sCVBi)4Va7{$>;5n>Ff#=Bgt!7F z|Ns9FBuBw$2#mlGNH2Q>${~6@vd$@?2>`MjGJOC5 literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/pearl_green_24x24.png b/resources/com/jtattoo/plaf/icons/small/pearl_green_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..53ebaab6862f8362777a8b8678638ebfc8ae1e1d GIT binary patch literal 745 zcmV4+rqX%>)jOUBVlW`!IRyDDF&z&|fRi z!g{G=L&b~sXvyMzvYi-c#s_al@cx@&y!ZOHi=!XD8^PA=hp>3BY!}7XX%dV}k>Gwp z5A;TH@L3P`KRJh2$Gh;__<0vcJGsH9-FUFC8iP%Qh8pFt=dZ}eiQU__%Sxyu2y^s1 zq;n})T$u-&U&YZ2EH{^#g+M3(&RamC$FqT`2`zf51{8lohOxx`fh@PcNUyN~%Pi;I zEn*6cQUanXwsbTL9K8L~neDEA9;d>Zm11$zxgJ2~oOcLD{?l0Y_uh-U*%;6Ne; zKuiTxB7&-mpg9-?tLRQn0L497arTxIIq#c{D=^JVK9F^0VyIvl1pJl(g_iE(w+NUf zaT`!f33!a)2?2xX3z3%IAPrIZ!l-O`(Bh8VqK{v_e?t3I|zx1%6B}W&~3hS=TP?K3S4%yi#Fz zerUowUykF8Z@u__cF5)V*NZs(`51P7Y{tg^3Om|fvaxNhIbD{FT_~rmFJm|`nZU7` zv-oJHlj$Sa`YMJEJ>|6eOt@oH|D&4r;z+cuY_zT`Jk@ZyA|GcsI@(q`T7N1KhOO9& zzjsLWmmXhh{Qv*}D|AIzbVF}&d2(rIXmkKWZ*X~XX=iA3AgLfSFfceRGB7bQAW2R` bPf}ALM{QzA5RM^F00000NkvXXu0mjfsuM>s literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/pearl_grey_24x24.png b/resources/com/jtattoo/plaf/icons/small/pearl_grey_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb9ccbd1c6d3a42157fae7449a1a32d42524214 GIT binary patch literal 804 zcmV+<1Ka$GP)ULh*FA3@nCHP4G~3? zlwzotwx-R;?!JA_OCpGdx)pmUI51?GnVnzW%1yyFs#bR~0=gDqcbZ$H`4IbPb8nMje#011*#{eNvtJUDuN&!~O zpPQhNOtG+hf6svN5Kxss2ePoRAe?slMq&A7Uq~Pp zi~U~w(v)RTBY)xIBpn+&3-z4_wA%Jh+J>D*6Qa>0KsAGWU0=U)G&(d_tF3PRTC4An z1D=vSVZ}`e-@)Rx?SSLB;JCc2Xxom1u_g=-4#LRExJf9v-LF<(Krj?a4-Fp&4?E(b z3hcYUmOxLXEqyX3b7XEX#L~XEh_Q$jIW&N^FpPx={wk{4>3w&L1PDNzi%yQrWnpId z22iR&m@zO+6I7~#s%a3A0Hu3ifdl8R3$AU0ZWz#RwLqg3d;>VQE4r@7!;uIC5Jn9Z zs00L*UK{~(CbkP4A@W3=^NMeP>+<}@=0+wqJPfL?1Jx<0vi-e@;Q=rQz`>1@fVFB> z0`tCy9HPNHA4h$QBa{1$B8XBMjhjAXg zn2lQcvd02li2#m-8&4+IG?Er2RTkgw6ao&q%+ zn0XI0{uwaN`J`6r<&f_?H%CV?FgOUtIrcX;@MU=!s|N?6=6q^Fso8S_s!~q6O1-)_ zGQw_5Oh9D{TC46)jDZV*)%kfWE-mRc=MU$SWVUC(xMc+%@a^u`&C zTWy%81ormic9!wABw6^g7B2#LQdTefKKOAH?6?IZJcbdqA>wWr5zWIE7)73w=X$1D zEvhAo7RyowzUxx42*&Xdgkw{y0^H~}tg;MQOn2!dhKNG=t_Q!}4tfSiGSIax*sepx zEeO|wVM#F21?ZFj1WPqeBSr|*C_L?AK%#Zs65^`olwg)!NZ)}$z~6ubS(qSZIfR2n z`Iyyv21Jb2_M>R(k~siba$xx$glB`9lukQVNlFHXkhJ|I&ag#>ca*9X)haZZ?!}AG zKU$%RI&i3UyJW-a_h9#zVOLz(eH7%2V+d&S;uGbXoX_+Oc(c1(?_}xYcU#|ey5EA+ zQE)8>UZszs0@t)qiWRcM7V;d*oqD~qQ}|>QJ45==Y<|4$dD|-ohhwF7M^;irozeLm zwQ#bwjjt=4c)MN?n^E}ad82Xur{b5M1XqHTVcHe4+Al0x$iEP)1xexOFO4CWAp)Dta`f#e$3&V!}FYX;GKa&6av}~Ful26 zF*|}R(Q}mL9GtwVPBBjed0oIE)@hEq?2IACaYPs=tchophYP>yb8Cs0QH(vV!SkIZR=8ywudBVW*nDui9Os@l;C!qd7l_5l zj{jJQwYj}_H1qIIIkpFj&8@VAt%{mYY^V+>AlPf*vA=@gS);)eJ=ZsJ^Az<~0f_2K z1&aJ)L*52{pI7($7&RTS6<16YH~u25yEOs6fCwAl^K;PrlAgDL=oLVcy}-EyvMl_A zxCs;g)HY{C5WF79+aR66B?J%1Tn46a;Hm;lRe>uCp}M)^)D)S_WN>EF7A)m$kjdB+ z%gGE#v=x`=B#eQ=IEj)lr<`+O5}8v^mOZeX%tHEyJ(0J8SICY|zWtW|Zv7+?Itd9e zg#jaRXM4t+&B<62!Aj>KPP4oyJF>025bZ5B%xhKlr`NTJ9}Xd|b|a?F5~mSYx)76% z`1wsOj$N;^hr*>hyUhbW2-OCA$^wPoK_TE54aE>lU;N{j0000hbVXQnLvL_-a%pF1 zbO1wdaCvfRXJ~XFsUR{iFgPtTFflP8NlrsgQd1yDZDL3ejv-F~00001SIo6Pjm-TjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=dY0 z)7O>#E)OTKn05W}6IDQ=Fi#i95Q*^Ien+kY3Op=tqgZD8bP0l+XkKAHGWj literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/small/tree_expanded_9x9.png b/resources/com/jtattoo/plaf/icons/small/tree_expanded_9x9.png new file mode 100644 index 0000000000000000000000000000000000000000..7818f0624743b7c5f958c9ddb95ad1b1f9ec8d9d GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1SIo6Pjm-TEa{HEjtmSN`?>!lvI6<+C7!;n z?00!MdBv>jkDsUl3VC|EIEF}sC(kiTJvG}rU&5fFql3fQ+4-=34ub~Yq~CqK4o~+b zFbC}Hm$zRO$u81(YVTpT1w{_!NlYv5c;_&vuz!)CaEQgBkYTC+5|x?ulGA{OGI+ZB KxvXK5N_o^XHF0eti4s)4R`~-+%e?@$1)5-@kuh7zLvt zFwh~O_>+Z^fq|Vt2jmb?o?zgZ&A^{>pkU#GgWSRj99tX~HnngF%9tc9NN{B0;gNNk z;!)Vx$So=FHYZ}@fkti(zbO$rg<9Aqs|Rn&`T5DgXR2}RA(zg{OZ{fsq)+=%8LV+} zfn~Os@2+6A(}MD5Gv-`4aO8}jqJ@q|0mGptHkEm8FE%h7Xkg~w*LKuP%ziQ#n zTE{17ot~_Hd!GKi1^SPd7<}7g@_n=E&n>1uw_5%>5c=z2#IHk(+Z^ zfq|7l2V^`bPcU%IXW*WqV7O?(K|v)a4x5XOhuhlujY9%HG`g_!itA)tiEuo`%%p4) zv%p~C5>F0Z77>ZSK5N_o^XHF0eti4s)4R`~-+%e?@$1)5-@kuh7zLvt zFwh~O_>+Z^fq|Vt2jmb?o?zgZ%D|s;px|M{!De=K2Zs!U=GJy`C9f$r5)LxANoZua z9Nd`fE-b1qw}?xsw4hVN a?uLfDyUV%fq|P|Nz}Uva&cMgPU=0Az0Gpct literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/thumb_ver_rollover.gif b/resources/com/jtattoo/plaf/icons/thumb_ver_rollover.gif new file mode 100644 index 0000000000000000000000000000000000000000..21c752053effef9276c4ff2ef5b1f0e810e2c339 GIT binary patch literal 960 zcmZ?wbhEHb6lLIL_|CwPSJzS0+*{r;siJdoZQsoQ4FCI@68f7HmrgI(wYqNi>iQ#n zTE{17ot~_Hd!GKi1^SPd7<}7g@_n=E&n>1uw_5%>5c=z2#IHk(+Z^ zfq|7l2V^`bPcU%IW#FEoV7RE^U^BaGi$lhSBb|IQZXR^DSH^sD8#rZ}!GO>shJU--m@PPIq0WLWc afdkv~?=!ORQ~KlJz~J1*$j8pYU=09t`nI(I literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/view_detail_22x22.png b/resources/com/jtattoo/plaf/icons/view_detail_22x22.png new file mode 100644 index 0000000000000000000000000000000000000000..bc047467756c446491a7793e74dd0671d63e6d1f GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`^l(BSkwBo8=_8q8zy~NYk6)dDBzd!U4NGoT7M`SSr1Gf+eGhVt|_lJRjnIXU@#PvVJ z|4CD4%$>Vv-n_;0=Py~bXxWk_E0-=^xqSKRl`Ge+TD5lV+70X1Z{DzB)22;ZHf`Fv zWy{W;JNND1fB49elP6D}Id$sXwQD!;-o1P8-orny?*`r&6_uG-@bkK?%n(M?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^ zfBg9I^XJcBzkdDx{rk_KKY#!J{rB(R|NsAiJ{Sd~AwY`|m@{iyDbQTTk|4ie28U-i z(tw<;o-U3d6}P7L9~Wv0;9)Rd)D(O09wX!Kq{{#QGnEvqP93#0ll5{dDGj&OcLM-{`)XVv^w;t69q3zkBQZy(O|*UO`H_n?xkT7p$2V zbG|)SAoFE_5?TwAvYEO*_e6vr#|u-fA03zG#`|13OeZ^JP6j^;_;;Ag6!Q1W#3 Kb6Mw<&;$TDRtE?G literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/view_list_22x22.png b/resources/com/jtattoo/plaf/icons/view_list_22x22.png new file mode 100644 index 0000000000000000000000000000000000000000..99a1eda8661045fd7d121f5d5051a8a60997ee52 GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`^l(BSk(zx`pr3R>gy~NYk6)dF9pzZc=J5Y$Tz$3Dlfq`2Hgc&d0t^32kz|0Wf6XKem zpI=Z=P*zq}TU+~|;eT^;bANyT#EBE<&!0bc?xK0~7SEr*WYMB!OO~u$x^(68<*Qe& zT(@e~+O=yptY5!*!-h?pHf`CoY3r6PJ9qBfw}1cPBS%gG!KqWHPM$n->eRVw*KXdu zd-vYGhYub+c=YJelP6D}J$v@z#fz6OU%qhoo3YCW$kT3=MmZ`y~APe|(bL zxq~0~9JZbkwQ7>om&UE^Njq=;OWv#^wwjAO>0RTD$nQV)N!EIv@9gStuN67hvGKRZ z*YtUv!m548jvRRBch-FIQ7y4{=0(rrUiDtL5mxt-`P#8|PdM zU#hz(`0fS8U13$dV&a+8Us%69Yg|}(N1aJ~uUmKb?FNZyW;T}<4Xg4rw)S>({_Ty; kyxB5iU-%56fBcn~<(Y2j{9WYia1In^p00i_>zopr01eg^@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/com/jtattoo/plaf/icons/workplace_16x16.png b/resources/com/jtattoo/plaf/icons/workplace_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..20416ee53781ebc2130abee04957a67741ea171b GIT binary patch literal 792 zcmV+z1LypSP)%@^T8SW=W;SZ0YC5^)$P2uzDIGX$};`hej4Gp8+RRx*c1Hc%QY!1|# z4h9EQ{G^K(e25K)@b!$Leg$ey_ap(pdMpSGI0Vq>f-5qHZYubGW*`;;E-q}G7EJ_I z%LR~S8T|lcE)>+-;4)c~IR+_*V$sH}Ko^BG9V1~&NEK?)FGR^QODk#?77B%MetwRlqa#ZFg4i^) zS}l+g%+1XqolawWdmASwC!cn9cBa|t>gtb7CKDBG&1TbOqGfX1Fbt3ylu9L#GFL&P z(Qv=2s=g&9AKBX4+N)}{`fg%k;vsouu~^JaSFnl_a%um?12;4QENpFUZ3%_*e=;B? zV-(w_yRE1AW`#oWfm z#$_&-= 1.5) { + table.put("Spinner.font", getControlTextFont()); + table.put("Spinner.background", getButtonBackgroundColor()); + table.put("Spinner.foreground", getButtonForegroundColor()); + table.put("Spinner.border", getBorderFactory().getSpinnerBorder()); + table.put("Spinner.arrowButtonInsets", null); + table.put("Spinner.arrowButtonBorder", BorderFactory.createEmptyBorder()); + table.put("Spinner.editorBorderPainted", Boolean.FALSE); + } + if (getTheme().isMacStyleScrollBarOn()) { + if (getTheme().isSmallFontSize()) { + table.put("ScrollBar.width", 8); + table.put("SplitPane.dividerSize", 7); + } else if (getTheme().isMediumFontSize()) { + table.put("ScrollBar.width", 10); + table.put("SplitPane.dividerSize", 9); + } else { + table.put("ScrollBar.width", 12); + table.put("SplitPane.dividerSize", 11); + } + } else { + if (getTheme().isSmallFontSize()) { + table.put("ScrollBar.width", 17); + table.put("SplitPane.dividerSize", 7); + } else if (getTheme().isMediumFontSize()) { + table.put("ScrollBar.width", 19); + table.put("SplitPane.dividerSize", 9); + } else { + table.put("ScrollBar.width", 21); + table.put("SplitPane.dividerSize", 11); + } + } + } + + public static void setTheme(AbstractTheme theme) { + if (theme == null) { + return; + } + + MetalLookAndFeel.setCurrentTheme(theme); + myTheme = theme; + if (isWindowDecorationOn()) { + DecorationHelper.decorateWindows(Boolean.TRUE); + } else { + DecorationHelper.decorateWindows(Boolean.FALSE); + } + } + + /** + * Set a theme by name. Allowed themes may come from the list returned by getThemes + * + * @param name the name of the theme + */ + public static void setTheme(String name) { + // Overwrite this in derived classes + } + + public static AbstractTheme getTheme() { + return myTheme; + } + + public static MetalTheme getCurrentTheme() { + return myTheme; + } + + public static java.util.List getThemes() { + ArrayList themes = new ArrayList(); + themes.add(getTheme().getName()); + return themes; + } + + public static boolean isWindowDecorationOn() { + return getTheme().isWindowDecorationOn(); + } + + public static ColorUIResource getForegroundColor() { + return getTheme().getForegroundColor(); + } + + public static ColorUIResource getDisabledForegroundColor() { + return getTheme().getDisabledForegroundColor(); + } + + public static ColorUIResource getBackgroundColor() { + return getTheme().getBackgroundColor(); + } + + public static ColorUIResource getAlterBackgroundColor() { + return getTheme().getAlterBackgroundColor(); + } + + public static ColorUIResource getDisabledBackgroundColor() { + return getTheme().getDisabledBackgroundColor(); + } + + public static ColorUIResource getInputForegroundColor() { + return getTheme().getInputForegroundColor(); + } + + public static ColorUIResource getInputBackgroundColor() { + return getTheme().getInputBackgroundColor(); + } + + public static ColorUIResource getFocusColor() { + return getTheme().getFocusColor(); + } + + public static ColorUIResource getFocusCellColor() { + return getTheme().getFocusCellColor(); + } + + public static ColorUIResource getFrameColor() { + return getTheme().getFrameColor(); + } + + public static ColorUIResource getGridColor() { + return getTheme().getGridColor(); + } + + public static ColorUIResource getSelectionForegroundColor() { + return getTheme().getSelectionForegroundColor(); + } + + public static ColorUIResource getSelectionBackgroundColor() { + return getTheme().getSelectionBackgroundColor(); + } + + public static ColorUIResource getButtonForegroundColor() { + return getTheme().getButtonForegroundColor(); + } + + public static ColorUIResource getButtonBackgroundColor() { + return getTheme().getButtonBackgroundColor(); + } + + public static ColorUIResource getButtonColorLight() { + return getTheme().getButtonColorLight(); + } + + public static ColorUIResource getButtonColorDark() { + return getTheme().getButtonColorDark(); + } + + public static ColorUIResource getControlForegroundColor() { + return getTheme().getControlForegroundColor(); + } + + public static ColorUIResource getControlBackgroundColor() { + return getTheme().getControlBackgroundColor(); + } + + public ColorUIResource getControlHighlightColor() { + return getTheme().getControlHighlightColor(); + } + + public ColorUIResource getControlShadowColor() { + return getTheme().getControlShadowColor(); + } + + public ColorUIResource getControlDarkShadowColor() { + return getTheme().getControlDarkShadowColor(); + } + + public static ColorUIResource getControlColorLight() { + return getTheme().getControlColorLight(); + } + + public static ColorUIResource getControlColorDark() { + return getTheme().getControlColorDark(); + } + + public static ColorUIResource getWindowTitleForegroundColor() { + return getTheme().getWindowTitleForegroundColor(); + } + + public static ColorUIResource getWindowTitleBackgroundColor() { + return getTheme().getWindowTitleBackgroundColor(); + } + + public static ColorUIResource getWindowTitleColorLight() { + return getTheme().getWindowTitleColorLight(); + } + + public static ColorUIResource getWindowTitleColorDark() { + return getTheme().getWindowTitleColorDark(); + } + + public static ColorUIResource getWindowBorderColor() { + return getTheme().getWindowBorderColor(); + } + + public static ColorUIResource getWindowInactiveTitleForegroundColor() { + return getTheme().getWindowInactiveTitleForegroundColor(); + } + + public static ColorUIResource getWindowInactiveTitleBackgroundColor() { + return getTheme().getWindowInactiveTitleBackgroundColor(); + } + + public static ColorUIResource getWindowInactiveTitleColorLight() { + return getTheme().getWindowInactiveTitleColorLight(); + } + + public static ColorUIResource getWindowInactiveTitleColorDark() { + return getTheme().getWindowInactiveTitleColorDark(); + } + + public static ColorUIResource getWindowInactiveBorderColor() { + return getTheme().getWindowInactiveBorderColor(); + } + + public static ColorUIResource getMenuForegroundColor() { + return getTheme().getMenuForegroundColor(); + } + + public static ColorUIResource getMenuBackgroundColor() { + return getTheme().getMenuBackgroundColor(); + } + + public static ColorUIResource getMenuSelectionForegroundColor() { + return getTheme().getMenuSelectionForegroundColor(); + } + + public static ColorUIResource getMenuSelectionBackgroundColor() { + return getTheme().getMenuSelectionBackgroundColor(); + } + + public static ColorUIResource getMenuColorLight() { + return getTheme().getMenuColorLight(); + } + + public static ColorUIResource getMenuColorDark() { + return getTheme().getMenuColorDark(); + } + + public static ColorUIResource getToolbarForegroundColor() { + return getTheme().getToolbarForegroundColor(); + } + + public static ColorUIResource getToolbarBackgroundColor() { + return getTheme().getToolbarBackgroundColor(); + } + + public static ColorUIResource getToolbarColorLight() { + return getTheme().getToolbarColorLight(); + } + + public static ColorUIResource getToolbarColorDark() { + return getTheme().getToolbarColorDark(); + } + + public static ColorUIResource getToolbarDockingColor() { + return getTheme().getFocusColor(); + } + + public static ColorUIResource getTabAreaBackgroundColor() { + return getTheme().getTabAreaBackgroundColor(); + } + + public static ColorUIResource getTabSelectionForegroundColor() { + return getTheme().getTabSelectionForegroundColor(); + } + + public static ColorUIResource getDesktopColor() { + return getTheme().getDesktopColor(); + } + + public static ColorUIResource getTooltipForegroundColor() { + return getTheme().getTooltipForegroundColor(); + } + + public static ColorUIResource getTooltipBackgroundColor() { + return getTheme().getTooltipBackgroundColor(); + } + +} diff --git a/src/com/jtattoo/plaf/AbstractTheme.java b/src/com/jtattoo/plaf/AbstractTheme.java new file mode 100644 index 0000000..f743f40 --- /dev/null +++ b/src/com/jtattoo/plaf/AbstractTheme.java @@ -0,0 +1,1448 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Color; +import java.awt.Font; +import java.awt.RenderingHints; +import java.io.FileInputStream; +import java.util.Properties; +import javax.swing.Icon; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.FontUIResource; +import javax.swing.plaf.metal.MetalTheme; + +public abstract class AbstractTheme extends MetalTheme { + + public static final int TEXT_ANTIALIAS_DEFAULT = 0; + public static final int TEXT_ANTIALIAS_GRAY = 1; + public static final int TEXT_ANTIALIAS_HRGB = 2; + public static final int TEXT_ANTIALIAS_HBGR = 3; + public static final int TEXT_ANTIALIAS_VRGB = 4; + public static final int TEXT_ANTIALIAS_VBGR = 5; + public static final String DIALOG = "Dialog"; + + public static final ColorUIResource red = new ColorUIResource(255, 0, 0); + public static final ColorUIResource green = new ColorUIResource(0, 255, 255); + public static final ColorUIResource cyan = new ColorUIResource(0, 255, 255); + public static final ColorUIResource white = new ColorUIResource(255, 255, 255); + public static final ColorUIResource superLightGray = new ColorUIResource(248, 248, 248); + public static final ColorUIResource extraLightGray = new ColorUIResource(232, 232, 232); + public static final ColorUIResource lightGray = new ColorUIResource(196, 196, 196); + public static final ColorUIResource gray = new ColorUIResource(164, 164, 164); + public static final ColorUIResource darkGray = new ColorUIResource(148, 148, 148); + public static final ColorUIResource extraDarkGray = new ColorUIResource(96, 96, 96); + public static final ColorUIResource black = new ColorUIResource(0, 0, 0); + public static final ColorUIResource orange = new ColorUIResource(255, 200, 0); + public static final ColorUIResource lightOrange = new ColorUIResource(255, 220, 96); + public static final ColorUIResource yellow = new ColorUIResource(255, 255, 196); + public static final ColorUIResource blue = new ColorUIResource(0, 128, 255); + public static final ColorUIResource darkBlue = new ColorUIResource(0, 64, 128); + + protected static String internalName = "Default"; + protected static boolean windowDecoration = false; + protected static boolean macStyleWindowDecoration = false; + protected static boolean centerWindowTitle = false; + protected static boolean linuxStyleScrollBar = false; + protected static boolean macStyleScrollBar = false; + protected static boolean dynamicLayout = false; + protected static boolean textShadow = false; + protected static boolean textAntiAliasing = false; + protected static int textAntiAliasingMode = TEXT_ANTIALIAS_HRGB; + protected static boolean backgroundPattern = true; + protected static boolean brightMode = false; + protected static boolean showFocusFrame = false; + protected static boolean drawSquareButtons = false; + protected static boolean toolbarDecorated = true; + + protected static boolean menuOpaque = true; + protected static float menuAlpha = 0.9f; + protected static String logoString = "JTattoo"; + protected static FontUIResource controlFont = null; + protected static FontUIResource systemFont = null; + protected static FontUIResource userFont = null; + protected static FontUIResource smallFont = null; + protected static FontUIResource menuFont = null; + protected static FontUIResource windowTitleFont = null; + protected static ColorUIResource foregroundColor = null; + protected static ColorUIResource backgroundColor = null; + protected static ColorUIResource backgroundColorLight = null; + protected static ColorUIResource backgroundColorDark = null; + protected static ColorUIResource alterBackgroundColor = null; + protected static ColorUIResource disabledForegroundColor = null; + protected static ColorUIResource disabledBackgroundColor = null; + protected static ColorUIResource inputBackgroundColor = null; + protected static ColorUIResource inputForegroundColor = null; + protected static ColorUIResource selectionForegroundColor = null; + protected static ColorUIResource selectionBackgroundColorLight = null; + protected static ColorUIResource selectionBackgroundColorDark = null; + protected static ColorUIResource selectionBackgroundColor = null; + protected static ColorUIResource rolloverForegroundColor = null; + protected static ColorUIResource rolloverColor = null; + protected static ColorUIResource rolloverColorLight = null; + protected static ColorUIResource rolloverColorDark = null; + protected static ColorUIResource pressedForegroundColor = null; + protected static ColorUIResource focusColor = null; + protected static ColorUIResource focusCellColor = null; + protected static ColorUIResource focusFrameColor = null; + protected static ColorUIResource focusBackgroundColor = null; + protected static ColorUIResource focusForegroundColor = null; + protected static ColorUIResource frameColor = null; + protected static ColorUIResource gridColor = null; + protected static ColorUIResource shadowColor = null; + protected static ColorUIResource buttonForegroundColor = null; + protected static ColorUIResource buttonBackgroundColor = null; + protected static ColorUIResource buttonColorLight = null; + protected static ColorUIResource buttonColorDark = null; + protected static ColorUIResource controlForegroundColor = null; + protected static ColorUIResource controlBackgroundColor = null; + protected static ColorUIResource controlHighlightColor = null; + protected static ColorUIResource controlShadowColor = null; + protected static ColorUIResource controlDarkShadowColor = null; + protected static ColorUIResource controlColorLight = null; + protected static ColorUIResource controlColorDark = null; + protected static ColorUIResource windowTitleForegroundColor = null; + protected static ColorUIResource windowTitleBackgroundColor = null; + protected static ColorUIResource windowTitleColorLight = null; + protected static ColorUIResource windowTitleColorDark = null; + protected static ColorUIResource windowBorderColor = null; + protected static ColorUIResource windowIconColor = null; + protected static ColorUIResource windowIconShadowColor = null; + protected static ColorUIResource windowIconRolloverColor = null; + + protected static ColorUIResource windowInactiveTitleForegroundColor = null; + protected static ColorUIResource windowInactiveTitleBackgroundColor = null; + protected static ColorUIResource windowInactiveTitleColorLight = null; + protected static ColorUIResource windowInactiveTitleColorDark = null; + protected static ColorUIResource windowInactiveBorderColor = null; + protected static ColorUIResource menuForegroundColor = null; + protected static ColorUIResource menuBackgroundColor = null; + protected static ColorUIResource menuSelectionForegroundColor = null; + protected static ColorUIResource menuSelectionBackgroundColor = null; + protected static ColorUIResource menuSelectionBackgroundColorLight = null; + protected static ColorUIResource menuSelectionBackgroundColorDark = null; + protected static ColorUIResource menuColorLight = null; + protected static ColorUIResource menuColorDark = null; + protected static ColorUIResource toolbarForegroundColor = null; + protected static ColorUIResource toolbarBackgroundColor = null; + protected static ColorUIResource toolbarColorLight = null; + protected static ColorUIResource toolbarColorDark = null; + protected static ColorUIResource tabAreaBackgroundColor = null; + protected static ColorUIResource tabSelectionForegroundColor = null; + protected static ColorUIResource desktopColor = null; + protected static ColorUIResource tooltipForegroundColor = null; + protected static ColorUIResource tooltipBackgroundColor = null; + protected static int tooltipBorderSize = 6; + protected static int tooltipShadowSize = 6; + protected static boolean tooltipCastShadow = false; + + protected static Color DEFAULT_COLORS[] = null; + protected static Color HIDEFAULT_COLORS[] = null; + protected static Color ACTIVE_COLORS[] = null; + protected static Color INACTIVE_COLORS[] = null; + protected static Color ROLLOVER_COLORS[] = null; + protected static Color SELECTED_COLORS[] = null; + protected static Color SELECTION_COLORS[] = null; + protected static Color FOCUS_COLORS[] = null; + protected static Color MENU_SELECTION_COLORS[] = null; + protected static Color PRESSED_COLORS[] = null; + protected static Color DISABLED_COLORS[] = null; + protected static Color WINDOW_TITLE_COLORS[] = null; + protected static Color WINDOW_INACTIVE_TITLE_COLORS[] = null; + protected static Color TOOLBAR_COLORS[] = null; + protected static Color MENUBAR_COLORS[] = null; + protected static Color BUTTON_COLORS[] = null; + protected static Color CHECKBOX_COLORS[] = null; + protected static Color TAB_COLORS[] = null; + protected static Color COL_HEADER_COLORS[] = null; + protected static Color TRACK_COLORS[] = null; + protected static Color THUMB_COLORS[] = null; + protected static Color SLIDER_COLORS[] = null; + protected static Color PROGRESSBAR_COLORS[] = null; + + protected static String textureSet = "Default"; + protected static boolean darkTexture = true; + protected static Icon windowTexture = null; + protected static Icon backgroundTexture = null; + protected static Icon alterBackgroundTexture = null; + protected static Icon selectedTexture = null; + protected static Icon rolloverTexture = null; + protected static Icon pressedTexture = null; + protected static Icon disabledTexture = null; + protected static Icon menubarTexture = null; + + public AbstractTheme() { + super(); + } + + public String getName() { + return getInternalName(); + } + + public static String getInternalName() { + return internalName; + } + + public static void setInternalName(String name) { + internalName = name; + } + + public String getPropertyFileName() { + return "JTattooTheme.properties"; + } + + public void setUpColor() { + windowDecoration = true; + macStyleWindowDecoration = JTattooUtilities.isMac(); + centerWindowTitle = JTattooUtilities.isWindows() && JTattooUtilities.getOSVersion() >= 6.2; + linuxStyleScrollBar = !JTattooUtilities.isWindows(); + macStyleScrollBar = JTattooUtilities.isMac(); + dynamicLayout = true; + textShadow = false; + textAntiAliasing = false; + textAntiAliasingMode = TEXT_ANTIALIAS_HRGB; + backgroundPattern = true; + brightMode = false; + showFocusFrame = false; + drawSquareButtons = false; + toolbarDecorated = true; + menuOpaque = true; + menuAlpha = 0.9f; + logoString = "JTattoo"; + + controlFont = null; + systemFont = null; + userFont = null; + smallFont = null; + menuFont = null; + windowTitleFont = null; + + foregroundColor = black; + backgroundColor = extraLightGray; + backgroundColorLight = white; + backgroundColorDark = extraLightGray; + alterBackgroundColor = lightGray; + disabledForegroundColor = gray; + disabledBackgroundColor = superLightGray; + inputBackgroundColor = white; + inputForegroundColor = black; + selectionForegroundColor = black; + selectionBackgroundColor = lightGray; + selectionBackgroundColorLight = extraLightGray; + selectionBackgroundColorDark = lightGray; + focusColor = orange; + focusCellColor = orange; + focusFrameColor = new ColorUIResource(230, 191, 116); + focusBackgroundColor = new ColorUIResource(255, 250, 212); + focusForegroundColor = black; + frameColor = darkGray; + gridColor = gray; + shadowColor = new ColorUIResource(0, 24, 0); + + rolloverForegroundColor = black; + rolloverColor = extraLightGray; + rolloverColorLight = white; + rolloverColorDark = extraLightGray; + + pressedForegroundColor = black; + + buttonForegroundColor = black; + buttonBackgroundColor = lightGray; + buttonColorLight = white; + buttonColorDark = lightGray; + + controlForegroundColor = black; + controlBackgroundColor = lightGray; + controlHighlightColor = white; + controlShadowColor = lightGray; + controlDarkShadowColor = darkGray; + controlColorLight = white; + controlColorDark = lightGray; + + windowTitleForegroundColor = black; + windowTitleBackgroundColor = blue; + windowTitleColorLight = extraLightGray; + windowTitleColorDark = lightGray; + windowBorderColor = lightGray; + windowIconColor = black; + windowIconShadowColor = white; + windowIconRolloverColor = red; + + windowInactiveTitleForegroundColor = black; + windowInactiveTitleBackgroundColor = extraLightGray; + windowInactiveTitleColorLight = white; + windowInactiveTitleColorDark = extraLightGray; + windowInactiveBorderColor = extraLightGray; + + menuForegroundColor = black; + menuBackgroundColor = extraLightGray; + menuSelectionForegroundColor = black; + menuSelectionBackgroundColor = lightGray; + menuSelectionBackgroundColorLight = extraLightGray; + menuSelectionBackgroundColorDark = lightGray; + menuColorLight = extraLightGray; + menuColorDark = lightGray; + + toolbarForegroundColor = black; + toolbarBackgroundColor = lightGray; + toolbarColorLight = white; + toolbarColorDark = lightGray; + + tabAreaBackgroundColor = backgroundColor; + tabSelectionForegroundColor = selectionForegroundColor; + desktopColor = darkBlue; + tooltipForegroundColor = black; + tooltipBackgroundColor = yellow; + tooltipBorderSize = 6; + tooltipShadowSize = 6; + tooltipCastShadow = false; + + textureSet = "Default"; + darkTexture = true; + } + + public void setUpColorArrs() { + DEFAULT_COLORS = ColorHelper.createColorArr(controlColorLight, controlColorDark, 20); + HIDEFAULT_COLORS = ColorHelper.createColorArr(ColorHelper.brighter(controlColorLight, 40), ColorHelper.brighter(controlColorDark, 40), 20); + ACTIVE_COLORS = DEFAULT_COLORS; + INACTIVE_COLORS = HIDEFAULT_COLORS; + ROLLOVER_COLORS = ColorHelper.createColorArr(rolloverColorLight, rolloverColorDark, 20); + SELECTED_COLORS = DEFAULT_COLORS; + SELECTION_COLORS = ColorHelper.createColorArr(selectionBackgroundColorLight, selectionBackgroundColorDark, 20); + FOCUS_COLORS = ColorHelper.createColorArr(ColorHelper.brighter(focusBackgroundColor, 20), ColorHelper.darker(focusBackgroundColor, 10), 20); + MENU_SELECTION_COLORS = ColorHelper.createColorArr(menuSelectionBackgroundColorLight, menuSelectionBackgroundColorDark, 20); + PRESSED_COLORS = DEFAULT_COLORS; + DISABLED_COLORS = HIDEFAULT_COLORS; + WINDOW_TITLE_COLORS = ColorHelper.createColorArr(windowTitleColorLight, windowTitleColorDark, 20); + WINDOW_INACTIVE_TITLE_COLORS = ColorHelper.createColorArr(windowInactiveTitleColorLight, windowInactiveTitleColorDark, 20); + TOOLBAR_COLORS = ColorHelper.createColorArr(toolbarColorLight, toolbarColorDark, 20); + MENUBAR_COLORS = ColorHelper.createColorArr(menuColorLight, menuColorDark, 20); + BUTTON_COLORS = ColorHelper.createColorArr(buttonColorLight, buttonColorDark, 20); + CHECKBOX_COLORS = DEFAULT_COLORS; + TAB_COLORS = DEFAULT_COLORS; + COL_HEADER_COLORS = DEFAULT_COLORS; + TRACK_COLORS = ColorHelper.createColorArr(new Color(220, 220, 220), Color.white, 20); + THUMB_COLORS = DEFAULT_COLORS; + SLIDER_COLORS = DEFAULT_COLORS; + PROGRESSBAR_COLORS = DEFAULT_COLORS; + } + + public void setProperties(Properties props) { + if (props != null) { + if (props.getProperty("windowDecoration") != null) { + windowDecoration = props.getProperty("windowDecoration").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("macStyleWindowDecoration") != null) { + macStyleWindowDecoration = props.getProperty("macStyleWindowDecoration").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("centerWindowTitle") != null) { + centerWindowTitle = props.getProperty("centerWindowTitle").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("linuxStyleScrollBar") != null) { + linuxStyleScrollBar = props.getProperty("linuxStyleScrollBar").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("macStyleScrollBar") != null) { + macStyleScrollBar = props.getProperty("macStyleScrollBar").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("dynamicLayout") != null) { + dynamicLayout = props.getProperty("dynamicLayout").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("textShadow") != null) { + textShadow = props.getProperty("textShadow").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("textAntiAliasing") != null) { + textAntiAliasing = props.getProperty("textAntiAliasing").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("textAntiAliasingMode") != null) { + String mode = props.getProperty("textAntiAliasingMode"); + if (mode.equalsIgnoreCase("default")) { + textAntiAliasingMode = TEXT_ANTIALIAS_DEFAULT; + } + if (mode.equalsIgnoreCase("gray")) { + textAntiAliasingMode = TEXT_ANTIALIAS_GRAY; + } + if (mode.equalsIgnoreCase("hrgb")) { + textAntiAliasingMode = TEXT_ANTIALIAS_HRGB; + } + if (mode.equalsIgnoreCase("hbgr")) { + textAntiAliasingMode = TEXT_ANTIALIAS_HBGR; + } + if (mode.equalsIgnoreCase("vrgb")) { + textAntiAliasingMode = TEXT_ANTIALIAS_VRGB; + } + if (mode.equalsIgnoreCase("vbgr")) { + textAntiAliasingMode = TEXT_ANTIALIAS_VBGR; + } + } + if (props.getProperty("backgroundPattern") != null) { + backgroundPattern = props.getProperty("backgroundPattern").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("brightMode") != null) { + brightMode = props.getProperty("brightMode").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("showFocusFrame") != null) { + showFocusFrame = props.getProperty("showFocusFrame").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("drawSquareButtons") != null) { + drawSquareButtons = props.getProperty("drawSquareButtons").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("toolbarDecorated") != null) { + toolbarDecorated = props.getProperty("toolbarDecorated").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("menuOpaque") != null) { + menuOpaque = props.getProperty("menuOpaque").trim().equalsIgnoreCase("on"); + } + if (props.getProperty("logoString") != null) { + logoString = props.getProperty("logoString").trim(); + } + if (props.getProperty("controlTextFont") != null) { + controlFont = createFont(props.getProperty("controlTextFont")); + } + if (props.getProperty("systemTextFont") != null) { + systemFont = createFont(props.getProperty("systemTextFont")); + } + if (props.getProperty("userTextFont") != null) { + userFont = createFont(props.getProperty("userTextFont")); + } + if (props.getProperty("menuTextFont") != null) { + menuFont = createFont(props.getProperty("menuTextFont")); + } + if (props.getProperty("windowTitleFont") != null) { + windowTitleFont = createFont(props.getProperty("windowTitleFont")); + } + if (props.getProperty("subTextFont") != null) { + smallFont = createFont(props.getProperty("subTextFont")); + } + + if (props.getProperty("foregroundColor") != null) { + foregroundColor = createColor(props.getProperty("foregroundColor"), foregroundColor); + } + if (props.getProperty("backgroundColor") != null) { + backgroundColor = createColor(props.getProperty("backgroundColor"), backgroundColor); + } + if (props.getProperty("backgroundColorLight") != null) { + backgroundColorLight = createColor(props.getProperty("backgroundColorLight"), backgroundColorLight); + } + if (props.getProperty("backgroundColorDark") != null) { + backgroundColorDark = createColor(props.getProperty("backgroundColorDark"), backgroundColorDark); + } + if (props.getProperty("alterBackgroundColor") != null) { + alterBackgroundColor = createColor(props.getProperty("alterBackgroundColor"), alterBackgroundColor); + } + if (props.getProperty("disabledForegroundColor") != null) { + disabledForegroundColor = createColor(props.getProperty("disabledForegroundColor"), disabledForegroundColor); + } + if (props.getProperty("disabledBackgroundColor") != null) { + disabledBackgroundColor = createColor(props.getProperty("disabledBackgroundColor"), disabledBackgroundColor); + } + if (props.getProperty("inputForegroundColor") != null) { + inputForegroundColor = createColor(props.getProperty("inputForegroundColor"), inputForegroundColor); + } + if (props.getProperty("inputBackgroundColor") != null) { + inputBackgroundColor = createColor(props.getProperty("inputBackgroundColor"), inputBackgroundColor); + } + if (props.getProperty("selectionForegroundColor") != null) { + selectionForegroundColor = createColor(props.getProperty("selectionForegroundColor"), selectionForegroundColor); + } + if (props.getProperty("selectionBackgroundColor") != null) { + selectionBackgroundColor = createColor(props.getProperty("selectionBackgroundColor"), selectionBackgroundColor); + } + if (props.getProperty("selectionBackgroundColorLight") != null) { + selectionBackgroundColorLight = createColor(props.getProperty("selectionBackgroundColorLight"), selectionBackgroundColorLight); + } + if (props.getProperty("selectionBackgroundColorDark") != null) { + selectionBackgroundColorDark = createColor(props.getProperty("selectionBackgroundColorDark"), selectionBackgroundColorDark); + } + if (props.getProperty("frameColor") != null) { + frameColor = createColor(props.getProperty("frameColor"), frameColor); + } + if (props.getProperty("gridColor") != null) { + gridColor = createColor(props.getProperty("gridColor"), gridColor); + } + if (props.getProperty("shadowColor") != null) { + shadowColor = createColor(props.getProperty("shadowColor"), shadowColor); + } + if (props.getProperty("focusColor") != null) { + focusColor = createColor(props.getProperty("focusColor"), focusColor); + } + if (props.getProperty("focusCellColor") != null) { + focusCellColor = createColor(props.getProperty("focusCellColor"), focusCellColor); + } + if (props.getProperty("focusFrameColor") != null) { + focusFrameColor = createColor(props.getProperty("focusFrameColor"), focusFrameColor); + } + if (props.getProperty("focusBackgroundColor") != null) { + focusBackgroundColor = createColor(props.getProperty("focusBackgroundColor"), focusBackgroundColor); + } + if (props.getProperty("focusForegroundColor") != null) { + focusForegroundColor = createColor(props.getProperty("focusForegroundColor"), focusForegroundColor); + } + + if (props.getProperty("rolloverForegroundColor") != null) { + rolloverForegroundColor = createColor(props.getProperty("rolloverForegroundColor"), rolloverForegroundColor); + } + if (props.getProperty("rolloverColor") != null) { + rolloverColor = createColor(props.getProperty("rolloverColor"), rolloverColor); + } + if (props.getProperty("rolloverColorLight") != null) { + rolloverColorLight = createColor(props.getProperty("rolloverColorLight"), rolloverColorLight); + } + if (props.getProperty("rolloverColorDark") != null) { + rolloverColorDark = createColor(props.getProperty("rolloverColorDark"), rolloverColorDark); + } + if (props.getProperty("pressedForegroundColor") != null) { + pressedForegroundColor = createColor(props.getProperty("pressedForegroundColor"), pressedForegroundColor); + } + + if (props.getProperty("buttonForegroundColor") != null) { + buttonForegroundColor = createColor(props.getProperty("buttonForegroundColor"), buttonForegroundColor); + } + if (props.getProperty("buttonBackgroundColor") != null) { + buttonBackgroundColor = createColor(props.getProperty("buttonBackgroundColor"), buttonBackgroundColor); + } + if (props.getProperty("buttonColorLight") != null) { + buttonColorLight = createColor(props.getProperty("buttonColorLight"), buttonColorLight); + } + if (props.getProperty("buttonColorDark") != null) { + buttonColorDark = createColor(props.getProperty("buttonColorDark"), buttonColorDark); + } + + if (props.getProperty("controlForegroundColor") != null) { + controlForegroundColor = createColor(props.getProperty("controlForegroundColor"), controlForegroundColor); + } + if (props.getProperty("controlBackgroundColor") != null) { + controlBackgroundColor = createColor(props.getProperty("controlBackgroundColor"), controlBackgroundColor); + } + if (props.getProperty("controlColorLight") != null) { + controlColorLight = createColor(props.getProperty("controlColorLight"), controlColorLight); + } + if (props.getProperty("controlColorDark") != null) { + controlColorDark = createColor(props.getProperty("controlColorDark"), controlColorDark); + } + if (props.getProperty("controlHighlightColor") != null) { + controlHighlightColor = createColor(props.getProperty("controlHighlightColor"), controlHighlightColor); + } + if (props.getProperty("controlShadowColor") != null) { + controlShadowColor = createColor(props.getProperty("controlShadowColor"), controlShadowColor); + } + if (props.getProperty("controlDarkShadowColor") != null) { + controlDarkShadowColor = createColor(props.getProperty("controlDarkShadowColor"), controlDarkShadowColor); + } + + if (props.getProperty("windowTitleForegroundColor") != null) { + windowTitleForegroundColor = createColor(props.getProperty("windowTitleForegroundColor"), windowTitleForegroundColor); + } + if (props.getProperty("windowTitleBackgroundColor") != null) { + windowTitleBackgroundColor = createColor(props.getProperty("windowTitleBackgroundColor"), windowTitleBackgroundColor); + } + if (props.getProperty("windowTitleColorLight") != null) { + windowTitleColorLight = createColor(props.getProperty("windowTitleColorLight"), windowTitleColorLight); + } + if (props.getProperty("windowTitleColorDark") != null) { + windowTitleColorDark = createColor(props.getProperty("windowTitleColorDark"), windowTitleColorDark); + } + if (props.getProperty("windowBorderColor") != null) { + windowBorderColor = createColor(props.getProperty("windowBorderColor"), windowBorderColor); + } + if (props.getProperty("windowIconColor") != null) { + windowIconColor = createColor(props.getProperty("windowIconColor"), windowIconColor); + } + if (props.getProperty("windowIconShadowColor") != null) { + windowIconShadowColor = createColor(props.getProperty("windowIconShadowColor"), windowIconShadowColor); + } + if (props.getProperty("windowIconRolloverColor") != null) { + windowIconRolloverColor = createColor(props.getProperty("windowIconRolloverColor"), windowIconRolloverColor); + } + + if (props.getProperty("windowInactiveTitleForegroundColor") != null) { + windowInactiveTitleForegroundColor = createColor(props.getProperty("windowInactiveTitleForegroundColor"), windowInactiveTitleForegroundColor); + } + if (props.getProperty("windowTitleBackgroundColor") != null) { + windowInactiveTitleBackgroundColor = createColor(props.getProperty("windowInactiveTitleBackgroundColor"), windowInactiveTitleBackgroundColor); + } + if (props.getProperty("windowInactiveTitleColorLight") != null) { + windowInactiveTitleColorLight = createColor(props.getProperty("windowInactiveTitleColorLight"), windowInactiveTitleColorLight); + } + if (props.getProperty("windowInactiveTitleColorDark") != null) { + windowInactiveTitleColorDark = createColor(props.getProperty("windowInactiveTitleColorDark"), windowInactiveTitleColorDark); + } + if (props.getProperty("windowInactiveBorderColor") != null) { + windowInactiveBorderColor = createColor(props.getProperty("windowInactiveBorderColor"), windowInactiveBorderColor); + } + + if (props.getProperty("menuForegroundColor") != null) { + menuForegroundColor = createColor(props.getProperty("menuForegroundColor"), menuForegroundColor); + } + if (props.getProperty("menuBackgroundColor") != null) { + menuBackgroundColor = createColor(props.getProperty("menuBackgroundColor"), menuBackgroundColor); + } + if (props.getProperty("menuSelectionForegroundColor") != null) { + menuSelectionForegroundColor = createColor(props.getProperty("menuSelectionForegroundColor"), menuSelectionForegroundColor); + } + if (props.getProperty("menuSelectionBackgroundColor") != null) { + menuSelectionBackgroundColor = createColor(props.getProperty("menuSelectionBackgroundColor"), menuSelectionBackgroundColor); + } + if (props.getProperty("menuSelectionBackgroundColorLight") != null) { + menuSelectionBackgroundColorLight = createColor(props.getProperty("menuSelectionBackgroundColorLight"), menuSelectionBackgroundColorLight); + } + if (props.getProperty("menuSelectionBackgroundColorDark") != null) { + menuSelectionBackgroundColorDark = createColor(props.getProperty("menuSelectionBackgroundColorDark"), menuSelectionBackgroundColorDark); + } + if (props.getProperty("menuColorLight") != null) { + menuColorLight = createColor(props.getProperty("menuColorLight"), menuColorLight); + } + if (props.getProperty("menuColorDark") != null) { + menuColorDark = createColor(props.getProperty("menuColorDark"), menuColorDark); + } + + if (props.getProperty("toolbarForegroundColor") != null) { + toolbarForegroundColor = createColor(props.getProperty("toolbarForegroundColor"), toolbarForegroundColor); + } + if (props.getProperty("toolbarBackgroundColor") != null) { + toolbarBackgroundColor = createColor(props.getProperty("toolbarBackgroundColor"), toolbarBackgroundColor); + } + if (props.getProperty("toolbarColorLight") != null) { + toolbarColorLight = createColor(props.getProperty("toolbarColorLight"), toolbarColorLight); + } + if (props.getProperty("toolbarColorDark") != null) { + toolbarColorDark = createColor(props.getProperty("toolbarColorDark"), toolbarColorDark); + } + + if (props.getProperty("tabAreaBackgroundColor") != null) { + tabAreaBackgroundColor = createColor(props.getProperty("tabAreaBackgroundColor"), tabAreaBackgroundColor); + } else { + tabAreaBackgroundColor = backgroundColor; + } + if (props.getProperty("tabSelectionForegroundColor") != null) { + tabSelectionForegroundColor = createColor(props.getProperty("tabSelectionForegroundColor"), tabSelectionForegroundColor); + } + + if (props.getProperty("desktopColor") != null) { + desktopColor = createColor(props.getProperty("desktopColor"), desktopColor); + } + if (props.getProperty("tooltipForegroundColor") != null) { + tooltipForegroundColor = createColor(props.getProperty("tooltipForegroundColor"), tooltipForegroundColor); + } + if (props.getProperty("tooltipBackgroundColor") != null) { + tooltipBackgroundColor = createColor(props.getProperty("tooltipBackgroundColor"), tooltipBackgroundColor); + } + if (props.getProperty("tooltipBorderSize") != null) { + tooltipBorderSize = createInt(props.getProperty("tooltipBorderSize"), tooltipBorderSize); + } + if (props.getProperty("tooltipShadowSize") != null) { + tooltipShadowSize = createInt(props.getProperty("tooltipShadowSize"), tooltipShadowSize); + } + if (props.getProperty("tooltipCastShadow") != null) { + tooltipCastShadow = props.getProperty("tooltipCastShadow").trim().equalsIgnoreCase("on"); + } + + if (props.getProperty("textureSet") != null) { + textureSet = props.getProperty("textureSet"); + } + if (props.getProperty("darkTexture") != null) { + darkTexture = props.getProperty("darkTexture").trim().equalsIgnoreCase("on"); + } + if (props.get("windowTexture") != null) { + Object texture = props.get("windowTexture"); + if (texture instanceof Icon) { + windowTexture = (Icon)texture; + } + } + if (props.get("backgroundTexture") != null) { + Object texture = props.get("backgroundTexture"); + if (texture instanceof Icon) { + backgroundTexture = (Icon)texture; + } + } + if (props.get("alterBackgroundTexture") != null) { + Object texture = props.get("alterBackgroundTexture"); + if (texture instanceof Icon) { + alterBackgroundTexture = (Icon)texture; + } + } + if (props.get("selectedTexture") != null) { + Object texture = props.get("selectedTexture"); + if (texture instanceof Icon) { + selectedTexture = (Icon)texture; + } + } + if (props.get("rolloverTexture") != null) { + Object texture = props.get("rolloverTexture"); + if (texture instanceof Icon) { + rolloverTexture = (Icon)texture; + } + } + if (props.get("pressedTexture") != null) { + Object texture = props.get("pressedTexture"); + if (texture instanceof Icon) { + pressedTexture = (Icon)texture; + } + } + if (props.get("disabledTexture") != null) { + Object texture = props.get("disabledTexture"); + if (texture instanceof Icon) { + disabledTexture = (Icon)texture; + } + } + if (props.get("menubarTexture") != null) { + Object texture = props.get("menubarTexture"); + if (texture instanceof Icon) { + menubarTexture = (Icon)texture; + } + } + } + } + + public void loadProperties() { + FileInputStream in = null; + try { + String fileName = System.getProperty("user.home") + "/.jtattoo/" + getPropertyFileName(); + Properties props = new Properties(); + in = new FileInputStream(fileName); + props.load(in); + setProperties(props); + } catch (Exception ex) { + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception ex) { + } + } + } + + protected static FontUIResource createFont(String fontProp) { + if ((fontProp != null) && (fontProp.trim().length() > 5)) { + return new FontUIResource(Font.decode(fontProp)); + } + return null; + } + + protected static ColorUIResource createColor(String colorProp, ColorUIResource color) { + if ((colorProp != null) && (colorProp.trim().length() >= 5)) { + colorProp = colorProp.trim(); + int r = color.getRed(); + int g = color.getGreen(); + int b = color.getBlue(); + try { + int p1 = 0; + int p2 = colorProp.indexOf(' '); + if (p2 > 0) { + r = Integer.parseInt(colorProp.substring(p1, p2)); + } + p1 = p2 + 1; + p2 = colorProp.indexOf(' ', p1); + if (p2 > 0) { + g = Integer.parseInt(colorProp.substring(p1, p2)); + } + b = Integer.parseInt(colorProp.substring(p2 + 1)); + return new ColorUIResource(r, g, b); + } catch (Exception ex) { + System.out.println("Exception while parsing color: " + colorProp); + } + } + return color; + } + + protected static int createInt(String intProp, int defaultValue) { + int val = defaultValue; + try { + val = Integer.parseInt(intProp); + } catch (Exception ex) { + System.out.println("Exception while parsing color: " + intProp); + } + return val; + } + + public boolean isTinyFontSize() { + return userFont.getSize() < 12; + } + + public boolean isSmallFontSize() { + return userFont.getSize() < 14; + } + + public boolean isMediumFontSize() { + return userFont.getSize() >= 14 && userFont.getSize() < 16; + } + + public boolean isLargeFontSize() { + return userFont.getSize() >= 16; + } + + public FontUIResource getControlTextFont() { + if (controlFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + controlFont = new FontUIResource(DIALOG, Font.BOLD, 14); + } else { + controlFont = new FontUIResource(DIALOG, Font.PLAIN, 12); + } + } + return controlFont; + } + + public FontUIResource getSystemTextFont() { + if (systemFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + systemFont = new FontUIResource(DIALOG, Font.BOLD, 14); + } else { + systemFont = new FontUIResource(DIALOG, Font.PLAIN, 12); + } + } + return systemFont; + } + + public FontUIResource getUserTextFont() { + if (userFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + userFont = new FontUIResource(DIALOG, Font.BOLD, 14); + } else { + userFont = new FontUIResource(DIALOG, Font.PLAIN, 12); + } + } + return userFont; + } + + public FontUIResource getMenuTextFont() { + if (menuFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + menuFont = new FontUIResource(DIALOG, Font.BOLD, 14); + } else { + menuFont = new FontUIResource(DIALOG, Font.PLAIN, 12); + } + } + return menuFont; + } + + public FontUIResource getWindowTitleFont() { + if (windowTitleFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + windowTitleFont = new FontUIResource(DIALOG, Font.BOLD, 14); + } else { + windowTitleFont = new FontUIResource(DIALOG, Font.BOLD, 12); + } + } + return windowTitleFont; + } + + public FontUIResource getSubTextFont() { + if (smallFont == null) { + if (JTattooUtilities.isLinux() && JTattooUtilities.isHiresScreen()) { + smallFont = new FontUIResource(DIALOG, Font.BOLD, 12); + } else { + smallFont = new FontUIResource(DIALOG, Font.PLAIN, 10); + } + } + return smallFont; + } + + //----------------------------------------------------------------------------------- + protected ColorUIResource getPrimary1() { + return foregroundColor; + } + + protected ColorUIResource getPrimary2() { + return desktopColor; + } + + protected ColorUIResource getPrimary3() { + return selectionBackgroundColor; + } + + protected ColorUIResource getSecondary1() { + return frameColor; + } + + protected ColorUIResource getSecondary2() { + return controlBackgroundColor; + } + + protected ColorUIResource getSecondary3() { + return backgroundColor; + } + + public ColorUIResource getControl() { + return controlBackgroundColor; + } + + public ColorUIResource getControlShadow() { + return controlShadowColor; + } + + public ColorUIResource getControlDarkShadow() { + return controlDarkShadowColor; + } + + public ColorUIResource getControlInfo() { + return controlForegroundColor; + } + + public ColorUIResource getControlHighlight() { + return controlHighlightColor; + } + + public ColorUIResource getControlDisabled() { + return controlShadowColor; + } + + public ColorUIResource getPrimaryControl() { + return extraLightGray; + } + + public ColorUIResource getPrimaryControlShadow() { + return lightGray; + } + + public ColorUIResource getPrimaryControlDarkShadow() { + return gray; + } + + public ColorUIResource getPrimaryControlInfo() { + return darkGray; + } + + public ColorUIResource getPrimaryControlHighlight() { + return white; + } + + public ColorUIResource getControlTextColor() { + return controlForegroundColor; + } + + public ColorUIResource getSystemTextColor() { + return foregroundColor; + } + + public String getLogoString() { + if (logoString != null) { + if (logoString.trim().length() == 0) { + return null; + } + } + return logoString; + } + + public boolean isWindowDecorationOn() { + return windowDecoration; + } + + public boolean isCenterWindowTitleOn() { + return centerWindowTitle; + } + + public boolean isMacStyleWindowDecorationOn() { + return macStyleWindowDecoration; + } + + public boolean isLinuxStyleScrollBarOn() { + return linuxStyleScrollBar; + } + + public boolean isMacStyleScrollBarOn() { + return macStyleScrollBar; + } + + public boolean isDynamicLayout() { + return dynamicLayout; + } + + public boolean isTextShadowOn() { + return textShadow; + } + + public boolean isTextAntiAliasingOn() { + if (JTattooUtilities.getJavaVersion() < 1.4) { + return false; + } + return textAntiAliasing; + } + + public int getTextAntiAliasingMode() { + return textAntiAliasingMode; + } + + public Object getTextAntiAliasingHint() { + if (isTextAntiAliasingOn()) { + if (JTattooUtilities.getJavaVersion() >= 1.6) { + switch (textAntiAliasingMode) { + case TEXT_ANTIALIAS_DEFAULT: + return RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT; + case TEXT_ANTIALIAS_HRGB: + return RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB; + case TEXT_ANTIALIAS_HBGR: + return RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR; + case TEXT_ANTIALIAS_VRGB: + return RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB; + case TEXT_ANTIALIAS_VBGR: + return RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR; + default: + return RenderingHints.VALUE_TEXT_ANTIALIAS_ON; + } + } + return RenderingHints.VALUE_TEXT_ANTIALIAS_ON; + } + return RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; + } + + public boolean isBackgroundPatternOn() { + return backgroundPattern; + } + + public boolean isBrightMode() { + return brightMode; + } + + public boolean doShowFocusFrame() { + return showFocusFrame; + } + + public boolean doDrawSquareButtons() { + return drawSquareButtons; + } + + public boolean isToolbarDecorated() { + return toolbarDecorated; + } + + public boolean isMenuOpaque() { + return menuOpaque; + } + + public float getMenuAlpha() { + return menuAlpha; + } + + public ColorUIResource getForegroundColor() { + return foregroundColor; + } + + public ColorUIResource getDisabledForegroundColor() { + return disabledForegroundColor; + } + + public ColorUIResource getBackgroundColor() { + return backgroundColor; + } + + public ColorUIResource getDisabledBackgroundColor() { + return disabledBackgroundColor; + } + + public ColorUIResource getBackgroundColorLight() { + return backgroundColorLight; + } + + public ColorUIResource getBackgroundColorDark() { + return backgroundColorDark; + } + + public ColorUIResource getAlterBackgroundColor() { + return alterBackgroundColor; + } + + public ColorUIResource getInputForegroundColor() { + return inputForegroundColor; + } + + public ColorUIResource getInputBackgroundColor() { + return inputBackgroundColor; + } + + public ColorUIResource getSelectionForegroundColor() { + return selectionForegroundColor; + } + + public ColorUIResource getSelectionBackgroundColorLight() { + return selectionBackgroundColorLight; + } + + public ColorUIResource getSelectionBackgroundColorDark() { + return selectionBackgroundColorDark; + } + + public ColorUIResource getSelectionBackgroundColor() { + return selectionBackgroundColor; + } + + public ColorUIResource getFrameColor() { + return frameColor; + } + + public ColorUIResource getGridColor() { + return gridColor; + } + + public ColorUIResource getShadowColor() { + return shadowColor; + } + + public ColorUIResource getFocusColor() { + return focusColor; + } + + public ColorUIResource getFocusCellColor() { + return focusCellColor; + } + + public ColorUIResource getFocusFrameColor() { + return focusFrameColor; + } + + public ColorUIResource getFocusBackgroundColor() { + return focusBackgroundColor; + } + + public ColorUIResource getFocusForegroundColor() { + return focusForegroundColor; + } + + public ColorUIResource getRolloverForegroundColor() { + return rolloverForegroundColor; + } + + public ColorUIResource getRolloverColor() { + return rolloverColor; + } + + public ColorUIResource getRolloverColorLight() { + return rolloverColorLight; + } + + public ColorUIResource getRolloverColorDark() { + return rolloverColorDark; + } + + public ColorUIResource getPressedForegroundColor() { + return pressedForegroundColor; + } + + public ColorUIResource getButtonForegroundColor() { + return buttonForegroundColor; + } + + public ColorUIResource getButtonBackgroundColor() { + return buttonBackgroundColor; + } + + public ColorUIResource getButtonColorLight() { + return buttonColorLight; + } + + public ColorUIResource getButtonColorDark() { + return buttonColorDark; + } + + public ColorUIResource getControlForegroundColor() { + return controlForegroundColor; + } + + public ColorUIResource getControlBackgroundColor() { + return controlBackgroundColor; + } + + public ColorUIResource getControlHighlightColor() { + return controlHighlightColor; + } + + public ColorUIResource getControlShadowColor() { + return controlShadowColor; + } + + public ColorUIResource getControlDarkShadowColor() { + return controlDarkShadowColor; + } + + public ColorUIResource getControlColorLight() { + return controlColorLight; + } + + public ColorUIResource getControlColorDark() { + return controlColorDark; + } + + public ColorUIResource getWindowTitleForegroundColor() { + return windowTitleForegroundColor; + } + + public ColorUIResource getWindowTitleBackgroundColor() { + return windowTitleBackgroundColor; + } + + public ColorUIResource getWindowTitleColorLight() { + return windowTitleColorLight; + } + + public ColorUIResource getWindowTitleColorDark() { + return windowTitleColorDark; + } + + public ColorUIResource getWindowBorderColor() { + return windowBorderColor; + } + + public ColorUIResource getWindowIconColor() { + return windowIconColor; + } + + public ColorUIResource getWindowIconShadowColor() { + return windowIconShadowColor; + } + + public ColorUIResource getWindowIconRolloverColor() { + return windowIconRolloverColor; + } + + public ColorUIResource getWindowInactiveTitleForegroundColor() { + return windowInactiveTitleForegroundColor; + } + + public ColorUIResource getWindowInactiveTitleBackgroundColor() { + return windowInactiveTitleBackgroundColor; + } + + public ColorUIResource getWindowInactiveTitleColorLight() { + return windowInactiveTitleColorLight; + } + + public ColorUIResource getWindowInactiveTitleColorDark() { + return windowInactiveTitleColorDark; + } + + public ColorUIResource getWindowInactiveBorderColor() { + return windowInactiveBorderColor; + } + + public ColorUIResource getMenuForegroundColor() { + return menuForegroundColor; + } + + public ColorUIResource getMenuBackgroundColor() { + return menuBackgroundColor; + } + + public ColorUIResource getMenuSelectionForegroundColor() { + return menuSelectionForegroundColor; + } + + public ColorUIResource getMenuSelectionBackgroundColor() { + return menuSelectionBackgroundColor; + } + + public ColorUIResource getMenuSelectionBackgroundColorLight() { + return menuSelectionBackgroundColorLight; + } + + public ColorUIResource getMenuSelectionBackgroundColorDark() { + return menuSelectionBackgroundColorDark; + } + + public ColorUIResource getMenuColorLight() { + return menuColorLight; + } + + public ColorUIResource getMenuColorDark() { + return menuColorDark; + } + + public ColorUIResource getToolbarForegroundColor() { + return toolbarForegroundColor; + } + + public ColorUIResource getToolbarBackgroundColor() { + return toolbarBackgroundColor; + } + + public ColorUIResource getToolbarColorLight() { + return toolbarColorLight; + } + + public ColorUIResource getToolbarColorDark() { + return toolbarColorDark; + } + + public ColorUIResource getTabAreaBackgroundColor() { + return tabAreaBackgroundColor; + } + + public ColorUIResource getTabSelectionForegroundColor() { + return tabSelectionForegroundColor; + } + + public ColorUIResource getDesktopColor() { + return desktopColor; + } + + public ColorUIResource getTooltipForegroundColor() { + return tooltipForegroundColor; + } + + public ColorUIResource getTooltipBackgroundColor() { + return tooltipBackgroundColor; + } + + public int getTooltipBorderSize() { + return Math.max(0, Math.min(8, tooltipBorderSize)); + } + + public int getTooltipShadowSize() { + return Math.max(0, Math.min(8, tooltipShadowSize)); + } + + public boolean isTooltipCastShadow() { + return tooltipCastShadow; + } + + public Color[] getDefaultColors() { + return DEFAULT_COLORS; + } + + public Color[] getHiDefaultColors() { + return HIDEFAULT_COLORS; + } + + public Color[] getActiveColors() { + return ACTIVE_COLORS; + } + + public Color[] getInActiveColors() { + return INACTIVE_COLORS; + } + + public Color[] getRolloverColors() { + return ROLLOVER_COLORS; + } + + public Color[] getSelectedColors() { + return SELECTED_COLORS; + } + + public Color[] getSelectionColors() { + return SELECTION_COLORS; + } + + public Color[] getFocusColors() { + return FOCUS_COLORS; + } + + public Color[] getMenuSelectionColors() { + return MENU_SELECTION_COLORS; + } + + public Color[] getPressedColors() { + return PRESSED_COLORS; + } + + public Color[] getDisabledColors() { + return DISABLED_COLORS; + } + + public Color[] getWindowTitleColors() { + return WINDOW_TITLE_COLORS; + } + + public Color[] getWindowInactiveTitleColors() { + return WINDOW_INACTIVE_TITLE_COLORS; + } + + public Color[] getToolBarColors() { + return TOOLBAR_COLORS; + } + + public Color[] getMenuBarColors() { + return MENUBAR_COLORS; + } + + public Color[] getButtonColors() { + return BUTTON_COLORS; + } + + public Color[] getCheckBoxColors() { + return CHECKBOX_COLORS; + } + + public Color[] getTabColors() { + return TAB_COLORS; + } + + public Color[] getColHeaderColors() { + return COL_HEADER_COLORS; + } + + public Color[] getTrackColors() { + return TRACK_COLORS; + } + + public Color[] getThumbColors() { + return THUMB_COLORS; + } + + public Color[] getSliderColors() { + return SLIDER_COLORS; + } + + public Color[] getProgressBarColors() { + return PROGRESSBAR_COLORS; + } + + public String getTextureSet() { + return textureSet; + } + + public boolean isDarkTexture() { + return darkTexture; + } + + public Icon getWindowTexture() { + return windowTexture; + } + + public Icon getBackgroundTexture() { + return backgroundTexture; + } + + public Icon getAlterBackgroundTexture() { + return alterBackgroundTexture; + } + + public Icon getSelectedTexture() { + return selectedTexture; + } + + public Icon getRolloverTexture() { + return rolloverTexture; + } + + public Icon getPressedTexture() { + return pressedTexture; + } + + public Icon getDisabledTexture() { + return disabledTexture; + } + + public Icon getMenubarTexture() { + return menubarTexture; + } +} diff --git a/src/com/jtattoo/plaf/AbstractToolBarUI.java b/src/com/jtattoo/plaf/AbstractToolBarUI.java new file mode 100644 index 0000000..7dc8f07 --- /dev/null +++ b/src/com/jtattoo/plaf/AbstractToolBarUI.java @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.ContainerEvent; +import java.awt.event.ContainerListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Hashtable; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicToolBarUI; + +public abstract class AbstractToolBarUI extends BasicToolBarUI { + + private final static String IS_ROLLOVER = "JToolBar.isRollover"; + private final static Insets BUTTON_MARGIN = new Insets(1, 1, 1, 1); + private final static Border INNER_BORDER = BorderFactory.createEmptyBorder(2, 2, 2, 2); + private boolean rolloverEnabled = true; + private MyPropertyChangeListener propertyChangeListener = null; + private MyContainerListener containerListener = null; + private final Hashtable orgBorders = new Hashtable(); + private final Hashtable orgMargins = new Hashtable(); + + public abstract Border getRolloverBorder(); + + public abstract Border getNonRolloverBorder(); + + public abstract boolean isButtonOpaque(); + + public void installUI(JComponent c) { + super.installUI(c); + Boolean isRollover = (Boolean) UIManager.get(IS_ROLLOVER); + if (isRollover != null) { + rolloverEnabled = isRollover.booleanValue(); + } + SwingUtilities.invokeLater(new Runnable() { + public void run() { + changeBorders(); + } + }); + } + + public void uninstallUI(JComponent c) { + restoreBorders(); + super.uninstallUI(c); + } + + protected void installListeners() { + super.installListeners(); + propertyChangeListener = new MyPropertyChangeListener(); + if (propertyChangeListener != null) { + toolBar.addPropertyChangeListener(propertyChangeListener); + } + containerListener = new MyContainerListener(); + if (containerListener != null) { + toolBar.addContainerListener(containerListener); + } + } + + protected void uninstallListeners() { + if (propertyChangeListener != null) { + toolBar.removePropertyChangeListener(propertyChangeListener); + } + propertyChangeListener = null; + if (containerListener != null) { + toolBar.removeContainerListener(containerListener); + } + containerListener = null; + super.uninstallListeners(); + } + + protected boolean isRolloverEnabled() { + return rolloverEnabled; + } + + protected void setBorderToNormal(Component c) { + } + + protected void setBorderToRollover(Component c) { + } + + protected void setBorderToNonRollover(Component c) { + } + + protected void changeBorders() { + Component[] components = toolBar.getComponents(); + for (int i = 0; i < components.length; ++i) { + Component comp = components[i]; + if (comp instanceof AbstractButton) { + changeButtonBorder((AbstractButton) comp); + } + } + } + + protected void restoreBorders() { + Component[] components = toolBar.getComponents(); + for (int i = 0; i < components.length; ++i) { + Component comp = components[i]; + if (comp instanceof AbstractButton) { + restoreButtonBorder((AbstractButton) comp); + } + } + } + + protected void changeButtonBorder(AbstractButton b) { + Object cp = b.getClientProperty("paintToolBarBorder"); + if ((cp != null) && (cp instanceof Boolean)) { + Boolean changeBorder = (Boolean)cp; + if (!changeBorder.booleanValue()) { + return; + } + } + if (!orgBorders.contains(b)) { + if (b.getBorder() != null) { + orgBorders.put(b, b.getBorder()); + } else { + orgBorders.put(b, new NullBorder()); + } + } + + if (!orgMargins.contains(b)) { + orgMargins.put(b, b.getMargin()); + } + + if (b.getBorder() != null) { + if (isRolloverEnabled()) { + b.setBorderPainted(true); + b.setBorder(BorderFactory.createCompoundBorder(getRolloverBorder(), INNER_BORDER)); + b.setMargin(BUTTON_MARGIN); + b.setRolloverEnabled(true); + b.setOpaque(isButtonOpaque()); + b.setContentAreaFilled(isButtonOpaque()); + } else { + b.setBorder(BorderFactory.createCompoundBorder(getNonRolloverBorder(), INNER_BORDER)); + b.setMargin(BUTTON_MARGIN); + b.setRolloverEnabled(false); + b.setOpaque(isButtonOpaque()); + b.setContentAreaFilled(isButtonOpaque()); + } + } + } + + protected void restoreButtonBorder(AbstractButton b) { + Object cp = b.getClientProperty("paintToolBarBorder"); + if ((cp != null) && (cp instanceof Boolean)) { + Boolean changeBorder = (Boolean)cp; + if (!changeBorder.booleanValue()) { + return; + } + } + Border border = (Border) orgBorders.get(b); + if (border != null) { + if (border instanceof NullBorder) { + b.setBorder(null); + } else { + b.setBorder(border); + } + } + b.setMargin((Insets) orgMargins.get(b)); + } + + protected void updateToolbarBorder() { + toolBar.revalidate(); + toolBar.repaint(); + } + + protected boolean isToolBarUnderMenubar() { + if (toolBar != null && toolBar.getOrientation() == JToolBar.HORIZONTAL) { + JRootPane rp = SwingUtilities.getRootPane(toolBar); + JMenuBar mb = rp.getJMenuBar(); + if (mb != null) { + Point mbPoint = new Point(0, 0); + mbPoint = SwingUtilities.convertPoint(mb, mbPoint, rp); + Point tbPoint = new Point(0, 0); + tbPoint = SwingUtilities.convertPoint(toolBar, tbPoint, rp); + tbPoint.y -= mb.getHeight() - 1; + Rectangle rect = new Rectangle(mbPoint, mb.getSize()); + return rect.contains(tbPoint); + } + } + return false; + } + + protected boolean isToolbarDecorated() { + return AbstractLookAndFeel.getTheme().isToolbarDecorated(); + } + + protected class MyPropertyChangeListener implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals(IS_ROLLOVER)) { + if (e.getNewValue() != null) { + rolloverEnabled = ((Boolean) e.getNewValue()).booleanValue(); + changeBorders(); + } + } else if ("componentOrientation".equals(e.getPropertyName())) { + updateToolbarBorder(); + } + } + } + + protected class MyContainerListener implements ContainerListener { + + public void componentAdded(ContainerEvent e) { + Component c = e.getChild(); + if (c instanceof AbstractButton) { + changeButtonBorder((AbstractButton) c); + } + } + + public void componentRemoved(ContainerEvent e) { + Component c = e.getChild(); + if (c instanceof AbstractButton) { + restoreButtonBorder((AbstractButton) c); + } + } + } + + private static class NullBorder implements Border, UIResource { + + private static final Insets insets = new Insets(0, 0, 0, 0); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + } + + public Insets getBorderInsets(Component c) { + return insets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class NullBorder +} diff --git a/src/com/jtattoo/plaf/BaseBorders.java b/src/com/jtattoo/plaf/BaseBorders.java new file mode 100644 index 0000000..31b9287 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseBorders.java @@ -0,0 +1,896 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.plaf.BorderUIResource; +import javax.swing.plaf.UIResource; + +/** + * @author Michael Hagen + */ +public class BaseBorders { + + protected static Border buttonBorder = null; + protected static Border focusFrameBorder = null; + protected static Border textFieldBorder = null; + protected static Border spinnerBorder = null; + protected static Border comboBoxBorder = null; + protected static Border progressBarBorder = null; + protected static Border tableHeaderBorder = null; + protected static Border popupMenuBorder = null; + protected static Border menuItemBorder = null; + protected static Border toolBarBorder = null; + protected static Border toolButtonBorder = null; + protected static Border rolloverToolButtonBorder = null; + protected static Border internalFrameBorder = null; + protected static Border paletteBorder = null; + protected static Border scrollPaneBorder = null; + protected static Border tableScrollPaneBorder = null; + protected static Border tabbedPaneBorder = null; + protected static Border desktopIconBorder = null; + + public static void initDefaults() { + buttonBorder = null; + textFieldBorder = null; + spinnerBorder = null; + comboBoxBorder = null; + progressBarBorder = null; + tableHeaderBorder = null; + popupMenuBorder = null; + menuItemBorder = null; + toolBarBorder = null; + toolButtonBorder = null; + rolloverToolButtonBorder = null; + paletteBorder = null; + internalFrameBorder = null; + scrollPaneBorder = null; + tableScrollPaneBorder = null; + tabbedPaneBorder = null; + desktopIconBorder = null; + } + + //------------------------------------------------------------------------------------ + // Lazy access methods + //------------------------------------------------------------------------------------ + public static Border getFocusFrameBorder() { + if (focusFrameBorder == null) { + focusFrameBorder = new FocusFrameBorder(); + } + return focusFrameBorder; + } + + //------------------------------------------------------------------------------------ + // Lazy access methods + //------------------------------------------------------------------------------------ + public static Border getTextBorder() { + if (textFieldBorder == null) { + textFieldBorder = new TextFieldBorder(); + } + return textFieldBorder; + } + + public static Border getSpinnerBorder() { + if (spinnerBorder == null) { + spinnerBorder = new SpinnerBorder(); + } + return spinnerBorder; + } + + public static Border getTextFieldBorder() { + return getTextBorder(); + } + + public static Border getComboBoxBorder() { + if (comboBoxBorder == null) { + comboBoxBorder = new ComboBoxBorder(); + } + return comboBoxBorder; + } + + public static Border getProgressBarBorder() { + if (progressBarBorder == null) { + progressBarBorder = BorderFactory.createLineBorder(ColorHelper.darker(AbstractLookAndFeel.getBackgroundColor(), 30)); + } + return progressBarBorder; + } + + public static Border getTableHeaderBorder() { + if (tableHeaderBorder == null) { + tableHeaderBorder = new TableHeaderBorder(); + } + return tableHeaderBorder; + } + + public static Border getPopupMenuBorder() { + if (popupMenuBorder == null) { + if (AbstractLookAndFeel.getTheme().isMenuOpaque()) { + popupMenuBorder = new BasePopupMenuBorder(); + } else { + popupMenuBorder = new BasePopupMenuShadowBorder(); + } + } + return popupMenuBorder; + } + + public static Border getMenuItemBorder() { + if (menuItemBorder == null) { + menuItemBorder = new MenuItemBorder(); + } + return menuItemBorder; + } + + public static Border getToolBarBorder() { + if (toolBarBorder == null) { + toolBarBorder = new ToolBarBorder(); + } + return toolBarBorder; + } + + public static Border getToolButtonBorder() { + if (toolButtonBorder == null) { + toolButtonBorder = new ToolButtonBorder(); + } + return toolButtonBorder; + } + + public static Border getMenuBarBorder() { + return BorderFactory.createEmptyBorder(1, 1, 1, 1); + } + + public static Border getPaletteBorder() { + if (paletteBorder == null) { + paletteBorder = new PaletteBorder(); + } + return paletteBorder; + } + + public static Border getScrollPaneBorder() { + if (scrollPaneBorder == null) { + scrollPaneBorder = new ScrollPaneBorder(false); + } + return scrollPaneBorder; + } + + public static Border getTableScrollPaneBorder() { + if (tableScrollPaneBorder == null) { + tableScrollPaneBorder = new ScrollPaneBorder(true); + } + return tableScrollPaneBorder; + } + + public static Border getTabbedPaneBorder() { + if (tabbedPaneBorder == null) { + tabbedPaneBorder = BorderFactory.createEmptyBorder(1, 1, 1, 1); + } + return tabbedPaneBorder; + } + + public static Border getDesktopIconBorder() { + if (desktopIconBorder == null) { + desktopIconBorder = new BorderUIResource.CompoundBorderUIResource( + new LineBorder(AbstractLookAndFeel.getWindowBorderColor(), 1), + new MatteBorder(2, 2, 1, 2, AbstractLookAndFeel.getWindowBorderColor())); + } + return desktopIconBorder; + } + + //------------------------------------------------------------------------------------ + // Implementation of border classes + //------------------------------------------------------------------------------------ + public static class FocusFrameBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + Color hiColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getFocusFrameColor(), 60); + Color loColor = AbstractLookAndFeel.getTheme().getFocusFrameColor(); + g.setColor(loColor); + g.drawRect(x, y, width - 1, height - 1); + g.setColor(hiColor); + g.drawRect(x + 1, y + 1, width - 3, height - 3); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class FocusFrameBorder + + public static class TextFieldBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + g.setColor(AbstractLookAndFeel.getTheme().getFrameColor()); + g.drawRect(x, y, width - 1, height - 1); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class TextFieldBorder + + public static class SpinnerBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + g.setColor(AbstractLookAndFeel.getTheme().getFrameColor()); + g.drawRect(x, y, width - 1, height - 1); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class SpinnerBorder + + public static class ComboBoxBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + g.setColor(AbstractLookAndFeel.getTheme().getFrameColor()); + g.drawRect(x, y, width - 1, height - 1); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class ComboBoxBorder + + public static class TableHeaderBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 0); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D)g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f); + g2D.setComposite(alpha); + Color cHi = AbstractLookAndFeel.getTheme().getControlHighlightColor(); + Color cLo = AbstractLookAndFeel.getTheme().getControlShadowColor(); + JTattooUtilities.draw3DBorder(g, cHi, cLo, x, y, w, h); + g2D.setComposite(savedComposite); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class TableHeaderBorder + + public static class ScrollPaneBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + private static final Insets tableInsets = new Insets(1, 1, 1, 1); + + private boolean tableBorder = false; + + public ScrollPaneBorder(boolean tableBorder) { + this.tableBorder = tableBorder; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.setColor(AbstractLookAndFeel.getTheme().getFrameColor()); + g.drawRect(x, y, w - 1, h - 1); + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getTheme().getBackgroundColor(), 50)); + g.drawRect(x + 1, y + 1, w - 3, h - 3); + } + + public Insets getBorderInsets(Component c) { + if (tableBorder) { + return new Insets(tableInsets.top, tableInsets.left, tableInsets.bottom, tableInsets.right); + } else { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + Insets ins = getBorderInsets(c); + borderInsets.left = ins.left; + borderInsets.top = ins.top; + borderInsets.right = ins.right; + borderInsets.bottom = ins.bottom; + return borderInsets; + } + + } // class ScrollPaneBorder + + public static class BasePopupMenuBorder extends AbstractBorder implements UIResource { + + protected static Font logoFont; + protected static Insets leftLogoInsets; + protected static Insets rightLogoInsets; + protected static Insets insets; + protected static int shadowSize; + + public BasePopupMenuBorder() { + logoFont = new Font("Dialog", Font.BOLD, 12); + leftLogoInsets = new Insets(2, 18, 1, 1); + rightLogoInsets = new Insets(2, 2, 1, 18); + insets = new Insets(2, 1, 1, 1); + shadowSize = 0; + } + + public boolean isMenuBarPopup(Component c) { + boolean menuBarPopup = false; + if (c instanceof JPopupMenu) { + JPopupMenu pm = (JPopupMenu) c; + if (pm.getInvoker() != null) { + menuBarPopup = (pm.getInvoker().getParent() instanceof JMenuBar); + } + } + return menuBarPopup; + } + + public boolean hasLogo(Component c) { + return ((AbstractLookAndFeel.getTheme().getLogoString() != null) && (AbstractLookAndFeel.getTheme().getLogoString().length() > 0)); + } + + public Color getLogoColorHi() { + return Color.white; + } + + public Color getLogoColorLo() { + return ColorHelper.darker(AbstractLookAndFeel.getTheme().getMenuSelectionBackgroundColor(), 20); + } + + public void paintLogo(Component c, Graphics g, int x, int y, int w, int h) { + if (hasLogo(c)) { + Graphics2D g2D = (Graphics2D)g; + + Font savedFont = g2D.getFont(); + g.setFont(logoFont); + FontMetrics fm = JTattooUtilities.getFontMetrics((JComponent)c, g, c.getFont()); + String logo = JTattooUtilities.getClippedText(AbstractLookAndFeel.getTheme().getLogoString(), fm, h - 16); + + AffineTransform savedTransform = g2D.getTransform(); + + Color fc = getLogoColorHi(); + Color bc = getLogoColorLo(); + + if (JTattooUtilities.isLeftToRight(c)) { + g2D.translate(fm.getAscent() + 1, h - shadowSize - 4); + g2D.rotate(Math.toRadians(-90)); + g2D.setColor(bc); + JTattooUtilities.drawString((JComponent)c, g, logo, 0, 1); + g2D.setColor(fc); + JTattooUtilities.drawString((JComponent)c, g, logo, 1, 0); + } else { + g2D.translate(w - shadowSize - 4, h - shadowSize - 4); + g2D.rotate(Math.toRadians(-90)); + g2D.setColor(bc); + JTattooUtilities.drawString((JComponent)c, g, logo, 0, 1); + g2D.setColor(fc); + JTattooUtilities.drawString((JComponent)c, g, logo, 1, 0); + } + + g2D.setTransform(savedTransform); + g2D.setFont(savedFont); + } + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Color logoColor = AbstractLookAndFeel.getMenuSelectionBackgroundColor(); + Color borderColorLo = AbstractLookAndFeel.getFrameColor(); + Color borderColorHi = ColorHelper.brighter(AbstractLookAndFeel.getMenuSelectionBackgroundColor(), 40); + g.setColor(logoColor); + if (JTattooUtilities.isLeftToRight(c)) { + int dx = getBorderInsets(c).left; + g.fillRect(x, y, dx - 1, h - 1); + paintLogo(c, g, x, y, w, h); + // - highlight + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getMenuBackgroundColor(), 40)); + g.drawLine(x + dx, y + 1, x + w - 2, y + 1); + g.setColor(borderColorHi); + g.drawLine(x + 1, y, x + 1, y + h - 2); + // - outer frame + g.setColor(borderColorLo); + if (isMenuBarPopup(c)) { + // top + g.drawLine(x + dx - 1, y, x + w, y); + // left + g.drawLine(x, y, x, y + h - 1); + // bottom + g.drawLine(x, y + h - 1, x + w, y + h - 1); + // right + g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1); + } else { + g.drawRect(x, y, w - 1, h - 1); + } + // - logo separator + g.drawLine(x + dx - 1, y + 1, x + dx - 1, y + h - 1); + } else { + int dx = getBorderInsets(c).right; + g.fillRect(x + w - dx, y, dx, h - 1); + paintLogo(c, g, x, y, w, h); + // - highlight + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getMenuBackgroundColor(), 40)); + g.drawLine(x + 1, y + 1, x + w - dx - 1, y + 1); + g.drawLine(x + 1, y + 1, x + 1, y + h - 2); + // - outer frame + g.setColor(borderColorLo); + if (isMenuBarPopup(c)) { + // top + g.drawLine(x, y, x + w - dx, y); + // left + g.drawLine(x, y, x, y + h - 1); + // bottom + g.drawLine(x, y + h - 1, x + w, y + h - 1); + // right + g.drawLine(x + w - 1, y, x + w - 1, y + h - 1); + } else { + g.drawRect(x, y, w - 1, h - 1); + } + // - logo separator + g.drawLine(x + w - dx, y + 1, x + w - dx, y + h - 1); + } + } + + public Insets getBorderInsets(Component c) { + if (hasLogo(c)) { + if (JTattooUtilities.isLeftToRight(c)) { + return new Insets(leftLogoInsets.top, leftLogoInsets.left, leftLogoInsets.bottom + shadowSize, leftLogoInsets.right + shadowSize); + } else { + return new Insets(rightLogoInsets.top, rightLogoInsets.left, rightLogoInsets.bottom + shadowSize, rightLogoInsets.right + shadowSize); + } + } else { + return new Insets(insets.top, insets.left, insets.bottom + shadowSize, insets.right + shadowSize); + } + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + Insets ins = getBorderInsets(c); + borderInsets.left = ins.left; + borderInsets.top = ins.top; + borderInsets.right = ins.right; + borderInsets.bottom = ins.bottom; + return borderInsets; + } + + } // class PopupMenuBorder + + public static class BasePopupMenuShadowBorder extends BasePopupMenuBorder { + + public BasePopupMenuShadowBorder() { + shadowSize = 4; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, AbstractLookAndFeel.getTheme().getMenuAlpha()); + g2D.setComposite(alpha); + Color logoColor = AbstractLookAndFeel.getTheme().getMenuSelectionBackgroundColor(); + Color borderColorLo = AbstractLookAndFeel.getFrameColor(); + Color borderColorHi = ColorHelper.brighter(AbstractLookAndFeel.getMenuSelectionBackgroundColor(), 40); + g.setColor(logoColor); + if (JTattooUtilities.isLeftToRight(c)) { + int dx = getBorderInsets(c).left; + g.fillRect(x, y, dx - 1, h - 1 - shadowSize); + paintLogo(c, g, x, y, w, h); + // - highlight + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getMenuBackgroundColor(), 40)); + g.drawLine(x + dx, y + 1, x + w - shadowSize - 2, y + 1); + g.setColor(borderColorHi); + g.drawLine(x + 1, y, x + 1, y + h - shadowSize - 2); + // - outer frame + g.setColor(borderColorLo); + if (isMenuBarPopup(c)) { + // top + g.drawLine(x + dx - 1, y, x + w - shadowSize - 1, y); + // left + g.drawLine(x, y, x, y + h - shadowSize - 1); + // bottom + g.drawLine(x, y + h - shadowSize - 1, x + w - shadowSize - 1, y + h - shadowSize - 1); + // right + g.drawLine(x + w - shadowSize - 1, y + 1, x + w - shadowSize - 1, y + h - shadowSize - 1); + } else { + g.drawRect(x, y, w - shadowSize - 1, h - shadowSize - 1); + } + // - logo separator + g.drawLine(x + dx - 1, y + 1, x + dx - 1, y + h - shadowSize - 1); + } else { + int dx = getBorderInsets(c).right - shadowSize; + g.fillRect(x + w - dx - shadowSize, y, dx - 1, h - 1 - shadowSize); + paintLogo(c, g, x, y, w, h); + // - highlight + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getMenuBackgroundColor(), 40)); + g.drawLine(x + 1, y + 1, x + w - dx - shadowSize - 1, y + 1); + g.drawLine(x + 1, y + 1, x + 1, y + h - shadowSize - 2); + // - outer frame + g.setColor(borderColorLo); + if (isMenuBarPopup(c)) { + // top + g.drawLine(x, y, x + w - dx - shadowSize, y); + // left + g.drawLine(x, y, x, y + h - shadowSize - 1); + // bottom + g.drawLine(x, y + h - shadowSize - 1, x + w - shadowSize - 1, y + h - shadowSize - 1); + // right + g.drawLine(x + w - shadowSize - 1, y, x + w - shadowSize - 1, y + h - shadowSize - 1); + } else { + g.drawRect(x, y, w - shadowSize - 1, h - shadowSize - 1); + } + // - logo separator + g.drawLine(x + w - dx - shadowSize, y + 1, x + w - dx - shadowSize, y + h - shadowSize - 1); + } + + // paint the shadow + g2D.setColor(AbstractLookAndFeel.getTheme().getShadowColor()); + float alphaValue = 0.4f; + for (int i = 0; i < shadowSize; i++) { + alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alphaValue); + g2D.setComposite(alpha); + g.drawLine(x + w - shadowSize + i, y + shadowSize, x + w - shadowSize + i, y + h - shadowSize - 1 + i); + g.drawLine(x + shadowSize, y + h - shadowSize + i, x + w - shadowSize + i, y + h - shadowSize + i); + alphaValue -= (alphaValue / 2); + } + + g2D.setComposite(savedComposite); + } + + } // class PopupMenuShadowBorder + + public static class MenuItemBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + JMenuItem b = (JMenuItem) c; + ButtonModel model = b.getModel(); + Color borderColorLo = AbstractLookAndFeel.getFrameColor(); + Color borderColorHi = ColorHelper.brighter(AbstractLookAndFeel.getMenuSelectionBackgroundColor(), 40); + if (c.getParent() instanceof JMenuBar) { + if (model.isArmed() || model.isSelected()) { + g.setColor(borderColorLo); + g.drawLine(x, y, x + w - 1, y); + g.drawLine(x, y, x, y + h - 1); + g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1); + g.setColor(borderColorHi); + g.drawLine(x + 1, y + 1, x + w - 2, y + 1); + g.drawLine(x + 1, y + 1, x + 1, y + h - 1); + } + } else { + if (model.isArmed() || (c instanceof JMenu && model.isSelected())) { + g.setColor(borderColorLo); + g.drawLine(x, y, x + w - 1, y); + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); + g.setColor(borderColorHi); + g.drawLine(x, y + 1, x + w - 2, y + 1); + } + } + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class MenuItemBorder + + public static class ToolBarBorder extends AbstractBorder implements UIResource, SwingConstants { + + private static final Color shadow = new Color(160, 160, 160); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (((JToolBar) c).isFloatable()) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + if (!JTattooUtilities.isLeftToRight(c)) { + x += w - 15; + } + g.setColor(Color.white); + g.drawLine(x + 3, y + 4, x + 3, h - 5); + g.drawLine(x + 6, y + 3, x + 6, h - 4); + g.drawLine(x + 9, y + 4, x + 9, h - 5); + g.setColor(shadow); + g.drawLine(x + 4, y + 4, x + 4, h - 5); + g.drawLine(x + 7, y + 3, x + 7, h - 4); + g.drawLine(x + 10, y + 4, x + 10, h - 5); + } else { + // vertical + g.setColor(Color.white); + g.drawLine(x + 3, y + 3, w - 4, y + 3); + g.drawLine(x + 3, y + 6, w - 4, y + 6); + g.drawLine(x + 3, y + 9, w - 4, y + 9); + g.setColor(shadow); + g.drawLine(x + 3, y + 4, w - 4, y + 4); + g.drawLine(x + 3, y + 7, w - 4, y + 7); + g.drawLine(x + 3, y + 10, w - 4, y + 10); + } + g2D.setComposite(savedComposite); + } + } + + public Insets getBorderInsets(Component c) { + Insets insets = new Insets(2, 2, 2, 2); + if (((JToolBar) c).isFloatable()) { + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + if (JTattooUtilities.isLeftToRight(c)) { + insets.left = 15; + } else { + insets.right = 15; + } + } else { + insets.top = 15; + } + } + Insets margin = ((JToolBar) c).getMargin(); + if (margin != null) { + insets.left += margin.left; + insets.top += margin.top; + insets.right += margin.right; + insets.bottom += margin.bottom; + } + return insets; + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + Insets insets = getBorderInsets(c); + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class ToolBarBorder + + public static class ToolButtonBorder implements Border, UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + AbstractButton button = (AbstractButton) c; + ButtonModel model = button.getModel(); + Color frameColor = AbstractLookAndFeel.getToolbarBackgroundColor(); + Color frameHiColor = ColorHelper.brighter(frameColor, 10); + Color frameLoColor = ColorHelper.darker(frameColor, 30); + JTattooUtilities.draw3DBorder(g, frameHiColor, frameLoColor, x, y, w, h); + if ((model.isPressed() && model.isArmed()) || model.isSelected()) { + JTattooUtilities.draw3DBorder(g, frameLoColor, frameHiColor, x, y, w, h); + } else { + JTattooUtilities.draw3DBorder(g, frameLoColor, frameHiColor, x, y, w, h); + JTattooUtilities.draw3DBorder(g, frameHiColor, frameLoColor, x + 1, y + 1, w - 2, h - 2); + } + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class ToolButtonBorder + + public static class PaletteBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (JTattooUtilities.isFrameActive((JComponent) c)) { + g.setColor(AbstractLookAndFeel.getWindowBorderColor()); + } else { + g.setColor(AbstractLookAndFeel.getWindowInactiveBorderColor()); + } + g.drawRect(x, y, w - 1, h - 1); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class PaletteBorder + + public static class BaseInternalFrameBorder extends AbstractBorder implements UIResource { + + protected final int dw = 5; + protected final int trackWidth = 22; + protected final Insets insets = new Insets(dw, dw, dw, dw); + protected final Insets paletteInsets = new Insets(3, 3, 3, 3); + + public BaseInternalFrameBorder() { + } + + public boolean isResizable(Component c) { + boolean resizable = true; + if (c instanceof JDialog) { + JDialog dialog = (JDialog) c; + resizable = dialog.isResizable(); + } else if (c instanceof JInternalFrame) { + JInternalFrame frame = (JInternalFrame) c; + resizable = frame.isResizable(); + } else if (c instanceof JRootPane) { + JRootPane jp = (JRootPane) c; + if (jp.getParent() instanceof JFrame) { + JFrame frame = (JFrame) c.getParent(); + resizable = frame.isResizable(); + } else if (jp.getParent() instanceof JDialog) { + JDialog dialog = (JDialog) c.getParent(); + resizable = dialog.isResizable(); + } + } + return resizable; + } + + public boolean isActive(Component c) { + if (c instanceof JComponent) { + return JTattooUtilities.isActive((JComponent)c); + } else { + return true; + } + } + + public int getTitleHeight(Component c) { + int th = 21; + int fh = getBorderInsets(c).top + getBorderInsets(c).bottom; + if (c instanceof JDialog) { + JDialog dialog = (JDialog) c; + th = dialog.getSize().height - dialog.getContentPane().getSize().height - fh - 1; + if (dialog.getJMenuBar() != null) { + th -= dialog.getJMenuBar().getSize().height; + } + } else if (c instanceof JInternalFrame) { + JInternalFrame frame = (JInternalFrame) c; + th = frame.getSize().height - frame.getRootPane().getSize().height - fh - 1; + if (frame.getJMenuBar() != null) { + th -= frame.getJMenuBar().getSize().height; + } + } else if (c instanceof JRootPane) { + JRootPane jp = (JRootPane) c; + if (jp.getParent() instanceof JFrame) { + JFrame frame = (JFrame) c.getParent(); + th = frame.getSize().height - frame.getContentPane().getSize().height - fh - 1; + if (frame.getJMenuBar() != null) { + th -= frame.getJMenuBar().getSize().height; + } + } else if (jp.getParent() instanceof JDialog) { + JDialog dialog = (JDialog) c.getParent(); + th = dialog.getSize().height - dialog.getContentPane().getSize().height - fh - 1; + if (dialog.getJMenuBar() != null) { + th -= dialog.getJMenuBar().getSize().height; + } + } + } + return th; + } + + public Insets getBorderInsets(Component c) { + if (isResizable(c)) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } else { + return new Insets(paletteInsets.top, paletteInsets.left, paletteInsets.bottom, paletteInsets.right); + } + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + Insets ins = getBorderInsets(c); + borderInsets.left = ins.left; + borderInsets.top = ins.top; + borderInsets.right = ins.right; + borderInsets.bottom = ins.bottom; + return borderInsets; + } + + } // class BaseInternalFrameBorder + + public static class Down3DBorder extends AbstractBorder implements UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Color frameColor = AbstractLookAndFeel.getTheme().getBackgroundColor(); + JTattooUtilities.draw3DBorder(g, ColorHelper.darker(frameColor, 20), ColorHelper.brighter(frameColor, 80), x, y, w, h); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } // class Down3DBorder + +} // class BaseBorders diff --git a/src/com/jtattoo/plaf/BaseButtonListener.java b/src/com/jtattoo/plaf/BaseButtonListener.java new file mode 100644 index 0000000..ea4c720 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseButtonListener.java @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.event.FocusEvent; +import java.awt.event.MouseEvent; +import javax.swing.AbstractButton; +import javax.swing.plaf.basic.BasicButtonListener; + +public class BaseButtonListener extends BasicButtonListener { + + public BaseButtonListener(AbstractButton b) { + super(b); + } + + public void focusGained(FocusEvent e) { + AbstractButton b = (AbstractButton) e.getSource(); + b.repaint(); + } + + public void focusLost(FocusEvent e) { + AbstractButton b = (AbstractButton) e.getSource(); + b.repaint(); + } + + public void mouseEntered(MouseEvent e) { + super.mouseEntered(e); + AbstractButton button = (AbstractButton) e.getSource(); + button.getModel().setRollover(true); + } + + public void mouseExited(MouseEvent e) { + super.mouseExited(e); + AbstractButton button = (AbstractButton) e.getSource(); + button.getModel().setRollover(false); + } + + public void mouseReleased(MouseEvent e) { + super.mouseReleased(e); + } +} diff --git a/src/com/jtattoo/plaf/BaseButtonUI.java b/src/com/jtattoo/plaf/BaseButtonUI.java new file mode 100644 index 0000000..af200be --- /dev/null +++ b/src/com/jtattoo/plaf/BaseButtonUI.java @@ -0,0 +1,241 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is dual licensed. You can use it under the terms and conditions of the +* GNU General Public License version 2.0 or later as published by the Free Software +* Foundation. +* +* see: gpl-2.0.txt +* +* Registered users (this who payed for a license) could use the software under the +* terms and conditions of the GNU Lesser General Public License version 2.0 or later +* with classpath exception as published by the Free Software Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.KeyEvent; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.*; +import javax.swing.text.View; + +/** + * @author Michael Hagen + */ +public class BaseButtonUI extends BasicButtonUI { + + protected static Rectangle viewRect = new Rectangle(); + protected static Rectangle textRect = new Rectangle(); + protected static Rectangle iconRect = new Rectangle(); + protected static Color[] defaultColors = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseButtonUI(); + } + + protected void installKeyboardActions(AbstractButton b) { + super.installKeyboardActions(b); + InputMap im = (InputMap) UIManager.get("Button.focusInputMap"); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "pressed"); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released"); + Color cArr[] = AbstractLookAndFeel.getTheme().getButtonColors(); + defaultColors = new Color[cArr.length]; + for (int i = 0; i < cArr.length; i++) { + defaultColors[i] = ColorHelper.brighter(cArr[i], 20); + } + } + + public void installDefaults(AbstractButton b) { + super.installDefaults(b); + b.setOpaque(false); + b.setRolloverEnabled(true); + } + + protected void uninstallDefaults(AbstractButton b) { + super.uninstallDefaults(b); + b.setOpaque(true); + b.setRolloverEnabled(false); + } + + + protected BasicButtonListener createButtonListener(AbstractButton b) { + return new BaseButtonListener(b); + } + + protected void paintBackground(Graphics g, AbstractButton b) { + if (!b.isContentAreaFilled() || (b.getParent() instanceof JMenuBar)) { + return; + } + + int width = b.getWidth(); + int height = b.getHeight(); + + ButtonModel model = b.getModel(); + Color colors[] = AbstractLookAndFeel.getTheme().getButtonColors(); + if (b.isEnabled()) { + Color background = b.getBackground(); + if (background instanceof ColorUIResource) { + if (model.isPressed() && model.isArmed()) { + colors = AbstractLookAndFeel.getTheme().getPressedColors(); + } else if (b.isRolloverEnabled() && model.isRollover()) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && b.hasFocus()) { + colors = AbstractLookAndFeel.getTheme().getFocusColors(); + } else if (JTattooUtilities.isFrameActive(b) + && (b.getRootPane() != null) + && (b.equals(b.getRootPane().getDefaultButton()))) { + colors = defaultColors; + } + } else { + if (model.isPressed() && model.isArmed()) { + colors = ColorHelper.createColorArr(ColorHelper.darker(background, 30), ColorHelper.darker(background, 10), 20); + } else { + if (b.isRolloverEnabled() && model.isRollover()) { + colors = ColorHelper.createColorArr(ColorHelper.brighter(background, 50), ColorHelper.brighter(background, 10), 20); + } else { + colors = ColorHelper.createColorArr(ColorHelper.brighter(background, 30), ColorHelper.darker(background, 10), 20); + } + } + } + } else { // disabled + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + + if (b.isBorderPainted() && (b.getBorder() != null) && !(b.getBorder() instanceof EmptyBorder)) { + Insets insets = b.getBorder().getBorderInsets(b); + int x = insets.left > 0 ? 1 : 0; + int y = insets.top > 0 ? 1 : 0; + int w = insets.right > 0 ? width - 1 : width; + int h = insets.bottom > 0 ? height - 1 : height; + JTattooUtilities.fillHorGradient(g, colors, x, y, w - x, h - y); + } else { + JTattooUtilities.fillHorGradient(g, colors, 0, 0, width, height); + } + } + + protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { + ButtonModel model = b.getModel(); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + int mnemIndex; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = b.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + } + + if (model.isEnabled()) { + Color foreground = b.getForeground(); + Color background = b.getBackground(); + int offs = 0; + if (model.isArmed() && model.isPressed()) { + offs = 1; + } + if (!(model.isPressed() && model.isArmed())) { + Object sc = b.getClientProperty("shadowColor"); + if (sc instanceof Color) { + g.setColor((Color)sc); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + 1, textRect.y + 1 + fm.getAscent()); + } + } + if (background instanceof ColorUIResource) { + if (model.isPressed() && model.isArmed()) { + g.setColor(AbstractLookAndFeel.getTheme().getPressedForegroundColor()); + } else if (model.isRollover()) { + g.setColor(AbstractLookAndFeel.getTheme().getRolloverForegroundColor()); + } else { + g.setColor(foreground); + } + } else { + g.setColor(foreground); + } + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs, textRect.y + offs + fm.getAscent()); + } else { + if (ColorHelper.getGrayValue(b.getForeground()) < 128) { + g.setColor(Color.white); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + 1, textRect.y + 1 + fm.getAscent()); + } + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + + protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) { + g.setColor(AbstractLookAndFeel.getFocusColor()); + BasicGraphicsUtils.drawDashedRect(g, 4, 3, b.getWidth() - 8, b.getHeight() - 6); + } + + public void paint(Graphics g, JComponent c) { + Graphics2D g2D = (Graphics2D) g; + + AbstractButton b = (AbstractButton) c; + Font f = c.getFont(); + g.setFont(f); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + Insets insets = c.getInsets(); + + viewRect.x = insets.left; + viewRect.y = insets.top; + viewRect.width = b.getWidth() - (insets.right + viewRect.x); + viewRect.height = b.getHeight() - (insets.bottom + viewRect.y); + + textRect.x = textRect.y = textRect.width = textRect.height = 0; + iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0; + + int iconTextGap = defaultTextIconGap; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + iconTextGap = b.getIconTextGap(); + } + String text = SwingUtilities.layoutCompoundLabel( + c, fm, b.getText(), b.getIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, + b.getText() == null ? 0 : iconTextGap); + + paintBackground(g, b); + + if (b.getIcon() != null) { + if (!b.isEnabled()) { + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + paintIcon(g, c, iconRect); + g2D.setComposite(savedComposite); + } else { + if (b.getModel().isPressed() && b.getModel().isRollover()) { + iconRect.x++; + iconRect.y++; + } + paintIcon(g, c, iconRect); + } + } + + if (text != null && !text.equals("")) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + } + v.paint(g, textRect); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } else { + paintText(g, b, textRect, text); + } + } + + if (b.isFocusPainted() && b.hasFocus()) { + paintFocus(g, b, viewRect, textRect, iconRect); + } + } +} \ No newline at end of file diff --git a/src/com/jtattoo/plaf/BaseCheckBoxMenuItemUI.java b/src/com/jtattoo/plaf/BaseCheckBoxMenuItemUI.java new file mode 100644 index 0000000..3b643da --- /dev/null +++ b/src/com/jtattoo/plaf/BaseCheckBoxMenuItemUI.java @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class BaseCheckBoxMenuItemUI extends BaseMenuItemUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseCheckBoxMenuItemUI(); + } + + protected void installDefaults() { + super.installDefaults(); + checkIcon = UIManager.getIcon("CheckBoxMenuItem.checkIcon"); + } + +} diff --git a/src/com/jtattoo/plaf/BaseCheckBoxUI.java b/src/com/jtattoo/plaf/BaseCheckBoxUI.java new file mode 100644 index 0000000..b218291 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseCheckBoxUI.java @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class BaseCheckBoxUI extends BaseRadioButtonUI { + + private static BaseCheckBoxUI checkBoxUI = null; + + public static ComponentUI createUI(JComponent b) { + if (checkBoxUI == null) { + checkBoxUI = new BaseCheckBoxUI(); + } + return checkBoxUI; + } + + public void installDefaults(AbstractButton b) { + super.installDefaults(b); + icon = UIManager.getIcon("CheckBox.icon"); + } +} diff --git a/src/com/jtattoo/plaf/BaseComboBoxUI.java b/src/com/jtattoo/plaf/BaseComboBoxUI.java new file mode 100644 index 0000000..49f9a25 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseComboBoxUI.java @@ -0,0 +1,186 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicComboBoxUI; + +public class BaseComboBoxUI extends BasicComboBoxUI { + + private PropertyChangeListener propertyChangeListener = null; + private FocusListener focusListener = null; + private Border orgBorder = null; + private Color orgBackgroundColor = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseComboBoxUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + comboBox.setRequestFocusEnabled(true); + if (comboBox.getEditor() != null) { + if (comboBox.getEditor().getEditorComponent() instanceof JTextField) { + ((JTextField) (comboBox.getEditor().getEditorComponent())).setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); + } + } + } + + protected void installListeners() { + super.installListeners(); + propertyChangeListener = new PropertyChangeHandler(); + comboBox.addPropertyChangeListener(propertyChangeListener); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (comboBox != null) { + orgBorder = comboBox.getBorder(); + orgBackgroundColor = comboBox.getBackground(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel) { + if (orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder(); + comboBox.setBorder(focusBorder); + } + Color backgroundColor = AbstractLookAndFeel.getTheme().getFocusBackgroundColor(); + comboBox.setBackground(backgroundColor); + } + } + } + + public void focusLost(FocusEvent e) { + if (comboBox != null) { + if (orgBorder instanceof UIResource) { + comboBox.setBorder(orgBorder); + } + comboBox.setBackground(orgBackgroundColor); + } + } + }; + comboBox.addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + comboBox.removePropertyChangeListener(propertyChangeListener); + comboBox.removeFocusListener(focusListener); + propertyChangeListener = null; + focusListener = null; + super.uninstallListeners(); + } + + public Dimension getPreferredSize(JComponent c) { + Dimension size = super.getPreferredSize(c); + if (comboBox.getGraphics() != null) { + FontMetrics fm = JTattooUtilities.getFontMetrics(comboBox, comboBox.getGraphics(), comboBox.getFont()); + size.height = fm.getHeight() + 2; + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel(); + size.height = Math.max(size.height, laf.getIconFactory().getDownArrowIcon().getIconHeight() + 2); + } + } + return new Dimension(size.width + 2, size.height + 2); + } + + public JButton createArrowButton() { + JButton button = new ArrowButton(); + if (JTattooUtilities.isLeftToRight(comboBox)) { + Border border = BorderFactory.createMatteBorder(0, 1, 0, 0, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } else { + Border border = BorderFactory.createMatteBorder(0, 0, 0, 1, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } + return button; + } + + protected void setButtonBorder() { + if (JTattooUtilities.isLeftToRight(comboBox)) { + Border border = BorderFactory.createMatteBorder(0, 1, 0, 0, AbstractLookAndFeel.getFrameColor()); + arrowButton.setBorder(border); + } else { + Border border = BorderFactory.createMatteBorder(0, 0, 0, 1, AbstractLookAndFeel.getFrameColor()); + arrowButton.setBorder(border); + } + } + + public class PropertyChangeHandler implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("componentOrientation")) { + setButtonBorder(); + } + } + } +//----------------------------------------------------------------------------- + + public static class ArrowButton extends NoFocusButton { + + public void paint(Graphics g) { + Dimension size = getSize(); + Color colors[]; + if (isEnabled()) { + if (getModel().isArmed() && getModel().isPressed()) { + colors = AbstractLookAndFeel.getTheme().getPressedColors(); + } else if (getModel().isRollover()) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getButtonColors(); + } + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + JTattooUtilities.fillHorGradient(g, colors, 0, 0, size.width, size.height); + + boolean inverse = ColorHelper.getGrayValue(colors) < 128; + + Icon icon = inverse ? BaseIcons.getComboBoxInverseIcon() : BaseIcons.getComboBoxIcon(); + int x = (size.width - icon.getIconWidth()) / 2; + int y = (size.height - icon.getIconHeight()) / 2; + + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); + if (getModel().isPressed() && getModel().isArmed()) { + icon.paintIcon(this, g, x + 2, y + 1); + } else { + icon.paintIcon(this, g, x + 1, y); + } + g2D.setComposite(savedComposite); + paintBorder(g2D); + + } + } +} diff --git a/src/com/jtattoo/plaf/BaseDesktopPaneUI.java b/src/com/jtattoo/plaf/BaseDesktopPaneUI.java new file mode 100644 index 0000000..21a3255 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseDesktopPaneUI.java @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Graphics; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicDesktopPaneUI; + +/** + * @author Michael Hagen + */ +public class BaseDesktopPaneUI extends BasicDesktopPaneUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseDesktopPaneUI(); + } + + public void update(Graphics g, JComponent c) { + if (c.isOpaque()) { + Object backgroundTexture = c.getClientProperty("backgroundTexture"); + if (backgroundTexture instanceof Icon) { + JTattooUtilities.fillComponent(g, c, (Icon)backgroundTexture); + } else { + g.setColor(c.getBackground()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + paint(g, c); + } +} diff --git a/src/com/jtattoo/plaf/BaseEditorPaneUI.java b/src/com/jtattoo/plaf/BaseEditorPaneUI.java new file mode 100644 index 0000000..fbb9094 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseEditorPaneUI.java @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Graphics; +import java.awt.Toolkit; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicEditorPaneUI; +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; + +/** + * @author Michael Hagen + */ +public class BaseEditorPaneUI extends BasicEditorPaneUI { + + private Border orgBorder = null; + private FocusListener focusListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseEditorPaneUI(); + } + + public void installDefaults() { + super.installDefaults(); + updateBackground(); + } + + @SuppressWarnings("deprecation") + protected void installKeyboardActions() { + super.installKeyboardActions(); + if (JTattooUtilities.isMac()) { + InputMap im = (InputMap) UIManager.get("TextField.focusInputMap"); + int commandKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, commandKey), DefaultEditorKit.copyAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, commandKey), DefaultEditorKit.pasteAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, commandKey), DefaultEditorKit.cutAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.nextWordAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.previousWordAction); + } + } + + protected void installListeners() { + super.installListeners(); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (getComponent() != null) { + orgBorder = getComponent().getBorder(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel && orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder(); + getComponent().setBorder(focusBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + + public void focusLost(FocusEvent e) { + if (getComponent() != null) { + if (orgBorder instanceof UIResource) { + getComponent().setBorder(orgBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + }; + getComponent().addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + getComponent().removeFocusListener(focusListener); + focusListener = null; + super.uninstallListeners(); + } + + protected void paintBackground(Graphics g) { + g.setColor(getComponent().getBackground()); + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + if (getComponent().hasFocus() && getComponent().isEditable()) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusBackgroundColor()); + } + } + g.fillRect(0, 0, getComponent().getWidth(), getComponent().getHeight()); + } + + private void updateBackground() { + JTextComponent c = getComponent(); + if (c.getBackground() instanceof UIResource) { + if (!c.isEnabled() || !c.isEditable()) { + c.setBackground(AbstractLookAndFeel.getDisabledBackgroundColor()); + } else { + c.setBackground(AbstractLookAndFeel.getInputBackgroundColor()); + } + } + } +} diff --git a/src/com/jtattoo/plaf/BaseFileChooserUI.java b/src/com/jtattoo/plaf/BaseFileChooserUI.java new file mode 100644 index 0000000..0d9945b --- /dev/null +++ b/src/com/jtattoo/plaf/BaseFileChooserUI.java @@ -0,0 +1,134 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Dimension; +import java.awt.Window; +import java.io.File; +import javax.swing.*; +import javax.swing.event.AncestorEvent; +import javax.swing.event.AncestorListener; +import javax.swing.filechooser.FileView; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalFileChooserUI; + +/** + * @author Michael Hagen + */ +public class BaseFileChooserUI extends MetalFileChooserUI { + + private FileView fileView = null; + + // Preferred and Minimum sizes for the dialog box + private static final int PREF_WIDTH = 580; + private static final int PREF_HEIGHT = 340; + private static final Dimension PREF_SIZE = new Dimension(PREF_WIDTH, PREF_HEIGHT); + + private AncestorListener ancestorListener = null; + + public BaseFileChooserUI(JFileChooser fileChooser) { + super(fileChooser); + fileView = new BaseFileView(); + } + + public static ComponentUI createUI(JComponent c) { + return new BaseFileChooserUI((JFileChooser) c); + } + + protected void installListeners(JFileChooser fc) { + super.installListeners(fc); + ancestorListener = new AncestorListener() { + + public void ancestorAdded(AncestorEvent event) { + Window w = SwingUtilities.getWindowAncestor(getFileChooser()); + if (w != null) { + w.setMinimumSize(getPreferredSize(getFileChooser())); + } + } + + public void ancestorRemoved(AncestorEvent event) { + } + + public void ancestorMoved(AncestorEvent event) { + } + }; + + fc.addAncestorListener(ancestorListener); + } + + protected void uninstallListeners(JFileChooser fc) { + super.uninstallListeners(fc); + fc.removeAncestorListener(ancestorListener); + } + + /** + * Returns the preferred size of the specified + * JFileChooser. + * The preferred size is at least as large, + * in both height and width, + * as the preferred size recommended + * by the file chooser's layout manager. + * + * @param c a JFileChooser + * @return a Dimension specifying the preferred + * width and height of the file chooser + */ + public Dimension getPreferredSize(JComponent c) { + int prefWidth = PREF_SIZE.width; + Dimension d = c.getLayout().preferredLayoutSize(c); + if (d != null) { + return new Dimension(d.width < prefWidth ? prefWidth : d.width, + d.height < PREF_SIZE.height ? PREF_SIZE.height : d.height); + } else { + return new Dimension(prefWidth, PREF_SIZE.height); + } + } + + public FileView getFileView(JFileChooser fc) { + if (JTattooUtilities.getJavaVersion() < 1.4) { + return super.getFileView(fc); + } else { + return fileView; + } + } + +//------------------------------------------------------------------------------ + protected class BaseFileView extends BasicFileView { + + public Icon getIcon(File f) { + Icon icon = getCachedIcon(f); + if (icon != null) { + return icon; + } + if (f != null) { + icon = getFileChooser().getFileSystemView().getSystemIcon(f); + } + if (icon == null) { + icon = super.getIcon(f); + } + cacheIcon(f, icon); + return icon; + } + } +} diff --git a/src/com/jtattoo/plaf/BaseFormattedTextFieldUI.java b/src/com/jtattoo/plaf/BaseFormattedTextFieldUI.java new file mode 100644 index 0000000..2548535 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseFormattedTextFieldUI.java @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicFormattedTextFieldUI; + +/** + * @author Michael Hagen + */ +public class BaseFormattedTextFieldUI extends BasicFormattedTextFieldUI { + + private Border orgBorder = null; + private FocusListener focusListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseFormattedTextFieldUI(); + } + + protected void installListeners() { + super.installListeners(); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (getComponent() != null) { + orgBorder = getComponent().getBorder(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel && orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder(); + getComponent().setBorder(focusBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + + public void focusLost(FocusEvent e) { + if (getComponent() != null) { + if (orgBorder instanceof UIResource) { + getComponent().setBorder(orgBorder); + getComponent().invalidate(); + getComponent().repaint(); + } + } + } + }; + getComponent().addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + getComponent().removeFocusListener(focusListener); + focusListener = null; + super.uninstallListeners(); + } + + protected void paintBackground(Graphics g) { + g.setColor(getComponent().getBackground()); + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + if (getComponent().hasFocus() && getComponent().isEditable()) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusBackgroundColor()); + } + } + g.fillRect(0, 0, getComponent().getWidth(), getComponent().getHeight()); + } + + protected void paintSafely(Graphics g) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + super.paintSafely(g); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseIcons.java b/src/com/jtattoo/plaf/BaseIcons.java new file mode 100644 index 0000000..ed3e5c5 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseIcons.java @@ -0,0 +1,1514 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.geom.*; +import javax.swing.*; +import javax.swing.plaf.UIResource; + +/** + * @author Michael Hagen + */ +public class BaseIcons { + + public static final LazyImageIcon PEARL_RED_SMALL = new LazyImageIcon("icons/small/pearl_red_24x24.png"); + public static final LazyImageIcon PEARL_YELLOW_SMALL = new LazyImageIcon("icons/small/pearl_yellow_24x24.png"); + public static final LazyImageIcon PEARL_GREEN_SMALL = new LazyImageIcon("icons/small/pearl_green_24x24.png"); + public static final LazyImageIcon PEARL_GREY_SMALL = new LazyImageIcon("icons/small/pearl_grey_24x24.png"); + public static final LazyImageIcon PEARL_RED_MEDIUM = new LazyImageIcon("icons/medium/pearl_red_28x28.png"); + public static final LazyImageIcon PEARL_YELLOW_MEDIUM = new LazyImageIcon("icons/medium/pearl_yellow_28x28.png"); + public static final LazyImageIcon PEARL_GREEN_MEDIUM = new LazyImageIcon("icons/medium/pearl_green_28x28.png"); + public static final LazyImageIcon PEARL_GREY_MEDIUM = new LazyImageIcon("icons/medium/pearl_grey_28x28.png"); + public static final LazyImageIcon PEARL_RED_LARGE = new LazyImageIcon("icons/large/pearl_red_32x32.png"); + public static final LazyImageIcon PEARL_YELLOW_LARGE = new LazyImageIcon("icons/large/pearl_yellow_32x32.png"); + public static final LazyImageIcon PEARL_GREEN_LARGE = new LazyImageIcon("icons/large/pearl_green_32x32.png"); + public static final LazyImageIcon PEARL_GREY_LARGE = new LazyImageIcon("icons/large/pearl_grey_32x32.png"); + + public static final LazyImageIcon ICONIZER_SMALL = new LazyImageIcon("icons/small/iconizer_10x10.png"); + public static final LazyImageIcon MINIMIZER_SMALL = new LazyImageIcon("icons/small/minimizer_10x10.png"); + public static final LazyImageIcon MAXIMIZER_SMALL = new LazyImageIcon("icons/small/maximizer_10x10.png"); + public static final LazyImageIcon CLOSER_SMALL = new LazyImageIcon("icons/small/closer_10x10.png"); + public static final LazyImageIcon ICONIZER_MEDIUM = new LazyImageIcon("icons/medium/iconizer_12x12.png"); + public static final LazyImageIcon MINIMIZER_MEDIUM = new LazyImageIcon("icons/medium/minimizer_12x12.png"); + public static final LazyImageIcon MAXIMIZER_MEDIUM = new LazyImageIcon("icons/medium/maximizer_12x12.png"); + public static final LazyImageIcon CLOSER_MEDIUM = new LazyImageIcon("icons/medium/closer_12x12.png"); + public static final LazyImageIcon ICONIZER_LARGE = new LazyImageIcon("icons/large/iconizer_12x12.png"); + public static final LazyImageIcon MINIMIZER_LARGE = new LazyImageIcon("icons/large/minimizer_12x12.png"); + public static final LazyImageIcon MAXIMIZER_LARGE = new LazyImageIcon("icons/large/maximizer_12x12.png"); + public static final LazyImageIcon CLOSER_LARGE = new LazyImageIcon("icons/large/closer_12x12.png"); + + public static final LazyImageIcon EMPTY_8x8 = new LazyImageIcon("icons/empty_8x8.png"); + + protected static Icon checkBoxIcon = null; + protected static Icon menuCheckBoxIcon = null; + protected static Icon radioButtonIcon = null; + protected static Icon menuRadioButtonIcon = null; + protected static Icon optionPaneErrorIcon = null; + protected static Icon optionPaneWarningIcon = null; + protected static Icon optionPaneInformationIcon = null; + protected static Icon optionPaneQuestionIcon = null; + + protected static Icon fileChooserUpFolderIcon = null; + protected static Icon fileChooserHomeFolderIcon = null; + protected static Icon fileChooserNewFolderIcon = null; + protected static Icon fileChooserListViewIcon = null; + protected static Icon fileChooserDetailViewIcon = null; + protected static Icon fileViewComputerIcon = null; + protected static Icon fileViewFloppyDriveIcon = null; + protected static Icon fileViewHardDriveIcon = null; + + protected static Icon treeOpenedIcon = null; + protected static Icon treeClosedIcon = null; + protected static Icon treeLeafIcon = null; + protected static Icon treeExpandedIcon = null; + protected static Icon treeCollapsedIcon = null; + + protected static Icon paletteCloseIcon = null; + protected static Icon menuIcon = null; + + protected static Icon iconIcon = null; + protected static Icon maxIcon = null; + protected static Icon minIcon = null; + protected static Icon closeIcon = null; + + protected static Icon upArrowIcon = null; + protected static Icon upArrowInverseIcon = null; + protected static Icon downArrowIcon = null; + protected static Icon downArrowInverseIcon = null; + protected static Icon leftArrowIcon = null; + protected static Icon leftArrowInverseIcon = null; + protected static Icon rightArrowIcon = null; + protected static Icon rightArrowInverseIcon = null; + protected static Icon menuArrowIcon = null; + protected static Icon splitterUpArrowIcon = null; + protected static Icon splitterDownArrowIcon = null; + protected static Icon splitterLeftArrowIcon = null; + protected static Icon splitterRightArrowIcon = null; + protected static Icon splitterHorBumpIcon = null; + protected static Icon splitterVerBumpIcon = null; + protected static Icon thumbHorIcon = null; + protected static Icon thumbVerIcon = null; + protected static Icon thumbHorIconRollover = null; + protected static Icon thumbVerIconRollover = null; + + public static void initDefaults() { + checkBoxIcon = null; + menuCheckBoxIcon = null; + radioButtonIcon = null; + menuRadioButtonIcon = null; + optionPaneErrorIcon = null; + optionPaneWarningIcon = null; + optionPaneInformationIcon = null; + optionPaneQuestionIcon = null; + fileChooserUpFolderIcon = null; + fileChooserHomeFolderIcon = null; + fileChooserNewFolderIcon = null; + fileChooserListViewIcon = null; + fileChooserDetailViewIcon = null; + fileViewComputerIcon = null; + fileViewFloppyDriveIcon = null; + fileViewHardDriveIcon = null; + treeOpenedIcon = null; + treeClosedIcon = null; + treeLeafIcon = null; + treeExpandedIcon = null; + treeCollapsedIcon = null; + paletteCloseIcon = null; + menuIcon = null; + iconIcon = null; + maxIcon = null; + minIcon = null; + closeIcon = null; + upArrowIcon = null; + upArrowInverseIcon = null; + downArrowIcon = null; + downArrowInverseIcon = null; + leftArrowIcon = null; + leftArrowInverseIcon = null; + rightArrowIcon = null; + rightArrowInverseIcon = null; + menuArrowIcon = null; + splitterUpArrowIcon = null; + splitterDownArrowIcon = null; + splitterLeftArrowIcon = null; + splitterRightArrowIcon = null; + splitterHorBumpIcon = null; + splitterVerBumpIcon = null; + thumbHorIcon = null; + thumbVerIcon = null; + thumbHorIconRollover = null; + thumbVerIconRollover = null; + } + + public static Icon getRadioButtonIcon() { + if (radioButtonIcon == null) { + radioButtonIcon = new RadioButtonIcon(); + } + return radioButtonIcon; + } + + public static Icon getCheckBoxIcon() { + if (checkBoxIcon == null) { + checkBoxIcon = new CheckBoxIcon(); + } + return checkBoxIcon; + } + + // ComboBox + public static Icon getComboBoxIcon() { + return getDownArrowIcon(); + } + + public static Icon getComboBoxInverseIcon() { + return getDownArrowInverseIcon(); + } + + // OptionPane + public static Icon getOptionPaneErrorIcon() { + if (optionPaneErrorIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + optionPaneErrorIcon = new LazyImageIcon("icons/medium/error_32x32.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + optionPaneErrorIcon = new LazyImageIcon("icons/medium/error_32x32.png"); + } else { + optionPaneErrorIcon = new LazyImageIcon("icons/large/error_48x48.png"); + } + } + return optionPaneErrorIcon; + } + + public static Icon getOptionPaneWarningIcon() { + if (optionPaneWarningIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + optionPaneWarningIcon = new LazyImageIcon("icons/medium/warning_32x32.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + optionPaneWarningIcon = new LazyImageIcon("icons/medium/warning_32x32.png"); + } else { + optionPaneWarningIcon = new LazyImageIcon("icons/large/warning_48x48.png"); + } + } + return optionPaneWarningIcon; + } + + public static Icon getOptionPaneInformationIcon() { + if (optionPaneInformationIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + optionPaneInformationIcon = new LazyImageIcon("icons/medium/information_32x32.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + optionPaneInformationIcon = new LazyImageIcon("icons/medium/information_32x32.png"); + } else { + optionPaneInformationIcon = new LazyImageIcon("icons/large/information_48x48.png"); + } + } + return optionPaneInformationIcon; + } + + public static Icon getOptionPaneQuestionIcon() { + if (optionPaneQuestionIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + optionPaneQuestionIcon = new LazyImageIcon("icons/medium/question_32x32.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + optionPaneQuestionIcon = new LazyImageIcon("icons/medium/question_32x32.png"); + } else { + optionPaneQuestionIcon = new LazyImageIcon("icons/large/question_48x48.png"); + } + } + return optionPaneQuestionIcon; + } + + // FileChooser + public static Icon getFileChooserUpFolderIcon() { + if (fileChooserUpFolderIcon == null) { + fileChooserUpFolderIcon = new LazyImageIcon("icons/folder_up_22x22.png"); + } + return fileChooserUpFolderIcon; + } + + public static Icon getFileChooserHomeFolderIcon() { + if (fileChooserHomeFolderIcon == null) { + fileChooserHomeFolderIcon = new LazyImageIcon("icons/home_22x22.png"); + } + return fileChooserHomeFolderIcon; + } + + public static Icon getFileChooserNewFolderIcon() { + if (fileChooserNewFolderIcon == null) { + fileChooserNewFolderIcon = new LazyImageIcon("icons/folder_new_22x22.png"); + } + return fileChooserNewFolderIcon; + } + + public static Icon getFileChooserListViewIcon() { + if (fileChooserListViewIcon == null) { + fileChooserListViewIcon = new LazyImageIcon("icons/view_list_22x22.png"); + } + return fileChooserListViewIcon; + } + + public static Icon getFileChooserDetailViewIcon() { + if (fileChooserDetailViewIcon == null) { + fileChooserDetailViewIcon = new LazyImageIcon("icons/view_detail_22x22.png"); + } + return fileChooserDetailViewIcon; + } + + public static Icon getFileViewComputerIcon() { + if (fileViewComputerIcon == null) { + fileViewComputerIcon = new LazyImageIcon("icons/computer_16x16.png"); + } + return fileViewComputerIcon; + } + + public static Icon getFileViewFloppyDriveIcon() { + if (fileViewFloppyDriveIcon == null) { + fileViewFloppyDriveIcon = new LazyImageIcon("icons/floppy_drive_16x16.png"); + } + return fileViewFloppyDriveIcon; + } + + public static Icon getFileViewHardDriveIcon() { + if (fileViewHardDriveIcon == null) { + fileViewHardDriveIcon = new LazyImageIcon("icons/hard_drive_16x16.png"); + } + return fileViewHardDriveIcon; + } + + // Tree + public static Icon getTreeOpenedIcon() { + if (treeOpenedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeOpenedIcon = new LazyImageIcon("icons/small/folder_opened_16x16.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeOpenedIcon = new LazyImageIcon("icons/medium/folder_opened_20x20.png"); + } else { + treeOpenedIcon = new LazyImageIcon("icons/large/folder_opened_24x24.png"); + } + } + return treeOpenedIcon; + } + + public static Icon getTreeClosedIcon() { + if (treeClosedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeClosedIcon = new LazyImageIcon("icons/small/folder_closed_16x16.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeClosedIcon = new LazyImageIcon("icons/medium/folder_closed_20x20.png"); + } else { + treeClosedIcon = new LazyImageIcon("icons/large/folder_closed_24x24.png"); + } + } + return treeClosedIcon; + } + + public static Icon getTreeLeafIcon() { + if (treeLeafIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeLeafIcon = new LazyImageIcon("icons/small/document_16x16.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeLeafIcon = new LazyImageIcon("icons/medium/document_20x20.png"); + } else { + treeLeafIcon = new LazyImageIcon("icons/large/document_24x24.png"); + } + } + return treeLeafIcon; + } + + public static Icon getTreeCollapsedIcon() { + if (treeCollapsedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeCollapsedIcon = new LazyImageIcon("icons/small/tree_collapsed_9x9.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeCollapsedIcon = new LazyImageIcon("icons/medium/tree_collapsed_11x11.png"); + } else { + treeCollapsedIcon = new LazyImageIcon("icons/large/tree_collapsed_14x14.png"); + } + } + return treeCollapsedIcon; + } + + public static Icon getTreeExpandedIcon() { + if (treeExpandedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeExpandedIcon = new LazyImageIcon("icons/small/tree_expanded_9x9.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeExpandedIcon = new LazyImageIcon("icons/medium/tree_expanded_11x11.png"); + } else { + treeExpandedIcon = new LazyImageIcon("icons/large/tree_expanded_14x14.png"); + } + } + return treeExpandedIcon; + } + + // TitlePane icons + public static Icon getMenuIcon() { + if (menuIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + menuIcon = new LazyImageIcon("icons/small/cup_16x16.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + menuIcon = new LazyImageIcon("icons/medium/cup_20x20.png"); + } else { + menuIcon = new LazyImageIcon("icons/large/cup_24x24.png"); + } + } + return menuIcon; + } + + public static Icon getIconIcon() { + if (iconIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + iconIcon = new MacIconIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + iconIcon = new IconSymbol(iconColor, null, iconRolloverColor); + } + } + return iconIcon; + } + + public static Icon getMaxIcon() { + if (maxIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + maxIcon = new MacMaxIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + maxIcon = new MaxSymbol(iconColor, null, iconRolloverColor); + } + } + return maxIcon; + } + + public static Icon getMinIcon() { + if (minIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + minIcon = new MacMinIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + minIcon = new MinSymbol(iconColor, null, iconRolloverColor); + } + } + return minIcon; + } + + public static Icon getCloseIcon() { + if (closeIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + closeIcon = new MacCloseIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + closeIcon = new CloseSymbol(iconColor, null, iconRolloverColor); + } + } + return closeIcon; + } + + public static Icon getPaletteCloseIcon() { + if (paletteCloseIcon == null) { + paletteCloseIcon = new CloseSymbol(Color.black, null, Color.red); + } + return paletteCloseIcon; + } + + // MenuIcons + public static Icon getMenuArrowIcon() { + if (menuArrowIcon == null) { + menuArrowIcon = new LazyMenuArrowImageIcon("icons/MenuRightArrow.gif", "icons/MenuLeftArrow.gif"); + } + return menuArrowIcon; + } + + public static Icon getMenuCheckBoxIcon() { + if (menuCheckBoxIcon == null) { + menuCheckBoxIcon = new CheckBoxIcon(); + } + return menuCheckBoxIcon; + } + + public static Icon getMenuRadioButtonIcon() { + if (menuRadioButtonIcon == null) { + menuRadioButtonIcon = new RadioButtonIcon(); + } + return menuRadioButtonIcon; + } + + // ArrowIcons + public static Icon getUpArrowIcon() { + if (upArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + upArrowIcon = new LazyImageIcon("icons/small/arrow_up_7x4.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + upArrowIcon = new LazyImageIcon("icons/medium/arrow_up_9x6.png"); + } else { + upArrowIcon = new LazyImageIcon("icons/large/arrow_up_11x8.png"); + } + } + return upArrowIcon; + } + + public static Icon getUpArrowInverseIcon() { + if (upArrowInverseIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + upArrowInverseIcon = new LazyImageIcon("icons/small/arrow_up_inverse_7x4.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + upArrowInverseIcon = new LazyImageIcon("icons/medium/arrow_up_inverse_9x6.png"); + } else { + upArrowInverseIcon = new LazyImageIcon("icons/large/arrow_up_inverse_11x8.png"); + } + } + return upArrowInverseIcon; + } + + public static Icon getDownArrowIcon() { + if (downArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + downArrowIcon = new LazyImageIcon("icons/small/arrow_down_7x4.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + downArrowIcon = new LazyImageIcon("icons/medium/arrow_down_9x6.png"); + } else { + downArrowIcon = new LazyImageIcon("icons/large/arrow_down_11x8.png"); + } + } + return downArrowIcon; + } + + public static Icon getDownArrowInverseIcon() { + if (downArrowInverseIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + downArrowInverseIcon = new LazyImageIcon("icons/small/arrow_down_inverse_7x4.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + downArrowInverseIcon = new LazyImageIcon("icons/medium/arrow_down_inverse_9x6.png"); + } else { + downArrowInverseIcon = new LazyImageIcon("icons/large/arrow_down_inverse_11x8.png"); + } + } + return downArrowInverseIcon; + } + + public static Icon getLeftArrowIcon() { + if (leftArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + leftArrowIcon = new LazyImageIcon("icons/small/arrow_left_4x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + leftArrowIcon = new LazyImageIcon("icons/medium/arrow_left_6x9.png"); + } else { + leftArrowIcon = new LazyImageIcon("icons/large/arrow_left_8x11.png"); + } + } + return leftArrowIcon; + } + + public static Icon getLeftArrowInverseIcon() { + if (leftArrowInverseIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + leftArrowInverseIcon = new LazyImageIcon("icons/small/arrow_left_inverse_4x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + leftArrowInverseIcon = new LazyImageIcon("icons/medium/arrow_left_inverse_6x9.png"); + } else { + leftArrowInverseIcon = new LazyImageIcon("icons/large/arrow_left_inverse_8x11.png"); + } + } + return leftArrowInverseIcon; + } + + public static Icon getRightArrowIcon() { + if (rightArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + rightArrowIcon = new LazyImageIcon("icons/small/arrow_right_4x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + rightArrowIcon = new LazyImageIcon("icons/medium/arrow_right_6x9.png"); + } else { + rightArrowIcon = new LazyImageIcon("icons/large/arrow_right_8x11.png"); + } + } + return rightArrowIcon; + } + + public static Icon getRightArrowInverseIcon() { + if (rightArrowInverseIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + rightArrowInverseIcon = new LazyImageIcon("icons/small/arrow_right_inverse_4x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + rightArrowInverseIcon = new LazyImageIcon("icons/medium/arrow_right_inverse_6x9.png"); + } else { + rightArrowInverseIcon = new LazyImageIcon("icons/large/arrow_right_inverse_8x11.png"); + } + } + return rightArrowInverseIcon; + } + + // Splitter + public static Icon getSplitterUpArrowIcon() { + if (splitterUpArrowIcon == null) { + splitterUpArrowIcon = new LazyImageIcon("icons/SplitterUpArrow.gif"); + } + return splitterUpArrowIcon; + } + + public static Icon getSplitterDownArrowIcon() { + if (splitterDownArrowIcon == null) { + splitterDownArrowIcon = new LazyImageIcon("icons/SplitterDownArrow.gif"); + } + return splitterDownArrowIcon; + } + + public static Icon getSplitterLeftArrowIcon() { + if (splitterLeftArrowIcon == null) { + splitterLeftArrowIcon = new LazyImageIcon("icons/SplitterLeftArrow.gif"); + } + return splitterLeftArrowIcon; + } + + public static Icon getSplitterRightArrowIcon() { + if (splitterRightArrowIcon == null) { + splitterRightArrowIcon = new LazyImageIcon("icons/SplitterRightArrow.gif"); + } + return splitterRightArrowIcon; + } + + public static Icon getSplitterHorBumpIcon() { + if (splitterHorBumpIcon == null) { + splitterHorBumpIcon = new LazyImageIcon("icons/SplitterHorBumps.gif"); + } + return splitterHorBumpIcon; + } + + public static Icon getSplitterVerBumpIcon() { + if (splitterVerBumpIcon == null) { + splitterVerBumpIcon = new LazyImageIcon("icons/SplitterVerBumps.gif"); + } + return splitterVerBumpIcon; + } + + // Slider + public static Icon getThumbHorIcon() { + if (thumbHorIcon == null) { + thumbHorIcon = new LazyImageIcon("icons/thumb_hor.gif"); + } + return thumbHorIcon; + } + + public static Icon getThumbVerIcon() { + if (thumbVerIcon == null) { + thumbVerIcon = new LazyImageIcon("icons/thumb_ver.gif"); + } + return thumbVerIcon; + } + + public static Icon getThumbHorIconRollover() { + if (thumbHorIconRollover == null) { + thumbHorIconRollover = new LazyImageIcon("icons/thumb_hor_rollover.gif"); + } + return thumbHorIconRollover; + } + + public static Icon getThumbVerIconRollover() { + if (thumbVerIconRollover == null) { + thumbVerIconRollover = new LazyImageIcon("icons/thumb_ver_rollover.gif"); + } + return thumbVerIconRollover; + } + +//----------------------------------------------------------------------------------------------------------- + private static class CheckBoxIcon implements Icon { + + private static int GAP = 2; + private static final Icon SMALL_CHECK_ICON = new LazyImageIcon("icons/small/check_symbol_10x10.png"); + private static final Icon SMALL_CHECK_DISABLED_ICON = new LazyImageIcon("icons/small/check_symbol_disabled_10x10.png"); + private static final Icon MEDIUM_CHECK_ICON = new LazyImageIcon("icons/medium/check_symbol_12x12.png"); + private static final Icon MEDIUM_CHECK_DISABLED_ICON = new LazyImageIcon("icons/medium/check_symbol_disabled_12x12.png"); + private static final Icon LARGE_CHECK_ICON = new LazyImageIcon("icons/large/check_symbol_14x14.png"); + private static final Icon LARGE_CHECK_DISABLED_ICON = new LazyImageIcon("icons/large/check_symbol_disabled_14x14.png"); + + public void paintIcon(Component c, Graphics g, int x, int y) { + if (!JTattooUtilities.isLeftToRight(c)) { + x += GAP; + } + int w = getIconWidth() - GAP; + int h = getIconHeight(); + AbstractButton button = (AbstractButton) c; + ButtonModel model = button.getModel(); + if (c instanceof JCheckBoxMenuItem) { + g.setColor(Color.white); + g.fillRect(x, y, w, h); + if (button.isEnabled()) { + g.setColor(AbstractLookAndFeel.getFrameColor()); + } else { + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getFrameColor(), 40)); + } + g.drawRect(x, y, w, h); + } else { + if (button.isEnabled()) { + if ((button.isRolloverEnabled() && model.isRollover())) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getRolloverColors(), x, y, w, h); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getFocusColors(), x, y, w, h); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getCheckBoxColors(), x, y, w, h); + } + if (!model.isPressed()) { + g.setColor(Color.white); + g.drawLine(x + 1, y + 1, x + 1, y + h - 2); + g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 2); + } + } + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + Color hiColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getFocusFrameColor(), 30); + Color loColor = ColorHelper.darker(AbstractLookAndFeel.getTheme().getFocusFrameColor(), 20); + g.setColor(hiColor); + g.drawRect(x - 1, y - 1, w + 2, h + 2); + g.setColor(loColor); + g.drawRect(x, y, w, h); + } else { + g.setColor(AbstractLookAndFeel.getFrameColor()); + g.drawRect(x, y, w, h); + } + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getDisabledColors(), x, y, w, h); + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getFrameColor(), 40)); + g.drawRect(x, y, w, h); + } + } + + Icon checkIcon; + Icon checkDisabledIcon; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + checkIcon = SMALL_CHECK_ICON; + checkDisabledIcon = SMALL_CHECK_DISABLED_ICON; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + checkIcon = MEDIUM_CHECK_ICON; + checkDisabledIcon = MEDIUM_CHECK_DISABLED_ICON; + } else { + checkIcon = LARGE_CHECK_ICON; + checkDisabledIcon = LARGE_CHECK_DISABLED_ICON; + } + int xi = x + ((w - checkIcon.getIconWidth()) / 2) + 1; + int yi = y + ((h - checkIcon.getIconHeight()) / 2) + 1; + if (model.isPressed() && model.isArmed()) { + Color bc = AbstractLookAndFeel.getTheme().getSelectionBackgroundColor(); + Color fc = ColorHelper.darker(bc, 40); + g.setColor(fc); + g.drawRect(x + 3, y + 3, w - 6, h - 6); + g.setColor(bc); + g.fillRect(x + 4, y + 4, w - 7, h - 7); + } else if (model.isSelected()) { + if (button.isEnabled()) { + checkIcon.paintIcon(c, g, xi, yi); + } else { + checkDisabledIcon.paintIcon(c, g, xi, yi); + } + } + } + + public int getIconWidth() { + int w; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + w = 15; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + w = 17; + } else { + w = 19; + } + return w + GAP; + } + + public int getIconHeight() { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + return 15; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + return 17; + } else { + return 19; + } + } + } + +//----------------------------------------------------------------------------------------------------------- + private static class RadioButtonIcon implements Icon { + + private static int GAP = 2; + + public void paintIcon(Component c, Graphics g, int x, int y) { + if (!JTattooUtilities.isLeftToRight(c)) { + x += GAP; + } + int w = getIconWidth() - GAP; + int h = getIconHeight(); + Graphics2D g2D = (Graphics2D) g; + AbstractButton button = (AbstractButton) c; + ButtonModel model = button.getModel(); + Color cHi = Color.white; + Color cLo = Color.white; + if (!(c instanceof JRadioButtonMenuItem)) { + Color colors[]; + if (button.isEnabled()) { + if ((button.isRolloverEnabled() && model.isRollover()) || (model.isPressed() && model.isArmed())) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + colors = AbstractLookAndFeel.getTheme().getFocusColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getCheckBoxColors(); + } + } + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + cHi = colors[0]; + cLo = colors[colors.length - 1]; + } + Paint savedPaint = g2D.getPaint(); + g2D.setPaint(new GradientPaint(0, 0, cHi, 0, h, cLo)); + g2D.fillOval(x, y, w, h); + g2D.setPaint(savedPaint); + + Shape savedClip = g.getClip(); + //Area clipArea = new Area(new Ellipse2D.Double(x + 1, y + 1, w - 1, h - 1)); + Area clipArea = new Area(new Ellipse2D.Double(x, y, w + 1, h + 1)); + if (savedClip != null) { + clipArea.intersect(new Area(savedClip)); + } + g2D.setClip(clipArea); + if (c instanceof JRadioButtonMenuItem) { + g.setColor(Color.white); + g.fillRect(x, y, w, h); + } else { + if (button.isEnabled()) { + if ((button.isRolloverEnabled() && model.isRollover()) || (model.isPressed() && model.isArmed())) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getRolloverColors(), x, y, w, h); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getFocusColors(), x, y, w, h); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getCheckBoxColors(), x, y, w, h); + } + } + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getDisabledColors(), x, y, w, h); + } + } + g2D.setClip(savedClip); + + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (!model.isRollover()) { + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + g2D.setColor(Color.white); + g2D.drawOval(x + 1, y + 1, w - 2, h - 2); + g2D.setComposite(savedComposite); + } + if (button.isEnabled()) { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + Color hiColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getFocusFrameColor(), 30); + Color loColor = ColorHelper.darker(AbstractLookAndFeel.getTheme().getFocusFrameColor(), 20); + g.setColor(hiColor); + g.drawOval(x - 1, y - 1, w + 2, h + 2); + g.setColor(loColor); + g2D.drawOval(x, y, w, h); + } else { + g.setColor(AbstractLookAndFeel.getFrameColor()); + g2D.drawOval(x, y, w, h); + } + } else { + g.setColor(ColorHelper.brighter(AbstractLookAndFeel.getFrameColor(), 40)); + g2D.drawOval(x, y, w, h); + } + + if (model.isSelected()) { + if (button.isEnabled()) { + Color fc = AbstractLookAndFeel.getForegroundColor(); + if (ColorHelper.getGrayValue(cLo) < 128) { + if (ColorHelper.getGrayValue(fc) < 128) { + g2D.setColor(Color.white); + } else { + g2D.setColor(fc); + } + } else { + if (ColorHelper.getGrayValue(fc) > 128) { + g2D.setColor(Color.black); + } else { + g2D.setColor(fc); + } + } + } else { + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + } + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + g2D.fillOval(x + 4, y + 4, w - 7, h - 7); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + g2D.fillOval(x + 4, y + 4, w - 7, h - 7); + } else { + g2D.fillOval(x + 5, y + 5, w - 9, h - 9); + } + } + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } + + public int getIconWidth() { + int w; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + w = 14; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + w = 16; + } else { + w = 18; + } + return w + GAP; + } + + public int getIconHeight() { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + return 14; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + return 16; + } else { + return 18; + } + } + } + +//----------------------------------------------------------------------------------------------------------- + public static class MacCloseIcon implements Icon, UIResource { + + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton btn = (AbstractButton) c; + ButtonModel model = btn.getModel(); + int w = c.getWidth(); + int h = c.getHeight(); + Icon closerIcon; + Icon pearlIcon; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + closerIcon = CLOSER_SMALL; + pearlIcon = PEARL_RED_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + closerIcon = CLOSER_MEDIUM; + pearlIcon = PEARL_RED_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + closerIcon = CLOSER_LARGE; + pearlIcon = PEARL_RED_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + x = (w - pearlIcon.getIconWidth()) / 2; + y = (h - pearlIcon.getIconHeight()) / 2; + pearlIcon.paintIcon(c, g, x, y); + if (model.isRollover()) { + x += (pearlIcon.getIconWidth() - closerIcon.getIconWidth()) / 2; + y += (pearlIcon.getIconHeight() - closerIcon.getIconHeight()) / 2; + closerIcon.paintIcon(c, g, x, y); + } + } + + public int getIconHeight() { + return 24; + } + + public int getIconWidth() { + return 24; + } + } + + public static class MacIconIcon implements Icon, UIResource { + + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton btn = (AbstractButton) c; + ButtonModel model = btn.getModel(); + int w = c.getWidth(); + int h = c.getHeight(); + Icon iconizerIcon; + Icon pearlIcon; + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + iconizerIcon = ICONIZER_SMALL; + pearlIcon = PEARL_YELLOW_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + iconizerIcon = ICONIZER_MEDIUM; + pearlIcon = PEARL_YELLOW_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + iconizerIcon = ICONIZER_LARGE; + pearlIcon = PEARL_YELLOW_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + + } else { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + iconizerIcon = ICONIZER_SMALL; + pearlIcon = PEARL_GREEN_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + iconizerIcon = ICONIZER_MEDIUM; + pearlIcon = PEARL_GREEN_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + iconizerIcon = ICONIZER_LARGE; + pearlIcon = PEARL_GREEN_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + } + x = (w - pearlIcon.getIconWidth()) / 2; + y = (h - pearlIcon.getIconHeight()) / 2; + pearlIcon.paintIcon(c, g, x, y); + if (model.isRollover()) { + x += (pearlIcon.getIconWidth() - iconizerIcon.getIconWidth()) / 2; + y += (pearlIcon.getIconHeight() - iconizerIcon.getIconHeight()) / 2; + iconizerIcon.paintIcon(c, g, x, y); + } + } + + public int getIconHeight() { + return 24; + } + + public int getIconWidth() { + return 24; + } + } + + public static class MacMaxIcon implements Icon, UIResource { + + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton btn = (AbstractButton) c; + ButtonModel model = btn.getModel(); + int w = c.getWidth(); + int h = c.getHeight(); + Icon maximizerIcon; + Icon pearlIcon; + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + maximizerIcon = MAXIMIZER_SMALL; + pearlIcon = PEARL_GREEN_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + maximizerIcon = MAXIMIZER_MEDIUM; + pearlIcon = PEARL_GREEN_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + maximizerIcon = MAXIMIZER_LARGE; + pearlIcon = PEARL_GREEN_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + } else { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + maximizerIcon = MAXIMIZER_SMALL; + pearlIcon = PEARL_YELLOW_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + maximizerIcon = MAXIMIZER_MEDIUM; + pearlIcon = PEARL_YELLOW_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + maximizerIcon = MAXIMIZER_LARGE; + pearlIcon = PEARL_YELLOW_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + } + x = (w - pearlIcon.getIconWidth()) / 2; + y = (h - pearlIcon.getIconHeight()) / 2; + pearlIcon.paintIcon(c, g, x, y); + if (model.isRollover()) { + x += (pearlIcon.getIconWidth() - maximizerIcon.getIconWidth()) / 2; + y += (pearlIcon.getIconHeight() - maximizerIcon.getIconHeight()) / 2; + maximizerIcon.paintIcon(c, g, x, y); + } + } + + public int getIconHeight() { + return 24; + } + + public int getIconWidth() { + return 24; + } + } + + public static class MacMinIcon implements Icon, UIResource { + + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton btn = (AbstractButton) c; + ButtonModel model = btn.getModel(); + int w = c.getWidth(); + int h = c.getHeight(); + Icon minimizerIcon; + Icon pearlIcon; + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + minimizerIcon = MINIMIZER_SMALL; + pearlIcon = PEARL_GREEN_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + minimizerIcon = MINIMIZER_MEDIUM; + pearlIcon = PEARL_GREEN_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + minimizerIcon = MINIMIZER_LARGE; + pearlIcon = PEARL_GREEN_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + } else { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + minimizerIcon = MINIMIZER_SMALL; + pearlIcon = PEARL_YELLOW_SMALL; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_SMALL; + } + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + minimizerIcon = MINIMIZER_MEDIUM; + pearlIcon = PEARL_YELLOW_MEDIUM; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_MEDIUM; + } + } else { + minimizerIcon = MINIMIZER_LARGE; + pearlIcon = PEARL_YELLOW_LARGE; + if (!JTattooUtilities.isActive(btn)) { + pearlIcon = PEARL_GREY_LARGE; + } + } + } + x = (w - pearlIcon.getIconWidth()) / 2; + y = (h - pearlIcon.getIconHeight()) / 2; + pearlIcon.paintIcon(c, g, x, y); + if (model.isRollover()) { + x += (pearlIcon.getIconWidth() - minimizerIcon.getIconWidth()) / 2; + y += (pearlIcon.getIconHeight() - minimizerIcon.getIconHeight()) / 2; + minimizerIcon.paintIcon(c, g, x, y); + } + } + + public int getIconHeight() { + return 24; + } + + public int getIconWidth() { + return 24; + } + } + +//----------------------------------------------------------------------------------------------------------- + public static class IconSymbol implements Icon { + + private Color foregroundColor = null; + private Color shadowColor = null; + private Color inactiveForegroundColor = null; + private Color inactiveShadowColor = null; + private Color rolloverColor = null; + private Insets insets = new Insets(0, 0, 0, 0); + + public IconSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + } + + public IconSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + this.insets = insets; + } + + public IconSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Color inactiveForegroundColor, Color inactiveShadowColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = inactiveForegroundColor; + this.inactiveShadowColor = inactiveShadowColor; + this.insets = insets; + } + + public int getIconHeight() { + return 16; + } + + public int getIconWidth() { + return 16; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + g2D.translate(insets.left, insets.top); + int w = c.getWidth() - insets.left - insets.right; + int h = c.getHeight() - insets.top - insets.bottom; + boolean active = JTattooUtilities.isActive((JComponent) c); + Color color = foregroundColor; + if (!active) { + color = inactiveForegroundColor; + } + if (c instanceof AbstractButton) { + if (((AbstractButton) c).getModel().isRollover() && (rolloverColor != null)) { + color = rolloverColor; + } + } + //int lw = (w / 12) + 1; + int lw = (h > 22) ? 3 : 2; + + int dx = (w / 5) + 2; + int dy = dx; + + Stroke savedStroke = g2D.getStroke(); + g2D.setStroke(new BasicStroke(lw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); + if (shadowColor != null) { + if (!active) { + g2D.setColor(inactiveShadowColor); + } else { + g2D.setColor(shadowColor); + } + g2D.drawLine(dx + 1, h - dy, w - dx + 1, h - dy); + } + g2D.setColor(color); + g2D.drawLine(dx, h - dy - 1, w - dx, h - dy - 1); + g2D.setStroke(savedStroke); + g2D.translate(-insets.left, -insets.top); + } + } + +//----------------------------------------------------------------------------------------------------------- + public static class MaxSymbol implements Icon { + + private Color foregroundColor = null; + private Color shadowColor = null; + private Color rolloverColor = null; + private Color inactiveForegroundColor = null; + private Color inactiveShadowColor = null; + private Insets insets = new Insets(0, 0, 0, 0); + + public MaxSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + } + + public MaxSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + this.insets = insets; + } + + public MaxSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Color inactiveForegroundColor, Color inactiveShadowColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = inactiveForegroundColor; + this.inactiveShadowColor = inactiveShadowColor; + this.insets = insets; + } + + public int getIconHeight() { + return 16; + } + + public int getIconWidth() { + return 16; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + g2D.translate(insets.left, insets.top); + int w = c.getWidth() - insets.left - insets.right; + int h = c.getHeight() - insets.top - insets.bottom; + boolean active = JTattooUtilities.isActive((JComponent) c); + Color color = foregroundColor; + if (!active) { + color = inactiveForegroundColor; + } + if (c instanceof AbstractButton) { + if (((AbstractButton) c).getModel().isRollover() && (rolloverColor != null)) { + color = rolloverColor; + } + } + int lw = (h > 22) ? 2 : 1; + + int dx = (w / 5) + 1; + int dy = (h / 5) + 2; + + Stroke savedStroke = g2D.getStroke(); + g2D.setStroke(new BasicStroke(lw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); + if (shadowColor != null) { + if (!active) { + g2D.setColor(inactiveShadowColor); + } else { + g2D.setColor(shadowColor); + } + g2D.drawRect(dx + 1, dy + 1, w - (2 * dx), h - (2 * dy)); + g2D.drawLine(dx + 1, dy + lw + 1, w - dx, dy + lw + 1); + } + g2D.setColor(color); + g2D.drawRect(dx, dy, w - (2 * dx), h - (2 * dy)); + g2D.drawLine(dx + 1, dy + lw, w - dx, dy + lw); + + g2D.setStroke(savedStroke); + g2D.translate(-insets.left, -insets.top); + } + } + +//----------------------------------------------------------------------------------------------------------- + public static class MinSymbol implements Icon { + + private Color foregroundColor = null; + private Color shadowColor = null; + private Color rolloverColor = null; + private Color inactiveForegroundColor = null; + private Color inactiveShadowColor = null; + private Insets insets = new Insets(0, 0, 0, 0); + + public MinSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + } + + public MinSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + this.insets = insets; + } + + public MinSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Color inactiveForegroundColor, Color inactiveShadowColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = inactiveForegroundColor; + this.inactiveShadowColor = inactiveShadowColor; + this.insets = insets; + } + + public int getIconHeight() { + return 16; + } + + public int getIconWidth() { + return 16; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + g2D.translate(insets.left, insets.top); + int w = c.getWidth() - insets.left - insets.right; + int h = c.getHeight() - insets.top - insets.bottom; + + int lw = (h > 22) ? 2 : 1; + int delta = w / 4; + + w = Math.min(w, h) - 6; + h = w; + + int x1 = 3; + int y1 = 3; + int w1 = w - delta; + int h1 = h - delta; + + int x2 = delta + 2; + int y2 = Math.max(delta + 2, y1 + (2 * lw) + 1); + int w2 = w - delta; + int h2 = h - delta; + + boolean active = JTattooUtilities.isActive((JComponent) c); + Color ic = foregroundColor; + Color sc = shadowColor; + if (!active) { + ic = inactiveForegroundColor; + if (sc != null) { + sc = inactiveShadowColor; + } + } + if (c instanceof AbstractButton) { + if (((AbstractButton) c).getModel().isRollover() && (rolloverColor != null)) { + ic = rolloverColor; + } + } + + Shape savedClip = g2D.getClip(); + Stroke savedStroke = g2D.getStroke(); + g2D.setStroke(new BasicStroke(lw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); + Area clipArea = new Area(savedClip); + clipArea.subtract(new Area(new Rectangle2D.Double(x2, y2, w2, h2))); + g2D.setClip(clipArea); + paintRect(g2D, x1, y1, w1, h1, lw, ic, sc); + g2D.setClip(savedClip); + paintRect(g2D, x2, y2, w2, h2, lw, ic, sc); + + g2D.setStroke(savedStroke); + g2D.translate(-insets.left, -insets.top); + } + + private void paintRect(Graphics2D g2D, int x, int y, int w, int h, int lw, Color iconColor, Color shadowColor) { + if (shadowColor != null) { + g2D.setColor(shadowColor); + g2D.drawRect(x + 1, y + 1, w, h); + g2D.drawLine(x + 1, y + lw + 1, x + w + 1, y + lw + 1); + } + g2D.setColor(iconColor); + g2D.drawRect(x, y, w, h); + g2D.drawLine(x, y + lw, x + w, y + lw); + + } + } + +//----------------------------------------------------------------------------------------------------------- + public static class CloseSymbol implements Icon { + + private Color foregroundColor = null; + private Color shadowColor = null; + private Color rolloverColor = null; + private Color inactiveForegroundColor = null; + private Color inactiveShadowColor = null; + private Insets insets = new Insets(0, 0, 0, 0); + + public CloseSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + } + + public CloseSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.insets = insets; + this.inactiveForegroundColor = foregroundColor; + this.inactiveShadowColor = shadowColor; + } + + public CloseSymbol(Color foregroundColor, Color shadowColor, Color rolloverColor, Color inactiveForegroundColor, Color inactiveShadowColor, Insets insets) { + this.foregroundColor = foregroundColor; + this.shadowColor = shadowColor; + this.rolloverColor = rolloverColor; + this.inactiveForegroundColor = inactiveForegroundColor; + this.inactiveShadowColor = inactiveShadowColor; + this.insets = insets; + } + + public int getIconHeight() { + return 16; + } + + public int getIconWidth() { + return 16; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + g2D.translate(insets.left, insets.top); + int w = c.getWidth() - insets.left - insets.right; + int h = c.getHeight() - insets.top - insets.bottom; + boolean active = JTattooUtilities.isActive((JComponent) c); + Color color = foregroundColor; + if (!active) { + color = inactiveForegroundColor; + } + if (c instanceof AbstractButton) { + if (((AbstractButton) c).getModel().isRollover() && (rolloverColor != null)) { + color = rolloverColor; + } + } + //int lw = (w / 12) + 1; + int lw = (h > 22) ? 3 : 2; + int dx = (w / 5) + 2; + int dy = dx; + + Stroke savedStroke = g2D.getStroke(); + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + g2D.setStroke(new BasicStroke(lw, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); + if (shadowColor != null) { + if (!active) { + g2D.setColor(inactiveShadowColor); + } else { + g2D.setColor(shadowColor); + } + g2D.drawLine(dx + 1, dy + 1, w - dx + 1, h - dy + 1); + g2D.drawLine(w - dx + 1, dy + 1, dx + 1, h - dy + 1); + } + g2D.setColor(color); + g2D.drawLine(dx, dy, w - dx, h - dy); + g2D.drawLine(w - dx, dy, dx, h - dy); + + g2D.setStroke(savedStroke); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + g2D.translate(-insets.left, -insets.top); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseInternalFrameTitlePane.java b/src/com/jtattoo/plaf/BaseInternalFrameTitlePane.java new file mode 100644 index 0000000..28a1cc9 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseInternalFrameTitlePane.java @@ -0,0 +1,516 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.plaf.basic.BasicInternalFrameTitlePane; + +/** + * This class is a modified copy of the javax.swing.plaf.metal.MetalInternalFrameTitlePane + * + * Class that manages a JLF title bar

+ * + * @author Steve Wilson + * @author Brian Beck + * @author Michael Hagen + */ +public class BaseInternalFrameTitlePane extends BasicInternalFrameTitlePane implements ActionListener { + + public static final String PAINT_ACTIVE = "paintActive"; + public static final String ICONIFY = "Iconify"; + public static final String MAXIMIZE = "Maximize"; + public static final String CLOSE = "Close"; + protected boolean isPalette = false; + protected Icon paletteCloseIcon; + protected int paletteTitleHeight; + protected int buttonsWidth = 0; + protected JPanel customTitlePanel; + + public BaseInternalFrameTitlePane(JInternalFrame f) { + super(f); + } + + protected void installDefaults() { + super.installDefaults(); + setFont(UIManager.getFont("InternalFrame.font")); + paletteTitleHeight = UIManager.getInt("InternalFrame.paletteTitleHeight"); + paletteCloseIcon = UIManager.getIcon("InternalFrame.paletteCloseIcon"); + iconIcon = UIManager.getIcon("InternalFrame.iconifyIcon"); + minIcon = UIManager.getIcon("InternalFrame.minimizeIcon"); + maxIcon = UIManager.getIcon("InternalFrame.maximizeIcon"); + closeIcon = UIManager.getIcon("InternalFrame.closeIcon"); + if (frame.getClientProperty("customTitlePanel") instanceof JPanel) { + setCustomizedTitlePanel((JPanel)frame.getClientProperty("customTitlePanel")); + } + } + + public void setCustomizedTitlePanel(JPanel panel) { + if (customTitlePanel != null) { + remove(customTitlePanel); + customTitlePanel = null; + } + if (panel != null) { + customTitlePanel = panel; + add(customTitlePanel); + } + frame.putClientProperty("customTitlePanel", customTitlePanel); + revalidate(); + repaint(); + } + + protected void createButtons() { + iconButton = new BaseTitleButton(iconifyAction, ICONIFY, iconIcon, 1.0f); + maxButton = new BaseTitleButton(maximizeAction, MAXIMIZE, maxIcon, 1.0f); + closeButton = new BaseTitleButton(closeAction, CLOSE, closeIcon, 1.0f); + setButtonIcons(); + } + + protected void setButtonIcons() { + super.setButtonIcons(); + iconButton.setToolTipText(null); + maxButton.setToolTipText(null); + closeButton.setToolTipText(null); + } + + protected void enableActions() { + super.enableActions(); + maximizeAction.setEnabled(frame.isMaximizable()); + } + + protected void assembleSystemMenu() { + } + + protected void addSystemMenuItems(JMenu systemMenu) { + } + + protected void addSubComponents() { + add(iconButton); + add(maxButton); + add(closeButton); + } + + protected PropertyChangeListener createPropertyChangeListener() { + return new BasePropertyChangeHandler(); + } + + protected LayoutManager createLayout() { + return new BaseTitlePaneLayout(); + } + + protected int getHorSpacing() { + return 3; + } + + protected int getVerSpacing() { + return 3; + } + + protected boolean centerButtons() { + return true; + } + + public void activateFrame() { + } + + public void deactivateFrame() { + } + + protected boolean isMacStyleWindowDecoration() { + return AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn(); + } + + public boolean isActive() { + return JTattooUtilities.isActive(this); + } + + public boolean isPalette() { + return isPalette; + } + + public void setPalette(boolean b) { + isPalette = b; + if (isPalette) { + closeButton.setIcon(paletteCloseIcon); + if (frame.isMaximizable()) { + remove(maxButton); + } + if (frame.isIconifiable()) { + remove(iconButton); + } + } else { + closeButton.setIcon(closeIcon); + if (frame.isMaximizable()) { + add(maxButton); + } + if (frame.isIconifiable()) { + add(iconButton); + } + } + revalidate(); + repaint(); + } + + public void actionPerformed(ActionEvent e) { + AbstractButton button = (AbstractButton) e.getSource(); + button.getModel().setRollover(false); + } + + public void paintPalette(Graphics g) { + int width = getWidth(); + int height = getHeight(); + if (JTattooUtilities.isFrameActive(this)) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowTitleColors(), 0, 0, width, height); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors(), 0, 0, width, height); + } + } + + public void paintBackground(Graphics g) { + if (isActive()) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowTitleColors(), 0, 0, getWidth(), getHeight()); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors(), 0, 0, getWidth(), getHeight()); + } + } + + private Image iconToImage(Icon icon) { + if (icon instanceof ImageIcon) { + return ((ImageIcon) icon).getImage(); + } else if (icon != null) { + int w = icon.getIconWidth(); + int h = icon.getIconHeight(); + BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); + icon.paintIcon(null, g, 0, 0); + g.dispose(); + return image; + } + return null; + } + + protected int getIconWidth() { + Image image = iconToImage(frame.getFrameIcon()); + if (image != null) { + int h = getHeight(); + int ih = image.getHeight(null); + int iw = image.getWidth(null); + if (ih > h) { + double fac = (double) iw / (double) ih; + ih = h - 1; + iw = (int) (fac * (double) ih); + } + return iw; + } + return 0; + } + + protected int paintIcon(Graphics g, int x) { + Image image = iconToImage(frame.getFrameIcon()); + if (image != null) { + Graphics2D g2D = (Graphics2D)g; + Object savedHint = g2D.getRenderingHint(RenderingHints.KEY_INTERPOLATION); + if (JTattooUtilities.getJavaVersion() >= 1.6) { + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + } + int h = getHeight(); + int ih = image.getHeight(null); + int iw = image.getWidth(null); + if (ih <= h) { + g2D.drawImage(image, x, (h - ih) / 2, iw, ih, null); + } else { + double fac = (double) iw / (double) ih; + ih = h; + iw = (int) (fac * (double) ih); + g2D.drawImage(image, x, 0, iw, ih, null); + } + if (savedHint != null) { + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, savedHint); + } + return iw; + } + return 0; + } + + public void paintText(Graphics g, int x, int y, String title) { + if (isActive()) { + g.setColor(AbstractLookAndFeel.getWindowTitleForegroundColor()); + } else { + g.setColor(AbstractLookAndFeel.getWindowInactiveTitleForegroundColor()); + } + JTattooUtilities.drawString(frame, g, title, x, y); + } + + public void paintBorder(Graphics g) { + Color borderColor = AbstractLookAndFeel.getWindowInactiveBorderColor(); + if (isActive() || isPalette) { + borderColor = AbstractLookAndFeel.getWindowBorderColor(); + } + JTattooUtilities.draw3DBorder(g, ColorHelper.brighter(borderColor, 20), ColorHelper.darker(borderColor, 10), 0, 0, getWidth(), getHeight()); + } + + public void paintComponent(Graphics g) { + if (isPalette) { + paintPalette(g); + return; + } + + paintBackground(g); + + g.setFont(getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(this, g, getFont()); + int width = getWidth(); + int height = getHeight(); + int x = 0; + int y = ((height - fm.getHeight()) / 2) + fm.getAscent(); + int titleWidth = width - buttonsWidth - 4; + String frameTitle = frame.getTitle(); + if (JTattooUtilities.isLeftToRight(frame)) { + if (isMacStyleWindowDecoration()) { + int iconWidth = getIconWidth(); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + x += buttonsWidth + ((titleWidth - titleLength) / 2); + paintIcon(g, x); + x += iconWidth + 4; + } else { + int iconWidth = paintIcon(g, x); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + int titleLength = fm.stringWidth(frameTitle); + x += iconWidth + 4; + x += (titleWidth - titleLength) / 2; + } else { + x += iconWidth + 4; + } + } + } else { + int iconWidth = getIconWidth(); + if (isMacStyleWindowDecoration()) { + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + x = buttonsWidth + 4 + ((titleWidth - titleLength) / 2); + paintIcon(g, x + titleLength + 4); + } else { + x = width - iconWidth; + paintIcon(g, x); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + x = buttonsWidth + 4 + ((titleWidth - titleLength) / 2); + } else { + x = width - iconWidth - 4 - titleLength; + } + } + } + paintText(g, x, y, frameTitle); + + paintBorder(g); + } + + class BasePropertyChangeHandler extends BasicInternalFrameTitlePane.PropertyChangeHandler { + + public void propertyChange(PropertyChangeEvent evt) { + String prop = (String) evt.getPropertyName(); + if (prop.equals(JInternalFrame.IS_SELECTED_PROPERTY)) { + Boolean b = (Boolean) evt.getNewValue(); + iconButton.putClientProperty(PAINT_ACTIVE, b); + closeButton.putClientProperty(PAINT_ACTIVE, b); + maxButton.putClientProperty(PAINT_ACTIVE, b); + if (b.booleanValue()) { + activateFrame(); + } else { + deactivateFrame(); + } + repaint(); + } + super.propertyChange(evt); + } + } + +//------------------------------------------------------------------------------ +// inner classes +//------------------------------------------------------------------------------ + class BaseTitlePaneLayout extends TitlePaneLayout { + + public void addLayoutComponent(String name, Component c) { + } + + public void removeLayoutComponent(Component c) { + } + + public Dimension preferredLayoutSize(Container c) { + return minimumLayoutSize(c); + } + + public Dimension minimumLayoutSize(Container c) { + int width = 30; + if (frame.isClosable()) { + width += 21; + } + if (frame.isMaximizable()) { + width += 16 + (frame.isClosable() ? 10 : 4); + } + if (frame.isIconifiable()) { + width += 16 + (frame.isMaximizable() ? 2 : (frame.isClosable() ? 10 : 4)); + } + FontMetrics fm = JTattooUtilities.getFontMetrics(BaseInternalFrameTitlePane.this, null, getFont()); + String frameTitle = frame.getTitle(); + int title_w = frameTitle != null ? fm.stringWidth(frameTitle) : 0; + int title_length = frameTitle != null ? frameTitle.length() : 0; + + if (title_length > 2) { + int subtitle_w = fm.stringWidth(frame.getTitle().substring(0, 2) + "..."); + width += (title_w < subtitle_w) ? title_w : subtitle_w; + } else { + width += title_w; + } + + int height = paletteTitleHeight; + if (!isPalette) { + Icon icon = isMacStyleWindowDecoration() ? null : frame.getFrameIcon(); + if (icon == null) { + height = Math.max(fm.getHeight() + 6, 16); + } else { + height = Math.max(fm.getHeight() + 6, Math.min(icon.getIconHeight(), 24)); + } + } + return new Dimension(width, height); + } + + public void layoutContainer(Container c) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + layoutMacStyle(c); + } else { + layoutDefault(c); + } + } + + public void layoutDefault(Container c) { + boolean leftToRight = JTattooUtilities.isLeftToRight(frame); + + int spacing = getHorSpacing(); + int w = getWidth(); + int h = getHeight(); + + // assumes all buttons have the same dimensions these dimensions include the borders + int btnHeight = h - getVerSpacing(); + int btnWidth = btnHeight; + + int x = leftToRight ? w - spacing : 0; + int y = Math.max(0, ((h - btnHeight) / 2) - 1); + + if (frame.isClosable()) { + x += leftToRight ? -btnWidth : spacing; + closeButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + + if (frame.isMaximizable() && !isPalette) { + x += leftToRight ? -spacing - btnWidth : spacing; + maxButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + + if (frame.isIconifiable() && !isPalette) { + x += leftToRight ? -spacing - btnWidth : spacing; + iconButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + + buttonsWidth = leftToRight ? w - x : x; + + if (customTitlePanel != null) { + int maxWidth = w - buttonsWidth - spacing - 20; + Icon icon = frame.getFrameIcon(); + if (icon != null) { + maxWidth -= icon.getIconWidth(); + maxWidth -= spacing; + } + int cpw = Math.min(maxWidth, customTitlePanel.getPreferredSize().width); + int cph = h; + int cpx = leftToRight ? w - buttonsWidth - cpw : buttonsWidth; + int cpy = 0; + customTitlePanel.setBounds(cpx, cpy, cpw, cph); + buttonsWidth += customTitlePanel.getPreferredSize().width; + } + } + + private void layoutMacStyle(Container c) { + int spacing = getHorSpacing(); + int h = getHeight(); + + // assumes all buttons have the same dimensions these dimensions include the borders + int btnHeight = h - getVerSpacing() - 1; + int btnWidth = btnHeight; + + int x = 2; + int y = centerButtons() ? Math.max(0, ((h - btnHeight) / 2)) : 0; + + if (frame.isClosable()) { + closeButton.setBounds(x, y, btnWidth, btnHeight); + x += spacing + btnWidth; + } + if (frame.isIconifiable() && !isPalette) { + iconButton.setBounds(x, y, btnWidth, btnHeight); + x += spacing + btnWidth; + } + if (frame.isMaximizable() && !isPalette) { + maxButton.setBounds(x, y, btnWidth, btnHeight); + x += spacing + btnWidth; + } + + buttonsWidth = x; + + if (customTitlePanel != null) { + int cpx = buttonsWidth + 5; + int cpy = 0; + int cpw = customTitlePanel.getPreferredSize().width; + int cph = h; + customTitlePanel.setBounds(cpx, cpy, cpw, cph); + buttonsWidth += cpw + 5; + } + } + } // end class BaseTitlePaneLayout +} \ No newline at end of file diff --git a/src/com/jtattoo/plaf/BaseInternalFrameUI.java b/src/com/jtattoo/plaf/BaseInternalFrameUI.java new file mode 100644 index 0000000..cda0500 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseInternalFrameUI.java @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + * + * JTattoo is multiple licensed. If your are an open source developer you can use + * it under the terms and conditions of the GNU General Public License version 2.0 + * or later as published by the Free Software Foundation. + * + * see: gpl-2.0.txt + * + * If you pay for a license you will become a registered user who could use the + * software under the terms and conditions of the GNU Lesser General Public License + * version 2.0 or later with classpath exception as published by the Free Software + * Foundation. + * + * see: lgpl-2.0.txt + * see: classpath-exception.txt + * + * Registered users could also use JTattoo under the terms and conditions of the + * Apache License, Version 2.0 as published by the Apache Software Foundation. + * + * see: APACHE-LICENSE-2.0.txt + */ +package com.jtattoo.plaf; + +import java.awt.Container; +import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicInternalFrameUI; + +public class BaseInternalFrameUI extends BasicInternalFrameUI { + + private static final PropertyChangeListener MY_PROPERTY_CHANGE_HANDLER = new MyPropertyChangeHandler(); + private static final WindowAdapter MY_WINDOW_HANDLER = new MyWindowHandler(); + + private static final Border HANDY_EMPTY_BORDER = new EmptyBorder(0, 0, 0, 0); + + private static final String IS_PALETTE = "JInternalFrame.isPalette"; + private static final String FRAME_TYPE = "JInternalFrame.frameType"; + private static final String FRAME_BORDER = "InternalFrame.border"; + private static final String FRAME_PALETTE_BORDER = "InternalFrame.paletteBorder"; + private static final String PALETTE_FRAME = "palette"; + + public BaseInternalFrameUI(JInternalFrame b) { + super(b); + } + + public static ComponentUI createUI(JComponent c) { + return new BaseInternalFrameUI((JInternalFrame) c); + } + + public void installUI(JComponent c) { + super.installUI(c); + Object paletteProp = c.getClientProperty(IS_PALETTE); + if (paletteProp != null) { + setPalette(((Boolean) paletteProp).booleanValue()); + } + stripContentBorder(); + } + + public void uninstallUI(JComponent c) { + Container cp = frame.getContentPane(); + if (cp instanceof JComponent) { + JComponent contentPane = (JComponent) cp; + if (contentPane.getBorder() == HANDY_EMPTY_BORDER) { + contentPane.setBorder(null); + } + } + super.uninstallUI(c); + } + + protected void installDefaults() { + super.installDefaults(); + Icon frameIcon = frame.getFrameIcon(); + if (frameIcon == null || frameIcon instanceof LazyImageIcon) { + frame.setFrameIcon(UIManager.getIcon("InternalFrame.icon")); + } + } + + protected void installListeners() { + super.installListeners(); + frame.addPropertyChangeListener(MY_PROPERTY_CHANGE_HANDLER); + } + + protected void uninstallListeners() { + frame.removePropertyChangeListener(MY_PROPERTY_CHANGE_HANDLER); + super.uninstallListeners(); + } + + protected void uninstallComponents() { + titlePane = null; + super.uninstallComponents(); + } + + public void stripContentBorder() { + Container cp = frame.getContentPane(); + if (cp instanceof JComponent) { + JComponent contentPane = (JComponent) cp; + Border contentBorder = contentPane.getBorder(); + if (contentBorder == null || contentBorder instanceof UIResource) { + contentPane.setBorder(HANDY_EMPTY_BORDER); + } + } + } + + protected JComponent createNorthPane(JInternalFrame w) { + return new BaseInternalFrameTitlePane(w); + } + + public BaseInternalFrameTitlePane getTitlePane() { + return (BaseInternalFrameTitlePane) titlePane; + } + + public void setPalette(boolean isPalette) { + if (isPalette) { + frame.setBorder(UIManager.getBorder(FRAME_PALETTE_BORDER)); + } else { + frame.setBorder(UIManager.getBorder(FRAME_BORDER)); + } + getTitlePane().setPalette(isPalette); + } + +//----------------------------------------------------------------------------- +// inner classes +//----------------------------------------------------------------------------- + private static class MyPropertyChangeHandler implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + JInternalFrame jif = (JInternalFrame) e.getSource(); + if (!(jif.getUI() instanceof BaseInternalFrameUI)) { + return; + } + + BaseInternalFrameUI ui = (BaseInternalFrameUI) jif.getUI(); + String name = e.getPropertyName(); + if (name.equals(FRAME_TYPE)) { + if (e.getNewValue() instanceof String) { + if (PALETTE_FRAME.equals(e.getNewValue())) { + LookAndFeel.installBorder(ui.frame, FRAME_PALETTE_BORDER); + ui.setPalette(true); + } else { + LookAndFeel.installBorder(ui.frame, FRAME_BORDER); + ui.setPalette(false); + } + } + } else if (name.equals(IS_PALETTE)) { + if (e.getNewValue() != null) { + ui.setPalette(((Boolean) e.getNewValue()).booleanValue()); + } else { + ui.setPalette(false); + } + } else if (name.equals(JInternalFrame.CONTENT_PANE_PROPERTY)) { + ui.stripContentBorder(); + } else if (name.equals("ancestor") && !AbstractLookAndFeel.isWindowDecorationOn()) { + if (e.getNewValue() instanceof JDesktopPane) { + JDesktopPane jp = (JDesktopPane)e.getNewValue(); + Window window = SwingUtilities.getWindowAncestor(jp); + if (window != null) { + WindowListener wl[] = window.getWindowListeners(); + boolean doAdd = true; + for (int i = 0; i < wl.length; i++) { + if (wl[i].equals(MY_WINDOW_HANDLER)) { + doAdd = false; + break; + } + } + if (doAdd) { + window.addWindowListener(MY_WINDOW_HANDLER); + } + } + } else if (e.getOldValue() instanceof JDesktopPane) { + JDesktopPane jp = (JDesktopPane)e.getOldValue(); + Window window = SwingUtilities.getWindowAncestor(jp); + if (window != null) { + window.removeWindowListener(MY_WINDOW_HANDLER); + } + } + } + } + } // end class MyPropertyChangeHandler + +//----------------------------------------------------------------------------- + private static class MyWindowHandler extends WindowAdapter { + + public void windowActivated(WindowEvent e) { + e.getWindow().invalidate(); + e.getWindow().repaint(); + } + + public void windowDeactivated(WindowEvent e) { + e.getWindow().invalidate(); + e.getWindow().repaint(); + } + } // end class MyWindowHandler +} diff --git a/src/com/jtattoo/plaf/BaseLabelUI.java b/src/com/jtattoo/plaf/BaseLabelUI.java new file mode 100644 index 0000000..7db65b2 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseLabelUI.java @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicLabelUI; + +/** + * @author Michael Hagen + */ +public class BaseLabelUI extends BasicLabelUI { + + private static BaseLabelUI baseLabelUI = null; + + public static ComponentUI createUI(JComponent c) { + if (baseLabelUI == null) { + baseLabelUI = new BaseLabelUI(); + } + return baseLabelUI; + } + + protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int mnemIndex; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = l.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(l.getText(), l.getDisplayedMnemonic()); + } + Object sc = l.getClientProperty("shadowColor"); + if (sc instanceof Color) { + g.setColor((Color)sc); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX, textY + 1); + } + g.setColor(l.getForeground()); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX, textY); + } + + protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int mnemIndex; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = l.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(l.getText(), l.getDisplayedMnemonic()); + } + g.setColor(Color.white); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX + 1, textY + 1); + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX, textY); + } +} + diff --git a/src/com/jtattoo/plaf/BaseMenuBarUI.java b/src/com/jtattoo/plaf/BaseMenuBarUI.java new file mode 100644 index 0000000..cde711d --- /dev/null +++ b/src/com/jtattoo/plaf/BaseMenuBarUI.java @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicMenuBarUI; + +/** + * @author Michael Hagen + */ +public class BaseMenuBarUI extends BasicMenuBarUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseMenuBarUI(); + } + + public void paint(Graphics g, JComponent c) { + int w = c.getWidth(); + int h = c.getHeight(); + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getMenuBarColors(), 0, 0, w, h); + } +} \ No newline at end of file diff --git a/src/com/jtattoo/plaf/BaseMenuItemUI.java b/src/com/jtattoo/plaf/BaseMenuItemUI.java new file mode 100644 index 0000000..c1b6112 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseMenuItemUI.java @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicMenuItemUI; + +/** + * @author Michael Hagen + */ +public class BaseMenuItemUI extends BasicMenuItemUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseMenuItemUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + c.setOpaque(false); + } + + public void uninstallUI(JComponent c) { + c.setOpaque(true); + super.uninstallUI(c); + } + + public void update(Graphics g, JComponent c) { + paintBackground(g, c, 0, 0, c.getWidth(), c.getHeight()); + paint(g, c); + } + + protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { + if (menuItem.isOpaque()) { + int w = menuItem.getWidth(); + int h = menuItem.getHeight(); + paintBackground(g, menuItem, 0, 0, w, h); + } + } + + protected void paintBackground(Graphics g, JComponent c, int x, int y, int w, int h) { + JMenuItem mi = (JMenuItem) c; + Color backColor = mi.getBackground(); + if (backColor == null || backColor instanceof UIResource) { + backColor = AbstractLookAndFeel.getMenuBackgroundColor(); + } + + ButtonModel model = mi.getModel(); + if (model.isArmed() || model.isRollover() || (c instanceof JMenu && model.isSelected())) { + g.setColor(AbstractLookAndFeel.getMenuSelectionBackgroundColor()); + g.fillRect(x, y, w, h); + g.setColor(AbstractLookAndFeel.getMenuSelectionForegroundColor()); + } else if (!AbstractLookAndFeel.getTheme().isMenuOpaque()) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, AbstractLookAndFeel.getTheme().getMenuAlpha()); + g2D.setComposite(alpha); + g2D.setColor(backColor); + g2D.fillRect(x, y, w, h); + g2D.setComposite(savedComposite); + g.setColor(AbstractLookAndFeel.getMenuForegroundColor()); + } else { + g.setColor(backColor); + g.fillRect(x, y, w, h); + g.setColor(AbstractLookAndFeel.getMenuForegroundColor()); + } + } + + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + Color foreColor = menuItem.getForeground(); + if (model.isArmed() || model.isRollover()) { + foreColor = AbstractLookAndFeel.getMenuSelectionForegroundColor(); + } else if (foreColor == null || foreColor instanceof UIResource) { + foreColor = AbstractLookAndFeel.getMenuForegroundColor(); + } + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + g2D.setColor(foreColor); + super.paintText(g, menuItem, textRect, text); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseMenuUI.java b/src/com/jtattoo/plaf/BaseMenuUI.java new file mode 100644 index 0000000..ecd4a5a --- /dev/null +++ b/src/com/jtattoo/plaf/BaseMenuUI.java @@ -0,0 +1,182 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.MouseEvent; +import javax.swing.*; +import javax.swing.event.MouseInputListener; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicMenuUI; + +/** + * @author Michael Hagen + */ +public class BaseMenuUI extends BasicMenuUI { + + protected boolean paintRolloverBorder = true; + + public static ComponentUI createUI(JComponent c) { + return new BaseMenuUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + c.setOpaque(false); + } + + public void uninstallUI(JComponent c) { + c.setOpaque(true); + super.uninstallUI(c); + } + + public void update(Graphics g, JComponent c) { + paintBackground(g, c, 0, 0, c.getWidth(), c.getHeight()); + paint(g, c); + } + + protected void installDefaults() { + super.installDefaults(); + Boolean isRolloverEnabled = (Boolean)UIManager.get("MenuBar.rolloverEnabled"); + if (isRolloverEnabled.booleanValue()) { + menuItem.setRolloverEnabled(true); + } + } + + protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { + if (menuItem.isOpaque()) { + int w = menuItem.getWidth(); + int h = menuItem.getHeight(); + paintBackground(g, menuItem, 0, 0, w, h); + } + } + + protected void paintBackground(Graphics g, JComponent c, int x, int y, int w, int h) { + JMenuItem mi = (JMenuItem) c; + Color backColor = mi.getBackground(); + if (backColor == null || backColor instanceof UIResource) { + backColor = AbstractLookAndFeel.getMenuBackgroundColor(); + } + ButtonModel model = mi.getModel(); + if (c.getParent() instanceof JMenuBar) { + if (model.isRollover() || model.isArmed() || (c instanceof JMenu && model.isSelected())) { + backColor = AbstractLookAndFeel.getMenuSelectionBackgroundColor(); + if (model.isRollover()) { + backColor = ColorHelper.brighter(backColor, 10); + } + g.setColor(backColor); + g.fillRect(x, y, w, h); + if (paintRolloverBorder && model.isRollover() && !model.isSelected()) { + backColor = ColorHelper.darker(backColor, 20); + g.setColor(backColor); + g.drawRect(x, y, w - 1, h - 1); + } + g.setColor(AbstractLookAndFeel.getMenuSelectionForegroundColor()); + } + } else { + if (model.isArmed() || model.isRollover() || (c instanceof JMenu && model.isSelected())) { + g.setColor(AbstractLookAndFeel.getMenuSelectionBackgroundColor()); + g.fillRect(x, y, w, h); + g.setColor(AbstractLookAndFeel.getMenuSelectionForegroundColor()); + } else if (!AbstractLookAndFeel.getTheme().isMenuOpaque()) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, AbstractLookAndFeel.getTheme().getMenuAlpha()); + g2D.setComposite(alpha); + g2D.setColor(backColor); + g2D.fillRect(x, y, w, h); + g2D.setComposite(savedComposite); + g2D.setColor(AbstractLookAndFeel.getMenuForegroundColor()); + } else { + g.setColor(backColor); + g.fillRect(x, y, w, h); + g.setColor(AbstractLookAndFeel.getMenuForegroundColor()); + } + } + } + + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + if (menuItem.getParent() instanceof JMenuBar) { + if (model.isRollover() || model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { + g.setColor(AbstractLookAndFeel.getMenuSelectionForegroundColor()); + } + } else if (model.isArmed() || model.isRollover()) { + g.setColor(AbstractLookAndFeel.getMenuSelectionForegroundColor()); + } else { + Color foreColor = menuItem.getForeground(); + if (foreColor instanceof UIResource) { + foreColor = AbstractLookAndFeel.getMenuForegroundColor(); + } + g.setColor(foreColor); + } + super.paintText(g, menuItem, textRect, text); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + + protected MouseInputListener createMouseInputListener(JComponent c) { + if (JTattooUtilities.getJavaVersion() >= 1.5) { + return new MyMouseInputHandler(); + } else { + return super.createMouseInputListener(c); + } + } + +//------------------------------------------------------------------------------ +// inner classes +//------------------------------------------------------------------------------ + + protected class MyMouseInputHandler extends BasicMenuUI.MouseInputHandler { + + public void mouseEntered(MouseEvent evt) { + super.mouseEntered(evt); + + JMenu menu = (JMenu) evt.getSource(); + if (menu.isTopLevelMenu() && menu.isRolloverEnabled()) { + menu.getModel().setRollover(true); + menuItem.repaint(); + } + } + + public void mouseExited(MouseEvent evt) { + super.mouseExited(evt); + + JMenu menu = (JMenu) evt.getSource(); + ButtonModel model = menu.getModel(); + if (menu.isRolloverEnabled()) { + model.setRollover(false); + menuItem.repaint(); + } + } + } +} diff --git a/src/com/jtattoo/plaf/BasePanelUI.java b/src/com/jtattoo/plaf/BasePanelUI.java new file mode 100644 index 0000000..f5a9cb2 --- /dev/null +++ b/src/com/jtattoo/plaf/BasePanelUI.java @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.lang.reflect.Field; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicPanelUI; + +/** + * @author Michael Hagen + */ +public class BasePanelUI extends BasicPanelUI { + + private static BasePanelUI panelUI = null; + + public static ComponentUI createUI(JComponent c) { + if (panelUI == null) { + panelUI = new BasePanelUI(); + } + return panelUI; + } + + protected void installDefaults(JPanel p) { + super.installDefaults(p); + p.setFont(AbstractLookAndFeel.getTheme().getControlTextFont()); + + // We don't want medium weight popups for tool tips, so we try to force heavy weight popups. + try { + Field field; + if (JTattooUtilities.getJavaVersion() < 1.7) { + Class clazz = Class.forName("javax.swing.PopupFactory"); + field = clazz.getDeclaredField("forceHeavyWeightPopupKey"); + field.setAccessible(true); + p.putClientProperty(field.get(null), Boolean.TRUE); + } else if (JTattooUtilities.getJavaVersion() < 1.10) { // 1.7, 1.8 and 1.9 + Class clazz = Class.forName("javax.swing.ClientPropertyKey"); + field = clazz.getDeclaredField("PopupFactory_FORCE_HEAVYWEIGHT_POPUP"); + field.setAccessible(true); + p.putClientProperty(field.get(null), Boolean.TRUE); + } + } catch(Exception ex) { + } + } + + public void update(Graphics g, JComponent c) { + if (c.isOpaque()) { + Object backgroundTexture = c.getClientProperty("backgroundTexture"); + if (backgroundTexture instanceof Icon) { + JTattooUtilities.fillComponent(g, c, (Icon)backgroundTexture); + } else { + g.setColor(c.getBackground()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + } + + public void paint(Graphics g, JComponent c) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + super.paint(g, c); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } +} diff --git a/src/com/jtattoo/plaf/BasePasswordFieldUI.java b/src/com/jtattoo/plaf/BasePasswordFieldUI.java new file mode 100644 index 0000000..9c722e8 --- /dev/null +++ b/src/com/jtattoo/plaf/BasePasswordFieldUI.java @@ -0,0 +1,124 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicPasswordFieldUI; +import javax.swing.text.DefaultEditorKit; + +/** + * @author Michael Hagen + */ +public class BasePasswordFieldUI extends BasicPasswordFieldUI { + + private Border orgBorder = null; + private FocusListener focusListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BasePasswordFieldUI(); + } + + @SuppressWarnings("deprecation") + protected void installKeyboardActions() { + super.installKeyboardActions(); + if (JTattooUtilities.isMac()) { + InputMap im = (InputMap) UIManager.get("TextField.focusInputMap"); + int commandKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, commandKey), DefaultEditorKit.copyAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, commandKey), DefaultEditorKit.pasteAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, commandKey), DefaultEditorKit.cutAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.nextWordAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.previousWordAction); + } + } + + protected void installListeners() { + super.installListeners(); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (getComponent() != null) { + orgBorder = getComponent().getBorder(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel && orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder(); + getComponent().setBorder(focusBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + + public void focusLost(FocusEvent e) { + if (getComponent() != null) { + if (orgBorder instanceof UIResource) { + getComponent().setBorder(orgBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + }; + getComponent().addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + getComponent().removeFocusListener(focusListener); + focusListener = null; + super.uninstallListeners(); + } + + protected void paintBackground(Graphics g) { + g.setColor(getComponent().getBackground()); + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + if (getComponent().hasFocus() && getComponent().isEditable()) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusBackgroundColor()); + } + } + g.fillRect(0, 0, getComponent().getWidth(), getComponent().getHeight()); + } + + protected void paintSafely(Graphics g) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + super.paintSafely(g); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } +} diff --git a/src/com/jtattoo/plaf/BasePopupMenuUI.java b/src/com/jtattoo/plaf/BasePopupMenuUI.java new file mode 100644 index 0000000..b7e9ef5 --- /dev/null +++ b/src/com/jtattoo/plaf/BasePopupMenuUI.java @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.image.BufferedImage; +import javax.swing.*; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicPopupMenuUI; + +/** + * @author Michael Hagen + */ +public class BasePopupMenuUI extends BasicPopupMenuUI { + + protected static Robot robot = null; + protected BufferedImage screenImage = null; + protected MyPopupMenuListener myPopupListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BasePopupMenuUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + c.setOpaque(false); + } + + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + c.setOpaque(true); + } + + public void installListeners() { + super.installListeners(); + if (!isMenuOpaque()) { + myPopupListener = new MyPopupMenuListener(this); + popupMenu.addPopupMenuListener(myPopupListener); + } + } + + public void uninstallListeners() { + if (!isMenuOpaque()) { + popupMenu.removePopupMenuListener(myPopupListener); + } + super.uninstallListeners(); + } + + private boolean isMenuOpaque() { + return (AbstractLookAndFeel.getTheme().isMenuOpaque() || (getRobot() == null)); + } + + private Robot getRobot() { + if (robot == null) { + try { + robot = new Robot(); + } catch (Exception ex) { + } + } + return robot; + } + + public Popup getPopup(JPopupMenu popupMenu, int x, int y) { + Popup popup = super.getPopup(popupMenu, x, y); + if (!isMenuOpaque()) { + try { + Dimension size = popupMenu.getPreferredSize(); + if (size.width > 0 && size.height > 0) { + Rectangle screenRect = new Rectangle(x, y, size.width, size.height); + screenImage = getRobot().createScreenCapture(screenRect); + } + for (int i = 0; i < popupMenu.getComponentCount(); i++) { + if (popupMenu.getComponent(i) instanceof JPanel) { + JPanel panel = (JPanel)popupMenu.getComponent(i); + panel.setOpaque(true); + } + } + } catch (Exception ex) { + screenImage = null; + } + } + return popup; + } + + private void resetScreenImage() { + screenImage = null; + } + + public void update(Graphics g, JComponent c) { + if (screenImage != null) { + g.drawImage(screenImage, 0, 0, null); + } else { + g.setColor(AbstractLookAndFeel.getMenuBackgroundColor()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + +//---------------------------------------------------------------------------------------- +// inner classes +//---------------------------------------------------------------------------------------- + public static class MyPopupMenuListener implements PopupMenuListener { + + private BasePopupMenuUI popupMenuUI = null; + + public MyPopupMenuListener(BasePopupMenuUI aPopupMenuUI) { + popupMenuUI = aPopupMenuUI; + } + + public void popupMenuCanceled(PopupMenuEvent e) { + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + if (popupMenuUI.screenImage != null) { + JPopupMenu popup = (JPopupMenu) e.getSource(); + JRootPane root = popup.getRootPane(); + if (popup.isShowing() && root.isShowing()) { + Point ptPopup = popup.getLocationOnScreen(); + Point ptRoot = root.getLocationOnScreen(); + Graphics g = popup.getRootPane().getGraphics(); + g.drawImage(popupMenuUI.screenImage, ptPopup.x - ptRoot.x, ptPopup.y - ptRoot.y, null); + popupMenuUI.resetScreenImage(); + } + } + } + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + } + } +} + diff --git a/src/com/jtattoo/plaf/BaseProgressBarUI.java b/src/com/jtattoo/plaf/BaseProgressBarUI.java new file mode 100644 index 0000000..2c5a228 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseProgressBarUI.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + * + * JTattoo is multiple licensed. If your are an open source developer you can use + * it under the terms and conditions of the GNU General Public License version 2.0 + * or later as published by the Free Software Foundation. + * + * see: gpl-2.0.txt + * + * If you pay for a license you will become a registered user who could use the + * software under the terms and conditions of the GNU Lesser General Public License + * version 2.0 or later with classpath exception as published by the Free Software + * Foundation. + * + * see: lgpl-2.0.txt + * see: classpath-exception.txt + * + * Registered users could also use JTattoo under the terms and conditions of the + * Apache License, Version 2.0 as published by the Apache Software Foundation. + * + * see: APACHE-LICENSE-2.0.txt + */ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicProgressBarUI; + +/** + * @author Michael Hagen + */ +public class BaseProgressBarUI extends BasicProgressBarUI { + + protected PropertyChangeListener propertyChangeListener; + + public static ComponentUI createUI(JComponent c) { + return new BaseProgressBarUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + c.setBorder(UIManager.getBorder("ProgressBar.border")); + propertyChangeListener = new PropertyChangeHandler(); + c.addPropertyChangeListener(propertyChangeListener); + } + + public void uninstallUI(JComponent c) { + c.removePropertyChangeListener(propertyChangeListener); + super.uninstallUI(c); + } + + /* + * The "selectionForeground" is the color of the text when it is painted over a filled area of the progress bar. + */ + protected Color getSelectionForeground() { + Object selectionForeground = progressBar.getClientProperty("selectionForeground"); + if (selectionForeground instanceof Color) { + return (Color) selectionForeground; + } + return super.getSelectionForeground(); + } + + /* + * The "selectionBackground" is the color of the text when it is painted over an unfilled area of the progress bar. + */ + protected Color getSelectionBackground() { + Object selectionBackground = progressBar.getClientProperty("selectionBackground"); + if (selectionBackground instanceof Color) { + return (Color) selectionBackground; + } + return super.getSelectionBackground(); + } + + private void paintString(Graphics g, int x, int y, int width, int height, int fillStart, int amountFull, Insets b) { + if (!(g instanceof Graphics2D)) { + return; + } + + Graphics2D g2D = (Graphics2D) g; + String progressString = progressBar.getString(); + g2D.setFont(progressBar.getFont()); + Point renderLocation = getStringPlacement(g2D, progressString, x, y, width, height); + Rectangle savedClip = g2D.getClipBounds(); + + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + g2D.setColor(getSelectionBackground()); + JTattooUtilities.drawString(progressBar, g2D, progressString, renderLocation.x, renderLocation.y); + g2D.setColor(getSelectionForeground()); + g2D.clipRect(fillStart, y, amountFull, height); + JTattooUtilities.drawString(progressBar, g2D, progressString, renderLocation.x, renderLocation.y); + } else { // VERTICAL + g2D.setColor(getSelectionBackground()); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2); + g2D.setFont(progressBar.getFont().deriveFont(rotate)); + renderLocation = getStringPlacement(g2D, progressString, x, y, width, height); + JTattooUtilities.drawString(progressBar, g2D, progressString, renderLocation.x, renderLocation.y); + g2D.setColor(getSelectionForeground()); + g2D.clipRect(x, fillStart, width, amountFull); + JTattooUtilities.drawString(progressBar, g2D, progressString, renderLocation.x, renderLocation.y); + } + g2D.setClip(savedClip); + } + + protected void paintString(Graphics g, int x, int y, int width, int height, int amountFull, Insets b) { + boolean indeterminate = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + indeterminate = progressBar.isIndeterminate(); + } + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + if (JTattooUtilities.isLeftToRight(progressBar)) { + if (indeterminate) { + boxRect = getBox(boxRect); + paintString(g, x, y, width, height, boxRect.x, boxRect.width, b); + } else { + paintString(g, x, y, width, height, x, amountFull, b); + } + } else { + paintString(g, x, y, width, height, x + width - amountFull, amountFull, b); + } + } else { + if (indeterminate) { + boxRect = getBox(boxRect); + paintString(g, x, y, width, height, boxRect.y, boxRect.height, b); + } else { + paintString(g, x, y, width, height, y + height - amountFull, amountFull, b); + } + } + } + + protected void paintIndeterminate(Graphics g, JComponent c) { + if (!(g instanceof Graphics2D)) { + return; + } + Graphics2D g2D = (Graphics2D) g; + + Insets b = progressBar.getInsets(); // area for border + int barRectWidth = progressBar.getWidth() - (b.right + b.left); + int barRectHeight = progressBar.getHeight() - (b.top + b.bottom); + + Color colors[]; + if (progressBar.getForeground() instanceof UIResource) { + if (!JTattooUtilities.isActive(c)) { + colors = AbstractLookAndFeel.getTheme().getInActiveColors(); + } else if (c.isEnabled()) { + colors = AbstractLookAndFeel.getTheme().getProgressBarColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + } else { + Color hiColor = ColorHelper.brighter(progressBar.getForeground(), 40); + Color loColor = ColorHelper.darker(progressBar.getForeground(), 20); + colors = ColorHelper.createColorArr(hiColor, loColor, 20); + } + + Color cHi = ColorHelper.darker(colors[colors.length - 1], 5); + Color cLo = ColorHelper.darker(colors[colors.length - 1], 10); + + // Paint the bouncing box. + Rectangle box = getBox(null); + if (box != null) { + g2D.setColor(progressBar.getForeground()); + JTattooUtilities.draw3DBorder(g, cHi, cLo, box.x + 1, box.y + 1, box.width - 2, box.height - 2); + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + JTattooUtilities.fillHorGradient(g, colors, box.x + 2, box.y + 2, box.width - 4, box.height - 4); + } else { + JTattooUtilities.fillVerGradient(g, colors, box.x + 2, box.y + 2, box.width - 4, box.height - 4); + } + + // Deal with possible text painting + if (progressBar.isStringPainted()) { + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + paintString(g2D, b.left, b.top, barRectWidth, barRectHeight, box.width, b); + } else { + paintString(g2D, b.left, b.top, barRectWidth, barRectHeight, box.height, b); + } + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + } + } + + protected void paintDeterminate(Graphics g, JComponent c) { + if (!(g instanceof Graphics2D)) { + return; + } + + Graphics2D g2D = (Graphics2D) g; + Insets b = progressBar.getInsets(); // area for border + int w = progressBar.getWidth() - (b.right + b.left); + int h = progressBar.getHeight() - (b.top + b.bottom); + + // amount of progress to draw + int amountFull = getAmountFull(b, w, h); + Color colors[]; + if (progressBar.getForeground() instanceof UIResource) { + if (!JTattooUtilities.isActive(c)) { + colors = AbstractLookAndFeel.getTheme().getInActiveColors(); + } else if (c.isEnabled()) { + colors = AbstractLookAndFeel.getTheme().getProgressBarColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + } else { + Color hiColor = ColorHelper.brighter(progressBar.getForeground(), 40); + Color loColor = ColorHelper.darker(progressBar.getForeground(), 20); + colors = ColorHelper.createColorArr(hiColor, loColor, 20); + } + Color cHi = ColorHelper.darker(colors[colors.length - 1], 5); + Color cLo = ColorHelper.darker(colors[colors.length - 1], 10); + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + if (JTattooUtilities.isLeftToRight(progressBar)) { + JTattooUtilities.draw3DBorder(g, cHi, cLo, 1 + b.left, 2, amountFull - 2, h - 2); + JTattooUtilities.fillHorGradient(g, colors, 2 + b.left, 3, amountFull - 4, h - 4); + } else { + JTattooUtilities.draw3DBorder(g, cHi, cLo, progressBar.getWidth() - amountFull - b.right + 2, 2, amountFull - 2, h - 2); + JTattooUtilities.fillHorGradient(g, colors, progressBar.getWidth() - amountFull - b.right + 3, 3, amountFull - 4, h - 4); + } + } else { // VERTICAL + JTattooUtilities.draw3DBorder(g, cHi, cLo, 2, h - amountFull + 2, w - 2, amountFull - 2); + JTattooUtilities.fillVerGradient(g, colors, 3, h - amountFull + 3, w - 4, amountFull - 4); + } + + // Deal with possible text painting + if (progressBar.isStringPainted()) { + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + paintString(g, b.left, b.top, w, h, amountFull, b); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + } + + public void paint(Graphics g, JComponent c) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + if (progressBar.isIndeterminate()) { + paintIndeterminate(g, c); + } else { + paintDeterminate(g, c); + } + } else { + paintDeterminate(g, c); + } + } + +//----------------------------------------------------------------------------------------------- + protected class PropertyChangeHandler implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + if ("selectionForeground".equals(e.getPropertyName()) && (e.getNewValue() instanceof Color)) { + progressBar.invalidate(); + progressBar.repaint(); + } else if ("selectionBackground".equals(e.getPropertyName()) && (e.getNewValue() instanceof Color)) { + progressBar.invalidate(); + progressBar.repaint(); + } + } + } +} diff --git a/src/com/jtattoo/plaf/BaseRadioButtonMenuItemUI.java b/src/com/jtattoo/plaf/BaseRadioButtonMenuItemUI.java new file mode 100644 index 0000000..40f901d --- /dev/null +++ b/src/com/jtattoo/plaf/BaseRadioButtonMenuItemUI.java @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class BaseRadioButtonMenuItemUI extends BaseMenuItemUI { + + public static ComponentUI createUI(JComponent b) { + return new BaseRadioButtonMenuItemUI(); + } + + protected void installDefaults() { + super.installDefaults(); + checkIcon = UIManager.getIcon("RadioButtonMenuItem.checkIcon"); + } + +} diff --git a/src/com/jtattoo/plaf/BaseRadioButtonUI.java b/src/com/jtattoo/plaf/BaseRadioButtonUI.java new file mode 100644 index 0000000..74dd2af --- /dev/null +++ b/src/com/jtattoo/plaf/BaseRadioButtonUI.java @@ -0,0 +1,196 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.*; +import javax.swing.text.View; + +/** + * @author Michael Hagen + */ +public class BaseRadioButtonUI extends BasicRadioButtonUI { + + private static BaseRadioButtonUI radioButtonUI = null; + /* These Dimensions/Rectangles are allocated once for all + * RadioButtonUI.paint() calls. Re-using rectangles + * rather than allocating them in each paint call substantially + * reduced the time it took paint to run. Obviously, this + * method can't be re-entered. + */ + protected static Dimension size = new Dimension(); + protected static Rectangle viewRect = new Rectangle(); + protected static Rectangle iconRect = new Rectangle(); + protected static Rectangle textRect = new Rectangle(); + + public static ComponentUI createUI(JComponent c) { + if (radioButtonUI == null) { + radioButtonUI = new BaseRadioButtonUI(); + } + return radioButtonUI; + } + + public void installDefaults(AbstractButton b) { + super.installDefaults(b); + b.setRolloverEnabled(true); + icon = UIManager.getIcon("RadioButton.icon"); + } + + public void paint(Graphics g, JComponent c) { + AbstractButton b = (AbstractButton) c; + g.setFont(c.getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(c, g, c.getFont()); + + Insets i = c.getInsets(); + size = b.getSize(size); + viewRect.x = i.left; + viewRect.y = i.top; + viewRect.width = size.width - (i.right + viewRect.x); + viewRect.height = size.height - (i.bottom + viewRect.y); + iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0; + textRect.x = textRect.y = textRect.width = textRect.height = 0; + Icon altIcon = b.getIcon(); + int iconTextGap = getDefaultTextIconGap(b); + if (JTattooUtilities.getJavaVersion() >= 1.4) { + iconTextGap = b.getIconTextGap(); + } + String text = SwingUtilities.layoutCompoundLabel( + c, + fm, + b.getText(), + altIcon != null ? altIcon : getDefaultIcon(), + b.getVerticalAlignment(), + b.getHorizontalAlignment(), + b.getVerticalTextPosition(), + b.getHorizontalTextPosition(), + viewRect, + iconRect, + textRect, + iconTextGap); + + // fill background + if (c.isOpaque()) { + paintBackground(g, c); + } + + paintIcon(g, c, iconRect); + + if (text != null) { + paintText(g, c, text, textRect); + } + + if (b.hasFocus() && b.isFocusPainted() && (textRect.width > 0) && (textRect.height > 0)) { + paintFocus(g, textRect, size); + } + } + + protected void paintBackground(Graphics g, JComponent c) { + g.setColor(c.getBackground()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + + protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Icon ico; + if (!model.isEnabled()) { + if (b.isSelected()) { + ico = b.getDisabledSelectedIcon(); + } else { + ico = b.getDisabledIcon(); + } + } else { + if (model.isPressed()) { + ico = b.getPressedIcon(); + } else { + if (model.isRollover()) { + if (b.isSelected()) { + ico = b.getRolloverSelectedIcon(); + } else { + ico = b.getRolloverIcon(); + } + } else { + if (b.isSelected()) { + ico = b.getSelectedIcon(); + } else { + ico = b.getIcon(); + } + } + } + } + + if (ico != null) { + ico.paintIcon(c, g, iconRect.x, iconRect.y - 1); + } else { + if (b.getIcon() != null) { + b.getIcon().paintIcon(c, g, iconRect.x, iconRect.y - 1); + } else { + getDefaultIcon().paintIcon(c, g, iconRect.x, iconRect.y - 1); + } + } + } + + protected void paintText(Graphics g, JComponent c, String text, Rectangle textRect) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + v.paint(g, textRect); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } else { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + g.setFont(b.getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + int mnemIndex; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = b.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + } + if (model.isEnabled()) { + g.setColor(b.getForeground()); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } else { + g.setColor(Color.white); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x + 1, textRect.y + 1 + fm.getAscent()); + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + } + + protected void paintFocus(Graphics g, Rectangle t, Dimension d) { + g.setColor(AbstractLookAndFeel.getFocusColor()); + BasicGraphicsUtils.drawDashedRect(g, t.x, t.y - 1, t.width + 1, t.height + 1); + } +} diff --git a/src/com/jtattoo/plaf/BaseRootPaneUI.java b/src/com/jtattoo/plaf/BaseRootPaneUI.java new file mode 100644 index 0000000..6108f8b --- /dev/null +++ b/src/com/jtattoo/plaf/BaseRootPaneUI.java @@ -0,0 +1,997 @@ +/* + * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + * + * JTattoo is multiple licensed. If your are an open source developer you can use + * it under the terms and conditions of the GNU General Public License version 2.0 + * or later as published by the Free Software Foundation. + * + * see: gpl-2.0.txt + * + * If you pay for a license you will become a registered user who could use the + * software under the terms and conditions of the GNU Lesser General Public License + * version 2.0 or later with classpath exception as published by the Free Software + * Foundation. + * + * see: lgpl-2.0.txt + * see: classpath-exception.txt + * + * Registered users could also use JTattoo under the terms and conditions of the + * Apache License, Version 2.0 as published by the Apache Software Foundation. + * + * see: APACHE-LICENSE-2.0.txt + */ +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.event.MouseInputListener; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicRootPaneUI; + +/** + * This source is a modified copy of javax.swing.plaf.metal.MetalRootPaneUI Provides the base look and feel + * implementation of RootPaneUI. + *

+ * BaseRootPaneUI provides support for the windowDecorationStyle property of + * JRootPane. BaseRootPaneUI does this by way of installing a custom + * LayoutManager, a private Component to render the appropriate widgets, and a private + * Border. The LayoutManager is always installed, regardless of the value of the + * windowDecorationStyle property, but the Border and Component are only + * installed/added if the windowDecorationStyle is other than JRootPane.NONE. + *

+ * Warning: + * Serialized objects of this class will not be compatible with future Swing releases. The current serialization support + * is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, + * support for long term storage of all JavaBeansTM + * has been added to the java.beans package. Please see {@link java.beans.XMLEncoder}. + * + * @version 1.20 04/27/04 + * @author Terry Kellerman + * @author Michael Hagen + * @since 1.4 + */ +public class BaseRootPaneUI extends BasicRootPaneUI { + + // Konstanten aus javax.swing.JRootPane damit Attribute aus Java 1.4 sich mit Java 1.3 uebersetzen lassen + + public static final int NONE = 0; + public static final int FRAME = 1; + public static final int PLAIN_DIALOG = 2; + public static final int INFORMATION_DIALOG = 3; + public static final int ERROR_DIALOG = 4; + public static final int COLOR_CHOOSER_DIALOG = 5; + public static final int FILE_CHOOSER_DIALOG = 6; + public static final int QUESTION_DIALOG = 7; + public static final int WARNING_DIALOG = 8; + // Konstanten aus java.awt.Frame damit Attribute aus Java 1.4 sich mit Java 1.3 uebersetzen lassen + public static final int MAXIMIZED_HORIZ = 2; + public static final int MAXIMIZED_VERT = 4; + public static final int MAXIMIZED_BOTH = MAXIMIZED_VERT | MAXIMIZED_HORIZ; + private static final String[] borderKeys = new String[]{ + null, + "RootPane.frameBorder", + "RootPane.plainDialogBorder", + "RootPane.informationDialogBorder", + "RootPane.errorDialogBorder", + "RootPane.colorChooserDialogBorder", + "RootPane.fileChooserDialogBorder", + "RootPane.questionDialogBorder", + "RootPane.warningDialogBorder" + }; + /** + * The minimum/maximum size of a Window + */ + private static final Dimension MINIMUM_SIZE = new Dimension(120, 80); + private static final Dimension MAXIMUM_SIZE = Toolkit.getDefaultToolkit().getScreenSize(); + /** + * The amount of space (in pixels) that the cursor is changed on. + */ + private static final int CORNER_DRAG_WIDTH = 16; + /** + * Region from edges that dragging is active from. + */ + private static final int BORDER_DRAG_THICKNESS = 5; + /** + * Window the JRootPane is in. + */ + private Window window; + /** + * JComponent providing window decorations. This will be null if not providing window decorations. + */ + private JComponent titlePane; + /** + * MouseInputListener that is added to the parent Window the JRootPane is + * contained in. + */ + private MouseInputListener mouseInputListener; + /** + * WindowListener that is added to the parent Window the JRootPane is + * contained in. + */ + private WindowListener windowListener; + /** + * WindowListener that is added to the parent Window the JRootPane is + * contained in. + */ + private PropertyChangeListener propertyChangeListener; + /** + * The LayoutManager that is set on the JRootPane. + */ + private LayoutManager layoutManager; + /** + * LayoutManager of the JRootPane before we replaced it. + */ + private LayoutManager savedOldLayout; + /** + * JRootPane providing the look and feel for. + */ + private JRootPane root; + + private Cursor savedCursor = null; + + /** + * Cursor used to track the cursor set by the user. This is initially + * Cursor.DEFAULT_CURSOR. + */ + /** + * Creates a UI for a JRootPane. + * + * @param c the JRootPane the RootPaneUI will be created for + * @return the RootPaneUI implementation for the passed in JRootPane + */ + public static ComponentUI createUI(JComponent c) { + return new BaseRootPaneUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + root = (JRootPane) c; + if (DecorationHelper.getWindowDecorationStyle(root) != NONE) { + installClientDecorations(root); + } + } + + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + uninstallClientDecorations(root); + layoutManager = null; + mouseInputListener = null; + root = null; + } + + protected void installListeners(JRootPane root) { + super.installListeners(root); + + if (DecorationHelper.getWindowDecorationStyle(root) == NONE) { + propertyChangeListener = new PropertyChangeListener() { + + public void propertyChange(PropertyChangeEvent evt) { + if ("ancestor".equals(evt.getPropertyName())) { + if (getRootPane() != null && getRootPane().getParent() instanceof Window) { + window = (Window) getRootPane().getParent(); + windowListener = new WindowAdapter() { + + public void windowActivated(WindowEvent e) { + if (getRootPane() != null) { + getRootPane().repaint(); + } + } + + public void windowDeactivated(WindowEvent e) { + if (getRootPane() != null) { + getRootPane().repaint(); + } + } + }; + window.addWindowListener(windowListener); + } + } + } + }; + root.addPropertyChangeListener(propertyChangeListener); + } + } + + protected void uninstallListeners(JRootPane root) { + super.uninstallListeners(root); + if (DecorationHelper.getWindowDecorationStyle(root) == NONE) { + if (root.getParent() instanceof Window && windowListener != null) { + window = (Window) root.getParent(); + window.removeWindowListener(windowListener); + } + root.removePropertyChangeListener(propertyChangeListener); + } + } + + public void installBorder(JRootPane root) { + int style = DecorationHelper.getWindowDecorationStyle(root); + if (style == NONE) { + LookAndFeel.uninstallBorder(root); + } else { + LookAndFeel.installBorder(root, borderKeys[style]); + } + } + + /** + * Removes any border that may have been installed. + * + * @param root + */ + public void uninstallBorder(JRootPane root) { + LookAndFeel.uninstallBorder(root); + } + + /** + * Installs the necessary Listeners on the parent Window, if there is one. + *

+ * This takes the parent so that cleanup can be done from removeNotify, at which point the parent + * hasn't been reset yet. + * + * @param root + * @param parent The parent of the JRootPane + */ + public void installWindowListeners(JRootPane root, Component parent) { + if (parent instanceof Window) { + window = (Window) parent; + } else { + window = SwingUtilities.getWindowAncestor(parent); + } + if (window != null) { + if (mouseInputListener == null) { + mouseInputListener = createWindowMouseInputListener(root); + } + window.addMouseListener(mouseInputListener); + window.addMouseMotionListener(mouseInputListener); + // fixes a problem with netbeans, decorated windows and java 1.5 + // the MetalLookAndFeel seems to have the same problem + if ((JTattooUtilities.getJavaVersion() >= 1.5) && (JTattooUtilities.getJavaVersion() <= 1.6)) { + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + if (window != null) { + if (window instanceof JFrame) { + JFrame frame = (JFrame) window; + frame.update(frame.getGraphics()); + } + } + } + }); + } + } + } + + /** + * Uninstalls the necessary Listeners on the Window the Listeners were last installed on. + * + * @param root + */ + public void uninstallWindowListeners(JRootPane root) { + if (window != null) { + window.removeMouseListener(mouseInputListener); + window.removeMouseMotionListener(mouseInputListener); + } + } + + /** + * Installs the appropriate LayoutManager on the JRootPane to render the window decorations. + * + * @param root + */ + public void installLayout(JRootPane root) { + if (layoutManager == null) { + layoutManager = createLayoutManager(); + } + savedOldLayout = root.getLayout(); + root.setLayout(layoutManager); + } + + public void uninstallLayout(JRootPane root) { + if (savedOldLayout != null) { + root.setLayout(savedOldLayout); + savedOldLayout = null; + } + } + + public void installClientDecorations(JRootPane root) { + installBorder(root); + if (titlePane == null) { + setTitlePane(root, createTitlePane(root)); + } + installWindowListeners(root, root.getParent()); + installLayout(root); + if (window != null) { + savedCursor = window.getCursor(); + root.revalidate(); + root.repaint(); + } + } + + public void uninstallClientDecorations(JRootPane root) { + uninstallBorder(root); + uninstallWindowListeners(root); + setTitlePane(root, null); + uninstallLayout(root); + int style = DecorationHelper.getWindowDecorationStyle(root); + if (style == NONE) { + root.repaint(); + root.revalidate(); + } + // Reset the cursor, as we may have changed it to a resize cursor + if (window != null) { + window.setCursor(savedCursor); + } + window = null; + } + + /** + * Returns the JComponent to render the window decoration style. + * + * @param root + * @return + */ + public JComponent createTitlePane(JRootPane root) { + return new BaseTitlePane(root, this); + } + + /** + * Returns a MouseListener that will be added to the Window containing the + * JRootPane. + * + * @param root + * @return + */ + public MouseInputListener createWindowMouseInputListener(JRootPane root) { + return new MouseInputHandler(); + } + + /** + * Returns a LayoutManager that will be set on the JRootPane. + * + * @return + */ + public LayoutManager createLayoutManager() { + return new BaseRootLayout(); + } + + /** + * Sets the window title pane -- the JComponent used to provide a plaf a way to override the native operating + * system's window title pane with one whose look and feel are controlled by the plaf. The plaf creates and sets + * this value; the default is null, implying a native operating system window title pane. + * + * @param root the JRootPane where to set the title pane + * @param titlePane the JComponent to use for the window title pane. + */ + public void setTitlePane(JRootPane root, JComponent titlePane) { + JComponent oldTitlePane = internalGetTitlePane(); + if ((oldTitlePane == null && titlePane == null) || (oldTitlePane != null && oldTitlePane.equals(titlePane))) { + return; + } + JLayeredPane layeredPane = root.getLayeredPane(); + if (oldTitlePane != null) { + oldTitlePane.setVisible(false); + layeredPane.remove(oldTitlePane); + } + if (titlePane != null) { + layeredPane.add(titlePane, JLayeredPane.FRAME_CONTENT_LAYER); + titlePane.setVisible(true); + } + this.titlePane = titlePane; + } + + /** + * Returns the BaseTitlePane rendering the title pane. If this returns null, it implies there is no need + * to render window decorations. + * + * @return the current window title pane, or null + * @see #setTitlePane + */ + public BaseTitlePane getTitlePane() { + if (titlePane instanceof BaseTitlePane) { + return (BaseTitlePane)titlePane; + } + return null; + } + + private JComponent internalGetTitlePane() { + return titlePane; + } + + public JRootPane getRootPane() { + return root; + } + + public void propertyChange(PropertyChangeEvent e) { + super.propertyChange(e); + + String propertyName = e.getPropertyName(); + JRootPane root = (JRootPane) e.getSource(); + if ("windowDecorationStyle".equals(propertyName)) { + int style = DecorationHelper.getWindowDecorationStyle(root); + + // This is potentially more than needs to be done, + // but it rarely happens and makes the install/uninstall process + // simpler. BaseTitlePane also assumes it will be recreated if + // the decoration style changes. + uninstallClientDecorations(root); + if (style != NONE) { + installClientDecorations(root); + } +// if (!JTattooUtilities.isMac() && (window instanceof Frame)) { +// Frame frame = (Frame) window; +// if (frame != null) { +// GraphicsConfiguration gc = frame.getGraphicsConfiguration(); +// Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc); +// Rectangle screenBounds = gc.getBounds(); +// int x = Math.max(0, screenInsets.left); +// int y = Math.max(0, screenInsets.top); +// int w = screenBounds.width - (screenInsets.left + screenInsets.right); +// int h = screenBounds.height - (screenInsets.top + screenInsets.bottom); +// // Keep taskbar visible +// frame.setMaximizedBounds(new Rectangle(x, y, w, h)); +// } +// } + } else if ("ancestor".equals(propertyName)) { + uninstallWindowListeners(root); + if (DecorationHelper.getWindowDecorationStyle(root) != NONE) { + installWindowListeners(root, root.getParent()); + } + } + } + + private boolean isDynamicLayout() { + return AbstractLookAndFeel.getTheme().isDynamicLayout(); + } + +//------------------------------------------------------------------------------ + private static class BaseRootLayout implements LayoutManager2 { + + /** + * Returns the amount of space the layout would like to have. + * + * @param the Container for which this layout manager is being used + * @return a Dimension object containing the layout's preferred size + */ + public Dimension preferredLayoutSize(Container parent) { + Dimension cpd, mbd, tpd; + int cpWidth = 0; + int cpHeight = 0; + int mbWidth = 0; + int mbHeight = 0; + int tpWidth = 0; + Insets i = parent.getInsets(); + JRootPane root = (JRootPane) parent; + + if (root.getContentPane() != null) { + cpd = root.getContentPane().getPreferredSize(); + } else { + cpd = root.getSize(); + } + if (cpd != null) { + cpWidth = cpd.width; + cpHeight = cpd.height; + } + + if (root.getJMenuBar() != null) { + mbd = root.getJMenuBar().getPreferredSize(); + if (mbd != null) { + mbWidth = mbd.width; + mbHeight = mbd.height; + } + } + + if (DecorationHelper.getWindowDecorationStyle(root) != NONE && (root.getUI() instanceof BaseRootPaneUI)) { + JComponent titlePane = ((BaseRootPaneUI) root.getUI()).internalGetTitlePane(); + if (titlePane != null) { + tpd = titlePane.getPreferredSize(); + if (tpd != null) { + tpWidth = tpd.width; + } + } + } + + return new Dimension(Math.max(Math.max(cpWidth, mbWidth), tpWidth) + i.left + i.right, cpHeight + mbHeight + tpWidth + i.top + i.bottom); + } + + /** + * Returns the minimum amount of space the layout needs. + * + * @param the Container for which this layout manager is being used + * @return a Dimension object containing the layout's minimum size + */ + public Dimension minimumLayoutSize(Container parent) { + return MINIMUM_SIZE; + } + + /** + * Returns the maximum amount of space the layout can use. + * + * @param the Container for which this layout manager is being used + * @return a Dimension object containing the layout's maximum size + */ + public Dimension maximumLayoutSize(Container target) { + return MAXIMUM_SIZE; + } + + /** + * Instructs the layout manager to perform the layout for the specified container. + * + * @param the Container for which this layout manager is being used + */ + public void layoutContainer(Container parent) { + JRootPane root = (JRootPane) parent; + Rectangle b = root.getBounds(); + Insets i = root.getInsets(); + int nextY = 0; + int w = b.width - i.right - i.left; + int h = b.height - i.top - i.bottom; + + if (root.getLayeredPane() != null) { + root.getLayeredPane().setBounds(i.left, i.top, w, h); + } + if (root.getGlassPane() != null) { + if (DecorationHelper.getWindowDecorationStyle(root) != NONE && (root.getUI() instanceof BaseRootPaneUI)) { + JComponent titlePane = ((BaseRootPaneUI) root.getUI()).internalGetTitlePane(); + int titleHeight = 0; + if (titlePane != null) { + titleHeight = titlePane.getSize().height; + } + root.getGlassPane().setBounds(i.left, i.top + titleHeight, w, h - titleHeight); + } else { + root.getGlassPane().setBounds(i.left, i.top, w, h); + } + } + // Note: This is laying out the children in the layeredPane, + // technically, these are not our children. + if (DecorationHelper.getWindowDecorationStyle(root) != NONE && (root.getUI() instanceof BaseRootPaneUI)) { + JComponent titlePane = ((BaseRootPaneUI) root.getUI()).internalGetTitlePane(); + if (titlePane != null) { + Dimension tpd = titlePane.getPreferredSize(); + if (tpd != null) { + int tpHeight = tpd.height; + titlePane.setBounds(0, 0, w, tpHeight); + nextY += tpHeight; + } + } + } + if (root.getJMenuBar() != null) { + Dimension mbd = root.getJMenuBar().getPreferredSize(); + root.getJMenuBar().setBounds(0, nextY, w, mbd.height); + nextY += mbd.height; + } + if (root.getContentPane() != null) { + root.getContentPane().setBounds(0, nextY, w, h < nextY ? 0 : h - nextY); + } + } + + public void addLayoutComponent(String name, Component comp) { + } + + public void removeLayoutComponent(Component comp) { + } + + public void addLayoutComponent(Component comp, Object constraints) { + } + + public float getLayoutAlignmentX(Container target) { + return 0.0f; + } + + public float getLayoutAlignmentY(Container target) { + return 0.0f; + } + + public void invalidateLayout(Container target) { + } + } + /** + * Maps from positions to cursor type. Refer to calculateCorner and calculatePosition for details of this. + */ + private static final int[] cursorMapping = new int[]{ + Cursor.NW_RESIZE_CURSOR, Cursor.NW_RESIZE_CURSOR, Cursor.N_RESIZE_CURSOR, + Cursor.NE_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR, + Cursor.NW_RESIZE_CURSOR, 0, 0, 0, Cursor.NE_RESIZE_CURSOR, + Cursor.W_RESIZE_CURSOR, 0, 0, 0, Cursor.E_RESIZE_CURSOR, + Cursor.SW_RESIZE_CURSOR, 0, 0, 0, Cursor.SE_RESIZE_CURSOR, + Cursor.SW_RESIZE_CURSOR, Cursor.SW_RESIZE_CURSOR, Cursor.S_RESIZE_CURSOR, + Cursor.SE_RESIZE_CURSOR, Cursor.SE_RESIZE_CURSOR + }; + +//------------------------------------------------------------------------------ + /** + * MouseInputHandler is responsible for handling resize/moving of the Window. It sets the cursor directly on the + * Window when then mouse moves over a hot spot. + */ + private class MouseInputHandler implements MouseInputListener { + + /** + * Set to true if the drag operation is moving the window. + */ + private boolean isMovingWindow; + /** + * Set to true if the drag operation is resizing the window. + */ + private boolean isResizingWindow; + /** + * Used to determine the corner the resize is occuring from. + */ + private int dragCursor; + /** + * X location the mouse went down on for a drag operation. + */ + private int dragOffsetX; + /** + * Y location the mouse went down on for a drag operation. + */ + private int dragOffsetY; + /** + * Width of the window when the drag started. + */ + private int dragWidth; + /** + * Height of the window when the drag started. + */ + private int dragHeight; + private Container savedContentPane = null; + private ResizingPanel resizingPanel = null; + + public void mousePressed(MouseEvent ev) { + Window w = (Window) ev.getSource(); + if (w instanceof Window) { + JRootPane root = getRootPane(); + if (DecorationHelper.getWindowDecorationStyle(root) == NONE) { + return; + } + w.toFront(); + + Point dragWindowOffset = ev.getPoint(); + Point convertedDragWindowOffset = SwingUtilities.convertPoint(w, dragWindowOffset, internalGetTitlePane()); + + Frame f = null; + Dialog d = null; + + if (w instanceof Frame) { + f = (Frame) w; + } else if (w instanceof Dialog) { + d = (Dialog) w; + } + + int frameState = (f != null) ? DecorationHelper.getExtendedState(f) : 0; + + if (internalGetTitlePane() != null && internalGetTitlePane().contains(convertedDragWindowOffset)) { + if ((f != null && ((frameState & BaseRootPaneUI.MAXIMIZED_BOTH) == 0) || (d != null)) + && dragWindowOffset.y >= BORDER_DRAG_THICKNESS + && dragWindowOffset.x >= BORDER_DRAG_THICKNESS + && dragWindowOffset.x < w.getWidth() - BORDER_DRAG_THICKNESS) { + isMovingWindow = true; + dragOffsetX = dragWindowOffset.x; + dragOffsetY = dragWindowOffset.y; + if (window instanceof JFrame) { + JFrame frame = (JFrame) window; + PropertyChangeListener[] pcl = frame.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowMoving", Boolean.FALSE, Boolean.FALSE)); + } + } + if (window instanceof JDialog) { + JDialog dialog = (JDialog) window; + PropertyChangeListener[] pcl = dialog.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowMoving", Boolean.FALSE, Boolean.FALSE)); + } + } + } + } else if (f != null + && f.isResizable() + && ((frameState & BaseRootPaneUI.MAXIMIZED_BOTH) == 0) + || (d != null && d.isResizable())) { + isResizingWindow = true; + if (!isDynamicLayout()) { + savedContentPane = getRootPane().getContentPane(); + GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); + BufferedImage bi = gc.createCompatibleImage(savedContentPane.getWidth(), savedContentPane.getHeight()); + savedContentPane.paint(bi.getGraphics()); + resizingPanel = new ResizingPanel(bi); + getRootPane().setContentPane(resizingPanel); + } + dragOffsetX = dragWindowOffset.x; + dragOffsetY = dragWindowOffset.y; + dragWidth = w.getWidth(); + dragHeight = w.getHeight(); + dragCursor = getCursor(calculateCorner(w, dragWindowOffset.x, dragWindowOffset.y)); + if (window instanceof JFrame) { + JFrame frame = (JFrame) window; + PropertyChangeListener[] pcl = frame.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowResizing", Boolean.FALSE, Boolean.FALSE)); + } + } + if (window instanceof JDialog) { + JDialog dialog = (JDialog) window; + PropertyChangeListener[] pcl = dialog.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowResizing", Boolean.FALSE, Boolean.FALSE)); + } + } + } + } + } + + public void mouseReleased(MouseEvent ev) { + if (ev.getSource() instanceof Window) { + Window w = (Window) ev.getSource(); + if (w != null) { + if (!isDynamicLayout() && isResizingWindow) { + getRootPane().setContentPane(savedContentPane); + getRootPane().updateUI(); + resizingPanel = null; + } else if (dragCursor != 0 && !window.isValid()) { + // Some Window systems validate as you resize, others won't, + // thus the check for validity before repainting. + w.validate(); + getRootPane().repaint(); + } + + if (window instanceof JFrame) { + JFrame frame = (JFrame) window; + PropertyChangeListener[] pcl = frame.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + if (isMovingWindow) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowMoved", Boolean.FALSE, Boolean.FALSE)); + } else { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowResized", Boolean.FALSE, Boolean.FALSE)); + } + } + } + if (window instanceof JDialog) { + JDialog dialog = (JDialog) window; + PropertyChangeListener[] pcl = dialog.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + if (isMovingWindow) { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowMoved", Boolean.FALSE, Boolean.FALSE)); + } else { + pcl[i].propertyChange(new PropertyChangeEvent(window, "windowResized", Boolean.FALSE, Boolean.FALSE)); + } + } + } + } + isMovingWindow = false; + isResizingWindow = false; + dragCursor = 0; + } + } + + public void mouseMoved(MouseEvent ev) { + if (ev.getSource() instanceof Window) { + JRootPane root = getRootPane(); + if (DecorationHelper.getWindowDecorationStyle(root) == NONE) { + return; + } + + Window w = (Window) ev.getSource(); + Frame f = null; + Dialog d = null; + + if (w instanceof Frame) { + f = (Frame) w; + } else if (w instanceof Dialog) { + d = (Dialog) w; + } + + // Update the cursor + int cursor = getCursor(calculateCorner(w, ev.getX(), ev.getY())); + if (cursor != 0 && ((f != null && (f.isResizable() && (DecorationHelper.getExtendedState(f) & BaseRootPaneUI.MAXIMIZED_BOTH) == 0)) || (d != null && d.isResizable()))) { + w.setCursor(Cursor.getPredefinedCursor(cursor)); + } else { + w.setCursor(savedCursor); + } + } + } + + private void adjust(Rectangle bounds, Dimension min, int deltaX, int deltaY, int deltaWidth, int deltaHeight) { + bounds.x += deltaX; + bounds.y += deltaY; + bounds.width += deltaWidth; + bounds.height += deltaHeight; + if (min != null) { + if (bounds.width < min.width) { + int correction = min.width - bounds.width; + if (deltaX != 0) { + bounds.x -= correction; + } + bounds.width = min.width; + } + if (bounds.height < min.height) { + int correction = min.height - bounds.height; + if (deltaY != 0) { + bounds.y -= correction; + } + bounds.height = min.height; + } + } + } + + private int getMinScreenY() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice devices[] = ge.getScreenDevices(); + GraphicsDevice gd = devices[0]; + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + int minScreenY = gc.getBounds().y + Toolkit.getDefaultToolkit().getScreenInsets(gc).top; + if (devices.length > 1) { + for (int i = 1; i < devices.length; i++) { + gd = devices[i]; + gc = gd.getDefaultConfiguration(); + minScreenY = Math.min(minScreenY, gc.getBounds().y + Toolkit.getDefaultToolkit().getScreenInsets(gc).top); + } + } + return minScreenY; + } + + public void mouseDragged(MouseEvent ev) { + if (ev.getSource() instanceof Window) { + Window w = (Window) ev.getSource(); + int minScreenY = getMinScreenY(); + if (isMovingWindow) { + if (JTattooUtilities.getJavaVersion() < 1.6) { + Point pt = ev.getPoint(); + Point location = w.getLocationOnScreen(); + location.x += pt.x - dragOffsetX; + location.y += pt.y - dragOffsetY; + location.y = Math.max(minScreenY, location.y); + w.setLocation(location); + } else { + Point location = ev.getLocationOnScreen(); + location.x -= dragOffsetX; + location.y = Math.max(minScreenY, location.y - dragOffsetY); + w.setLocation(location); + } + } else if (dragCursor != 0) { + Point pt = ev.getPoint(); + Rectangle bounds = w.getBounds(); + Rectangle startBounds = new Rectangle(bounds); + Dimension min = MINIMUM_SIZE; + switch (dragCursor) { + case Cursor.E_RESIZE_CURSOR: + adjust(bounds, min, 0, 0, pt.x + (dragWidth - dragOffsetX) - bounds.width, 0); + break; + case Cursor.S_RESIZE_CURSOR: + adjust(bounds, min, 0, 0, 0, pt.y + (dragHeight - dragOffsetY) - bounds.height); + break; + case Cursor.N_RESIZE_CURSOR: + adjust(bounds, min, 0, pt.y - dragOffsetY, 0, -(pt.y - dragOffsetY)); + break; + case Cursor.W_RESIZE_CURSOR: + adjust(bounds, min, pt.x - dragOffsetX, 0, -(pt.x - dragOffsetX), 0); + break; + case Cursor.NE_RESIZE_CURSOR: + adjust(bounds, min, 0, pt.y - dragOffsetY, pt.x + (dragWidth - dragOffsetX) - bounds.width, -(pt.y - dragOffsetY)); + break; + case Cursor.SE_RESIZE_CURSOR: + adjust(bounds, min, 0, 0, pt.x + (dragWidth - dragOffsetX) - bounds.width, pt.y + (dragHeight - dragOffsetY) - bounds.height); + break; + case Cursor.NW_RESIZE_CURSOR: + adjust(bounds, min, pt.x - dragOffsetX, pt.y - dragOffsetY, -(pt.x - dragOffsetX), -(pt.y - dragOffsetY)); + break; + case Cursor.SW_RESIZE_CURSOR: + adjust(bounds, min, pt.x - dragOffsetX, 0, -(pt.x - dragOffsetX), pt.y + (dragHeight - dragOffsetY) - bounds.height); + break; + default: + break; + } + if (!bounds.equals(startBounds)) { + if (bounds.y < minScreenY) { + int delta = minScreenY - bounds.y; + bounds.y = minScreenY; + bounds.height -= delta; + } + w.setBounds(bounds); + w.validate(); + } + } + } + } + + public void mouseEntered(MouseEvent ev) { + mouseMoved(ev); + } + + public void mouseExited(MouseEvent ev) { + if (ev.getSource() instanceof Window) { + Window w = (Window) ev.getSource(); + w.setCursor(savedCursor); + } + } + + @SuppressWarnings("deprecation") + public void mouseClicked(MouseEvent ev) { + if (ev.getSource() instanceof Window) { + Window window = (Window) ev.getSource(); + if (!(window instanceof Frame)) { + return; + } + Frame frame = (Frame) window; + Point convertedPoint = SwingUtilities.convertPoint(window, ev.getPoint(), internalGetTitlePane()); + int state = DecorationHelper.getExtendedState(frame); + if (titlePane != null && titlePane instanceof TitlePane && titlePane.contains(convertedPoint) && frame.isResizable()) { + if ((ev.getClickCount() % 2) == 0 && ((ev.getModifiers() & InputEvent.BUTTON1_MASK) != 0)) { + if ((state & BaseRootPaneUI.MAXIMIZED_BOTH) != 0) { + ((TitlePane) titlePane).restore(); + } else { + ((TitlePane) titlePane).maximize(); + } + } + } + } + } + + /** + * Returns the corner that contains the point x, y, or -1 if the position doesn't + * match a corner. + */ + private int calculateCorner(Component c, int x, int y) { + int xPosition = calculatePosition(x, c.getWidth()); + int yPosition = calculatePosition(y, c.getHeight()); + + if (xPosition == -1 || yPosition == -1) { + return -1; + } + return yPosition * 5 + xPosition; + } + + /** + * Returns the Cursor to render for the specified corner. This returns 0 if the corner doesn't map to a valid + * Cursor + */ + private int getCursor(int corner) { + if (corner == -1) { + return 0; + } + return cursorMapping[corner]; + } + + /** + * Returns an integer indicating the position of spot in width. The return value will + * be: 0 if < BORDER_DRAG_THICKNESS 1 if < CORNER_DRAG_WIDTH 2 if >= CORNER_DRAG_WIDTH && + * < width - BORDER_DRAG_THICKNESS 3 if >= width - CORNER_DRAG_WIDTH 4 if >= width - BORDER_DRAG_THICKNESS 5 + * otherwise + */ + private int calculatePosition(int spot, int width) { + if (spot < BORDER_DRAG_THICKNESS) { + return 0; + } + if (spot < CORNER_DRAG_WIDTH) { + return 1; + } + if (spot >= (width - BORDER_DRAG_THICKNESS)) { + return 4; + } + if (spot >= (width - CORNER_DRAG_WIDTH)) { + return 3; + } + return 2; + } + } + +//------------------------------------------------------------------------------ + private static class ResizingPanel extends JPanel { + + private BufferedImage bi = null; + + public ResizingPanel(BufferedImage bi) { + super(); + this.bi = bi; + } + + public void paint(Graphics g) { + super.paint(g); + g.drawImage(bi, 0, 0, null); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseScrollBarUI.java b/src/com/jtattoo/plaf/BaseScrollBarUI.java new file mode 100644 index 0000000..7110d13 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseScrollBarUI.java @@ -0,0 +1,399 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JScrollBar; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicScrollBarUI; + +/** + * @author Michael Hagen + */ +public class BaseScrollBarUI extends BasicScrollBarUI { + + protected int scrollBarWidth = 17; + protected int incrGap = 0; + protected int decrGap = 0; + protected boolean isRollover = false; + + public static ComponentUI createUI(JComponent c) { + return new BaseScrollBarUI(); + } + + protected void installDefaults() { + super.installDefaults(); + + scrollBarWidth = UIManager.getInt("ScrollBar.width"); + incrGap = UIManager.getInt("ScrollBar.incrementButtonGap"); + decrGap = UIManager.getInt("ScrollBar.decrementButtonGap"); + + // TODO this can be removed when incrGap/decrGap become protected + // handle scaling for sizeVarients for special case components. The + // key "JComponent.sizeVariant" scales for large/small/mini + // components are based on Apples LAF + String scaleKey = (String)scrollbar.getClientProperty("JComponent.sizeVariant"); + if (scaleKey != null){ + if ("large".equals(scaleKey)){ + scrollBarWidth *= 1.15; + incrGap *= 1.15; + decrGap *= 1.15; + } else if ("small".equals(scaleKey)){ + scrollBarWidth *= 0.857; + incrGap *= 0.857; + decrGap *= 0.857; + } else if ("mini".equals(scaleKey)){ + scrollBarWidth *= 0.714; + incrGap *= 0.714; + decrGap *= 0.714; + } + } + } + + protected JButton createDecreaseButton(int orientation) { + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + return new InvisibleScrollButton(); + } else { + return new BaseScrollButton(orientation, scrollBarWidth); + } + } + + protected JButton createIncreaseButton(int orientation) { + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + return new InvisibleScrollButton(); + } else { + return new BaseScrollButton(orientation, scrollBarWidth); + } + } + + public TrackListener createTrackListener() { + return new MyTrackListener(); + } + + public Dimension getPreferredSize(JComponent c) { + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + return new Dimension(scrollBarWidth + 1, scrollBarWidth * 3); + } else { + return new Dimension(scrollBarWidth * 3, scrollBarWidth); + } + } else { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + return new Dimension(scrollBarWidth, scrollBarWidth * 3 + 16); + } else { + return new Dimension(scrollBarWidth * 3 + 16, scrollBarWidth); + } + } + } + + protected Dimension getMinimumThumbSize() { + return new Dimension(scrollBarWidth, scrollBarWidth); + } + + protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) { + int w = c.getWidth(); + int h = c.getHeight(); + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + Color bc = ColorHelper.darker(AbstractLookAndFeel.getTheme().getBackgroundColor(), 4); + g.setColor(bc); + g.fillRect(0, 0, w, h); + } else { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + JTattooUtilities.fillVerGradient(g, AbstractLookAndFeel.getTheme().getTrackColors(), 0, 0, w, h); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getTrackColors(), 0, 0, w, h); + } + } + } + + protected Color[] getThumbColors() { + if (isRollover || isDragging) { + return AbstractLookAndFeel.getTheme().getRolloverColors(); + } else if (!JTattooUtilities.isActive(scrollbar)) { + return AbstractLookAndFeel.getTheme().getInActiveColors(); + } else { + return AbstractLookAndFeel.getTheme().getThumbColors(); + } + } + + protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { + if (!c.isEnabled()) { + return; + } + + g.translate(thumbBounds.x, thumbBounds.y); + + Color colors[] = getThumbColors(); + + Color frameColorHi = ColorHelper.brighter(colors[1], 20); + Color frameColorLo = ColorHelper.darker(colors[colors.length - 1], 10); + + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + JTattooUtilities.fillVerGradient(g, colors, 1, 1, thumbBounds.width - 1, thumbBounds.height - 1); + JTattooUtilities.draw3DBorder(g, frameColorLo, ColorHelper.darker(frameColorLo, 15), 0, 0, thumbBounds.width, thumbBounds.height); + + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); + g.setColor(frameColorHi); + g.drawLine(1, 1, thumbBounds.width - 2, 1); + g.drawLine(1, 1, 1, thumbBounds.height - 2); + + if (!AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + int dx = 5; + int dy = thumbBounds.height / 2 - 3; + int dw = thumbBounds.width - 11; + + Color c1 = Color.white; + Color c2 = Color.darkGray; + + for (int i = 0; i < 4; i++) { + g.setColor(c1); + g.drawLine(dx, dy, dx + dw, dy); + dy++; + g.setColor(c2); + g.drawLine(dx, dy, dx + dw, dy); + dy++; + } + } + g2D.setComposite(savedComposite); + } else { // HORIZONTAL + JTattooUtilities.fillHorGradient(g, colors, 1, 1, thumbBounds.width - 1, thumbBounds.height - 1); + JTattooUtilities.draw3DBorder(g, frameColorLo, ColorHelper.darker(frameColorLo, 10), 0, 0, thumbBounds.width, thumbBounds.height); + + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); + g.setColor(frameColorHi); + g.drawLine(1, 1, thumbBounds.width - 2, 1); + g.drawLine(1, 1, 1, thumbBounds.height - 2); + + if (!AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + int dx = thumbBounds.width / 2 - 3; + int dy = 5; + int dh = thumbBounds.height - 11; + + Color c1 = Color.white; + Color c2 = Color.darkGray; + + for (int i = 0; i < 4; i++) { + g.setColor(c1); + g.drawLine(dx, dy, dx, dy + dh); + dx++; + g.setColor(c2); + g.drawLine(dx, dy, dx, dy + dh); + dx++; + } + } + } + g2D.setComposite(savedComposite); + + g.translate(-thumbBounds.x, -thumbBounds.y); + } + + protected void layoutVScrollbar(JScrollBar sb) { + if (AbstractLookAndFeel.getTheme().isLinuxStyleScrollBarOn() && incrButton.isVisible() && decrButton.isVisible()) { + Dimension sbSize = sb.getSize(); + Insets sbInsets = sb.getInsets(); + int sizeH = sbSize.height - sbInsets.top - sbInsets.bottom; + + /* + * Width and left edge of the buttons and thumb. + */ + int itemX = sbInsets.left; + int itemW = sbSize.width - (sbInsets.left + sbInsets.right); + int itemH = Math.min(itemW, sizeH / 2); + + /* Nominal locations of the buttons, assuming their preferred + * size will fit. + */ + int decrButtonY = sbSize.height - sbInsets.bottom - itemH - itemH + 1; + int incrButtonY = sbSize.height - sbInsets.bottom - itemH; + + /* Compute the height and origin of the thumb. The case + * where the thumb is at the bottom edge is handled specially + * to avoid numerical problems in computing thumbY. Enforce + * the thumbs min/max dimensions. If the thumb doesn't + * fit in the track (trackH) we'll hide it later. + */ + float trackH = sbSize.height - sbInsets.top - sbInsets.bottom - itemW - itemW + 1; + float min = sb.getMinimum(); + float max = sb.getMaximum(); + float extent = sb.getVisibleAmount(); + float range = max - min; + float value = sb.getValue(); + + int maxThumbH = getMaximumThumbSize().height; + int minThumbH = getMinimumThumbSize().height; + int thumbH = (range <= 0) ? maxThumbH : (int) (trackH * (extent / range)); + thumbH = Math.max(thumbH, minThumbH); + thumbH = Math.min(thumbH, maxThumbH); + + int thumbY = decrButtonY - thumbH; + if (value < (max - extent)) { + float thumbRange = trackH - thumbH; + thumbY = (int) (0.5f + (thumbRange * ((value - min) / (range - extent)))); + } + + /* If the thumb isn't going to fit, zero it's bounds. Otherwise + * make sure it fits between the buttons. Note that setting the + * thumbs bounds will cause a repaint. + */ + if (thumbH > trackH) { + setThumbBounds(0, 0, 0, 0); + } else { + setThumbBounds(itemX, thumbY, itemW, thumbH); + } + decrButton.setBounds(itemX, decrButtonY, itemW, itemH); + incrButton.setBounds(itemX, incrButtonY, itemW, itemH); + + /* Update the trackRect field. + */ + trackRect.setBounds(itemX, 0, itemW, (int)trackH); + + } else { + super.layoutVScrollbar(sb); + } + } + + protected void layoutHScrollbar(JScrollBar sb) { + if (AbstractLookAndFeel.getTheme().isLinuxStyleScrollBarOn() && incrButton.isVisible() && decrButton.isVisible()) { + Dimension sbSize = sb.getSize(); + Insets sbInsets = sb.getInsets(); + int sizeW = sbSize.width - sbInsets.left - sbInsets.right; + + /* + * Height and top edge of the buttons and thumb. + */ + int itemY = sbInsets.top; + int itemH = sbSize.height - (sbInsets.top + sbInsets.bottom);//Math.min(itemW, sizeH / 2); + int itemW = Math.min(itemH, sizeW / 2);//sbSize.width - (sbInsets.left + sbInsets.right); + + /* Nominal locations of the buttons, assuming their preferred + * size will fit. + */ + int decrButtonX = sbSize.width - sbInsets.right - itemW - itemW + 1; + int incrButtonX = sbSize.width - sbInsets.right - itemW; + + /* Compute the width and origin of the thumb. The case + * where the thumb is at the right edge is handled specially + * to avoid numerical problems in computing thumbX. Enforce + * the thumbs min/max dimensions. If the thumb doesn't + * fit in the track (trackW) we'll hide it later. + */ + float trackW = sbSize.width - sbInsets.left - sbInsets.right - itemH - itemH + 1; + float min = sb.getMinimum(); + float max = sb.getMaximum(); + float extent = sb.getVisibleAmount(); + float range = max - min; + float value = sb.getValue(); + + int maxThumbW = getMaximumThumbSize().width; + int minThumbW = getMinimumThumbSize().width; + int thumbW = (range <= 0) ? maxThumbW : (int) (trackW * (extent / range)); + thumbW = Math.max(thumbW, minThumbW); + thumbW = Math.min(thumbW, maxThumbW); + + int thumbX = decrButtonX - thumbW; + if (value < (max - extent)) { + float thumbRange = trackW - thumbW; + thumbX = (int) (0.5f + (thumbRange * ((value - min) / (range - extent)))); + } + + /* If the thumb isn't going to fit, zero it's bounds. Otherwise + * make sure it fits between the buttons. Note that setting the + * thumbs bounds will cause a repaint. + */ + if (thumbW > trackW) { + setThumbBounds(0, 0, 0, 0); + } else { + setThumbBounds(thumbX, itemY, thumbW, itemH); + } + decrButton.setBounds(decrButtonX, itemY, itemW, itemH); + incrButton.setBounds(incrButtonX, itemY, itemW, itemH); + + /* Update the trackRect field. + */ + trackRect.setBounds(0, itemY, (int)trackW, itemH); + + } else { + super.layoutHScrollbar(sb); + } + } + +//----------------------------------------------------------------------------- +// inner classes +//----------------------------------------------------------------------------- + protected class MyTrackListener extends TrackListener { + + public void mouseEntered(MouseEvent e) { + super.mouseEntered(e); + isRollover = true; + Rectangle r = getTrackBounds(); + scrollbar.repaint(r.x, r.y, r.width, r.height); + } + + public void mouseExited(MouseEvent e) { + super.mouseExited(e); + isRollover = false; + Rectangle r = getTrackBounds(); + scrollbar.repaint(r.x, r.y, r.width, r.height); + } + + public void mousePressed(MouseEvent e) { + super.mousePressed(e); + Rectangle r = getTrackBounds(); + scrollbar.repaint(r.x, r.y, r.width, r.height); + } + + public void mouseReleased(MouseEvent e) { + super.mouseReleased(e); + Rectangle r = getTrackBounds(); + scrollbar.repaint(r.x, r.y, r.width, r.height); + } + } + +//----------------------------------------------------------------------------- + private static class InvisibleScrollButton extends JButton { + + public InvisibleScrollButton() { + super(); + setVisible(false); + } + + public Dimension getPreferredSize() { + return new Dimension(0, 0); + } + + } +} diff --git a/src/com/jtattoo/plaf/BaseScrollButton.java b/src/com/jtattoo/plaf/BaseScrollButton.java new file mode 100644 index 0000000..57d8300 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseScrollButton.java @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.Icon; +import javax.swing.plaf.basic.BasicArrowButton; + +/** + * @author Michael Hagen + */ +public class BaseScrollButton extends BasicArrowButton { + + protected int buttonWidth = 24; + + public BaseScrollButton(int direction, int width) { + super(direction); + buttonWidth = width; + } + + public void paint(Graphics g) { + boolean isPressed = getModel().isPressed(); + boolean isRollover = getModel().isRollover(); + + int width = getWidth(); + int height = getHeight(); + + Color colors[]; + if (isPressed) { + colors = AbstractLookAndFeel.getTheme().getPressedColors(); + } else if (isRollover) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getButtonColors(); + } + + boolean inverse = ColorHelper.getGrayValue(colors) < 128; + + Color frameColorHi = ColorHelper.brighter(colors[0], 20); + Color frameColorLo = ColorHelper.darker(colors[colors.length - 1], 20); + + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + if ((getDirection() == NORTH) || (getDirection() == SOUTH)) { + JTattooUtilities.fillVerGradient(g2D, colors, 0, 0, width, height); + } else { + JTattooUtilities.fillHorGradient(g2D, colors, 0, 0, width, height); + } + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); + if (getDirection() == NORTH) { + Icon upArrow = inverse ? BaseIcons.getUpArrowInverseIcon() : BaseIcons.getUpArrowIcon(); + int x = (width / 2) - (upArrow.getIconWidth() / 2); + int y = (height / 2) - (upArrow.getIconHeight() / 2) - 1; + upArrow.paintIcon(this, g2D, x, y); + } else if (getDirection() == SOUTH) { + Icon downArrow = inverse ? BaseIcons.getDownArrowInverseIcon() : BaseIcons.getDownArrowIcon(); + int x = (width / 2) - (downArrow.getIconWidth() / 2); + int y = (height / 2) - (downArrow.getIconHeight() / 2); + downArrow.paintIcon(this, g2D, x, y); + } else if (getDirection() == WEST) { + Icon leftArrow = inverse ? BaseIcons.getLeftArrowInverseIcon() : BaseIcons.getLeftArrowIcon(); + int x = (width / 2) - (leftArrow.getIconWidth() / 2) - 1; + int y = (height / 2) - (leftArrow.getIconHeight() / 2); + leftArrow.paintIcon(this, g2D, x, y); + } else { + Icon rightArrow = inverse ? BaseIcons.getRightArrowInverseIcon() : BaseIcons.getRightArrowIcon(); + int x = (width / 2) - (rightArrow.getIconWidth() / 2); + int y = (height / 2) - (rightArrow.getIconHeight() / 2); + rightArrow.paintIcon(this, g2D, x, y); + } + JTattooUtilities.draw3DBorder(g2D, frameColorLo, ColorHelper.darker(frameColorLo, 10), 0, 0, width, height); + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f)); + g2D.setColor(frameColorHi); + g2D.drawLine(1, 1, width - 2, 1); + g2D.drawLine(1, 1, 1, height - 2); + + g2D.setComposite(savedComposite); + } + + public Dimension getPreferredSize() { + if (getDirection() == NORTH) { + return new Dimension(buttonWidth, buttonWidth + 1); + } else if (getDirection() == SOUTH) { + return new Dimension(buttonWidth, buttonWidth + 1); + } else if (getDirection() == EAST) { + return new Dimension(buttonWidth + 1, buttonWidth); + } else if (getDirection() == WEST) { + return new Dimension(buttonWidth + 1, buttonWidth); + } else { + return new Dimension(0, 0); + } + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + public Dimension getMaximumSize() { + return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + } + + public int getButtonWidth() { + return buttonWidth; + } +} + diff --git a/src/com/jtattoo/plaf/BaseScrollPaneUI.java b/src/com/jtattoo/plaf/BaseScrollPaneUI.java new file mode 100644 index 0000000..b925d30 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseScrollPaneUI.java @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicScrollPaneUI; + +/** + * @author Michael Hagen + */ +public class BaseScrollPaneUI extends BasicScrollPaneUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseScrollPaneUI(); + } + +} diff --git a/src/com/jtattoo/plaf/BaseSeparatorUI.java b/src/com/jtattoo/plaf/BaseSeparatorUI.java new file mode 100644 index 0000000..bd73a93 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseSeparatorUI.java @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSeparatorUI; + +/** + * @author Michael Hagen + */ +public class BaseSeparatorUI extends BasicSeparatorUI { + + private static final Dimension size = new Dimension(2, 3); + + public static ComponentUI createUI(JComponent c) { + return new BaseSeparatorUI(); + } + + public void paint(Graphics g, JComponent c) { + boolean horizontal = true; + if (c instanceof JSeparator) { + horizontal = (((JSeparator) c).getOrientation() == JSeparator.HORIZONTAL); + } + Color background = (c instanceof JPopupMenu.Separator) ? AbstractLookAndFeel.getMenuBackgroundColor() : AbstractLookAndFeel.getBackgroundColor(); + if (horizontal) { + int w = c.getWidth(); + g.setColor(background); + g.drawLine(0, 0, w, 0); + g.setColor(ColorHelper.darker(background, 30)); + g.drawLine(0, 1, w, 1); + g.setColor(ColorHelper.brighter(background, 50)); + g.drawLine(0, 2, w, 2); + } else { + int h = c.getHeight(); + g.setColor(ColorHelper.darker(background, 30)); + g.drawLine(0, 0, 0, h); + g.setColor(ColorHelper.brighter(background, 50)); + g.drawLine(1, 0, 1, h); + } + } + + public Dimension getPreferredSize(JComponent c) { + return size; + } +} + + + + diff --git a/src/com/jtattoo/plaf/BaseSliderUI.java b/src/com/jtattoo/plaf/BaseSliderUI.java new file mode 100644 index 0000000..8cde2e1 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseSliderUI.java @@ -0,0 +1,377 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JSlider; +import javax.swing.UIManager; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSliderUI; + +/** + * @author Michael Hagen + */ +public class BaseSliderUI extends BasicSliderUI { + + protected boolean isRollover = false; + + public BaseSliderUI(JSlider slider) { + super(slider); + } + + public static ComponentUI createUI(JComponent c) { + return new BaseSliderUI((JSlider) c); + } + + public TrackListener createTrackListener(JSlider slider) { + return new MyTrackListener(); + } + + public Icon getThumbHorIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + return ((AbstractLookAndFeel) UIManager.getLookAndFeel()).getIconFactory().getThumbHorIcon(); + } + return null; + } + + public Icon getThumbHorIconRollover() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + return ((AbstractLookAndFeel) UIManager.getLookAndFeel()).getIconFactory().getThumbHorIconRollover(); + } + return null; + } + + public Icon getThumbVerIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + return ((AbstractLookAndFeel) UIManager.getLookAndFeel()).getIconFactory().getThumbVerIcon(); + } + return null; + } + + public Icon getThumbVerIconRollover() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + return ((AbstractLookAndFeel) UIManager.getLookAndFeel()).getIconFactory().getThumbVerIconRollover(); + } + return null; + } + + protected int getTrackWidth() { + if (slider.getOrientation() == JSlider.HORIZONTAL) { + return (thumbRect.height - 9); + } else { + return (thumbRect.width - 9); + } + } + + protected Dimension getThumbSize() { + Dimension size = super.getThumbSize(); + if ((getThumbHorIcon() != null) && (getThumbVerIcon() != null)) { + if (slider.getOrientation() == JSlider.HORIZONTAL) { + size.width = getThumbHorIcon().getIconWidth(); + size.height = getThumbHorIcon().getIconHeight(); + } else { + size.width = getThumbVerIcon().getIconWidth(); + size.height = getThumbVerIcon().getIconHeight(); + } + } + return size; + } + + public void paint(Graphics g, JComponent c) { + paintBackground(g, c); + recalculateIfInsetsChanged(); + recalculateIfOrientationChanged(); + Rectangle clip = g.getClipBounds(); + + if ( !clip.intersects(trackRect) && slider.getPaintTrack()) { + calculateGeometry(); + } + + if (slider.getPaintTrack() && clip.intersects(trackRect)) { + paintTrack(g); + } + if (slider.getPaintTicks() && clip.intersects(tickRect)) { + paintTicks(g); + } + if (slider.getPaintLabels() && clip.intersects(labelRect)) { + paintLabels(g); + } + if (slider.hasFocus() && clip.intersects(focusRect)) { + paintFocus(g); + } + if (clip.intersects(thumbRect)) { + paintThumb(g); + } + } + + public void paintBackground(Graphics g, JComponent c) { + if (c.isOpaque()) { + if (c.getBackground() instanceof ColorUIResource) { + g.setColor(AbstractLookAndFeel.getBackgroundColor()); + } else { + g.setColor(c.getBackground()); + } + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + + public void paintTrack(Graphics g) { + boolean leftToRight = JTattooUtilities.isLeftToRight(slider); + + g.translate(trackRect.x, trackRect.y); + int overhang = 4; + int trackLeft = 0; + int trackTop = 0; + int trackRight; + int trackBottom; + + if (slider.getOrientation() == JSlider.HORIZONTAL) { + trackBottom = (trackRect.height - 1) - overhang; + trackTop = trackBottom - (getTrackWidth() - 1); + trackRight = trackRect.width - 1; + } else { + if (leftToRight) { + trackLeft = (trackRect.width - overhang) - getTrackWidth(); + trackRight = (trackRect.width - overhang) - 1; + } else { + trackLeft = overhang; + trackRight = overhang + getTrackWidth() - 1; + } + trackBottom = trackRect.height - 1; + } + + g.setColor(AbstractLookAndFeel.getFrameColor()); + g.drawRect(trackLeft, trackTop, (trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1); + + int middleOfThumb; + int fillTop; + int fillLeft; + int fillBottom; + int fillRight; + + if (slider.getOrientation() == JSlider.HORIZONTAL) { + middleOfThumb = thumbRect.x + (thumbRect.width / 2); + middleOfThumb -= trackRect.x; + fillTop = trackTop + 1; + fillBottom = trackBottom - 2; + + if (!drawInverted()) { + fillLeft = trackLeft + 1; + fillRight = middleOfThumb; + } else { + fillLeft = middleOfThumb; + fillRight = trackRight - 2; + } + Color colors[]; + if (!JTattooUtilities.isActive(slider)) { + colors = AbstractLookAndFeel.getTheme().getInActiveColors(); + } else { + if (slider.isEnabled()) { + colors = AbstractLookAndFeel.getTheme().getSliderColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + } + JTattooUtilities.fillHorGradient(g, colors, fillLeft + 2, fillTop + 2, fillRight - fillLeft - 2, fillBottom - fillTop - 2); + Color cHi = ColorHelper.darker(colors[colors.length - 1], 5); + Color cLo = ColorHelper.darker(colors[colors.length - 1], 10); + JTattooUtilities.draw3DBorder(g, cHi, cLo, fillLeft + 1, fillTop + 1, fillRight - fillLeft - 1, fillBottom - fillTop - 1); + } else { + middleOfThumb = thumbRect.y + (thumbRect.height / 2); + middleOfThumb -= trackRect.y; + fillLeft = trackLeft + 1; + fillRight = trackRight - 2; + + if (!drawInverted()) { + fillTop = middleOfThumb; + fillBottom = trackBottom - 2; + } else { + fillTop = trackTop + 1; + fillBottom = middleOfThumb; + } + Color colors[]; + if (!JTattooUtilities.isActive(slider)) { + colors = AbstractLookAndFeel.getTheme().getInActiveColors(); + } else { + if (slider.isEnabled()) { + colors = AbstractLookAndFeel.getTheme().getSliderColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + } + JTattooUtilities.fillVerGradient(g, colors, fillLeft + 2, fillTop + 2, fillRight - fillLeft - 2, fillBottom - fillTop - 2); + Color cHi = ColorHelper.darker(colors[colors.length - 1], 5); + Color cLo = ColorHelper.darker(colors[colors.length - 1], 10); + JTattooUtilities.draw3DBorder(g, cHi, cLo, fillLeft + 1, fillTop + 1, fillRight - fillLeft - 1, fillBottom - fillTop - 1); + } + g.translate(-trackRect.x, -trackRect.y); + } + + public void paintTicks(Graphics g) { + boolean leftToRight = JTattooUtilities.isLeftToRight(slider); + Rectangle tickBounds = tickRect; + g.setColor(slider.getForeground()); + if (slider.getOrientation() == JSlider.HORIZONTAL) { + g.translate(0, tickBounds.y); + + int value = slider.getMinimum(); + int xPos; + + if (slider.getMinorTickSpacing() > 0) { + while (value <= slider.getMaximum()) { + xPos = xPositionForValue(value); + paintMinorTickForHorizSlider(g, tickBounds, xPos); + value += slider.getMinorTickSpacing(); + } + } + + if (slider.getMajorTickSpacing() > 0) { + value = slider.getMinimum(); + while (value <= slider.getMaximum()) { + xPos = xPositionForValue(value); + paintMajorTickForHorizSlider(g, tickBounds, xPos); + value += slider.getMajorTickSpacing(); + } + } + + g.translate(0, -tickBounds.y); + } else { + g.translate(tickBounds.x, 0); + + int value = slider.getMinimum(); + int yPos; + + if (slider.getMinorTickSpacing() > 0) { + int offset = 0; + if (!leftToRight) { + offset = tickBounds.width - tickBounds.width / 2; + g.translate(offset, 0); + } + + while (value <= slider.getMaximum()) { + yPos = yPositionForValue(value); + paintMinorTickForVertSlider(g, tickBounds, yPos); + value += slider.getMinorTickSpacing(); + } + if (!leftToRight) { + g.translate(-offset, 0); + } + } + + if (slider.getMajorTickSpacing() > 0) { + value = slider.getMinimum(); + if (!leftToRight) { + g.translate(2, 0); + } + + while (value <= slider.getMaximum()) { + yPos = yPositionForValue(value); + paintMajorTickForVertSlider(g, tickBounds, yPos); + value += slider.getMajorTickSpacing(); + } + + if (!leftToRight) { + g.translate(-2, 0); + } + } + g.translate(-tickBounds.x, 0); + } + } + + protected boolean isDragging() { + if (JTattooUtilities.getJavaVersion() >= 1.5) { + return super.isDragging(); + } else { + return false; + } + } + + public void paintThumb(Graphics g) { + Icon icon; + if (slider.getOrientation() == JSlider.HORIZONTAL) { + if ((isRollover || isDragging()) && slider.isEnabled()) { + icon = getThumbHorIconRollover(); + } else { + icon = getThumbHorIcon(); + } + } else { + if ((isRollover || isDragging()) && slider.isEnabled()) { + icon = getThumbVerIconRollover(); + } else { + icon = getThumbVerIcon(); + } + } + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + if (!slider.isEnabled()) { + g.setColor(AbstractLookAndFeel.getBackgroundColor()); + g.fillRect(thumbRect.x + 1, thumbRect.y + 1, thumbRect.width - 2, thumbRect.height - 2); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + } + icon.paintIcon(null, g, thumbRect.x, thumbRect.y); + g2D.setComposite(savedComposite); + } + + protected class MyTrackListener extends TrackListener { + + public void mouseEntered(MouseEvent e) { + super.mouseEntered(e); + if (slider.isEnabled()) { + isRollover = thumbRect.contains(e.getPoint()); + slider.repaint(); + } + } + + public void mouseMoved(MouseEvent e) { + super.mouseMoved(e); + if (slider.isEnabled()) { + boolean rollover = thumbRect.contains(e.getPoint()); + if (rollover != isRollover) { + isRollover = rollover; + slider.repaint(); + } + } + } + + public void mouseExited(MouseEvent e) { + super.mouseExited(e); + if (slider.isEnabled()) { + isRollover = false; + slider.repaint(); + } + } + + } +} diff --git a/src/com/jtattoo/plaf/BaseSpinnerUI.java b/src/com/jtattoo/plaf/BaseSpinnerUI.java new file mode 100644 index 0000000..2d6dfa2 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseSpinnerUI.java @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSpinnerUI; + +/** + * + * @author Michael Hagen + */ +public class BaseSpinnerUI extends BasicSpinnerUI { + /** + * Used by the default LayoutManager class - SpinnerLayout for + * missing (null) editor/nextButton/previousButton children. + */ + private static final Dimension zeroSize = new Dimension(0, 0); + + private MyLayoutManager myLayoutManager = null; + + /** + * Returns a new instance of BaseSpinnerUI. SpinnerListUI + * delegates are allocated one per JSpinner. + * + * @param c the JSpinner (not used) + * @see ComponentUI#createUI + * @return a new BasicSpinnerUI object + */ + public static ComponentUI createUI(JComponent c) { + return new BaseSpinnerUI(); + } + + /** + * Create a LayoutManager that manages the editor, + * nextButton, and previousButton + * children of the JSpinner. These three children must be + * added with a constraint that identifies their role: + * "Editor", "Next", and "Previous". The default layout manager + * can handle the absence of any of these children. + * + * @return a LayoutManager for the editor, next button, and previous button. + * @see #createNextButton + * @see #createPreviousButton + * @see #createEditor + */ + protected LayoutManager createLayout() { + if (myLayoutManager == null) { + myLayoutManager = new MyLayoutManager(); + } + return myLayoutManager; + } + + protected Component createNextButton() { + JButton button = new SpinButton(SwingConstants.NORTH); + if (JTattooUtilities.isLeftToRight(spinner)) { + Border border = BorderFactory.createMatteBorder(0, 1, 1, 0, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } else { + Border border = BorderFactory.createMatteBorder(0, 0, 1, 1, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } + installNextButtonListeners(button); + return button; + } + + protected Component createPreviousButton() { + JButton button = new SpinButton(SwingConstants.SOUTH); + if (JTattooUtilities.isLeftToRight(spinner)) { + Border border = BorderFactory.createMatteBorder(0, 1, 0, 0, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } else { + Border border = BorderFactory.createMatteBorder(0, 0, 0, 1, AbstractLookAndFeel.getFrameColor()); + button.setBorder(border); + } + installPreviousButtonListeners(button); + return button; + } + + +//----------------------------------------------------------------------------------------- +// inner classes +//----------------------------------------------------------------------------------------- + public static class SpinButton extends NoFocusButton { + + private static final Dimension minSize = new Dimension(14, 12); + private int direction = SwingConstants.NORTH; + + public SpinButton(int aDirection) { + super(); + setInheritsPopupMenu(true); + direction = aDirection; + } + + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + size.width = Math.max(size.width, minSize.width); + size.height = Math.max(size.height, minSize.height); + return size; + } + + public void paint(Graphics g) { + Color colors[]; + if (isEnabled()) { + ButtonModel model = getModel(); + if (model.isPressed() && model.isArmed()) { + colors = AbstractLookAndFeel.getTheme().getPressedColors(); + } else { + if (model.isRollover()) + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + else if (JTattooUtilities.isFrameActive(this)) + colors = AbstractLookAndFeel.getTheme().getButtonColors(); + else + colors = AbstractLookAndFeel.getTheme().getInActiveColors(); + } + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + JTattooUtilities.fillHorGradient(g, colors, 0, 0, getWidth(), getHeight()); + paintBorder(g); + g.setColor(getForeground()); + int w = 4; + int h = 3; + int x = (getWidth() - w) / 2; + int y = (getHeight() - h) / 2; + if (direction == SwingConstants.NORTH) { + for (int i = 0; i < h; i++) { + g.drawLine(x + (h - i) - 1, y + i, x + w - (h - i) + 1, y + i); + } + } else { + for (int i = 0; i < h; i++) { + g.drawLine(x + i, y + i, x + w - i, y + i); + } + } + } + + } + +//---------------------------------------------------------------------------------------------- +// inner classes +//---------------------------------------------------------------------------------------------- + private static class MyLayoutManager implements LayoutManager { + + private Component nextButton = null; + private Component previousButton = null; + private Component editor = null; + + public void addLayoutComponent(String name, Component c) { + if ("Next".equals(name)) { + nextButton = c; + } else if ("Previous".equals(name)) { + previousButton = c; + } else if ("Editor".equals(name)) { + editor = c; + } + } + + public void removeLayoutComponent(Component c) { + if (c == nextButton) { + nextButton = null; + } else if (c == previousButton) { + previousButton = null; + } else if (c == editor) { + editor = null; + } + } + + private Dimension preferredSize(Component c) { + return (c == null) ? zeroSize : c.getPreferredSize(); + } + + public Dimension preferredLayoutSize(Container parent) { + Dimension nextD = preferredSize(nextButton); + Dimension previousD = preferredSize(previousButton); + Dimension editorD = preferredSize(editor); + + // Force the editors height to be a multiple of 2 + editorD.height = ((editorD.height + 1) / 2) * 2; + + Dimension size = new Dimension(editorD.width, editorD.height); + size.width += Math.max(nextD.width, previousD.width); + Insets insets = parent.getInsets(); + size.width += insets.left + insets.right; + size.height += insets.top + insets.bottom + 4; + return size; + } + + public Dimension minimumLayoutSize(Container parent) { + return preferredLayoutSize(parent); + } + + private void setBounds(Component c, int x, int y, int width, int height) { + if (c != null) { + c.setBounds(x, y, width, height); + } + } + + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + + Insets insets = parent.getInsets(); + Dimension nextD = preferredSize(nextButton); + Dimension previousD = preferredSize(previousButton); + int buttonsWidth = Math.max(nextD.width, previousD.width); + int editorHeight = height - (insets.top + insets.bottom); + + // The arrowButtonInsets value is used instead of the JSpinner's + // insets if not null. Defining this to be (0, 0, 0, 0) causes the + // buttons to be aligned with the outer edge of the spinner's + // border, and leaving it as "null" places the buttons completely + // inside the spinner's border. + Insets buttonInsets = UIManager.getInsets("Spinner.arrowButtonInsets"); + if (buttonInsets == null) { + buttonInsets = insets; + } + + // Deal with the spinner's componentOrientation property. + int editorX, editorWidth, buttonsX; + if (parent.getComponentOrientation().isLeftToRight()) { + editorX = insets.left; + editorWidth = width - insets.left - buttonsWidth - buttonInsets.right; + buttonsX = width - buttonsWidth - buttonInsets.right; + } else { + buttonsX = buttonInsets.left; + editorX = buttonsX + buttonsWidth; + editorWidth = width - buttonInsets.left - buttonsWidth - insets.right; + } + + int nextY = buttonInsets.top; + int nextHeight = (height / 2) + (height % 2) - nextY; + int previousY = buttonInsets.top + nextHeight; + int previousHeight = height - previousY - buttonInsets.bottom; + + setBounds(editor, editorX, insets.top, editorWidth, editorHeight); + setBounds(nextButton, buttonsX, nextY, buttonsWidth, nextHeight); + setBounds(previousButton, buttonsX, previousY, buttonsWidth, previousHeight); + } + + } + +} diff --git a/src/com/jtattoo/plaf/BaseSplitPaneDivider.java b/src/com/jtattoo/plaf/BaseSplitPaneDivider.java new file mode 100644 index 0000000..2d8d798 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseSplitPaneDivider.java @@ -0,0 +1,330 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.basic.BasicSplitPaneDivider; +import javax.swing.plaf.basic.BasicSplitPaneUI; + +/** + * @author Michael Hagen + */ +public class BaseSplitPaneDivider extends BasicSplitPaneDivider { + + protected boolean centerOneTouchButtons = true; + protected boolean flatMode = false; + + public BaseSplitPaneDivider(BasicSplitPaneUI ui) { + super(ui); + if (JTattooUtilities.getJavaVersion() >= 1.4) { + if (UIManager.get("SplitPane.centerOneTouchButtons") != null) { + centerOneTouchButtons = UIManager.getBoolean("SplitPane.centerOneTouchButtons"); + } + } + setLayout(new MyDividerLayout()); + Object flatModeProperty = ui.getSplitPane().getClientProperty("flatMode"); + if (flatModeProperty instanceof Boolean) { + flatMode = ((Boolean)flatModeProperty).booleanValue(); + } + } + + public boolean isFlatMode() { + return flatMode; + } + + public void setFlatMode(boolean flatMode) { + this.flatMode = flatMode; + } + + public Border getBorder() { + return null; + } + + public Color getRolloverColor() { + return ColorHelper.darker(AbstractLookAndFeel.getTheme().getRolloverColor(), 16); + } + + public void paint(Graphics g) { + if (!isFlatMode()) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + int width = getSize().width; + int height = getSize().height; + int dx = 0; + int dy = 0; + if ((width % 2) == 1) { + dx = 1; + } + if ((height % 2) == 1) { + dy = 1; + } + Color color = AbstractLookAndFeel.getBackgroundColor(); + Color cHi = ColorHelper.brighter(color, 25); + Color cLo = ColorHelper.darker(color, 5); + Color colors[] = ColorHelper.createColorArr(cHi, cLo, 10); + + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel) UIManager.getLookAndFeel(); + if (orientation == JSplitPane.HORIZONTAL_SPLIT) { + JTattooUtilities.fillVerGradient(g, colors, 0, 0, width, height); + Icon horBumps = laf.getIconFactory().getSplitterHorBumpIcon(); + if ((horBumps != null) && (width > horBumps.getIconWidth())) { + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f); + g2D.setComposite(alpha); + + if (splitPane.isOneTouchExpandable() && centerOneTouchButtons) { + int centerY = height / 2; + int x = (width - horBumps.getIconWidth()) / 2 + dx; + int y = centerY - horBumps.getIconHeight() - 40; + horBumps.paintIcon(this, g, x, y); + y = centerY + 40; + horBumps.paintIcon(this, g, x, y); + } else { + int x = (width - horBumps.getIconWidth()) / 2 + dx; + int y = (height - horBumps.getIconHeight()) / 2; + horBumps.paintIcon(this, g, x, y); + } + } + } else { + JTattooUtilities.fillHorGradient(g, colors, 0, 0, width, height); + Icon verBumps = laf.getIconFactory().getSplitterVerBumpIcon(); + if ((verBumps != null) && (height > verBumps.getIconHeight())) { + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f); + g2D.setComposite(alpha); + if (splitPane.isOneTouchExpandable() && centerOneTouchButtons) { + int centerX = width / 2; + int x = centerX - verBumps.getIconWidth() - 40; + int y = (height - verBumps.getIconHeight()) / 2 + dy; + verBumps.paintIcon(this, g, x, y); + x = centerX + 40; + verBumps.paintIcon(this, g, x, y); + } else { + int x = (width - verBumps.getIconWidth()) / 2; + int y = (height - verBumps.getIconHeight()) / 2 + dy; + verBumps.paintIcon(this, g, x, y); + } + } + } + } + g2D.setComposite(savedComposite); + } + paintComponents(g); + } + + protected JButton createLeftOneTouchButton() { + JButton b = new JButton() { + + public void paint(Graphics g) { + Color color = getBackground(); + int w = getSize().width; + int h = getSize().height; + if (getModel().isPressed() && getModel().isArmed()) { + g.setColor(ColorHelper.darker(color, 40)); + g.fillRect(0, 0, w, h); + } else if (getModel().isRollover()) { + g.setColor(getRolloverColor()); + g.fillRect(0, 0, w, h); + } + Icon icon; + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel lf = (AbstractLookAndFeel) UIManager.getLookAndFeel(); + if (orientation == JSplitPane.HORIZONTAL_SPLIT) { + icon = lf.getIconFactory().getSplitterLeftArrowIcon(); + } else { + icon = lf.getIconFactory().getSplitterUpArrowIcon(); + } + int x = (w - icon.getIconWidth()) / 2; + int y = (h - icon.getIconHeight()) / 2; + icon.paintIcon(this, g, x, y); + } + if (getModel().isArmed()) { + if (getModel().isPressed()) { + JTattooUtilities.draw3DBorder(g, ColorHelper.darker(color, 30), ColorHelper.brighter(color, 80), 0, 0, w, h); + } else { + JTattooUtilities.draw3DBorder(g, ColorHelper.brighter(color, 80), ColorHelper.darker(color, 30), 0, 0, w, h); + } + } + } + + @SuppressWarnings("deprecation") + public boolean isFocusTraversable() { + return false; + } + }; + b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + b.setFocusPainted(false); + b.setBorderPainted(false); + b.setContentAreaFilled(false); + b.setRolloverEnabled(true); + return b; + } + + protected JButton createRightOneTouchButton() { + JButton b = new JButton() { + + public void paint(Graphics g) { + Color color = getBackground(); + int w = getSize().width; + int h = getSize().height; + if (getModel().isPressed() && getModel().isArmed()) { + g.setColor(ColorHelper.darker(color, 40)); + g.fillRect(0, 0, w, h); + } else if (getModel().isRollover()) { + g.setColor(getRolloverColor()); + g.fillRect(0, 0, w, h); + } + Icon icon; + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel) UIManager.getLookAndFeel(); + if (orientation == JSplitPane.HORIZONTAL_SPLIT) { + icon = laf.getIconFactory().getSplitterRightArrowIcon(); + } else { + icon = laf.getIconFactory().getSplitterDownArrowIcon(); + } + int x = (w - icon.getIconWidth()) / 2; + int y = (h - icon.getIconHeight()) / 2; + icon.paintIcon(this, g, x, y); + } + if (getModel().isArmed()) { + if (getModel().isPressed()) { + JTattooUtilities.draw3DBorder(g, ColorHelper.darker(color, 30), ColorHelper.brighter(color, 80), 0, 0, w, h); + } else { + JTattooUtilities.draw3DBorder(g, ColorHelper.brighter(color, 80), ColorHelper.darker(color, 30), 0, 0, w, h); + } + } + } + + @SuppressWarnings("deprecation") + public boolean isFocusTraversable() { + return false; + } + }; + b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + b.setFocusPainted(false); + b.setBorderPainted(false); + b.setContentAreaFilled(false); + b.setRolloverEnabled(true); + return b; + } + + /** + * Used to layout a BasicSplitPaneDivider. + * Layout for the divider + * involves appropriately moving the left/right buttons around. + *

+ */ + protected class MyDividerLayout implements LayoutManager { + + public void layoutContainer(Container c) { + if (leftButton != null && rightButton != null && c == BaseSplitPaneDivider.this) { + if (splitPane.isOneTouchExpandable()) { + Insets insets = getInsets(); + int blockSize = 11; + int xOffs = 0; + int yOffs = 0; + if (centerOneTouchButtons) { + blockSize = 13; + xOffs = ((getWidth() - (2 * blockSize)) / 2) - blockSize; + yOffs = ((getHeight() - (2 * blockSize)) / 2) - blockSize; + } + + if (orientation == JSplitPane.VERTICAL_SPLIT) { + int extraX = (insets != null) ? insets.left : 0; + if (insets != null) { + blockSize -= (insets.top + insets.bottom); + blockSize = Math.max(blockSize, 0); + } + int y = (c.getSize().height - blockSize) / 2; + leftButton.setBounds(xOffs + extraX, y, blockSize * 2, blockSize); + rightButton.setBounds(xOffs + extraX + blockSize * 2 + 1, y, blockSize * 2, blockSize); + } else { + int extraY = (insets != null) ? insets.top : 0; + if (insets != null) { + blockSize -= (insets.left + insets.right); + blockSize = Math.max(blockSize, 0); + } + int x = (c.getSize().width - blockSize) / 2; + leftButton.setBounds(x, yOffs + extraY, blockSize, blockSize * 2); + rightButton.setBounds(x, yOffs + extraY + blockSize * 2 + 1, blockSize, blockSize * 2); + } + } else { + leftButton.setBounds(-5, -5, 1, 1); + rightButton.setBounds(-5, -5, 1, 1); + } + } + } + + public Dimension minimumLayoutSize(Container c) { + // NOTE: This isn't really used, refer to + // BasicSplitPaneDivider.getPreferredSize for the reason. + // I leave it in hopes of having this used at some point. + if (c != BaseSplitPaneDivider.this || splitPane == null) { + return new Dimension(0, 0); + } + Dimension buttonMinSize = null; + + if (splitPane.isOneTouchExpandable() && leftButton != null) { + buttonMinSize = leftButton.getMinimumSize(); + } + + Insets insets = getInsets(); + int width = getDividerSize(); + int height = width; + + if (orientation == JSplitPane.VERTICAL_SPLIT) { + if (buttonMinSize != null) { + int size = buttonMinSize.height; + if (insets != null) { + size += insets.top + insets.bottom; + } + height = Math.max(height, size); + } + width = 1; + } else { + if (buttonMinSize != null) { + int size = buttonMinSize.width; + if (insets != null) { + size += insets.left + insets.right; + } + width = Math.max(width, size); + } + height = 1; + } + return new Dimension(width, height); + } + + public Dimension preferredLayoutSize(Container c) { + return minimumLayoutSize(c); + } + + public void removeLayoutComponent(Component c) { + } + + public void addLayoutComponent(String string, Component c) { + } + + } // end class MyDividerLayout +} diff --git a/src/com/jtattoo/plaf/BaseSplitPaneUI.java b/src/com/jtattoo/plaf/BaseSplitPaneUI.java new file mode 100644 index 0000000..0dd9316 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseSplitPaneUI.java @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSplitPaneDivider; +import javax.swing.plaf.basic.BasicSplitPaneUI; + +/** + * @author Michael Hagen + */ +public class BaseSplitPaneUI extends BasicSplitPaneUI { + + protected PropertyChangeListener myPropertyChangeListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseSplitPaneUI(); + } + + protected void installListeners() { + super.installListeners(); + myPropertyChangeListener = new PropertyChangeListener() { + + public void propertyChange(PropertyChangeEvent evt) { + if ("flatMode".equals(evt.getPropertyName()) && evt.getNewValue() instanceof Boolean) { + ((BaseSplitPaneDivider)getDivider()).setFlatMode(((Boolean)evt.getNewValue()).booleanValue()); + } + } + }; + getSplitPane().addPropertyChangeListener(myPropertyChangeListener); + } + + protected void uninstallListeners() { + super.uninstallListeners(); + getSplitPane().removePropertyChangeListener(myPropertyChangeListener); + } + + + public BasicSplitPaneDivider createDefaultDivider() { + return new BaseSplitPaneDivider(this); + } +} diff --git a/src/com/jtattoo/plaf/BaseTabbedPaneUI.java b/src/com/jtattoo/plaf/BaseTabbedPaneUI.java new file mode 100644 index 0000000..47a5fa6 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTabbedPaneUI.java @@ -0,0 +1,3994 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.HashMap; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.*; +import javax.swing.plaf.basic.BasicGraphicsUtils; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; + +/** + * This class is a modified copy of the javax.swing.plaf.basic.BasicTabbedPaneUI + * + * A Basic L&F implementation of TabbedPaneUI. + * + * @version 1.87 06/08/99 + * @author Amy Fowler + * @author Philip Milne + * @author Steve Wilson + * @author Tom Santos + * @author Dave Moore + * @author Michael Hagen + */ +public class BaseTabbedPaneUI extends TabbedPaneUI implements SwingConstants { + + protected static final Insets NULL_BORDER_INSETS = new Insets(0, 0, 0, 0); + protected static final int GAP = 5; + + // Instance variables initialized at installation + protected JTabbedPane tabPane; + protected Color tabAreaBackground; + protected Color selectedColor; + protected int textIconGap; + protected int tabRunOverlay; + protected Insets tabInsets; + protected Insets selectedTabPadInsets; + protected Insets tabAreaInsets; + protected Insets contentBorderInsets; +// Transient variables (recalculated each time TabbedPane is layed out) + protected int tabRuns[] = new int[10]; + protected int runCount = 0; + protected int selectedRun = -1; + protected Rectangle rects[] = new Rectangle[0]; + protected int maxTabHeight; + protected int maxTabWidth; +// Listeners + protected ChangeListener tabChangeListener; + protected ComponentListener tabComponentListener; + protected PropertyChangeListener propertyChangeListener; + protected MouseListener mouseListener; + protected MouseMotionListener mouseMotionListener; + protected FocusListener focusListener; + // PENDING(api): See comment for ContainerHandler + private ContainerListener containerListener; +// Private instance data + private Insets currentPadInsets = new Insets(0, 0, 0, 0); + private Insets currentTabAreaInsets = new Insets(0, 0, 0, 0); + private Component visibleComponent; + // PENDING(api): See comment for ContainerHandler + private ArrayList htmlViews; + private HashMap mnemonicToIndexMap; + /** + * InputMap used for mnemonics. Only non-null if the JTabbedPane has + * mnemonics associated with it. Lazily created in initMnemonics. + */ + private InputMap mnemonicInputMap; + // For use when tabLayoutPolicy = SCROLL_TAB_LAYOUT + private ScrollableTabSupport tabScroller; + private TabContainer tabContainer; + /** + * A rectangle used for general layout calculations in order + * to avoid constructing many new Rectangles on the fly. + */ + protected transient Rectangle calcRect = new Rectangle(0, 0, 0, 0); + /** + * Number of tabs. When the count differs, the mnemonics are updated. + */ + // PENDING: This wouldn't be necessary if JTabbedPane had a better + // way of notifying listeners when the count changed. + private int tabCount; + protected int oldRolloverIndex = -1; + protected int rolloverIndex = -1; + protected boolean roundedTabs = true; + protected boolean simpleButtonBorder = false; + + public static ComponentUI createUI(JComponent c) { + return new BaseTabbedPaneUI(); + } + + // UI Installation/De-installation + public void installUI(JComponent c) { + this.tabPane = (JTabbedPane) c; + c.setLayout(createLayoutManager()); + installComponents(); + installDefaults(); + installListeners(); + installKeyboardActions(); + } + + public void uninstallUI(JComponent c) { + uninstallKeyboardActions(); + uninstallListeners(); + uninstallDefaults(); + uninstallComponents(); + c.setLayout(null); + + this.tabPane = null; + } + + /** + * Invoked by installUI to create + * a layout manager object to manage + * the JTabbedPane. + * + * @return a layout manager object + * + * @see TabbedPaneLayout + * @see javax.swing.JTabbedPane#getTabLayoutPolicy + */ + protected LayoutManager createLayoutManager() { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) { + return new TabbedPaneScrollLayout(); + } + } + /* WRAP_TAB_LAYOUT */ + return new TabbedPaneLayout(); + } + + /* In an attempt to preserve backward compatibility for programs + * which have extended BaseTabbedPaneUI to do their own layout, the + * UI uses the installed layoutManager (and not tabLayoutPolicy) to + * determine if scrollTabLayout is enabled. + */ + protected boolean scrollableTabLayoutEnabled() { + return (tabPane.getLayout() instanceof TabbedPaneScrollLayout); + } + + /** + * Creates and installs any required subcomponents for the JTabbedPane. + * Invoked by installUI. + * + * @since 1.4 + */ + protected void installComponents() { + if (scrollableTabLayoutEnabled()) { + if (tabScroller == null) { + tabScroller = new ScrollableTabSupport(tabPane.getTabPlacement()); + tabPane.add(tabScroller.viewport); + tabPane.add(tabScroller.scrollForwardButton); + tabPane.add(tabScroller.scrollBackwardButton); + tabPane.add(tabScroller.popupMenuButton); + tabScroller.tabPanel.setBackground(tabAreaBackground); + } + } + installTabContainer(); + } + + private Component getTabComponentAt(int index) { + if (JTattooUtilities.getJavaVersion() >= 1.6) { + return tabPane.getTabComponentAt(index); + } + return null; + } + + private void installTabContainer() { + if (JTattooUtilities.getJavaVersion() >= 1.6) { + for (int i = 0; i < tabPane.getTabCount(); i++) { + Component tabComponent = getTabComponentAt(i); + if (tabComponent != null) { + if (tabContainer == null) { + tabContainer = new TabContainer(); + } + tabContainer.add(tabComponent); + addMyPropertyChangeListeners(tabComponent); + } + } + if (tabContainer == null) { + return; + } + if (scrollableTabLayoutEnabled()) { + tabScroller.tabPanel.add(tabContainer); + } else { + tabPane.add(tabContainer); + } + } + } + + /** + * Removes any installed subcomponents from the JTabbedPane. + * Invoked by uninstallUI. + * + * @since 1.4 + */ + protected void uninstallComponents() { + uninstallTabContainer(); + if (scrollableTabLayoutEnabled()) { + tabPane.remove(tabScroller.viewport); + tabPane.remove(tabScroller.scrollForwardButton); + tabPane.remove(tabScroller.scrollBackwardButton); + tabPane.remove(tabScroller.popupMenuButton); + tabScroller = null; + } + } + + private void addMyPropertyChangeListeners(Component component) { + component.addPropertyChangeListener(new MyTabComponentListener()); + if (component instanceof Container) { + Container container = (Container) component; + for (int i = 0; i < container.getComponentCount(); i++) { + Component c = container.getComponent(i); + addMyPropertyChangeListeners(c); + } + } + } + + private void removeMyPropertyChangeListeners(Component component) { + PropertyChangeListener[] listeners = component.getPropertyChangeListeners(); + for (int i = 0; i < listeners.length; i++) { + if (listeners[i] instanceof MyTabComponentListener) { + component.removePropertyChangeListener(listeners[i]); + } + } + if (component instanceof Container) { + Container container = (Container) component; + for (int i = 0; i < container.getComponentCount(); i++) { + Component c = container.getComponent(i); + removeMyPropertyChangeListeners(c); + } + } + } + + private void uninstallTabContainer() { + if (JTattooUtilities.getJavaVersion() >= 1.6) { + if (tabContainer == null) { + return; + } + // Remove all the tabComponents, making sure not to notify the tabbedpane. + tabContainer.notifyTabbedPane = false; + for (int i = 0; i < tabContainer.getComponentCount(); i++) { + Component c = tabContainer.getComponent(i); + removeMyPropertyChangeListeners(c); + } + tabContainer.removeAll(); + if (scrollableTabLayoutEnabled()) { + tabScroller.tabPanel.remove(tabContainer); + } else { + tabPane.remove(tabContainer); + } + tabContainer = null; + } + } + + protected void installDefaults() { + LookAndFeel.installColorsAndFont(tabPane, "TabbedPane.background", "TabbedPane.foreground", "TabbedPane.font"); + tabAreaBackground = UIManager.getColor("TabbedPane.tabAreaBackground"); + selectedColor = UIManager.getColor("TabbedPane.selected"); + textIconGap = UIManager.getInt("TabbedPane.textIconGap"); + tabInsets = UIManager.getInsets("TabbedPane.tabInsets"); + selectedTabPadInsets = UIManager.getInsets("TabbedPane.selectedTabPadInsets"); + tabAreaInsets = UIManager.getInsets("TabbedPane.tabAreaInsets"); + contentBorderInsets = UIManager.getInsets("TabbedPane.contentBorderInsets"); + tabRunOverlay = UIManager.getInt("TabbedPane.tabRunOverlay"); + tabPane.setBorder(UIManager.getBorder("TabbedPane.boder")); + } + + protected void uninstallDefaults() { + tabInsets = null; + selectedTabPadInsets = null; + tabAreaInsets = null; + contentBorderInsets = null; + } + + protected void installListeners() { + if ((propertyChangeListener = createPropertyChangeListener()) != null) { + tabPane.addPropertyChangeListener(propertyChangeListener); + } + if ((tabChangeListener = createChangeListener()) != null) { + tabPane.addChangeListener(tabChangeListener); + } + if ((tabComponentListener = createComponentListener()) != null) { + tabPane.addComponentListener(tabComponentListener); + } + if ((mouseListener = createMouseListener()) != null) { + if (scrollableTabLayoutEnabled()) { + tabScroller.tabPanel.addMouseListener(mouseListener); + + } else { // WRAP_TAB_LAYOUT + tabPane.addMouseListener(mouseListener); + } + } + if ((mouseMotionListener = createMouseMotionListener()) != null) { + if (scrollableTabLayoutEnabled()) { + tabScroller.tabPanel.addMouseMotionListener(mouseMotionListener); + + } else { // WRAP_TAB_LAYOUT + tabPane.addMouseMotionListener(mouseMotionListener); + } + } + if ((focusListener = createFocusListener()) != null) { + tabPane.addFocusListener(focusListener); + } + // PENDING(api) : See comment for ContainerHandler + containerListener = new ContainerHandler(); + tabPane.addContainerListener(containerListener); + if (tabPane.getTabCount() > 0) { + htmlViews = createHTMLViewList(); + } + } + + protected void uninstallListeners() { + if (mouseListener != null) { + if (scrollableTabLayoutEnabled()) { + // SCROLL_TAB_LAYOUT + tabScroller.tabPanel.removeMouseListener(mouseListener); + } else { + // WRAP_TAB_LAYOUT + tabPane.removeMouseListener(mouseListener); + } + mouseListener = null; + } + if (mouseMotionListener != null) { + if (scrollableTabLayoutEnabled()) { + // SCROLL_TAB_LAYOUT + tabScroller.tabPanel.removeMouseMotionListener(mouseMotionListener); + } else { + // WRAP_TAB_LAYOUT + tabPane.removeMouseMotionListener(mouseMotionListener); + } + mouseMotionListener = null; + } + if (focusListener != null) { + tabPane.removeFocusListener(focusListener); + focusListener = null; + } + + // PENDING(api): See comment for ContainerHandler + if (containerListener != null) { + tabPane.removeContainerListener(containerListener); + containerListener = null; + if (htmlViews != null) { + htmlViews.clear(); + htmlViews = null; + } + } + if (tabChangeListener != null) { + tabPane.removeChangeListener(tabChangeListener); + tabChangeListener = null; + } + if (tabComponentListener != null) { + tabPane.removeComponentListener(tabComponentListener); + tabChangeListener = null; + } + if (propertyChangeListener != null) { + tabPane.removePropertyChangeListener(propertyChangeListener); + propertyChangeListener = null; + } + } + + protected MouseListener createMouseListener() { + return new MouseHandler(); + } + + protected MouseMotionListener createMouseMotionListener() { + return new MouseMotionHandler(); + } + + protected FocusListener createFocusListener() { + return new FocusHandler(); + } + + protected ChangeListener createChangeListener() { + return new TabSelectionHandler(); + } + + protected ComponentListener createComponentListener() { + return new TabComponentHandler(); + } + + protected PropertyChangeListener createPropertyChangeListener() { + return new PropertyChangeHandler(); + } + + protected void installKeyboardActions() { + InputMap km = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, km); + km = getInputMap(JComponent.WHEN_FOCUSED); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_FOCUSED, km); + ActionMap am = getActionMap(); + SwingUtilities.replaceUIActionMap(tabPane, am); + if (scrollableTabLayoutEnabled()) { + tabScroller.scrollForwardButton.setAction(am.get("scrollTabsForwardAction")); + tabScroller.scrollBackwardButton.setAction(am.get("scrollTabsBackwardAction")); + tabScroller.popupMenuButton.setAction(am.get("scrollTabsPopupMenuAction")); + } + } + + InputMap getInputMap(int condition) { + if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) { + return (InputMap) UIManager.get("TabbedPane.ancestorInputMap"); + } else if (condition == JComponent.WHEN_FOCUSED) { + return (InputMap) UIManager.get("TabbedPane.focusInputMap"); + } + return null; + } + + ActionMap getActionMap() { + ActionMap map = (ActionMap) UIManager.get("TabbedPane.actionMap"); + + if (map == null) { + map = createActionMap(); + if (map != null) { + UIManager.getLookAndFeelDefaults().put("TabbedPane.actionMap", map); + } + } + return map; + } + + ActionMap createActionMap() { + ActionMap map = new ActionMapUIResource(); + map.put("navigateNext", new NextAction()); + map.put("navigatePrevious", new PreviousAction()); + map.put("navigateRight", new RightAction()); + map.put("navigateLeft", new LeftAction()); + map.put("navigateUp", new UpAction()); + map.put("navigateDown", new DownAction()); + map.put("navigatePageUp", new PageUpAction()); + map.put("navigatePageDown", new PageDownAction()); + map.put("requestFocus", new RequestFocusAction()); + map.put("requestFocusForVisibleComponent", new RequestFocusForVisibleAction()); + map.put("setSelectedIndex", new SetSelectedIndexAction()); + map.put("scrollTabsForwardAction", new ScrollTabsForwardAction()); + map.put("scrollTabsBackwardAction", new ScrollTabsBackwardAction()); + map.put("scrollTabsPopupMenuAction", new ScrollTabsPopupMenuAction()); + return map; + } + + protected void uninstallKeyboardActions() { + SwingUtilities.replaceUIActionMap(tabPane, null); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_FOCUSED, null); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_IN_FOCUSED_WINDOW, null); + } + + /** + * Reloads the mnemonics. This should be invoked when a memonic changes, + * when the title of a mnemonic changes, or when tabs are added/removed. + */ + private void updateMnemonics() { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + resetMnemonics(); + for (int counter = tabPane.getTabCount() - 1; counter >= 0; counter--) { + int mnemonic = tabPane.getMnemonicAt(counter); + if (mnemonic > 0) { + addMnemonic(counter, mnemonic); + } + } + } + } + + /** + * Resets the mnemonics bindings to an empty state. + */ + private void resetMnemonics() { + if (mnemonicToIndexMap != null) { + mnemonicToIndexMap.clear(); + mnemonicInputMap.clear(); + } + } + + /** + * Adds the specified mnemonic at the specified index. + */ + @SuppressWarnings("deprecation") + private void addMnemonic(int index, int mnemonic) { + if (mnemonicToIndexMap == null) { + initMnemonics(); + } + mnemonicInputMap.put(KeyStroke.getKeyStroke(mnemonic, Event.ALT_MASK), "setSelectedIndex"); + mnemonicToIndexMap.put(mnemonic, index); + } + + /** + * Installs the state needed for mnemonics. + */ + private void initMnemonics() { + mnemonicToIndexMap = new HashMap(); +// mnemonicInputMap = new InputMapUIResource(); +// mnemonicInputMap.setParent(SwingUtilities.getUIInputMap(tabPane, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)); +// SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, mnemonicInputMap); + mnemonicInputMap = new ComponentInputMapUIResource(tabPane); + mnemonicInputMap.setParent(SwingUtilities.getUIInputMap(tabPane, JComponent.WHEN_IN_FOCUSED_WINDOW)); + SwingUtilities.replaceUIInputMap(tabPane, JComponent.WHEN_IN_FOCUSED_WINDOW, mnemonicInputMap); + } + + protected boolean isContentOpaque() { + if (!tabPane.isOpaque()) { + if (UIManager.get("TabbedPane.contentOpaque") != null) { + return UIManager.getBoolean("TabbedPane.contentOpaque"); + } + } + return true; + } + + protected boolean isTabOpaque() { + if (!tabPane.isOpaque()) { + if (UIManager.get("TabbedPane.tabsOpaque") != null) { + return UIManager.getBoolean("TabbedPane.tabsOpaque"); + } + } + return true; + } + + protected boolean hasInnerBorder() { + return false; + } + + // colors + protected Color[] getTabColors(int tabIndex, boolean isSelected, boolean isRollover) { + Color colorArr[] = AbstractLookAndFeel.getTheme().getTabColors(); + if ((tabIndex >= 0) && (tabIndex < tabPane.getTabCount())) { + boolean isEnabled = tabPane.isEnabledAt(tabIndex); + Color backColor = tabPane.getBackgroundAt(tabIndex); + if (backColor instanceof UIResource) { + if (isSelected) { + colorArr = AbstractLookAndFeel.getTheme().getSelectedColors(); + } else if (isRollover && isEnabled) { + colorArr = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else { + if (JTattooUtilities.isFrameActive(tabPane)) { + colorArr = AbstractLookAndFeel.getTheme().getTabColors(); + } else { + colorArr = AbstractLookAndFeel.getTheme().getInActiveColors(); + } + } + } else if (backColor != null) { + if (isSelected) { + colorArr = ColorHelper.createColorArr(ColorHelper.brighter(backColor, 60), backColor, 20); + } else if (isRollover && isEnabled) { + colorArr = ColorHelper.createColorArr(ColorHelper.brighter(backColor, 80), ColorHelper.brighter(backColor, 20), 20); + } else { + colorArr = ColorHelper.createColorArr(ColorHelper.brighter(backColor, 40), ColorHelper.darker(backColor, 10), 20); + } + } + } + return colorArr; + } + + protected Color getLoBorderColor(int tabIndex) { + return AbstractLookAndFeel.getControlDarkShadow(); + } + + protected Color getHiBorderColor(int tabIndex) { + Color backColor = tabPane.getBackgroundAt(tabIndex); + if (tabIndex == tabPane.getSelectedIndex()) { + if (backColor instanceof UIResource) { + return AbstractLookAndFeel.getControlHighlight(); + } else { + return ColorHelper.brighter(backColor, 40); + } + } + if (tabIndex >= 0 && tabIndex <= tabCount) { + if (!isTabOpaque() || backColor instanceof UIResource) { + return AbstractLookAndFeel.getControlHighlight(); + } else { + return ColorHelper.brighter(backColor, 40); + } + } + return AbstractLookAndFeel.getControlHighlight(); + } + + protected Color[] getContentBorderColors(int tabPlacement) { + int sepHeight = tabAreaInsets.bottom; + Color selColors[] = AbstractLookAndFeel.getTheme().getSelectedColors(); + Color loColor = selColors[selColors.length - 1]; + Color darkLoColor = ColorHelper.darker(loColor, 20); + return ColorHelper.createColorArr(loColor, darkLoColor, sepHeight); + } + + protected Color getContentBorderColor() { + return AbstractLookAndFeel.getFrameColor(); + } + + protected Color getGapColor(int tabIndex) { + if (isTabOpaque() || tabIndex == tabPane.getSelectedIndex()) { + if ((tabIndex >= 0) && (tabIndex < tabCount)) { + Color tabColors[] = getTabColors(tabIndex, tabIndex == tabPane.getSelectedIndex(), false); + if (tabColors != null && tabColors.length > 0) { + return tabColors[tabColors.length - 1]; + } else { + return tabPane.getBackgroundAt(tabIndex); + } + } + } + if (!tabPane.isOpaque()) { + Container parent = tabPane.getParent(); + while (parent != null) { + if (parent.isOpaque()) { + return parent.getBackground(); + } + parent = parent.getParent(); + } + } + return tabAreaBackground; + } + + // Geometry + public Dimension getPreferredSize(JComponent c) { + // Default to LayoutManager's preferredLayoutSize + return null; + } + + public Dimension getMinimumSize(JComponent c) { + // Default to LayoutManager's minimumLayoutSize + return null; + } + + public Dimension getMaximumSize(JComponent c) { + // Default to LayoutManager's maximumLayoutSize + return null; + } + + // UI Rendering + public void paint(Graphics g, JComponent c) { + int tc = tabPane.getTabCount(); + if (tabCount != tc) { + tabCount = tc; + updateMnemonics(); + } + + int selectedIndex = tabPane.getSelectedIndex(); + int tabPlacement = tabPane.getTabPlacement(); + + ensureCurrentLayout(); + + // Paint content border + paintContentBorder(g, tabPlacement, selectedIndex, 0, 0, c.getWidth(), c.getHeight()); + + // Paint tab area + // If scrollable tabs are enabled, the tab area will be + // painted by the scrollable tab panel instead. + // + if (!scrollableTabLayoutEnabled()) { + // WRAP_TAB_LAYOUT + paintTabArea(g, tabPlacement, selectedIndex); + } + } + + /** + * Paints the tabs in the tab area. + * Invoked by paint(). + * The graphics parameter must be a valid Graphics + * object. Tab placement may be either: + * JTabbedPane.TOP, JTabbedPane.BOTTOM, + * JTabbedPane.LEFT, or JTabbedPane.RIGHT. + * The selected index must be a valid tabbed pane tab index (0 to + * tab count - 1, inclusive) or -1 if no tab is currently selected. + * The handling of invalid parameters is unspecified. + * + * @param g the graphics object to use for rendering + * @param tabPlacement the placement for the tabs within the JTabbedPane + * @param selectedIndex the tab index of the selected component + * + * @since 1.4 + */ + protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) { + int tc = tabPane.getTabCount(); + Rectangle iconRect = new Rectangle(), textRect = new Rectangle(); + Shape savedClip = g.getClip(); + Rectangle clipRect = g.getClipBounds(); + // Dirty trick to fix clipping problem + if (scrollableTabLayoutEnabled() && tabScroller.scrollBackwardButton.isVisible()) { + if ((tabPlacement == TOP) || (tabPlacement == BOTTOM)) { + g.setClip(clipRect.x, clipRect.y, clipRect.width + 1, clipRect.height); + } else { + g.setClip(clipRect.x, clipRect.y, clipRect.width, clipRect.height + 1); + } + } + // Paint tabRuns of tabs from back to front + for (int i = runCount - 1; i >= 0; i--) { + int start = tabRuns[i]; + int next = tabRuns[(i == runCount - 1) ? 0 : i + 1]; + int end = (next != 0 ? next - 1 : tc - 1); + for (int j = start; j <= end; j++) { + if (rects[j].intersects(clipRect)) { + paintTab(g, tabPlacement, rects, j, iconRect, textRect); + } + } + } + + // Paint selected tab if its in the front run + // since it may overlap other tabs + if ((selectedIndex >= 0) && (selectedIndex < rects.length) && getRunForTab(tc, selectedIndex) == 0) { + if (rects[selectedIndex].intersects(clipRect)) { + paintTab(g, tabPlacement, rects, selectedIndex, iconRect, textRect); + } + } + g.setClip(savedClip); + } + + protected Font getTabFont(boolean isSelected) { + return tabPane.getFont(); + } + + protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect) { + Rectangle tabRect = rects[tabIndex]; + int selectedIndex = tabPane.getSelectedIndex(); + boolean isSelected = selectedIndex == tabIndex; + Graphics2D g2D = null; + Polygon cropShape = null; + Shape savedClip = null; + int cropx = 0; + int cropy = 0; + + if (scrollableTabLayoutEnabled()) { + if (g instanceof Graphics2D) { + g2D = (Graphics2D) g; + + // Render visual for cropped tab edge... + Rectangle viewRect = tabScroller.viewport.getViewRect(); + int cropline; + switch (tabPlacement) { + case LEFT: + case RIGHT: + cropline = viewRect.y + viewRect.height; + if ((tabRect.y < cropline) && (tabRect.y + tabRect.height > cropline)) { + cropShape = createCroppedTabClip(tabPlacement, tabRect, cropline); + cropx = tabRect.x; + cropy = cropline - 1; + } + break; + case TOP: + case BOTTOM: + default: + cropline = viewRect.x + viewRect.width; + if ((tabRect.x < cropline) && (tabRect.x + tabRect.width > cropline)) { + cropShape = createCroppedTabClip(tabPlacement, tabRect, cropline); + cropx = cropline - 1; + cropy = tabRect.y; + } + } + if (cropShape != null) { + savedClip = g2D.getClip(); + g2D.clip(cropShape); + } + } + } + + paintTabBackground(g, tabPlacement, tabIndex, tabRect.x, tabRect.y, tabRect.width, tabRect.height, isSelected); + paintTabBorder(g, tabPlacement, tabIndex, tabRect.x, tabRect.y, tabRect.width, tabRect.height, isSelected); + + try { + boolean doPaintContent = getTabComponentAt(tabIndex) == null; + if (doPaintContent) { + String title = tabPane.getTitleAt(tabIndex); + Font font = getTabFont(isSelected); + FontMetrics fm = JTattooUtilities.getFontMetrics(tabPane, g, font); + Icon icon = getIconForTab(tabIndex); + + layoutLabel(tabPlacement, fm, tabIndex, title, icon, tabRect, iconRect, textRect, isSelected); + paintText(g, tabPlacement, font, fm, tabIndex, title, textRect, isSelected); + paintIcon(g, tabPlacement, tabIndex, icon, iconRect, isSelected); + } + paintFocusIndicator(g, tabPlacement, rects, tabIndex, iconRect, textRect, isSelected); + } catch (Exception ex) { + } + + if (cropShape != null) { + paintCroppedTabEdge(g, tabPlacement, tabIndex, cropx, cropy); + if (g2D != null && savedClip != null) { + g2D.setClip(savedClip); + } + } + } + /* This method will create and return a polygon shape for the given tab rectangle + * which has been cropped at the specified cropline with a torn edge visual. + * e.g. A "File" tab which has cropped been cropped just after the "i": + * ------------- + * | ..... | + * | . | + * | ... . | + * | . . | + * | . . | + * | . . | + * -------------- + * + * The x, y arrays below define the pattern used to create a "torn" edge + * segment which is repeated to fill the edge of the tab. + * For tabs placed on TOP and BOTTOM, this righthand torn edge is created by + * line segments which are defined by coordinates obtained by + * subtracting xCropLen[i] from (tab.x + tab.width) and adding yCroplen[i] + * to (tab.y). + * For tabs placed on LEFT or RIGHT, the bottom torn edge is created by + * subtracting xCropLen[i] from (tab.y + tab.height) and adding yCropLen[i] + * to (tab.x). + */ + private int xCropLen[] = {1, 1, 0, 0, 1, 1, 2, 2}; + private int yCropLen[] = {0, 3, 3, 6, 6, 9, 9, 12}; + private static final int CROP_SEGMENT = 12; + + private Polygon createCroppedTabClip(int tabPlacement, Rectangle tabRect, int cropline) { + int rlen; + int start; + int end; + int ostart; + + switch (tabPlacement) { + case LEFT: + case RIGHT: + rlen = tabRect.width; + start = tabRect.x; + end = tabRect.x + tabRect.width; + ostart = tabRect.y; + break; + case TOP: + case BOTTOM: + default: + rlen = tabRect.height; + start = tabRect.y; + end = tabRect.y + tabRect.height; + ostart = tabRect.x; + } + int rcnt = rlen / CROP_SEGMENT; + if (rlen % CROP_SEGMENT > 0) { + rcnt++; + } + int npts = 2 + (rcnt * 8); + int xp[] = new int[npts]; + int yp[] = new int[npts]; + int pcnt = 0; + + xp[pcnt] = ostart; + yp[pcnt++] = end; + xp[pcnt] = ostart; + yp[pcnt++] = start; + for (int i = 0; i < rcnt; i++) { + for (int j = 0; j < xCropLen.length; j++) { + xp[pcnt] = cropline - xCropLen[j]; + yp[pcnt] = start + (i * CROP_SEGMENT) + yCropLen[j]; + if (yp[pcnt] >= end) { + yp[pcnt] = end; + pcnt++; + break; + } + pcnt++; + } + } + if (tabPlacement == JTabbedPane.TOP || tabPlacement == JTabbedPane.BOTTOM) { + return new Polygon(xp, yp, pcnt); + } else { + // LEFT or RIGHT + return new Polygon(yp, xp, pcnt); + } + } + + /* If tabLayoutPolicy == SCROLL_TAB_LAYOUT, this method will paint an edge + * indicating the tab is cropped in the viewport display + */ + private void paintCroppedTabEdge(Graphics g, int tabPlacement, int tabIndex, int x, int y) { + g.setColor(Color.gray); + switch (tabPlacement) { + case LEFT: + case RIGHT: + int xx = x; + while (xx <= x + rects[tabIndex].width) { + for (int i = 0; i < xCropLen.length; i += 2) { + g.drawLine(xx + yCropLen[i], y - xCropLen[i], xx + yCropLen[i + 1] - 1, y - xCropLen[i + 1]); + } + xx += CROP_SEGMENT; + } + break; + case TOP: + case BOTTOM: + default: + int yy = y; + while (yy <= y + rects[tabIndex].height) { + for (int i = 0; i < xCropLen.length; i += 2) { + g.drawLine(x - xCropLen[i], yy + yCropLen[i], x - xCropLen[i + 1], yy + yCropLen[i + 1] - 1); + } + yy += CROP_SEGMENT; + } + } + } + + protected void layoutLabel(int tabPlacement, FontMetrics metrics, + int tabIndex, String title, Icon icon, Rectangle tabRect, + Rectangle iconRect, Rectangle textRect, boolean isSelected) { + textRect.x = textRect.y = iconRect.x = iconRect.y = 0; + View v = getTextViewForTab(tabIndex); + if (v != null) { + tabPane.putClientProperty("html", v); + } + + SwingUtilities.layoutCompoundLabel((JComponent) tabPane, + metrics, title, icon, + SwingUtilities.CENTER, + SwingUtilities.CENTER, + SwingUtilities.CENTER, + SwingUtilities.TRAILING, + tabRect, + iconRect, + textRect, + textIconGap); + + tabPane.putClientProperty("html", null); + + int xNudge = getTabLabelShiftX(tabPlacement, tabIndex, isSelected); + int yNudge = getTabLabelShiftY(tabPlacement, tabIndex, isSelected); + iconRect.x += xNudge; + iconRect.y += yNudge; + textRect.x += xNudge; + textRect.y += yNudge; + } + + protected int getTabLabelShiftX(int tabPlacement, int tabIndex, boolean isSelected) { + return 0; + } + + protected int getTabLabelShiftY(int tabPlacement, int tabIndex, boolean isSelected) { + if (!isSelected) { + if (tabPlacement == TOP) { + return 1; + } else if (tabPlacement == BOTTOM) { + return -1; + } + } + return 0; + } + + protected void paintIcon(Graphics g, int tabPlacement, int tabIndex, Icon icon, Rectangle iconRect, boolean isSelected) { + if (icon != null) { + icon.paintIcon(tabPane, g, iconRect.x, iconRect.y); + } + } + + protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) { + g.setFont(font); + View v = getTextViewForTab(tabIndex); + if (v != null) { + // html + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + v.paint(g, textRect); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } else { + // plain text + int mnemIndex = -1; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); + } + + if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) { + if (isSelected) { + Color backColor = tabPane.getBackgroundAt(tabIndex); + if (backColor instanceof UIResource) { + g.setColor(AbstractLookAndFeel.getTabSelectionForegroundColor()); + } else { + g.setColor(tabPane.getForegroundAt(tabIndex)); + } + } else { + if (tabIndex == rolloverIndex) { + g.setColor(AbstractLookAndFeel.getTheme().getRolloverForegroundColor()); + } else { + g.setColor(tabPane.getForegroundAt(tabIndex)); + } + } + JTattooUtilities.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); + + } else { // tab disabled + g.setColor(tabPane.getBackgroundAt(tabIndex).brighter()); + JTattooUtilities.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); + g.setColor(tabPane.getBackgroundAt(tabIndex).darker()); + JTattooUtilities.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x - 1, textRect.y + metrics.getAscent() - 1); + } + } + } + + protected void paintFocusIndicator(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect, boolean isSelected) { + if (tabPane.isRequestFocusEnabled() && tabPane.hasFocus() && isSelected && tabIndex >= 0 && textRect.width > 8) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusColor()); + BasicGraphicsUtils.drawDashedRect(g, textRect.x - 4, textRect.y + 1, textRect.width + 8, textRect.height); + } + } + + /** + * this function draws the border around each tab + * note that this function does now draw the background of the tab. + * that is done elsewhere + */ + protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) { + int x2 = x + (w); + int y2 = y + (h); + switch (tabPlacement) { + case LEFT: + paintLeftTabBorder(tabIndex, g, x, y, x2, y2, isSelected); + break; + case RIGHT: + paintRightTabBorder(tabIndex, g, x, y, x2, y2, isSelected); + break; + case BOTTOM: + if (roundedTabs) { + paintRoundedBottomTabBorder(tabIndex, g, x, y, x2, y2 - 1, isSelected); + } else { + paintBottomTabBorder(tabIndex, g, x, y, x2, y2 - 1, isSelected); + } + break; + case TOP: + default: + if (roundedTabs) { + paintRoundedTopTabBorder(tabIndex, g, x, y, x2, y2, isSelected); + } else { + paintTopTabBorder(tabIndex, g, x, y, x2, y2, isSelected); + } + } + } + + protected void paintRoundedTopTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + Graphics2D g2D = (Graphics2D) g; + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color borderColor = getLoBorderColor(tabIndex); + g.setColor(borderColor); + int d = 2 * GAP; + if (isSelected) { + g.drawLine(x1 + GAP, y1, x2 - GAP, y1); + g.drawArc(x1, y1, d, d, 90, 90); + g.drawArc(x2 - d, y1, d, d, 0, 90); + g.drawLine(x1, y1 + GAP + 1, x1, y2); + g.drawLine(x2, y1 + GAP + 1, x2, y2); + } else { + g.drawLine(x1 + GAP, y1, x2 - GAP, y1); + g.drawArc(x1, y1, d, d, 90, 90); + g.drawArc(x2 - d, y1, d, d, 0, 90); + g.drawLine(x1, y1 + GAP + 1, x1, y2 - 1); + g.drawLine(x2, y1 + GAP + 1, x2, y2 - 1); + } + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } + + protected void paintTopTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + int tc = tabPane.getTabCount(); + int currentRun = getRunForTab(tc, tabIndex); + int lastIndex = lastTabInRun(tc, currentRun); + int firstIndex = tabRuns[currentRun]; + boolean leftToRight = JTattooUtilities.isLeftToRight(tabPane); + + Color loColor = getLoBorderColor(tabIndex); + Color hiColor = getHiBorderColor(tabIndex); + + g.setColor(loColor); + g.drawLine(x1 + GAP, y1, x2, y1); + g.drawLine(x1 + GAP, y1, x1, y1 + GAP); + g.drawLine(x1, y1 + GAP + 1, x1, y2); + g.drawLine(x2, y1, x2, y2); + g.setColor(hiColor); + g.drawLine(x1 + GAP + 1, y1 + 1, x2 - 1, y1 + 1); + g.drawLine(x1 + GAP + 1, y1 + 1, x1 + 1, y1 + GAP + 1); + g.drawLine(x1 + 1, y1 + GAP + 1, x1 + 1, y2 - 1); + + // paint gap + int gapTabIndex = getTabAtLocation(x1 + 2, y1 - 2); + Color gapColor = getGapColor(gapTabIndex); + g.setColor(gapColor); + for (int i = 0; i < GAP; i++) { + g.drawLine(x1, y1 + i, x1 + GAP - i - 1, y1 + i); + } + + if (leftToRight) { + if ((tabIndex != firstIndex) || (currentRun != (runCount - 1))) { + g.setColor(loColor); + g.drawLine(x1, y1, x1, y1 + GAP); + } + if (!isSelected && (tabIndex == firstIndex) && (currentRun != (runCount - 1))) { + g.setColor(hiColor); + g.drawLine(x1 + 1, y1, x1 + 1, y1 + GAP - 2); + } + } else { + if ((tabIndex != lastIndex) || (currentRun != (runCount - 1))) { + g.setColor(loColor); + g.drawLine(x1, y1, x1, y1 + GAP); + } + } + } + + protected void paintLeftTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + Graphics2D g2D = (Graphics2D)g; + + int tc = tabPane.getTabCount(); + int currentRun = getRunForTab(tc, tabIndex); + int lastIndex = lastTabInRun(tc, currentRun); + int firstIndex = tabRuns[currentRun]; + + Color loColor = getLoBorderColor(tabIndex); + Color hiColor = getHiBorderColor(tabIndex); + + g.setColor(hiColor); + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f); + g2D.setComposite(alpha); + g.drawLine(x1 + GAP + 1, y1 + 1, x2 - 1, y1 + 1); + g.drawLine(x1 + GAP, y1 + 1, x1 + 1, y1 + GAP); + g.drawLine(x1 + 1, y1 + GAP + 1, x1 + 1, y2 - 1); + g2D.setComposite(savedComposite); + + g.setColor(loColor); + g.drawLine(x1 + GAP, y1, x2 - 1, y1); + g.drawLine(x1 + GAP, y1, x1, y1 + GAP); + g.drawLine(x1, y1 + GAP, x1, y2); + g.drawLine(x1 + GAP, y2, x2 - 1, y2); + if (tabIndex == lastIndex) { + g.drawLine(x1, y2, x1 + GAP, y2); + } + // paint gap + int gapTabIndex = getTabAtLocation(x1 + 2, y1 - 2); + Color gapColor = getGapColor(gapTabIndex); + g.setColor(gapColor); + for (int i = 0; i < GAP; i++) { + g.drawLine(x1, y1 + i, x1 + GAP - i - 1, y1 + i); + } + + if ((tabIndex != firstIndex) || (currentRun != (runCount - 1))) { + loColor = getLoBorderColor(gapTabIndex); + g.setColor(loColor); + g.drawLine(x1, y1, x1, y1 + GAP - 1); + if (tabIndex != firstIndex) { + g2D.setComposite(alpha); + hiColor = getHiBorderColor(gapTabIndex); + g.setColor(hiColor); + g.drawLine(x1 + 1, y1, x1 + 1, y1 + GAP - 2); + g2D.setComposite(savedComposite); + } + } + } + + protected void paintRoundedBottomTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + Graphics2D g2D = (Graphics2D) g; + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color loColor = getLoBorderColor(tabIndex); + int d = 2 * GAP; + g.setColor(loColor); + g.drawLine(x1 + GAP, y2, x2 - GAP, y2); + g.drawArc(x1, y2 - d, d, d, 180, 90); + g.drawArc(x2 - d, y2 - d, d, d, -90, 90); + g.drawLine(x1, y1, x1, y2 - GAP - 1); + g.drawLine(x2, y1, x2, y2 - GAP - 1); + + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } + + protected void paintBottomTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + int tc = tabPane.getTabCount(); + int currentRun = getRunForTab(tc, tabIndex); + int lastIndex = lastTabInRun(tc, currentRun); + int firstIndex = tabRuns[currentRun]; + boolean leftToRight = JTattooUtilities.isLeftToRight(tabPane); + + Color loColor = getLoBorderColor(tabIndex); + Color hiColor = getHiBorderColor(tabIndex); + + g.setColor(loColor); + g.drawLine(x1, y1, x1, y2 - GAP); + g.drawLine(x1, y2 - GAP, x1 + GAP, y2); + g.drawLine(x1 + GAP, y2, x2, y2); + g.drawLine(x2, y2, x2, y1); + g.setColor(hiColor); + g.drawLine(x1 + 1, y1, x1 + 1, y2 - GAP - 1); + g.drawLine(x1 + 1, y2 - GAP, x1 + GAP, y2 - 1); + + // paint gap + int gapTabIndex = getTabAtLocation(x1 + 2, y2 + 2); + Color gapColor = getGapColor(gapTabIndex); + + g.setColor(gapColor); + for (int i = 0; i < GAP; i++) { + g.drawLine(x1, y2 - i, x1 + GAP - i - 1, y2 - i); + } + if (leftToRight) { + if ((tabIndex != firstIndex) || (currentRun != (runCount - 1))) { + g.setColor(loColor); + g.drawLine(x1, y2 - GAP, x1, y2); + } + } else { + if ((tabIndex != lastIndex) || (currentRun != (runCount - 1))) { + g.setColor(loColor); + g.drawLine(x1, y2 - GAP, x1, y2); + } + } + } + + protected void paintRightTabBorder(int tabIndex, Graphics g, int x1, int y1, int x2, int y2, boolean isSelected) { + Graphics2D g2D = (Graphics2D)g; + + int tc = tabPane.getTabCount(); + int currentRun = getRunForTab(tc, tabIndex); + int lastIndex = lastTabInRun(tc, currentRun); + int firstIndex = tabRuns[currentRun]; + + Color loColor = getLoBorderColor(tabIndex); + Color hiColor = getHiBorderColor(tabIndex); + + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f); + g2D.setComposite(alpha); + g.setColor(hiColor); + g.drawLine(x1, y1 + 1, x2 - GAP - 1, y1 + 1); + g.drawLine(x2 - GAP, y1 + 1, x2 - 1, y1 + GAP); + g2D.setComposite(savedComposite); + + g.setColor(loColor); + g.drawLine(x1, y1, x2 - GAP, y1); + g.drawLine(x2 - GAP, y1, x2, y1 + GAP); + g.drawLine(x2, y1 + GAP, x2, y2); + if (tabIndex == lastIndex) { + g.drawLine(x2, y2, x1, y2); + } + + // paint gap + int gapTabIndex = getTabAtLocation(x1 + 2, y1 - 2); + Color gapColor = getGapColor(gapTabIndex); + g.setColor(gapColor); + for (int i = 0; i < GAP; i++) { + g.drawLine(x2 - GAP + i + 1, y1 + i, x2, y1 + i); + } + + if ((tabIndex != firstIndex) || (currentRun != (runCount - 1))) { + loColor = getLoBorderColor(gapTabIndex); + g.setColor(loColor); + g.drawLine(x2, y1, x2, y1 + GAP - 1); + } + } + + protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) { + if (isTabOpaque() || isSelected) { + Graphics2D g2D = (Graphics2D) g; + Shape savedClip = g.getClip(); + Area orgClipArea = new Area(new Rectangle2D.Double(x, y, w, h)); + if (savedClip != null) { + orgClipArea = new Area(savedClip); + } + Color colorArr[] = getTabColors(tabIndex, isSelected, tabIndex == rolloverIndex); + int d = 2 * GAP; + switch (tabPlacement) { + case TOP: + default: + if (isSelected) { + Area clipArea = new Area(new RoundRectangle2D.Double(x, y, w , h + 4, d, d)); + Area rectArea = new Area(new Rectangle2D.Double(x, y, w, h + 2)); + clipArea.intersect(rectArea); + clipArea.intersect(orgClipArea); + g2D.setClip(clipArea); + JTattooUtilities.fillHorGradient(g, colorArr, x, y, w, h + 4); + g2D.setClip(savedClip); + } else { + Area clipArea = new Area(new RoundRectangle2D.Double(x, y, w, h + 4, d, d)); + Area rectArea = new Area(new Rectangle2D.Double(x, y, w, h)); + clipArea.intersect(rectArea); + clipArea.intersect(orgClipArea); + g2D.setClip(clipArea); + JTattooUtilities.fillHorGradient(g, colorArr, x, y, w, h + 4); + g2D.setClip(savedClip); + } + break; + case LEFT: + if (isSelected) { + JTattooUtilities.fillHorGradient(g, colorArr, x + 1, y + 1, w + 1, h - 1); + } else { + JTattooUtilities.fillHorGradient(g, colorArr, x + 1, y + 1, w - 1, h - 1); + } + break; + case BOTTOM: + if (isSelected) { + Area clipArea = new Area(new RoundRectangle2D.Double(x, y - 4, w, h + 4, d, d)); + Area rectArea = new Area(new Rectangle2D.Double(x, y - 2, w, h + 1)); + clipArea.intersect(rectArea); + clipArea.intersect(orgClipArea); + g2D.setClip(clipArea); + JTattooUtilities.fillHorGradient(g, colorArr, x, y - 4, w, h + 4); + g2D.setClip(savedClip); + } else { + Area clipArea = new Area(new RoundRectangle2D.Double(x, y - 4, w, h + 4, d, d)); + Area rectArea = new Area(new Rectangle2D.Double(x, y, w, h)); + clipArea.intersect(rectArea); + clipArea.intersect(orgClipArea); + g2D.setClip(clipArea); + JTattooUtilities.fillHorGradient(g, colorArr, x, y - 4, w, h + 4); + g2D.setClip(savedClip); + } + break; + case RIGHT: + if (isSelected) { + JTattooUtilities.fillHorGradient(g, colorArr, x - 2, y + 1, w + 2, h - 1); + } else { + JTattooUtilities.fillHorGradient(g, colorArr, x, y + 1, w + 1, h - 1); + } + break; + } + } + } + + protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { + int tabAreaHeight = calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight); + int tabAreaWidth = calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth); + + // paint the background + if (tabPane.isOpaque()) { + int xt = tabPlacement == RIGHT ? w - tabAreaWidth : 0; + int yt = tabPlacement == BOTTOM ? h - tabAreaHeight : 0; + int wt = tabPlacement == TOP || tabPlacement == BOTTOM ? w : tabAreaWidth; + int ht = tabPlacement == LEFT || tabPlacement == RIGHT ? h : tabAreaHeight; + g.setColor(tabAreaBackground); + g.fillRect(xt, yt, wt, ht); + } + if (isContentOpaque()) { + int xt = tabPlacement == LEFT ? tabAreaWidth : 0; + int yt = tabPlacement == TOP ? tabAreaHeight : 0; + int wt = tabPlacement == LEFT || tabPlacement == RIGHT ? w - tabAreaWidth : w; + int ht = tabPlacement == TOP || tabPlacement == BOTTOM ? h - tabAreaHeight : h; + g.setColor(tabPane.getBackground()); + g.fillRect(xt, yt, wt, ht); + } + + Insets bi = new Insets(0, 0, 0, 0); + if (tabPane.getBorder() != null) { + bi = tabPane.getBorder().getBorderInsets(tabPane); + } + if (hasInnerBorder()) { + Color loColor = AbstractLookAndFeel.getControlDarkShadow(); + Color hiColor = AbstractLookAndFeel.getControlHighlight(); + g.setColor(loColor); + switch (tabPlacement) { + case TOP: { + int x1 = x + bi.left - 1; + int y1 = y + tabAreaHeight + bi.top - 2; + int x2 = x1 + w - bi.left - bi.right + 1; + int y2 = h - bi.bottom; + int ws = w - bi.left - bi.right + 1; + int hs = h - tabAreaHeight - bi.top - bi.bottom + 2; + + if (tabPane.getBorder() == null) { + g.drawLine(x1, y1, x2, y1); + g.setColor(hiColor); + g.drawLine(x1, y1 + 1, x2, y1 + 1); + } else { + g.drawRect(x1, y1, ws, hs); + g.setColor(hiColor); + g.drawLine(x1 + 1, y1 + 1, x2 - 1, y1 + 1); + } + break; + } + case LEFT: { + int x1 = x + tabAreaWidth + bi.left - 2; + int y1 = y + bi.top - 1; + //int x2 = w - bi.right; + int y2 = y1 + h - bi.top - bi.bottom + 1; + int ws = w - tabAreaWidth - bi.left - bi.right + 2; + int hs = h - bi.top - bi.bottom + 1; + + if (tabPane.getBorder() == null) { + g.drawLine(x1, y1, x1, y2); + g.setColor(hiColor); + g.drawLine(x1 + 1, y1, x1 + 1, y2); + } else { + g.drawRect(x1, y1, ws, hs); + g.setColor(hiColor); + g.drawLine(x1 + 1, y1 + 1, x1 + 1, y2 - 1); + } + break; + } + case BOTTOM: { + int x1 = x + bi.left - 1; + int y1 = y + bi.top - 1; + int x2 = x1 + w - bi.left - bi.right + 1; + int y2 = h - tabAreaHeight - bi.bottom; + int ws = w - bi.left - bi.right + 1; + int hs = h - tabAreaHeight - bi.top - bi.bottom + 2; + + if (tabPane.getBorder() == null) { + g.drawLine(x1, y2, x2, y2); + } else { + g.drawRect(x1, y1, ws, hs); + } + break; + } + case RIGHT: { + int x1 = x + bi.left - 1; + int y1 = y + bi.top - 1; + int x2 = w - tabAreaWidth - bi.right + 1; + int y2 = y1 + h - bi.top - bi.bottom + 1; + int ws = w - tabAreaWidth - bi.left - bi.right + 2; + int hs = h - bi.top - bi.bottom + 1; + + if (tabPane.getBorder() == null) { + g.drawLine(x2, y1, x2, y2); + } else { + g.drawRect(x1, y1, ws, hs); + } + break; + } + } + } else { + int sepHeight = tabAreaInsets.bottom; + if (sepHeight > 0) { + switch (tabPlacement) { + case TOP: { + Color colors[] = getContentBorderColors(tabPlacement); + int ys = y + tabAreaHeight - sepHeight + bi.top; + for (int i = 0; i < colors.length; i++) { + g.setColor(colors[i]); + g.drawLine(x, ys + i, x + w, ys + i); + } + break; + } + case LEFT: { + Color colors[] = getContentBorderColors(tabPlacement); + int xs = x + tabAreaWidth - sepHeight + bi.left; + for (int i = 0; i < colors.length; i++) { + g.setColor(colors[i]); + g.drawLine(xs + i, y, xs + i, y + h); + } + break; + } + case BOTTOM: { + Color colors[] = getContentBorderColors(tabPlacement); + int ys = y + h - tabAreaHeight - bi.bottom; + for (int i = 0; i < colors.length; i++) { + g.setColor(colors[i]); + g.drawLine(x, ys + i, x + w, ys + i); + } + break; + } + case RIGHT: { + Color colors[] = getContentBorderColors(tabPlacement); + int xs = x + w - tabAreaWidth - bi.right; + for (int i = 0; i < colors.length; i++) { + g.setColor(colors[i]); + g.drawLine(xs + i, y, xs + i, y + h); + } + break; + } + } + } + } + } + + protected void paintScrollContentBorder(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) { + Insets bi = new Insets(0, 0, 0, 0); + if (tabPane.getBorder() != null) { + bi = tabPane.getBorder().getBorderInsets(tabPane); + } + if (tabPane.getTabPlacement() == TOP) { + paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex(), x, y - bi.top, w, h); + } else if (tabPane.getTabPlacement() == BOTTOM) { + paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex(), x, y + bi.bottom, w, h); + } else if (tabPane.getTabPlacement() == LEFT) { + paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex(), x - bi.left, y, w, h); + } else if (tabPane.getTabPlacement() == RIGHT) { + paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex(), x + bi.right, y, w, h); + } + } + + // TabbedPaneUI methods + private void ensureCurrentLayout() { + // TabPane maybe still invalid. See bug 4237677. + ((TabbedPaneLayout) tabPane.getLayout()).calculateLayoutInfo(); + } + + /** + * Returns the bounds of the specified tab index. The bounds are + * with respect to the JTabbedPane's coordinate space. + */ + public Rectangle getTabBounds(JTabbedPane pane, int i) { + ensureCurrentLayout(); + Rectangle tabRect = new Rectangle(); + return getTabBounds(i, tabRect); + } + + public int getTabRunCount(JTabbedPane pane) { + ensureCurrentLayout(); + return runCount; + } + + /** + * Returns the tab index which intersects the specified point + * in the JTabbedPane's coordinate space. + */ + public int tabForCoordinate(JTabbedPane pane, int x, int y) { + ensureCurrentLayout(); + Point p = new Point(x, y); + + if (scrollableTabLayoutEnabled()) { + translatePointToTabPanel(x, y, p); + } + int tc = tabPane.getTabCount(); + for (int i = 0; i < tc; i++) { + if (rects[i].contains(p.x, p.y)) { + return i; + } + } + return -1; + } + + /** + * Returns the bounds of the specified tab in the coordinate space + * of the JTabbedPane component. This is required because the tab rects + * are by default defined in the coordinate space of the component where + * they are rendered, which could be the JTabbedPane + * (for WRAP_TAB_LAYOUT) or a ScrollableTabPanel (SCROLL_TAB_LAYOUT). + * This method should be used whenever the tab rectangle must be relative + * to the JTabbedPane itself and the result should be placed in a + * designated Rectangle object (rather than instantiating and returning + * a new Rectangle each time). The tab index parameter must be a valid + * tabbed pane tab index (0 to tab count - 1, inclusive). The destination + * rectangle parameter must be a valid Rectangle instance. + * The handling of invalid parameters is unspecified. + * + * @param tabIndex the index of the tab + * @param dest the rectangle where the result should be placed + * @return the resulting rectangle + * + * @since 1.4 + */ + protected Rectangle getTabBounds(int tabIndex, Rectangle dest) { + dest.width = rects[tabIndex].width; + dest.height = rects[tabIndex].height; + + if (scrollableTabLayoutEnabled()) { // SCROLL_TAB_LAYOUT + // Need to translate coordinates based on viewport location & + // view position + Point vpp = tabScroller.viewport.getLocation(); + Point viewp = tabScroller.viewport.getViewPosition(); + dest.x = rects[tabIndex].x + vpp.x - viewp.x; + dest.y = rects[tabIndex].y + vpp.y - viewp.y; + + } else { // WRAP_TAB_LAYOUT + dest.x = rects[tabIndex].x; + dest.y = rects[tabIndex].y; + } + return dest; + } + + /** + * Returns the tab index which intersects the specified point + * in the coordinate space of the component where the + * tabs are actually rendered, which could be the JTabbedPane + * (for WRAP_TAB_LAYOUT) or a ScrollableTabPanel (SCROLL_TAB_LAYOUT). + */ + protected int getTabAtLocation(int x, int y) { + ensureCurrentLayout(); + int tc = tabPane.getTabCount(); + for (int i = 0; i < tc; i++) { + if (rects[i].contains(x, y)) { + return i; + } + } + return -1; + } + + /** + * Returns the index of the tab closest to the passed in location, note + * that the returned tab may not contain the location x,y. + */ + protected int getClosestTab(int x, int y) { + int min = 0; + int tc = Math.min(rects.length, tabPane.getTabCount()); + int max = tc; + int tabPlacement = tabPane.getTabPlacement(); + boolean useX = (tabPlacement == TOP || tabPlacement == BOTTOM); + int want = (useX) ? x : y; + + while (min != max) { + int current = (max + min) / 2; + int minLoc; + int maxLoc; + + if (useX) { + minLoc = rects[current].x; + maxLoc = minLoc + rects[current].width; + } else { + minLoc = rects[current].y; + maxLoc = minLoc + rects[current].height; + } + if (want < minLoc) { + max = current; + if (min == max) { + return Math.max(0, current - 1); + } + } else if (want >= maxLoc) { + min = current; + if (max - min <= 1) { + return Math.max(current + 1, tc - 1); + } + } else { + return current; + } + } + return min; + } + + /** + * Returns a point which is translated from the specified point in the + * JTabbedPane's coordinate space to the coordinate space of the + * ScrollableTabPanel. This is used for SCROLL_TAB_LAYOUT ONLY. + */ + private Point translatePointToTabPanel(int srcx, int srcy, Point dest) { + Point vpp = tabScroller.viewport.getLocation(); + Point viewp = tabScroller.viewport.getViewPosition(); + dest.x = srcx - vpp.x + viewp.x; + dest.y = srcy - vpp.y + viewp.y; + return dest; + } + + // BaseTabbedPaneUI methods + protected Component getVisibleComponent() { + return visibleComponent; + } + + protected void setVisibleComponent(Component component) { + if (visibleComponent != null && visibleComponent != component && visibleComponent.getParent() == tabPane) { + visibleComponent.setVisible(false); + } + if (component != null && !component.isVisible()) { + component.setVisible(true); + } + visibleComponent = component; + } + + protected void assureRectsCreated(int tabCount) { + int rectArrayLen = rects.length; + if (tabCount != rectArrayLen) { + Rectangle[] tempRectArray = new Rectangle[tabCount]; + System.arraycopy(rects, 0, tempRectArray, 0, Math.min(rectArrayLen, tabCount)); + rects = tempRectArray; + for (int rectIndex = rectArrayLen; rectIndex < tabCount; rectIndex++) { + rects[rectIndex] = new Rectangle(); + } + } + } + + protected void expandTabRunsArray() { + int rectLen = tabRuns.length; + int[] newArray = new int[rectLen + 10]; + System.arraycopy(tabRuns, 0, newArray, 0, runCount); + tabRuns = newArray; + } + + protected int getRunForTab(int tabCount, int tabIndex) { + for (int i = 0; i < runCount; i++) { + int first = tabRuns[i]; + int last = lastTabInRun(tabCount, i); + if (tabIndex >= first && tabIndex <= last) { + return i; + } + } + return 0; + } + + protected int lastTabInRun(int tabCount, int run) { + if (runCount == 1) { + return tabCount - 1; + } + int nextRun = (run == runCount - 1 ? 0 : run + 1); + if (tabRuns[nextRun] == 0) { + return tabCount - 1; + } + return tabRuns[nextRun] - 1; + } + + protected int getTabRunOverlay(int tabPlacement) { + return tabRunOverlay; + } + + protected int getTabRunIndent(int tabPlacement, int run) { + return 0; + } + + protected boolean shouldPadTabRun(int tabPlacement, int run) { + return runCount > 1; + } + + protected boolean shouldRotateTabRuns(int tabPlacement) { + return true; + } + + protected Icon getIconForTab(int tabIndex) { + if (tabIndex >= 0 && tabIndex < tabCount) { + return (!tabPane.isEnabled() || !tabPane.isEnabledAt(tabIndex)) ? tabPane.getDisabledIconAt(tabIndex) : tabPane.getIconAt(tabIndex); + } + return null; + } + + /** + * Returns the text View object required to render stylized text (HTML) for + * the specified tab or null if no specialized text rendering is needed + * for this tab. This is provided to support html rendering inside tabs. + * + * @param tabIndex the index of the tab + * @return the text view to render the tab's text or null if no + * specialized rendering is required + * + * @since 1.4 + */ + protected View getTextViewForTab(int tabIndex) { + if (htmlViews != null && htmlViews.size() > tabIndex) { + return (View) htmlViews.get(tabIndex); + } + return null; + } + + protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) { + int height = 0; + Component tabComponent = getTabComponentAt(tabIndex); + if (tabComponent != null) { + height = tabComponent.getPreferredSize().height; + } else { + View v = getTextViewForTab(tabIndex); + if (v != null) { + // html + height += (int) v.getPreferredSpan(View.Y_AXIS); + } else { + // plain text + height += fontHeight; + } + Icon icon = getIconForTab(tabIndex); + if (icon != null) { + height = Math.max(height, icon.getIconHeight()); + } + } + Insets ti = getTabInsets(tabPlacement, tabIndex); + height += ti.top + ti.bottom + 2; + return height; + } + + protected int calculateMaxTabHeight(int tabPlacement) { + int tc = tabPane.getTabCount(); + int result = 0; + int fontHeight = getFontMetrics().getHeight(); + for (int i = 0; i < tc; i++) { + result = Math.max(calculateTabHeight(tabPlacement, i, fontHeight), result); + } + return result; + } + + protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) { + Insets insets = getTabInsets(tabPlacement, tabIndex); + int width = insets.left + insets.right + 3; + Component tabComponent = getTabComponentAt(tabIndex); + if (tabComponent != null) { + width += tabComponent.getPreferredSize().width; + } else { + Icon icon = getIconForTab(tabIndex); + if (icon != null) { + width += icon.getIconWidth() + textIconGap; + } + View v = getTextViewForTab(tabIndex); + if (v != null) { + // html + width += (int) v.getPreferredSpan(View.X_AXIS); + } else { + // plain text + String title = tabPane.getTitleAt(tabIndex); + width += SwingUtilities.computeStringWidth(metrics, title); + } + } + + return width; + } + + protected int calculateMaxTabWidth(int tabPlacement) { + int tc = tabPane.getTabCount(); + int result = 0; + for (int i = 0; i < tc; i++) { + result = Math.max(calculateTabWidth(tabPlacement, i, getFontMetrics()), result); + } + return result; + } + + protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount, int maxTabHeight) { + if (tabPlacement == JTabbedPane.TOP || tabPlacement == JTabbedPane.BOTTOM) { + Insets insets = getTabAreaInsets(tabPlacement); + int overlay = getTabRunOverlay(tabPlacement); + return (horizRunCount > 0 ? horizRunCount * (maxTabHeight - overlay) + overlay + insets.top + insets.bottom : 0); + } else { + return tabPane.getHeight(); + } + } + + protected int calculateTabAreaWidth(int tabPlacement, int vertRunCount, int maxTabWidth) { + if (tabPlacement == JTabbedPane.LEFT || tabPlacement == JTabbedPane.RIGHT) { + Insets insets = getTabAreaInsets(tabPlacement); + int overlay = getTabRunOverlay(tabPlacement); + return (vertRunCount > 0 ? vertRunCount * (maxTabWidth - overlay) + overlay + insets.left + insets.right : 0); + } else { + return tabPane.getWidth(); + } + } + + protected Insets getTabInsets(int tabPlacement, int tabIndex) { + return tabInsets; + } + + protected Insets getSelectedTabPadInsets(int tabPlacement) { + rotateInsets(selectedTabPadInsets, currentPadInsets, tabPlacement); + return currentPadInsets; + } + + protected Insets getTabAreaInsets(int tabPlacement) { + rotateInsets(tabAreaInsets, currentTabAreaInsets, tabPlacement); + return currentTabAreaInsets; + } + + protected Insets getContentBorderInsets(int tabPlacement) { + if (tabPane.getBorder() == null) { + return NULL_BORDER_INSETS; + } + return contentBorderInsets; + } + + protected FontMetrics getFontMetrics() { + Font font = tabPane.getFont().deriveFont(Font.BOLD); + return JTattooUtilities.getFontMetrics(tabPane, null, font); + } + + // Tab Navigation methods + protected void navigateSelectedTab(int direction) { + int tabPlacement = tabPane.getTabPlacement(); + int current = tabPane.getSelectedIndex(); + int tc = tabPane.getTabCount(); + boolean leftToRight = JTattooUtilities.isLeftToRight(tabPane); + + // If we have no tabs then don't navigate. + if (tc <= 0) { + return; + } + + int offset; + switch (tabPlacement) { + case NEXT: + selectNextTab(current); + break; + case PREVIOUS: + selectPreviousTab(current); + break; + case LEFT: + case RIGHT: + switch (direction) { + case NORTH: + selectPreviousTabInRun(current); + break; + case SOUTH: + selectNextTabInRun(current); + break; + case WEST: + offset = getTabRunOffset(tabPlacement, tc, current, false); + selectAdjacentRunTab(tabPlacement, current, offset); + break; + case EAST: + offset = getTabRunOffset(tabPlacement, tc, current, true); + selectAdjacentRunTab(tabPlacement, current, offset); + break; + default: + } + break; + case BOTTOM: + case TOP: + default: + switch (direction) { + case NORTH: + offset = getTabRunOffset(tabPlacement, tc, current, false); + selectAdjacentRunTab(tabPlacement, current, offset); + break; + case SOUTH: + offset = getTabRunOffset(tabPlacement, tc, current, true); + selectAdjacentRunTab(tabPlacement, current, offset); + break; + case EAST: + if (leftToRight) { + selectNextTabInRun(current); + } else { + selectPreviousTabInRun(current); + } + break; + case WEST: + if (leftToRight) { + selectPreviousTabInRun(current); + } else { + selectNextTabInRun(current); + } + break; + default: + } + } + } + + protected void selectNextTabInRun(int current) { + int tc = tabPane.getTabCount(); + int tabIndex = getNextTabIndexInRun(tc, current); + while (tabIndex != current && !tabPane.isEnabledAt(tabIndex)) { + tabIndex = getNextTabIndexInRun(tc, tabIndex); + } + tabPane.setSelectedIndex(tabIndex); + } + + protected void selectPreviousTabInRun(int current) { + int tc = tabPane.getTabCount(); + int tabIndex = getPreviousTabIndexInRun(tc, current); + while (tabIndex != current && !tabPane.isEnabledAt(tabIndex)) { + tabIndex = getPreviousTabIndexInRun(tc, tabIndex); + } + tabPane.setSelectedIndex(tabIndex); + } + + protected void selectNextTab(int current) { + int tabIndex = getNextTabIndex(current); + while (tabIndex != current && !tabPane.isEnabledAt(tabIndex)) { + tabIndex = getNextTabIndex(tabIndex); + } + tabPane.setSelectedIndex(tabIndex); + } + + protected void selectPreviousTab(int current) { + int tabIndex = getPreviousTabIndex(current); + while (tabIndex != current && !tabPane.isEnabledAt(tabIndex)) { + tabIndex = getPreviousTabIndex(tabIndex); + } + tabPane.setSelectedIndex(tabIndex); + } + + protected void selectAdjacentRunTab(int tabPlacement, int tabIndex, int offset) { + if (runCount < 2) { + return; + } + int newIndex; + Rectangle r = rects[tabIndex]; + switch (tabPlacement) { + case LEFT: + case RIGHT: + newIndex = getTabAtLocation(r.x + r.width / 2 + offset, + r.y + r.height / 2); + break; + case BOTTOM: + case TOP: + default: + newIndex = getTabAtLocation(r.x + r.width / 2, + r.y + r.height / 2 + offset); + } + if (newIndex != -1) { + while (!tabPane.isEnabledAt(newIndex) && newIndex != tabIndex) { + newIndex = getNextTabIndex(newIndex); + } + tabPane.setSelectedIndex(newIndex); + } + } + + protected int getTabRunOffset(int tabPlacement, int tabCount, int tabIndex, boolean forward) { + int run = getRunForTab(tabCount, tabIndex); + int offset; + switch (tabPlacement) { + case LEFT: { + if (run == 0) { + offset = (forward ? -(calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth) - maxTabWidth) : -maxTabWidth); + + } else if (run == runCount - 1) { + offset = (forward ? maxTabWidth : calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth) - maxTabWidth); + } else { + offset = (forward ? maxTabWidth : -maxTabWidth); + } + break; + } + case RIGHT: { + if (run == 0) { + offset = (forward ? maxTabWidth : calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth) - maxTabWidth); + } else if (run == runCount - 1) { + offset = (forward ? -(calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth) - maxTabWidth) : -maxTabWidth); + } else { + offset = (forward ? maxTabWidth : -maxTabWidth); + } + break; + } + case BOTTOM: { + if (run == 0) { + offset = (forward ? maxTabHeight : calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight) - maxTabHeight); + } else if (run == runCount - 1) { + offset = (forward ? -(calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight) - maxTabHeight) : -maxTabHeight); + } else { + offset = (forward ? maxTabHeight : -maxTabHeight); + } + break; + } + case TOP: + default: { + if (run == 0) { + offset = (forward ? -(calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight) - maxTabHeight) : -maxTabHeight); + } else if (run == runCount - 1) { + offset = (forward ? maxTabHeight : calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight) - maxTabHeight); + } else { + offset = (forward ? maxTabHeight : -maxTabHeight); + } + } + } + return offset; + } + + protected int getPreviousTabIndex(int base) { + int tabIndex = (base - 1 >= 0 ? base - 1 : tabPane.getTabCount() - 1); + return (tabIndex >= 0 ? tabIndex : 0); + } + + protected int getNextTabIndex(int base) { + return (base + 1) % tabPane.getTabCount(); + } + + protected int getNextTabIndexInRun(int tabCount, int base) { + if (runCount < 2) { + return getNextTabIndex(base); + } + int currentRun = getRunForTab(tabCount, base); + int next = getNextTabIndex(base); + if (next == tabRuns[getNextTabRun(currentRun)]) { + return tabRuns[currentRun]; + } + return next; + } + + protected int getPreviousTabIndexInRun(int tabCount, int base) { + if (runCount < 2) { + return getPreviousTabIndex(base); + } + int currentRun = getRunForTab(tabCount, base); + if (base == tabRuns[currentRun]) { + int previous = tabRuns[getNextTabRun(currentRun)] - 1; + return (previous != -1 ? previous : tabCount - 1); + } + return getPreviousTabIndex(base); + } + + protected int getPreviousTabRun(int baseRun) { + int runIndex = (baseRun - 1 >= 0 ? baseRun - 1 : runCount - 1); + return (runIndex >= 0 ? runIndex : 0); + } + + protected int getNextTabRun(int baseRun) { + return (baseRun + 1) % runCount; + } + + protected static void rotateInsets(Insets topInsets, Insets targetInsets, int targetPlacement) { + switch (targetPlacement) { + case LEFT: + targetInsets.top = topInsets.left; + targetInsets.left = topInsets.top; + targetInsets.bottom = topInsets.right; + targetInsets.right = topInsets.bottom; + break; + case BOTTOM: + targetInsets.top = topInsets.bottom; + targetInsets.left = topInsets.left; + targetInsets.bottom = topInsets.top; + targetInsets.right = topInsets.right; + break; + case RIGHT: + targetInsets.top = topInsets.left; + targetInsets.left = topInsets.bottom; + targetInsets.bottom = topInsets.right; + targetInsets.right = topInsets.top; + break; + case TOP: + default: + targetInsets.top = topInsets.top; + targetInsets.left = topInsets.left; + targetInsets.bottom = topInsets.bottom; + targetInsets.right = topInsets.right; + } + } + + @SuppressWarnings("deprecation") + protected boolean requestFocusForVisibleComponent() { + Component vc = getVisibleComponent(); + if (vc.isFocusTraversable()) { + vc.requestFocus(); + return true; + } else if (vc instanceof JComponent) { + if (((JComponent) vc).requestDefaultFocus()) { + return true; + } + } + return false; + } + + private static class RightAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(EAST); + } + }; + + private static class LeftAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(WEST); + } + }; + + private static class UpAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(NORTH); + } + }; + + private static class DownAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(SOUTH); + } + }; + + private static class NextAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(NEXT); + } + }; + + private static class PreviousAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.navigateSelectedTab(PREVIOUS); + } + }; + + private static class PageUpAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + int tabPlacement = pane.getTabPlacement(); + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + ui.navigateSelectedTab(WEST); + } else { + ui.navigateSelectedTab(NORTH); + } + } + }; + + private static class PageDownAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + int tabPlacement = pane.getTabPlacement(); + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + ui.navigateSelectedTab(EAST); + } else { + ui.navigateSelectedTab(SOUTH); + } + } + }; + + private static class RequestFocusAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + pane.requestFocus(); + } + }; + + private static class RequestFocusForVisibleAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + ui.requestFocusForVisibleComponent(); + } + }; + + /** + * Selects a tab in the JTabbedPane based on the String of the + * action command. The tab selected is based on the first tab that + * has a mnemonic matching the first character of the action command. + */ + private static class SetSelectedIndexAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + + if (pane != null && (pane.getUI() instanceof BaseTabbedPaneUI)) { + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + String command = e.getActionCommand(); + + if (command != null && command.length() > 0) { + int mnemonic = (int) e.getActionCommand().charAt(0); + if (mnemonic >= 'a' && mnemonic <= 'z') { + mnemonic -= ('a' - 'A'); + } + Integer index = (Integer) ui.mnemonicToIndexMap.get(mnemonic); + if (index != null && pane.isEnabledAt(index.intValue())) { + pane.setSelectedIndex(index.intValue()); + } + } + } + } + }; + + private static class ScrollTabsForwardAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane; + Object src = e.getSource(); + if (src instanceof JTabbedPane) { + pane = (JTabbedPane) src; + } else if (src instanceof ScrollableTabButton) { + pane = (JTabbedPane) ((ScrollableTabButton) src).getParent(); + } else { + return; // shouldn't happen + } + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + + if (ui.scrollableTabLayoutEnabled()) { + ui.tabScroller.scrollForward(pane.getTabPlacement()); + } + } + } + + private static class ScrollTabsBackwardAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + JTabbedPane pane; + Object src = e.getSource(); + if (src instanceof JTabbedPane) { + pane = (JTabbedPane) src; + } else if (src instanceof ScrollableTabButton) { + pane = (JTabbedPane) ((ScrollableTabButton) src).getParent(); + } else { + return; // shouldn't happen + } + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) pane.getUI(); + + if (ui.scrollableTabLayoutEnabled()) { + ui.tabScroller.scrollBackward(pane.getTabPlacement()); + } + } + } + + private static class ScrollTabsPopupMenuItemAction extends AbstractAction { + + private JTabbedPane tabbedPane = null; + private int selectIndex = 0; + + public ScrollTabsPopupMenuItemAction(JTabbedPane pane, int index) { + tabbedPane = pane; + selectIndex = index; + } + + public void actionPerformed(ActionEvent e) { + tabbedPane.setSelectedIndex(selectIndex); + } + } + + private static class ScrollTabsPopupMenuAction extends AbstractAction { + + private JTabbedPane tabbedPane = null; + + public void actionPerformed(ActionEvent e) { + Object src = e.getSource(); + if (src instanceof JTabbedPane) { + tabbedPane = (JTabbedPane) src; + } else if (src instanceof ScrollablePopupMenuTabButton) { + tabbedPane = (JTabbedPane) ((ScrollablePopupMenuTabButton) src).getParent(); + } else { + return; // shouldn't happen + } + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) tabbedPane.getUI(); + if (ui.scrollableTabLayoutEnabled()) { + JPopupMenu popup = new JPopupMenu(); + for (int i = 0; i < tabbedPane.getTabCount(); i++) { + JMenuItem item = new JMenuItem(tabbedPane.getTitleAt(i)); + item.addActionListener(new ScrollTabsPopupMenuItemAction(tabbedPane, i)); + item.setEnabled(tabbedPane.isEnabledAt(i)); + popup.add(item); + } + popup.show(ui.tabScroller.popupMenuButton, 0, 0); + Point pt = ui.tabScroller.popupMenuButton.getLocationOnScreen(); + int x = -popup.getWidth() + ui.tabScroller.popupMenuButton.getWidth(); + int y = ui.tabScroller.popupMenuButton.getHeight() - 1; + popup.setLocation(pt.x + x, pt.y + y); + } + } + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class TabbedPaneLayout implements LayoutManager { + + public void addLayoutComponent(String name, Component comp) { + } + + public void removeLayoutComponent(Component comp) { + } + + public Dimension preferredLayoutSize(Container parent) { + return calculateSize(false); + } + + public Dimension minimumLayoutSize(Container parent) { + return calculateSize(true); + } + + protected Dimension calculateSize(boolean minimum) { + int tabPlacement = tabPane.getTabPlacement(); + Insets insets = tabPane.getInsets(); + Insets contentInsets = getContentBorderInsets(tabPlacement); + Insets tabAreaInsets = getTabAreaInsets(tabPlacement); + + Dimension zeroSize = new Dimension(0, 0); + int height = contentInsets.top + contentInsets.bottom; + int width = contentInsets.left + contentInsets.right; + int cWidth = 0; + int cHeight = 0; + + // Determine minimum size required to display largest + // child in each dimension + // + for (int i = 0; i < tabPane.getTabCount(); i++) { + Component component = tabPane.getComponentAt(i); + if (component != null) { + Dimension size = minimum ? component.getMinimumSize() : component.getPreferredSize(); + if (size != null) { + cHeight = Math.max(size.height, cHeight); + cWidth = Math.max(size.width, cWidth); + } + } + } + // Add content border insets to minimum size + width += cWidth; + height += cHeight; + int tabExtent; + + // Calculate how much space the tabs will need, based on the + // minimum size required to display largest child + content border + // + switch (tabPlacement) { + case LEFT: + case RIGHT: + height = Math.max(height, calculateMaxTabHeight(tabPlacement) + + tabAreaInsets.top + tabAreaInsets.bottom); + tabExtent = preferredTabAreaWidth(tabPlacement, height); + width += tabExtent; + break; + case TOP: + case BOTTOM: + default: + width = Math.max(width, calculateMaxTabWidth(tabPlacement) + + tabAreaInsets.left + tabAreaInsets.right); + tabExtent = preferredTabAreaHeight(tabPlacement, width); + height += tabExtent; + } + return new Dimension(width + insets.left + insets.right, height + insets.bottom + insets.top); + } + + protected int preferredTabAreaHeight(int tabPlacement, int width) { + FontMetrics fm = getFontMetrics(); + int tc = tabPane.getTabCount(); + int total = 0; + if (tc > 0) { + int rows = 1; + int x = 0; + int maxTabHeight = calculateMaxTabHeight(tabPlacement); + + for (int i = 0; i < tc; i++) { + int tabWidth = calculateTabWidth(tabPlacement, i, fm); + + if (x != 0 && x + tabWidth > width) { + rows++; + x = 0; + } + x += tabWidth; + } + total = calculateTabAreaHeight(tabPlacement, rows, maxTabHeight); + } + return total; + } + + protected int preferredTabAreaWidth(int tabPlacement, int height) { + FontMetrics fm = getFontMetrics(); + int tc = tabPane.getTabCount(); + int total = 0; + if (tc > 0) { + int columns = 1; + int y = 0; + int fontHeight = fm.getHeight(); + + maxTabWidth = calculateMaxTabWidth(tabPlacement); + + for (int i = 0; i < tc; i++) { + int tabHeight = calculateTabHeight(tabPlacement, i, fontHeight); + + if (y != 0 && y + tabHeight > height) { + columns++; + y = 0; + } + y += tabHeight; + } + total = calculateTabAreaWidth(tabPlacement, columns, maxTabWidth); + } + return total; + } + + @SuppressWarnings("deprecation") + public void layoutContainer(Container parent) { + /* Some of the code in this method deals with changing the + * visibility of components to hide and show the contents for the + * selected tab. This is older code that has since been duplicated + * in JTabbedPane.fireStateChanged(), so as to allow visibility + * changes to happen sooner (see the note there). This code remains + * for backward compatibility as there are some cases, such as + * subclasses that don't fireStateChanged() where it may be used. + * Any changes here need to be kept in synch with + * JTabbedPane.fireStateChanged(). + */ + + int tabPlacement = tabPane.getTabPlacement(); + Insets insets = tabPane.getInsets(); + int selectedIndex = tabPane.getSelectedIndex(); + Component visibleComponent = getVisibleComponent(); + + calculateLayoutInfo(); + + Component selectedComponent = null; + if (selectedIndex < 0) { + if (visibleComponent != null) { + // The last tab was removed, so remove the component + setVisibleComponent(null); + } + } else { + try { + selectedComponent = tabPane.getComponentAt(selectedIndex); + } catch (Exception ex) { + } + } + int cx, cy, cw, ch; + int totalTabWidth = 0; + int totalTabHeight = 0; + Insets contentInsets = getContentBorderInsets(tabPlacement); + + boolean shouldChangeFocus = false; + + // In order to allow programs to use a single component + // as the display for multiple tabs, we will not change + // the visible compnent if the currently selected tab + // has a null component. This is a bit dicey, as we don't + // explicitly state we support this in the spec, but since + // programs are now depending on this, we're making it work. + // + if (selectedComponent != null) { + if (selectedComponent != visibleComponent && visibleComponent != null) { + if (SwingUtilities.findFocusOwner(visibleComponent) != null) { + shouldChangeFocus = true; + } + } + setVisibleComponent(selectedComponent); + } + + Rectangle bounds = tabPane.getBounds(); + int numChildren = tabPane.getComponentCount(); + + if (numChildren > 0) { + + switch (tabPlacement) { + case LEFT: + totalTabWidth = calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth); + cx = insets.left + totalTabWidth + contentInsets.left; + cy = insets.top + contentInsets.top; + break; + case RIGHT: + totalTabWidth = calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth); + cx = insets.left + contentInsets.left; + cy = insets.top + contentInsets.top; + break; + case BOTTOM: + totalTabHeight = calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight); + cx = insets.left + contentInsets.left; + cy = insets.top + contentInsets.top; + break; + case TOP: + default: + totalTabHeight = calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight); + cx = insets.left + contentInsets.left; + cy = insets.top + totalTabHeight + contentInsets.top; + } + + cw = bounds.width - totalTabWidth + - insets.left - insets.right + - contentInsets.left - contentInsets.right; + ch = bounds.height - totalTabHeight + - insets.top - insets.bottom + - contentInsets.top - contentInsets.bottom; + + for (int i = 0; i < numChildren; i++) { + Component child = tabPane.getComponent(i); + if (child == tabContainer) { + + int tabContainerWidth = totalTabWidth == 0 ? cw : totalTabWidth; + int tabContainerHeight = totalTabHeight == 0 ? ch : totalTabHeight; + + int tabContainerX = 0; + int tabContainerY = 0; + if (tabPlacement == BOTTOM) { + tabContainerY = bounds.height - tabContainerHeight; + } else if (tabPlacement == RIGHT) { + tabContainerX = bounds.width - tabContainerWidth; + } + child.setBounds(tabContainerX, tabContainerY, tabContainerWidth, tabContainerHeight); + } else { + child.setBounds(cx, cy, cw, ch); + } + } + } + layoutTabComponents(); + if (shouldChangeFocus) { + if (!requestFocusForVisibleComponent()) { + tabPane.requestFocus(); + } + } + } + + public void calculateLayoutInfo() { + int tc = tabPane.getTabCount(); + assureRectsCreated(tc); + calculateTabRects(tabPane.getTabPlacement(), tc); + } + + private void layoutTabComponents() { + if (JTattooUtilities.getJavaVersion() >= 1.6) { + if (tabContainer == null) { + return; + } + Rectangle rect = new Rectangle(); + Point delta = new Point(-tabContainer.getX(), -tabContainer.getY()); + if (scrollableTabLayoutEnabled()) { + translatePointToTabPanel(0, 0, delta); + } + for (int i = 0; i < tabPane.getTabCount(); i++) { + Component tabComponent = getTabComponentAt(i); + if (tabComponent == null) { + continue; + } + getTabBounds(i, rect); + Dimension preferredSize = tabComponent.getPreferredSize(); + Insets insets = getTabInsets(tabPane.getTabPlacement(), i); + int outerX = rect.x + insets.left + delta.x; + int outerY = rect.y + insets.top + delta.y; + int outerWidth = rect.width - insets.left - insets.right; + int outerHeight = rect.height - insets.top - insets.bottom; + //centralize component + int x = outerX + (outerWidth - preferredSize.width) / 2; + int y = outerY + (outerHeight - preferredSize.height) / 2; + int tabPlacement = tabPane.getTabPlacement(); + boolean isSeleceted = i == tabPane.getSelectedIndex(); + tabComponent.setBounds(x + getTabLabelShiftX(tabPlacement, i, isSeleceted), y + getTabLabelShiftY(tabPlacement, i, isSeleceted), preferredSize.width, preferredSize.height); + } + } + } + + protected void calculateTabRects(int tabPlacement, int tabCount) { + FontMetrics fm = getFontMetrics(); + Dimension size = tabPane.getSize(); + Insets insets = tabPane.getInsets(); + Insets tabAreaInsets = getTabAreaInsets(tabPlacement); + int fontHeight = fm.getHeight(); + int selectedIndex = tabPane.getSelectedIndex(); + int tabRunOverlay; + int i, j; + int x, y; + int returnAt; + boolean verticalTabRuns = (tabPlacement == LEFT || tabPlacement == RIGHT); + boolean leftToRight = JTattooUtilities.isLeftToRight(tabPane); + + // + // Calculate bounds within which a tab run must fit + // + switch (tabPlacement) { + case LEFT: + maxTabWidth = calculateMaxTabWidth(tabPlacement); + x = insets.left + tabAreaInsets.left; + y = insets.top + tabAreaInsets.top; + returnAt = size.height - (insets.bottom + tabAreaInsets.bottom); + break; + case RIGHT: + maxTabWidth = calculateMaxTabWidth(tabPlacement); + x = size.width - insets.right - tabAreaInsets.right - maxTabWidth; + y = insets.top + tabAreaInsets.top; + returnAt = size.height - (insets.bottom + tabAreaInsets.bottom); + break; + case BOTTOM: + maxTabHeight = calculateMaxTabHeight(tabPlacement); + x = insets.left + tabAreaInsets.left; + y = size.height - insets.bottom - tabAreaInsets.bottom - maxTabHeight; + returnAt = size.width - (insets.right + tabAreaInsets.right); + break; + case TOP: + default: + maxTabHeight = calculateMaxTabHeight(tabPlacement); + x = insets.left + tabAreaInsets.left; + y = insets.top + tabAreaInsets.top; + returnAt = size.width - (insets.right + tabAreaInsets.right); + break; + } + + tabRunOverlay = getTabRunOverlay(tabPlacement); + + runCount = 0; + selectedRun = -1; + + if (tabCount == 0) { + return; + } + + // Run through tabs and partition them into runs + Rectangle rect; + for (i = 0; i < tabCount; i++) { + rect = rects[i]; + + if (!verticalTabRuns) { + // Tabs on TOP or BOTTOM.... + if (i > 0) { + rect.x = rects[i - 1].x + rects[i - 1].width; + } else { + tabRuns[0] = 0; + runCount = 1; + maxTabWidth = 0; + rect.x = x; + } + rect.width = calculateTabWidth(tabPlacement, i, fm); + maxTabWidth = Math.max(maxTabWidth, rect.width); + + // Never move a TAB down a run if it is in the first column. + // Even if there isn't enough room, moving it to a fresh + // line won't help. + if (rect.x != 2 + insets.left && rect.x + rect.width > returnAt) { + if (runCount > tabRuns.length - 1) { + expandTabRunsArray(); + } + tabRuns[runCount] = i; + runCount++; + rect.x = x; + } + // Initialize y position in case there's just one run + rect.y = y; + rect.height = maxTabHeight/* - 2*/; + + } else { + // Tabs on LEFT or RIGHT... + if (i > 0) { + rect.y = rects[i - 1].y + rects[i - 1].height; + } else { + tabRuns[0] = 0; + runCount = 1; + maxTabHeight = 0; + rect.y = y; + } + rect.height = calculateTabHeight(tabPlacement, i, fontHeight); + maxTabHeight = Math.max(maxTabHeight, rect.height); + + // Never move a TAB over a run if it is in the first run. + // Even if there isn't enough room, moving it to a fresh + // column won't help. + if (rect.y != 2 + insets.top && rect.y + rect.height > returnAt) { + if (runCount > tabRuns.length - 1) { + expandTabRunsArray(); + } + tabRuns[runCount] = i; + runCount++; + rect.y = y; + } + // Initialize x position in case there's just one column + rect.x = x; + rect.width = maxTabWidth/* - 2*/; + + } + if (i == selectedIndex) { + selectedRun = runCount - 1; + } + } + + if (runCount > 1) { + // Re-distribute tabs in case last run has leftover space + normalizeTabRuns(tabPlacement, tabCount, verticalTabRuns ? y : x, returnAt); + + selectedRun = getRunForTab(tabCount, selectedIndex); + + // Rotate run array so that selected run is first + if (shouldRotateTabRuns(tabPlacement)) { + rotateTabRuns(tabPlacement, selectedRun); + } + } + + // Step through runs from back to front to calculate + // tab y locations and to pad runs appropriately + for (i = runCount - 1; i >= 0; i--) { + int start = tabRuns[i]; + int next = tabRuns[i == (runCount - 1) ? 0 : i + 1]; + int end = (next != 0 ? next - 1 : tabCount - 1); + if (!verticalTabRuns) { + for (j = start; j <= end; j++) { + rect = rects[j]; + rect.y = y; + rect.x += getTabRunIndent(tabPlacement, i); + } + if (shouldPadTabRun(tabPlacement, i)) { + padTabRun(tabPlacement, start, end, returnAt); + } + if (tabPlacement == BOTTOM) { + y -= (maxTabHeight - tabRunOverlay); + } else { + y += (maxTabHeight - tabRunOverlay); + } + } else { + for (j = start; j <= end; j++) { + rect = rects[j]; + rect.x = x; + rect.y += getTabRunIndent(tabPlacement, i); + } + if (shouldPadTabRun(tabPlacement, i)) { + padTabRun(tabPlacement, start, end, returnAt); + } + if (tabPlacement == RIGHT) { + x -= (maxTabWidth - tabRunOverlay); + } else { + x += (maxTabWidth - tabRunOverlay); + } + } + } + + // Pad the selected tab so that it appears raised in front + padSelectedTab(tabPlacement, selectedIndex); + + // if right to left and tab placement on the top or + // the bottom, flip x positions and adjust by widths + if (!leftToRight && !verticalTabRuns) { + int rightMargin = size.width - (insets.right + tabAreaInsets.right); + for (i = 0; i < tabCount; i++) { + rects[i].x = rightMargin - rects[i].x - rects[i].width; + } + } + } + + /* + * Rotates the run-index array so that the selected run is run[0] + */ + protected void rotateTabRuns(int tabPlacement, int selectedRun) { + for (int i = 0; i < selectedRun; i++) { + int save = tabRuns[0]; + for (int j = 1; j < runCount; j++) { + tabRuns[j - 1] = tabRuns[j]; + } + tabRuns[runCount - 1] = save; + } + } + + protected void normalizeTabRuns(int tabPlacement, int tabCount, int start, int max) { + // Only normalize the runs for top & bottom; normalizing + // doesn't look right for Metal's vertical tabs + // because the last run isn't padded and it looks odd to have + // fat tabs in the first vertical runs, but slimmer ones in the + // last (this effect isn't noticeable for horizontal tabs). + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + int run = runCount - 1; + boolean keepAdjusting = true; + double weight = 1.25; + + // At this point the tab runs are packed to fit as many + // tabs as possible, which can leave the last run with a lot + // of extra space (resulting in very fat tabs on the last run). + // So we'll attempt to distribute this extra space more evenly + // across the runs in order to make the runs look more consistent. + // + // Starting with the last run, determine whether the last tab in + // the previous run would fit (generously) in this run; if so, + // move tab to current run and shift tabs accordingly. Cycle + // through remaining runs using the same algorithm. + // + while (keepAdjusting) { + int last = lastTabInRun(tabCount, run); + int prevLast = lastTabInRun(tabCount, run - 1); + int end; + int prevLastLen; + + end = rects[last].x + rects[last].width; + prevLastLen = (int) (maxTabWidth * weight); + + // Check if the run has enough extra space to fit the last tab + // from the previous row... + if (max - end > prevLastLen) { + + // Insert tab from previous row and shift rest over + tabRuns[run] = prevLast; + rects[prevLast].x = start; + for (int i = prevLast + 1; i <= last; i++) { + rects[i].x = rects[i - 1].x + rects[i - 1].width; + } + + } else if (run == runCount - 1) { + // no more room left in last run, so we're done! + keepAdjusting = false; + } + if (run - 1 > 0) { + // check previous run next... + run -= 1; + } else { + // check last run again...but require a higher ratio + // of extraspace-to-tabsize because we don't want to + // end up with too many tabs on the last run! + run = runCount - 1; + weight += .25; + } + } + } + } + + protected void padTabRun(int tabPlacement, int start, int end, int max) { + Rectangle lastRect = rects[end]; + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + int runWidth = (lastRect.x + lastRect.width) - rects[start].x; + int deltaWidth = max - (lastRect.x + lastRect.width); + float factor = (float) deltaWidth / (float) runWidth; + + for (int j = start; j <= end; j++) { + Rectangle pastRect = rects[j]; + if (j > start) { + pastRect.x = rects[j - 1].x + rects[j - 1].width; + } + pastRect.width += Math.round((float) pastRect.width * factor); + } + lastRect.width = max - lastRect.x; + } else { + int runHeight = (lastRect.y + lastRect.height) - rects[start].y; + int deltaHeight = max - (lastRect.y + lastRect.height); + float factor = (float) deltaHeight / (float) runHeight; + + for (int j = start; j <= end; j++) { + Rectangle pastRect = rects[j]; + if (j > start) { + pastRect.y = rects[j - 1].y + rects[j - 1].height; + } + pastRect.height += Math.round((float) pastRect.height * factor); + } + lastRect.height = max - lastRect.y; + } + } + + protected void padSelectedTab(int tabPlacement, int selectedIndex) { +// if ((selectedIndex >= 0) && (selectedIndex < rects.length)) { +// Rectangle selRect = rects[selectedIndex]; +// Insets padInsets = getSelectedTabPadInsets(tabPlacement); +// selRect.x -= padInsets.left; +// selRect.width += (padInsets.left + padInsets.right); +// selRect.y -= padInsets.top; +// selRect.height += (padInsets.top + padInsets.bottom); +// } + } + } + + private class TabbedPaneScrollLayout extends TabbedPaneLayout { + + protected int preferredTabAreaHeight(int tabPlacement, int width) { + return calculateMaxTabHeight(tabPlacement); + } + + protected int preferredTabAreaWidth(int tabPlacement, int height) { + return calculateMaxTabWidth(tabPlacement); + } + + @SuppressWarnings("deprecation") + public void layoutContainer(Container parent) { + int tabPlacement = tabPane.getTabPlacement(); + int tc = tabPane.getTabCount(); + Insets insets = tabPane.getInsets(); + int selectedIndex = tabPane.getSelectedIndex(); + Component visibleComponent = getVisibleComponent(); + + calculateLayoutInfo(); + + Component selectedComponent = null; + if (selectedIndex < 0) { + if (visibleComponent != null) { + // The last tab was removed, so remove the component + setVisibleComponent(null); + } + } else { + try { + selectedComponent = tabPane.getComponentAt(selectedIndex); + } catch (Exception ex) { +// outStream.print("----------------------------------------------------\n"); +// ex.printStackTrace(outStream); + } + } + boolean shouldChangeFocus = false; + + // In order to allow programs to use a single component + // as the display for multiple tabs, we will not change + // the visible compnent if the currently selected tab + // has a null component. This is a bit dicey, as we don't + // explicitly state we support this in the spec, but since + // programs are now depending on this, we're making it work. + // + if (selectedComponent != null) { + if (selectedComponent != visibleComponent && visibleComponent != null) { + if (SwingUtilities.findFocusOwner(visibleComponent) != null) { + shouldChangeFocus = true; + } + } + setVisibleComponent(selectedComponent); + } + int tx, ty, tw, th; // tab area bounds + int cx, cy, cw, ch; // content area bounds + Insets contentInsets = getContentBorderInsets(tabPlacement); + Rectangle bounds = tabPane.getBounds(); + int numChildren = tabPane.getComponentCount(); + + int space = 60; + if ((numChildren > 0) && (tc > 0)) { + switch (tabPlacement) { + case LEFT: + // calculate tab area bounds + tw = calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth); + th = bounds.height - insets.top - insets.bottom; + tx = insets.left; + ty = insets.top; + + // calculate content area bounds + cx = tx + tw + contentInsets.left; + cy = ty + contentInsets.top; + cw = bounds.width - insets.left - insets.right - tw - contentInsets.left - contentInsets.right; + ch = bounds.height - insets.top - insets.bottom - contentInsets.top - contentInsets.bottom; + break; + case RIGHT: + // calculate tab area bounds + tw = calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth); + th = bounds.height - insets.top - insets.bottom; + tx = bounds.width - insets.right - tw; + ty = insets.top; + + // calculate content area bounds + cx = insets.left + contentInsets.left; + cy = insets.top + contentInsets.top; + cw = bounds.width - insets.left - insets.right - tw - contentInsets.left - contentInsets.right; + ch = bounds.height - insets.top - insets.bottom - contentInsets.top - contentInsets.bottom; + break; + case BOTTOM: + // calculate tab area bounds + tw = bounds.width - insets.left - insets.right; + th = calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight); + tx = insets.left; + ty = bounds.height - insets.bottom - th; + + // calculate content area bounds + cx = insets.left + contentInsets.left; + cy = insets.top + contentInsets.top; + cw = bounds.width - insets.left - insets.right - contentInsets.left - contentInsets.right; + ch = bounds.height - insets.top - insets.bottom - th - contentInsets.top - contentInsets.bottom; + break; + case TOP: + default: + // calculate tab area bounds + tw = bounds.width - insets.left - insets.right; + th = calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight); + tx = insets.left; + ty = insets.top; + + // calculate content area bounds + cx = tx + contentInsets.left; + cy = ty + th + contentInsets.top; + cw = bounds.width - insets.left - insets.right - contentInsets.left - contentInsets.right; + ch = bounds.height - insets.top - insets.bottom - th - contentInsets.top - contentInsets.bottom; + } + for (int i = 0; i < numChildren; i++) { + Component child = tabPane.getComponent(i); + if (child instanceof ScrollableTabViewport) { + JViewport viewport = (JViewport) child; + Rectangle viewRect = viewport.getViewRect(); + int vw = tw; + int vh = th; + switch (tabPlacement) { + case LEFT: + case RIGHT: + int totalTabHeight = rects[tc - 1].y + rects[tc - 1].height; + if (totalTabHeight > th) { + // Allow space for scrollbuttons + vh = Math.max(th - space, space); + if (totalTabHeight - viewRect.y <= vh) { + // Scrolled to the end, so ensure the viewport size is + // such that the scroll offset aligns with a tab + vh = totalTabHeight - viewRect.y; + } + } + break; + case BOTTOM: + case TOP: + default: + int totalTabWidth = rects[tc - 1].x + rects[tc - 1].width; + if (totalTabWidth > tw) { + // Allow space for scrollbuttons + vw = Math.max(tw - space, space); + if (totalTabWidth - viewRect.x <= vw) { + // Scrolled to the end, so ensure the viewport size is + // such that the scroll offset aligns with a tab + vw = totalTabWidth - viewRect.x; + } + } + } + + child.setBounds(tx, ty, vw, vh); + + } else if (child instanceof ScrollableTabButton) { + ScrollableTabButton scrollbutton = (ScrollableTabButton) child; + Dimension bsize = scrollbutton.getPreferredSize(); + int bx = 0; + int by = 0; + int bw = bsize.width; + int bh = bsize.height; + boolean visible = false; + + switch (tabPlacement) { + case LEFT: + case RIGHT: + int totalTabHeight = rects[tc - 1].y + rects[tc - 1].height; + if (totalTabHeight > th) { + int dir = scrollbutton.scrollsForward() ? SOUTH : NORTH; + scrollbutton.setDirection(dir); + visible = true; + bx = tabPlacement == LEFT ? tw - insets.left - tabAreaInsets.bottom - bsize.width : bounds.width - insets.left - bsize.width; + by = dir == SOUTH ? bounds.height - insets.bottom - 2 * bsize.height - 2 : bounds.height - insets.bottom - 3 * bsize.height - 2; + } + break; + + case BOTTOM: + case TOP: + default: + int totalTabWidth = rects[tc - 1].x + rects[tc - 1].width; + if (totalTabWidth > tw) { + int dir = scrollbutton.scrollsForward() ? EAST : WEST; + scrollbutton.setDirection(dir); + visible = true; + bx = dir == EAST ? bounds.width - insets.left - 2 * bsize.width - 2 : bounds.width - insets.left - 3 * bsize.width - 2; + by = ty + (th - bsize.height - tabAreaInsets.bottom) / 2; + if (tabPlacement == BOTTOM) { + by += tabAreaInsets.bottom; + } else { + by++; + } + } + } + + child.setVisible(visible); + if (visible) { + child.setBounds(bx, by, bw, bh); + } + + } else if (child instanceof ScrollablePopupMenuTabButton) { + ScrollablePopupMenuTabButton button = (ScrollablePopupMenuTabButton) child; + Dimension bsize = button.getPreferredSize(); + int bx = 0; + int by = 0; + int bw = bsize.width; + int bh = bsize.height; + boolean visible = false; + + switch (tabPlacement) { + case LEFT: + case RIGHT: + int totalTabHeight = rects[tc - 1].y + rects[tc - 1].height; + if (totalTabHeight > th) { + visible = true; + bx = tabPlacement == LEFT ? tw - insets.left - tabAreaInsets.bottom - bsize.width : bounds.width - insets.left - bsize.width; + by = bounds.height - insets.bottom - bsize.height; + } + break; + + case BOTTOM: + case TOP: + default: + int totalTabWidth = rects[tc - 1].x + rects[tc - 1].width; + if (totalTabWidth > tw) { + visible = true; + bx = bounds.width - insets.left - bsize.width; + by = ty + (th - bsize.height - tabAreaInsets.bottom) / 2; + if (tabPlacement == BOTTOM) { + by += tabAreaInsets.bottom; + } else { + by++; + } + } + } + + child.setVisible(visible); + if (visible) { + child.setBounds(bx, by, bw, bh); + } + } else { + // All content children... + child.setBounds(cx, cy, cw, ch); + } + } + super.layoutTabComponents(); + if (shouldChangeFocus) { + if (!requestFocusForVisibleComponent()) { + tabPane.requestFocus(); + } + } + } + } + + protected void calculateTabRects(int tabPlacement, int tabCount) { + FontMetrics fm = getFontMetrics(); + Dimension size = tabPane.getSize(); + Insets insets = tabPane.getInsets(); + Insets tabAreaInsets = getTabAreaInsets(tabPlacement); + int fontHeight = fm.getHeight(); + boolean verticalTabRuns = (tabPlacement == LEFT || tabPlacement == RIGHT); + boolean leftToRight = JTattooUtilities.isLeftToRight(tabPane); + int x = tabAreaInsets.left; + int y = tabAreaInsets.top; + int totalWidth = 0; + int totalHeight = 0; + + // + // Calculate bounds within which a tab run must fit + // + switch (tabPlacement) { + case LEFT: + case RIGHT: + maxTabWidth = calculateMaxTabWidth(tabPlacement); + break; + case BOTTOM: + case TOP: + default: + maxTabHeight = calculateMaxTabHeight(tabPlacement); + } + + runCount = 0; + selectedRun = -1; + + if (tabCount == 0) { + return; + } + + selectedRun = 0; + runCount = 1; + + // Run through tabs and lay them out in a single run + Rectangle rect; + for (int i = 0; i < tabCount; i++) { + rect = rects[i]; + + if (!verticalTabRuns) { + // Tabs on TOP or BOTTOM.... + if (i > 0) { + rect.x = rects[i - 1].x + rects[i - 1].width; + } else { + tabRuns[0] = 0; + maxTabWidth = 0; + totalHeight += maxTabHeight; + rect.x = x; + } + rect.width = calculateTabWidth(tabPlacement, i, fm); + totalWidth = rect.x + rect.width; + maxTabWidth = Math.max(maxTabWidth, rect.width); + + rect.y = y; + rect.height = maxTabHeight/* - 2*/; + + } else { + // Tabs on LEFT or RIGHT... + if (i > 0) { + rect.y = rects[i - 1].y + rects[i - 1].height; + } else { + tabRuns[0] = 0; + maxTabHeight = 0; + totalWidth = maxTabWidth; + rect.y = y; + } + rect.height = calculateTabHeight(tabPlacement, i, fontHeight); + totalHeight = rect.y + rect.height; + maxTabHeight = Math.max(maxTabHeight, rect.height); + + rect.x = x; + rect.width = maxTabWidth/* - 2*/; + + } + } + + // if right to left and tab placement on the top or + // the bottom, flip x positions and adjust by widths + if (!leftToRight && !verticalTabRuns) { + int rightMargin = size.width - (insets.right + tabAreaInsets.right); + for (int i = 0; i < tabCount; i++) { + rects[i].x = rightMargin - rects[i].x - rects[i].width; + } + } + //tabPanel.setSize(totalWidth, totalHeight); + tabScroller.tabPanel.setPreferredSize(new Dimension(totalWidth, totalHeight)); + } + } + + private class ScrollableTabSupport implements ChangeListener { + + public ScrollableTabViewport viewport; + public ScrollableTabPanel tabPanel; + public ScrollableTabButton scrollForwardButton; + public ScrollableTabButton scrollBackwardButton; + public ScrollablePopupMenuTabButton popupMenuButton; + public int leadingTabIndex; + private Point tabViewPosition = new Point(0, 0); + + ScrollableTabSupport(int tabPlacement) { + viewport = new ScrollableTabViewport(); + tabPanel = new ScrollableTabPanel(); + + viewport.setView(tabPanel); + viewport.addChangeListener(this); + + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + scrollForwardButton = new ScrollableTabButton(EAST); + scrollBackwardButton = new ScrollableTabButton(WEST); + + } else { // tabPlacement = LEFT || RIGHT + scrollForwardButton = new ScrollableTabButton(SOUTH); + scrollBackwardButton = new ScrollableTabButton(NORTH); + } + popupMenuButton = new ScrollablePopupMenuTabButton(); + } + + public void scrollForward(int tabPlacement) { + Dimension viewSize = viewport.getViewSize(); + Rectangle viewRect = viewport.getViewRect(); + + if (tabPlacement == TOP || tabPlacement == BOTTOM) { + if (viewRect.width >= viewSize.width - viewRect.x) { + return; // no room left to scroll + } + } else { + // tabPlacement == LEFT || tabPlacement == RIGHT + if (viewRect.height >= viewSize.height - viewRect.y) { + return; + } + } + setLeadingTabIndex(tabPlacement, leadingTabIndex + 1); + if (tabPane != null) { + tabPane.doLayout(); + } + } + + public void scrollBackward(int tabPlacement) { + if (leadingTabIndex == 0) { + return; // no room left to scroll + } + setLeadingTabIndex(tabPlacement, leadingTabIndex - 1); + if (tabPane != null) { + tabPane.doLayout(); + } + } + + public void scrollTabToVisible(int tabPlacement, int index) { + if (index <= leadingTabIndex) { + setLeadingTabIndex(tabPlacement, index); + } else { + Rectangle viewRect = viewport.getViewRect(); + switch (tabPlacement) { + case TOP: + case BOTTOM: { + int i = index; + int x = viewRect.width - rects[index].width; + while ((i > 0) && (x - rects[i - 1].width >= 0)) { + i--; + x -= rects[i].width; + } + if (leadingTabIndex < i) { + setLeadingTabIndex(tabPlacement, i); + } + break; + + } + case LEFT: + case RIGHT: { + int i = index; + int y = viewRect.height - rects[index].height; + while ((i > 0) && (y - rects[i - 1].height > 0)) { + i--; + y -= rects[i].height; + } + if (leadingTabIndex < i) { + setLeadingTabIndex(tabPlacement, i); + } + break; + } + } + } + } + + public void setLeadingTabIndex(int tabPlacement, int index) { + leadingTabIndex = index; + Dimension viewSize = viewport.getViewSize(); + Rectangle viewRect = viewport.getViewRect(); + + switch (tabPlacement) { + case TOP: + case BOTTOM: + tabViewPosition.x = leadingTabIndex == 0 ? 0 : rects[leadingTabIndex].x; + + if ((viewSize.width - tabViewPosition.x) < viewRect.width) { + // We've scrolled to the end, so adjust the viewport size + // to ensure the view position remains aligned on a tab boundary + Dimension extentSize = new Dimension(viewSize.width - tabViewPosition.x, viewRect.height); + viewport.setExtentSize(extentSize); + } + break; + case LEFT: + case RIGHT: + tabViewPosition.y = leadingTabIndex == 0 ? 0 : rects[leadingTabIndex].y; + + if ((viewSize.height - tabViewPosition.y) < viewRect.height) { + // We've scrolled to the end, so adjust the viewport size + // to ensure the view position remains aligned on a tab boundary + Dimension extentSize = new Dimension(viewRect.width, viewSize.height - tabViewPosition.y); + viewport.setExtentSize(extentSize); + } + } + viewport.setViewPosition(tabViewPosition); + } + + public void stateChanged(ChangeEvent e) { + JViewport vp = (JViewport) e.getSource(); + int tabPlacement = tabPane.getTabPlacement(); + int tc = tabPane.getTabCount(); + Rectangle vpRect = vp.getBounds(); + Dimension viewSize = vp.getViewSize(); + Rectangle viewRect = vp.getViewRect(); + + leadingTabIndex = getClosestTab(viewRect.x, viewRect.y); + if (leadingTabIndex >= rects.length) { + return; + } + + // If the tab isn't right aligned, adjust it. + if (leadingTabIndex + 1 < tc) { + switch (tabPlacement) { + case TOP: + case BOTTOM: + if (rects[leadingTabIndex].x < viewRect.x) { + leadingTabIndex++; + } + break; + case LEFT: + case RIGHT: + if (rects[leadingTabIndex].y < viewRect.y) { + leadingTabIndex++; + } + break; + } + } + Insets contentInsets = getContentBorderInsets(tabPlacement); + switch (tabPlacement) { + case LEFT: + tabPane.repaint(vpRect.x + vpRect.width, vpRect.y, contentInsets.left, vpRect.height); + scrollBackwardButton.setEnabled(viewRect.y > 0); + scrollForwardButton.setEnabled(leadingTabIndex < tc - 1 && viewSize.height - viewRect.y > viewRect.height); + break; + case RIGHT: + tabPane.repaint(vpRect.x - contentInsets.right, vpRect.y, contentInsets.right, vpRect.height); + scrollBackwardButton.setEnabled(viewRect.y > 0); + scrollForwardButton.setEnabled(leadingTabIndex < tc - 1 && viewSize.height - viewRect.y > viewRect.height); + break; + case BOTTOM: + tabPane.repaint(vpRect.x, vpRect.y - contentInsets.bottom, vpRect.width, contentInsets.bottom); + scrollBackwardButton.setEnabled(viewRect.x > 0); + scrollForwardButton.setEnabled(leadingTabIndex < tc - 1 && viewSize.width - viewRect.x > viewRect.width); + break; + case TOP: + default: + tabPane.repaint(vpRect.x, vpRect.y + vpRect.height, vpRect.width, contentInsets.top); + scrollBackwardButton.setEnabled(viewRect.x > 0); + scrollForwardButton.setEnabled(leadingTabIndex < tc - 1 && viewSize.width - viewRect.x > viewRect.width); + } + } + + } + + private class ScrollableTabViewport extends JViewport implements UIResource { + + public ScrollableTabViewport() { + setScrollMode(SIMPLE_SCROLL_MODE); + setOpaque(false); + } + + } + + private class ScrollableTabPanel extends JPanel implements UIResource { + + public ScrollableTabPanel() { + setLayout(null); + setOpaque(false); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + paintScrollContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex(), 0, 0, getWidth(), getHeight()); + paintTabArea(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex()); + } + + public void doLayout() { + if (getComponentCount() > 0) { + Component child = getComponent(0); + child.setBounds(0, 0, getWidth(), getHeight()); + } + } + } + + public class ArrowButton extends JButton implements SwingConstants { + + protected int direction; + + public ArrowButton(int direction) { + super(); + this.direction = direction; + setRequestFocusEnabled(false); + if (simpleButtonBorder) { + Color cLo = getLoBorderColor(0); + Color cHi = AbstractLookAndFeel.getTheme().getControlHighlight(); + setBorder(BorderFactory.createEtchedBorder(cHi, cLo)); + } + } + + public int getDirection() { + return direction; + } + + public void setDirection(int dir) { + direction = dir; + } + + public void paint(Graphics g) { + super.paint(g); + // Draw the arrow + int w = getSize().width; + int h = getSize().height; + int size = Math.min((h - 4) / 3, (w - 4) / 3); + size = Math.max(size, 2); + paintTriangle(g, (w - size) / 2 + 1, (h - size) / 2 + 1, size); + } + + public Dimension getPreferredSize() { + return new Dimension(17, 17); + } + + public Dimension getMinimumSize() { + return new Dimension(5, 5); + } + + public Dimension getMaximumSize() { + return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + } + + @SuppressWarnings("deprecation") + public boolean isFocusTraversable() { + return false; + } + + public void paintTriangle(Graphics g, int x, int y, int size) { + Color oldColor = g.getColor(); + int mid, i, j; + size = Math.max(size, 2); + mid = (size / 2) - 1; + + Color enabledColor = AbstractLookAndFeel.getTheme().getButtonForegroundColor(); + Color disabledColor = AbstractLookAndFeel.getTheme().getDisabledForegroundColor(); + + g.translate(x, y); + if (isEnabled()) { + g.setColor(enabledColor); + } else { + g.setColor(disabledColor); + } + + switch (direction) { + case NORTH: + for (i = 0; i < size; i++) { + g.drawLine(mid - i, i, mid + i, i); + } + break; + case SOUTH: + j = 0; + for (i = size - 1; i >= 0; i--) { + g.drawLine(mid - i, j, mid + i, j); + j++; + } + break; + case WEST: + for (i = 0; i < size; i++) { + g.drawLine(i, mid - i, i, mid + i); + } + break; + case EAST: + j = 0; + for (i = size - 1; i >= 0; i--) { + g.drawLine(j, mid - i, j, mid + i); + j++; + } + break; + } + g.translate(-x, -y); + g.setColor(oldColor); + } + } + + private class ScrollableTabButton extends ArrowButton implements UIResource, SwingConstants { + + public ScrollableTabButton(int direction) { + super(direction); + } + + public boolean scrollsForward() { + return direction == EAST || direction == SOUTH; + } + } + + private class ScrollablePopupMenuTabButton extends ArrowButton implements UIResource, SwingConstants { + + public ScrollablePopupMenuTabButton() { + super(SOUTH); + } + } + +// Controller: event listeners + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class PropertyChangeHandler implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + JTabbedPane pane = (JTabbedPane) e.getSource(); + String name = e.getPropertyName(); + boolean isScrollLayout = scrollableTabLayoutEnabled(); + if ("mnemonicAt".equals(name)) { + updateMnemonics(); + pane.repaint(); + } else if ("displayedMnemonicIndexAt".equals(name)) { + pane.repaint(); + } else if ("indexForTitle".equals(name)) { + int index = ((Integer) e.getNewValue()).intValue(); + String title = tabPane.getTitleAt(index); + if (BasicHTML.isHTMLString(title)) { + if (htmlViews == null) { // Initialize vector + htmlViews = createHTMLViewList(); + } else { // Vector already exists + View v = BasicHTML.createHTMLView(tabPane, title); + htmlViews.set(index, v); + } + } else { + if (htmlViews != null && htmlViews.get(index) != null) { + htmlViews.set(index, null); + } + } + updateMnemonics(); + } else if ("tabLayoutPolicy".equals(name)) { + BaseTabbedPaneUI.this.uninstallUI(pane); + BaseTabbedPaneUI.this.installUI(pane); + } else if ("background".equals(name) && isScrollLayout) { + Color newVal = (Color) e.getNewValue(); + tabScroller.tabPanel.setBackground(newVal); + tabScroller.viewport.setBackground(newVal); + Color newColor = selectedColor == null ? newVal : selectedColor; + tabScroller.scrollForwardButton.setBackground(newColor); + tabScroller.scrollBackwardButton.setBackground(newColor); + } else if ("indexForTabComponent".equals(name)) { + if (tabContainer != null) { + tabContainer.removeUnusedTabComponents(); + } + try { + Component tabComponent = getTabComponentAt(((Integer) e.getNewValue()).intValue()); + if (tabComponent != null) { + if (tabContainer == null) { + installTabContainer(); + } else { + addMyPropertyChangeListeners(tabComponent); + tabContainer.add(tabComponent); + } + } + } catch (Exception ex) { + } + tabPane.revalidate(); + tabPane.repaint(); + } else if ("componentOrientation".equals(name)) { + pane.revalidate(); + pane.repaint(); + } else if ("tabAreaBackground".equals(name)) { + pane.revalidate(); + pane.repaint(); + } + } + } + + public class MyTabComponentListener implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent evt) { + if ("font".equals(evt.getPropertyName()) || "text".equals(evt.getPropertyName())) { + tabPane.revalidate(); + tabPane.repaint(); + } + } + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class TabSelectionHandler implements ChangeListener { + + public void stateChanged(ChangeEvent e) { + JTabbedPane tabPane = (JTabbedPane) e.getSource(); + if (JTattooUtilities.getJavaVersion() >= 1.4) { + if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) { + int index = tabPane.getSelectedIndex(); + if (index >= 0) { + BaseTabbedPaneUI ui = (BaseTabbedPaneUI) tabPane.getUI(); + ui.tabScroller.scrollTabToVisible(tabPane.getTabPlacement(), index); + } + } + } + tabPane.revalidate(); + tabPane.repaint(); + } + } + + public class TabComponentHandler implements ComponentListener { + + public void componentResized(ComponentEvent ce) { + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + if (tabPane != null) { + tabPane.doLayout(); + } + } + }); + } + + public void componentMoved(ComponentEvent ce) { + } + + public void componentShown(ComponentEvent ce) { + + } + + public void componentHidden(ComponentEvent ce) { + } + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class MouseHandler extends MouseAdapter { + + public void mouseClicked(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseListener[] ml = tabPane.getMouseListeners(); + for (int i = 0; i < ml.length; i++) { + ml[i].mouseClicked(e); + } + } + } + + public void mousePressed(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseListener[] ml = tabPane.getMouseListeners(); + for (int i = 0; i < ml.length; i++) { + ml[i].mousePressed(e); + } + } + if (!tabPane.isEnabled()) { + return; + } + int tabIndex = getTabAtLocation(e.getX(), e.getY()); + if (tabIndex >= 0 && tabPane.isEnabledAt(tabIndex)) { + if (tabIndex == tabPane.getSelectedIndex()) { + if (tabPane.isRequestFocusEnabled()) { + tabPane.requestFocus(); + tabPane.repaint(getTabBounds(tabPane, tabIndex)); + } + } else { + tabPane.setSelectedIndex(tabIndex); + } + } + } + + public void mouseReleased(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseListener[] ml = tabPane.getMouseListeners(); + for (int i = 0; i < ml.length; i++) { + ml[i].mouseReleased(e); + } + } + } + + public void mouseEntered(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseListener[] ml = tabPane.getMouseListeners(); + for (int i = 0; i < ml.length; i++) { + ml[i].mouseEntered(e); + } + } + } + + public void mouseExited(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseListener[] ml = tabPane.getMouseListeners(); + for (int i = 0; i < ml.length; i++) { + ml[i].mouseExited(e); + } + } + rolloverIndex = -1; + if (rolloverIndex != oldRolloverIndex) { + if ((oldRolloverIndex >= 0) && (oldRolloverIndex < tabPane.getTabCount())) { + tabPane.repaint(getTabBounds(tabPane, oldRolloverIndex)); + } + if ((rolloverIndex >= 0) && (rolloverIndex < tabPane.getTabCount())) { + tabPane.repaint(getTabBounds(tabPane, rolloverIndex)); + } + oldRolloverIndex = rolloverIndex; + } + } + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class MouseMotionHandler extends MouseMotionAdapter { + + public void mouseDragged(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseMotionListener[] mml = tabPane.getMouseMotionListeners(); + for (int i = 0; i < mml.length; i++) { + mml[i].mouseDragged(e); + } + } + } + + public void mouseMoved(MouseEvent e) { + if (scrollableTabLayoutEnabled()) { + MouseMotionListener[] mml = tabPane.getMouseMotionListeners(); + for (int i = 0; i < mml.length; i++) { + mml[i].mouseMoved(e); + } + } + rolloverIndex = getTabAtLocation(e.getX(), e.getY()); + if (rolloverIndex != oldRolloverIndex) { + if ((oldRolloverIndex >= 0) && (oldRolloverIndex < tabPane.getTabCount())) { + tabPane.repaint(getTabBounds(tabPane, oldRolloverIndex)); + } + if ((rolloverIndex >= 0) && (rolloverIndex < tabPane.getTabCount())) { + tabPane.repaint(getTabBounds(tabPane, rolloverIndex)); + } + oldRolloverIndex = rolloverIndex; + } + } + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of BaseTabbedPaneUI. + */ + public class FocusHandler extends FocusAdapter { + + public void focusGained(FocusEvent e) { + JTabbedPane tabPane = (JTabbedPane) e.getSource(); + int tabCount = tabPane.getTabCount(); + int selectedIndex = tabPane.getSelectedIndex(); + if (selectedIndex != -1 && tabCount > 0 && tabCount == rects.length) { + tabPane.repaint(getTabBounds(tabPane, selectedIndex)); + } + } + + public void focusLost(FocusEvent e) { + JTabbedPane tabPane = (JTabbedPane) e.getSource(); + int tabCount = tabPane.getTabCount(); + int selectedIndex = tabPane.getSelectedIndex(); + if (selectedIndex != -1 && tabCount > 0 && tabCount == rects.length) { + tabPane.repaint(getTabBounds(tabPane, selectedIndex)); + } + } + } + + /* GES 2/3/99: + The container listener code was added to support HTML + rendering of tab titles. + + Ideally, we would be able to listen for property changes + when a tab is added or its text modified. At the moment + there are no such events because the Beans spec doesn't + allow 'indexed' property changes (i.e. tab 2's text changed + from A to B). + + In order to get around this, we listen for tabs to be added + or removed by listening for the container events. we then + queue up a runnable (so the component has a chance to complete + the add) which checks the tab title of the new component to see + if it requires HTML rendering. + + The Views (one per tab title requiring HTML rendering) are + stored in the htmlViews list, which is only allocated after + the first time we run into an HTML tab. Note that this list + is kept in step with the number of pages, and nulls are added + for those pages whose tab title do not require HTML rendering. + + This makes it easy for the paint and layout code to tell + whether to invoke the HTML engine without having to check + the string during time-sensitive operations. + + When we have added a way to listen for tab additions and + changes to tab text, this code should be removed and + replaced by something which uses that. */ + private class ContainerHandler implements ContainerListener { + + public void componentAdded(ContainerEvent e) { + JTabbedPane tp = (JTabbedPane) e.getContainer(); + TabbedPaneLayout layout = (TabbedPaneLayout) tp.getLayout(); + layout.layoutContainer(tp); + + Component child = e.getChild(); + if (child instanceof UIResource) { + return; + } + int index = tp.indexOfComponent(child); + String title = tp.getTitleAt(index); + boolean isHTML = BasicHTML.isHTMLString(title); + if (isHTML) { + if (htmlViews == null) { + // Initialize vector + htmlViews = createHTMLViewList(); + } else { + // Vector already exists + View v = BasicHTML.createHTMLView(tp, title); + htmlViews.add(index, v); + } + } else { + // Not HTML + if (htmlViews != null) { + // Add placeholder + htmlViews.add(index, null); + } // else nada! + } + } + + public void componentRemoved(ContainerEvent e) { + JTabbedPane tp = (JTabbedPane) e.getContainer(); + Component child = e.getChild(); + if (child instanceof UIResource) { + return; + } + + // NOTE 4/15/2002 (joutwate): + // This fix is implemented using client properties since there is + // currently no IndexPropertyChangeEvent. Once + // IndexPropertyChangeEvents have been added this code should be + // modified to use it. + Integer indexObj = (Integer) tp.getClientProperty("__index_to_remove__"); + if (indexObj != null) { + int index = indexObj.intValue(); + if (htmlViews != null && htmlViews.size() >= index) { + htmlViews.remove(index); + } + } + } + } + + private ArrayList createHTMLViewList() { + ArrayList viewList = new ArrayList(); + int count = tabPane.getTabCount(); + for (int i = 0; i < count; i++) { + String title = tabPane.getTitleAt(i); + if (BasicHTML.isHTMLString(title)) { + viewList.add(BasicHTML.createHTMLView(tabPane, title)); + } else { + viewList.add(null); + } + } + return viewList; + } + + private class TabContainer extends JPanel implements UIResource { + + private boolean notifyTabbedPane = true; + + public TabContainer() { + super(null); + setOpaque(false); + } + + @SuppressWarnings("deprecation") + public void remove(Component comp) { + int index = tabPane.indexOfTabComponent(comp); + PropertyChangeListener[] listeners = comp.getPropertyChangeListeners(); + for (int j = 0; j < listeners.length; j++) { + if (listeners[j] instanceof MyTabComponentListener) { + comp.removePropertyChangeListener(listeners[j]); + } + } + super.remove(comp); + if (notifyTabbedPane && index != -1) { + tabPane.setTabComponentAt(index, null); + } + } + + private void removeUnusedTabComponents() { + for (int i = 0; i < getComponentCount(); i++) { + Component c = getComponent(i); + if (!(c instanceof UIResource)) { + int index = tabPane.indexOfTabComponent(c); + if (index == -1) { + PropertyChangeListener[] listeners = c.getPropertyChangeListeners(); + for (int j = 0; j < listeners.length; j++) { + if (listeners[j] instanceof MyTabComponentListener) { + c.removePropertyChangeListener(listeners[j]); + } + } + super.remove(c); + } + } + } + } + } +} diff --git a/src/com/jtattoo/plaf/BaseTableHeaderUI.java b/src/com/jtattoo/plaf/BaseTableHeaderUI.java new file mode 100644 index 0000000..5d6aa31 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTableHeaderUI.java @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + * + * JTattoo is multiple licensed. If your are an open source developer you can use + * it under the terms and conditions of the GNU General Public License version 2.0 + * or later as published by the Free Software Foundation. + * + * see: gpl-2.0.txt + * + * If you pay for a license you will become a registered user who could use the + * software under the terms and conditions of the GNU Lesser General Public License + * version 2.0 or later with classpath exception as published by the Free Software + * Foundation. + * + * see: lgpl-2.0.txt + * see: classpath-exception.txt + * + * Registered users could also use JTattoo under the terms and conditions of the + * Apache License, Version 2.0 as published by the Apache Software Foundation. + * + * see: APACHE-LICENSE-2.0.txt + */ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.*; +import java.util.Enumeration; +import java.util.List; +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicTableHeaderUI; +import javax.swing.table.*; + +/** + * + * @author Michael Hagen + */ +public class BaseTableHeaderUI extends BasicTableHeaderUI { + + private TableCellRenderer originalHeaderRenderer; + protected MouseAdapter myMouseAdapter = null; + protected MouseMotionAdapter myMouseMotionAdapter = null; + protected int rolloverCol = -1; + + public static ComponentUI createUI(JComponent h) { + return new BaseTableHeaderUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + if ((header != null) && header.getTable() != null) { + originalHeaderRenderer = header.getDefaultRenderer(); + if ((originalHeaderRenderer != null) + && "sun.swing.table.DefaultTableCellHeaderRenderer".equals(originalHeaderRenderer.getClass().getName())) { + header.setDefaultRenderer(new BaseDefaultHeaderRenderer()); + } + } + } + + public void uninstallUI(JComponent c) { + if ((header != null) && (header.getTable() != null)) { + if (header.getDefaultRenderer() instanceof BaseDefaultHeaderRenderer) { + header.setDefaultRenderer(originalHeaderRenderer); + } + } + super.uninstallUI(c); + } + + public void installListeners() { + super.installListeners(); + myMouseAdapter = new MouseAdapter() { + + public void mouseReleased(MouseEvent e) { + if ((header == null) || (header.getTable() == null)) { + return; + } + boolean rolloverEnabled = Boolean.TRUE.equals(header.getClientProperty("rolloverEnabled")); + boolean sortingAllowed = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + sortingAllowed = header.getTable().getRowSorter() != null; + } + if (rolloverEnabled || sortingAllowed || header.getReorderingAllowed()) { + if (header.getBounds().contains(e.getPoint())) { + int oldRolloverCol = rolloverCol; + rolloverCol = header.getTable().columnAtPoint(e.getPoint()); + updateRolloverColumn(oldRolloverCol, rolloverCol); + } else { + int oldRolloverCol = rolloverCol; + rolloverCol = -1; + updateRolloverColumn(oldRolloverCol, rolloverCol); + } + } + } + + public void mouseEntered(MouseEvent e) { + if ((header == null) || (header.getTable() == null)) { + return; + } + boolean rolloverEnabled = Boolean.TRUE.equals(header.getClientProperty("rolloverEnabled")); + boolean sortingAllowed = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + sortingAllowed = header.getTable().getRowSorter() != null; + } + if (rolloverEnabled || sortingAllowed || header.getReorderingAllowed()) { + int oldRolloverCol = rolloverCol; + rolloverCol = header.getTable().columnAtPoint(e.getPoint()); + updateRolloverColumn(oldRolloverCol, rolloverCol); + } + } + + public void mouseExited(MouseEvent e) { + if ((header == null) || (header.getTable() == null)) { + return; + } + boolean rolloverEnabled = Boolean.TRUE.equals(header.getClientProperty("rolloverEnabled")); + boolean sortingAllowed = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + sortingAllowed = header.getTable().getRowSorter() != null; + } + if (rolloverEnabled || sortingAllowed || header.getReorderingAllowed()) { + int oldRolloverCol = rolloverCol; + rolloverCol = -1; + updateRolloverColumn(oldRolloverCol, rolloverCol); + } + } + }; + myMouseMotionAdapter = new MouseMotionAdapter() { + + public void mouseMoved(MouseEvent e) { + if ((header == null) || (header.getTable() == null)) { + return; + } + boolean rolloverEnabled = Boolean.TRUE.equals(header.getClientProperty("rolloverEnabled")); + boolean sortingAllowed = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + sortingAllowed = header.getTable().getRowSorter() != null; + } + if (rolloverEnabled || sortingAllowed || header.getReorderingAllowed()) { + if (header.getDraggedColumn() == null) { + int oldRolloverCol = rolloverCol; + rolloverCol = header.getTable().columnAtPoint(e.getPoint()); + updateRolloverColumn(oldRolloverCol, rolloverCol); + } + } + } + + public void mouseDragged(MouseEvent e) { + if ((header == null) || (header.getTable() == null)) { + return; + } + boolean rolloverEnabled = Boolean.TRUE.equals(header.getClientProperty("rolloverEnabled")); + boolean sortingAllowed = false; + if (JTattooUtilities.getJavaVersion() >= 1.6) { + sortingAllowed = header.getTable().getRowSorter() != null; + } + if (rolloverEnabled || sortingAllowed || header.getReorderingAllowed()) { + if (header.getDraggedColumn() != null && header.getDraggedColumn().getIdentifier() != null) { + rolloverCol = header.getColumnModel().getColumnIndex(header.getDraggedColumn().getIdentifier()); + } else if (header.getResizingColumn() != null) { + rolloverCol = -1; + } + } + } + }; + header.addMouseListener(myMouseAdapter); + header.addMouseMotionListener(myMouseMotionAdapter); + } + + public void uninstallListeners() { + header.removeMouseListener(myMouseAdapter); + header.removeMouseMotionListener(myMouseMotionAdapter); + super.uninstallListeners(); + } + + protected boolean drawAlwaysActive() { + return false; + } + + protected boolean drawRolloverBar() { + return false; + } + + protected Component getHeaderRenderer(int col) { + if ((header == null) || (header.getTable() == null)) { + return null; + } + TableColumn tabCol = header.getColumnModel().getColumn(col); + TableCellRenderer renderer = tabCol.getHeaderRenderer(); + if (renderer == null) { + renderer = header.getDefaultRenderer(); + } + return renderer.getTableCellRendererComponent(header.getTable(), tabCol.getHeaderValue(), false, false, -1, col); + } + + private int getHeaderHeight() { + if ((header == null) || (header.getTable() == null)) { + return 0; + } + int height = 0; + boolean accomodatedDefault = false; + TableColumnModel columnModel = header.getColumnModel(); + for (int column = 0; column < columnModel.getColumnCount(); column++) { + TableColumn aColumn = columnModel.getColumn(column); + boolean isDefault = (aColumn.getHeaderRenderer() == null); + + if (!isDefault || !accomodatedDefault) { + Component comp = getHeaderRenderer(column); + int rendererHeight = comp.getPreferredSize().height; + height = Math.max(height, rendererHeight); + + // Configuring the header renderer to calculate its preferred size + // is expensive. Optimise this by assuming the default renderer + // always has the same height as the first non-zero height that + // it returns for a non-null/non-empty value. + if (isDefault && rendererHeight > 0) { + Object headerValue = aColumn.getHeaderValue(); + if (headerValue != null) { + headerValue = headerValue.toString(); + + if (headerValue != null && !headerValue.equals("")) { + accomodatedDefault = true; + } + } + } + } + } + return height + 2; + } + + /** + * Return the preferred size of the header. The preferred height is the maximum of the preferred heights of all of + * the components provided by the header renderers. The preferred width is the sum of the preferred widths of each + * column (plus inter-cell spacing). + * + * @return the preferredSize + */ + public Dimension getPreferredSize(JComponent c) { + if ((header == null) || (header.getTable() == null)) { + return new Dimension(0, 0); + } + long width = 0; + Enumeration enumeration = header.getColumnModel().getColumns(); + while (enumeration.hasMoreElements()) { + TableColumn aColumn = (TableColumn) enumeration.nextElement(); + width = width + aColumn.getPreferredWidth(); + } + if (width > Integer.MAX_VALUE) { + width = Integer.MAX_VALUE; + } + return new Dimension((int) width, getHeaderHeight()); + } + + protected void updateRolloverColumn(int oldColumn, int newColumn) { + if ((header == null) || (header.getTable() == null)) { + return; + } + header.repaint(header.getHeaderRect(oldColumn)); + header.repaint(header.getHeaderRect(newColumn)); + } + + protected void rolloverColumnUpdated(int oldColumn, int newColumn) { + // Empty to avoid multiple paints + } + + public void paint(Graphics g, JComponent c) { + if ((header == null) || (header.getTable() == null) || header.getColumnModel().getColumnCount() <= 0) { + return; + } + + boolean ltr = header.getComponentOrientation().isLeftToRight(); + Rectangle clip = g.getClipBounds(); + Point left = clip.getLocation(); + Point right = new Point(clip.x + clip.width - 1, clip.y); + TableColumnModel cm = header.getColumnModel(); + int cMin = header.columnAtPoint(ltr ? left : right); + int cMax = header.columnAtPoint(ltr ? right : left); + // This should never happen. + if (cMin == -1) { + cMin = 0; + } + // If the table does not have enough columns to fill the view we'll get -1. + // Replace this with the index of the last column. + if (cMax == -1) { + cMax = cm.getColumnCount() - 1; + } + + TableColumn draggedColumn = header.getDraggedColumn(); + Rectangle cellRect = header.getHeaderRect(ltr ? cMin : cMax); + int columnWidth; + TableColumn aColumn; + if (ltr) { + for (int column = cMin; column <= cMax; column++) { + aColumn = cm.getColumn(column); + columnWidth = aColumn.getWidth(); + cellRect.width = columnWidth; + if (aColumn != draggedColumn) { + paintCell(g, cellRect, column); + } + cellRect.x += columnWidth; + } + } else { + for (int column = cMax; column >= cMin; column--) { + aColumn = cm.getColumn(column); + columnWidth = aColumn.getWidth(); + cellRect.width = columnWidth; + if (aColumn != draggedColumn) { + paintCell(g, cellRect, column); + } + cellRect.x += columnWidth; + } + } + + // Paint the dragged column if we are dragging. + if (draggedColumn != null) { + int draggedColumnIndex = viewIndexForColumn(draggedColumn); + Rectangle draggedCellRect = header.getHeaderRect(draggedColumnIndex); + // Draw a gray well in place of the moving column. + g.setColor(header.getParent().getBackground()); + g.fillRect(draggedCellRect.x, draggedCellRect.y, draggedCellRect.width, draggedCellRect.height); + draggedCellRect.x += header.getDraggedDistance(); + + // Fill the background. + g.setColor(header.getBackground()); + g.fillRect(draggedCellRect.x, draggedCellRect.y, draggedCellRect.width, draggedCellRect.height); + paintCell(g, draggedCellRect, draggedColumnIndex); + } + + // Remove all components in the rendererPane. + rendererPane.removeAll(); + } + + protected void paintBackground(Graphics g, Rectangle cellRect, int col) { + Component component = getHeaderRenderer(col); + int x = cellRect.x; + int y = cellRect.y; + int w = cellRect.width; + int h = cellRect.height; + if (header.getBackground() instanceof ColorUIResource) { + if ((col == rolloverCol) && (component != null) && component.isEnabled()) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getRolloverColors(), x, y, w, h); + } else if (drawAlwaysActive() || JTattooUtilities.isFrameActive(header)) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getColHeaderColors(), x, y, w, h); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getInActiveColors(), x, y, w, h); + } + } else { + g.setColor(header.getBackground()); + g.fillRect(x, y, w, h); + } + } + + protected void paintCell(Graphics g, Rectangle cellRect, int col) { + if ((header == null) || (header.getTable() == null)) { + return; + } + Component component = getHeaderRenderer(col); + if (!(component instanceof BaseDefaultHeaderRenderer)) { + paintBackground(g, cellRect, col); + } + rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true); + } + + private int viewIndexForColumn(TableColumn aColumn) { + if ((header == null) || (header.getTable() == null)) { + return -1; + } + TableColumnModel cm = header.getColumnModel(); + for (int column = 0; column < cm.getColumnCount(); column++) { + if (cm.getColumn(column) == aColumn) { + return column; + } + } + return -1; + } + +//---------------------------------------------------------------------------------------------------------------------- +// inner classes +//---------------------------------------------------------------------------------------------------------------------- + private class BaseDefaultHeaderRenderer extends DefaultTableCellRenderer { + + public BaseDefaultHeaderRenderer() { + super(); + } + + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + return new MyRenderComponent(table, value, isSelected, hasFocus, row, column); + } + } + + private class MyRenderComponent extends JLabel { + + private JTable table = null; + private int col = 0; + + public MyRenderComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { + super(); + this.table = table; + this.col = col; + if (value != null) { + setText(value.toString()); + } else { + setText(""); + } + setOpaque(false); + if (table.getClientProperty("TableHeader.font") != null) { + setFont((Font)table.getClientProperty("TableHeader.font")); + } else { + setFont(UIManager.getFont("TableHeader.font")); + } + if (col == rolloverCol) { + setForeground(AbstractLookAndFeel.getTheme().getRolloverForegroundColor()); + } else { + setForeground(UIManager.getColor("TableHeader.foreground")); + } + setHorizontalAlignment(JLabel.CENTER); + setHorizontalTextPosition(SwingConstants.LEADING); + setBorder(UIManager.getBorder("TableHeader.cellBorder")); + if ((JTattooUtilities.getJavaVersion() >= 1.6) && (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel)) { + RowSorter rowSorter = table.getRowSorter(); + List keyList = rowSorter == null ? null : rowSorter.getSortKeys(); + if ((keyList != null) && (keyList.size() > 0)) { + RowSorter.SortKey sortKey = (RowSorter.SortKey) keyList.get(0); + if (sortKey.getColumn() == table.convertColumnIndexToModel(col)) { + AbstractIconFactory iconFactory = ((AbstractLookAndFeel) UIManager.getLookAndFeel()).getIconFactory(); + if (sortKey.getSortOrder().equals(SortOrder.ASCENDING)) { + setIcon(iconFactory.getUpArrowIcon()); + } else if (sortKey.getSortOrder().equals(SortOrder.DESCENDING)) { + setIcon(iconFactory.getDownArrowIcon()); + } + } + } + } + } + + protected void paintBackground(Graphics g) { + // BugFix: 12.12.2013 + // Currently I don't know why header is sometimes null, but if it's null it's better to ignore + // the background instead of throwing a NPE. + if (header == null) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getColHeaderColors(), 0, 0, getWidth(), getHeight()); + return; + } + int draggedColumn = -1; + if (header.getTable() != null && header.getDraggedColumn() != null) { + draggedColumn = header.getColumnModel().getColumnIndex(header.getDraggedColumn().getIdentifier()); + } + int w = getWidth(); + int h = getHeight(); + if ((table != null) && table.isEnabled() && (col == rolloverCol || col == draggedColumn)) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getRolloverColors(), 0, 0, w, h); + if (drawRolloverBar()) { + g.setColor(AbstractLookAndFeel.getFocusColor()); + g.drawLine(0, 0, w - 1, 0); + g.drawLine(0, 1, w - 1, 1); + g.drawLine(0, 2, w - 1, 2); + } + } else if (drawAlwaysActive() || JTattooUtilities.isFrameActive(header)) { + if (header.getBackground() instanceof ColorUIResource) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getColHeaderColors(), 0, 0, w, h); + } else { + g.setColor(header.getBackground()); + g.fillRect(0, 0, w, h); + } + } else { + if (header.getBackground() instanceof ColorUIResource) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getInActiveColors(), 0, 0, w, h); + } else { + g.setColor(header.getBackground()); + g.fillRect(0, 0, w, h); + } + } + } + + public void paint(Graphics g) { + paintBackground(g); + super.paint(g); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseTableUI.java b/src/com/jtattoo/plaf/BaseTableUI.java new file mode 100644 index 0000000..72d728f --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTableUI.java @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.FontMetrics; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicTableUI; + +/** + * @author Michael Hagen + */ +public class BaseTableUI extends BasicTableUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseTableUI(); + } + + public void installDefaults() { + super.installDefaults(); + // Setup the rowheight. The font may change if UI switches + FontMetrics fm = JTattooUtilities.getFontMetrics(table, null, table.getFont()); + table.setRowHeight(fm.getHeight() + (fm.getHeight() / 4)); + } + +} diff --git a/src/com/jtattoo/plaf/BaseTextAreaUI.java b/src/com/jtattoo/plaf/BaseTextAreaUI.java new file mode 100644 index 0000000..4190116 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTextAreaUI.java @@ -0,0 +1,150 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.beans.PropertyChangeEvent; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicTextAreaUI; +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; + +/** + * @author Michael Hagen + */ +public class BaseTextAreaUI extends BasicTextAreaUI { + + private Border orgBorder = null; + private FocusListener focusListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseTextAreaUI(); + } + + public void installDefaults() { + super.installDefaults(); + updateBackground(); + } + + @SuppressWarnings("deprecation") + protected void installKeyboardActions() { + super.installKeyboardActions(); + if (JTattooUtilities.isMac()) { + InputMap im = (InputMap) UIManager.get("TextField.focusInputMap"); + int commandKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, commandKey), DefaultEditorKit.copyAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, commandKey), DefaultEditorKit.pasteAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, commandKey), DefaultEditorKit.cutAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.nextWordAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.previousWordAction); + } + } + + protected void installListeners() { + super.installListeners(); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + if (getComponent() != null) { + orgBorder = getComponent().getBorder(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel && orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder(); + getComponent().setBorder(focusBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + + public void focusLost(FocusEvent e) { + if (getComponent() != null) { + if (orgBorder instanceof UIResource) { + getComponent().setBorder(orgBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + }; + getComponent().addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + getComponent().removeFocusListener(focusListener); + focusListener = null; + super.uninstallListeners(); + } + + protected void paintBackground(Graphics g) { + g.setColor(getComponent().getBackground()); + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + if (getComponent().hasFocus() && getComponent().isEditable()) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusBackgroundColor()); + } + } + g.fillRect(0, 0, getComponent().getWidth(), getComponent().getHeight()); + } + + protected void paintSafely(Graphics g) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + super.paintSafely(g); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + + protected void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals("editable") || + evt.getPropertyName().equals("enabled")) { + updateBackground(); + } + super.propertyChange(evt); + } + + private void updateBackground() { + JTextComponent c = getComponent(); + if (c.getBackground() instanceof UIResource) { + if (!c.isEnabled() || !c.isEditable()) { + c.setBackground(AbstractLookAndFeel.getDisabledBackgroundColor()); + } else { + c.setBackground(AbstractLookAndFeel.getInputBackgroundColor()); + } + } + } +} diff --git a/src/com/jtattoo/plaf/BaseTextFieldUI.java b/src/com/jtattoo/plaf/BaseTextFieldUI.java new file mode 100644 index 0000000..f12a549 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTextFieldUI.java @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.metal.MetalTextFieldUI; +import javax.swing.text.DefaultEditorKit; + +/** + * @author Michael Hagen + */ +public class BaseTextFieldUI extends MetalTextFieldUI { + + private Border orgBorder = null; + private FocusListener focusListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseTextFieldUI(); + } + + @SuppressWarnings("deprecation") + protected void installKeyboardActions() { + super.installKeyboardActions(); + if (JTattooUtilities.isMac()) { + InputMap im = (InputMap) UIManager.get("TextField.focusInputMap"); + int commandKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, commandKey), DefaultEditorKit.copyAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, commandKey), DefaultEditorKit.pasteAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, commandKey), DefaultEditorKit.cutAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.nextWordAction); + im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK), DefaultEditorKit.previousWordAction); + } + } + + protected void installListeners() { + super.installListeners(); + + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + focusListener = new FocusListener() { + public void focusGained(FocusEvent e) { + if (getComponent() != null) { + orgBorder = getComponent().getBorder(); + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof AbstractLookAndFeel && orgBorder instanceof UIResource) { + Border focusBorder = ((AbstractLookAndFeel) laf).getBorderFactory().getFocusFrameBorder(); + getComponent().setBorder(focusBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + + public void focusLost(FocusEvent e) { + if (getComponent() != null) { + if (orgBorder instanceof UIResource) { + getComponent().setBorder(orgBorder); + } + getComponent().invalidate(); + getComponent().repaint(); + } + } + }; + + getComponent().addFocusListener(focusListener); + } + } + + protected void uninstallListeners() { + getComponent().removeFocusListener(focusListener); + focusListener = null; + super.uninstallListeners(); + } + + protected void paintBackground(Graphics g) { + g.setColor(getComponent().getBackground()); + if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) { + Boolean doShow = (Boolean) getComponent().getClientProperty("doShowFocusFrame"); + if (doShow == null || doShow.booleanValue()) { + if (getComponent().hasFocus() && getComponent().isEditable()) { + g.setColor(AbstractLookAndFeel.getTheme().getFocusBackgroundColor()); + } + } + } + g.fillRect(0, 0, getComponent().getWidth(), getComponent().getHeight()); + } + + protected void paintSafely(Graphics g) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + super.paintSafely(g); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseTitleButton.java b/src/com/jtattoo/plaf/BaseTitleButton.java new file mode 100644 index 0000000..cbb9e17 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTitleButton.java @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.Action; +import javax.swing.Icon; + +/** + * @author Michael Hagen + */ +public class BaseTitleButton extends NoFocusButton { + + private float alpha = 1.0f; + + public BaseTitleButton(Action action, String accessibleName, Icon icon, float alpha) { + setContentAreaFilled(false); + setBorderPainted(false); + setAction(action); + setText(null); + setIcon(icon); + putClientProperty("paintActive", Boolean.TRUE); + getAccessibleContext().setAccessibleName(accessibleName); + this.alpha = Math.max(0.2f, alpha); + } + + public void paint(Graphics g) { + if (JTattooUtilities.isActive(this) || (alpha >= 1.0)) { + super.paint(g); + } else { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); + g2D.setComposite(alphaComposite); + super.paint(g); + g2D.setComposite(savedComposite); + } + } + +} diff --git a/src/com/jtattoo/plaf/BaseTitlePane.java b/src/com/jtattoo/plaf/BaseTitlePane.java new file mode 100644 index 0000000..8202fd4 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTitlePane.java @@ -0,0 +1,994 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.*; +import javax.swing.plaf.UIResource; + +/** + * This class is a modified copy of the javax.swing.plaf.metal.MetalTitlePaneUI + * + * Class that manages a JLF awt.Window-descendant class's title bar. + *

+ * This class assumes it will be created with a particular window + * decoration style, and that if the style changes, a new one will + * be created. + * + * @version 1.12 01/23/03 + * @author Terry Kellerman + * @author Michael Hagen + * + * @since 1.4 + */ +public class BaseTitlePane extends JComponent implements TitlePane { + + public static final String PAINT_ACTIVE = "paintActive"; + public static final String ICONIFY = "Iconify"; + public static final String MAXIMIZE = "Maximize"; + public static final String CLOSE = "Close"; + protected PropertyChangeListener propertyChangeListener; + protected Action closeAction; + protected Action iconifyAction; + protected Action restoreAction; + protected Action maximizeAction; + protected JMenuBar menuBar; + protected JPanel customTitlePanel; + protected JButton iconifyButton; + protected JButton maxButton; + protected JButton closeButton; + protected Icon iconifyIcon; + protected Icon maximizeIcon; + protected Icon minimizeIcon; + protected Icon closeIcon; + protected WindowListener windowListener; + protected Window window; + protected JRootPane rootPane; + protected BaseRootPaneUI rootPaneUI; + protected int buttonsWidth; + protected int state; + // This flag is used to avoid a bug with OSX and java 1.7. The call to setExtendedState + // with both flags ICONIFY and MAXIMIZED_BOTH throws an illegal state exception, so we + // have to switch off the MAXIMIZED_BOTH flag in the iconify() method. If frame is deiconified + // we use the wasMaximized flag to restore the maximized state. + protected boolean wasMaximized; + // This flag indicates a maximize error. This occurs on multiscreen environments where the first + // screen does not have the same resolution as the second screen. In this case we only simulate the + // maximize/restore behaviour. It's not a perfect simulation (frame border will stay visible, + // and we have to restore the bounds if look and feel changes in maximized state) + protected boolean wasMaximizeError = false; + + protected BufferedImage backgroundImage = null; + protected float alphaValue = 0.85f; + + public BaseTitlePane(JRootPane root, BaseRootPaneUI ui) { + rootPane = root; + rootPaneUI = ui; + state = -1; + wasMaximized = false; + iconifyIcon = UIManager.getIcon("InternalFrame.iconifyIcon"); + maximizeIcon = UIManager.getIcon("InternalFrame.maximizeIcon"); + minimizeIcon = UIManager.getIcon("InternalFrame.minimizeIcon"); + closeIcon = UIManager.getIcon("InternalFrame.closeIcon"); + + installSubcomponents(); + installDefaults(); + setLayout(createLayout()); + } + + protected void installListeners() { + if (window != null) { + windowListener = createWindowListener(); + window.addWindowListener(windowListener); + propertyChangeListener = createWindowPropertyChangeListener(); + window.addPropertyChangeListener(propertyChangeListener); + } + } + + protected void uninstallListeners() { + if (window != null) { + window.removeWindowListener(windowListener); + window.removePropertyChangeListener(propertyChangeListener); + } + } + + protected WindowListener createWindowListener() { + return new WindowHandler(); + } + + protected PropertyChangeListener createWindowPropertyChangeListener() { + return new PropertyChangeHandler(); + } + + public JRootPane getRootPane() { + return rootPane; + } + + protected Frame getFrame() { + if (window instanceof Frame) { + return (Frame) window; + } + return null; + } + + protected Window getWindow() { + return window; + } + + protected int getWindowDecorationStyle() { + return DecorationHelper.getWindowDecorationStyle(rootPane); + } + + protected boolean isMacStyleWindowDecoration() { + return AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn(); + } + + protected Image getFrameIconImage() { + // try to find icon for dialog windows + if (getFrame() == null && JTattooUtilities.getJavaVersion() >= 1.6) { + java.util.List icons = getWindow().getIconImages(); + // No icon found ? search in window chain for an icon + if (icons == null || icons.isEmpty()) { + Window owner = getWindow().getOwner(); + while (owner != null) { + icons = owner.getIconImages(); + // found ? return the icon + if (icons != null && !icons.isEmpty()) { + return (Image)(icons.get(0)); + } + owner = owner.getOwner(); + } + } else { + return (Image)(icons.get(0)); + } + // No icon found ? return icon of the first frame + if (icons == null || icons.isEmpty()) { + if (Frame.getFrames() != null && Frame.getFrames().length > 0) { + return Frame.getFrames()[0].getIconImage(); + } + } + return null; + } else { + if (getFrame() != null) { + return getFrame().getIconImage(); + } + } + return null; + } + + public void addNotify() { + super.addNotify(); + uninstallListeners(); + window = SwingUtilities.getWindowAncestor(this); + if (window != null) { + if (window instanceof Frame) { + setState(DecorationHelper.getExtendedState((Frame) window)); + } else { + setState(0); + } + setActive(JTattooUtilities.isWindowActive(window)); + installListeners(); + } + } + + public void removeNotify() { + super.removeNotify(); + uninstallListeners(); + window = null; + } + + protected void installSubcomponents() { + createActions(); + createButtons(); + if (getWindowDecorationStyle() == BaseRootPaneUI.FRAME) { + if (!isMacStyleWindowDecoration()) { + createMenuBar(); + add(menuBar); + } + add(iconifyButton); + add(maxButton); + } + add(closeButton); + } + + protected void installDefaults() { + setFont(UIManager.getFont("InternalFrame.titleFont")); + if (rootPane.getClientProperty("customTitlePanel") instanceof JPanel) { + setCustomizedTitlePanel((JPanel)rootPane.getClientProperty("customTitlePanel")); + } + } + + protected void uninstallDefaults() { + } + + protected void createMenuBar() { + menuBar = new SystemMenuBar(); + if (getWindowDecorationStyle() == BaseRootPaneUI.FRAME) { + JMenu menu = new JMenu(" "); + + JMenuItem mi = menu.add(restoreAction); + int mnemonic = getInt("MetalTitlePane.restoreMnemonic", -1); + if (mnemonic != -1) { + mi.setMnemonic(mnemonic); + } + mi = menu.add(iconifyAction); + mnemonic = getInt("MetalTitlePane.iconifyMnemonic", -1); + if (mnemonic != -1) { + mi.setMnemonic(mnemonic); + } + + if (DecorationHelper.isFrameStateSupported(Toolkit.getDefaultToolkit(), BaseRootPaneUI.MAXIMIZED_BOTH)) { + mi = menu.add(maximizeAction); + mnemonic = getInt("MetalTitlePane.maximizeMnemonic", -1); + if (mnemonic != -1) { + mi.setMnemonic(mnemonic); + } + } + menu.addSeparator(); + mi = menu.add(closeAction); + mnemonic = getInt("MetalTitlePane.closeMnemonic", -1); + if (mnemonic != -1) { + mi.setMnemonic(mnemonic); + } + + menuBar.add(menu); + } + } + + public void setCustomizedTitlePanel(JPanel panel) { + if (customTitlePanel != null) { + remove(customTitlePanel); + customTitlePanel = null; + } + if (panel != null) { + customTitlePanel = panel; + add(customTitlePanel); + } + rootPane.putClientProperty("customTitlePanel", customTitlePanel); + revalidate(); + repaint(); + } + + public void createButtons() { + iconifyButton = new BaseTitleButton(iconifyAction, ICONIFY, iconifyIcon, 1.0f); + maxButton = new BaseTitleButton(restoreAction, MAXIMIZE, maximizeIcon, 1.0f); + closeButton = new BaseTitleButton(closeAction, CLOSE, closeIcon, 1.0f); + } + + public LayoutManager createLayout() { + return new TitlePaneLayout(); + } + + public void iconify() { + Frame frame = getFrame(); + if (frame != null) { + if (JTattooUtilities.isMac() && JTattooUtilities.getJavaVersion() >= 1.7) { + // Workarround to avoid a bug within OSX and Java 1.7 + DecorationHelper.setExtendedState(frame, state & ~BaseRootPaneUI.MAXIMIZED_BOTH | Frame.ICONIFIED); + } else { + DecorationHelper.setExtendedState(frame, state | Frame.ICONIFIED); + } + } + } + + public void maximize() { + Frame frame = getFrame(); + if (frame != null) { + validateMaximizedBounds(); + PropertyChangeListener[] pcl = frame.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(this, "windowMaximize", Boolean.FALSE, Boolean.FALSE)); + } + DecorationHelper.setExtendedState(frame, state | BaseRootPaneUI.MAXIMIZED_BOTH); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(this, "windowMaximized", Boolean.FALSE, Boolean.FALSE)); + } + + } + } + + public void restore() { + Frame frame = getFrame(); + if (frame != null) { + wasMaximizeError = false; + PropertyChangeListener[] pcl = frame.getPropertyChangeListeners(); + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(this, "windowRestore", Boolean.FALSE, Boolean.FALSE)); + } + if ((state & Frame.ICONIFIED) != 0) { + DecorationHelper.setExtendedState(frame, state & ~Frame.ICONIFIED); + } else { + DecorationHelper.setExtendedState(frame, state & ~BaseRootPaneUI.MAXIMIZED_BOTH); + } + for (int i = 0; i < pcl.length; i++) { + pcl[i].propertyChange(new PropertyChangeEvent(this, "windowRestored", Boolean.FALSE, Boolean.FALSE)); + } + } + } + + public void close() { + if (window != null) { + window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); + } + } + + protected void validateMaximizedBounds() { + Frame frame = getFrame(); + if (frame != null && !wasMaximizeError) { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + Rectangle maxBounds = gc.getBounds(); + maxBounds.x = Math.max(0, screenInsets.left); + maxBounds.y = Math.max(0, screenInsets.top); + maxBounds.width -= (screenInsets.left + screenInsets.right); + maxBounds.height -= (screenInsets.top + screenInsets.bottom); + frame.setMaximizedBounds(maxBounds); + } + } + + protected void createActions() { + closeAction = new CloseAction(); + iconifyAction = new IconifyAction(); + restoreAction = new RestoreAction(); + maximizeAction = new MaximizeAction(); + } + + static int getInt(Object key, int defaultValue) { + Object value = UIManager.get(key); + if (value instanceof Integer) { + return ((Integer) value).intValue(); + } + if (value instanceof String) { + try { + return Integer.parseInt((String) value); + } catch (NumberFormatException nfe) { + } + } + return defaultValue; + } + + protected void setActive(boolean flag) { + if (getWindowDecorationStyle() == BaseRootPaneUI.FRAME) { + Boolean active = flag ? Boolean.TRUE : Boolean.FALSE; + iconifyButton.putClientProperty(PAINT_ACTIVE, active); + closeButton.putClientProperty(PAINT_ACTIVE, active); + maxButton.putClientProperty(PAINT_ACTIVE, active); + } + getRootPane().repaint(); + } + + protected boolean isActive() { + return (window == null) ? true : JTattooUtilities.isWindowActive(window); + } + + protected boolean isLeftToRight() { + return (window == null) ? getRootPane().getComponentOrientation().isLeftToRight() : window.getComponentOrientation().isLeftToRight(); + } + + public void setBackgroundImage(BufferedImage bgImage) { + backgroundImage = bgImage; + } + + public void setAlphaTransparency(float alpha) { + alphaValue = alpha; + } + + protected void setState(int state) { + setState(state, false); + } + + protected void setState(int state, boolean updateRegardless) { + if (window != null && getWindowDecorationStyle() == BaseRootPaneUI.FRAME) { + if (this.state == state && !updateRegardless) { + return; + } + + final Frame frame = getFrame(); + if (frame != null) { + + if (((state & BaseRootPaneUI.MAXIMIZED_BOTH) != 0) && (rootPane.getBorder() == null || (rootPane.getBorder() instanceof UIResource)) && frame.isShowing()) { + rootPane.setBorder(null); + } else if ((state & BaseRootPaneUI.MAXIMIZED_BOTH) == 0) { + rootPaneUI.installBorder(rootPane); + } + + if (frame.isResizable()) { + if ((state & BaseRootPaneUI.MAXIMIZED_BOTH) != 0) { + updateMaxButton(restoreAction, minimizeIcon); + maximizeAction.setEnabled(false); + restoreAction.setEnabled(true); + } else { + updateMaxButton(maximizeAction, maximizeIcon); + maximizeAction.setEnabled(true); + restoreAction.setEnabled(false); + } + if (maxButton.getParent() == null || iconifyButton.getParent() == null) { + add(maxButton); + add(iconifyButton); + revalidate(); + repaint(); + } + maxButton.setText(null); + } else { + maximizeAction.setEnabled(false); + restoreAction.setEnabled(false); + if (maxButton.getParent() != null) { + remove(maxButton); + revalidate(); + repaint(); + } + } + // BUGFIX + // When programatically maximize a frame via setExtendedState in a multiscreen environment the width + // and height may not be set correctly. We fix this issue here. + if ((state & BaseRootPaneUI.MAXIMIZED_BOTH) != 0) { + validateMaximizedBounds(); + rootPane.setBorder(null); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + Rectangle maxBounds = gc.getBounds(); + maxBounds.width -= (screenInsets.left + screenInsets.right); + maxBounds.height -= (screenInsets.top + screenInsets.bottom); + if ((frame.getWidth() != maxBounds.width) || (frame.getHeight() != maxBounds.height)) { + restore(); + wasMaximizeError = true; + frame.setMaximizedBounds(null); + maximize(); + } + } + }); + } + } else { + // Not contained in a Frame + maximizeAction.setEnabled(false); + restoreAction.setEnabled(false); + iconifyAction.setEnabled(false); + remove(maxButton); + remove(iconifyButton); + revalidate(); + repaint(); + } + closeAction.setEnabled(true); + this.state = state; + } + } + + protected void updateMaxButton(Action action, Icon icon) { + maxButton.setAction(action); + maxButton.setIcon(icon); + } + + protected int getHorSpacing() { + return 3; + } + + protected int getVerSpacing() { + return 3; + } + + protected boolean centerButtons() { + return true; + } + + protected String getTitle() { + if (window instanceof Frame) { + return ((Frame) window).getTitle(); + } else if (window instanceof Dialog) { + return ((Dialog) window).getTitle(); + } + return null; + } + + public void paintBackground(Graphics g) { + if (isActive()) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + if (backgroundImage != null) { + g.drawImage(backgroundImage, 0, 0, null); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alphaValue); + g2D.setComposite(alpha); + } + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowTitleColors(), 0, 0, getWidth(), getHeight()); + g2D.setComposite(savedComposite); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors(), 0, 0, getWidth(), getHeight()); + } + } + + protected int getIconWidth() { + Image image = getFrameIconImage(); + if (image != null) { + int h = getHeight(); + int ih = image.getHeight(null); + int iw = image.getWidth(null); + if (ih > h) { + double fac = (double) iw / (double) ih; + ih = h; + iw = (int) (fac * (double) ih); + } + return iw; + } + return 0; + } + + protected int paintIcon(Graphics g, int x) { + Image image = getFrameIconImage(); + if (image != null) { + Graphics2D g2D = (Graphics2D)g; + Object savedHint = g2D.getRenderingHint(RenderingHints.KEY_INTERPOLATION); + if (JTattooUtilities.getJavaVersion() >= 1.6) { + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + } + int h = getHeight() - 2; + int ih = image.getHeight(null); + int iw = image.getWidth(null); + if (ih <= h) { + g2D.drawImage(image, x, (h - ih) / 2, iw, ih, null); + } else { + double fac = (double)iw / (double)ih; + ih = h; + iw = (int)(fac * (double)ih); + g2D.drawImage(image, x, 0, iw, ih, null); + } + if (savedHint != null) { + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, savedHint); + } + return iw; + } + return 0; + } + + public void paintText(Graphics g, int x, int y, String title) { + if (isActive()) { + g.setColor(AbstractLookAndFeel.getWindowTitleForegroundColor()); + } else { + g.setColor(AbstractLookAndFeel.getWindowInactiveTitleForegroundColor()); + } + JTattooUtilities.drawString(rootPane, g, title, x, y); + } + + public void paintComponent(Graphics g) { + if (getFrame() != null) { + setState(DecorationHelper.getExtendedState(getFrame())); + } + + paintBackground(g); + + g.setFont(getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(this, g, getFont()); + int width = getWidth(); + int height = getHeight(); + int x = 0; + int y = ((height - fm.getHeight()) / 2) + fm.getAscent(); + int titleWidth = width - buttonsWidth - 4; + String frameTitle = getTitle(); + if (isLeftToRight()) { + if (isMacStyleWindowDecoration()) { + int iconWidth = getIconWidth(); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + x += buttonsWidth + ((titleWidth - titleLength) / 2); + paintIcon(g, x); + x += iconWidth + 4; + } else { + if (getWindow() instanceof JDialog) { + int iconWidth = paintIcon(g, x); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + int titleLength = fm.stringWidth(frameTitle); + x += iconWidth + 4; + x += (titleWidth - titleLength) / 2; + } else { + x += iconWidth + 4; + } + } else { + int menuBarWidth = menuBar == null ? 0 : menuBar.getWidth(); + titleWidth -= menuBarWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + int titleLength = fm.stringWidth(frameTitle); + x += menuBarWidth + 4; + x += (titleWidth - titleLength) / 2; + } else { + x += menuBarWidth + 4; + } + } + } + } else { + int iconWidth = getIconWidth(); + if (isMacStyleWindowDecoration()) { + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + x = buttonsWidth + 4 + ((titleWidth - titleLength) / 2); + paintIcon(g, x + titleLength + 4); + } else { + if (getWindow() instanceof JDialog) { + x = width - iconWidth; + paintIcon(g, x); + titleWidth -= iconWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + x = buttonsWidth + 4 + ((titleWidth - titleLength) / 2); + } else { + x = width - iconWidth - 4 - titleLength; + } + } else { + int menuBarWidth = menuBar == null ? 0 : menuBar.getWidth(); + titleWidth -= menuBarWidth + 4; + frameTitle = JTattooUtilities.getClippedText(frameTitle, fm, titleWidth); + int titleLength = fm.stringWidth(frameTitle); + if (AbstractLookAndFeel.getTheme().isCenterWindowTitleOn()) { + x = buttonsWidth + 4 + ((titleWidth - titleLength) / 2); + } else { + x = width - menuBarWidth - 4 - titleLength; + } + } + } + } + paintText(g, x, y, frameTitle); + } + + protected class CloseAction extends AbstractAction { + + public CloseAction() { + super(UIManager.getString("MetalTitlePane.closeTitle")); + } + + public void actionPerformed(ActionEvent e) { + close(); + } + } + + protected class IconifyAction extends AbstractAction { + + public IconifyAction() { + super(UIManager.getString("MetalTitlePane.iconifyTitle")); + } + + public void actionPerformed(ActionEvent e) { + iconify(); + } + } + + protected class RestoreAction extends AbstractAction { + + public RestoreAction() { + super(UIManager.getString("MetalTitlePane.restoreTitle")); + } + + public void actionPerformed(ActionEvent e) { + restore(); + } + } + + protected class MaximizeAction extends AbstractAction { + + public MaximizeAction() { + super(UIManager.getString("MetalTitlePane.maximizeTitle")); + } + + public void actionPerformed(ActionEvent e) { + maximize(); + } + } + +//----------------------------------------------------------------------------------------------- + protected class SystemMenuBar extends JMenuBar { + + public SystemMenuBar() { + setOpaque(false); + } + + public void paint(Graphics g) { + Image image = getFrameIconImage(); + if (image != null) { + Graphics2D g2D = (Graphics2D)g; + Object savedHint = g2D.getRenderingHint(RenderingHints.KEY_INTERPOLATION); + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + int x = 0; + int y = 0; + int iw = image.getWidth(null); + int ih = image.getHeight(null); + if (ih > getHeight()) { + double scale = (double)(getHeight() - 2) / (double)ih; + iw = (int)(scale * iw); + ih = (int)(scale * ih); + } else { + y = (getHeight() - ih) / 2; + } + g2D.drawImage(image, x, y, iw, ih, null); + if (savedHint != null) { + g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, savedHint); + } + } else { + Icon icon = UIManager.getIcon("InternalFrame.icon"); + if (icon != null) { + icon.paintIcon(this, g, 2, 2); + } + } + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + protected int computeHeight() { + FontMetrics fm = JTattooUtilities.getFontMetrics(this, null, getFont()); + return fm.getHeight() + 6; + } + + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + Image image = getFrameIconImage(); + if (image != null) { + int iw = image.getWidth(null); + int ih = image.getHeight(null); + int th = computeHeight(); + if (ih > th) { + double scale = (double)th / (double)ih; + iw = (int)(scale * iw); + ih = (int)(scale * ih); + } + return new Dimension(Math.max(iw, size.width), Math.max(ih, size.height)); + } else { + return size; + } + } + } + +//----------------------------------------------------------------------------------------------- + protected class TitlePaneLayout implements LayoutManager { + + public void addLayoutComponent(String name, Component c) { + } + + public void removeLayoutComponent(Component c) { + } + + public Dimension preferredLayoutSize(Container c) { + int height = computeHeight(); + return new Dimension(height, height); + } + + public Dimension minimumLayoutSize(Container c) { + return preferredLayoutSize(c); + } + + protected int computeHeight() { + FontMetrics fm = JTattooUtilities.getFontMetrics(BaseTitlePane.this, null, getFont()); + return fm.getHeight() + 6; + } + + public void layoutContainer(Container c) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + layoutMacStyle(c); + } else { + layoutDefault(c); + } + } + + public void layoutDefault(Container c) { + boolean leftToRight = isLeftToRight(); + + int spacing = getHorSpacing(); + int w = getWidth(); + int h = getHeight(); + + // assumes all buttons have the same dimensions these dimensions include the borders + int btnHeight = h - getVerSpacing(); + int btnWidth = btnHeight; + + + if (menuBar != null) { + int mw = menuBar.getPreferredSize().width; + int mh = menuBar.getPreferredSize().height; + if (leftToRight) { + menuBar.setBounds(2, (h - mh) / 2, mw, mh); + } else { + menuBar.setBounds(getWidth() - mw, (h - mh) / 2, mw, mh); + } + } + + int x = leftToRight ? w - spacing : 0; + int y = Math.max(0, ((h - btnHeight) / 2) - 1); + + if (closeButton != null) { + x += leftToRight ? -btnWidth : spacing; + closeButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + + if ((maxButton != null) && (maxButton.getParent() != null)) { + if (DecorationHelper.isFrameStateSupported(Toolkit.getDefaultToolkit(), BaseRootPaneUI.MAXIMIZED_BOTH)) { + x += leftToRight ? -spacing - btnWidth : spacing; + maxButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + } + + if ((iconifyButton != null) && (iconifyButton.getParent() != null)) { + x += leftToRight ? -spacing - btnWidth : spacing; + iconifyButton.setBounds(x, y, btnWidth, btnHeight); + if (!leftToRight) { + x += btnWidth; + } + } + + buttonsWidth = leftToRight ? w - x : x; + + if (customTitlePanel != null) { + int maxWidth = w - buttonsWidth - spacing - 20; + if (menuBar != null) { + maxWidth -= menuBar.getPreferredSize().width; + maxWidth -= spacing; + } + int cpw = Math.min(maxWidth, customTitlePanel.getPreferredSize().width); + int cph = h; + int cpx = leftToRight ? w - buttonsWidth - cpw : buttonsWidth; + int cpy = 0; + customTitlePanel.setBounds(cpx, cpy, cpw, cph); + buttonsWidth += customTitlePanel.getPreferredSize().width; + } + } + + public void layoutMacStyle(Container c) { + int spacing = getHorSpacing(); + int w = getWidth(); + int h = getHeight(); + + // assumes all buttons have the same dimensions these dimensions include the borders + int btnHeight = h - getVerSpacing() - 1; + int btnWidth = btnHeight; + + int x = 2; + int y = centerButtons() ? Math.max(0, ((h - btnHeight) / 2) - 1) : 0; + + if (closeButton != null) { + closeButton.setBounds(x, y, btnWidth, btnHeight); + x += btnWidth + spacing; + } + if ((iconifyButton != null) && (iconifyButton.getParent() != null)) { + iconifyButton.setBounds(x, y, btnWidth, btnHeight); + x += btnWidth + spacing; + } + if ((maxButton != null) && (maxButton.getParent() != null)) { + if (DecorationHelper.isFrameStateSupported(Toolkit.getDefaultToolkit(), BaseRootPaneUI.MAXIMIZED_BOTH)) { + maxButton.setBounds(x, y, btnWidth, btnHeight); + x += btnWidth + spacing; + } + } + + buttonsWidth = x; + + if (customTitlePanel != null) { + int cpx = buttonsWidth + 5; + int cpy = 0; + int cpw = customTitlePanel.getPreferredSize().width; + int cph = h; + customTitlePanel.setBounds(cpx, cpy, cpw, cph); + buttonsWidth += cpw + 5; + } + } + } + +//----------------------------------------------------------------------------------------------- + protected class PropertyChangeHandler implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent pce) { + String name = pce.getPropertyName(); + // Frame.state isn't currently bound. + if ("resizable".equals(name) || "state".equals(name)) { + Frame frame = getFrame(); + if (frame != null) { + setState(DecorationHelper.getExtendedState(frame), true); + } + if ("resizable".equals(name)) { + getRootPane().repaint(); + } + } else if ("title".equals(name)) { + repaint(); + } else if ("componentOrientation".equals(name)) { + revalidate(); + repaint(); +// // a call to setMaximizedBounds may cause an invalid frame size on multi screen environments +// // see: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6699851 +// // try and error to avoid the setMaximizedBounds bug +// } else if (!JTattooUtilities.isMac() && useMaximizedBounds && "windowMaximize".equals(name)) { +// Frame frame = getFrame(); +// if (frame != null) { +// GraphicsConfiguration gc = frame.getGraphicsConfiguration(); +// Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc); +// Rectangle screenBounds = gc.getBounds(); +// int x = Math.max(0, screenInsets.left); +// int y = Math.max(0, screenInsets.top); +// int w = screenBounds.width - (screenInsets.left + screenInsets.right); +// int h = screenBounds.height - (screenInsets.top + screenInsets.bottom); +// // Keep taskbar visible +// frame.setMaximizedBounds(new Rectangle(x, y, w, h)); +// } +// } else if (!JTattooUtilities.isMac() && useMaximizedBounds && "windowMaximized".equals(name)) { +// Frame frame = getFrame(); +// if (frame != null) { +// GraphicsConfiguration gc = frame.getGraphicsConfiguration(); +// Rectangle screenBounds = gc.getBounds(); +// if (frame.getSize().width > screenBounds.width || frame.getSize().height > screenBounds.height) { +// useMaximizedBounds = false; +// frame.setMaximizedBounds(null); +// restore(); +// maximize(); +// } +// } +// } else if (!JTattooUtilities.isMac() && "windowMoved".equals(name)) { +// useMaximizedBounds = true; + } + + if ("windowRestored".equals(name)) { + wasMaximized = false; + } else if ("windowMaximized".equals(name)) { + wasMaximized = true; + } + } + } + +//----------------------------------------------------------------------------------------------- + protected class WindowHandler extends WindowAdapter { + + public void windowDeiconified(WindowEvent e) { + if (JTattooUtilities.isMac() && JTattooUtilities.getJavaVersion() >= 1.7 && wasMaximized) { + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + maximize(); + } + }); + } + } + + public void windowActivated(WindowEvent ev) { + setActive(true); + } + + public void windowDeactivated(WindowEvent ev) { + setActive(false); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseToggleButtonUI.java b/src/com/jtattoo/plaf/BaseToggleButtonUI.java new file mode 100644 index 0000000..6f85400 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseToggleButtonUI.java @@ -0,0 +1,206 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.*; +import javax.swing.text.View; + +public class BaseToggleButtonUI extends BasicToggleButtonUI { + + private static final Rectangle viewRect = new Rectangle(); + private static final Rectangle textRect = new Rectangle(); + private static final Rectangle iconRect = new Rectangle(); + + public static ComponentUI createUI(JComponent b) { + return new BaseToggleButtonUI(); + } + + public void installDefaults(AbstractButton b) { + super.installDefaults(b); + b.setOpaque(false); + b.setRolloverEnabled(true); + } + + public void uninstallDefaults(AbstractButton b) { + super.uninstallDefaults(b); + b.setOpaque(true); + b.setRolloverEnabled(false); + } + + protected BasicButtonListener createButtonListener(AbstractButton b) { + return new BaseButtonListener(b); + } + + protected void paintBackground(Graphics g, AbstractButton b) { + if (!b.isContentAreaFilled() || (b.getParent() instanceof JMenuBar)) { + return; + } + + int width = b.getWidth(); + int height = b.getHeight(); + + ButtonModel model = b.getModel(); + Color colors[]; + if (b.isEnabled()) { + Color background = b.getBackground(); + if (background instanceof ColorUIResource) { + if (b.isRolloverEnabled() && model.isRollover()) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else if ((model.isPressed() && model.isArmed()) || model.isSelected()) { + colors = AbstractLookAndFeel.getTheme().getPressedColors(); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && b.hasFocus()) { + colors = AbstractLookAndFeel.getTheme().getFocusColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getButtonColors(); + } + } + } else { + if (model.isPressed() && model.isArmed()) { + colors = ColorHelper.createColorArr(ColorHelper.darker(background, 30), ColorHelper.darker(background, 10), 20); + } else if (b.isRolloverEnabled() && model.isRollover()) { + if (model.isSelected()) { + colors = ColorHelper.createColorArr(ColorHelper.darker(background, 20), background, 20); + } else { + colors = ColorHelper.createColorArr(ColorHelper.brighter(background, 50), ColorHelper.brighter(background, 10), 20); + } + } else if (model.isSelected()) { + colors = ColorHelper.createColorArr(ColorHelper.darker(background, 40), ColorHelper.darker(background, 20), 20); + } else { + colors = ColorHelper.createColorArr(ColorHelper.brighter(background, 30), ColorHelper.darker(background, 10), 20); + } + } + } else { // disabled + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + JTattooUtilities.fillHorGradient(g, colors, 1, 1, width - 2, height - 2); + } + + protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { + ButtonModel model = b.getModel(); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + int mnemIndex = (JTattooUtilities.getJavaVersion() >= 1.4) ? b.getDisplayedMnemonicIndex() : JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + if (model.isEnabled()) { + Color foreground = b.getForeground(); + Color background = b.getBackground(); + int offs = 0; + if ((model.isArmed() && model.isPressed()) || model.isSelected()) { + offs = 1; + if (foreground instanceof ColorUIResource && background instanceof ColorUIResource) { + foreground = AbstractLookAndFeel.getTheme().getPressedForegroundColor(); + } + } + if (model.isRollover()) { + if (foreground instanceof ColorUIResource && background instanceof ColorUIResource) { + foreground = AbstractLookAndFeel.getTheme().getRolloverForegroundColor(); + } + } + Object sc = b.getClientProperty("shadowColor"); + if (sc instanceof Color) { + g.setColor((Color)sc); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs, textRect.y + fm.getAscent() * offs + 1); + } + g.setColor(foreground); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs, textRect.y + fm.getAscent() + offs); + } else { + g.setColor(Color.white); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + 1, textRect.y + fm.getAscent() + 1); + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + + protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) { + g.setColor(AbstractLookAndFeel.getFocusColor()); + BasicGraphicsUtils.drawDashedRect(g, 4, 3, b.getWidth() - 8, b.getHeight() - 6); + } + + public void paint(Graphics g, JComponent c) { + Graphics2D g2D = (Graphics2D) g; + + AbstractButton b = (AbstractButton) c; + g.setFont(b.getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + Insets insets = c.getInsets(); + + viewRect.x = insets.left; + viewRect.y = insets.top; + viewRect.width = b.getWidth() - (insets.right + viewRect.x); + viewRect.height = b.getHeight() - (insets.bottom + viewRect.y); + + textRect.x = textRect.y = textRect.width = textRect.height = 0; + iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0; + + int iconTextGap = defaultTextIconGap; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + iconTextGap = b.getIconTextGap(); + } + + String text = SwingUtilities.layoutCompoundLabel( + c, fm, b.getText(), b.getIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, + b.getText() == null ? 0 : iconTextGap); + + paintBackground(g, b); + + if (b.getIcon() != null) { + if (!b.isEnabled()) { + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + paintIcon(g, c, iconRect); + g2D.setComposite(savedComposite); + } else { + paintIcon(g, c, iconRect); + } + } + + if (text != null && !text.equals("") && textRect != null) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + v.paint(g, textRect); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } else { + paintText(g, b, textRect, text); + } + } + + if (b.isFocusPainted() && b.hasFocus()) { + paintFocus(g, b, viewRect, textRect, iconRect); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseToolTipUI.java b/src/com/jtattoo/plaf/BaseToolTipUI.java new file mode 100644 index 0000000..1e41b73 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseToolTipUI.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. + * + * JTattoo is multiple licensed. If your are an open source developer you can use + * it under the terms and conditions of the GNU General Public License version 2.0 + * or later as published by the Free Software Foundation. + * + * see: gpl-2.0.txt + * + * If you pay for a license you will become a registered user who could use the + * software under the terms and conditions of the GNU Lesser General Public License + * version 2.0 or later with classpath exception as published by the Free Software + * Foundation. + * + * see: lgpl-2.0.txt + * see: classpath-exception.txt + * + * Registered users could also use JTattoo under the terms and conditions of the + * Apache License, Version 2.0 as published by the Apache Software Foundation. + * + * see: APACHE-LICENSE-2.0.txt + */ +package com.jtattoo.plaf; + +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.image.BufferedImage; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalToolTipUI; + +/** + * @author Michael Hagen, Daniel Raedel + */ +public class BaseToolTipUI extends MetalToolTipUI { + + private boolean fancyLayout = false; + private ComponentListener popupWindowListener = null; + + public static ComponentUI createUI(JComponent c) { + return new BaseToolTipUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + int borderSize = AbstractLookAndFeel.getTheme().getTooltipBorderSize(); + int shadowSize = AbstractLookAndFeel.getTheme().getTooltipShadowSize(); + fancyLayout = DecorationHelper.isTranslucentWindowSupported() && ToolTipManager.sharedInstance().isLightWeightPopupEnabled(); + if (fancyLayout) { + c.setBorder(BorderFactory.createEmptyBorder(borderSize, borderSize + shadowSize, borderSize + shadowSize, borderSize + shadowSize)); + c.setOpaque(false); + Container parent = c.getParent(); + if (parent instanceof JPanel) { + ((JPanel) c.getParent()).setOpaque(false); + } + } else { + c.setBorder(BorderFactory.createEmptyBorder(borderSize, borderSize, borderSize, borderSize)); + } + } + + protected void installListeners(JComponent c) { + super.installListeners(c); + + // We must set the popup window to opaque because it is cached and reused within the PopupFactory + popupWindowListener = new ComponentAdapter() { + + public void componentHidden(ComponentEvent e) { + Window window = (Window)e.getComponent(); + DecorationHelper.setTranslucentWindow(window, false); + window.removeComponentListener(popupWindowListener); + } + }; + } + + public void paint(Graphics g, JComponent c) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposit = g2D.getComposite(); + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + int borderSize = AbstractLookAndFeel.getTheme().getTooltipBorderSize(); + int shadowSize = AbstractLookAndFeel.getTheme().getTooltipShadowSize(); + + int w = c.getWidth(); + int h = c.getHeight(); + Color backColor = AbstractLookAndFeel.getTheme().getTooltipBackgroundColor(); + + // We can't draw the fancyLayout if popup is medium weight + boolean mediumWeight = false; + Container parent = c.getParent(); + while (parent != null) { + if ((parent.getClass().getName().indexOf("MediumWeight") > 0)) { + mediumWeight = true; + break; + } + parent = parent.getParent(); + } + + // Paint the tooltip with a shadow border + if (!mediumWeight && fancyLayout && shadowSize > 0) { + parent = c.getParent(); + while (parent != null) { + if ((parent.getClass().getName().indexOf("HeavyWeightWindow") > 0) && (parent instanceof Window)) { + // Make the popup transparent + Window window = (Window)parent; + // Add a component listener to revert this operation if popup is closed + window.addComponentListener(popupWindowListener); + DecorationHelper.setTranslucentWindow(window, true); + break; + } + parent = parent.getParent(); + } + // draw the shadow + g2D.setColor(AbstractLookAndFeel.getTheme().getShadowColor()); + float[] composites = {0.01f, 0.02f, 0.04f, 0.06f, 0.08f, 0.12f}; + int shadowOffset = AbstractLookAndFeel.getTheme().isTooltipCastShadow() ? shadowSize : 0; + for (int i = 0; i < shadowSize; i++) { + g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, composites[i >= composites.length ? composites.length - 1 : i])); + g2D.fillRoundRect(i + shadowOffset, borderSize + i, w - (2 * i) - shadowOffset, h - borderSize - (2 * i), 12 - i, 12 - i); + + } + g2D.setComposite(savedComposit); + + // Draw background with borders + if (ColorHelper.getGrayValue(backColor) < 128) { + g2D.setColor(ColorHelper.brighter(AbstractLookAndFeel.getTheme().getBackgroundColor(), 20)); + } else { + g2D.setColor(Color.white); + + } + //g2D.fillRoundRect(shadowSize, 0, w - (2 * shadowSize) - 1, h - shadowSize - 1, 6, 6); + g2D.fillRoundRect(shadowSize, 0, w - (2 * shadowSize) - 1, h - shadowSize - 1, shadowSize, shadowSize); + g2D.setColor(ColorHelper.darker(backColor, 40)); + //g2D.drawRoundRect(shadowSize, 0, w - (2 * shadowSize) - 1, h - shadowSize - 1, 6, 6); + g2D.drawRoundRect(shadowSize, 0, w - (2 * shadowSize) - 1, h - shadowSize - 1, shadowSize, shadowSize); + g2D.setColor(ColorHelper.darker(backColor, 10)); + g2D.drawRect(borderSize + shadowSize - 1, borderSize - 1, w - (2 * borderSize) - (2 * shadowSize) + 1, h - (2 * borderSize) - shadowSize + 1); + + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + // Draw the text. This must be done within an offscreen image because of a bug + // in the jdk, wich causes ugly antialiased font rendering when background is + // transparent and popup is heavy weight. + BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + Graphics2D big = bi.createGraphics(); + big.setClip(0, 0, w, h); + Paint savedPaint = big.getPaint(); + Color cHi; + Color cLo; + if (ColorHelper.getGrayValue(backColor) < 128) { + cHi = ColorHelper.brighter(backColor, 10); + cLo = ColorHelper.darker(backColor, 20); + } else { + cHi = ColorHelper.brighter(backColor, 40); + cLo = ColorHelper.darker(backColor, 5); + } + big.setPaint(new GradientPaint(0, borderSize, cHi, 0, h - (2 * borderSize) - shadowSize, cLo)); + big.fillRect(borderSize + shadowSize, borderSize, w - (2 * borderSize) - (2 * shadowSize), h - (2 * borderSize) - shadowSize); + + big.setPaint(savedPaint); + + if (c instanceof JToolTip) { + JToolTip tip = (JToolTip) c; + if (tip.getComponent() != null && tip.getComponent().isEnabled()) { + c.setForeground(AbstractLookAndFeel.getTheme().getTooltipForegroundColor()); + } else { + c.setForeground(AbstractLookAndFeel.getTheme().getDisabledForegroundColor()); + } + } + super.paint(big, c); + g2D.setClip(borderSize + shadowSize, borderSize, w - (2 * borderSize) - (2 * shadowSize), h - (2 * borderSize) - shadowSize); + g2D.drawImage(bi, 0, 0, null); + + } else { + // Draw background with borders + if (ColorHelper.getGrayValue(backColor) < 128) { + g2D.setColor(ColorHelper.brighter(AbstractLookAndFeel.getTheme().getBackgroundColor(), 20)); + } else { + g2D.setColor(Color.white); + } + g2D.fillRect(0, 0, w, h); + g2D.setColor(ColorHelper.darker(backColor, 40)); + g2D.drawRect(0, 0, w - 1, h - 1); + g2D.setColor(ColorHelper.darker(backColor, 10)); + g2D.drawRect(borderSize - 1, borderSize - 1, w - (2 * borderSize - 1), h - (2 * borderSize - 1)); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + + Paint savedPaint = g2D.getPaint(); + Color cHi; + Color cLo; + if (ColorHelper.getGrayValue(backColor) < 128) { + cHi = ColorHelper.brighter(backColor, 10); + cLo = ColorHelper.darker(backColor, 20); + } else { + cHi = ColorHelper.brighter(backColor, 40); + cLo = ColorHelper.darker(backColor, 5); + } + g2D.setPaint(new GradientPaint(0, borderSize, cHi, 0, h - (2 * borderSize), cLo)); + g2D.fillRect(borderSize, borderSize, w - (2 * borderSize), h - (2 * borderSize)); + g2D.setPaint(savedPaint); + + super.paint(g, c); + } + } +} diff --git a/src/com/jtattoo/plaf/BaseTreeUI.java b/src/com/jtattoo/plaf/BaseTreeUI.java new file mode 100644 index 0000000..c1cc5d2 --- /dev/null +++ b/src/com/jtattoo/plaf/BaseTreeUI.java @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicTreeUI; + +/** + * author Michael Hagen + */ +public class BaseTreeUI extends BasicTreeUI { + + public static ComponentUI createUI(JComponent c) { + return new BaseTreeUI(); + } + + protected void paintVerticalLine(Graphics g, JComponent c, int x, int top, int bottom) { + drawDashedVerticalLine(g, x, top, bottom); + } + + protected void paintHorizontalLine(Graphics g, JComponent c, int y, int left, int right) { + drawDashedHorizontalLine(g, y, left, right); + } +} + + diff --git a/src/com/jtattoo/plaf/ColorHelper.java b/src/com/jtattoo/plaf/ColorHelper.java new file mode 100644 index 0000000..2be0bb8 --- /dev/null +++ b/src/com/jtattoo/plaf/ColorHelper.java @@ -0,0 +1,205 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.Color; + +/** + * A helper class for handling color values. + * + * @author Michael Hagen + */ +public class ColorHelper { + + /** + * Avoid creation of this class. This class only contains static helper methods, so creation of an object + * is not necessary. + */ + private ColorHelper() { + } + + /** + * Creates a color object. + * + * @param r the Red component + * @param g the Green component + * @param b the Blue component + * + * @return a color object + */ + public static Color createColor(int r, int g, int b) { + return new Color(((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF))); + } + + /** + * Creates an array of color values. The colors created will be a gradient from color c1 to color c1 with a count + * of steps values. + * + * @param c1 the starting color + * @param c2 the ending color + * @param steps the number of steps between c1 and c2 (the size of the created array) + * + * @return the array of color values + */ + public static Color[] createColorArr(Color c1, Color c2, int steps) { + if (c1 == null || c2 == null) { + return null; + } + + Color colors[] = new Color[steps]; + double r = c1.getRed(); + double g = c1.getGreen(); + double b = c1.getBlue(); + double dr = ((double) c2.getRed() - r) / steps; + double dg = ((double) c2.getGreen() - g) / steps; + double db = ((double) c2.getBlue() - b) / steps; + colors[0] = c1; + for (int i = 1; i < steps - 1; i++) { + r += dr; + g += dg; + b += db; + colors[i] = createColor((int) r, (int) g, (int) b); + } + colors[steps - 1] = c2; + return colors; + } + + /** + * Creates a color that is the brighter version of the color parameter c. + * + * @param c the color + * @param p the factor of the brightness in percent from 0 to 100 + * @return a new color value that is a brighter version of the color parameter c + */ + public static Color brighter(Color c, double p) { + if (c == null) { + return null; + } + + double r = c.getRed(); + double g = c.getGreen(); + double b = c.getBlue(); + + double rd = 255.0 - r; + double gd = 255.0 - g; + double bd = 255.0 - b; + + r += (rd * p) / 100.0; + g += (gd * p) / 100.0; + b += (bd * p) / 100.0; + return createColor((int) r, (int) g, (int) b); + } + + /** + * Creates a color that is the darker version of the color parameter c. + * + * @param c the color + * @param p the factor to shade the color c in percent from 0 to 100 + * + * @return a new color value that is a darker version of the color parameter c + */ + public static Color darker(Color c, double p) { + if (c == null) { + return null; + } + + double r = c.getRed(); + double g = c.getGreen(); + double b = c.getBlue(); + + r -= (r * p) / 100.0; + g -= (g * p) / 100.0; + b -= (b * p) / 100.0; + + return createColor((int) r, (int) g, (int) b); + } + + /** + * Returns a color value which is the media between the colors c1 and c1 + * + * @param c1 the first color + * @param c2 the second color + * + * @return the median color value of the two colors c1 and c1 + */ + public static Color median(Color c1, Color c2) { + if ((c1 == null || c2 == null)) { + return null; + } + + int r = (c1.getRed() + c2.getRed()) / 2; + int g = (c1.getGreen() + c2.getGreen()) / 2; + int b = (c1.getBlue() + c2.getBlue()) / 2; + return createColor(r, g, b); + } + + /** + * Returns a value between 0 and 255 which represents the gray value of the color parameter. + * + * @param c the color you want to calculate the gray value + * + * @return the gray value + */ + public static int getGrayValue(Color c) { + if (c == null) { + return 0; + } + + double r = c.getRed(); + double g = c.getGreen(); + double b = c.getBlue(); + return Math.min(255, (int) (r * 0.28 + g * 0.59 + b * 0.13)); + } + + /** + * Returns a value between 0 and 255 which represents the median gray value of the color array. + * + * @param ca the color array you want to calculate the gray value + * + * @return the gray value + */ + public static int getGrayValue(Color[] ca) { + int sum = 0; + for (int i = 0; i < ca.length; i++) { + sum += getGrayValue(ca[i]); + } + return (sum / ca.length); + } + + /** + * Returns a gray version of the color parameter c, which means all parts (r,g,b) do have the same value. + * + * @param c the color + * + * @return a gray version of the color parameter c. + */ + public static Color toGray(Color c) { + if (c == null) { + return null; + } + + int gray = getGrayValue(c); + return new Color(gray, gray, gray, c.getAlpha()); + } +} diff --git a/src/com/jtattoo/plaf/DecorationHelper.java b/src/com/jtattoo/plaf/DecorationHelper.java new file mode 100644 index 0000000..a5b0939 --- /dev/null +++ b/src/com/jtattoo/plaf/DecorationHelper.java @@ -0,0 +1,146 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.lang.reflect.Method; +import javax.swing.*; + +/** + * @author Michael Hagen + */ +public class DecorationHelper { + + private DecorationHelper() { + } + + public static void decorateWindows(Boolean decorate) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + try { + Class classParams[] = {Boolean.TYPE}; + Method m = JFrame.class.getMethod("setDefaultLookAndFeelDecorated", classParams); + Object methodParams[] = {decorate}; + m.invoke(null, methodParams); + m = JDialog.class.getMethod("setDefaultLookAndFeelDecorated", classParams); + m.invoke(null, methodParams); + System.setProperty("sun.awt.noerasebackground", "true"); + System.setProperty("sun.awt.erasebackgroundonresize", "false"); + } catch (Exception ex) { + } + } + } + + public static int getWindowDecorationStyle(JRootPane root) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + try { + Class paramTypes[] = null; + Object args[] = null; + Method m = root.getClass().getMethod("getWindowDecorationStyle", paramTypes); + Integer i = (Integer) m.invoke(root, args); + return i.intValue(); + } catch (Exception ex) { + } + } + return 0; + } + + @SuppressWarnings("unchecked") + public static int getExtendedState(Frame frame) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + try { + Class paramTypes[] = null; + Object args[] = null; + Method m = frame.getClass().getMethod("getExtendedState", paramTypes); + Integer i = (Integer) m.invoke(frame, args); + return i.intValue(); + } catch (Exception ex) { + } + } + return 0; + } + + @SuppressWarnings("unchecked") + public static void setExtendedState(Frame frame, int state) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + try { + Class classParams[] = {Integer.TYPE}; + Method m = frame.getClass().getMethod("setExtendedState", classParams); + Object methodParams[] = {state}; + m.invoke(frame, methodParams); + } catch (Exception ex) { + } + } + } + + @SuppressWarnings("unchecked") + public static boolean isFrameStateSupported(Toolkit tk, int state) { + if (JTattooUtilities.getJavaVersion() >= 1.4) { + try { + Class classParams[] = {Integer.TYPE}; + Method m = tk.getClass().getMethod("isFrameStateSupported", classParams); + Object methodParams[] = {state}; + Boolean b = (Boolean) m.invoke(tk, methodParams); + return b.booleanValue(); + } catch (Exception ex) { + } + } + return false; + } + + public static boolean isTranslucentWindowSupported() { + return (JTattooUtilities.getJavaVersion() >= 1.6010) && (JTattooUtilities.isMac() || JTattooUtilities.isWindows()); + } + + @SuppressWarnings("unchecked") + public static void setTranslucentWindow(Window wnd, boolean translucent) { + if (isTranslucentWindowSupported()) { + if (JTattooUtilities.getJavaVersion() >= 1.7) { + if (translucent) { + if (wnd.getBackground() == null || !wnd.getBackground().equals(new Color(0, 0, 0, 0))) { + wnd.setBackground(new Color(0, 0, 0, 0)); + } + } else { + if (wnd.getBackground() == null || !wnd.getBackground().equals(new Color(0, 0, 0, 0xff))) { + wnd.setBackground(new Color(0, 0, 0, 0xff)); + } + } + } else if (JTattooUtilities.getJavaVersion() >= 1.6010) { + try { + Class clazz = Class.forName("com.sun.awt.AWTUtilities"); + Class classParams[] = {Window.class, Boolean.TYPE}; + Method method = clazz.getMethod("setWindowOpaque", classParams); + if (translucent) { + Object methodParams[] = {wnd, Boolean.FALSE}; + method.invoke(wnd, methodParams); + } else { + Object methodParams[] = {wnd, Boolean.TRUE}; + method.invoke(wnd, methodParams); + } + } catch (Exception ex) { + } + } + } + } + +} diff --git a/src/com/jtattoo/plaf/JTattooUtilities.java b/src/com/jtattoo/plaf/JTattooUtilities.java new file mode 100644 index 0000000..d00dd7c --- /dev/null +++ b/src/com/jtattoo/plaf/JTattooUtilities.java @@ -0,0 +1,577 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import java.lang.reflect.Method; +import javax.swing.*; +import javax.swing.plaf.basic.BasicGraphicsUtils; + +/** + * @author Michael Hagen + */ +public class JTattooUtilities { + + private static final boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("windows") != -1; + private static final boolean isOS2 = System.getProperty("os.name").toLowerCase().indexOf("os/2") != -1; + private static final boolean isMac = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1; + private static final boolean isLinux = System.getProperty("os.name").toLowerCase().indexOf("linux") != -1; + private static final boolean isSunOS = System.getProperty("os.name").toLowerCase().indexOf("sunos") != -1; + private static final boolean isAIX = System.getProperty("os.name").toLowerCase().indexOf("aix") != -1; + private static final boolean isHPUX = System.getProperty("os.name").toLowerCase().indexOf("hpux") != -1; + private static final boolean isFreeBSD = System.getProperty("os.name").toLowerCase().indexOf("freebsd") != -1; + private static final boolean isHiresScreen = Toolkit.getDefaultToolkit().getScreenSize().width > 1280; + private static Double javaVersion = null; + private static Double osVersion = null; + private static final String ELLIPSIS = "..."; + + public static double getJavaVersion() { + if (javaVersion == null) { + try { + String ver = System.getProperty("java.version"); + String version = ""; + boolean firstPoint = true; + for (int i = 0; i < ver.length(); i++) { + if (ver.charAt(i) == '.') { + if (firstPoint) { + version += ver.charAt(i); + } + firstPoint = false; + } else if (Character.isDigit(ver.charAt(i))) { + version += ver.charAt(i); + } + } + javaVersion = Double.parseDouble(version); + } catch (Exception ex) { + javaVersion = 1.3d; + } + } + return javaVersion.doubleValue(); + } + + public static double getOSVersion() { + if (osVersion == null) { + try { + String ver = System.getProperties().getProperty("os.version"); + String version = ""; + boolean firstPoint = true; + for (int i = 0; i < ver.length(); i++) { + if (ver.charAt(i) == '.') { + if (firstPoint) { + version += ver.charAt(i); + } + firstPoint = false; + } else if (Character.isDigit(ver.charAt(i))) { + version += ver.charAt(i); + } + } + osVersion = Double.parseDouble(version); + } catch (Exception ex) { + osVersion = 1.0d; + } + } + return osVersion.doubleValue(); + } + + public static boolean isWindows() { + return isWindows; + } + + public static boolean isOS2() { + return isOS2; + } + + public static boolean isMac() { + return isMac; + } + + public static boolean isLinux() { + return isLinux; + } + + public static boolean isSunOS() { + return isSunOS; + } + + public static boolean isAIX() { + return isAIX; + } + + public static boolean isHPUX() { + return isHPUX; + } + + public static boolean isFreeBSD() { + return isFreeBSD; + } + + public static boolean isHiresScreen() { + return isHiresScreen; + } + + public static boolean isLeftToRight(Component c) { + if (c == null) { + return true; + } + return c.getComponentOrientation().isLeftToRight(); + } + + public static boolean isActive(JComponent c) { + if (c == null) { + return false; + } + boolean active = true; + if (c instanceof JInternalFrame) { + active = ((JInternalFrame) c).isSelected(); + } + if (active) { + Container parent = c.getParent(); + while (parent != null) { + if (parent instanceof JInternalFrame) { + active = ((JInternalFrame) parent).isSelected(); + break; + } + parent = parent.getParent(); + } + } + if (active) { + active = isFrameActive(c); + } + return active; + } + + public static boolean isFrameActive(Component c) { + if (c == null) { + return false; + } + Window w = SwingUtilities.getWindowAncestor(c); + if (w != null) { + if (w.getClass().getName().indexOf("Popup") >= 0) { + return true; + } else { + return isWindowActive(w); + } + } + + return true; + } + + public static boolean isWindowActive(Window window) { + if (getJavaVersion() >= 1.4) { + try { + Class paramTypes[] = null; + Object args[] = null; + Method m = window.getClass().getMethod("isActive", paramTypes); + Boolean b = (Boolean) m.invoke(window, args); + return b.booleanValue(); + } catch (Exception ex) { + } + } + return true; + } + + public static Container getRootContainer(Component c) { + if (c == null) { + return null; + } + Container parent = c.getParent(); + while ((parent != null) && !(parent instanceof JPopupMenu) && !(parent instanceof JInternalFrame) && !(parent instanceof Window) && (parent.getParent() != null)) { + parent = parent.getParent(); + } + return parent; + } + + public static Dimension getFrameSize(Component c) { + Container parent = getRootContainer(c); + if (parent != null) { + return parent.getSize(); + } + return Toolkit.getDefaultToolkit().getScreenSize(); + } + + public static Point getRelLocation(Component c) { + if (c == null || !c.isShowing()) { + return new Point(0, 0); + } + + Container parent = getRootContainer(c); + if ((parent != null) && parent.isShowing()) { + Point p1 = c.getLocationOnScreen(); + Point p2 = parent.getLocationOnScreen(); + return new Point(p1.x - p2.x, p1.y - p2.y); + } + + return new Point(0, 0); + } + + public static String getClippedText(String text, FontMetrics fm, int maxWidth) { + if ((text == null) || (text.length() == 0)) { + return ""; + } + int width = SwingUtilities.computeStringWidth(fm, text); + if (width > maxWidth) { + int totalWidth = SwingUtilities.computeStringWidth(fm, ELLIPSIS); + for (int i = 0; i < text.length(); i++) { + totalWidth += fm.charWidth(text.charAt(i)); + if (totalWidth > maxWidth) { + return text.substring(0, i) + ELLIPSIS; + } + } + } + return text; + } + + public static int findDisplayedMnemonicIndex(String text, int mnemonic) { + if (text == null || mnemonic == '\0') { + return -1; + } + + char uc = Character.toUpperCase((char)mnemonic); + char lc = Character.toLowerCase((char)mnemonic); + + int uci = text.indexOf(uc); + int lci = text.indexOf(lc); + + if (uci == -1) { + return lci; + } else if(lci == -1) { + return uci; + } else { + return (lci < uci) ? lci : uci; + } + } + + @SuppressWarnings("unchecked") + public static FontMetrics getFontMetrics(JComponent c, Graphics g, Font f) { + FontMetrics fm = null; + if (getJavaVersion() >= 1.6 && getJavaVersion() <= 1.9) { + try { + Class swingUtilities2Class = Class.forName("sun.swing.SwingUtilities2"); + Class classParams[] = {JComponent.class, Graphics.class, Font.class}; + Method m = swingUtilities2Class.getMethod("getFontMetrics", classParams); + Object methodParams[] = {c, g, f}; + fm = (FontMetrics)m.invoke(null, methodParams); + } catch (Exception ex) { + // Nothing to do + } + } + if (fm == null) { + if (g == null) { + if (c != null) { + g = c.getGraphics(); + } + } + if (g != null) { + if (f != null) { + fm = g.getFontMetrics(f); + } else { + fm = g.getFontMetrics(); + } + } else if (c != null) { + if (f != null) { + fm = c.getFontMetrics(f); + } else { + fm = c.getFontMetrics(c.getFont()); + } + } + } + return fm; + } + + @SuppressWarnings("unchecked") + public static void drawString(JComponent c, Graphics g, String text, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + if (getJavaVersion() >= 1.6) { + try { + Class swingUtilities2Class = Class.forName("sun.swing.SwingUtilities2"); + Class classParams[] = {JComponent.class, Graphics.class, String.class, Integer.TYPE, Integer.TYPE}; + Method m = swingUtilities2Class.getMethod("drawString", classParams); + Object methodParams[] = {c, g, text, x, y}; + m.invoke(null, methodParams); + } catch (Exception ex) { + g.drawString(text, x, y); + } + } else { + g.drawString(text, x, y); + } + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + + @SuppressWarnings("unchecked") + public static void drawStringUnderlineCharAt(JComponent c, Graphics g, String text, int underlinedIndex, int x, int y) { + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + if (getJavaVersion() >= 1.6 && getJavaVersion() <= 1.9) { + try { + Class swingUtilities2Class = Class.forName("sun.swing.SwingUtilities2"); + Class classParams[] = {JComponent.class, Graphics.class, String.class, Integer.TYPE, Integer.TYPE, Integer.TYPE}; + Method m = swingUtilities2Class.getMethod("drawStringUnderlineCharAt", classParams); + Object methodParams[] = {c, g, text, underlinedIndex, x, y}; + m.invoke(null, methodParams); + } catch (Exception ex) { + BasicGraphicsUtils.drawString(g, text, underlinedIndex, x, y); + } + } else if (getJavaVersion() >= 1.4) { + BasicGraphicsUtils.drawStringUnderlineCharAt(g, text, underlinedIndex, x, y); + } else { + BasicGraphicsUtils.drawString(g, text, underlinedIndex, x, y); + } + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } + + public static void fillHorGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + int steps = colors.length; + double dy = (double) h / (double) (steps); + if (dy <= 2.001) { + int y1 = y; + for (int i = 0; i < steps; i++) { + int y2 = y + (int) Math.round((double) i * dy); + g.setColor(colors[i]); + if (i == (steps - 1)) { + g.fillRect(x, y1, w, y + h - y1); + } else { + g.fillRect(x, y1, w, y2 - y1); + } + y1 = y2; + } + } else { + smoothFillHorGradient(g, colors, x, y, w, h); + } + } + } + + public static void smoothFillHorGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + Graphics2D g2D = (Graphics2D) g; + Paint savedPaint = g2D.getPaint(); + int steps = colors.length; + double dy = (double) h / (double) (steps - 1); + int y1 = y; + for (int i = 0; i < steps; i++) { + int y2 = y + (int) Math.round((double) i * dy); + if (i == (steps - 1)) { + g2D.setPaint(null); + g2D.setColor(colors[i]); + g2D.fillRect(x, y1, w, y + h - y1); + } else { + g2D.setPaint(new GradientPaint(0, y1, colors[i], 0, y2, colors[i + 1])); + g2D.fillRect(x, y1, w, y2 - y1); + } + y1 = y2; + } + g2D.setPaint(savedPaint); + } + } + + public static void fillInverseHorGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + int steps = colors.length; + double dy = (double) h / (double) steps; + if (dy <= 2.001) { + int y1 = y; + for (int i = 0; i < steps; i++) { + int y2 = y + (int) Math.round((double) i * dy); + g.setColor(colors[colors.length - i - 1]); + if (i == (steps - 1)) { + g.fillRect(x, y1, w, y + h - y1); + } else { + g.fillRect(x, y1, w, y2 - y1); + } + y1 = y2; + } + } else { + smoothFillInverseHorGradient(g, colors, x, y, w, h); + } + } + } + + public static void smoothFillInverseHorGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + Graphics2D g2D = (Graphics2D) g; + Paint savedPaint = g2D.getPaint(); + int steps = colors.length; + double dy = (double) h / (double) steps; + int y1 = y; + for (int i = 0; i < steps; i++) { + int y2 = y + (int) Math.round((double) i * dy); + g.setColor(colors[colors.length - i - 1]); + if (i == (steps - 1)) { + g2D.setPaint(null); + g2D.setColor(colors[colors.length - i - 1]); + g.fillRect(x, y1, w, y + h - y1); + } else { + g2D.setPaint(new GradientPaint(0, y1, colors[colors.length - i - 1], 0, y2, colors[colors.length - i - 2])); + g.fillRect(x, y1, w, y2 - y1); + } + y1 = y2; + } + g2D.setPaint(savedPaint); + } + } + + public static void fillVerGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + int steps = colors.length; + double dx = (double) w / (double) steps; + int x1 = x; + for (int i = 0; i < steps; i++) { + int x2 = x + (int) Math.round((double) i * dx); + g.setColor(colors[i]); + if (i == (steps - 1)) { + g.fillRect(x1, y, x + w - x1, h); + } else { + g.fillRect(x1, y, x2 - x1, h); + } + x1 = x2; + } + } + } + + public static void fillInverseVerGradient(Graphics g, Color[] colors, int x, int y, int w, int h) { + if (colors != null) { + int steps = colors.length; + double dx = (double) w / (double) steps; + int x1 = x; + for (int i = 0; i < steps; i++) { + int x2 = x + (int) Math.round((double) i * dx); + g.setColor(colors[colors.length - i - 1]); + if (i == (steps - 1)) { + g.fillRect(x1, y, x + w - x1, h); + } else { + g.fillRect(x1, y, x2 - x1, h); + } + x1 = x2; + } + } + } + + public static void fillComponent(Graphics g, Component c, Icon texture) { + int x = 0; + int y = 0; + int w = c.getWidth(); + int h = c.getHeight(); + if (texture != null) { + int tw = texture.getIconWidth(); + int th = texture.getIconHeight(); + Point p = JTattooUtilities.getRelLocation(c); + y = -p.y; + while (y < h) { + x = -p.x; + while (x < w) { + texture.paintIcon(c, g, x, y); + x += tw; + } + y += th; + } + } else { + g.setColor(c.getBackground()); + g.fillRect(x, y, w, h); + } + } + + //------------------------------------------------------------------------------------------- + + public static void drawBorder(Graphics g, Color c, int x, int y, int w, int h) { + g.setColor(c); + g.drawRect(x, y, w - 1, h - 1); + } + + public static void draw3DBorder(Graphics g, Color c1, Color c2, int x, int y, int w, int h) { + int x2 = x + w - 1; + int y2 = y + h - 1; + g.setColor(c1); + g.drawLine(x, y, x2 - 1, y); + g.drawLine(x, y + 1, x, y2); + g.setColor(c2); + g.drawLine(x, y2, x2 - 1, y2); + g.drawLine(x2, y, x2, y2); + } + + public static void drawRoundBorder(Graphics g, Color c, int x, int y, int w, int h, int r) { + Graphics2D g2D = (Graphics2D) g; + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2D.setColor(c); + g2D.drawRoundRect(x, y, w - 1, h - 1, r, r); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } + + public static void drawRound3DBorder(Graphics g, Color c1, Color c2, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D) g; + int x2 = x + w; + int y2 = y + h; + int d = h; + int r = h / 2; + Color cm = ColorHelper.median(c1, c2); + Color c1m = ColorHelper.median(c1, cm); + Color c2m = ColorHelper.median(c2, cm); + + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // oben + g2D.setColor(c1); + g2D.drawLine(x + r, y, x2 - r, y); + // rechts + g2D.drawLine(x, y + r, x, y2 - r); + // unten + g2D.setColor(c2); + g2D.drawLine(x + r, y2, x2 - r, y2); + // links + g2D.drawLine(x2, y + r, x2, y2 - r); + + // links + g2D.setColor(c1); + g2D.drawArc(x, y, d, d, 90, 45); + g2D.setColor(c1m); + g2D.drawArc(x, y, d, d, 135, 45); + g2D.setColor(cm); + g2D.drawArc(x, y, d, d, 180, 45); + g2D.setColor(c2m); + g2D.drawArc(x, y, d, d, 225, 45); + // rechts + g2D.setColor(c1m); + g2D.drawArc(x2 - d, y, d, d, 45, 45); + g2D.setColor(cm); + g2D.drawArc(x2 - d, y, d, d, 0, 45); + g2D.setColor(c2m); + g2D.drawArc(x2 - d, y, d, d, -45, 45); + g2D.setColor(c2); + g2D.drawArc(x2 - d, y, d, d, -90, 45); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } +} diff --git a/src/com/jtattoo/plaf/LazyImageIcon.java b/src/com/jtattoo/plaf/LazyImageIcon.java new file mode 100644 index 0000000..fd20a79 --- /dev/null +++ b/src/com/jtattoo/plaf/LazyImageIcon.java @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.Icon; +import javax.swing.ImageIcon; + +/** + * + * @author Michael Hagen + */ +public class LazyImageIcon implements Icon { + + private String name = null; + private ImageIcon icon = null; + + public LazyImageIcon(String name) { + this.name = name; + } + + private Icon getIcon() { + if (icon == null) { + try { + icon = new ImageIcon(LazyImageIcon.class.getResource(name)); + } catch (Throwable t) { + System.out.println("ERROR: loading image " + name + " failed!"); + } + } + return icon; + } + + public Image getImage() { + if (getIcon() != null) { + return icon.getImage(); + } + return null; + } + + public int getIconHeight() { + if (getIcon() != null) { + return icon.getIconHeight(); + } else { + return 16; + } + } + + public int getIconWidth() { + if (getIcon() != null) { + return icon.getIconWidth(); + } else { + return 16; + } + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + if (getIcon() != null) { + icon.paintIcon(c, g, x, y); + } else { + g.setColor(Color.red); + g.fillRect(x, y, 16, 16); + g.setColor(Color.white); + g.drawLine(x, y, x + 15, y + 15); + g.drawLine(x + 15, y, x, y + 15); + } + } + +} diff --git a/src/com/jtattoo/plaf/LazyMenuArrowImageIcon.java b/src/com/jtattoo/plaf/LazyMenuArrowImageIcon.java new file mode 100644 index 0000000..ec5bd0d --- /dev/null +++ b/src/com/jtattoo/plaf/LazyMenuArrowImageIcon.java @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.Icon; +import javax.swing.ImageIcon; + +/** + * + * @author Michael Hagen + */ +public class LazyMenuArrowImageIcon implements Icon { + + private String leftToRightName = null; + private String rightToLefttName = null; + private Icon leftToRightIcon = null; + private Icon rightToLeftIcon = null; + + public LazyMenuArrowImageIcon(String leftToRightName, String rightToLefttName) { + this.leftToRightName = leftToRightName; + this.rightToLefttName = rightToLefttName; + } + + private Icon getLeftToRightIcon() { + if (leftToRightIcon == null) { + try { + leftToRightIcon = new ImageIcon(LazyMenuArrowImageIcon.class.getResource(leftToRightName)); + } catch (Throwable t) { + System.out.println("ERROR: loading image " + leftToRightName + " failed!"); + } + } + return leftToRightIcon; + } + + private Icon getRightToLeftIcon() { + if (rightToLeftIcon == null) { + try { + rightToLeftIcon = new ImageIcon(LazyMenuArrowImageIcon.class.getResource(rightToLefttName)); + } catch (Throwable t) { + System.out.println("ERROR: loading image " + rightToLefttName + " failed!"); + } + } + return rightToLeftIcon; + } + + private Icon getIcon(Component c) { + if (JTattooUtilities.isLeftToRight(c)) { + return getLeftToRightIcon(); + } else { + return getRightToLeftIcon(); + } + } + + public int getIconHeight() { + Icon ico = getIcon(null); + if (ico != null) { + return ico.getIconHeight(); + } else { + return 16; + } + } + + public int getIconWidth() { + Icon ico = getIcon(null); + if (ico != null) { + return ico.getIconWidth(); + } else { + return 16; + } + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Icon ico = getIcon(c); + if (ico != null) { + ico.paintIcon(c, g, x, y); + } else { + g.setColor(Color.red); + g.fillRect(x, y, 16, 16); + g.setColor(Color.white); + g.drawLine(x, y, x + 15, y + 15); + g.drawLine(x + 15, y, x, y + 15); + } + } + +} diff --git a/src/com/jtattoo/plaf/NoFocusButton.java b/src/com/jtattoo/plaf/NoFocusButton.java new file mode 100644 index 0000000..56a7f5c --- /dev/null +++ b/src/com/jtattoo/plaf/NoFocusButton.java @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import javax.swing.Icon; +import javax.swing.JButton; + +/** + * @author Michael Hagen + */ +public class NoFocusButton extends JButton { + + public NoFocusButton() { + super(); + init(); + } + + public NoFocusButton(Icon ico) { + super(ico); + init(); + } + + private void init() { + setFocusPainted(false); + setRolloverEnabled(true); + if (JTattooUtilities.getJavaVersion() >= 1.4) { + setFocusable(false); + } + } + + @SuppressWarnings("deprecation") + public boolean isFocusTraversable() { + return false; + } + + public void requestFocus() { + } +} diff --git a/src/com/jtattoo/plaf/TitlePane.java b/src/com/jtattoo/plaf/TitlePane.java new file mode 100644 index 0000000..850404a --- /dev/null +++ b/src/com/jtattoo/plaf/TitlePane.java @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +/** + * + * @author Michael Hagen + */ +public interface TitlePane { + + public void iconify(); + public void maximize(); + public void restore(); + public void close(); + +} diff --git a/src/com/jtattoo/plaf/XPScrollBarUI.java b/src/com/jtattoo/plaf/XPScrollBarUI.java new file mode 100644 index 0000000..1658f91 --- /dev/null +++ b/src/com/jtattoo/plaf/XPScrollBarUI.java @@ -0,0 +1,148 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; + +/** + * + * @author Michael Hagen + */ +public class XPScrollBarUI extends BaseScrollBarUI { + + protected static Color rolloverColors[] = null; + protected static Color dragColors[] = null; + + public static ComponentUI createUI(JComponent c) { + return new XPScrollBarUI(); + } + + protected void installDefaults() { + super.installDefaults(); + Color colors[] = AbstractLookAndFeel.getTheme().getThumbColors(); + rolloverColors = new Color[colors.length]; + dragColors = new Color[colors.length]; + for (int i = 0; i < colors.length; i++) { + rolloverColors[i] = ColorHelper.brighter(colors[i], 16); + dragColors[i] = ColorHelper.darker(colors[i], 8); + } + } + + protected Color getFrameColor() { + return Color.white; + } + + protected Color[] getThumbColors() { + if (isDragging) { + return dragColors; + } + if (isRollover) { + return rolloverColors; + } + return AbstractLookAndFeel.getTheme().getThumbColors(); + } + + protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { + if (!c.isEnabled()) { + return; + } + + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + + int x = thumbBounds.x; + int y = thumbBounds.y; + int width = thumbBounds.width; + int height = thumbBounds.height; + + g.translate(x, y); + + Color[] colors = getThumbColors(); + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + JTattooUtilities.fillVerGradient(g, colors, 0, 0, width, height); + if (!AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + int dx = 6; + int dy = height / 2 - 3; + int dw = width - 13; + Color c1 = ColorHelper.brighter(colors[0], 60); + Color c2 = ColorHelper.darker(colors[0], 30); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + for (int i = 0; i < 4; i++) { + g.setColor(c1); + g.drawLine(dx, dy, dx + dw, dy); + dy++; + g.setColor(c2); + g.drawLine(dx, dy, dx + dw, dy); + dy++; + } + } + } else { + JTattooUtilities.fillHorGradient(g, colors, 0, 0, width, height); + if (!AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + int dx = width / 2 - 3; + int dy = 6; + int dh = height - 13; + Color c1 = ColorHelper.brighter(colors[0], 60); + Color c2 = ColorHelper.darker(colors[0], 30); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f); + g2D.setComposite(alpha); + for (int i = 0; i < 4; i++) { + g.setColor(c1); + g.drawLine(dx, dy, dx, dy + dh); + dx++; + g.setColor(c2); + g.drawLine(dx, dy, dx, dy + dh); + dx++; + } + } + } + + g.setColor(getFrameColor()); + g.drawLine(1, 1, width - 2, 1); + g.drawLine(1, 2, 1, height - 3); + g.drawLine(width - 2, 2, width - 2, height - 3); + g.drawLine(2, height - 2, width - 3, height - 2); + + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + Color fc = colors[colors.length - 1]; + g2D.setColor(fc); + g.drawLine(2, 2, width - 3, 2); + g.drawLine(2, 3, 2, height - 3); + + g.setColor(ColorHelper.darker(fc, 40)); + g.drawLine(width - 1, 2, width - 1, height - 3); + g.drawLine(3, height - 1, width - 3, height - 1); + alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f); + g2D.setComposite(alpha); + g.drawLine(1, height - 2, 2, height - 1); + g.drawLine(width - 1, height - 2, width - 2, height - 1); + + g.translate(-x, -y); + g2D.setComposite(savedComposite); + } +} diff --git a/src/com/jtattoo/plaf/XPScrollButton.java b/src/com/jtattoo/plaf/XPScrollButton.java new file mode 100644 index 0000000..9edbcf1 --- /dev/null +++ b/src/com/jtattoo/plaf/XPScrollButton.java @@ -0,0 +1,160 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf; + +import java.awt.*; +import javax.swing.Icon; +import javax.swing.UIManager; + +/** + * @author Michael Hagen + */ +public abstract class XPScrollButton extends BaseScrollButton { + + public XPScrollButton(int direction, int width) { + super(direction, width); + } + + private Icon getUpArrowIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel(); + return laf.getIconFactory().getUpArrowIcon(); + } + return null; + } + + private Icon getDownArrowIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel(); + return laf.getIconFactory().getDownArrowIcon(); + } + return null; + } + + private Icon getLeftArrowIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel(); + return laf.getIconFactory().getLeftArrowIcon(); + } + return null; + } + + private Icon getRightArrowIcon() { + if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) { + AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel(); + return laf.getIconFactory().getRightArrowIcon(); + } + return null; + } + + public Color getFrameColor() { + return Color.white; + } + + public void paint(Graphics g) { + Graphics2D g2D = (Graphics2D) g; + Composite savedComposite = g2D.getComposite(); + Paint savedPaint = g2D.getPaint(); + + boolean isPressed = getModel().isPressed(); + boolean isRollover = getModel().isRollover(); + + int width = getWidth(); + int height = getHeight(); + + Color[] tc = AbstractLookAndFeel.getTheme().getThumbColors(); + Color c1 = tc[0]; + Color c2 = tc[tc.length - 1]; + if (isPressed) { + c1 = ColorHelper.darker(c1, 5); + c2 = ColorHelper.darker(c2, 5); + } else if (isRollover) { + c1 = ColorHelper.brighter(c1, 20); + c2 = ColorHelper.brighter(c2, 20); + } + + g2D.setPaint(new GradientPaint(0, 0, c1, width, height, c2)); + g.fillRect(0, 0, width, height); + g2D.setPaint(savedPaint); + + g.setColor(getFrameColor()); + g.drawLine(1, 1, width - 2, 1); + g.drawLine(1, 1, 1, height - 3); + g.drawLine(width - 2, 1, width - 2, height - 3); + g.drawLine(2, height - 2, width - 3, height - 2); + + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + g2D.setColor(c2); + g.drawLine(2, 2, width - 3, 2); + g.drawLine(2, 3, 2, height - 3); + + g.setColor(ColorHelper.darker(c2, 40)); + g.drawLine(width - 1, 2, width - 1, height - 3); + g.drawLine(3, height - 1, width - 3, height - 1); + alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f); + g2D.setComposite(alpha); + g.drawLine(1, height - 2, 2, height - 1); + g.drawLine(width - 1, height - 2, width - 2, height - 1); + + g2D.setComposite(savedComposite); + + int x; + int y; + Icon icon; + // paint the icon + if (getDirection() == NORTH) { + icon = getUpArrowIcon(); + x = (width / 2) - (icon.getIconWidth() / 2); + y = (height / 2) - (icon.getIconHeight() / 2); + } else if (getDirection() == SOUTH) { + icon = getDownArrowIcon(); + x = (width / 2) - (icon.getIconWidth() / 2); + y = (height / 2) - (icon.getIconHeight() / 2) + 1; + } else if (getDirection() == WEST) { + icon = getLeftArrowIcon(); + x = (width / 2) - (icon.getIconWidth() / 2); + y = (height / 2) - (icon.getIconHeight() / 2); + } else { + icon = getRightArrowIcon(); + x = (width / 2) - (icon.getIconWidth() / 2) + 1; + y = (height / 2) - (icon.getIconHeight() / 2); + } + icon.paintIcon(this, g, x, y); + } + + public Dimension getPreferredSize() { + if (getDirection() == NORTH) { + return new Dimension(buttonWidth, buttonWidth); + } else if (getDirection() == SOUTH) { + return new Dimension(buttonWidth, buttonWidth); + } else if (getDirection() == EAST) { + return new Dimension(buttonWidth, buttonWidth); + } else if (getDirection() == WEST) { + return new Dimension(buttonWidth, buttonWidth); + } else { + return new Dimension(0, 0); + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiBorderFactory.java b/src/com/jtattoo/plaf/hifi/HiFiBorderFactory.java new file mode 100644 index 0000000..5a35445 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiBorderFactory.java @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.AbstractBorderFactory; +import javax.swing.border.Border; + +/** + * @author Michael Hagen + */ +public class HiFiBorderFactory implements AbstractBorderFactory { + + private static HiFiBorderFactory instance = null; + + private HiFiBorderFactory() { + } + + public static synchronized HiFiBorderFactory getInstance() { + if (instance == null) { + instance = new HiFiBorderFactory(); + } + return instance; + } + + public Border getFocusFrameBorder() { + return HiFiBorders.getFocusFrameBorder(); + } + + public Border getButtonBorder() { + return HiFiBorders.getButtonBorder(); + } + + public Border getToggleButtonBorder() { + return HiFiBorders.getToggleButtonBorder(); + } + + public Border getTextBorder() { + return HiFiBorders.getTextBorder(); + } + + public Border getSpinnerBorder() { + return HiFiBorders.getSpinnerBorder(); + } + + public Border getTextFieldBorder() { + return HiFiBorders.getTextFieldBorder(); + } + + public Border getComboBoxBorder() { + return HiFiBorders.getComboBoxBorder(); + } + + public Border getTableHeaderBorder() { + return HiFiBorders.getTableHeaderBorder(); + } + + public Border getTableScrollPaneBorder() { + return HiFiBorders.getTableScrollPaneBorder(); + } + + public Border getScrollPaneBorder() { + return HiFiBorders.getScrollPaneBorder(); + } + + public Border getTabbedPaneBorder() { + return HiFiBorders.getTabbedPaneBorder(); + } + + public Border getMenuBarBorder() { + return HiFiBorders.getMenuBarBorder(); + } + + public Border getMenuItemBorder() { + return HiFiBorders.getMenuItemBorder(); + } + + public Border getPopupMenuBorder() { + return HiFiBorders.getPopupMenuBorder(); + } + + public Border getInternalFrameBorder() { + return HiFiBorders.getInternalFrameBorder(); + } + + public Border getPaletteBorder() { + return HiFiBorders.getPaletteBorder(); + } + + public Border getToolBarBorder() { + return HiFiBorders.getToolBarBorder(); + } + + public Border getProgressBarBorder() { + return HiFiBorders.getProgressBarBorder(); + } + + public Border getDesktopIconBorder() { + return HiFiBorders.getDesktopIconBorder(); + } +} + diff --git a/src/com/jtattoo/plaf/hifi/HiFiBorders.java b/src/com/jtattoo/plaf/hifi/HiFiBorders.java new file mode 100644 index 0000000..87da22b --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiBorders.java @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.border.Border; +import javax.swing.plaf.UIResource; + +/** + * @author Michael Hagen + */ +public class HiFiBorders extends BaseBorders { + + //------------------------------------------------------------------------------------ + // Lazy access methods + //------------------------------------------------------------------------------------ + public static Border getButtonBorder() { + if (buttonBorder == null) { + buttonBorder = new ButtonBorder(); + } + return buttonBorder; + } + + public static Border getToggleButtonBorder() { + return getButtonBorder(); + } + + public static Border getRolloverToolButtonBorder() { + if (rolloverToolButtonBorder == null) { + rolloverToolButtonBorder = new RolloverToolButtonBorder(); + } + return rolloverToolButtonBorder; + } + + public static Border getScrollPaneBorder() { + if (scrollPaneBorder == null) { + scrollPaneBorder = new ScrollPaneBorder(); + } + return scrollPaneBorder; + } + + public static Border getTableScrollPaneBorder() { + if (tableScrollPaneBorder == null) { + tableScrollPaneBorder = new ScrollPaneBorder(); + } + return tableScrollPaneBorder; + } + + public static Border getInternalFrameBorder() { + if (internalFrameBorder == null) { + internalFrameBorder = new InternalFrameBorder(); + } + return internalFrameBorder; + } + + public static Border getToolBarBorder() { + if (toolBarBorder == null) { + toolBarBorder = new ToolBarBorder(); + } + return toolBarBorder; + } + +//------------------------------------------------------------------------------------ +// Implementation of border classes +//------------------------------------------------------------------------------------ + public static class ButtonBorder implements Border, UIResource { + + private static final Insets insets = new Insets(4, 8, 4, 8); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D) g; + g.translate(x, y); + + Color hiFrameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 14); + Color frameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 6); + Color loFrameColor = ColorHelper.darker(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 50); + + g.setColor(hiFrameColor); + g.drawLine(1, 0, w - 3, 0); + g.drawLine(0, 1, 0, h - 3); + g.setColor(frameColor); + g.drawLine(w - 2, 0, w - 2, h - 2); + g.drawLine(1, h - 2, w - 3, h - 2); + + Composite composite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + g2D.setColor(loFrameColor); + g.drawLine(1, 1, w - 3, 1); + g.drawLine(1, 2, 1, h - 3); + g.setColor(Color.black); + g.drawLine(w - 1, 1, w - 1, h - 1); + g.drawLine(1, h - 1, w - 1, h - 1); + alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f); + g2D.setComposite(alpha); + g.drawLine(1, h - 2, 2, h - 1); + g2D.setComposite(composite); + + g.translate(-x, -y); + } + + public Insets getBorderInsets(Component c) { + return insets; + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class ButtonBorder + +//------------------------------------------------------------------------------------------------- + public static class RolloverToolButtonBorder implements Border, UIResource { + + private static final Insets insets = new Insets(2, 2, 2, 2); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D) g; + Composite composite = g2D.getComposite(); + Color c1 = null; + Color c2 = null; + if (JTattooUtilities.isActive((JComponent) c)) { + c1 = ColorHelper.brighter(AbstractLookAndFeel.getFrameColor(), 60); + c2 = AbstractLookAndFeel.getFrameColor(); + } else { + c1 = AbstractLookAndFeel.getFrameColor(); + c2 = ColorHelper.darker(AbstractLookAndFeel.getFrameColor(), 20); + } + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f); + g2D.setComposite(alpha); + JTattooUtilities.draw3DBorder(g, c1, c2, 0, 0, w, h); + alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f); + g2D.setComposite(alpha); + JTattooUtilities.draw3DBorder(g, c2, c1, 1, 1, w - 2, h - 2); + g2D.setComposite(composite); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class RolloverToolButtonBorder + +//------------------------------------------------------------------------------------------------- + public static class ScrollPaneBorder implements Border, UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Color frameColor = AbstractLookAndFeel.getTheme().getFrameColor(); + JTattooUtilities.draw3DBorder(g, frameColor, ColorHelper.brighter(frameColor, 10), x, y, w, h); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class ScrollPaneBorder + +//------------------------------------------------------------------------------------------------- + public static class TabbedPaneBorder implements Border, UIResource { + + private static final Insets insets = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Color frameColor = AbstractLookAndFeel.getTheme().getFrameColor(); + JTattooUtilities.draw3DBorder(g, frameColor, ColorHelper.brighter(frameColor, 10), x, y, w, h); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + public boolean isBorderOpaque() { + return true; + } + } // class TabbedPaneBorder + +//------------------------------------------------------------------------------------------------- + public static class InternalFrameBorder extends BaseInternalFrameBorder { + + public InternalFrameBorder() { + insets.top = 3; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + boolean active = isActive(c); + int th = getTitleHeight(c); + Color titleColor = AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors()[0]; + Color borderColor = AbstractLookAndFeel.getWindowInactiveTitleColorDark(); + Color frameColor = AbstractLookAndFeel.getWindowInactiveBorderColor(); + if (active) { + titleColor = AbstractLookAndFeel.getTheme().getWindowTitleColors()[0]; + borderColor = AbstractLookAndFeel.getWindowTitleColorDark(); + frameColor = AbstractLookAndFeel.getWindowBorderColor(); + } + g.setColor(titleColor); + g.fillRect(x, y + 1, w, insets.top - 1); + g.setColor(borderColor); + g.fillRect(x + 1, y + h - dw, w - 2, dw - 1); + if (active) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowTitleColors(), 1, insets.top, dw, th + 1); + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowTitleColors(), w - dw, insets.top, dw, th + 1); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors(), 1, insets.top, dw - 1, th + 1); + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getWindowInactiveTitleColors(), w - dw, insets.top, dw - 1, th + 1); + } + g.setColor(borderColor); + g.fillRect(1, insets.top + th + 1, dw - 1, h - th - dw); + g.fillRect(w - dw, insets.top + th + 1, dw - 1, h - th - dw); + g.setColor(frameColor); + g.drawRect(x, y, w - 1, h - 1); + } + } // class InternalFrameBorder + + public static class ToolBarBorder extends AbstractBorder implements UIResource, SwingConstants { + + private static final LazyImageIcon HOR_RUBBER_ICON = new LazyImageIcon("hifi/icons/HorRubber.gif"); + private static final LazyImageIcon VER_RUBBER_ICON = new LazyImageIcon("hifi/icons/VerRubber.gif"); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (((JToolBar) c).isFloatable()) { + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + int x1 = 4; + int y1 = (h - HOR_RUBBER_ICON.getIconHeight()) / 2; + HOR_RUBBER_ICON.paintIcon(c, g, x1, y1); + } else { + int x1 = (w - VER_RUBBER_ICON.getIconWidth()) / 2 + 2; + int y1 = 4; + VER_RUBBER_ICON.paintIcon(c, g, x1, y1); + } + } + } + + public Insets getBorderInsets(Component c) { + Insets insets = new Insets(2, 2, 2, 2); + if (((JToolBar) c).isFloatable()) { + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + if (JTattooUtilities.isLeftToRight(c)) { + insets.left = 15; + } else { + insets.right = 15; + } + } else { + insets.top = 15; + } + } + Insets margin = ((JToolBar) c).getMargin(); + if (margin != null) { + insets.left += margin.left; + insets.top += margin.top; + insets.right += margin.right; + insets.bottom += margin.bottom; + } + return insets; + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + Insets insets = getBorderInsets(c); + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + } // class ToolBarBorder +} // class HiFiBorders + diff --git a/src/com/jtattoo/plaf/hifi/HiFiButtonUI.java b/src/com/jtattoo/plaf/hifi/HiFiButtonUI.java new file mode 100644 index 0000000..ddaebdf --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiButtonUI.java @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; + +/** + * @author Michael Hagen + */ +public class HiFiButtonUI extends BaseButtonUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiButtonUI(); + } + + protected void paintBackground(Graphics g, AbstractButton b) { + if (!b.isContentAreaFilled() || (b.getParent() instanceof JMenuBar)) { + return; + } + int width = b.getWidth(); + int height = b.getHeight(); + Graphics2D g2D = (Graphics2D) g; + Shape savedClip = g.getClip(); + if ((b.getBorder() != null) && b.isBorderPainted() && (b.getBorder() instanceof UIResource)) { + Area clipArea = new Area(new Rectangle2D.Double(1, 1, width - 2, height - 2)); + if (savedClip != null) { + clipArea.intersect(new Area(savedClip)); + } + g2D.setClip(clipArea); + } + super.paintBackground(g, b); + g2D.setClip(savedClip); + } + + protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { + ButtonModel model = b.getModel(); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + int mnemIndex; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = b.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + } + int offs = 0; + if (model.isArmed() && model.isPressed()) { + offs = 1; + } + + Graphics2D g2D = (Graphics2D) g; + Composite composite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + Color foreground = b.getForeground(); + Color background = b.getBackground(); + if (background instanceof ColorUIResource) { + if (model.isPressed() && model.isArmed()) { + foreground = AbstractLookAndFeel.getTheme().getSelectionForegroundColor(); + } else if (model.isRollover()) { + foreground = AbstractLookAndFeel.getTheme().getRolloverForegroundColor(); + } + } + if (!model.isEnabled()) { + foreground = AbstractLookAndFeel.getTheme().getDisabledForegroundColor(); + } + if (ColorHelper.getGrayValue(foreground) > 64) { + g2D.setColor(Color.black); + } else { + g2D.setColor(Color.white); + } + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs + 1, textRect.y + offs + fm.getAscent() + 1); + g2D.setComposite(composite); + g2D.setColor(foreground); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs, textRect.y + offs + fm.getAscent()); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiCheckBoxUI.java b/src/com/jtattoo/plaf/hifi/HiFiCheckBoxUI.java new file mode 100644 index 0000000..31a8e73 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiCheckBoxUI.java @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiCheckBoxUI extends HiFiRadioButtonUI { + + private static HiFiCheckBoxUI checkBoxUI = null; + + public static ComponentUI createUI(JComponent b) { + if (checkBoxUI == null) { + checkBoxUI = new HiFiCheckBoxUI(); + } + return checkBoxUI; + } + + public void installDefaults(AbstractButton b) { + super.installDefaults(b); + icon = UIManager.getIcon("CheckBox.icon"); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiComboBoxUI.java b/src/com/jtattoo/plaf/hifi/HiFiComboBoxUI.java new file mode 100644 index 0000000..778bbdc --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiComboBoxUI.java @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BaseComboBoxUI; +import com.jtattoo.plaf.NoFocusButton; +import java.awt.*; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiComboBoxUI extends BaseComboBoxUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiComboBoxUI(); + } + + public JButton createArrowButton() { + JButton button = new NoFocusButton(HiFiIcons.getComboBoxIcon()); + button.setBorder(new ArrowButtonBorder()); + return button; + } + + protected void setButtonBorder() { + } + +//-------------------------------------------------------------------------------------------------- + static class ArrowButtonBorder extends AbstractBorder { + + private static final Insets insets = new Insets(1, 3, 1, 2); + private static final Color frameLoColor = new Color(120, 120, 120); + private static final Color frameLowerColor = new Color(104, 104, 104); + private static final Color frameLowerLoColor = new Color(64, 64, 64); + private static final Color frameLowestColor = new Color(32, 32, 32); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + Graphics2D g2D = (Graphics2D) g; + g.translate(x, y); + + g.setColor(frameLoColor); + g.drawLine(1, 0, w - 1, 0); + g.drawLine(1, 1, 1, h - 2); + g.setColor(frameLowerColor); + g.drawLine(w - 1, 1, w - 1, h - 2); + g.drawLine(2, h - 1, w - 2, h - 1); + + Composite composite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + g.setColor(frameLowestColor); + g.drawLine(2, 1, w - 2, 1); + g.drawLine(2, 2, 2, h - 3); + g.setColor(frameLowerLoColor); + g.drawLine(0, 0, 0, h); + g2D.setComposite(composite); + + g.translate(-x, -y); + } + + public Insets getBorderInsets(Component c) { + return new Insets(insets.top, insets.left, insets.bottom, insets.right); + } + + public Insets getBorderInsets(Component c, Insets borderInsets) { + borderInsets.left = insets.left; + borderInsets.top = insets.top; + borderInsets.right = insets.right; + borderInsets.bottom = insets.bottom; + return borderInsets; + } + + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiDefaultTheme.java b/src/com/jtattoo/plaf/hifi/HiFiDefaultTheme.java new file mode 100644 index 0000000..ed71878 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiDefaultTheme.java @@ -0,0 +1,161 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.AbstractTheme; +import com.jtattoo.plaf.ColorHelper; +import java.awt.Color; +import java.awt.Font; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.FontUIResource; + +/** + * @author Michael Hagen + */ +public class HiFiDefaultTheme extends AbstractTheme { + + public HiFiDefaultTheme() { + super(); + // Setup theme with defaults + setUpColor(); + // Overwrite defaults with user props + loadProperties(); + // Setup the color arrays + setUpColorArrs(); + } + + public String getPropertyFileName() { + return "HiFiTheme.properties"; + } + + public void setUpColor() { + super.setUpColor(); + + // Defaults for HiFiLookAndFeel + textShadow = true; + foregroundColor = extraLightGray; + disabledForegroundColor = gray; + disabledBackgroundColor = new ColorUIResource(48, 48, 48); + + backgroundColor = new ColorUIResource(48, 48, 48); + backgroundColorLight = new ColorUIResource(48, 48, 48); + backgroundColorDark = new ColorUIResource(16, 16, 16); + alterBackgroundColor = new ColorUIResource(64, 64, 64); + selectionForegroundColor = white; + selectionBackgroundColor = new ColorUIResource(40, 40, 40); + frameColor = black; + gridColor = black; + focusCellColor = orange; + + inputBackgroundColor = new ColorUIResource(80, 80, 80); + inputForegroundColor = foregroundColor; + + rolloverForegroundColor = extraLightGray; + rolloverColor = new ColorUIResource(112, 112, 112); + rolloverColorLight = new ColorUIResource(128, 128, 128); + rolloverColorDark = new ColorUIResource(96, 96, 96); + + pressedForegroundColor = foregroundColor; + + buttonForegroundColor = foregroundColor; + buttonBackgroundColor = new ColorUIResource(96, 96, 96); + buttonColorLight = new ColorUIResource(96, 96, 96); + buttonColorDark = new ColorUIResource(32, 32, 32); + + controlForegroundColor = foregroundColor; + controlBackgroundColor = new ColorUIResource(64, 64, 64); // netbeans use this for selected tab in the toolbar + controlColorLight = new ColorUIResource(96, 96, 96); + controlColorDark = new ColorUIResource(32, 32, 32); + controlHighlightColor = new ColorUIResource(96, 96, 96); + controlShadowColor = new ColorUIResource(32, 32, 32); + controlDarkShadowColor = black; + + windowTitleForegroundColor = foregroundColor; + windowTitleBackgroundColor = new ColorUIResource(32, 32, 32); + windowTitleColorLight = new ColorUIResource(96, 96, 96); + windowTitleColorDark = new ColorUIResource(32, 32, 32);//new ColorUIResource(16, 16, 16); + windowBorderColor = black; + windowIconColor = lightGray; + windowIconShadowColor = black; + windowIconRolloverColor = orange; + + windowInactiveTitleForegroundColor = new ColorUIResource(196, 196, 196); + windowInactiveTitleBackgroundColor = new ColorUIResource(64, 64, 64); + windowInactiveTitleColorLight = new ColorUIResource(64, 64, 64); + windowInactiveTitleColorDark = new ColorUIResource(32, 32, 32); + windowInactiveBorderColor = black; + + menuForegroundColor = foregroundColor; + menuBackgroundColor = new ColorUIResource(32, 32, 32); + menuSelectionForegroundColor = white; + menuSelectionBackgroundColor = new ColorUIResource(96, 96, 96); + menuColorLight = new ColorUIResource(96, 96, 96); + menuColorDark = new ColorUIResource(32, 32, 32); + + toolbarBackgroundColor = new ColorUIResource(48, 48, 48); + toolbarColorLight = new ColorUIResource(96, 96, 96); + toolbarColorDark = new ColorUIResource(32, 32, 32); + + tabAreaBackgroundColor = backgroundColor; + tabSelectionForegroundColor = selectionForegroundColor; + + desktopColor = new ColorUIResource(64, 64, 64); + + tooltipForegroundColor = white; + tooltipBackgroundColor = new ColorUIResource(24, 24, 24); + + controlFont = new FontUIResource("Dialog", Font.BOLD, 12); + systemFont = new FontUIResource("Dialog", Font.BOLD, 12); + userFont = new FontUIResource("Dialog", Font.BOLD, 12); + menuFont = new FontUIResource("Dialog", Font.BOLD, 12); + windowTitleFont = new FontUIResource("Dialog", Font.BOLD, 12); + smallFont = new FontUIResource("Dialog", Font.PLAIN, 10); + } + + public void setUpColorArrs() { + super.setUpColorArrs(); + DEFAULT_COLORS = ColorHelper.createColorArr(controlColorLight, controlColorDark, 20); + HIDEFAULT_COLORS = ColorHelper.createColorArr(ColorHelper.brighter(controlColorLight, 15), ColorHelper.brighter(controlColorDark, 15), 20); + ACTIVE_COLORS = DEFAULT_COLORS; + INACTIVE_COLORS = ColorHelper.createColorArr(new Color(64, 64, 64), new Color(32, 32, 32), 20); + SELECTED_COLORS = HIDEFAULT_COLORS; + BUTTON_COLORS = ColorHelper.createColorArr(buttonColorLight, buttonColorDark, 20); + ROLLOVER_COLORS = HIDEFAULT_COLORS; + PRESSED_COLORS = ColorHelper.createColorArr(black, controlColorDark, 20); + + //DISABLED_COLORS = ColorHelper.createColorArr(ColorHelper.darker(controlColorLight, 10), ColorHelper.darker(controlColorDark, 10), 20); + DISABLED_COLORS = ColorHelper.createColorArr(ColorHelper.brighter(controlColorDark, 5), ColorHelper.darker(controlColorDark, 10), 20); + + WINDOW_TITLE_COLORS = ColorHelper.createColorArr(windowTitleColorLight, windowTitleColorDark, 20); + WINDOW_INACTIVE_TITLE_COLORS = ColorHelper.createColorArr(windowInactiveTitleColorLight, windowInactiveTitleColorDark, 20); + MENUBAR_COLORS = DEFAULT_COLORS; + TOOLBAR_COLORS = MENUBAR_COLORS; + TRACK_COLORS = ColorHelper.createColorArr(ColorHelper.darker(backgroundColor, 10), ColorHelper.brighter(backgroundColor, 5), 20); + SLIDER_COLORS = DEFAULT_COLORS; + PROGRESSBAR_COLORS = DEFAULT_COLORS; + THUMB_COLORS = DEFAULT_COLORS; + TAB_COLORS = DEFAULT_COLORS; + COL_HEADER_COLORS = DEFAULT_COLORS; + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiIconFactory.java b/src/com/jtattoo/plaf/hifi/HiFiIconFactory.java new file mode 100644 index 0000000..8478a5c --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiIconFactory.java @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.AbstractIconFactory; +import javax.swing.Icon; + +/** + * @author Michael Hagen + */ +public class HiFiIconFactory implements AbstractIconFactory { + + private static HiFiIconFactory instance = null; + + private HiFiIconFactory() { + } + + public static synchronized HiFiIconFactory getInstance() { + if (instance == null) { + instance = new HiFiIconFactory(); + } + return instance; + } + + public Icon getOptionPaneErrorIcon() { + return HiFiIcons.getOptionPaneErrorIcon(); + } + + public Icon getOptionPaneWarningIcon() { + return HiFiIcons.getOptionPaneWarningIcon(); + } + + public Icon getOptionPaneInformationIcon() { + return HiFiIcons.getOptionPaneInformationIcon(); + } + + public Icon getOptionPaneQuestionIcon() { + return HiFiIcons.getOptionPaneQuestionIcon(); + } + + public Icon getFileChooserUpFolderIcon() { + return HiFiIcons.getFileChooserUpFolderIcon(); + } + + public Icon getFileChooserHomeFolderIcon() { + return HiFiIcons.getFileChooserHomeFolderIcon(); + } + + public Icon getFileChooserNewFolderIcon() { + return HiFiIcons.getFileChooserNewFolderIcon(); + } + + public Icon getFileChooserListViewIcon() { + return HiFiIcons.getFileChooserListViewIcon(); + } + + public Icon getFileChooserDetailViewIcon() { + return HiFiIcons.getFileChooserDetailViewIcon(); + } + + public Icon getFileViewComputerIcon() { + return HiFiIcons.getFileViewComputerIcon(); + } + + public Icon getFileViewFloppyDriveIcon() { + return HiFiIcons.getFileViewFloppyDriveIcon(); + } + + public Icon getFileViewHardDriveIcon() { + return HiFiIcons.getFileViewHardDriveIcon(); + } + + public Icon getMenuIcon() { + return HiFiIcons.getMenuIcon(); + } + + public Icon getIconIcon() { + return HiFiIcons.getIconIcon(); + } + + public Icon getMaxIcon() { + return HiFiIcons.getMaxIcon(); + } + + public Icon getMinIcon() { + return HiFiIcons.getMinIcon(); + } + + public Icon getCloseIcon() { + return HiFiIcons.getCloseIcon(); + } + + public Icon getPaletteCloseIcon() { + return HiFiIcons.getPaletteCloseIcon(); + } + + public Icon getRadioButtonIcon() { + return HiFiIcons.getRadioButtonIcon(); + } + + public Icon getCheckBoxIcon() { + return HiFiIcons.getCheckBoxIcon(); + } + + public Icon getComboBoxIcon() { + return HiFiIcons.getComboBoxIcon(); + } + + public Icon getTreeOpenIcon() { + return HiFiIcons.getTreeOpenedIcon(); + } + + public Icon getTreeCloseIcon() { + return HiFiIcons.getTreeClosedIcon(); + } + + public Icon getTreeLeafIcon() { + return HiFiIcons.getTreeLeafIcon(); + } + + public Icon getTreeCollapsedIcon() { + return HiFiIcons.getTreeCollapsedIcon(); + } + + public Icon getTreeExpandedIcon() { + return HiFiIcons.getTreeExpandedIcon(); + } + + public Icon getMenuArrowIcon() { + return HiFiIcons.getMenuArrowIcon(); + } + + public Icon getMenuCheckBoxIcon() { + return HiFiIcons.getMenuCheckBoxIcon(); + } + + public Icon getMenuRadioButtonIcon() { + return HiFiIcons.getMenuRadioButtonIcon(); + } + + public Icon getUpArrowIcon() { + return HiFiIcons.getUpArrowIcon(); + } + + public Icon getDownArrowIcon() { + return HiFiIcons.getDownArrowIcon(); + } + + public Icon getLeftArrowIcon() { + return HiFiIcons.getLeftArrowIcon(); + } + + public Icon getRightArrowIcon() { + return HiFiIcons.getRightArrowIcon(); + } + + public Icon getSplitterDownArrowIcon() { + return HiFiIcons.getSplitterDownArrowIcon(); + } + + public Icon getSplitterHorBumpIcon() { + return HiFiIcons.getSplitterHorBumpIcon(); + } + + public Icon getSplitterLeftArrowIcon() { + return HiFiIcons.getSplitterLeftArrowIcon(); + } + + public Icon getSplitterRightArrowIcon() { + return HiFiIcons.getSplitterRightArrowIcon(); + } + + public Icon getSplitterUpArrowIcon() { + return HiFiIcons.getSplitterUpArrowIcon(); + } + + public Icon getSplitterVerBumpIcon() { + return HiFiIcons.getSplitterVerBumpIcon(); + } + + public Icon getThumbHorIcon() { + return HiFiIcons.getThumbHorIcon(); + } + + public Icon getThumbVerIcon() { + return HiFiIcons.getThumbVerIcon(); + } + + public Icon getThumbHorIconRollover() { + return HiFiIcons.getThumbHorIconRollover(); + } + + public Icon getThumbVerIconRollover() { + return HiFiIcons.getThumbVerIconRollover(); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiIcons.java b/src/com/jtattoo/plaf/hifi/HiFiIcons.java new file mode 100644 index 0000000..325e42a --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiIcons.java @@ -0,0 +1,480 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.io.Serializable; +import javax.swing.*; +import javax.swing.plaf.UIResource; + +/** + * @author Michael Hagen + */ +public class HiFiIcons extends BaseIcons { + + public static Icon getComboBoxIcon() { + return getDownArrowIcon(); + } + + public static Icon getIconIcon() { + if (iconIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + iconIcon = new MacIconIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconShadowColor = AbstractLookAndFeel.getTheme().getWindowIconShadowColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + iconIcon = new BaseIcons.IconSymbol(iconColor, iconShadowColor, iconRolloverColor, new Insets(-1, -1, 0, 0)); + } + } + return iconIcon; + } + + public static Icon getMinIcon() { + if (minIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + minIcon = new MacMinIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconShadowColor = AbstractLookAndFeel.getTheme().getWindowIconShadowColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + minIcon = new BaseIcons.MinSymbol(iconColor, iconShadowColor, iconRolloverColor, new Insets(-1, -1, 0, 0)); + } + } + return minIcon; + } + + public static Icon getMaxIcon() { + if (maxIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + maxIcon = new MacMaxIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconShadowColor = AbstractLookAndFeel.getTheme().getWindowIconShadowColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + maxIcon = new BaseIcons.MaxSymbol(iconColor, iconShadowColor, iconRolloverColor, new Insets(-1, -1, 0, 0)); + } + } + return maxIcon; + } + + public static Icon getCloseIcon() { + if (closeIcon == null) { + if (AbstractLookAndFeel.getTheme().isMacStyleWindowDecorationOn()) { + closeIcon = new MacCloseIcon(); + } else { + Color iconColor = AbstractLookAndFeel.getTheme().getWindowIconColor(); + Color iconShadowColor = AbstractLookAndFeel.getTheme().getWindowIconShadowColor(); + Color iconRolloverColor = AbstractLookAndFeel.getTheme().getWindowIconRolloverColor(); + closeIcon = new BaseIcons.CloseSymbol(iconColor, iconShadowColor, iconRolloverColor, new Insets(-1, -1, 0, 0)); + } + } + return closeIcon; + } + + public static Icon getRadioButtonIcon() { + if (radioButtonIcon == null) { + radioButtonIcon = new RadioButtonIcon(); + } + return radioButtonIcon; + } + + public static Icon getCheckBoxIcon() { + if (checkBoxIcon == null) { + checkBoxIcon = new CheckBoxIcon(); + } + return checkBoxIcon; + } + + public static Icon getTreeExpandedIcon() { + if (treeExpandedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeExpandedIcon = new LazyImageIcon("hifi/icons/small/tree_expanded_9x9.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeExpandedIcon = new LazyImageIcon("hifi/icons/medium/tree_expanded_11x11.png"); + } else { + treeExpandedIcon = new LazyImageIcon("hifi/icons/large/tree_expanded_14x14.png"); + } + } + return treeExpandedIcon; + } + + public static Icon getTreeCollapsedIcon() { + if (treeCollapsedIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + treeCollapsedIcon = new LazyImageIcon("hifi/icons/small/tree_collapsed_9x9.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + treeCollapsedIcon = new LazyImageIcon("hifi/icons/medium/tree_collapsed_11x11.png"); + } else { + treeCollapsedIcon = new LazyImageIcon("hifi/icons/large/tree_collapsed_14x14.png"); + } + } + return treeCollapsedIcon; + } + + public static Icon getMenuArrowIcon() { + if (menuArrowIcon == null) { + menuArrowIcon = new LazyMenuArrowImageIcon("hifi/icons/medium/arrow_right_8x9.png", "hifi/icons/medium/arrow_left8x9.png"); + } + return menuArrowIcon; + } + + public static Icon getSplitterUpArrowIcon() { + if (splitterUpArrowIcon == null) { + splitterUpArrowIcon = new LazyImageIcon("hifi/icons/SplitterUpArrow.gif"); + } + return splitterUpArrowIcon; + } + + public static Icon getSplitterDownArrowIcon() { + if (splitterDownArrowIcon == null) { + splitterDownArrowIcon = new LazyImageIcon("hifi/icons/SplitterDownArrow.gif"); + } + return splitterDownArrowIcon; + } + + public static Icon getSplitterLeftArrowIcon() { + if (splitterLeftArrowIcon == null) { + splitterLeftArrowIcon = new LazyImageIcon("hifi/icons/SplitterLeftArrow.gif"); + } + return splitterLeftArrowIcon; + } + + public static Icon getSplitterRightArrowIcon() { + if (splitterRightArrowIcon == null) { + splitterRightArrowIcon = new LazyImageIcon("hifi/icons/SplitterRightArrow.gif"); + } + return splitterRightArrowIcon; + } + + public static Icon getSplitterHorBumpIcon() { + if (splitterHorBumpIcon == null) { + splitterHorBumpIcon = new LazyImageIcon("hifi/icons/SplitterHorBumps.gif"); + } + return splitterHorBumpIcon; + } + + public static Icon getSplitterVerBumpIcon() { + if (splitterVerBumpIcon == null) { + splitterVerBumpIcon = new LazyImageIcon("hifi/icons/SplitterVerBumps.gif"); + } + return splitterVerBumpIcon; + } + + public static Icon getThumbHorIcon() { + if (thumbHorIcon == null) { + thumbHorIcon = new LazyImageIcon("hifi/icons/thumb_hor.gif"); + } + return thumbHorIcon; + } + + public static Icon getThumbVerIcon() { + if (thumbVerIcon == null) { + thumbVerIcon = new LazyImageIcon("hifi/icons/thumb_ver.gif"); + } + return thumbVerIcon; + } + + public static Icon getThumbHorIconRollover() { + if (thumbHorIconRollover == null) { + thumbHorIconRollover = new LazyImageIcon("hifi/icons/thumb_hor_rollover.gif"); + } + return thumbHorIconRollover; + } + + public static Icon getThumbVerIconRollover() { + if (thumbVerIconRollover == null) { + thumbVerIconRollover = new LazyImageIcon("hifi/icons/thumb_ver_rollover.gif"); + } + return thumbVerIconRollover; + } + + public static Icon getUpArrowIcon() { + if (upArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + upArrowIcon = new LazyImageIcon("hifi/icons/small/arrow_up_7x6.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + upArrowIcon = new LazyImageIcon("hifi/icons/medium/arrow_up_9x8.png"); + } else { + upArrowIcon = new LazyImageIcon("hifi/icons/large/arrow_up_11x10.png"); + } + } + return upArrowIcon; + } + + public static Icon getDownArrowIcon() { + if (downArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + downArrowIcon = new LazyImageIcon("hifi/icons/small/arrow_down_7x6.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + downArrowIcon = new LazyImageIcon("hifi/icons/medium/arrow_down_9x8.png"); + } else { + downArrowIcon = new LazyImageIcon("hifi/icons/large/arrow_down_11x10.png"); + } + } + return downArrowIcon; + } + + public static Icon getLeftArrowIcon() { + if (leftArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + leftArrowIcon = new LazyImageIcon("hifi/icons/small/arrow_left_6x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + leftArrowIcon = new LazyImageIcon("hifi/icons/medium/arrow_left_8x9.png"); + } else { + leftArrowIcon = new LazyImageIcon("hifi/icons/large/arrow_left_10x11.png"); + } + } + return leftArrowIcon; + } + + public static Icon getRightArrowIcon() { + if (rightArrowIcon == null) { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + rightArrowIcon = new LazyImageIcon("hifi/icons/small/arrow_right_6x7.png"); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + rightArrowIcon = new LazyImageIcon("hifi/icons/medium/arrow_right_8x9.png"); + } else { + rightArrowIcon = new LazyImageIcon("hifi/icons/large/arrow_right_10x11.png"); + } + } + return rightArrowIcon; + } + +//---------------------------------------------------------------------------------------------------------------------- +// inner classes +//---------------------------------------------------------------------------------------------------------------------- + + private static class CheckBoxIcon implements Icon, UIResource, Serializable { + + private static final int GAP = 2; + private static final Icon SMALL_CHECK_ICON = new LazyImageIcon("hifi/icons/small/check_symbol_12x11.png"); + private static final Icon SMALL_CHECK_INVERSE_ICON = new LazyImageIcon("icons/small/check_symbol_10x10.png"); + private static final Icon SMALL_CHECK_DISABLED_ICON = new LazyImageIcon("icons/small/check_symbol_disabled_10x10.png"); + private static final Icon MEDIUM_CHECK_ICON = new LazyImageIcon("hifi/icons/medium/check_symbol_14x13.png"); + private static final Icon MEDIUM_CHECK_INVERSE_ICON = new LazyImageIcon("icons/medium/check_symbol_12x12.png"); + private static final Icon MEDIUM_CHECK_DISABLED_ICON = new LazyImageIcon("icons/medium/check_symbol_disabled_12x12.png"); + private static final Icon LARGE_CHECK_ICON = new LazyImageIcon("hifi/icons/large/check_symbol_16x15.png"); + private static final Icon LARGE_CHECK_INVERSE_ICON = new LazyImageIcon("icons/large/check_symbol_14x14.png"); + private static final Icon LARGE_CHECK_DISABLED_ICON = new LazyImageIcon("icons/large/check_symbol_disabled_14x14.png"); + + public void paintIcon(Component c, Graphics g, int x, int y) { + if (!JTattooUtilities.isLeftToRight(c)) { + x += GAP; + } + int w = getIconWidth() - GAP; + int h = getIconHeight(); + AbstractButton button = (AbstractButton) c; + ButtonModel model = button.getModel(); + Graphics2D g2D = (Graphics2D) g; + if (button.isEnabled()) { + if ((button.isRolloverEnabled() && model.isRollover())) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getRolloverColors(), x + 1, y + 1, w - 1, h - 1); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getFocusColors(), x + 1, y + 1, w - 1, h - 1); + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getCheckBoxColors(), x + 1, y + 1, w - 1, h - 1); + } + } + } else { + JTattooUtilities.fillHorGradient(g, AbstractLookAndFeel.getTheme().getDisabledColors(), x + 1, y + 1, w - 1, h - 1); + } + + Color frameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 6); + Color loFrameColor = ColorHelper.darker(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 50); + + g.setColor(frameColor); + g.drawRect(x, y, w, h); + Composite savedComposite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + g2D.setComposite(alpha); + g.setColor(loFrameColor); + g.drawLine(x + 1, y + 1, x + w - 1, y + 1); + g.drawLine(x + 1, y + 1, x + 1, y + h - 1); + g2D.setComposite(savedComposite); + + Icon checkIcon; + Icon checkDisabledIcon; + Icon checkInverseIcon; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + checkIcon = SMALL_CHECK_ICON; + checkDisabledIcon = SMALL_CHECK_DISABLED_ICON; + checkInverseIcon = SMALL_CHECK_INVERSE_ICON; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + checkIcon = MEDIUM_CHECK_ICON; + checkDisabledIcon = MEDIUM_CHECK_DISABLED_ICON; + checkInverseIcon = MEDIUM_CHECK_INVERSE_ICON; + } else { + checkIcon = LARGE_CHECK_ICON; + checkDisabledIcon = LARGE_CHECK_DISABLED_ICON; + checkInverseIcon = LARGE_CHECK_INVERSE_ICON; + } + int xi = x + ((w - checkIcon.getIconWidth()) / 2) + 1; + int yi = y + ((h - checkIcon.getIconHeight()) / 2); + int gv = ColorHelper.getGrayValue(AbstractLookAndFeel.getButtonForegroundColor()); + if (model.isPressed() && model.isArmed()) { + Color bc = gv > 128 ? AbstractLookAndFeel.getTheme().getSelectionForegroundColor() : AbstractLookAndFeel.getTheme().getSelectionBackgroundColor(); + Color fc = gv > 128 ? ColorHelper.brighter(bc, 20) : ColorHelper.darker(bc, 40); + g.setColor(fc); + g.drawRect(x + 4, y + 4, w - 8, h - 8); + g.setColor(bc); + g.fillRect(x + 5, y + 5, w - 9, h - 9); + } else if (model.isSelected()) { + if (!model.isEnabled()) { + checkDisabledIcon.paintIcon(c, g, xi + 1, yi); + } else { + if (gv > 128) { + checkIcon.paintIcon(c, g, xi, yi); + } else { + checkInverseIcon.paintIcon(c, g, xi + 1, yi + 1); + } + } + } + } + + public int getIconWidth() { + int w; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + w = 15; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + w = 17; + } else { + w = 19; + } + return w + GAP; + } + + public int getIconHeight() { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + return 15; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + return 17; + } else { + return 19; + } + } + } + +//---------------------------------------------------------------------------------------------------------------------- + private static class RadioButtonIcon implements Icon, UIResource, Serializable { + + private static final int GAP = 2; + + public void paintIcon(Component c, Graphics g, int x, int y) { + if (!JTattooUtilities.isLeftToRight(c)) { + x += GAP; + } + int w = getIconWidth() - GAP; + int h = getIconHeight(); + + Graphics2D g2D = (Graphics2D) g; + AbstractButton button = (AbstractButton) c; + ButtonModel model = button.getModel(); + Color colors[]; + if (button.isEnabled()) { + if ((button.isRolloverEnabled() && model.isRollover()) || (model.isPressed() && model.isArmed())) { + colors = AbstractLookAndFeel.getTheme().getRolloverColors(); + } else { + if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) { + colors = AbstractLookAndFeel.getTheme().getFocusColors(); + } else { + colors = AbstractLookAndFeel.getTheme().getCheckBoxColors(); + } + } + } else { + colors = AbstractLookAndFeel.getTheme().getDisabledColors(); + } + + Color frameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 6); + Shape savedClip = g.getClip(); + Area clipArea = new Area(new Ellipse2D.Double(x, y, w + 1, h + 1)); + if (savedClip != null) { + clipArea.intersect(new Area(savedClip)); + } + g2D.setClip(clipArea); + JTattooUtilities.fillHorGradient(g, colors, x, y, w, h); + g2D.setClip(savedClip); + + Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(frameColor); + g.drawOval(x, y, w, h); + + if (model.isSelected()) { + if (model.isEnabled()) { + Color fc = AbstractLookAndFeel.getForegroundColor(); + if (ColorHelper.getGrayValue(colors[0]) < 128) { + if (ColorHelper.getGrayValue(fc) < 128) { + g2D.setColor(Color.white); + } else { + g2D.setColor(fc); + } + } else { + if (ColorHelper.getGrayValue(fc) > 128) { + g2D.setColor(Color.black); + } else { + g2D.setColor(fc); + } + } + } else { + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + } + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + g2D.fillOval(x + 4, y + 4, w - 7, h - 7); + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + g2D.fillOval(x + 4, y + 4, w - 7, h - 7); + } else { + g2D.fillOval(x + 5, y + 5, w - 9, h - 9); + } + } + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint); + } + + public int getIconWidth() { + int w; + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + w = 14; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + w = 16; + } else { + w = 18; + } + return w + GAP; + } + + public int getIconHeight() { + if (AbstractLookAndFeel.getTheme().isSmallFontSize()) { + return 14; + } else if (AbstractLookAndFeel.getTheme().isMediumFontSize()) { + return 16; + } else { + return 18; + } + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiInternalFrameTitlePane.java b/src/com/jtattoo/plaf/hifi/HiFiInternalFrameTitlePane.java new file mode 100644 index 0000000..1184ccb --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiInternalFrameTitlePane.java @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.JInternalFrame; + +/** + * @author Michael Hagen + */ +public class HiFiInternalFrameTitlePane extends BaseInternalFrameTitlePane { + + public HiFiInternalFrameTitlePane(JInternalFrame f) { + super(f); + } + + protected boolean centerButtons() { + return false; + } + + public void paintText(Graphics g, int x, int y, String title) { + g.setColor(Color.black); + JTattooUtilities.drawString(frame, g, title, x + 1, y); + if (isActive()) { + g.setColor(AbstractLookAndFeel.getWindowTitleForegroundColor()); + } else { + g.setColor(AbstractLookAndFeel.getWindowInactiveTitleForegroundColor()); + } + JTattooUtilities.drawString(frame, g, title, x, y - 1); + } + + public void paintBorder(Graphics g) { + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiInternalFrameUI.java b/src/com/jtattoo/plaf/hifi/HiFiInternalFrameUI.java new file mode 100644 index 0000000..3d946e4 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiInternalFrameUI.java @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BaseInternalFrameUI; +import javax.swing.JComponent; +import javax.swing.JInternalFrame; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiInternalFrameUI extends BaseInternalFrameUI { + + public HiFiInternalFrameUI(JInternalFrame b) { + super(b); + } + + public static ComponentUI createUI(JComponent c) { + return new HiFiInternalFrameUI((JInternalFrame) c); + } + + protected JComponent createNorthPane(JInternalFrame w) { + titlePane = new HiFiInternalFrameTitlePane(w); + return titlePane; + } +} + diff --git a/src/com/jtattoo/plaf/hifi/HiFiLabelUI.java b/src/com/jtattoo/plaf/hifi/HiFiLabelUI.java new file mode 100644 index 0000000..6476882 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiLabelUI.java @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicLabelUI; + +/** + * @author Michael Hagen + */ +public class HiFiLabelUI extends BasicLabelUI { + + private static HiFiLabelUI hifiLabelUI = null; + + public static ComponentUI createUI(JComponent c) { + if (hifiLabelUI == null) { + hifiLabelUI = new HiFiLabelUI(); + } + return hifiLabelUI; + } + + protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int mnemIndex = -1; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = l.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(l.getText(), l.getDisplayedMnemonic()); + } + Color fc = l.getForeground(); + if (AbstractLookAndFeel.getTheme().isTextShadowOn() && ColorHelper.getGrayValue(fc) > 128) { + g.setColor(Color.black); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX + 1, textY + 1); + } + g.setColor(fc); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX, textY); + } + + protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int mnemIndex = -1; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = l.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(l.getText(), l.getDisplayedMnemonic()); + } + g.setColor(Color.black); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX + 1, textY + 1); + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(l, g, s, mnemIndex, textX, textY); + } +} + diff --git a/src/com/jtattoo/plaf/hifi/HiFiLookAndFeel.java b/src/com/jtattoo/plaf/hifi/HiFiLookAndFeel.java new file mode 100644 index 0000000..230c141 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiLookAndFeel.java @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.util.*; +import javax.swing.UIDefaults; + +/** + * @author Michael Hagen + */ +public class HiFiLookAndFeel extends AbstractLookAndFeel { + + private static HiFiDefaultTheme myTheme = null; + + private static final ArrayList themesList = new ArrayList(); + private static final HashMap themesMap = new HashMap(); + private static final Properties defaultProps = new Properties(); + private static final Properties smallFontProps = new Properties(); + private static final Properties largeFontProps = new Properties(); + private static final Properties giantFontProps = new Properties(); + + static { + smallFontProps.setProperty("controlTextFont", "Dialog bold 10"); + smallFontProps.setProperty("systemTextFont", "Dialog bold 10"); + smallFontProps.setProperty("userTextFont", "Dialog 10"); + smallFontProps.setProperty("menuTextFont", "Dialog bold 10"); + smallFontProps.setProperty("windowTitleFont", "Dialog bold 10"); + smallFontProps.setProperty("subTextFont", "Dialog 8"); + + largeFontProps.setProperty("controlTextFont", "Dialog bold 14"); + largeFontProps.setProperty("systemTextFont", "Dialog bold 14"); + largeFontProps.setProperty("userTextFont", "Dialog bold 14"); + largeFontProps.setProperty("menuTextFont", "Dialog bold 14"); + largeFontProps.setProperty("windowTitleFont", "Dialog bold 14"); + largeFontProps.setProperty("subTextFont", "Dialog 12"); + + giantFontProps.setProperty("controlTextFont", "Dialog 18"); + giantFontProps.setProperty("systemTextFont", "Dialog 18"); + giantFontProps.setProperty("userTextFont", "Dialog 18"); + giantFontProps.setProperty("menuTextFont", "Dialog 18"); + giantFontProps.setProperty("windowTitleFont", "Dialog 18"); + giantFontProps.setProperty("subTextFont", "Dialog 16"); + + themesList.add("Default"); + themesList.add("Small-Font"); + themesList.add("Large-Font"); + themesList.add("Giant-Font"); + + themesMap.put("Default", defaultProps); + themesMap.put("Small-Font", smallFontProps); + themesMap.put("Large-Font", largeFontProps); + themesMap.put("Giant-Font", giantFontProps); + } + + public static java.util.List getThemes() { + return themesList; + } + + public static Properties getThemeProperties(String name) { + return ((Properties) themesMap.get(name)); + } + + public static void setTheme(String name) { + setTheme((Properties) themesMap.get(name)); + if (myTheme != null) { + AbstractTheme.setInternalName(name); + } + } + + public static void setTheme(String name, String licenseKey, String logoString) { + Properties props = (Properties) themesMap.get(name); + if (props != null) { + props.put("licenseKey", licenseKey); + props.put("logoString", logoString); + setTheme(props); + if (myTheme != null) { + AbstractTheme.setInternalName(name); + } + } + } + + public static void setTheme(Properties themesProps) { + currentThemeName = "hifiTheme"; + if (myTheme == null) { + myTheme = new HiFiDefaultTheme(); + } + if ((myTheme != null) && (themesProps != null)) { + myTheme.setUpColor(); + myTheme.setProperties(themesProps); + myTheme.setUpColorArrs(); + AbstractLookAndFeel.setTheme(myTheme); + } + } + + public static void setCurrentTheme(Properties themesProps) { + setTheme(themesProps); + } + + public String getName() { + return "HiFi"; + } + + public String getID() { + return "HiFi"; + } + + public String getDescription() { + return "The HiFi Look and Feel"; + } + + public boolean isNativeLookAndFeel() { + return false; + } + + public boolean isSupportedLookAndFeel() { + return true; + } + + public AbstractBorderFactory getBorderFactory() { + return HiFiBorderFactory.getInstance(); + } + + public AbstractIconFactory getIconFactory() { + return HiFiIconFactory.getInstance(); + } + + protected void createDefaultTheme() { + if (myTheme == null) { + myTheme = new HiFiDefaultTheme(); + } + setTheme(myTheme); + } + + protected void initComponentDefaults(UIDefaults table) { + super.initComponentDefaults(table); + table.put("ScrollBar.incrementButtonGap", -1); + table.put("ScrollBar.decrementButtonGap", -1); + } + + protected void initClassDefaults(UIDefaults table) { + if (!"hifiTheme".equals(currentThemeName)) { + setTheme("Default"); + } + super.initClassDefaults(table); + Object[] uiDefaults = { + // BaseLookAndFeel classes + "SeparatorUI", BaseSeparatorUI.class.getName(), + "TextFieldUI", BaseTextFieldUI.class.getName(), + "TextAreaUI", BaseTextAreaUI.class.getName(), + "EditorPaneUI", BaseEditorPaneUI.class.getName(), + "PasswordFieldUI", BasePasswordFieldUI.class.getName(), + "ToolTipUI", BaseToolTipUI.class.getName(), + "TreeUI", BaseTreeUI.class.getName(), + "TableUI", BaseTableUI.class.getName(), + "TableHeaderUI", BaseTableHeaderUI.class.getName(), + "SplitPaneUI", BaseSplitPaneUI.class.getName(), + "ProgressBarUI", BaseProgressBarUI.class.getName(), + "FileChooserUI", BaseFileChooserUI.class.getName(), + "MenuUI", BaseMenuUI.class.getName(), + "PopupMenuUI", BasePopupMenuUI.class.getName(), + "MenuItemUI", BaseMenuItemUI.class.getName(), + "CheckBoxMenuItemUI", BaseCheckBoxMenuItemUI.class.getName(), + "RadioButtonMenuItemUI", BaseRadioButtonMenuItemUI.class.getName(), + "PopupMenuSeparatorUI", BaseSeparatorUI.class.getName(), + "DesktopPaneUI", BaseDesktopPaneUI.class.getName(), + + // HiFiLookAndFeel classes + "LabelUI", HiFiLabelUI.class.getName(), + "CheckBoxUI", HiFiCheckBoxUI.class.getName(), + "RadioButtonUI", HiFiRadioButtonUI.class.getName(), + "ButtonUI", HiFiButtonUI.class.getName(), + "ToggleButtonUI", HiFiToggleButtonUI.class.getName(), + "ComboBoxUI", HiFiComboBoxUI.class.getName(), + "SliderUI", HiFiSliderUI.class.getName(), + "PanelUI", HiFiPanelUI.class.getName(), + "ScrollPaneUI", HiFiScrollPaneUI.class.getName(), + "TabbedPaneUI", HiFiTabbedPaneUI.class.getName(), + "ScrollBarUI", HiFiScrollBarUI.class.getName(), + "ToolBarUI", HiFiToolBarUI.class.getName(), + "MenuBarUI", HiFiMenuBarUI.class.getName(), + "InternalFrameUI", HiFiInternalFrameUI.class.getName(), + "RootPaneUI", HiFiRootPaneUI.class.getName(),}; + table.putDefaults(uiDefaults); + if (JTattooUtilities.getJavaVersion() >= 1.5) { + table.put("FormattedTextFieldUI", BaseFormattedTextFieldUI.class.getName()); + table.put("SpinnerUI", BaseSpinnerUI.class.getName()); + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiMenuBarUI.java b/src/com/jtattoo/plaf/hifi/HiFiMenuBarUI.java new file mode 100644 index 0000000..ab406ef --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiMenuBarUI.java @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.JMenuBar; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicMenuBarUI; + + +/** + * @author Michael Hagen + */ +public class HiFiMenuBarUI extends BasicMenuBarUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiMenuBarUI(); + } + + public void installUI(JComponent c) { + super.installUI(c); + if ((c != null) && (c instanceof JMenuBar)) { + ((JMenuBar) c).setBorder(HiFiBorders.getMenuBarBorder()); + } + } + + public void paint(Graphics g, JComponent c) { + HiFiUtils.fillComponent(g, c); + } +} \ No newline at end of file diff --git a/src/com/jtattoo/plaf/hifi/HiFiPanelUI.java b/src/com/jtattoo/plaf/hifi/HiFiPanelUI.java new file mode 100644 index 0000000..bb063bb --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiPanelUI.java @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BasePanelUI; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiPanelUI extends BasePanelUI { + + private static HiFiPanelUI panelUI = null; + + public static ComponentUI createUI(JComponent c) { + if (panelUI == null) { + panelUI = new HiFiPanelUI(); + } + return panelUI; + } + + public void update(Graphics g, JComponent c) { + if (c.isOpaque() && c.getBackground() instanceof ColorUIResource && c.getClientProperty("backgroundTexture") == null) { + HiFiUtils.fillComponent(g, c); + } else { + super.update(g, c); + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiRadioButtonUI.java b/src/com/jtattoo/plaf/hifi/HiFiRadioButtonUI.java new file mode 100644 index 0000000..554a5fd --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiRadioButtonUI.java @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; + +/** + * @author Michael Hagen + */ +public class HiFiRadioButtonUI extends BaseRadioButtonUI { + + private static HiFiRadioButtonUI radioButtonUI = null; + + public static ComponentUI createUI(JComponent c) { + if (radioButtonUI == null) { + radioButtonUI = new HiFiRadioButtonUI(); + } + return radioButtonUI; + } + + protected void paintText(Graphics g, JComponent c, String text, Rectangle textRect) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + v.paint(g, textRect); + } else { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + int mnemIndex = -1; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = b.getDisplayedMnemonicIndex(); + } else { + mnemIndex = JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + } + g.setFont(b.getFont()); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + if (model.isEnabled()) { + Color fc = b.getForeground(); + if (AbstractLookAndFeel.getTheme().isTextShadowOn() && ColorHelper.getGrayValue(fc) > 128) { + g.setColor(Color.black); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x + 1, textRect.y + 1 + fm.getAscent()); + } + g.setColor(fc); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } else { + g.setColor(Color.black); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x + 1, textRect.y + 1 + fm.getAscent()); + g.setColor(AbstractLookAndFeel.getDisabledForegroundColor()); + JTattooUtilities.drawStringUnderlineCharAt(c, g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + } + + public void paintBackground(Graphics g, JComponent c) { + if (c.isOpaque()) { + if ((c.getBackground() instanceof ColorUIResource) && c.getBackground().equals(AbstractLookAndFeel.getBackgroundColor())) { + HiFiUtils.fillComponent(g, c); + } else { + g.setColor(c.getBackground()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiRootPaneUI.java b/src/com/jtattoo/plaf/hifi/HiFiRootPaneUI.java new file mode 100644 index 0000000..4a7b17d --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiRootPaneUI.java @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BaseRootPaneUI; +import javax.swing.JComponent; +import javax.swing.JRootPane; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiRootPaneUI extends BaseRootPaneUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiRootPaneUI(); + } + + public JComponent createTitlePane(JRootPane root) { + return new HiFiTitlePane(root, this); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiScrollBarUI.java b/src/com/jtattoo/plaf/hifi/HiFiScrollBarUI.java new file mode 100644 index 0000000..29d4177 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiScrollBarUI.java @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.Color; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; + +/** + * + * @author Michael Hagen + */ +public class HiFiScrollBarUI extends XPScrollBarUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiScrollBarUI(); + } + + protected void installDefaults() { + super.installDefaults(); + Color colors[] = AbstractLookAndFeel.getTheme().getThumbColors(); + rolloverColors = new Color[colors.length]; + dragColors = new Color[colors.length]; + for (int i = 0; i < colors.length; i++) { + rolloverColors[i] = ColorHelper.brighter(colors[i], 8); + dragColors[i] = ColorHelper.darker(colors[i], 8); + } + } + + protected JButton createDecreaseButton(int orientation) { + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + return super.createDecreaseButton(orientation); + } else { + return new HiFiScrollButton(orientation, scrollBarWidth); + } + } + + protected JButton createIncreaseButton(int orientation) { + if (AbstractLookAndFeel.getTheme().isMacStyleScrollBarOn()) { + return super.createIncreaseButton(orientation); + } else { + return new HiFiScrollButton(orientation, scrollBarWidth); + } + } + + protected Color getFrameColor() { + Color frameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 8); + if (isDragging) { + return ColorHelper.darker(frameColor, 8); + } else if (isRollover) { + return ColorHelper.brighter(frameColor, 16); + } else { + return frameColor; + } + } + +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiScrollButton.java b/src/com/jtattoo/plaf/hifi/HiFiScrollButton.java new file mode 100644 index 0000000..c254421 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiScrollButton.java @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.Color; + +/** + * @author Michael Hagen + */ +public class HiFiScrollButton extends XPScrollButton { + + public HiFiScrollButton(int direction, int width) { + super(direction, width); + } + + public Color getFrameColor() { + Color frameColor = ColorHelper.brighter(AbstractLookAndFeel.getTheme().getButtonBackgroundColor(), 8); + if (getModel().isPressed()) { + return ColorHelper.darker(frameColor, 8); + } else if (getModel().isRollover()) { + return ColorHelper.brighter(frameColor, 16); + } else { + return frameColor; + } + } + +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiScrollPaneUI.java b/src/com/jtattoo/plaf/hifi/HiFiScrollPaneUI.java new file mode 100644 index 0000000..af97343 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiScrollPaneUI.java @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BaseScrollPaneUI; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiScrollPaneUI extends BaseScrollPaneUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiScrollPaneUI(); + } + + public void installDefaults(JScrollPane p) { + super.installDefaults(p); + p.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiSliderUI.java b/src/com/jtattoo/plaf/hifi/HiFiSliderUI.java new file mode 100644 index 0000000..f245cf0 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiSliderUI.java @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.BaseSliderUI; +import java.awt.Component; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.JSlider; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiSliderUI extends BaseSliderUI { + + public HiFiSliderUI(JSlider slider) { + super(slider); + } + + public static ComponentUI createUI(JComponent c) { + return new HiFiSliderUI((JSlider) c); + } + + public void paintBackground(Graphics g, JComponent c) { + if (c.isOpaque()) { + Component parent = c.getParent(); + if ((parent != null) && (parent.getBackground() instanceof ColorUIResource)) { + HiFiUtils.fillComponent(g, c); + } else { + if (parent != null) { + g.setColor(parent.getBackground()); + } else { + g.setColor(c.getBackground()); + } + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiTabbedPaneUI.java b/src/com/jtattoo/plaf/hifi/HiFiTabbedPaneUI.java new file mode 100644 index 0000000..91ec0fb --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiTabbedPaneUI.java @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.text.View; + +/** + * @author Michael Hagen + */ +public class HiFiTabbedPaneUI extends BaseTabbedPaneUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiTabbedPaneUI(); + } + + protected Color[] getContentBorderColors(int tabPlacement) { + Color SEP_COLORS[] = { + ColorHelper.darker(AbstractLookAndFeel.getBackgroundColor(), 40), + ColorHelper.brighter(AbstractLookAndFeel.getBackgroundColor(), 20), + ColorHelper.darker(AbstractLookAndFeel.getBackgroundColor(), 20), + ColorHelper.darker(AbstractLookAndFeel.getBackgroundColor(), 40), + ColorHelper.darker(AbstractLookAndFeel.getBackgroundColor(), 60), + }; + return SEP_COLORS; + } + + protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) { + Color backColor = tabPane.getBackgroundAt(tabIndex); + if (!(backColor instanceof UIResource)) { + super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect, isSelected); + return; + } + g.setFont(font); + View v = getTextViewForTab(tabIndex); + if (v != null) { + // html + Graphics2D g2D = (Graphics2D) g; + Object savedRenderingHint = null; + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + savedRenderingHint = g2D.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING); + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AbstractLookAndFeel.getTheme().getTextAntiAliasingHint()); + } + v.paint(g, textRect); + if (AbstractLookAndFeel.getTheme().isTextAntiAliasingOn()) { + g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, savedRenderingHint); + } + } else { + // plain text + int mnemIndex = -1; + if (JTattooUtilities.getJavaVersion() >= 1.4) { + mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex); + } + + Graphics2D g2D = (Graphics2D) g; + Composite composite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + Color fc = tabPane.getForegroundAt(tabIndex); + if (isSelected) { + fc = AbstractLookAndFeel.getTheme().getTabSelectionForegroundColor(); + } + if (!tabPane.isEnabled() || !tabPane.isEnabledAt(tabIndex)) { + fc = AbstractLookAndFeel.getTheme().getDisabledForegroundColor(); + } + if (ColorHelper.getGrayValue(fc) > 128) { + g2D.setColor(Color.black); + } else { + g2D.setColor(Color.white); + } + JTattooUtilities.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x + 1, textRect.y + 1 + metrics.getAscent()); + g2D.setComposite(composite); + g2D.setColor(fc); + JTattooUtilities.drawStringUnderlineCharAt(tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent()); + } + } + +} \ No newline at end of file diff --git a/src/com/jtattoo/plaf/hifi/HiFiTitlePane.java b/src/com/jtattoo/plaf/hifi/HiFiTitlePane.java new file mode 100644 index 0000000..42adf50 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiTitlePane.java @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.JRootPane; + +/** + * @author Michael Hagen + */ +public class HiFiTitlePane extends BaseTitlePane { + + public HiFiTitlePane(JRootPane root, BaseRootPaneUI ui) { + super(root, ui); + } + + protected boolean centerButtons() { + return false; + } + + public void paintText(Graphics g, int x, int y, String title) { + g.setColor(Color.black); + JTattooUtilities.drawString(rootPane, g, title, x + 1, y + 1); + if (isActive()) { + g.setColor(AbstractLookAndFeel.getWindowTitleForegroundColor()); + } else { + g.setColor(AbstractLookAndFeel.getWindowInactiveTitleForegroundColor()); + } + JTattooUtilities.drawString(rootPane, g, title, x, y); + } + + protected void paintBorder(Graphics g) { + } + +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiToggleButtonUI.java b/src/com/jtattoo/plaf/hifi/HiFiToggleButtonUI.java new file mode 100644 index 0000000..e2ccd52 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiToggleButtonUI.java @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.*; +import java.awt.*; +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiToggleButtonUI extends BaseToggleButtonUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiToggleButtonUI(); + } + + protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { + ButtonModel model = b.getModel(); + FontMetrics fm = JTattooUtilities.getFontMetrics(b, g, b.getFont()); + int mnemIndex = (JTattooUtilities.getJavaVersion() >= 1.4) ? b.getDisplayedMnemonicIndex() : JTattooUtilities.findDisplayedMnemonicIndex(b.getText(), model.getMnemonic()); + int offs = 0; + if (model.isArmed() && model.isPressed()) { + offs = 1; + } + + Graphics2D g2D = (Graphics2D) g; + Composite composite = g2D.getComposite(); + AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); + g2D.setComposite(alpha); + Color foreground = b.getForeground(); + Color background = b.getBackground(); + if ((model.isPressed() && model.isArmed()) || model.isSelected()) { + if (foreground instanceof ColorUIResource && background instanceof ColorUIResource) { + foreground = AbstractLookAndFeel.getTheme().getPressedForegroundColor(); + } + } + if (!model.isEnabled()) { + foreground = AbstractLookAndFeel.getTheme().getDisabledForegroundColor(); + } + if (ColorHelper.getGrayValue(foreground) > 128) { + g2D.setColor(Color.black); + } else { + g2D.setColor(Color.white); + } + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs + 1, textRect.y + offs + fm.getAscent() + 1); + g2D.setComposite(composite); + g2D.setColor(foreground); + JTattooUtilities.drawStringUnderlineCharAt(b, g, text, mnemIndex, textRect.x + offs, textRect.y + offs + fm.getAscent()); + } +} diff --git a/src/com/jtattoo/plaf/hifi/HiFiToolBarUI.java b/src/com/jtattoo/plaf/hifi/HiFiToolBarUI.java new file mode 100644 index 0000000..68c7bf7 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiToolBarUI.java @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.AbstractToolBarUI; +import java.awt.Graphics; +import javax.swing.JComponent; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; + +/** + * @author Michael Hagen + */ +public class HiFiToolBarUI extends AbstractToolBarUI { + + public static ComponentUI createUI(JComponent c) { + return new HiFiToolBarUI(); + } + + public Border getRolloverBorder() { + return HiFiBorders.getRolloverToolButtonBorder(); + } + + public Border getNonRolloverBorder() { + return HiFiBorders.getToolButtonBorder(); + } + + public boolean isButtonOpaque() { + return true; + } + + public void paint(Graphics g, JComponent c) { + HiFiUtils.fillComponent(g, c); + } +} + diff --git a/src/com/jtattoo/plaf/hifi/HiFiUtils.java b/src/com/jtattoo/plaf/hifi/HiFiUtils.java new file mode 100644 index 0000000..3161296 --- /dev/null +++ b/src/com/jtattoo/plaf/hifi/HiFiUtils.java @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved. +* +* JTattoo is multiple licensed. If your are an open source developer you can use +* it under the terms and conditions of the GNU General Public License version 2.0 +* or later as published by the Free Software Foundation. +* +* see: gpl-2.0.txt +* +* If you pay for a license you will become a registered user who could use the +* software under the terms and conditions of the GNU Lesser General Public License +* version 2.0 or later with classpath exception as published by the Free Software +* Foundation. +* +* see: lgpl-2.0.txt +* see: classpath-exception.txt +* +* Registered users could also use JTattoo under the terms and conditions of the +* Apache License, Version 2.0 as published by the Apache Software Foundation. +* +* see: APACHE-LICENSE-2.0.txt +*/ + +package com.jtattoo.plaf.hifi; + +import com.jtattoo.plaf.AbstractLookAndFeel; +import com.jtattoo.plaf.JTattooUtilities; +import java.awt.*; + +/** + * @author Michael Hagen + */ +public class HiFiUtils { + + private HiFiUtils() { + } + + public static void fillComponent(Graphics g, Component c) { + if (AbstractLookAndFeel.getTheme().isBackgroundPatternOn()) { + int w = c.getWidth(); + int h = c.getHeight(); + Point p = JTattooUtilities.getRelLocation(c); + int y = 2 - (p.y % 3); + g.setColor(AbstractLookAndFeel.getTheme().getBackgroundColorLight()); + g.fillRect(0, 0, w, h); + g.setColor(AbstractLookAndFeel.getTheme().getBackgroundColorDark()); + while (y < h) { + g.drawLine(0, y, w, y); + y += 3; + } + } else { + g.setColor(c.getBackground()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + } +}