mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-11 06:27:13 -06:00
Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e51ffe2a1c | ||
|
|
c706a79f74 | ||
|
|
2608061d48 | ||
|
|
df1634de3d | ||
|
|
4aeabea3fe | ||
|
|
eb30f9d5bf | ||
|
|
de718f847c | ||
|
|
8835e20bfc | ||
|
|
92258f3ba3 | ||
|
|
1bda7595dd | ||
|
|
60557fc8c8 | ||
|
|
1a4a7831f6 | ||
|
|
d1415a8c53 | ||
|
|
0d4f33ac6e | ||
|
|
87100bef7b | ||
|
|
958dfa8ae9 | ||
|
|
d3752573e7 | ||
|
|
cfd07cbcc8 | ||
|
|
33e6ce1673 | ||
|
|
00ccda83f9 | ||
|
|
8d66cce6eb | ||
|
|
ba35fb7525 | ||
|
|
4fd2b24b10 | ||
|
|
5f7a33b085 | ||
|
|
65bc5b1f31 | ||
|
|
dd155e9f89 | ||
|
|
5c4ef3b0f5 | ||
|
|
2129a48cc8 | ||
|
|
c0f2784599 | ||
|
|
fee00b2acb | ||
|
|
ae8093313e | ||
|
|
5a4e321f78 | ||
|
|
9d1ed241b9 | ||
|
|
b63cd241d2 | ||
|
|
1e4f2d85a2 | ||
|
|
5cb7be4a64 | ||
|
|
0cd9068c0e | ||
|
|
9d6afe3bde | ||
|
|
52702b5267 | ||
|
|
cd144ff067 | ||
|
|
dd9784b3f2 | ||
|
|
d781b3d4a7 | ||
|
|
790f490674 | ||
|
|
004a5cb765 | ||
|
|
408b2d8376 | ||
|
|
3aa53ff3be | ||
|
|
73b642799d | ||
|
|
b522500379 | ||
|
|
f736ed401f | ||
|
|
c02f824d74 | ||
|
|
6f9a61de56 | ||
|
|
4cebeda37a | ||
|
|
4275005a64 | ||
|
|
5f40ab130e | ||
|
|
7489526eb7 | ||
|
|
e439d91763 | ||
|
|
793969e39b | ||
|
|
9f7ffe8d77 | ||
|
|
eecb867227 | ||
|
|
bff9f135e6 | ||
|
|
03627281d7 | ||
|
|
c83b4093f0 | ||
|
|
7f9f22df3e | ||
|
|
fd48582a9f | ||
|
|
e5761128f9 | ||
|
|
87dd5a9ebb | ||
|
|
11950f8b4d | ||
|
|
f2ddfadc9d | ||
|
|
b1a7983f18 | ||
|
|
b319cb278b | ||
|
|
78e3d781fc | ||
|
|
34834917b0 | ||
|
|
9446c287e9 | ||
|
|
31b0cf396e | ||
|
|
00bb13c230 | ||
|
|
3bf09ee731 | ||
|
|
5b07941c4c | ||
|
|
23c30ec46d | ||
|
|
22c06300f1 | ||
|
|
37cca1b106 | ||
|
|
f0a49c806e | ||
|
|
a1d5f65588 | ||
|
|
b6789e14a4 | ||
|
|
c72ee30a25 | ||
|
|
686d667c4f | ||
|
|
26d603db5d | ||
|
|
409840aef9 | ||
|
|
1f3c264afe | ||
|
|
cd69d9a1a7 | ||
|
|
a000c8fd99 | ||
|
|
84d05603ef | ||
|
|
9d046ecd1d | ||
|
|
030e1809f3 | ||
|
|
5853bd4a96 | ||
|
|
10695ff51b | ||
|
|
f421659fea | ||
|
|
df4f51eff3 | ||
|
|
7e61d6a850 | ||
|
|
0910bd23c4 | ||
|
|
5a29753912 | ||
|
|
a467356437 | ||
|
|
094967f52a | ||
|
|
757b0812ba | ||
|
|
8f4f5d8c92 | ||
|
|
4e266483ba | ||
|
|
7433dc9cf3 | ||
|
|
409a773e36 | ||
|
|
48bdd5c3df | ||
|
|
5796057a75 | ||
|
|
c8248e91ca | ||
|
|
7317ce44e7 | ||
|
|
10e2a5b1eb | ||
|
|
e675d1b7e2 | ||
|
|
499c4dadd5 | ||
|
|
f550f84acd | ||
|
|
8021f1a7fc | ||
|
|
d50fe606ee | ||
|
|
281f014aa0 | ||
|
|
2f6da3e84a | ||
|
|
f9accc2a7a | ||
|
|
fe15078bbd | ||
|
|
27d4b5eba7 | ||
|
|
e378576632 | ||
|
|
74909da110 | ||
|
|
655bf112ac | ||
|
|
5c3638a5a4 | ||
|
|
2459a3654b | ||
|
|
e9a3456cf5 |
228
.editorconfig
228
.editorconfig
@@ -6,3 +6,231 @@ insert_final_newline = true
|
|||||||
charset = latin1
|
charset = latin1
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.java]
|
||||||
|
indent_style = tab
|
||||||
|
ij_continuation_indent_size = 4
|
||||||
|
ij_java_align_consecutive_assignments = false
|
||||||
|
ij_java_align_consecutive_variable_declarations = false
|
||||||
|
ij_java_align_group_field_declarations = false
|
||||||
|
ij_java_align_multiline_annotation_parameters = false
|
||||||
|
ij_java_align_multiline_array_initializer_expression = false
|
||||||
|
ij_java_align_multiline_assignment = false
|
||||||
|
ij_java_align_multiline_binary_operation = false
|
||||||
|
ij_java_align_multiline_chained_methods = false
|
||||||
|
ij_java_align_multiline_extends_list = false
|
||||||
|
ij_java_align_multiline_for = true
|
||||||
|
ij_java_align_multiline_method_parentheses = false
|
||||||
|
ij_java_align_multiline_parameters = false
|
||||||
|
ij_java_align_multiline_parameters_in_calls = false
|
||||||
|
ij_java_align_multiline_parenthesized_expression = false
|
||||||
|
ij_java_align_multiline_resources = false
|
||||||
|
ij_java_align_multiline_ternary_operation = false
|
||||||
|
ij_java_align_multiline_text_blocks = false
|
||||||
|
ij_java_align_multiline_throws_list = false
|
||||||
|
ij_java_align_subsequent_simple_methods = false
|
||||||
|
ij_java_align_throws_keyword = false
|
||||||
|
ij_java_annotation_parameter_wrap = off
|
||||||
|
ij_java_array_initializer_new_line_after_left_brace = false
|
||||||
|
ij_java_array_initializer_right_brace_on_new_line = false
|
||||||
|
ij_java_array_initializer_wrap = normal
|
||||||
|
ij_java_assert_statement_colon_on_next_line = false
|
||||||
|
ij_java_assert_statement_wrap = off
|
||||||
|
ij_java_assignment_wrap = off
|
||||||
|
ij_java_binary_operation_sign_on_next_line = false
|
||||||
|
ij_java_binary_operation_wrap = off
|
||||||
|
ij_java_blank_lines_after_anonymous_class_header = 0
|
||||||
|
ij_java_blank_lines_after_class_header = 0
|
||||||
|
ij_java_blank_lines_after_imports = 1
|
||||||
|
ij_java_blank_lines_after_package = 1
|
||||||
|
ij_java_blank_lines_around_class = 1
|
||||||
|
ij_java_blank_lines_around_field = 0
|
||||||
|
ij_java_blank_lines_around_field_in_interface = 0
|
||||||
|
ij_java_blank_lines_around_initializer = 1
|
||||||
|
ij_java_blank_lines_around_method = 1
|
||||||
|
ij_java_blank_lines_around_method_in_interface = 1
|
||||||
|
ij_java_blank_lines_before_class_end = 0
|
||||||
|
ij_java_blank_lines_before_imports = 1
|
||||||
|
ij_java_blank_lines_before_method_body = 0
|
||||||
|
ij_java_blank_lines_before_package = 0
|
||||||
|
ij_java_block_brace_style = next_line_if_wrapped
|
||||||
|
ij_java_block_comment_at_first_column = true
|
||||||
|
ij_java_call_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_call_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_call_parameters_wrap = normal
|
||||||
|
ij_java_case_statement_on_separate_line = true
|
||||||
|
ij_java_catch_on_new_line = false
|
||||||
|
ij_java_class_annotation_wrap = split_into_lines
|
||||||
|
ij_java_class_brace_style = next_line
|
||||||
|
ij_java_class_count_to_use_import_on_demand = 99
|
||||||
|
ij_java_class_names_in_javadoc = 1
|
||||||
|
ij_java_do_not_indent_top_level_class_members = false
|
||||||
|
ij_java_do_not_wrap_after_single_annotation = false
|
||||||
|
ij_java_do_while_brace_force = never
|
||||||
|
ij_java_doc_add_blank_line_after_description = true
|
||||||
|
ij_java_doc_add_blank_line_after_param_comments = false
|
||||||
|
ij_java_doc_add_blank_line_after_return = false
|
||||||
|
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||||
|
ij_java_doc_align_exception_comments = true
|
||||||
|
ij_java_doc_align_param_comments = true
|
||||||
|
ij_java_doc_do_not_wrap_if_one_line = false
|
||||||
|
ij_java_doc_enable_formatting = true
|
||||||
|
ij_java_doc_enable_leading_asterisks = true
|
||||||
|
ij_java_doc_indent_on_continuation = false
|
||||||
|
ij_java_doc_keep_empty_lines = true
|
||||||
|
ij_java_doc_keep_empty_parameter_tag = true
|
||||||
|
ij_java_doc_keep_empty_return_tag = true
|
||||||
|
ij_java_doc_keep_empty_throws_tag = true
|
||||||
|
ij_java_doc_keep_invalid_tags = true
|
||||||
|
ij_java_doc_param_description_on_new_line = false
|
||||||
|
ij_java_doc_preserve_line_breaks = false
|
||||||
|
ij_java_doc_use_throws_not_exception_tag = true
|
||||||
|
ij_java_else_on_new_line = false
|
||||||
|
ij_java_enum_constants_wrap = off
|
||||||
|
ij_java_extends_keyword_wrap = split_into_lines
|
||||||
|
ij_java_extends_list_wrap = normal
|
||||||
|
ij_java_field_annotation_wrap = split_into_lines
|
||||||
|
ij_java_finally_on_new_line = false
|
||||||
|
ij_java_for_brace_force = never
|
||||||
|
ij_java_for_statement_new_line_after_left_paren = false
|
||||||
|
ij_java_for_statement_right_paren_on_new_line = false
|
||||||
|
ij_java_for_statement_wrap = off
|
||||||
|
ij_java_generate_final_locals = false
|
||||||
|
ij_java_generate_final_parameters = false
|
||||||
|
ij_java_if_brace_force = never
|
||||||
|
ij_java_imports_layout = java.**,javax.**,*,$*
|
||||||
|
ij_java_indent_case_from_switch = true
|
||||||
|
ij_java_insert_inner_class_imports = false
|
||||||
|
ij_java_insert_override_annotation = true
|
||||||
|
ij_java_keep_blank_lines_before_right_brace = 1
|
||||||
|
ij_java_keep_blank_lines_between_package_declaration_and_header = 1
|
||||||
|
ij_java_keep_blank_lines_in_code = 1
|
||||||
|
ij_java_keep_blank_lines_in_declarations = 1
|
||||||
|
ij_java_keep_control_statement_in_one_line = false
|
||||||
|
ij_java_keep_first_column_comment = false
|
||||||
|
ij_java_keep_indents_on_empty_lines = false
|
||||||
|
ij_java_keep_line_breaks = false
|
||||||
|
ij_java_keep_multiple_expressions_in_one_line = false
|
||||||
|
ij_java_keep_simple_blocks_in_one_line = false
|
||||||
|
ij_java_keep_simple_classes_in_one_line = false
|
||||||
|
ij_java_keep_simple_lambdas_in_one_line = false
|
||||||
|
ij_java_keep_simple_methods_in_one_line = false
|
||||||
|
ij_java_label_indent_absolute = false
|
||||||
|
ij_java_label_indent_size = 0
|
||||||
|
ij_java_lambda_brace_style = end_of_line
|
||||||
|
ij_java_layout_static_imports_separately = true
|
||||||
|
ij_java_line_comment_add_space = false
|
||||||
|
ij_java_line_comment_at_first_column = true
|
||||||
|
ij_java_method_annotation_wrap = split_into_lines
|
||||||
|
ij_java_method_brace_style = next_line_if_wrapped
|
||||||
|
ij_java_method_call_chain_wrap = normal
|
||||||
|
ij_java_method_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_method_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_method_parameters_wrap = normal
|
||||||
|
ij_java_modifier_list_wrap = false
|
||||||
|
ij_java_names_count_to_use_import_on_demand = 3
|
||||||
|
ij_java_parameter_annotation_wrap = off
|
||||||
|
ij_java_parentheses_expression_new_line_after_left_paren = false
|
||||||
|
ij_java_parentheses_expression_right_paren_on_new_line = false
|
||||||
|
ij_java_place_assignment_sign_on_next_line = false
|
||||||
|
ij_java_prefer_longer_names = true
|
||||||
|
ij_java_prefer_parameters_wrap = false
|
||||||
|
ij_java_repeat_synchronized = true
|
||||||
|
ij_java_replace_instanceof_and_cast = false
|
||||||
|
ij_java_replace_null_check = true
|
||||||
|
ij_java_replace_sum_lambda_with_method_ref = true
|
||||||
|
ij_java_resource_list_new_line_after_left_paren = false
|
||||||
|
ij_java_resource_list_right_paren_on_new_line = false
|
||||||
|
ij_java_resource_list_wrap = normal
|
||||||
|
ij_java_space_after_closing_angle_bracket_in_type_argument = false
|
||||||
|
ij_java_space_after_colon = true
|
||||||
|
ij_java_space_after_comma = true
|
||||||
|
ij_java_space_after_comma_in_type_arguments = true
|
||||||
|
ij_java_space_after_for_semicolon = true
|
||||||
|
ij_java_space_after_quest = true
|
||||||
|
ij_java_space_after_type_cast = true
|
||||||
|
ij_java_space_before_annotation_array_initializer_left_brace = true
|
||||||
|
ij_java_space_before_annotation_parameter_list = false
|
||||||
|
ij_java_space_before_array_initializer_left_brace = true
|
||||||
|
ij_java_space_before_catch_keyword = true
|
||||||
|
ij_java_space_before_catch_left_brace = true
|
||||||
|
ij_java_space_before_catch_parentheses = false
|
||||||
|
ij_java_space_before_class_left_brace = true
|
||||||
|
ij_java_space_before_colon = true
|
||||||
|
ij_java_space_before_colon_in_foreach = true
|
||||||
|
ij_java_space_before_comma = false
|
||||||
|
ij_java_space_before_do_left_brace = true
|
||||||
|
ij_java_space_before_else_keyword = true
|
||||||
|
ij_java_space_before_else_left_brace = true
|
||||||
|
ij_java_space_before_finally_keyword = true
|
||||||
|
ij_java_space_before_finally_left_brace = true
|
||||||
|
ij_java_space_before_for_left_brace = true
|
||||||
|
ij_java_space_before_for_parentheses = false
|
||||||
|
ij_java_space_before_for_semicolon = false
|
||||||
|
ij_java_space_before_if_left_brace = true
|
||||||
|
ij_java_space_before_if_parentheses = false
|
||||||
|
ij_java_space_before_method_call_parentheses = false
|
||||||
|
ij_java_space_before_method_left_brace = true
|
||||||
|
ij_java_space_before_method_parentheses = false
|
||||||
|
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
|
||||||
|
ij_java_space_before_quest = true
|
||||||
|
ij_java_space_before_switch_left_brace = true
|
||||||
|
ij_java_space_before_switch_parentheses = false
|
||||||
|
ij_java_space_before_synchronized_left_brace = true
|
||||||
|
ij_java_space_before_synchronized_parentheses = false
|
||||||
|
ij_java_space_before_try_left_brace = true
|
||||||
|
ij_java_space_before_try_parentheses = false
|
||||||
|
ij_java_space_before_type_parameter_list = false
|
||||||
|
ij_java_space_before_while_keyword = true
|
||||||
|
ij_java_space_before_while_left_brace = true
|
||||||
|
ij_java_space_before_while_parentheses = false
|
||||||
|
ij_java_space_inside_one_line_enum_braces = false
|
||||||
|
ij_java_space_within_empty_array_initializer_braces = false
|
||||||
|
ij_java_space_within_empty_method_call_parentheses = false
|
||||||
|
ij_java_space_within_empty_method_parentheses = false
|
||||||
|
ij_java_spaces_around_additive_operators = true
|
||||||
|
ij_java_spaces_around_assignment_operators = true
|
||||||
|
ij_java_spaces_around_bitwise_operators = true
|
||||||
|
ij_java_spaces_around_equality_operators = true
|
||||||
|
ij_java_spaces_around_lambda_arrow = true
|
||||||
|
ij_java_spaces_around_logical_operators = true
|
||||||
|
ij_java_spaces_around_method_ref_dbl_colon = false
|
||||||
|
ij_java_spaces_around_multiplicative_operators = true
|
||||||
|
ij_java_spaces_around_relational_operators = true
|
||||||
|
ij_java_spaces_around_shift_operators = true
|
||||||
|
ij_java_spaces_around_type_bounds_in_type_parameters = true
|
||||||
|
ij_java_spaces_around_unary_operator = false
|
||||||
|
ij_java_spaces_within_angle_brackets = false
|
||||||
|
ij_java_spaces_within_annotation_parentheses = true
|
||||||
|
ij_java_spaces_within_array_initializer_braces = true
|
||||||
|
ij_java_spaces_within_braces = false
|
||||||
|
ij_java_spaces_within_brackets = false
|
||||||
|
ij_java_spaces_within_cast_parentheses = false
|
||||||
|
ij_java_spaces_within_catch_parentheses = true
|
||||||
|
ij_java_spaces_within_for_parentheses = true
|
||||||
|
ij_java_spaces_within_if_parentheses = true
|
||||||
|
ij_java_spaces_within_method_call_parentheses = true
|
||||||
|
ij_java_spaces_within_method_parentheses = true
|
||||||
|
ij_java_spaces_within_parentheses = false
|
||||||
|
ij_java_spaces_within_switch_parentheses = true
|
||||||
|
ij_java_spaces_within_synchronized_parentheses = true
|
||||||
|
ij_java_spaces_within_try_parentheses = true
|
||||||
|
ij_java_spaces_within_while_parentheses = true
|
||||||
|
ij_java_special_else_if_treatment = true
|
||||||
|
ij_java_subclass_name_suffix = Impl
|
||||||
|
ij_java_ternary_operation_signs_on_next_line = true
|
||||||
|
ij_java_ternary_operation_wrap = on_every_item
|
||||||
|
ij_java_test_name_suffix = Test
|
||||||
|
ij_java_throws_keyword_wrap = normal
|
||||||
|
ij_java_throws_list_wrap = normal
|
||||||
|
ij_java_use_external_annotations = false
|
||||||
|
ij_java_use_fq_class_names = false
|
||||||
|
ij_java_use_relative_indents = false
|
||||||
|
ij_java_use_single_class_imports = true
|
||||||
|
ij_java_variable_annotation_wrap = off
|
||||||
|
ij_java_visibility = public
|
||||||
|
ij_java_while_brace_force = never
|
||||||
|
ij_java_while_on_new_line = false
|
||||||
|
ij_java_wrap_comments = false
|
||||||
|
ij_java_wrap_first_method_in_call_chain = false
|
||||||
|
ij_java_wrap_long_lines = false
|
||||||
|
|||||||
26
.travis.yml
26
.travis.yml
@@ -19,11 +19,21 @@ before_install:
|
|||||||
- ./gradlew --version
|
- ./gradlew --version
|
||||||
- java -version
|
- java -version
|
||||||
|
|
||||||
deploy:
|
stages:
|
||||||
provider: script
|
- name: test
|
||||||
script: ./gradlew bintrayUpload
|
- name: snapshot
|
||||||
skip_cleanup: true # to upload artifacts created during the build
|
if: branch = master AND type IN (push) AND tag IS blank
|
||||||
on:
|
- name: release
|
||||||
branch: master
|
if: type IN (push) AND tag IS present
|
||||||
jdk: openjdk11
|
|
||||||
tags: true
|
jobs:
|
||||||
|
include:
|
||||||
|
# publish snapshot to oss.jfrog.org
|
||||||
|
- stage: snapshot
|
||||||
|
jdk: openjdk11
|
||||||
|
script: ./gradlew artifactoryPublish
|
||||||
|
|
||||||
|
# release a new stable version to bintray
|
||||||
|
- stage: release
|
||||||
|
jdk: openjdk11
|
||||||
|
script: ./gradlew bintrayUpload -Drelease=true
|
||||||
|
|||||||
92
CHANGELOG.md
92
CHANGELOG.md
@@ -1,6 +1,98 @@
|
|||||||
FlatLaf Change Log
|
FlatLaf Change Log
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
## 0.28
|
||||||
|
|
||||||
|
- PasswordField: Warn about enabled Caps Lock.
|
||||||
|
- TabbedPane: Support <kbd>Ctrl+TAB</kbd> / <kbd>Ctrl+Shift+TAB</kbd> to switch
|
||||||
|
to next / previous tab.
|
||||||
|
- TextField, FormattedTextField and PasswordField: Support round borders (see UI
|
||||||
|
default value `TextComponent.arc`). (issue #65)
|
||||||
|
- IntelliJ Themes: Added Gradianto themes to demo.
|
||||||
|
- Button, CheckBox and RadioButton: Fixed NPE when button has children. (PR #68)
|
||||||
|
- ScrollBar: Improved colors.
|
||||||
|
- Reviewed (and tested) all key bindings on Windows and macOS. Linux key
|
||||||
|
bindings are equal to Windows key bindings. macOS key bindings are slightly
|
||||||
|
different for platform specific behavior.
|
||||||
|
- UI default values are no longer based on Metal/Aqua UI defaults.
|
||||||
|
|
||||||
|
|
||||||
|
## 0.27
|
||||||
|
|
||||||
|
- Support `JInternalFrame` and `JDesktopPane`. (issues #39 and #11)
|
||||||
|
- Table: Support positioning the column sort arrow in header right, left, top or
|
||||||
|
bottom. (issue #34)
|
||||||
|
- ProgressBar: Fixed visual artifacts in indeterminate mode, on HiDPI screens at
|
||||||
|
125%, 150% and 175% scaling, when the progress moves around.
|
||||||
|
- TabbedPane: New option to allow tab separators to take full height (to enable
|
||||||
|
use `UIManager.put( "TabbedPane.tabSeparatorsFullHeight", true );`). (issue
|
||||||
|
#59, PR #62)
|
||||||
|
- CheckBox and RadioButton: Do not fill background if `contentAreaFilled` is
|
||||||
|
`false`. (issue #58, PR #63)
|
||||||
|
- ToggleButton: Make toggle button square if it has an icon but no text or text
|
||||||
|
is "..." or a single character.
|
||||||
|
- ToolBar: No longer use special rollover border for buttons in toolbar. (issue
|
||||||
|
#36)
|
||||||
|
- ToolBar: Added empty space around buttons in toolbar and toolbar itself (see
|
||||||
|
UI default values `Button.toolbar.spacingInsets` and `ToolBar.borderMargins`).
|
||||||
|
(issue #56)
|
||||||
|
- Fixed "illegal reflective access operation" warning on macOS when using Java
|
||||||
|
12 or later. (issue #60, PR #61)
|
||||||
|
|
||||||
|
|
||||||
|
## 0.26
|
||||||
|
|
||||||
|
- Menus:
|
||||||
|
- Changed menu bar and popup menu background colors (made brighter in light
|
||||||
|
themes and darker in dark themes).
|
||||||
|
- Highlight items in menu bar on mouse hover. (issue #49)
|
||||||
|
- Popup menus now have empty space at the top and bottom.
|
||||||
|
- Menu items now have larger left and right margins.
|
||||||
|
- Made `JMenu`, `JMenuItem`, `JCheckBoxMenuItem` and `JRadioButtonMenuItem`
|
||||||
|
non-opaque.
|
||||||
|
- TextField, FormattedTextField and PasswordField: Select all text when a text
|
||||||
|
field gains focus for the first time and selection was not set explicitly.
|
||||||
|
This can be configured to newer or always select all text on focus gain (see
|
||||||
|
UI default value `TextComponent.selectAllOnFocusPolicy`).
|
||||||
|
- ProgressBar: Made progress bar paint smooth in indeterminate mode.
|
||||||
|
|
||||||
|
|
||||||
|
## 0.25.1
|
||||||
|
|
||||||
|
Re-release of 0.25 because of problems with Maven Central.
|
||||||
|
|
||||||
|
|
||||||
|
## 0.25
|
||||||
|
|
||||||
|
- Hide menu mnemonics by default and show them only when <kbd>Alt</kbd> key is
|
||||||
|
pressed. (issue #43)
|
||||||
|
- Menu: Fixed vertical alignment of sub-menus. (issue #42)
|
||||||
|
- TabbedPane: In scroll-tab-layout, the cropped line is now hidden. (issue #40)
|
||||||
|
- Tree: UI default value `Tree.textBackground` now has a valid color and is no
|
||||||
|
longer `null`.
|
||||||
|
- Tree on macOS: Fixed <kbd>Left</kbd> and <kbd>Right</kbd> keys to collapse or
|
||||||
|
expand nodes.
|
||||||
|
- ComboBox on macOS: Fixed keyboard navigation and show/hide popup.
|
||||||
|
- Button and ToggleButton: Support per component minimum height (set client
|
||||||
|
property `JComponent.minimumHeight` to an integer). (issue #44)
|
||||||
|
- Button and ToggleButton: Do not apply minimum width if button border was
|
||||||
|
changed (is no longer an instance of `FlatButtonBorder`).
|
||||||
|
- ToggleButton: Renamed toggle button type "underline" to "tab" (value of client
|
||||||
|
property `JButton.buttonType` is now `tab`).
|
||||||
|
- ToggleButton: Support per component styling for tab-style toggle buttons with
|
||||||
|
client properties `JToggleButton.tab.underlineHeight` (integer),
|
||||||
|
`JToggleButton.tab.underlineColor` (Color) and
|
||||||
|
`JToggleButton.tab.selectedBackground` (Color). (issue #45)
|
||||||
|
- ToggleButton: No longer use focus width for tab-style toggle buttons to
|
||||||
|
compute component size, which reduces/fixes component size in "Flat IntelliJ"
|
||||||
|
and "Flat Darcula" themes.
|
||||||
|
- TabbedPane: Support per component tab height (set client property
|
||||||
|
`JTabbedPane.tabHeight` to an integer).
|
||||||
|
- ProgressBar: Support square painting (set client property
|
||||||
|
`JProgressBar.square` to `true`) and larger height even if no string is
|
||||||
|
painted (set client property `JProgressBar.largeHeight` to `true`).
|
||||||
|
|
||||||
|
|
||||||
## 0.24
|
## 0.24
|
||||||
|
|
||||||
- Support smooth scrolling with touchpads and high precision mouse wheels.
|
- Support smooth scrolling with touchpads and high precision mouse wheels.
|
||||||
|
|||||||
42
README.md
42
README.md
@@ -45,13 +45,26 @@ build script:
|
|||||||
|
|
||||||
groupId: com.formdev
|
groupId: com.formdev
|
||||||
artifactId: flatlaf
|
artifactId: flatlaf
|
||||||
version: 0.24
|
version: (see button below)
|
||||||
|
|
||||||
Otherwise download `flatlaf-<version>.jar` here:
|
Otherwise download `flatlaf-<version>.jar` here:
|
||||||
|
|
||||||
[](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
|
[](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
|
||||||
|
|
||||||
|
|
||||||
|
### Snapshots
|
||||||
|
|
||||||
|
FlatLaf snapshot binaries are available in
|
||||||
|
[JFrog Artifactory](https://oss.jfrog.org/artifactory/oss-snapshot-local/com/formdev/).
|
||||||
|
To access the latest snapshot, change the FlatLaf version(s) in the dependencies
|
||||||
|
to `<version>-SNAPSHOT` (e.g. `0.27-SNAPSHOT`) and add the repository
|
||||||
|
`https://oss.jfrog.org/artifactory/oss-snapshot-local` to your build (see
|
||||||
|
[Maven](https://maven.apache.org/guides/mini/guide-multiple-repositories.html)
|
||||||
|
and
|
||||||
|
[Gradle](https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_custom_repository)
|
||||||
|
docs).
|
||||||
|
|
||||||
|
|
||||||
Addons
|
Addons
|
||||||
------
|
------
|
||||||
|
|
||||||
@@ -59,6 +72,33 @@ Addons
|
|||||||
- [JIDE Common Layer](flatlaf-jide-oss)
|
- [JIDE Common Layer](flatlaf-jide-oss)
|
||||||
|
|
||||||
|
|
||||||
|
Projects using FlatLaf
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
- [NetBeans](https://netbeans.apache.org/) 11.3
|
||||||
|
- [jclasslib bytecode viewer](https://github.com/ingokegel/jclasslib) 5.5
|
||||||
|
- [KeyStore Explorer](https://keystore-explorer.org/) 5.4.3
|
||||||
|
- [OWASP Zed Attack Proxy (ZAP)](https://www.zaproxy.org/) (in weekly releases)
|
||||||
|
- [j-lawyer](https://github.com/jlawyerorg/j-lawyer-org)
|
||||||
|
- [Rest Suite](https://github.com/supanadit/restsuite)
|
||||||
|
- [ControllerBuddy](https://github.com/bwRavencl/ControllerBuddy)
|
||||||
|
- [SpringRemote](https://github.com/HaleyWang/SpringRemote)
|
||||||
|
- [mendelson AS2](https://sourceforge.net/projects/mec-as2/),
|
||||||
|
[AS4](https://sourceforge.net/projects/mendelson-as4/) and
|
||||||
|
[OFTP2](https://sourceforge.net/projects/mendelson-oftp2/) (open-source) and
|
||||||
|
[mendelson AS2](https://mendelson-e-c.com/as2/),
|
||||||
|
[AS4](https://mendelson-e-c.com/as4/) and
|
||||||
|
[OFTP2](https://mendelson-e-c.com/oftp2) (commercial)
|
||||||
|
- and more...
|
||||||
|
|
||||||
|
|
||||||
|
Buzz
|
||||||
|
----
|
||||||
|
|
||||||
|
- [What others say about FlatLaf on Twitter](https://twitter.com/search?f=live&q=flatlaf)
|
||||||
|
- [FlatLaf announcement on Reddit](https://www.reddit.com/r/java/comments/dl0hu3/flatlaf_flat_look_and_feel/)
|
||||||
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -14,9 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
version = "0.24"
|
val releaseVersion = "0.28"
|
||||||
|
val developmentVersion = "0.29-SNAPSHOT"
|
||||||
|
|
||||||
|
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
|
version = rootProject.version
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
@@ -33,3 +38,39 @@ println( "FlatLaf Version: ${version}" )
|
|||||||
println( "Gradle ${gradle.gradleVersion} at ${gradle.gradleHomeDir}" )
|
println( "Gradle ${gradle.gradleVersion} at ${gradle.gradleHomeDir}" )
|
||||||
println( "Java ${System.getProperty( "java.version" )}" )
|
println( "Java ${System.getProperty( "java.version" )}" )
|
||||||
println()
|
println()
|
||||||
|
|
||||||
|
|
||||||
|
extra["bintray.user"] = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
|
||||||
|
extra["bintray.key"] = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
|
||||||
|
|
||||||
|
// if true, do not upload to bintray
|
||||||
|
extra["bintray.dryRun"] = false
|
||||||
|
|
||||||
|
// if true, uploaded artifacts are visible to all
|
||||||
|
// if false, only visible to owner when logged into bintray
|
||||||
|
extra["bintray.publish"] = true
|
||||||
|
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
tasks {
|
||||||
|
withType<JavaCompile>().configureEach {
|
||||||
|
sourceCompatibility = "1.8"
|
||||||
|
targetCompatibility = "1.8"
|
||||||
|
|
||||||
|
options.encoding = "ISO-8859-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
withType<Jar>().configureEach {
|
||||||
|
// manifest for all created JARs
|
||||||
|
manifest.attributes(mapOf(
|
||||||
|
"Implementation-Vendor" to "FormDev Software GmbH",
|
||||||
|
"Implementation-Copyright" to "Copyright (C) ${java.time.LocalDate.now().year} FormDev Software GmbH. All rights reserved.",
|
||||||
|
"Implementation-Version" to project.version))
|
||||||
|
|
||||||
|
// add META-INF/LICENSE to all created JARs
|
||||||
|
from("${rootDir}/LICENSE") {
|
||||||
|
into("META-INF")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -14,12 +14,11 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
version = rootProject.version
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
`java-library`
|
`java-library`
|
||||||
`maven-publish`
|
`maven-publish`
|
||||||
id( "com.jfrog.bintray" ) version "1.8.4"
|
id( "com.jfrog.bintray" )
|
||||||
|
id( "com.jfrog.artifactory" )
|
||||||
}
|
}
|
||||||
|
|
||||||
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
||||||
@@ -34,11 +33,6 @@ if( JavaVersion.current() >= JavaVersion.VERSION_1_9 ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
assemble {
|
assemble {
|
||||||
dependsOn(
|
dependsOn(
|
||||||
@@ -53,7 +47,7 @@ tasks {
|
|||||||
targetCompatibility = "9"
|
targetCompatibility = "9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
archiveBaseName.set( "flatlaf" )
|
archiveBaseName.set( "flatlaf" )
|
||||||
|
|
||||||
@@ -68,6 +62,7 @@ tasks {
|
|||||||
options {
|
options {
|
||||||
this as StandardJavadocDocletOptions
|
this as StandardJavadocDocletOptions
|
||||||
tags = listOf( "uiDefault", "clientProperty" )
|
tags = listOf( "uiDefault", "clientProperty" )
|
||||||
|
addStringOption( "Xdoclint:all,-missing", "-Xdoclint:all,-missing" )
|
||||||
}
|
}
|
||||||
isFailOnError = false
|
isFailOnError = false
|
||||||
}
|
}
|
||||||
@@ -106,7 +101,7 @@ publishing {
|
|||||||
licenses {
|
licenses {
|
||||||
license {
|
license {
|
||||||
name.set( "The Apache License, Version 2.0" )
|
name.set( "The Apache License, Version 2.0" )
|
||||||
url.set( "http://www.apache.org/licenses/LICENSE-2.0.txt" )
|
url.set( "https://www.apache.org/licenses/LICENSE-2.0.txt" )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,8 +122,8 @@ publishing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bintray {
|
bintray {
|
||||||
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
|
user = rootProject.extra["bintray.user"] as String?
|
||||||
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
|
key = rootProject.extra["bintray.key"] as String?
|
||||||
|
|
||||||
setPublications( "maven" )
|
setPublications( "maven" )
|
||||||
|
|
||||||
@@ -142,6 +137,29 @@ bintray {
|
|||||||
name = project.version.toString()
|
name = project.version.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
publish = true
|
publish = rootProject.extra["bintray.publish"] as Boolean
|
||||||
|
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
artifactory {
|
||||||
|
setContextUrl( "https://oss.jfrog.org" )
|
||||||
|
|
||||||
|
publish( closureOf<org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig> {
|
||||||
|
repository( delegateClosureOf<groovy.lang.GroovyObject> {
|
||||||
|
setProperty( "repoKey", "oss-snapshot-local" )
|
||||||
|
setProperty( "username", rootProject.extra["bintray.user"] as String? )
|
||||||
|
setProperty( "password", rootProject.extra["bintray.key"] as String? )
|
||||||
|
} )
|
||||||
|
|
||||||
|
defaults( delegateClosureOf<groovy.lang.GroovyObject> {
|
||||||
|
invokeMethod( "publications", "maven" )
|
||||||
|
setProperty( "publishArtifacts", true )
|
||||||
|
setProperty( "publishPom", true )
|
||||||
|
} )
|
||||||
|
} )
|
||||||
|
|
||||||
|
resolve( delegateClosureOf<org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig> {
|
||||||
|
setProperty( "repoKey", "jcenter" )
|
||||||
|
} )
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf;
|
package com.formdev.flatlaf;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
|
||||||
@@ -43,13 +44,13 @@ public interface FlatClientProperties
|
|||||||
String BUTTON_TYPE_SQUARE = "square";
|
String BUTTON_TYPE_SQUARE = "square";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paint the toggle button in underline style.
|
* Paint the toggle button in tab style.
|
||||||
* <p>
|
* <p>
|
||||||
* <strong>Components</strong> {@link javax.swing.JToggleButton}
|
* <strong>Components</strong> {@link javax.swing.JToggleButton}
|
||||||
*
|
*
|
||||||
* @see #TOGGLE_BUTTON_TYPE
|
* @see #BUTTON_TYPE
|
||||||
*/
|
*/
|
||||||
String BUTTON_TYPE_UNDERLINE = "underline";
|
String BUTTON_TYPE_TAB = "tab";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paint a help button (circle with question mark).
|
* Paint a help button (circle with question mark).
|
||||||
@@ -79,11 +80,35 @@ public interface FlatClientProperties
|
|||||||
/**
|
/**
|
||||||
* Specifies minimum width of a component.
|
* Specifies minimum width of a component.
|
||||||
* <p>
|
* <p>
|
||||||
* <strong>Component</strong> {@link javax.swing.JButton} and {@link javax.swing.text.JTextComponent}<br>
|
* <strong>Component</strong> {@link javax.swing.JButton}, {@link javax.swing.JToggleButton} and {@link javax.swing.text.JTextComponent}<br>
|
||||||
* <strong>Value type</strong> {@link java.lang.Integer}<br>
|
* <strong>Value type</strong> {@link java.lang.Integer}<br>
|
||||||
*/
|
*/
|
||||||
String MINIMUM_WIDTH = "JComponent.minimumWidth";
|
String MINIMUM_WIDTH = "JComponent.minimumWidth";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies minimum height of a component.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JButton} and {@link javax.swing.JToggleButton}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.Integer}<br>
|
||||||
|
*/
|
||||||
|
String MINIMUM_HEIGHT = "JComponent.minimumHeight";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies whether the progress bar has always the larger height even if no string is painted.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JProgressBar}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.Boolean}
|
||||||
|
*/
|
||||||
|
String PROGRESS_BAR_LARGE_HEIGHT = "JProgressBar.largeHeight";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies whether the progress bar is paint with square edges.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JProgressBar}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.Boolean}
|
||||||
|
*/
|
||||||
|
String PROGRESS_BAR_SQUARE = "JProgressBar.square";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies whether the decrease/increase arrow buttons of a scrollbar are shown.
|
* Specifies whether the decrease/increase arrow buttons of a scrollbar are shown.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -108,14 +133,80 @@ public interface FlatClientProperties
|
|||||||
*/
|
*/
|
||||||
String TABBED_PANE_HAS_FULL_BORDER = "JTabbedPane.hasFullBorder";
|
String TABBED_PANE_HAS_FULL_BORDER = "JTabbedPane.hasFullBorder";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the height of a tab.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.Integer}
|
||||||
|
*/
|
||||||
|
String TABBED_PANE_TAB_HEIGHT = "JTabbedPane.tabHeight";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies whether all text is selected when the text component gains focus.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses)<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.String}<br>
|
||||||
|
* <strong>Allowed Values</strong> {@link #SELECT_ALL_ON_FOCUS_POLICY_NEVER},
|
||||||
|
* {@link #SELECT_ALL_ON_FOCUS_POLICY_ONCE} (default) or
|
||||||
|
* {@link #SELECT_ALL_ON_FOCUS_POLICY_ALWAYS}
|
||||||
|
*/
|
||||||
|
String SELECT_ALL_ON_FOCUS_POLICY = "JTextField.selectAllOnFocusPolicy";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Never select all text when the text component gains focus.
|
||||||
|
*
|
||||||
|
* @see #SELECT_ALL_ON_FOCUS_POLICY
|
||||||
|
*/
|
||||||
|
String SELECT_ALL_ON_FOCUS_POLICY_NEVER = "never";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select all text when the text component gains focus for the first time
|
||||||
|
* and selection was not modified (is at end of text).
|
||||||
|
* This is the default.
|
||||||
|
*
|
||||||
|
* @see #SELECT_ALL_ON_FOCUS_POLICY
|
||||||
|
*/
|
||||||
|
String SELECT_ALL_ON_FOCUS_POLICY_ONCE = "once";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always select all text when the text component gains focus.
|
||||||
|
*
|
||||||
|
* @see #SELECT_ALL_ON_FOCUS_POLICY
|
||||||
|
*/
|
||||||
|
String SELECT_ALL_ON_FOCUS_POLICY_ALWAYS = "always";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Placeholder text that is only painted if the text field is empty.
|
* Placeholder text that is only painted if the text field is empty.
|
||||||
* <p>
|
* <p>
|
||||||
* <strong>Component</strong> {@link javax.swing.JTextField} or {@link javax.swing.JComboBox}<br>
|
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses) or {@link javax.swing.JComboBox}<br>
|
||||||
* <strong>Value type</strong> {@link java.lang.String}
|
* <strong>Value type</strong> {@link java.lang.String}
|
||||||
*/
|
*/
|
||||||
String PLACEHOLDER_TEXT = "JTextField.placeholderText";
|
String PLACEHOLDER_TEXT = "JTextField.placeholderText";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Height of underline if toggle button type is {@link #BUTTON_TYPE_TAB}.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.lang.Integer}
|
||||||
|
*/
|
||||||
|
String TAB_BUTTON_UNDERLINE_HEIGHT = "JToggleButton.tab.underlineHeight";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Color of underline if toggle button type is {@link #BUTTON_TYPE_TAB}.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.awt.Color}
|
||||||
|
*/
|
||||||
|
String TAB_BUTTON_UNDERLINE_COLOR = "JToggleButton.tab.underlineColor";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Background color if selected and toggle button type is {@link #BUTTON_TYPE_TAB}.
|
||||||
|
* <p>
|
||||||
|
* <strong>Component</strong> {@link javax.swing.JToggleButton}<br>
|
||||||
|
* <strong>Value type</strong> {@link java.awt.Color}
|
||||||
|
*/
|
||||||
|
String TAB_BUTTON_SELECTED_BACKGROUND = "JToggleButton.tab.selectedBackground";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether a client property of a component has the given value.
|
* Checks whether a client property of a component has the given value.
|
||||||
*/
|
*/
|
||||||
@@ -131,4 +222,22 @@ public interface FlatClientProperties
|
|||||||
Object value = c.getClientProperty( key );
|
Object value = c.getClientProperty( key );
|
||||||
return (value instanceof Boolean) ? (boolean) value : defaultValue;
|
return (value instanceof Boolean) ? (boolean) value : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a client property of a component is an integer and returns its value.
|
||||||
|
* If the client property is not set, or not an integer, defaultValue is returned.
|
||||||
|
*/
|
||||||
|
static int clientPropertyInt( JComponent c, String key, int defaultValue ) {
|
||||||
|
Object value = c.getClientProperty( key );
|
||||||
|
return (value instanceof Integer) ? (int) value : defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a client property of a component is a color and returns its value.
|
||||||
|
* If the client property is not set, or not a color, defaultValue is returned.
|
||||||
|
*/
|
||||||
|
static Color clientPropertyColor( JComponent c, String key, Color defaultValue ) {
|
||||||
|
Object value = c.getClientProperty( key );
|
||||||
|
return (value instanceof Color) ? (Color) value : defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,639 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf;
|
||||||
|
|
||||||
|
import javax.swing.InputMap;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.UIDefaults;
|
||||||
|
import javax.swing.UIDefaults.LazyValue;
|
||||||
|
import javax.swing.plaf.InputMapUIResource;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
|
import static javax.swing.text.DefaultEditorKit.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
class FlatInputMaps
|
||||||
|
{
|
||||||
|
static void initInputMaps( UIDefaults defaults ) {
|
||||||
|
initBasicInputMaps( defaults );
|
||||||
|
initTextComponentInputMaps( defaults );
|
||||||
|
|
||||||
|
if( SystemInfo.IS_MAC )
|
||||||
|
initMacInputMaps( defaults );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void initBasicInputMaps( UIDefaults defaults ) {
|
||||||
|
defaults.put( "Button.focusInputMap", new UIDefaults.LazyInputMap( new Object[] {
|
||||||
|
"SPACE", "pressed",
|
||||||
|
"released SPACE", "released"
|
||||||
|
} ) );
|
||||||
|
|
||||||
|
modifyInputMap( defaults, "ComboBox.ancestorInputMap",
|
||||||
|
"SPACE", "spacePopup",
|
||||||
|
|
||||||
|
"UP", mac( "selectPrevious2", "selectPrevious" ),
|
||||||
|
"DOWN", mac( "selectNext2", "selectNext" ),
|
||||||
|
"KP_UP", mac( "selectPrevious2", "selectPrevious" ),
|
||||||
|
"KP_DOWN", mac( "selectNext2", "selectNext" ),
|
||||||
|
|
||||||
|
mac( "alt UP", null ), "togglePopup",
|
||||||
|
mac( "alt DOWN", null ), "togglePopup",
|
||||||
|
mac( "alt KP_UP", null ), "togglePopup",
|
||||||
|
mac( "alt KP_DOWN", null ), "togglePopup"
|
||||||
|
);
|
||||||
|
|
||||||
|
if( !SystemInfo.IS_MAC ) {
|
||||||
|
modifyInputMap( defaults, "FileChooser.ancestorInputMap",
|
||||||
|
"F2", "editFileName",
|
||||||
|
"BACK_SPACE", "Go Up"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// join ltr and rtl bindings to fix up/down/etc keys in right-to-left component orientation
|
||||||
|
Object[] bindings = (Object[]) defaults.get( "PopupMenu.selectedWindowInputMapBindings" );
|
||||||
|
Object[] rtlBindings = (Object[]) defaults.get( "PopupMenu.selectedWindowInputMapBindings.RightToLeft" );
|
||||||
|
if( bindings != null && rtlBindings != null ) {
|
||||||
|
Object[] newBindings = new Object[bindings.length + rtlBindings.length];
|
||||||
|
System.arraycopy( bindings, 0, newBindings, 0, bindings.length );
|
||||||
|
System.arraycopy( rtlBindings, 0, newBindings, bindings.length, rtlBindings.length );
|
||||||
|
defaults.put( "PopupMenu.selectedWindowInputMapBindings.RightToLeft", newBindings );
|
||||||
|
}
|
||||||
|
|
||||||
|
modifyInputMap( defaults, "TabbedPane.ancestorInputMap",
|
||||||
|
"ctrl TAB", "navigateNext",
|
||||||
|
"shift ctrl TAB", "navigatePrevious"
|
||||||
|
);
|
||||||
|
|
||||||
|
modifyInputMap( defaults, "Table.ancestorInputMap",
|
||||||
|
// swap to make it consistent with List and Tree
|
||||||
|
"HOME", "selectFirstRow",
|
||||||
|
"END", "selectLastRow",
|
||||||
|
mac( "ctrl HOME", null ), "selectFirstColumn",
|
||||||
|
mac( "ctrl END", null ), "selectLastColumn"
|
||||||
|
);
|
||||||
|
|
||||||
|
if( !SystemInfo.IS_MAC ) {
|
||||||
|
modifyInputMap( defaults, "Tree.focusInputMap",
|
||||||
|
"ADD", "expand",
|
||||||
|
"SUBTRACT", "collapse"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void initTextComponentInputMaps( UIDefaults defaults ) {
|
||||||
|
Object[] commonTextComponentBindings = {
|
||||||
|
// move caret one character (without selecting text)
|
||||||
|
"LEFT", backwardAction,
|
||||||
|
"RIGHT", forwardAction,
|
||||||
|
"KP_LEFT", backwardAction,
|
||||||
|
"KP_RIGHT", forwardAction,
|
||||||
|
|
||||||
|
// move caret one character and select text
|
||||||
|
"shift LEFT", selectionBackwardAction,
|
||||||
|
"shift RIGHT", selectionForwardAction,
|
||||||
|
"shift KP_LEFT", selectionBackwardAction,
|
||||||
|
"shift KP_RIGHT", selectionForwardAction,
|
||||||
|
|
||||||
|
// move caret to word (without selecting text)
|
||||||
|
mac( "ctrl LEFT", "alt LEFT" ), previousWordAction,
|
||||||
|
mac( "ctrl RIGHT", "alt RIGHT" ), nextWordAction,
|
||||||
|
mac( "ctrl KP_LEFT", "alt KP_LEFT" ), previousWordAction,
|
||||||
|
mac( "ctrl KP_RIGHT", "alt KP_RIGHT" ), nextWordAction,
|
||||||
|
|
||||||
|
// move caret to word and select text
|
||||||
|
mac( "ctrl shift LEFT", "shift alt LEFT" ), selectionPreviousWordAction,
|
||||||
|
mac( "ctrl shift RIGHT", "shift alt RIGHT" ), selectionNextWordAction,
|
||||||
|
mac( "ctrl shift KP_LEFT", "shift alt KP_LEFT" ), selectionPreviousWordAction,
|
||||||
|
mac( "ctrl shift KP_RIGHT", "shift alt KP_RIGHT" ), selectionNextWordAction,
|
||||||
|
|
||||||
|
// move caret to line begin/end (without selecting text)
|
||||||
|
mac( "HOME", "meta LEFT" ), beginLineAction,
|
||||||
|
mac( "END", "meta RIGHT" ), endLineAction,
|
||||||
|
|
||||||
|
// move caret to line begin/end and select text
|
||||||
|
mac( "shift HOME", "shift meta LEFT" ), selectionBeginLineAction,
|
||||||
|
mac( "shift END", "shift meta RIGHT" ), selectionEndLineAction,
|
||||||
|
|
||||||
|
// select all/none
|
||||||
|
mac( "ctrl A", "meta A" ), selectAllAction,
|
||||||
|
mac( "ctrl BACK_SLASH", "meta BACK_SLASH" ), "unselect", // DefaultEditorKit.unselectAction
|
||||||
|
|
||||||
|
// delete previous/next character
|
||||||
|
"BACK_SPACE", deletePrevCharAction,
|
||||||
|
"shift BACK_SPACE", deletePrevCharAction,
|
||||||
|
"ctrl H", deletePrevCharAction,
|
||||||
|
"DELETE", deleteNextCharAction,
|
||||||
|
|
||||||
|
// delete previous/next word
|
||||||
|
mac( "ctrl BACK_SPACE", "alt BACK_SPACE" ), deletePrevWordAction,
|
||||||
|
mac( "ctrl DELETE", "alt DELETE" ), deleteNextWordAction,
|
||||||
|
|
||||||
|
// clipboard
|
||||||
|
mac( "ctrl X", "meta X" ), cutAction,
|
||||||
|
mac( "ctrl C", "meta C" ), copyAction,
|
||||||
|
mac( "ctrl V", "meta V" ), pasteAction,
|
||||||
|
"CUT", cutAction,
|
||||||
|
"COPY", copyAction,
|
||||||
|
"PASTE", pasteAction,
|
||||||
|
mac( "shift DELETE", null ), cutAction,
|
||||||
|
mac( "control INSERT", null ), copyAction,
|
||||||
|
mac( "shift INSERT", null ), pasteAction,
|
||||||
|
|
||||||
|
// misc
|
||||||
|
"control shift O", "toggle-componentOrientation", // DefaultEditorKit.toggleComponentOrientation
|
||||||
|
};
|
||||||
|
|
||||||
|
Object[] macCommonTextComponentBindings = SystemInfo.IS_MAC ? new Object[] {
|
||||||
|
// move caret one character (without selecting text)
|
||||||
|
"ctrl B", backwardAction,
|
||||||
|
"ctrl F", forwardAction,
|
||||||
|
|
||||||
|
// move caret to document begin/end (without selecting text)
|
||||||
|
"HOME", beginAction,
|
||||||
|
"END", endAction,
|
||||||
|
"meta UP", beginAction,
|
||||||
|
"meta DOWN", endAction,
|
||||||
|
"meta KP_UP", beginAction,
|
||||||
|
"meta KP_DOWN", endAction,
|
||||||
|
"ctrl P", beginAction,
|
||||||
|
"ctrl N", endAction,
|
||||||
|
"ctrl V", endAction,
|
||||||
|
|
||||||
|
// move caret to line begin/end (without selecting text)
|
||||||
|
"meta KP_LEFT", beginLineAction,
|
||||||
|
"meta KP_RIGHT", endLineAction,
|
||||||
|
"ctrl A", beginLineAction,
|
||||||
|
"ctrl E", endLineAction,
|
||||||
|
|
||||||
|
// move caret to document begin/end and select text
|
||||||
|
"shift meta UP", selectionBeginAction,
|
||||||
|
"shift meta DOWN", selectionEndAction,
|
||||||
|
"shift meta KP_UP", selectionBeginAction,
|
||||||
|
"shift meta KP_DOWN", selectionEndAction,
|
||||||
|
"shift HOME", selectionBeginAction,
|
||||||
|
"shift END", selectionEndAction,
|
||||||
|
|
||||||
|
// move caret to line begin/end and select text
|
||||||
|
"shift meta KP_LEFT", selectionBeginLineAction,
|
||||||
|
"shift meta KP_RIGHT", selectionEndLineAction,
|
||||||
|
"shift UP", selectionBeginLineAction,
|
||||||
|
"shift DOWN", selectionEndLineAction,
|
||||||
|
"shift KP_UP", selectionBeginLineAction,
|
||||||
|
"shift KP_DOWN", selectionEndLineAction,
|
||||||
|
|
||||||
|
// delete previous/next word
|
||||||
|
"ctrl W", deletePrevWordAction,
|
||||||
|
"ctrl D", deleteNextCharAction,
|
||||||
|
} : null;
|
||||||
|
|
||||||
|
Object[] singleLineTextComponentBindings = {
|
||||||
|
"ENTER", JTextField.notifyAction,
|
||||||
|
};
|
||||||
|
|
||||||
|
Object[] macSingleLineTextComponentBindings = SystemInfo.IS_MAC ? new Object[] {
|
||||||
|
// move caret to line begin/end (without selecting text)
|
||||||
|
"UP", beginLineAction,
|
||||||
|
"DOWN", endLineAction,
|
||||||
|
"KP_UP", beginLineAction,
|
||||||
|
"KP_DOWN", endLineAction,
|
||||||
|
} : null;
|
||||||
|
|
||||||
|
Object[] formattedTextComponentBindings = {
|
||||||
|
// reset
|
||||||
|
"ESCAPE", "reset-field-edit",
|
||||||
|
|
||||||
|
// increment/decrement
|
||||||
|
"UP", "increment",
|
||||||
|
"DOWN", "decrement",
|
||||||
|
"KP_UP", "increment",
|
||||||
|
"KP_DOWN", "decrement",
|
||||||
|
};
|
||||||
|
|
||||||
|
Object[] passwordTextComponentBindings = {
|
||||||
|
// move caret to line begin/end (without selecting text)
|
||||||
|
mac( "ctrl LEFT", "alt LEFT" ), beginLineAction,
|
||||||
|
mac( "ctrl RIGHT", "alt RIGHT" ), endLineAction,
|
||||||
|
mac( "ctrl KP_LEFT", "alt KP_LEFT" ), beginLineAction,
|
||||||
|
mac( "ctrl KP_RIGHT", "alt KP_RIGHT" ), endLineAction,
|
||||||
|
|
||||||
|
// move caret to line begin/end and select text
|
||||||
|
mac( "ctrl shift LEFT", "shift alt LEFT" ), selectionBeginLineAction,
|
||||||
|
mac( "ctrl shift RIGHT", "shift alt RIGHT" ), selectionEndLineAction,
|
||||||
|
mac( "ctrl shift KP_LEFT", "shift alt KP_LEFT" ), selectionBeginLineAction,
|
||||||
|
mac( "ctrl shift KP_RIGHT", "shift alt KP_RIGHT" ), selectionEndLineAction,
|
||||||
|
|
||||||
|
// delete previous/next word
|
||||||
|
mac( "ctrl BACK_SPACE", "alt BACK_SPACE" ), null,
|
||||||
|
mac( "ctrl DELETE", "alt DELETE" ), null,
|
||||||
|
};
|
||||||
|
|
||||||
|
Object[] multiLineTextComponentBindings = {
|
||||||
|
// move caret one line (without selecting text)
|
||||||
|
"UP", upAction,
|
||||||
|
"DOWN", downAction,
|
||||||
|
"KP_UP", upAction,
|
||||||
|
"KP_DOWN", downAction,
|
||||||
|
|
||||||
|
// move caret one line and select text
|
||||||
|
"shift UP", selectionUpAction,
|
||||||
|
"shift DOWN", selectionDownAction,
|
||||||
|
"shift KP_UP", selectionUpAction,
|
||||||
|
"shift KP_DOWN", selectionDownAction,
|
||||||
|
|
||||||
|
// move caret one page (without selecting text)
|
||||||
|
"PAGE_UP", pageUpAction,
|
||||||
|
"PAGE_DOWN", pageDownAction,
|
||||||
|
|
||||||
|
// move caret one page and select text
|
||||||
|
"shift PAGE_UP", "selection-page-up", // DefaultEditorKit.selectionPageUpAction
|
||||||
|
"shift PAGE_DOWN", "selection-page-down", // DefaultEditorKit.selectionPageDownAction
|
||||||
|
mac( "ctrl shift PAGE_UP", "shift meta PAGE_UP" ), "selection-page-left", // DefaultEditorKit.selectionPageLeftAction
|
||||||
|
mac( "ctrl shift PAGE_DOWN", "shift meta PAGE_DOWN" ), "selection-page-right", // DefaultEditorKit.selectionPageRightAction
|
||||||
|
|
||||||
|
// move caret to document begin/end (without selecting text)
|
||||||
|
mac( "ctrl HOME", "meta UP" ), beginAction,
|
||||||
|
mac( "ctrl END", "meta DOWN" ), endAction,
|
||||||
|
|
||||||
|
// move caret to document begin/end and select text
|
||||||
|
mac( "ctrl shift HOME", "shift meta UP" ), selectionBeginAction,
|
||||||
|
mac( "ctrl shift END", "shift meta DOWN" ), selectionEndAction,
|
||||||
|
|
||||||
|
// misc
|
||||||
|
"ENTER", insertBreakAction,
|
||||||
|
"TAB", insertTabAction,
|
||||||
|
|
||||||
|
// links
|
||||||
|
mac( "ctrl T", "meta T" ), "next-link-action",
|
||||||
|
mac( "ctrl shift T", "shift meta T" ), "previous-link-action",
|
||||||
|
mac( "ctrl SPACE", "meta SPACE" ), "activate-link-action",
|
||||||
|
};
|
||||||
|
|
||||||
|
Object[] macMultiLineTextComponentBindings = SystemInfo.IS_MAC ? new Object[] {
|
||||||
|
// move caret one line (without selecting text)
|
||||||
|
"ctrl N", downAction,
|
||||||
|
"ctrl P", upAction,
|
||||||
|
|
||||||
|
// move caret to beginning/end of paragraph and select text
|
||||||
|
"shift alt UP", selectionBeginParagraphAction,
|
||||||
|
"shift alt DOWN", selectionEndParagraphAction,
|
||||||
|
"shift alt KP_UP", selectionBeginParagraphAction,
|
||||||
|
"shift alt KP_DOWN", selectionEndParagraphAction,
|
||||||
|
|
||||||
|
// move caret one page (without selecting text)
|
||||||
|
"ctrl V", pageDownAction,
|
||||||
|
} : null;
|
||||||
|
|
||||||
|
defaults.put( "TextField.focusInputMap", new LazyInputMapEx(
|
||||||
|
commonTextComponentBindings,
|
||||||
|
macCommonTextComponentBindings,
|
||||||
|
singleLineTextComponentBindings,
|
||||||
|
macSingleLineTextComponentBindings
|
||||||
|
) );
|
||||||
|
defaults.put( "FormattedTextField.focusInputMap", new LazyInputMapEx(
|
||||||
|
commonTextComponentBindings,
|
||||||
|
macCommonTextComponentBindings,
|
||||||
|
singleLineTextComponentBindings,
|
||||||
|
macSingleLineTextComponentBindings,
|
||||||
|
formattedTextComponentBindings
|
||||||
|
) );
|
||||||
|
defaults.put( "PasswordField.focusInputMap", new LazyInputMapEx(
|
||||||
|
commonTextComponentBindings,
|
||||||
|
macCommonTextComponentBindings,
|
||||||
|
singleLineTextComponentBindings,
|
||||||
|
macSingleLineTextComponentBindings,
|
||||||
|
passwordTextComponentBindings
|
||||||
|
) );
|
||||||
|
|
||||||
|
Object multiLineInputMap = new LazyInputMapEx(
|
||||||
|
commonTextComponentBindings,
|
||||||
|
macCommonTextComponentBindings,
|
||||||
|
multiLineTextComponentBindings,
|
||||||
|
macMultiLineTextComponentBindings
|
||||||
|
);
|
||||||
|
defaults.put( "TextArea.focusInputMap", multiLineInputMap );
|
||||||
|
defaults.put( "TextPane.focusInputMap", multiLineInputMap );
|
||||||
|
defaults.put( "EditorPane.focusInputMap", multiLineInputMap );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void initMacInputMaps( UIDefaults defaults ) {
|
||||||
|
// list
|
||||||
|
modifyInputMap( defaults, "List.focusInputMap",
|
||||||
|
"meta A", "selectAll",
|
||||||
|
"meta C", "copy",
|
||||||
|
"meta V", "paste",
|
||||||
|
"meta X", "cut",
|
||||||
|
|
||||||
|
// let parent scroll pane do the macOS typical scrolling without changing selection
|
||||||
|
"HOME", null,
|
||||||
|
"END", null,
|
||||||
|
"PAGE_UP", null,
|
||||||
|
"PAGE_DOWN", null,
|
||||||
|
|
||||||
|
"ctrl A", null,
|
||||||
|
"ctrl BACK_SLASH", null,
|
||||||
|
"ctrl C", null,
|
||||||
|
"ctrl DOWN", null,
|
||||||
|
"ctrl END", null,
|
||||||
|
"ctrl HOME", null,
|
||||||
|
"ctrl INSERT", null,
|
||||||
|
"ctrl KP_DOWN", null,
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl KP_RIGHT", null,
|
||||||
|
"ctrl KP_UP", null,
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl PAGE_DOWN", null,
|
||||||
|
"ctrl PAGE_UP", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"ctrl SLASH", null,
|
||||||
|
"ctrl SPACE", null,
|
||||||
|
"ctrl UP", null,
|
||||||
|
"ctrl V", null,
|
||||||
|
"ctrl X", null,
|
||||||
|
"SPACE", null,
|
||||||
|
"shift ctrl DOWN", null,
|
||||||
|
"shift ctrl END", null,
|
||||||
|
"shift ctrl HOME", null,
|
||||||
|
"shift ctrl KP_DOWN", null,
|
||||||
|
"shift ctrl KP_LEFT", null,
|
||||||
|
"shift ctrl KP_RIGHT", null,
|
||||||
|
"shift ctrl KP_UP", null,
|
||||||
|
"shift ctrl LEFT", null,
|
||||||
|
"shift ctrl PAGE_DOWN", null,
|
||||||
|
"shift ctrl PAGE_UP", null,
|
||||||
|
"shift ctrl RIGHT", null,
|
||||||
|
"shift ctrl SPACE", null,
|
||||||
|
"shift ctrl UP", null,
|
||||||
|
"shift DELETE", null,
|
||||||
|
"shift INSERT", null,
|
||||||
|
"shift SPACE", null
|
||||||
|
);
|
||||||
|
modifyInputMap( defaults, "List.focusInputMap.RightToLeft",
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl KP_RIGHT", null,
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"shift ctrl KP_LEFT", null,
|
||||||
|
"shift ctrl KP_RIGHT", null,
|
||||||
|
"shift ctrl LEFT", null,
|
||||||
|
"shift ctrl RIGHT", null
|
||||||
|
);
|
||||||
|
|
||||||
|
// scrollpane
|
||||||
|
modifyInputMap( defaults, "ScrollPane.ancestorInputMap",
|
||||||
|
"END", "scrollEnd",
|
||||||
|
"HOME", "scrollHome",
|
||||||
|
|
||||||
|
"ctrl END", null,
|
||||||
|
"ctrl HOME", null,
|
||||||
|
"ctrl PAGE_DOWN", null,
|
||||||
|
"ctrl PAGE_UP", null
|
||||||
|
);
|
||||||
|
modifyInputMap( defaults, "ScrollPane.ancestorInputMap.RightToLeft",
|
||||||
|
"ctrl PAGE_DOWN", null,
|
||||||
|
"ctrl PAGE_UP", null
|
||||||
|
);
|
||||||
|
|
||||||
|
// tabbedpane
|
||||||
|
modifyInputMap( defaults, "TabbedPane.ancestorInputMap",
|
||||||
|
"ctrl UP", null,
|
||||||
|
"ctrl KP_UP", null
|
||||||
|
);
|
||||||
|
modifyInputMap( defaults, "TabbedPane.focusInputMap",
|
||||||
|
"ctrl DOWN", null,
|
||||||
|
"ctrl KP_DOWN", null
|
||||||
|
);
|
||||||
|
|
||||||
|
// table
|
||||||
|
modifyInputMap( defaults, "Table.ancestorInputMap",
|
||||||
|
"alt TAB", "focusHeader",
|
||||||
|
"shift alt TAB", "focusHeader",
|
||||||
|
"meta A", "selectAll",
|
||||||
|
"meta C", "copy",
|
||||||
|
"meta V", "paste",
|
||||||
|
"meta X", "cut",
|
||||||
|
|
||||||
|
// let parent scroll pane do the macOS typical scrolling without changing selection
|
||||||
|
"HOME", null,
|
||||||
|
"END", null,
|
||||||
|
"PAGE_UP", null,
|
||||||
|
"PAGE_DOWN", null,
|
||||||
|
|
||||||
|
"ctrl A", null,
|
||||||
|
"ctrl BACK_SLASH", null,
|
||||||
|
"ctrl C", null,
|
||||||
|
"ctrl DOWN", null,
|
||||||
|
"ctrl END", null,
|
||||||
|
"ctrl HOME", null,
|
||||||
|
"ctrl INSERT", null,
|
||||||
|
"ctrl KP_DOWN", null,
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl KP_RIGHT", null,
|
||||||
|
"ctrl KP_UP", null,
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl PAGE_DOWN", null,
|
||||||
|
"ctrl PAGE_UP", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"ctrl SLASH", null,
|
||||||
|
"ctrl SPACE", null,
|
||||||
|
"ctrl UP", null,
|
||||||
|
"ctrl V", null,
|
||||||
|
"ctrl X", null,
|
||||||
|
"F2", null,
|
||||||
|
"F8", null,
|
||||||
|
"SPACE", null,
|
||||||
|
"shift ctrl DOWN", null,
|
||||||
|
"shift ctrl END", null,
|
||||||
|
"shift ctrl HOME", null,
|
||||||
|
"shift ctrl KP_DOWN", null,
|
||||||
|
"shift ctrl KP_LEFT", null,
|
||||||
|
"shift ctrl KP_RIGHT", null,
|
||||||
|
"shift ctrl KP_UP", null,
|
||||||
|
"shift ctrl LEFT", null,
|
||||||
|
"shift ctrl PAGE_DOWN", null,
|
||||||
|
"shift ctrl PAGE_UP", null,
|
||||||
|
"shift ctrl RIGHT", null,
|
||||||
|
"shift ctrl SPACE", null,
|
||||||
|
"shift ctrl UP", null,
|
||||||
|
"shift DELETE", null,
|
||||||
|
"shift INSERT", null,
|
||||||
|
"shift SPACE", null
|
||||||
|
);
|
||||||
|
modifyInputMap( defaults, "Table.ancestorInputMap.RightToLeft",
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl KP_RIGHT", null,
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"shift ctrl KP_LEFT", null,
|
||||||
|
"shift ctrl KP_RIGHT", null,
|
||||||
|
"shift ctrl LEFT", null,
|
||||||
|
"shift ctrl RIGHT", null
|
||||||
|
);
|
||||||
|
|
||||||
|
// tree node expanding/collapsing
|
||||||
|
modifyInputMap( defaults, "Tree.focusInputMap",
|
||||||
|
"LEFT", "selectParent",
|
||||||
|
"RIGHT", "selectChild",
|
||||||
|
"KP_LEFT", "selectParent",
|
||||||
|
"KP_RIGHT", "selectChild",
|
||||||
|
"shift LEFT", "selectParent",
|
||||||
|
"shift RIGHT", "selectChild",
|
||||||
|
"shift KP_LEFT", "selectParent",
|
||||||
|
"shift KP_RIGHT", "selectChild",
|
||||||
|
"alt LEFT", "selectParent",
|
||||||
|
"alt RIGHT", "selectChild",
|
||||||
|
"alt KP_LEFT", "selectParent",
|
||||||
|
"alt KP_RIGHT", "selectChild",
|
||||||
|
|
||||||
|
"meta A", "selectAll",
|
||||||
|
"meta C", "copy",
|
||||||
|
"meta V", "paste",
|
||||||
|
"meta X", "cut",
|
||||||
|
|
||||||
|
// let parent scroll pane do the macOS typical scrolling without changing selection
|
||||||
|
"HOME", null,
|
||||||
|
"END", null,
|
||||||
|
"PAGE_UP", null,
|
||||||
|
"PAGE_DOWN", null,
|
||||||
|
|
||||||
|
"ctrl LEFT", null,
|
||||||
|
"ctrl RIGHT", null,
|
||||||
|
"ctrl KP_LEFT", null,
|
||||||
|
"ctrl KP_RIGHT", null,
|
||||||
|
|
||||||
|
"ctrl A", null,
|
||||||
|
"ctrl BACK_SLASH", null,
|
||||||
|
"ctrl C", null,
|
||||||
|
"ctrl DOWN", null,
|
||||||
|
"ctrl END", null,
|
||||||
|
"ctrl HOME", null,
|
||||||
|
"ctrl INSERT", null,
|
||||||
|
"ctrl KP_DOWN", null,
|
||||||
|
"ctrl KP_UP", null,
|
||||||
|
"ctrl PAGE_DOWN", null,
|
||||||
|
"ctrl PAGE_UP", null,
|
||||||
|
"ctrl SLASH", null,
|
||||||
|
"ctrl SPACE", null,
|
||||||
|
"ctrl UP", null,
|
||||||
|
"ctrl V", null,
|
||||||
|
"ctrl X", null,
|
||||||
|
"F2", null,
|
||||||
|
"SPACE", null,
|
||||||
|
"shift ctrl DOWN", null,
|
||||||
|
"shift ctrl END", null,
|
||||||
|
"shift ctrl HOME", null,
|
||||||
|
"shift ctrl KP_DOWN", null,
|
||||||
|
"shift ctrl KP_UP", null,
|
||||||
|
"shift ctrl PAGE_DOWN", null,
|
||||||
|
"shift ctrl PAGE_UP", null,
|
||||||
|
"shift ctrl SPACE", null,
|
||||||
|
"shift ctrl UP", null,
|
||||||
|
"shift DELETE", null,
|
||||||
|
"shift END", null,
|
||||||
|
"shift HOME", null,
|
||||||
|
"shift INSERT", null,
|
||||||
|
"shift PAGE_DOWN", null,
|
||||||
|
"shift PAGE_UP", null,
|
||||||
|
"shift SPACE", null
|
||||||
|
);
|
||||||
|
defaults.put( "Tree.focusInputMap.RightToLeft", new UIDefaults.LazyInputMap( new Object[] {
|
||||||
|
"LEFT", "selectChild",
|
||||||
|
"RIGHT", "selectParent",
|
||||||
|
"KP_LEFT", "selectChild",
|
||||||
|
"KP_RIGHT", "selectParent",
|
||||||
|
"shift LEFT", "selectChild",
|
||||||
|
"shift RIGHT", "selectParent",
|
||||||
|
"shift KP_LEFT", "selectChild",
|
||||||
|
"shift KP_RIGHT", "selectParent",
|
||||||
|
"alt LEFT", "selectChild",
|
||||||
|
"alt RIGHT", "selectParent",
|
||||||
|
"alt KP_LEFT", "selectChild",
|
||||||
|
"alt KP_RIGHT", "selectParent"
|
||||||
|
} ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void modifyInputMap( UIDefaults defaults, String key, Object... bindings ) {
|
||||||
|
// Note: not using `defaults.get(key)` here because this would resolve the lazy value
|
||||||
|
defaults.put( key, new LazyModifyInputMap( defaults.remove( key ), bindings ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> T mac( T value, T macValue ) {
|
||||||
|
return SystemInfo.IS_MAC ? macValue : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class LazyInputMapEx -----------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily creates a input map.
|
||||||
|
* Similar to {@link UIDefaults.LazyInputMap}, but can use multiple bindings arrays.
|
||||||
|
*/
|
||||||
|
private static class LazyInputMapEx
|
||||||
|
implements LazyValue
|
||||||
|
{
|
||||||
|
private final Object[][] bindingsArray;
|
||||||
|
|
||||||
|
LazyInputMapEx( Object[]... bindingsArray ) {
|
||||||
|
this.bindingsArray = bindingsArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object createValue( UIDefaults table ) {
|
||||||
|
InputMap inputMap = new InputMapUIResource();
|
||||||
|
for( Object[] bindings : bindingsArray )
|
||||||
|
LookAndFeel.loadKeyBindings( inputMap, bindings );
|
||||||
|
return inputMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class LazyModifyInputMap -------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a (lazy) base input map and lazily applies modifications to it specified in bindings.
|
||||||
|
*/
|
||||||
|
private static class LazyModifyInputMap
|
||||||
|
implements LazyValue
|
||||||
|
{
|
||||||
|
private final Object baseInputMap;
|
||||||
|
private final Object[] bindings;
|
||||||
|
|
||||||
|
LazyModifyInputMap( Object baseInputMap, Object[] bindings ) {
|
||||||
|
this.baseInputMap = baseInputMap;
|
||||||
|
this.bindings = bindings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object createValue( UIDefaults table ) {
|
||||||
|
// get base input map
|
||||||
|
InputMap inputMap = (baseInputMap instanceof LazyValue)
|
||||||
|
? (InputMap) ((LazyValue)baseInputMap).createValue( table )
|
||||||
|
: (InputMap) baseInputMap;
|
||||||
|
|
||||||
|
// modify input map (replace or remove)
|
||||||
|
for( int i = 0; i < bindings.length; i += 2 ) {
|
||||||
|
KeyStroke keyStroke = KeyStroke.getKeyStroke( (String) bindings[i] );
|
||||||
|
if( bindings[i + 1] != null )
|
||||||
|
inputMap.put( keyStroke, bindings[i + 1] );
|
||||||
|
else
|
||||||
|
inputMap.remove( keyStroke );
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,17 +23,22 @@ import java.awt.EventQueue;
|
|||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.KeyEventPostProcessor;
|
import java.awt.KeyEventPostProcessor;
|
||||||
import java.awt.KeyboardFocusManager;
|
import java.awt.KeyboardFocusManager;
|
||||||
|
import java.awt.RenderingHints;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JRootPane;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.PopupFactory;
|
import javax.swing.PopupFactory;
|
||||||
@@ -44,7 +49,6 @@ import javax.swing.UnsupportedLookAndFeelException;
|
|||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.ColorUIResource;
|
||||||
import javax.swing.plaf.FontUIResource;
|
import javax.swing.plaf.FontUIResource;
|
||||||
import javax.swing.plaf.basic.BasicLookAndFeel;
|
import javax.swing.plaf.basic.BasicLookAndFeel;
|
||||||
import javax.swing.plaf.metal.MetalLookAndFeel;
|
|
||||||
import javax.swing.text.html.HTMLEditorKit;
|
import javax.swing.text.html.HTMLEditorKit;
|
||||||
import com.formdev.flatlaf.util.SystemInfo;
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
@@ -58,14 +62,17 @@ public abstract class FlatLaf
|
|||||||
extends BasicLookAndFeel
|
extends BasicLookAndFeel
|
||||||
{
|
{
|
||||||
static final Logger LOG = Logger.getLogger( FlatLaf.class.getName() );
|
static final Logger LOG = Logger.getLogger( FlatLaf.class.getName() );
|
||||||
|
private static final String DESKTOPFONTHINTS = "awt.font.desktophints";
|
||||||
private BasicLookAndFeel base;
|
|
||||||
|
|
||||||
private String desktopPropertyName;
|
private String desktopPropertyName;
|
||||||
private PropertyChangeListener desktopPropertyListener;
|
private PropertyChangeListener desktopPropertyListener;
|
||||||
|
|
||||||
|
private static boolean aquaLoaded;
|
||||||
|
private static boolean updateUIPending;
|
||||||
|
|
||||||
private KeyEventPostProcessor mnemonicListener;
|
private KeyEventPostProcessor mnemonicListener;
|
||||||
private static boolean showMnemonics;
|
private static boolean showMnemonics;
|
||||||
|
private static WeakReference<Window> lastShowMnemonicWindow;
|
||||||
|
|
||||||
private Consumer<UIDefaults> postInitialization;
|
private Consumer<UIDefaults> postInitialization;
|
||||||
|
|
||||||
@@ -106,15 +113,11 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
getBase().initialize();
|
if( SystemInfo.IS_MAC )
|
||||||
|
initializeAqua();
|
||||||
|
|
||||||
super.initialize();
|
super.initialize();
|
||||||
|
|
||||||
// make sure that a plain popup factory is used (otherwise sub-menu rendering
|
|
||||||
// is "jittery" on Mac, where AquaLookAndFeel installs its own popup factory)
|
|
||||||
if( PopupFactory.getSharedInstance().getClass() != PopupFactory.class )
|
|
||||||
PopupFactory.setSharedInstance( new PopupFactory() );
|
|
||||||
|
|
||||||
// add mnemonic listener
|
// add mnemonic listener
|
||||||
mnemonicListener = e -> {
|
mnemonicListener = e -> {
|
||||||
checkShowMnemonics( e );
|
checkShowMnemonics( e );
|
||||||
@@ -135,9 +138,19 @@ public abstract class FlatLaf
|
|||||||
}
|
}
|
||||||
if( desktopPropertyName != null ) {
|
if( desktopPropertyName != null ) {
|
||||||
desktopPropertyListener = e -> {
|
desktopPropertyListener = e -> {
|
||||||
reSetLookAndFeel();
|
String propertyName = e.getPropertyName();
|
||||||
|
if( desktopPropertyName.equals( propertyName ) )
|
||||||
|
reSetLookAndFeel();
|
||||||
|
else if( DESKTOPFONTHINTS.equals( propertyName ) ) {
|
||||||
|
if( UIManager.getLookAndFeel() instanceof FlatLaf ) {
|
||||||
|
putAATextInfo( UIManager.getLookAndFeelDefaults() );
|
||||||
|
updateUILater();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
Toolkit.getDefaultToolkit().addPropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
|
toolkit.addPropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
||||||
|
toolkit.addPropertyChangeListener( DESKTOPFONTHINTS, desktopPropertyListener );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Following code should be ideally in initialize(), but needs color from UI defaults.
|
// Following code should be ideally in initialize(), but needs color from UI defaults.
|
||||||
@@ -157,7 +170,9 @@ public abstract class FlatLaf
|
|||||||
public void uninitialize() {
|
public void uninitialize() {
|
||||||
// remove desktop property listener
|
// remove desktop property listener
|
||||||
if( desktopPropertyListener != null ) {
|
if( desktopPropertyListener != null ) {
|
||||||
Toolkit.getDefaultToolkit().removePropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
|
toolkit.removePropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
||||||
|
toolkit.removePropertyChangeListener( DESKTOPFONTHINTS, desktopPropertyListener );
|
||||||
desktopPropertyName = null;
|
desktopPropertyName = null;
|
||||||
desktopPropertyListener = null;
|
desktopPropertyListener = null;
|
||||||
}
|
}
|
||||||
@@ -172,63 +187,84 @@ public abstract class FlatLaf
|
|||||||
new HTMLEditorKit().getStyleSheet().addRule( "a { color: blue; }" );
|
new HTMLEditorKit().getStyleSheet().addRule( "a { color: blue; }" );
|
||||||
postInitialization = null;
|
postInitialization = null;
|
||||||
|
|
||||||
if( base != null )
|
|
||||||
base.uninitialize();
|
|
||||||
|
|
||||||
super.uninitialize();
|
super.uninitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get/create base LaF. This is used to grab base UI defaults from different LaFs.
|
* Initialize Aqua LaF on macOS, which is required for using Mac screen menubar.
|
||||||
* E.g. on Mac from system dependent LaF, otherwise from Metal LaF.
|
* (at least on Java 8, since 9 it seems to work without it)
|
||||||
|
* <p>
|
||||||
|
* This loads the native library "osxui" and initializes JRSUI.
|
||||||
|
* Because both are not unloaded/uninitialized, Aqua LaF is initialized only once.
|
||||||
*/
|
*/
|
||||||
private BasicLookAndFeel getBase() {
|
private void initializeAqua() {
|
||||||
if( base == null ) {
|
if( aquaLoaded )
|
||||||
if( SystemInfo.IS_MAC ) {
|
return;
|
||||||
// use Mac Aqua LaF as base
|
|
||||||
String aquaLafClassName = "com.apple.laf.AquaLookAndFeel";
|
aquaLoaded = true;
|
||||||
try {
|
|
||||||
base = (BasicLookAndFeel) Class.forName( aquaLafClassName ).newInstance();
|
// create macOS Aqua LaF
|
||||||
} catch( Exception ex ) {
|
String aquaLafClassName = "com.apple.laf.AquaLookAndFeel";
|
||||||
LOG.log( Level.SEVERE, "FlatLaf: Failed to initialize base look and feel '" + aquaLafClassName + "'.", ex );
|
BasicLookAndFeel aquaLaf;
|
||||||
throw new IllegalStateException();
|
try {
|
||||||
}
|
if( SystemInfo.IS_JAVA_9_OR_LATER ) {
|
||||||
|
Method m = UIManager.class.getMethod( "createLookAndFeel", String.class );
|
||||||
|
aquaLaf = (BasicLookAndFeel) m.invoke( null, "Mac OS X" );
|
||||||
} else
|
} else
|
||||||
base = new MetalLookAndFeel();
|
aquaLaf = (BasicLookAndFeel) Class.forName( aquaLafClassName ).newInstance();
|
||||||
|
} catch( Exception ex ) {
|
||||||
|
LOG.log( Level.SEVERE, "FlatLaf: Failed to initialize Aqua look and feel '" + aquaLafClassName + "'.", ex );
|
||||||
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
return base;
|
|
||||||
|
// remember popup factory because aquaLaf.initialize() installs its own
|
||||||
|
// factory, which makes sub-menu rendering "jittery"
|
||||||
|
PopupFactory oldPopupFactory = PopupFactory.getSharedInstance();
|
||||||
|
|
||||||
|
// initialize Aqua LaF
|
||||||
|
aquaLaf.initialize();
|
||||||
|
aquaLaf.uninitialize();
|
||||||
|
|
||||||
|
// restore popup factory
|
||||||
|
PopupFactory.setSharedInstance( oldPopupFactory );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UIDefaults getDefaults() {
|
public UIDefaults getDefaults() {
|
||||||
UIDefaults defaults = getBase().getDefaults();
|
UIDefaults defaults = super.getDefaults();
|
||||||
|
|
||||||
// add Metal resource bundle, which is required for FlatFileChooserUI
|
// add Metal resource bundle, which is required for FlatFileChooserUI
|
||||||
defaults.addResourceBundle( "com.sun.swing.internal.plaf.metal.resources.metal" );
|
defaults.addResourceBundle( "com.sun.swing.internal.plaf.metal.resources.metal" );
|
||||||
|
|
||||||
// initialize some defaults (for overriding) that are used in basic UI delegates,
|
// initialize some defaults (for overriding) that are used in UI delegates,
|
||||||
// but are not set in MetalLookAndFeel or BasicLookAndFeel
|
// but are not set in BasicLookAndFeel
|
||||||
Color control = defaults.getColor( "control" );
|
putDefaults( defaults, defaults.getColor( "control" ),
|
||||||
defaults.put( "EditorPane.disabledBackground", control );
|
"EditorPane.disabledBackground",
|
||||||
defaults.put( "EditorPane.inactiveBackground", control );
|
"EditorPane.inactiveBackground",
|
||||||
defaults.put( "FormattedTextField.disabledBackground", control );
|
"FormattedTextField.disabledBackground",
|
||||||
defaults.put( "PasswordField.disabledBackground", control );
|
"PasswordField.disabledBackground",
|
||||||
defaults.put( "TextArea.disabledBackground", control );
|
"Spinner.disabledBackground",
|
||||||
defaults.put( "TextArea.inactiveBackground", control );
|
"TextArea.disabledBackground",
|
||||||
defaults.put( "TextField.disabledBackground", control );
|
"TextArea.inactiveBackground",
|
||||||
defaults.put( "TextPane.disabledBackground", control );
|
"TextField.disabledBackground",
|
||||||
defaults.put( "TextPane.inactiveBackground", control );
|
"TextPane.disabledBackground",
|
||||||
|
"TextPane.inactiveBackground" );
|
||||||
// initialize some own defaults (for overriding)
|
putDefaults( defaults, defaults.getColor( "textInactiveText" ),
|
||||||
defaults.put( "Spinner.disabledBackground", control );
|
"Button.disabledText",
|
||||||
defaults.put( "Spinner.disabledForeground", control );
|
"CheckBox.disabledText",
|
||||||
|
"CheckBoxMenuItem.disabledForeground",
|
||||||
// remember MenuBarUI from Mac Aqua LaF if Mac screen menubar is enabled
|
"Menu.disabledForeground",
|
||||||
boolean useScreenMenuBar = SystemInfo.IS_MAC && "true".equals( System.getProperty( "apple.laf.useScreenMenuBar" ) );
|
"MenuItem.disabledForeground",
|
||||||
Object aquaMenuBarUI = useScreenMenuBar ? defaults.get( "MenuBarUI" ) : null;
|
"RadioButton.disabledText",
|
||||||
|
"RadioButtonMenuItem.disabledForeground",
|
||||||
|
"Spinner.disabledForeground",
|
||||||
|
"ToggleButton.disabledText" );
|
||||||
|
putDefaults( defaults, defaults.getColor( "textText" ),
|
||||||
|
"DesktopIcon.foreground" );
|
||||||
|
|
||||||
initFonts( defaults );
|
initFonts( defaults );
|
||||||
initIconColors( defaults, isDark() );
|
initIconColors( defaults, isDark() );
|
||||||
|
FlatInputMaps.initInputMaps( defaults );
|
||||||
|
|
||||||
// load defaults from properties
|
// load defaults from properties
|
||||||
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
List<Class<?>> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading();
|
||||||
@@ -238,8 +274,11 @@ public abstract class FlatLaf
|
|||||||
UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults );
|
UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults );
|
||||||
|
|
||||||
// use Aqua MenuBarUI if Mac screen menubar is enabled
|
// use Aqua MenuBarUI if Mac screen menubar is enabled
|
||||||
if( useScreenMenuBar )
|
if( SystemInfo.IS_MAC && Boolean.getBoolean( "apple.laf.useScreenMenuBar" ) )
|
||||||
defaults.put( "MenuBarUI", aquaMenuBarUI );
|
defaults.put( "MenuBarUI", "com.apple.laf.AquaMenuBarUI" );
|
||||||
|
|
||||||
|
// initialize text antialiasing
|
||||||
|
putAATextInfo( defaults );
|
||||||
|
|
||||||
invokePostInitialization( defaults );
|
invokePostInitialization( defaults );
|
||||||
|
|
||||||
@@ -266,14 +305,15 @@ public abstract class FlatLaf
|
|||||||
uiFont = new FontUIResource( winFont );
|
uiFont = new FontUIResource( winFont );
|
||||||
|
|
||||||
} else if( SystemInfo.IS_MAC ) {
|
} else if( SystemInfo.IS_MAC ) {
|
||||||
Font font = defaults.getFont( "Label.font" );
|
String fontName;
|
||||||
|
|
||||||
if( SystemInfo.IS_MAC_OS_10_11_EL_CAPITAN_OR_LATER ) {
|
if( SystemInfo.IS_MAC_OS_10_11_EL_CAPITAN_OR_LATER ) {
|
||||||
// use San Francisco Text font
|
// use San Francisco Text font
|
||||||
font = new FontUIResource( ".SF NS Text", font.getStyle(), font.getSize() );
|
fontName = ".SF NS Text";
|
||||||
|
} else {
|
||||||
|
// default font on older systems (see com.apple.laf.AquaFonts)
|
||||||
|
fontName = "Lucida Grande";
|
||||||
}
|
}
|
||||||
|
uiFont = new FontUIResource( fontName, Font.PLAIN, 13 );
|
||||||
uiFont = (font instanceof FontUIResource) ? (FontUIResource) font : new FontUIResource( font );
|
|
||||||
|
|
||||||
} else if( SystemInfo.IS_LINUX ) {
|
} else if( SystemInfo.IS_LINUX ) {
|
||||||
Font font = LinuxFontPolicy.getFont();
|
Font font = LinuxFontPolicy.getFont();
|
||||||
@@ -287,10 +327,9 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
// override fonts
|
// override fonts
|
||||||
for( Object key : defaults.keySet() ) {
|
for( Object key : defaults.keySet() ) {
|
||||||
if( key instanceof String && ((String)key).endsWith( ".font" ) )
|
if( key instanceof String && (((String)key).endsWith( ".font" ) || ((String)key).endsWith( "Font" )) )
|
||||||
defaults.put( key, uiFont );
|
defaults.put( key, uiFont );
|
||||||
}
|
}
|
||||||
defaults.put( "MenuItem.acceleratorFont", uiFont );
|
|
||||||
|
|
||||||
// use smaller font for progress bar
|
// use smaller font for progress bar
|
||||||
defaults.put( "ProgressBar.font", UIScale.scaleFont( uiFont, 0.85f ) );
|
defaults.put( "ProgressBar.font", UIScale.scaleFont( uiFont, 0.85f ) );
|
||||||
@@ -335,6 +374,44 @@ public abstract class FlatLaf
|
|||||||
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
|
defaults.put( "Objects.BlackText", new ColorUIResource( 0x231F20 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void putAATextInfo( UIDefaults defaults ) {
|
||||||
|
if( SystemInfo.IS_JAVA_9_OR_LATER ) {
|
||||||
|
Object desktopHints = Toolkit.getDefaultToolkit().getDesktopProperty( DESKTOPFONTHINTS );
|
||||||
|
if( desktopHints instanceof Map ) {
|
||||||
|
@SuppressWarnings( "unchecked" )
|
||||||
|
Map<Object, Object> hints = (Map<Object, Object>) desktopHints;
|
||||||
|
Object aaHint = hints.get( RenderingHints.KEY_TEXT_ANTIALIASING );
|
||||||
|
if( aaHint != null &&
|
||||||
|
aaHint != RenderingHints.VALUE_TEXT_ANTIALIAS_OFF &&
|
||||||
|
aaHint != RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT )
|
||||||
|
{
|
||||||
|
defaults.put( RenderingHints.KEY_TEXT_ANTIALIASING, aaHint );
|
||||||
|
defaults.put( RenderingHints.KEY_TEXT_LCD_CONTRAST,
|
||||||
|
hints.get( RenderingHints.KEY_TEXT_LCD_CONTRAST ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Java 8
|
||||||
|
try {
|
||||||
|
Object key = Class.forName( "sun.swing.SwingUtilities2" )
|
||||||
|
.getField( "AA_TEXT_PROPERTY_KEY" )
|
||||||
|
.get( null );
|
||||||
|
Object value = Class.forName( "sun.swing.SwingUtilities2$AATextInfo" )
|
||||||
|
.getMethod( "getAATextInfo", boolean.class )
|
||||||
|
.invoke( null, true );
|
||||||
|
defaults.put( key, value );
|
||||||
|
} catch( Exception ex ) {
|
||||||
|
Logger.getLogger( FlatLaf.class.getName() ).log( Level.SEVERE, null, ex );
|
||||||
|
throw new RuntimeException( ex );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putDefaults( UIDefaults defaults, Object value, String... keys ) {
|
||||||
|
for( String key : keys )
|
||||||
|
defaults.put( key, value );
|
||||||
|
}
|
||||||
|
|
||||||
private static void reSetLookAndFeel() {
|
private static void reSetLookAndFeel() {
|
||||||
EventQueue.invokeLater( () -> {
|
EventQueue.invokeLater( () -> {
|
||||||
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
||||||
@@ -356,7 +433,7 @@ public abstract class FlatLaf
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update UI of all application windows.
|
* Update UI of all application windows immediately.
|
||||||
* Invoke after changing LaF.
|
* Invoke after changing LaF.
|
||||||
*/
|
*/
|
||||||
public static void updateUI() {
|
public static void updateUI() {
|
||||||
@@ -364,6 +441,25 @@ public abstract class FlatLaf
|
|||||||
SwingUtilities.updateComponentTreeUI( w );
|
SwingUtilities.updateComponentTreeUI( w );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update UI of all application windows later.
|
||||||
|
*/
|
||||||
|
public static void updateUILater() {
|
||||||
|
synchronized( FlatLaf.class ) {
|
||||||
|
if( updateUIPending )
|
||||||
|
return;
|
||||||
|
|
||||||
|
updateUIPending = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
updateUI();
|
||||||
|
synchronized( FlatLaf.class ) {
|
||||||
|
updateUIPending = false;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isShowMnemonics() {
|
public static boolean isShowMnemonics() {
|
||||||
return showMnemonics || !UIManager.getBoolean( "Component.hideMnemonics" );
|
return showMnemonics || !UIManager.getBoolean( "Component.hideMnemonics" );
|
||||||
}
|
}
|
||||||
@@ -373,15 +469,15 @@ public abstract class FlatLaf
|
|||||||
if( SystemInfo.IS_MAC ) {
|
if( SystemInfo.IS_MAC ) {
|
||||||
// Ctrl+Alt keys must be pressed on Mac
|
// Ctrl+Alt keys must be pressed on Mac
|
||||||
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
|
if( keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_ALT )
|
||||||
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown() );
|
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown() && e.isAltDown(), e.getComponent() );
|
||||||
} else {
|
} else {
|
||||||
// Alt key must be pressed on Windows and Linux
|
// Alt key must be pressed on Windows and Linux
|
||||||
if( keyCode == KeyEvent.VK_ALT )
|
if( keyCode == KeyEvent.VK_ALT )
|
||||||
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED );
|
showMnemonics( e.getID() == KeyEvent.KEY_PRESSED, e.getComponent() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void showMnemonics( boolean show ) {
|
private static void showMnemonics( boolean show, Component c ) {
|
||||||
if( show == showMnemonics )
|
if( show == showMnemonics )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -391,22 +487,35 @@ public abstract class FlatLaf
|
|||||||
if( !UIManager.getBoolean( "Component.hideMnemonics" ) )
|
if( !UIManager.getBoolean( "Component.hideMnemonics" ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// get focus owner
|
if( show ) {
|
||||||
Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
|
// get root pane
|
||||||
if( focusOwner == null )
|
JRootPane rootPane = SwingUtilities.getRootPane( c );
|
||||||
return;
|
if( rootPane == null )
|
||||||
|
return;
|
||||||
|
|
||||||
// get focused window
|
// get window
|
||||||
Window window = SwingUtilities.windowForComponent( focusOwner );
|
Window window = SwingUtilities.getWindowAncestor( rootPane );
|
||||||
if( window == null )
|
if( window == null )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// repaint components with mnemonics in focused window
|
// repaint components with mnemonics in focused window
|
||||||
repaintMnemonics( window );
|
repaintMnemonics( window );
|
||||||
|
|
||||||
|
lastShowMnemonicWindow = new WeakReference<>( window );
|
||||||
|
} else if( lastShowMnemonicWindow != null ) {
|
||||||
|
Window window = lastShowMnemonicWindow.get();
|
||||||
|
if( window != null )
|
||||||
|
repaintMnemonics( window );
|
||||||
|
|
||||||
|
lastShowMnemonicWindow = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void repaintMnemonics( Container container ) {
|
private static void repaintMnemonics( Container container ) {
|
||||||
for( Component c : container.getComponents() ) {
|
for( Component c : container.getComponents() ) {
|
||||||
|
if( !c.isVisible() )
|
||||||
|
continue;
|
||||||
|
|
||||||
if( hasMnemonic( c ) )
|
if( hasMnemonic( c ) )
|
||||||
c.repaint();
|
c.repaint();
|
||||||
|
|
||||||
|
|||||||
@@ -445,11 +445,11 @@ public class IntelliJTheme
|
|||||||
for( Map.Entry<String, String> e : uiKeyMapping.entrySet() )
|
for( Map.Entry<String, String> e : uiKeyMapping.entrySet() )
|
||||||
uiKeyInverseMapping.put( e.getValue(), e.getKey() );
|
uiKeyInverseMapping.put( e.getValue(), e.getKey() );
|
||||||
|
|
||||||
uiKeyCopying.put( "ToggleButton.underline.underlineColor", "TabbedPane.underlineColor" );
|
uiKeyCopying.put( "ToggleButton.tab.underlineColor", "TabbedPane.underlineColor" );
|
||||||
uiKeyCopying.put( "ToggleButton.underline.disabledUnderlineColor", "TabbedPane.disabledUnderlineColor" );
|
uiKeyCopying.put( "ToggleButton.tab.disabledUnderlineColor", "TabbedPane.disabledUnderlineColor" );
|
||||||
uiKeyCopying.put( "ToggleButton.underline.selectedBackground", "TabbedPane.selectedBackground" );
|
uiKeyCopying.put( "ToggleButton.tab.selectedBackground", "TabbedPane.selectedBackground" );
|
||||||
uiKeyCopying.put( "ToggleButton.underline.hoverBackground", "TabbedPane.hoverColor" );
|
uiKeyCopying.put( "ToggleButton.tab.hoverBackground", "TabbedPane.hoverColor" );
|
||||||
uiKeyCopying.put( "ToggleButton.underline.focusBackground", "TabbedPane.focusColor" );
|
uiKeyCopying.put( "ToggleButton.tab.focusBackground", "TabbedPane.focusColor" );
|
||||||
|
|
||||||
checkboxKeyMapping.put( "Checkbox.Background.Default", "CheckBox.icon.background" );
|
checkboxKeyMapping.put( "Checkbox.Background.Default", "CheckBox.icon.background" );
|
||||||
checkboxKeyMapping.put( "Checkbox.Background.Disabled", "CheckBox.icon.disabledBackground" );
|
checkboxKeyMapping.put( "Checkbox.Background.Disabled", "CheckBox.icon.disabledBackground" );
|
||||||
|
|||||||
@@ -221,7 +221,8 @@ class UIDefaultsLoader
|
|||||||
return resolveValue( properties, newValue );
|
return resolveValue( properties, newValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum ValueType { UNKNOWN, STRING, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR, SCALEDINTEGER, INSTANCE, CLASS }
|
private enum ValueType { UNKNOWN, STRING, CHARACTER, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR,
|
||||||
|
SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS }
|
||||||
|
|
||||||
static Object parseValue( String key, String value ) {
|
static Object parseValue( String key, String value ) {
|
||||||
return parseValue( key, value, v -> v, Collections.emptyList() );
|
return parseValue( key, value, v -> v, Collections.emptyList() );
|
||||||
@@ -284,6 +285,8 @@ class UIDefaultsLoader
|
|||||||
valueType = ValueType.DIMENSION;
|
valueType = ValueType.DIMENSION;
|
||||||
else if( key.endsWith( "Width" ) || key.endsWith( "Height" ) )
|
else if( key.endsWith( "Width" ) || key.endsWith( "Height" ) )
|
||||||
valueType = ValueType.INTEGER;
|
valueType = ValueType.INTEGER;
|
||||||
|
else if( key.endsWith( "Char" ) )
|
||||||
|
valueType = ValueType.CHARACTER;
|
||||||
else if( key.endsWith( "UI" ) )
|
else if( key.endsWith( "UI" ) )
|
||||||
valueType = ValueType.STRING;
|
valueType = ValueType.STRING;
|
||||||
}
|
}
|
||||||
@@ -291,6 +294,7 @@ class UIDefaultsLoader
|
|||||||
// parse value
|
// parse value
|
||||||
switch( valueType ) {
|
switch( valueType ) {
|
||||||
case STRING: return value;
|
case STRING: return value;
|
||||||
|
case CHARACTER: return parseCharacter( value );
|
||||||
case INTEGER: return parseInteger( value, true );
|
case INTEGER: return parseInteger( value, true );
|
||||||
case FLOAT: return parseFloat( value, true );
|
case FLOAT: return parseFloat( value, true );
|
||||||
case BORDER: return parseBorder( value, resolver, addonClassLoaders );
|
case BORDER: return parseBorder( value, resolver, addonClassLoaders );
|
||||||
@@ -299,6 +303,9 @@ class UIDefaultsLoader
|
|||||||
case DIMENSION: return parseDimension( value );
|
case DIMENSION: return parseDimension( value );
|
||||||
case COLOR: return parseColorOrFunction( value, resolver, true );
|
case COLOR: return parseColorOrFunction( value, resolver, true );
|
||||||
case SCALEDINTEGER: return parseScaledInteger( value );
|
case SCALEDINTEGER: return parseScaledInteger( value );
|
||||||
|
case SCALEDFLOAT: return parseScaledFloat( value );
|
||||||
|
case SCALEDINSETS: return parseScaledInsets( value );
|
||||||
|
case SCALEDDIMENSION:return parseScaledDimension( value );
|
||||||
case INSTANCE: return parseInstance( value, addonClassLoaders );
|
case INSTANCE: return parseInstance( value, addonClassLoaders );
|
||||||
case CLASS: return parseClass( value, addonClassLoaders );
|
case CLASS: return parseClass( value, addonClassLoaders );
|
||||||
case UNKNOWN:
|
case UNKNOWN:
|
||||||
@@ -595,6 +602,12 @@ class UIDefaultsLoader
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Character parseCharacter( String value ) {
|
||||||
|
if( value.length() != 1 )
|
||||||
|
throw new IllegalArgumentException( "invalid character '" + value + "'" );
|
||||||
|
return value.charAt( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
private static Integer parseInteger( String value, int min, int max ) {
|
private static Integer parseInteger( String value, int min, int max ) {
|
||||||
Integer integer = parseInteger( value, true );
|
Integer integer = parseInteger( value, true );
|
||||||
if( integer.intValue() < min || integer.intValue() > max )
|
if( integer.intValue() < min || integer.intValue() > max )
|
||||||
@@ -629,6 +642,27 @@ class UIDefaultsLoader
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ActiveValue parseScaledFloat( String value ) {
|
||||||
|
float val = parseFloat( value, true );
|
||||||
|
return (ActiveValue) t -> {
|
||||||
|
return UIScale.scale( val );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ActiveValue parseScaledInsets( String value ) {
|
||||||
|
Insets insets = parseInsets( value );
|
||||||
|
return (ActiveValue) t -> {
|
||||||
|
return UIScale.scale( insets );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ActiveValue parseScaledDimension( String value ) {
|
||||||
|
Dimension dimension = parseDimension( value );
|
||||||
|
return (ActiveValue) t -> {
|
||||||
|
return UIScale.scale( dimension );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split string and trim parts.
|
* Split string and trim parts.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class FlatAscendingSortIcon
|
|||||||
g.setColor( sortIconColor );
|
g.setColor( sortIconColor );
|
||||||
if( chevron ) {
|
if( chevron ) {
|
||||||
// chevron arrow
|
// chevron arrow
|
||||||
Path2D path = FlatUIUtils.createPath( false, 1,5, 5,1, 9,5 );
|
Path2D path = FlatUIUtils.createPath( false, 1,4, 5,0, 9,4 );
|
||||||
g.setStroke( new BasicStroke( 1f ) );
|
g.setStroke( new BasicStroke( 1f ) );
|
||||||
g.draw( path );
|
g.draw( path );
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.icons;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.Path2D;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "caps lock" icon for {@link javax.swing.JPasswordField}.
|
||||||
|
*
|
||||||
|
* @uiDefault PasswordField.capsLockIconColor Color
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatCapsLockIcon
|
||||||
|
extends FlatAbstractIcon
|
||||||
|
{
|
||||||
|
public FlatCapsLockIcon() {
|
||||||
|
super( 16, 16, UIManager.getColor( "PasswordField.capsLockIconColor" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
|
/*
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="16" height="16" fill="#6E6E6E" rx="3"/>
|
||||||
|
<rect width="6" height="2" x="5" y="12" fill="#FFF"/>
|
||||||
|
<path fill="#FFF" d="M2,8 L8,2 L14,8 L11,8 L11,10 L5,10 L5,8 L2,8 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
*/
|
||||||
|
|
||||||
|
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
||||||
|
path.append( new RoundRectangle2D.Float( 0, 0, 16, 16, 6, 6 ), false );
|
||||||
|
path.append( new Rectangle2D.Float( 5, 12, 6, 2 ), false );
|
||||||
|
path.append( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 11,8, 11,10, 5,10, 5,8 ), false );
|
||||||
|
g.fill( path );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -47,7 +47,7 @@ public class FlatDescendingSortIcon
|
|||||||
g.setColor( sortIconColor );
|
g.setColor( sortIconColor );
|
||||||
if( chevron ) {
|
if( chevron ) {
|
||||||
// chevron arrow
|
// chevron arrow
|
||||||
Path2D path = FlatUIUtils.createPath( false, 1,1, 5,5, 9,1 );
|
Path2D path = FlatUIUtils.createPath( false, 1,0, 5,4, 9,0 );
|
||||||
g.setStroke( new BasicStroke( 1f ) );
|
g.setStroke( new BasicStroke( 1f ) );
|
||||||
g.draw( path );
|
g.draw( path );
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.icons;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import com.formdev.flatlaf.ui.FlatButtonUI;
|
||||||
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for internal frame icons.
|
||||||
|
*
|
||||||
|
* @uiDefault InternalFrame.buttonHoverBackground Color
|
||||||
|
* @uiDefault InternalFrame.buttonPressedBackground Color
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public abstract class FlatInternalFrameAbstractIcon
|
||||||
|
extends FlatAbstractIcon
|
||||||
|
{
|
||||||
|
private final Color hoverBackground;
|
||||||
|
private final Color pressedBackground;
|
||||||
|
|
||||||
|
public FlatInternalFrameAbstractIcon() {
|
||||||
|
this( UIManager.getDimension( "InternalFrame.buttonSize" ),
|
||||||
|
UIManager.getColor( "InternalFrame.buttonHoverBackground" ),
|
||||||
|
UIManager.getColor( "InternalFrame.buttonPressedBackground" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatInternalFrameAbstractIcon( Dimension size, Color hoverBackground, Color pressedBackground ) {
|
||||||
|
super( size.width, size.height, null );
|
||||||
|
this.hoverBackground = hoverBackground;
|
||||||
|
this.pressedBackground = pressedBackground;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void paintBackground( Component c, Graphics2D g ) {
|
||||||
|
Color background = FlatButtonUI.buttonStateColor( c, null, null, null, hoverBackground, pressedBackground );
|
||||||
|
if( background != null ) {
|
||||||
|
FlatUIUtils.setColor( g, background, c.getBackground() );
|
||||||
|
g.fillRect( 0, 0, width, height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,30 +17,42 @@
|
|||||||
package com.formdev.flatlaf.icons;
|
package com.formdev.flatlaf.icons;
|
||||||
|
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
import java.awt.geom.Path2D;
|
import java.awt.geom.Path2D;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import com.formdev.flatlaf.ui.FlatButtonUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "close" icon for {@link javax.swing.JInternalFrame}.
|
* "close" icon for {@link javax.swing.JInternalFrame}.
|
||||||
*
|
*
|
||||||
* @uiDefault InternalFrame.iconColor Color
|
* @uiDefault InternalFrame.buttonHoverBackground Color
|
||||||
|
* @uiDefault InternalFrame.buttonPressedBackground Color
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatInternalFrameCloseIcon
|
public class FlatInternalFrameCloseIcon
|
||||||
extends FlatAbstractIcon
|
extends FlatInternalFrameAbstractIcon
|
||||||
{
|
{
|
||||||
|
private final Color hoverForeground = UIManager.getColor( "InternalFrame.closeHoverForeground" );
|
||||||
|
private final Color pressedForeground = UIManager.getColor( "InternalFrame.closePressedForeground" );
|
||||||
|
|
||||||
public FlatInternalFrameCloseIcon() {
|
public FlatInternalFrameCloseIcon() {
|
||||||
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
|
super( UIManager.getDimension( "InternalFrame.buttonSize" ),
|
||||||
|
UIManager.getColor( "InternalFrame.closeHoverBackground" ),
|
||||||
|
UIManager.getColor( "InternalFrame.closePressedBackground" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintIcon( Component c, Graphics2D g ) {
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
float mx = 8;
|
paintBackground( c, g );
|
||||||
float my = 8;
|
|
||||||
|
g.setColor( FlatButtonUI.buttonStateColor( c, c.getForeground(), null, null, hoverForeground, pressedForeground ) );
|
||||||
|
|
||||||
|
float mx = width / 2;
|
||||||
|
float my = height / 2;
|
||||||
float r = 3.25f;
|
float r = 3.25f;
|
||||||
|
|
||||||
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
||||||
|
|||||||
@@ -18,24 +18,23 @@ package com.formdev.flatlaf.icons;
|
|||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import javax.swing.UIManager;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "iconify" icon for {@link javax.swing.JInternalFrame}.
|
* "iconify" icon for {@link javax.swing.JInternalFrame}.
|
||||||
*
|
*
|
||||||
* @uiDefault InternalFrame.iconColor Color
|
|
||||||
*
|
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatInternalFrameIconifyIcon
|
public class FlatInternalFrameIconifyIcon
|
||||||
extends FlatAbstractIcon
|
extends FlatInternalFrameAbstractIcon
|
||||||
{
|
{
|
||||||
public FlatInternalFrameIconifyIcon() {
|
public FlatInternalFrameIconifyIcon() {
|
||||||
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintIcon( Component c, Graphics2D g ) {
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
g.fillRect( 3, 8, 10, 1 );
|
paintBackground( c, g );
|
||||||
|
|
||||||
|
g.setColor( c.getForeground() );
|
||||||
|
g.fillRect( (width / 2) - 4, height / 2, 8, 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,25 +18,24 @@ package com.formdev.flatlaf.icons;
|
|||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import javax.swing.UIManager;
|
|
||||||
import com.formdev.flatlaf.ui.FlatUIUtils;
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "maximize" icon for {@link javax.swing.JInternalFrame}.
|
* "maximize" icon for {@link javax.swing.JInternalFrame}.
|
||||||
*
|
*
|
||||||
* @uiDefault InternalFrame.iconColor Color
|
|
||||||
*
|
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatInternalFrameMaximizeIcon
|
public class FlatInternalFrameMaximizeIcon
|
||||||
extends FlatAbstractIcon
|
extends FlatInternalFrameAbstractIcon
|
||||||
{
|
{
|
||||||
public FlatInternalFrameMaximizeIcon() {
|
public FlatInternalFrameMaximizeIcon() {
|
||||||
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintIcon( Component c, Graphics2D g ) {
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
g.fill( FlatUIUtils.createRectangle( 3, 3, 10, 10, 1 ) );
|
paintBackground( c, g );
|
||||||
|
|
||||||
|
g.setColor( c.getForeground() );
|
||||||
|
g.fill( FlatUIUtils.createRectangle( (width / 2) - 4, (height / 2) - 4, 8, 8, 1 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,30 +21,32 @@ import java.awt.Graphics2D;
|
|||||||
import java.awt.geom.Area;
|
import java.awt.geom.Area;
|
||||||
import java.awt.geom.Path2D;
|
import java.awt.geom.Path2D;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import javax.swing.UIManager;
|
|
||||||
import com.formdev.flatlaf.ui.FlatUIUtils;
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "minimize" (actually "restore") icon for {@link javax.swing.JInternalFrame}.
|
* "minimize" (actually "restore") icon for {@link javax.swing.JInternalFrame}.
|
||||||
*
|
*
|
||||||
* @uiDefault InternalFrame.iconColor Color
|
|
||||||
*
|
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatInternalFrameMinimizeIcon
|
public class FlatInternalFrameMinimizeIcon
|
||||||
extends FlatAbstractIcon
|
extends FlatInternalFrameAbstractIcon
|
||||||
{
|
{
|
||||||
public FlatInternalFrameMinimizeIcon() {
|
public FlatInternalFrameMinimizeIcon() {
|
||||||
super( 16, 16, UIManager.getColor( "InternalFrame.iconColor" ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintIcon( Component c, Graphics2D g ) {
|
protected void paintIcon( Component c, Graphics2D g ) {
|
||||||
Path2D r1 = FlatUIUtils.createRectangle( 5, 3, 8, 8, 1 );
|
paintBackground( c, g );
|
||||||
Path2D r2 = FlatUIUtils.createRectangle( 3, 5, 8, 8, 1 );
|
|
||||||
|
g.setColor( c.getForeground() );
|
||||||
|
|
||||||
|
int x = (width / 2) - 4;
|
||||||
|
int y = (height / 2) - 4;
|
||||||
|
Path2D r1 = FlatUIUtils.createRectangle( x + 1, y - 1, 8, 8, 1 );
|
||||||
|
Path2D r2 = FlatUIUtils.createRectangle( x - 1, y + 1, 8, 8, 1 );
|
||||||
|
|
||||||
Area area = new Area( r1 );
|
Area area = new Area( r1 );
|
||||||
area.subtract( new Area( new Rectangle2D.Float( 3, 5, 8, 8 ) ) );
|
area.subtract( new Area( new Rectangle2D.Float( x - 1, y + 1, 8, 8 ) ) );
|
||||||
g.fill( area );
|
g.fill( area );
|
||||||
|
|
||||||
g.fill( r2 );
|
g.fill( r2 );
|
||||||
|
|||||||
@@ -73,14 +73,16 @@ public class FlatBorder
|
|||||||
FlatUIUtils.setRenderingHints( g2 );
|
FlatUIUtils.setRenderingHints( g2 );
|
||||||
|
|
||||||
boolean isCellEditor = isTableCellEditor( c );
|
boolean isCellEditor = isTableCellEditor( c );
|
||||||
float focusWidth = isCellEditor ? 0 : getFocusWidth();
|
float focusWidth = isCellEditor ? 0 : getFocusWidth( c );
|
||||||
float borderWidth = getBorderWidth( c );
|
float borderWidth = getBorderWidth( c );
|
||||||
float arc = isCellEditor ? 0 : getArc( c );
|
float arc = isCellEditor ? 0 : getArc( c );
|
||||||
|
|
||||||
if( isFocused( c ) ) {
|
if( isFocused( c ) ) {
|
||||||
|
float innerFocusWidth = !(c instanceof JScrollPane) ? this.innerFocusWidth : 0;
|
||||||
|
|
||||||
g2.setColor( getFocusColor( c ) );
|
g2.setColor( getFocusColor( c ) );
|
||||||
FlatUIUtils.paintComponentOuterBorder( g2, x, y, width, height, focusWidth,
|
FlatUIUtils.paintComponentOuterBorder( g2, x, y, width, height, focusWidth,
|
||||||
getLineWidth() + scale( innerFocusWidth ), arc );
|
getLineWidth( c ) + scale( innerFocusWidth ), arc );
|
||||||
}
|
}
|
||||||
|
|
||||||
g2.setPaint( getBorderColor( c ) );
|
g2.setPaint( getBorderColor( c ) );
|
||||||
@@ -151,7 +153,7 @@ public class FlatBorder
|
|||||||
@Override
|
@Override
|
||||||
public Insets getBorderInsets( Component c, Insets insets ) {
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
boolean isCellEditor = isTableCellEditor( c );
|
boolean isCellEditor = isTableCellEditor( c );
|
||||||
float ow = (isCellEditor ? 0 : getFocusWidth()) + getLineWidth();
|
float ow = (isCellEditor ? 0 : getFocusWidth( c )) + getLineWidth( c );
|
||||||
|
|
||||||
insets = super.getBorderInsets( c, insets );
|
insets = super.getBorderInsets( c, insets );
|
||||||
insets.top = Math.round( scale( (float) insets.top ) + ow );
|
insets.top = Math.round( scale( (float) insets.top ) + ow );
|
||||||
@@ -161,16 +163,16 @@ public class FlatBorder
|
|||||||
return insets;
|
return insets;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float getFocusWidth() {
|
protected float getFocusWidth( Component c ) {
|
||||||
return scale( (float) focusWidth );
|
return scale( (float) focusWidth );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float getLineWidth() {
|
protected float getLineWidth( Component c ) {
|
||||||
return scale( 1f );
|
return scale( 1f );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float getBorderWidth( Component c ) {
|
protected float getBorderWidth( Component c ) {
|
||||||
return getLineWidth();
|
return getLineWidth( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float getArc( Component c ) {
|
protected float getArc( Component c ) {
|
||||||
|
|||||||
@@ -23,9 +23,10 @@ import java.awt.GradientPaint;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.Paint;
|
import java.awt.Paint;
|
||||||
import javax.swing.JButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Border for {@link javax.swing.JButton}.
|
* Border for {@link javax.swing.JButton}.
|
||||||
@@ -43,6 +44,8 @@ import javax.swing.plaf.UIResource;
|
|||||||
* @uiDefault Button.default.focusedBorderColor Color
|
* @uiDefault Button.default.focusedBorderColor Color
|
||||||
* @uiDefault Button.default.focusColor Color
|
* @uiDefault Button.default.focusColor Color
|
||||||
* @uiDefault Button.default.borderWidth int
|
* @uiDefault Button.default.borderWidth int
|
||||||
|
* @uiDefault Button.toolbar.margin Insets
|
||||||
|
* @uiDefault Button.toolbar.spacingInsets Insets
|
||||||
* @uiDefault Button.arc int
|
* @uiDefault Button.arc int
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -61,12 +64,17 @@ public class FlatButtonBorder
|
|||||||
protected final Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" );
|
protected final Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" );
|
||||||
protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
|
protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
|
||||||
protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
|
protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
|
||||||
|
protected final Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" );
|
||||||
|
protected final Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
||||||
protected final int arc = UIManager.getInt( "Button.arc" );
|
protected final int arc = UIManager.getInt( "Button.arc" );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||||
if( FlatButtonUI.isContentAreaFilled( c ) && !FlatButtonUI.isHelpButton( c ) && !FlatToggleButtonUI.isUnderlineButton( c ) )
|
if( FlatButtonUI.isContentAreaFilled( c ) &&
|
||||||
super.paintBorder( c, g, x, y, width, height );
|
!FlatButtonUI.isToolBarButton( c ) &&
|
||||||
|
!FlatButtonUI.isHelpButton( c ) &&
|
||||||
|
!FlatToggleButtonUI.isTabButton( c ) )
|
||||||
|
super.paintBorder( c, g, x, y, width, height );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -95,15 +103,31 @@ public class FlatButtonBorder
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Insets getBorderInsets( Component c, Insets insets ) {
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
insets = super.getBorderInsets( c, insets );
|
if( FlatButtonUI.isToolBarButton( c ) ) {
|
||||||
|
// In toolbars, use button margin only if explicitly set.
|
||||||
|
// Otherwise use toolbar margin specified in UI defaults.
|
||||||
|
Insets margin = (c instanceof AbstractButton)
|
||||||
|
? ((AbstractButton)c).getMargin()
|
||||||
|
: null;
|
||||||
|
|
||||||
// use smaller left and right insets for icon-only buttons (so that they are square)
|
FlatUIUtils.setInsets( insets, UIScale.scale( FlatUIUtils.addInsets( toolbarSpacingInsets,
|
||||||
if( FlatButtonUI.isIconOnlyButton( c ) && ((JButton)c).getMargin() instanceof UIResource )
|
(margin != null && !(margin instanceof UIResource)) ? margin : toolbarMargin ) ) );
|
||||||
insets.left = insets.right = Math.min( insets.top, insets.bottom );
|
} else {
|
||||||
|
insets = super.getBorderInsets( c, insets );
|
||||||
|
|
||||||
|
// use smaller left and right insets for icon-only buttons (so that they are square)
|
||||||
|
if( FlatButtonUI.isIconOnlyButton( c ) && ((AbstractButton)c).getMargin() instanceof UIResource )
|
||||||
|
insets.left = insets.right = Math.min( insets.top, insets.bottom );
|
||||||
|
}
|
||||||
|
|
||||||
return insets;
|
return insets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected float getFocusWidth( Component c ) {
|
||||||
|
return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth(c );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected float getBorderWidth( Component c ) {
|
protected float getBorderWidth( Component c ) {
|
||||||
return FlatButtonUI.isDefaultButton( c ) ? scale( (float) defaultBorderWidth ) : super.getBorderWidth( c );
|
return FlatButtonUI.isDefaultButton( c ) ? scale( (float) defaultBorderWidth ) : super.getBorderWidth( c );
|
||||||
|
|||||||
@@ -26,19 +26,23 @@ import java.awt.FontMetrics;
|
|||||||
import java.awt.GradientPaint;
|
import java.awt.GradientPaint;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Insets;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.ButtonModel;
|
import javax.swing.ButtonModel;
|
||||||
import javax.swing.Icon;
|
import javax.swing.Icon;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.JToolBar;
|
import javax.swing.JToolBar;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.border.Border;
|
import javax.swing.border.Border;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
|
import javax.swing.plaf.basic.BasicButtonListener;
|
||||||
import javax.swing.plaf.basic.BasicButtonUI;
|
import javax.swing.plaf.basic.BasicButtonUI;
|
||||||
import com.formdev.flatlaf.FlatLaf;
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
@@ -79,6 +83,7 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault Button.shadowWidth int default is 2
|
* @uiDefault Button.shadowWidth int default is 2
|
||||||
* @uiDefault Button.shadowColor Color optional
|
* @uiDefault Button.shadowColor Color optional
|
||||||
* @uiDefault Button.default.shadowColor Color optional
|
* @uiDefault Button.default.shadowColor Color optional
|
||||||
|
* @uiDefault Button.toolbar.spacingInsets Insets
|
||||||
* @uiDefault Button.toolbar.hoverBackground Color
|
* @uiDefault Button.toolbar.hoverBackground Color
|
||||||
* @uiDefault Button.toolbar.pressedBackground Color
|
* @uiDefault Button.toolbar.pressedBackground Color
|
||||||
*
|
*
|
||||||
@@ -111,6 +116,7 @@ public class FlatButtonUI
|
|||||||
protected Color shadowColor;
|
protected Color shadowColor;
|
||||||
protected Color defaultShadowColor;
|
protected Color defaultShadowColor;
|
||||||
|
|
||||||
|
protected Insets toolbarSpacingInsets;
|
||||||
protected Color toolbarHoverBackground;
|
protected Color toolbarHoverBackground;
|
||||||
protected Color toolbarPressedBackground;
|
protected Color toolbarPressedBackground;
|
||||||
|
|
||||||
@@ -163,6 +169,7 @@ public class FlatButtonUI
|
|||||||
defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" );
|
defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" );
|
||||||
defaultBoldText = UIManager.getBoolean( "Button.default.boldText" );
|
defaultBoldText = UIManager.getBoolean( "Button.default.boldText" );
|
||||||
|
|
||||||
|
toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
||||||
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
|
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
|
||||||
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
|
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
|
||||||
|
|
||||||
@@ -180,7 +187,7 @@ public class FlatButtonUI
|
|||||||
LookAndFeel.installProperty( b, "opaque", false );
|
LookAndFeel.installProperty( b, "opaque", false );
|
||||||
LookAndFeel.installProperty( b, "iconTextGap", scale( iconTextGap ) );
|
LookAndFeel.installProperty( b, "iconTextGap", scale( iconTextGap ) );
|
||||||
|
|
||||||
MigLayoutVisualPadding.install( b, focusWidth );
|
MigLayoutVisualPadding.install( b, getFocusWidth( b ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -191,6 +198,26 @@ public class FlatButtonUI
|
|||||||
defaults_initialized = false;
|
defaults_initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BasicButtonListener createButtonListener( AbstractButton b ) {
|
||||||
|
return new BasicButtonListener( b ) {
|
||||||
|
@Override
|
||||||
|
public void propertyChange( PropertyChangeEvent e ) {
|
||||||
|
super.propertyChange( e );
|
||||||
|
FlatButtonUI.this.propertyChange( b, e );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) {
|
||||||
|
switch( e.getPropertyName() ) {
|
||||||
|
case MINIMUM_WIDTH:
|
||||||
|
case MINIMUM_HEIGHT:
|
||||||
|
b.revalidate();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static boolean isContentAreaFilled( Component c ) {
|
static boolean isContentAreaFilled( Component c ) {
|
||||||
return !(c instanceof AbstractButton) || ((AbstractButton)c).isContentAreaFilled();
|
return !(c instanceof AbstractButton) || ((AbstractButton)c).isContentAreaFilled();
|
||||||
}
|
}
|
||||||
@@ -200,11 +227,11 @@ public class FlatButtonUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean isIconOnlyButton( Component c ) {
|
static boolean isIconOnlyButton( Component c ) {
|
||||||
if( !(c instanceof JButton) )
|
if( !(c instanceof JButton) && !(c instanceof JToggleButton) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Icon icon = ((JButton)c).getIcon();
|
Icon icon = ((AbstractButton)c).getIcon();
|
||||||
String text = ((JButton)c).getText();
|
String text = ((AbstractButton)c).getText();
|
||||||
return (icon != null && (text == null || text.isEmpty())) ||
|
return (icon != null && (text == null || text.isEmpty())) ||
|
||||||
(icon == null && text != null && ("...".equals( text ) || text.length() == 1));
|
(icon == null && text != null && ("...".equals( text ) || text.length() == 1));
|
||||||
}
|
}
|
||||||
@@ -217,7 +244,7 @@ public class FlatButtonUI
|
|||||||
return c instanceof JButton && clientPropertyEquals( (JButton) c, BUTTON_TYPE, BUTTON_TYPE_HELP );
|
return c instanceof JButton && clientPropertyEquals( (JButton) c, BUTTON_TYPE, BUTTON_TYPE_HELP );
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isToolBarButton( JComponent c ) {
|
static boolean isToolBarButton( Component c ) {
|
||||||
return c.getParent() instanceof JToolBar;
|
return c.getParent() instanceof JToolBar;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,27 +273,42 @@ public class FlatButtonUI
|
|||||||
FlatUIUtils.setRenderingHints( g2 );
|
FlatUIUtils.setRenderingHints( g2 );
|
||||||
|
|
||||||
Border border = c.getBorder();
|
Border border = c.getBorder();
|
||||||
float focusWidth = (border instanceof FlatBorder) ? scale( (float) this.focusWidth ) : 0;
|
boolean isToolBarButton = isToolBarButton( c );
|
||||||
float arc = ((border instanceof FlatButtonBorder && !isSquareButton( c )) || isToolBarButton( c ))
|
float focusWidth = (border instanceof FlatBorder && !isToolBarButton) ? scale( (float) getFocusWidth( c ) ) : 0;
|
||||||
|
float arc = ((border instanceof FlatButtonBorder && !isSquareButton( c )) || isToolBarButton)
|
||||||
? scale( (float) this.arc ) : 0;
|
? scale( (float) this.arc ) : 0;
|
||||||
boolean def = isDefaultButton( c );
|
boolean def = isDefaultButton( c );
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
int width = c.getWidth();
|
||||||
|
int height = c.getHeight();
|
||||||
|
|
||||||
|
if( isToolBarButton ) {
|
||||||
|
Insets spacing = UIScale.scale( toolbarSpacingInsets );
|
||||||
|
x += spacing.left;
|
||||||
|
y += spacing.top;
|
||||||
|
width -= spacing.left + spacing.right;
|
||||||
|
height -= spacing.top + spacing.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
// paint shadow
|
// paint shadow
|
||||||
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
||||||
if( shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) {
|
if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) {
|
||||||
g2.setColor( shadowColor );
|
g2.setColor( shadowColor );
|
||||||
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
|
g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ),
|
||||||
c.getWidth() - focusWidth * 2, c.getHeight() - focusWidth * 2, arc, arc ) );
|
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint background
|
// paint background
|
||||||
Color startBg = def ? defaultBackground : startBackground;
|
Color startBg = def ? defaultBackground : startBackground;
|
||||||
Color endBg = def ? defaultEndBackground : endBackground;
|
Color endBg = def ? defaultEndBackground : endBackground;
|
||||||
if( background == startBg && endBg != null && !startBg.equals( endBg ) )
|
if( background == startBg && endBg != null && !startBg.equals( endBg ) )
|
||||||
g2.setPaint( new GradientPaint( 0, 0, startBg, 0, c.getHeight(), endBg ) );
|
g2.setPaint( new GradientPaint( 0, 0, startBg, 0, height, endBg ) );
|
||||||
else
|
else
|
||||||
FlatUIUtils.setColor( g2, background, def ? defaultBackground : c.getBackground() );
|
FlatUIUtils.setColor( g2, background, def ? defaultBackground : c.getBackground() );
|
||||||
FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, arc );
|
|
||||||
|
FlatUIUtils.paintComponentBackground( g2, x, y, width, height, focusWidth, arc );
|
||||||
} finally {
|
} finally {
|
||||||
g2.dispose();
|
g2.dispose();
|
||||||
}
|
}
|
||||||
@@ -357,14 +399,23 @@ public class FlatButtonUI
|
|||||||
return new Dimension( helpButtonIcon.getIconWidth(), helpButtonIcon.getIconHeight() );
|
return new Dimension( helpButtonIcon.getIconWidth(), helpButtonIcon.getIconHeight() );
|
||||||
|
|
||||||
Dimension prefSize = super.getPreferredSize( c );
|
Dimension prefSize = super.getPreferredSize( c );
|
||||||
|
if ( prefSize == null )
|
||||||
|
return null;
|
||||||
|
|
||||||
// make button square if it is a icon-only button
|
// make button square if it is a icon-only button
|
||||||
// or apply minimum width, if not in toolbar and not a icon-only button
|
// or apply minimum width, if not in toolbar and not a icon-only button
|
||||||
if( isIconOnlyButton( c ) )
|
if( isIconOnlyButton( c ) )
|
||||||
prefSize.width = Math.max( prefSize.width, prefSize.height );
|
prefSize.width = Math.max( prefSize.width, prefSize.height );
|
||||||
else if( !isToolBarButton( c ) )
|
else if( !isToolBarButton( c ) && c.getBorder() instanceof FlatButtonBorder ) {
|
||||||
|
int focusWidth = getFocusWidth( c );
|
||||||
prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) + (focusWidth * 2) ) );
|
prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) + (focusWidth * 2) ) );
|
||||||
|
prefSize.height = Math.max( prefSize.height, scale( FlatUIUtils.minimumHeight( c, 0 ) + (focusWidth * 2) ) );
|
||||||
|
}
|
||||||
|
|
||||||
return prefSize;
|
return prefSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected int getFocusWidth( JComponent c ) {
|
||||||
|
return focusWidth;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
128
flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java
Normal file
128
flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.FlatClientProperties.*;
|
||||||
|
import java.awt.EventQueue;
|
||||||
|
import java.awt.event.FocusEvent;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import javax.swing.JFormattedTextField;
|
||||||
|
import javax.swing.plaf.UIResource;
|
||||||
|
import javax.swing.text.DefaultCaret;
|
||||||
|
import javax.swing.text.Document;
|
||||||
|
import javax.swing.text.JTextComponent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caret that can select all text on focus gained.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
class FlatCaret
|
||||||
|
extends DefaultCaret
|
||||||
|
implements UIResource
|
||||||
|
{
|
||||||
|
private final String selectAllOnFocusPolicy;
|
||||||
|
|
||||||
|
private boolean wasFocused;
|
||||||
|
private boolean wasTemporaryLost;
|
||||||
|
private boolean isMousePressed;
|
||||||
|
|
||||||
|
FlatCaret( String selectAllOnFocusPolicy ) {
|
||||||
|
this.selectAllOnFocusPolicy = selectAllOnFocusPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void install( JTextComponent c ) {
|
||||||
|
super.install( c );
|
||||||
|
|
||||||
|
// the dot and mark are lost when switching LaF
|
||||||
|
// --> move dot to end of text so that all text may be selected when it gains focus
|
||||||
|
Document doc = c.getDocument();
|
||||||
|
if( doc != null && getDot() == 0 && getMark() == 0 ) {
|
||||||
|
int length = doc.getLength();
|
||||||
|
if( length > 0 )
|
||||||
|
setDot( length );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void focusGained( FocusEvent e ) {
|
||||||
|
if( !wasTemporaryLost && !isMousePressed )
|
||||||
|
selectAllOnFocusGained();
|
||||||
|
wasTemporaryLost = false;
|
||||||
|
wasFocused = true;
|
||||||
|
|
||||||
|
super.focusGained( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void focusLost( FocusEvent e ) {
|
||||||
|
wasTemporaryLost = e.isTemporary();
|
||||||
|
super.focusLost( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed( MouseEvent e ) {
|
||||||
|
isMousePressed = true;
|
||||||
|
super.mousePressed( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased( MouseEvent e ) {
|
||||||
|
isMousePressed = false;
|
||||||
|
super.mouseReleased( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void selectAllOnFocusGained() {
|
||||||
|
JTextComponent c = getComponent();
|
||||||
|
Document doc = c.getDocument();
|
||||||
|
if( doc == null || !c.isEnabled() || !c.isEditable() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
Object selectAllOnFocusPolicy = c.getClientProperty( SELECT_ALL_ON_FOCUS_POLICY );
|
||||||
|
if( selectAllOnFocusPolicy == null )
|
||||||
|
selectAllOnFocusPolicy = this.selectAllOnFocusPolicy;
|
||||||
|
|
||||||
|
if( SELECT_ALL_ON_FOCUS_POLICY_NEVER.equals( selectAllOnFocusPolicy ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( !SELECT_ALL_ON_FOCUS_POLICY_ALWAYS.equals( selectAllOnFocusPolicy ) ) {
|
||||||
|
// policy is "once" (or null or unknown)
|
||||||
|
|
||||||
|
// was already focused?
|
||||||
|
if( wasFocused )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// check whether selection was modified before gaining focus
|
||||||
|
int dot = getDot();
|
||||||
|
int mark = getMark();
|
||||||
|
if( dot != mark || dot != doc.getLength() )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// select all
|
||||||
|
if( c instanceof JFormattedTextField ) {
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
setDot( 0 );
|
||||||
|
moveDot( doc.getLength() );
|
||||||
|
} );
|
||||||
|
} else {
|
||||||
|
setDot( 0 );
|
||||||
|
moveDot( doc.getLength() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,8 +17,11 @@
|
|||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
|
import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI;
|
||||||
|
|
||||||
@@ -74,4 +77,9 @@ public class FlatCheckBoxMenuItemUI
|
|||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
defaultTextIconGap = scale( defaultTextIconGap );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
||||||
|
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,9 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.UIManager;
|
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicColorChooserUI;
|
import javax.swing.plaf.basic.BasicColorChooserUI;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JColorChooser}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JColorChooser}.
|
||||||
@@ -43,21 +40,4 @@ public class FlatColorChooserUI
|
|||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatColorChooserUI();
|
return new FlatColorChooserUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void installUI( JComponent c ) {
|
|
||||||
if( UIScale.getUserScaleFactor() != 1f ) {
|
|
||||||
// temporary scale swatch sizes
|
|
||||||
Dimension swatchSize = UIManager.getDimension( "ColorChooser.swatchesSwatchSize" );
|
|
||||||
Dimension swatchSize2 = UIManager.getDimension( "ColorChooser.swatchesRecentSwatchSize" );
|
|
||||||
UIManager.put( "ColorChooser.swatchesSwatchSize", UIScale.scale( swatchSize ) );
|
|
||||||
UIManager.put( "ColorChooser.swatchesRecentSwatchSize", UIScale.scale( swatchSize2 ) );
|
|
||||||
|
|
||||||
super.installUI( c );
|
|
||||||
|
|
||||||
UIManager.put( "ColorChooser.swatchesSwatchSize", null );
|
|
||||||
UIManager.put( "ColorChooser.swatchesRecentSwatchSize", null );
|
|
||||||
} else
|
|
||||||
super.installUI( c );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ import java.awt.Insets;
|
|||||||
import java.awt.LayoutManager;
|
import java.awt.LayoutManager;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.FocusEvent;
|
import java.awt.event.FocusEvent;
|
||||||
import java.awt.event.FocusListener;
|
import java.awt.event.FocusListener;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
@@ -35,13 +37,16 @@ import java.awt.geom.Rectangle2D;
|
|||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
import javax.swing.DefaultListCellRenderer;
|
import javax.swing.DefaultListCellRenderer;
|
||||||
|
import javax.swing.InputMap;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
import javax.swing.ListCellRenderer;
|
import javax.swing.ListCellRenderer;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
@@ -54,6 +59,7 @@ import javax.swing.plaf.basic.BasicComboPopup;
|
|||||||
import javax.swing.plaf.basic.ComboPopup;
|
import javax.swing.plaf.basic.ComboPopup;
|
||||||
import javax.swing.text.JTextComponent;
|
import javax.swing.text.JTextComponent;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
|
import com.formdev.flatlaf.util.SystemInfo;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -271,6 +277,19 @@ public class FlatComboBoxUI
|
|||||||
editor.applyComponentOrientation( comboBox.getComponentOrientation() );
|
editor.applyComponentOrientation( comboBox.getComponentOrientation() );
|
||||||
|
|
||||||
updateEditorColors();
|
updateEditorColors();
|
||||||
|
|
||||||
|
// macOS
|
||||||
|
if( SystemInfo.IS_MAC && editor instanceof JTextComponent ) {
|
||||||
|
// delegate actions from editor text field to combobox, which is necessary
|
||||||
|
// because text field on macOS already handle those keys
|
||||||
|
InputMap inputMap = ((JTextComponent)editor).getInputMap();
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "UP" ) );
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "KP_UP" ) );
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "DOWN" ) );
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "KP_DOWN" ) );
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "HOME" ) );
|
||||||
|
new EditorDelegateAction( inputMap, KeyStroke.getKeyStroke( "END" ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateEditorColors() {
|
private void updateEditorColors() {
|
||||||
@@ -608,4 +627,31 @@ public class FlatComboBoxUI
|
|||||||
rendererBorder.paintBorder( c, g, x, y, width, height );
|
rendererBorder.paintBorder( c, g, x, y, width, height );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- class EditorDelegateAction -----------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegates actions from editor text field to combobox.
|
||||||
|
*/
|
||||||
|
private class EditorDelegateAction
|
||||||
|
extends AbstractAction
|
||||||
|
{
|
||||||
|
private final KeyStroke keyStroke;
|
||||||
|
|
||||||
|
EditorDelegateAction( InputMap inputMap, KeyStroke keyStroke ) {
|
||||||
|
this.keyStroke = keyStroke;
|
||||||
|
|
||||||
|
// add to input map
|
||||||
|
inputMap.put( keyStroke, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed( ActionEvent e ) {
|
||||||
|
ActionListener action = comboBox.getActionForKeyStroke( keyStroke );
|
||||||
|
if( action != null ) {
|
||||||
|
action.actionPerformed( new ActionEvent( comboBox, e.getID(),
|
||||||
|
e.getActionCommand(), e.getWhen(), e.getModifiers() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,308 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Container;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.EventQueue;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.LayoutManager;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.beans.PropertyVetoException;
|
||||||
|
import javax.swing.BorderFactory;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.event.MouseInputAdapter;
|
||||||
|
import javax.swing.event.MouseInputListener;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JLayeredPane;
|
||||||
|
import javax.swing.JRootPane;
|
||||||
|
import javax.swing.JToolTip;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicDesktopIconUI;
|
||||||
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame.JDesktopIcon}.
|
||||||
|
*
|
||||||
|
* <!-- BasicDesktopIconUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault DesktopIcon.border Border
|
||||||
|
*
|
||||||
|
* <!-- FlatDesktopIconUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault DesktopIcon.background Color
|
||||||
|
* @uiDefault DesktopIcon.foreground Color
|
||||||
|
* @uiDefault DesktopIcon.iconSize Dimension
|
||||||
|
* @uiDefault DesktopIcon.closeSize Dimension
|
||||||
|
* @uiDefault DesktopIcon.closeIcon Icon
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatDesktopIconUI
|
||||||
|
extends BasicDesktopIconUI
|
||||||
|
{
|
||||||
|
private Dimension iconSize;
|
||||||
|
private Dimension closeSize;
|
||||||
|
|
||||||
|
private JLabel dockIcon;
|
||||||
|
private JButton closeButton;
|
||||||
|
private JToolTip titleTip;
|
||||||
|
private ActionListener closeListener;
|
||||||
|
private MouseInputListener mouseInputListener;
|
||||||
|
|
||||||
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
|
return new FlatDesktopIconUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uninstallUI( JComponent c ) {
|
||||||
|
super.uninstallUI( c );
|
||||||
|
|
||||||
|
dockIcon = null;
|
||||||
|
closeButton = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installComponents() {
|
||||||
|
dockIcon = new JLabel();
|
||||||
|
dockIcon.setHorizontalAlignment( SwingConstants.CENTER );
|
||||||
|
|
||||||
|
closeButton = new JButton();
|
||||||
|
closeButton.setIcon( UIManager.getIcon( "DesktopIcon.closeIcon" ) );
|
||||||
|
closeButton.setFocusable( false );
|
||||||
|
closeButton.setBorder( BorderFactory.createEmptyBorder() );
|
||||||
|
closeButton.setOpaque( true );
|
||||||
|
closeButton.setBackground( FlatUIUtils.nonUIResource( desktopIcon.getBackground() ) );
|
||||||
|
closeButton.setForeground( FlatUIUtils.nonUIResource( desktopIcon.getForeground() ) );
|
||||||
|
closeButton.setVisible( false );
|
||||||
|
|
||||||
|
desktopIcon.setLayout( new FlatDesktopIconLayout() );
|
||||||
|
desktopIcon.add( closeButton );
|
||||||
|
desktopIcon.add( dockIcon );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void uninstallComponents() {
|
||||||
|
hideTitleTip();
|
||||||
|
|
||||||
|
desktopIcon.remove( dockIcon );
|
||||||
|
desktopIcon.remove( closeButton );
|
||||||
|
desktopIcon.setLayout( null );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installDefaults() {
|
||||||
|
super.installDefaults();
|
||||||
|
|
||||||
|
LookAndFeel.installColors( desktopIcon, "DesktopIcon.background", "DesktopIcon.foreground" );
|
||||||
|
|
||||||
|
iconSize = UIManager.getDimension( "DesktopIcon.iconSize" );
|
||||||
|
closeSize = UIManager.getDimension( "DesktopIcon.closeSize" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installListeners() {
|
||||||
|
super.installListeners();
|
||||||
|
|
||||||
|
closeListener = e -> {
|
||||||
|
if( frame.isClosable() )
|
||||||
|
frame.doDefaultCloseAction();
|
||||||
|
};
|
||||||
|
closeButton.addActionListener( closeListener );
|
||||||
|
closeButton.addMouseListener( mouseInputListener );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void uninstallListeners() {
|
||||||
|
super.uninstallListeners();
|
||||||
|
|
||||||
|
closeButton.removeActionListener( closeListener );
|
||||||
|
closeButton.removeMouseListener( mouseInputListener );
|
||||||
|
closeListener = null;
|
||||||
|
mouseInputListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected MouseInputListener createMouseInputListener() {
|
||||||
|
mouseInputListener = new MouseInputAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseReleased( MouseEvent e ) {
|
||||||
|
if( frame.isIcon() && desktopIcon.contains( e.getX(), e.getY() ) ) {
|
||||||
|
hideTitleTip();
|
||||||
|
closeButton.setVisible( false );
|
||||||
|
|
||||||
|
try {
|
||||||
|
frame.setIcon( false );
|
||||||
|
} catch( PropertyVetoException ex ) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseEntered( MouseEvent e ) {
|
||||||
|
showTitleTip();
|
||||||
|
if( frame.isClosable() )
|
||||||
|
closeButton.setVisible( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited( MouseEvent e ) {
|
||||||
|
hideTitleTip();
|
||||||
|
closeButton.setVisible( false );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return mouseInputListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showTitleTip() {
|
||||||
|
JRootPane rootPane = SwingUtilities.getRootPane( desktopIcon );
|
||||||
|
if( rootPane == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( titleTip == null ) {
|
||||||
|
titleTip = new JToolTip();
|
||||||
|
rootPane.getLayeredPane().add( titleTip, JLayeredPane.POPUP_LAYER );
|
||||||
|
}
|
||||||
|
titleTip.setTipText( frame.getTitle() );
|
||||||
|
titleTip.setSize( titleTip.getPreferredSize() );
|
||||||
|
|
||||||
|
int tx = (desktopIcon.getWidth() - titleTip.getWidth()) / 2;
|
||||||
|
int ty = -(titleTip.getHeight() + UIScale.scale( 4 ));
|
||||||
|
Point pt = SwingUtilities.convertPoint( desktopIcon, tx, ty, titleTip.getParent() );
|
||||||
|
if( pt.x + titleTip.getWidth() > rootPane.getWidth() )
|
||||||
|
pt.x = rootPane.getWidth() - titleTip.getWidth();
|
||||||
|
if( pt.x < 0 )
|
||||||
|
pt.x = 0;
|
||||||
|
titleTip.setLocation( pt );
|
||||||
|
titleTip.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hideTitleTip() {
|
||||||
|
if( titleTip == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
titleTip.setVisible( false );
|
||||||
|
titleTip.getParent().remove( titleTip );
|
||||||
|
titleTip = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize( JComponent c ) {
|
||||||
|
return UIScale.scale( iconSize );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getMinimumSize( JComponent c ) {
|
||||||
|
return getPreferredSize( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getMaximumSize( JComponent c ) {
|
||||||
|
return getPreferredSize( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDockIcon() {
|
||||||
|
// use invoke later to make sure that components are updated when switching LaF
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
if( dockIcon != null )
|
||||||
|
updateDockIconLater();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateDockIconLater() {
|
||||||
|
// make sure that frame is not selected
|
||||||
|
if( frame.isSelected() ) {
|
||||||
|
try {
|
||||||
|
frame.setSelected( false );
|
||||||
|
} catch( PropertyVetoException ex ) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// paint internal frame to buffered image
|
||||||
|
int frameWidth = Math.max( frame.getWidth(), 1 );
|
||||||
|
int frameHeight = Math.max( frame.getHeight(), 1 );
|
||||||
|
BufferedImage frameImage = new BufferedImage( frameWidth, frameHeight, BufferedImage.TYPE_INT_ARGB );
|
||||||
|
Graphics2D g = frameImage.createGraphics();
|
||||||
|
try {
|
||||||
|
//TODO fix missing internal frame header when switching LaF
|
||||||
|
frame.paint( g );
|
||||||
|
} finally {
|
||||||
|
g.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute preview size (keep ratio; also works with non-square preview)
|
||||||
|
Insets insets = desktopIcon.getInsets();
|
||||||
|
int previewWidth = UIScale.scale( iconSize.width ) - insets.left - insets.right;
|
||||||
|
int previewHeight = UIScale.scale( iconSize.height ) - insets.top - insets.bottom;
|
||||||
|
float frameRatio = ((float) frameHeight / (float) frameWidth);
|
||||||
|
if( ((float) previewWidth / (float) frameWidth) > ((float) previewHeight / (float) frameHeight) )
|
||||||
|
previewWidth = Math.round( previewHeight / frameRatio );
|
||||||
|
else
|
||||||
|
previewHeight = Math.round( previewWidth * frameRatio );
|
||||||
|
|
||||||
|
// scale preview
|
||||||
|
Image previewImage = frameImage.getScaledInstance( previewWidth, previewHeight, Image.SCALE_SMOOTH );
|
||||||
|
dockIcon.setIcon( new ImageIcon( previewImage ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class DockIcon -----------------------------------------------------
|
||||||
|
|
||||||
|
private class FlatDesktopIconLayout
|
||||||
|
implements LayoutManager
|
||||||
|
{
|
||||||
|
@Override public void addLayoutComponent( String name, Component comp ) {}
|
||||||
|
@Override public void removeLayoutComponent( Component comp ) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension preferredLayoutSize( Container parent ) {
|
||||||
|
return dockIcon.getPreferredSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension minimumLayoutSize( Container parent ) {
|
||||||
|
return dockIcon.getMinimumSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void layoutContainer( Container parent ) {
|
||||||
|
Insets insets = parent.getInsets();
|
||||||
|
|
||||||
|
// dock icon
|
||||||
|
dockIcon.setBounds( insets.left, insets.top,
|
||||||
|
parent.getWidth() - insets.left - insets.right,
|
||||||
|
parent.getHeight() - insets.top - insets.bottom );
|
||||||
|
|
||||||
|
// close button in upper right corner
|
||||||
|
Dimension cSize = UIScale.scale( closeSize );
|
||||||
|
closeButton.setBounds( parent.getWidth() - cSize.width, 0, cSize.width, cSize.height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import javax.swing.DefaultDesktopManager;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JInternalFrame;
|
||||||
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.UIResource;
|
||||||
|
import javax.swing.plaf.basic.BasicDesktopPaneUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JDesktopPane}.
|
||||||
|
*
|
||||||
|
* <!-- BasicDesktopPaneUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault Desktop.background Color
|
||||||
|
* @uiDefault Desktop.minOnScreenInsets Insets
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatDesktopPaneUI
|
||||||
|
extends BasicDesktopPaneUI
|
||||||
|
{
|
||||||
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
|
return new FlatDesktopPaneUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installDesktopManager() {
|
||||||
|
desktopManager = desktop.getDesktopManager();
|
||||||
|
if( desktopManager == null ) {
|
||||||
|
desktopManager = new FlatDesktopManager();
|
||||||
|
desktop.setDesktopManager( desktopManager );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class FlatDesktopManager -------------------------------------------
|
||||||
|
|
||||||
|
private class FlatDesktopManager
|
||||||
|
extends DefaultDesktopManager
|
||||||
|
implements UIResource
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void iconifyFrame( JInternalFrame f ) {
|
||||||
|
super.iconifyFrame( f );
|
||||||
|
|
||||||
|
((FlatDesktopIconUI)f.getDesktopIcon().getUI()).updateDockIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,9 +50,10 @@ public class FlatEmptyBorder
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Insets getBorderInsets( Component c, Insets insets ) {
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
insets.left = scale( left );
|
boolean leftToRight = left == right || c.getComponentOrientation().isLeftToRight();
|
||||||
|
insets.left = scale( leftToRight ? left : right );
|
||||||
insets.top = scale( top );
|
insets.top = scale( top );
|
||||||
insets.right = scale( right );
|
insets.right = scale( leftToRight ? right : left );
|
||||||
insets.bottom = scale( bottom );
|
insets.bottom = scale( bottom );
|
||||||
return insets;
|
return insets;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,10 +39,12 @@ import javax.swing.plaf.ComponentUI;
|
|||||||
*
|
*
|
||||||
* <!-- FlatTextFieldUI -->
|
* <!-- FlatTextFieldUI -->
|
||||||
*
|
*
|
||||||
|
* @uiDefault TextComponent.arc int
|
||||||
* @uiDefault Component.focusWidth int
|
* @uiDefault Component.focusWidth int
|
||||||
* @uiDefault Component.minimumWidth int
|
* @uiDefault Component.minimumWidth int
|
||||||
* @uiDefault Component.isIntelliJTheme boolean
|
* @uiDefault Component.isIntelliJTheme boolean
|
||||||
* @uiDefault FormattedTextField.placeholderForeground Color
|
* @uiDefault FormattedTextField.placeholderForeground Color
|
||||||
|
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.LayoutManager;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import javax.swing.BorderFactory;
|
||||||
|
import javax.swing.BoxLayout;
|
||||||
|
import javax.swing.Icon;
|
||||||
|
import javax.swing.JInternalFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.border.Border;
|
||||||
|
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
|
||||||
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF internal frame title bar.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatInternalFrameTitlePane
|
||||||
|
extends BasicInternalFrameTitlePane
|
||||||
|
{
|
||||||
|
private JLabel titleLabel;
|
||||||
|
private JPanel buttonPanel;
|
||||||
|
|
||||||
|
public FlatInternalFrameTitlePane( JInternalFrame f ) {
|
||||||
|
super( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installDefaults() {
|
||||||
|
super.installDefaults();
|
||||||
|
|
||||||
|
LookAndFeel.installBorder( this, "InternalFrameTitlePane.border" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected PropertyChangeListener createPropertyChangeListener() {
|
||||||
|
return new FlatPropertyChangeHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected LayoutManager createLayout() {
|
||||||
|
return new BorderLayout( UIScale.scale( 4 ), 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void createButtons() {
|
||||||
|
super.createButtons();
|
||||||
|
|
||||||
|
iconButton.setContentAreaFilled( false );
|
||||||
|
maxButton.setContentAreaFilled( false );
|
||||||
|
closeButton.setContentAreaFilled( false );
|
||||||
|
|
||||||
|
Border emptyBorder = BorderFactory.createEmptyBorder();
|
||||||
|
iconButton.setBorder( emptyBorder );
|
||||||
|
maxButton.setBorder( emptyBorder );
|
||||||
|
closeButton.setBorder( emptyBorder );
|
||||||
|
|
||||||
|
updateButtonsVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addSubComponents() {
|
||||||
|
titleLabel = new JLabel( frame.getTitle() );
|
||||||
|
titleLabel.setFont( FlatUIUtils.nonUIResource( getFont() ) );
|
||||||
|
titleLabel.setMinimumSize( new Dimension( UIScale.scale( 32 ), 1 ) );
|
||||||
|
updateFrameIcon();
|
||||||
|
updateColors();
|
||||||
|
|
||||||
|
buttonPanel = new JPanel();
|
||||||
|
buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.LINE_AXIS ) );
|
||||||
|
buttonPanel.setOpaque( false );
|
||||||
|
|
||||||
|
buttonPanel.add( iconButton );
|
||||||
|
buttonPanel.add( maxButton );
|
||||||
|
buttonPanel.add( closeButton );
|
||||||
|
|
||||||
|
add( titleLabel, BorderLayout.CENTER );
|
||||||
|
add( buttonPanel, BorderLayout.LINE_END );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateFrameIcon() {
|
||||||
|
Icon frameIcon = frame.getFrameIcon();
|
||||||
|
if( frameIcon == UIManager.getIcon( "InternalFrame.icon" ) )
|
||||||
|
frameIcon = null;
|
||||||
|
titleLabel.setIcon( frameIcon );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateColors() {
|
||||||
|
Color background = FlatUIUtils.nonUIResource( frame.isSelected() ? selectedTitleColor : notSelectedTitleColor );
|
||||||
|
Color foreground = FlatUIUtils.nonUIResource( frame.isSelected() ? selectedTextColor : notSelectedTextColor );
|
||||||
|
|
||||||
|
titleLabel.setForeground( foreground );
|
||||||
|
iconButton.setBackground( background );
|
||||||
|
iconButton.setForeground( foreground );
|
||||||
|
maxButton.setBackground( background );
|
||||||
|
maxButton.setForeground( foreground );
|
||||||
|
closeButton.setBackground( background );
|
||||||
|
closeButton.setForeground( foreground );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonsVisibility() {
|
||||||
|
iconButton.setVisible( frame.isIconifiable() );
|
||||||
|
maxButton.setVisible( frame.isMaximizable() );
|
||||||
|
closeButton.setVisible( frame.isClosable() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does nothing because FlatLaf internal frames do not have system menus.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void assembleSystemMenu() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does nothing because FlatLaf internal frames do not have system menus.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void showSystemMenu() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paintComponent( Graphics g ) {
|
||||||
|
paintTitleBackground( g );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class FlatPropertyChangeHandler ------------------------------------
|
||||||
|
|
||||||
|
private class FlatPropertyChangeHandler
|
||||||
|
extends PropertyChangeHandler
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void propertyChange( PropertyChangeEvent e ) {
|
||||||
|
switch( e.getPropertyName() ) {
|
||||||
|
case JInternalFrame.TITLE_PROPERTY:
|
||||||
|
titleLabel.setText( frame.getTitle() );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JInternalFrame.FRAME_ICON_PROPERTY:
|
||||||
|
updateFrameIcon();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JInternalFrame.IS_SELECTED_PROPERTY:
|
||||||
|
updateColors();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "iconable":
|
||||||
|
case "maximizable":
|
||||||
|
case "closable":
|
||||||
|
updateButtonsVisibility();
|
||||||
|
enableActions();
|
||||||
|
revalidate();
|
||||||
|
repaint();
|
||||||
|
|
||||||
|
// do not invoke super.propertyChange() because this adds/removes the buttons
|
||||||
|
return;
|
||||||
|
|
||||||
|
case "componentOrientation":
|
||||||
|
applyComponentOrientation( frame.getComponentOrientation() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.propertyChange( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JInternalFrame;
|
||||||
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicInternalFrameUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame}.
|
||||||
|
*
|
||||||
|
* <!-- BasicInternalFrameUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault control Color
|
||||||
|
* @uiDefault InternalFrame.icon Icon
|
||||||
|
* @uiDefault InternalFrame.border Border
|
||||||
|
* @uiDefault InternalFrame.layoutTitlePaneAtOrigin boolean
|
||||||
|
*
|
||||||
|
* <!-- BasicInternalFrameTitlePane -->
|
||||||
|
*
|
||||||
|
* @uiDefault InternalFrame.titleFont Font
|
||||||
|
* @uiDefault InternalFrame.icon Icon
|
||||||
|
* @uiDefault InternalFrame.maximizeIcon Icon
|
||||||
|
* @uiDefault InternalFrame.minimizeIcon Icon
|
||||||
|
* @uiDefault InternalFrame.iconifyIcon Icon
|
||||||
|
* @uiDefault InternalFrame.closeIcon Icon
|
||||||
|
* @uiDefault InternalFrame.activeTitleBackground Color
|
||||||
|
* @uiDefault InternalFrame.activeTitleForeground Color
|
||||||
|
* @uiDefault InternalFrame.inactiveTitleBackground Color
|
||||||
|
* @uiDefault InternalFrame.inactiveTitleForeground Color
|
||||||
|
* @uiDefault InternalFrame.closeButtonToolTip String
|
||||||
|
* @uiDefault InternalFrame.iconButtonToolTip String
|
||||||
|
* @uiDefault InternalFrame.restoreButtonToolTip String
|
||||||
|
* @uiDefault InternalFrame.maxButtonToolTip String
|
||||||
|
* @uiDefault InternalFrameTitlePane.closeButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.minimizeButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.restoreButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.maximizeButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.moveButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.sizeButtonText String
|
||||||
|
* @uiDefault InternalFrameTitlePane.closeButton.mnemonic Integer
|
||||||
|
* @uiDefault InternalFrameTitlePane.minimizeButton.mnemonic Integer
|
||||||
|
* @uiDefault InternalFrameTitlePane.restoreButton.mnemonic Integer
|
||||||
|
* @uiDefault InternalFrameTitlePane.maximizeButton.mnemonic Integer
|
||||||
|
* @uiDefault InternalFrameTitlePane.moveButton.mnemonic Integer
|
||||||
|
* @uiDefault InternalFrameTitlePane.sizeButton.mnemonic Integer
|
||||||
|
*
|
||||||
|
* <!-- FlatInternalFrameUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault InternalFrame.activeBorderColor Color
|
||||||
|
* @uiDefault InternalFrame.inactiveBorderColor Color
|
||||||
|
* @uiDefault InternalFrame.borderLineWidth int
|
||||||
|
* @uiDefault InternalFrame.borderMargins Insets
|
||||||
|
*
|
||||||
|
* <!-- FlatInternalFrameTitlePane -->
|
||||||
|
*
|
||||||
|
* @uiDefault InternalFrameTitlePane.border Border
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatInternalFrameUI
|
||||||
|
extends BasicInternalFrameUI
|
||||||
|
{
|
||||||
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
|
return new FlatInternalFrameUI( (JInternalFrame) c );
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatInternalFrameUI( JInternalFrame b ) {
|
||||||
|
super( b );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void installUI( JComponent c ) {
|
||||||
|
super.installUI( c );
|
||||||
|
|
||||||
|
LookAndFeel.installProperty( frame, "opaque", false );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected JComponent createNorthPane( JInternalFrame w ) {
|
||||||
|
return new FlatInternalFrameTitlePane( w );
|
||||||
|
}
|
||||||
|
|
||||||
|
//---- class FlatInternalFrameBorder --------------------------------------
|
||||||
|
|
||||||
|
public static class FlatInternalFrameBorder
|
||||||
|
extends FlatEmptyBorder
|
||||||
|
{
|
||||||
|
private final Color activeBorderColor = UIManager.getColor( "InternalFrame.activeBorderColor" );
|
||||||
|
private final Color inactiveBorderColor = UIManager.getColor( "InternalFrame.inactiveBorderColor" );
|
||||||
|
private final int borderLineWidth = FlatUIUtils.getUIInt( "InternalFrame.borderLineWidth", 1 );
|
||||||
|
|
||||||
|
public FlatInternalFrameBorder() {
|
||||||
|
super( UIManager.getInsets( "InternalFrame.borderMargins" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
|
if( c instanceof JInternalFrame && ((JInternalFrame)c).isMaximum() ) {
|
||||||
|
insets.left = scale( Math.min( borderLineWidth, left ) );
|
||||||
|
insets.top = scale( Math.min( borderLineWidth, top ) );
|
||||||
|
insets.right = scale( Math.min( borderLineWidth, right ) );
|
||||||
|
insets.bottom = scale( Math.min( borderLineWidth, bottom ) );
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getBorderInsets( c, insets );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||||
|
JInternalFrame f = (JInternalFrame) c;
|
||||||
|
|
||||||
|
Insets insets = getBorderInsets( c );
|
||||||
|
float lineWidth = scale( (float) borderLineWidth );
|
||||||
|
|
||||||
|
Graphics2D g2 = (Graphics2D) g.create();
|
||||||
|
try {
|
||||||
|
FlatUIUtils.setRenderingHints( g2 );
|
||||||
|
g2.setColor( f.isSelected() ? activeBorderColor : inactiveBorderColor );
|
||||||
|
g2.fill( FlatUIUtils.createRectangle(
|
||||||
|
x + insets.left - lineWidth,
|
||||||
|
y + insets.top - lineWidth,
|
||||||
|
width - insets.left - insets.right + (lineWidth * 2),
|
||||||
|
height - insets.top - insets.bottom + (lineWidth * 2),
|
||||||
|
lineWidth ) );
|
||||||
|
} finally {
|
||||||
|
g2.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,13 +29,26 @@ import javax.swing.plaf.basic.BasicBorders;
|
|||||||
public class FlatMarginBorder
|
public class FlatMarginBorder
|
||||||
extends BasicBorders.MarginBorder
|
extends BasicBorders.MarginBorder
|
||||||
{
|
{
|
||||||
|
private final int left, right, top, bottom;
|
||||||
|
|
||||||
|
public FlatMarginBorder() {
|
||||||
|
left = right = top = bottom = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatMarginBorder( Insets insets ) {
|
||||||
|
left = insets.left;
|
||||||
|
top = insets.top;
|
||||||
|
right = insets.right;
|
||||||
|
bottom = insets.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Insets getBorderInsets( Component c, Insets insets ) {
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
insets = super.getBorderInsets( c, insets );
|
insets = super.getBorderInsets( c, insets );
|
||||||
insets.top = scale( insets.top );
|
insets.top = scale( insets.top + top );
|
||||||
insets.left = scale( insets.left );
|
insets.left = scale( insets.left + left );
|
||||||
insets.bottom = scale( insets.bottom );
|
insets.bottom = scale( insets.bottom + bottom );
|
||||||
insets.right = scale( insets.right );
|
insets.right = scale( insets.right + right );
|
||||||
return insets;
|
return insets;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import javax.swing.JMenuBar;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Border for {@link javax.swing.JMenu}, {@link javax.swing.JMenuItem},
|
||||||
|
* {@link javax.swing.JCheckBoxMenuItem} and {@link javax.swing.JRadioButtonMenuItem}.
|
||||||
|
*
|
||||||
|
* @uiDefault MenuBar.itemMargins Insets
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatMenuItemBorder
|
||||||
|
extends FlatMarginBorder
|
||||||
|
{
|
||||||
|
private final Insets menuBarItemMargins = UIManager.getInsets( "MenuBar.itemMargins" );
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
|
if( c.getParent() instanceof JMenuBar ) {
|
||||||
|
insets.top = scale( menuBarItemMargins.top );
|
||||||
|
insets.left = scale( menuBarItemMargins.left );
|
||||||
|
insets.bottom = scale( menuBarItemMargins.bottom + 1 );
|
||||||
|
insets.right = scale( menuBarItemMargins.right );
|
||||||
|
return insets;
|
||||||
|
} else
|
||||||
|
return super.getBorderInsets( c, insets );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,10 +17,18 @@
|
|||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import javax.swing.ButtonModel;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicMenuItemUI;
|
import javax.swing.plaf.basic.BasicMenuItemUI;
|
||||||
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}.
|
||||||
@@ -74,4 +82,26 @@ public class FlatMenuItemUI
|
|||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
defaultTextIconGap = scale( defaultTextIconGap );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
||||||
|
paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect,
|
||||||
|
String text, Color disabledForeground, Color selectionForeground )
|
||||||
|
{
|
||||||
|
FontMetrics fm = menuItem.getFontMetrics( menuItem.getFont() );
|
||||||
|
int mnemonicIndex = FlatLaf.isShowMnemonics() ? menuItem.getDisplayedMnemonicIndex() : -1;
|
||||||
|
|
||||||
|
ButtonModel model = menuItem.getModel();
|
||||||
|
g.setColor( !model.isEnabled()
|
||||||
|
? disabledForeground
|
||||||
|
: (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())
|
||||||
|
? selectionForeground
|
||||||
|
: menuItem.getForeground()) );
|
||||||
|
|
||||||
|
FlatUIUtils.drawStringUnderlineCharAt( menuItem, g, text, mnemonicIndex,
|
||||||
|
textRect.x, textRect.y + fm.getAscent() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,17 @@
|
|||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import javax.swing.ButtonModel;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.event.MouseInputListener;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicMenuUI;
|
import javax.swing.plaf.basic.BasicMenuUI;
|
||||||
|
|
||||||
@@ -48,11 +57,17 @@ import javax.swing.plaf.basic.BasicMenuUI;
|
|||||||
* @uiDefault Menu.useMenuBarBackgroundForTopLevel boolean default is false
|
* @uiDefault Menu.useMenuBarBackgroundForTopLevel boolean default is false
|
||||||
* @uiDefault MenuBar.background Color used if Menu.useMenuBarBackgroundForTopLevel is true
|
* @uiDefault MenuBar.background Color used if Menu.useMenuBarBackgroundForTopLevel is true
|
||||||
*
|
*
|
||||||
|
* <!-- FlatMenuUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault MenuBar.hoverBackground Color
|
||||||
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatMenuUI
|
public class FlatMenuUI
|
||||||
extends BasicMenuUI
|
extends BasicMenuUI
|
||||||
{
|
{
|
||||||
|
private Color hoverBackground;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatMenuUI();
|
return new FlatMenuUI();
|
||||||
}
|
}
|
||||||
@@ -61,10 +76,21 @@ public class FlatMenuUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
|
menuItem.setRolloverEnabled( true );
|
||||||
|
|
||||||
|
hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" );
|
||||||
|
|
||||||
// scale
|
// scale
|
||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
defaultTextIconGap = scale( defaultTextIconGap );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void uninstallDefaults() {
|
||||||
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
hoverBackground = null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
* Scale defaultTextIconGap again if iconTextGap property has changed.
|
||||||
*/
|
*/
|
||||||
@@ -77,4 +103,46 @@ public class FlatMenuUI
|
|||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
defaultTextIconGap = scale( defaultTextIconGap );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected MouseInputListener createMouseInputListener( JComponent c ) {
|
||||||
|
return new BasicMenuUI.MouseInputHandler() {
|
||||||
|
@Override
|
||||||
|
public void mouseEntered( MouseEvent e ) {
|
||||||
|
super.mouseEntered( e );
|
||||||
|
rollover( e, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited( MouseEvent e ) {
|
||||||
|
super.mouseExited( e );
|
||||||
|
rollover( e, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rollover( MouseEvent e, boolean rollover ) {
|
||||||
|
JMenu menu = (JMenu) e.getSource();
|
||||||
|
if( menu.isTopLevelMenu() && menu.isRolloverEnabled() ) {
|
||||||
|
menu.getModel().setRollover( rollover );
|
||||||
|
menu.repaint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintBackground( Graphics g, JMenuItem menuItem, Color bgColor ) {
|
||||||
|
ButtonModel model = menuItem.getModel();
|
||||||
|
if( model.isArmed() || model.isSelected() ) {
|
||||||
|
super.paintBackground( g, menuItem, bgColor );
|
||||||
|
} else if( model.isRollover() && model.isEnabled() && ((JMenu)menuItem).isTopLevelMenu() ) {
|
||||||
|
FlatUIUtils.setColor( g, hoverBackground, menuItem.getBackground() );
|
||||||
|
g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() );
|
||||||
|
} else
|
||||||
|
super.paintBackground( g, menuItem, bgColor );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
||||||
|
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicPanelUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JPanel}.
|
||||||
|
*
|
||||||
|
* <!-- BasicPanelUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault Panel.font Font unused
|
||||||
|
* @uiDefault Panel.background Color only used if opaque
|
||||||
|
* @uiDefault Panel.foreground Color
|
||||||
|
* @uiDefault Panel.border Border
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatPanelUI
|
||||||
|
extends BasicPanelUI
|
||||||
|
{
|
||||||
|
private static ComponentUI instance;
|
||||||
|
|
||||||
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
|
if( instance == null )
|
||||||
|
instance = new FlatPanelUI();
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,15 +20,21 @@ import static com.formdev.flatlaf.util.UIScale.scale;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Toolkit;
|
||||||
import java.awt.event.FocusListener;
|
import java.awt.event.FocusListener;
|
||||||
|
import java.awt.event.KeyAdapter;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.KeyListener;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import javax.swing.Icon;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicPasswordFieldUI;
|
import javax.swing.plaf.basic.BasicPasswordFieldUI;
|
||||||
|
import javax.swing.text.Caret;
|
||||||
|
import javax.swing.text.JTextComponent;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
import com.formdev.flatlaf.util.SystemInfo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}.
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}.
|
||||||
@@ -51,22 +57,28 @@ import com.formdev.flatlaf.util.SystemInfo;
|
|||||||
*
|
*
|
||||||
* <!-- FlatPasswordFieldUI -->
|
* <!-- FlatPasswordFieldUI -->
|
||||||
*
|
*
|
||||||
|
* @uiDefault TextComponent.arc int
|
||||||
* @uiDefault Component.focusWidth int
|
* @uiDefault Component.focusWidth int
|
||||||
* @uiDefault Component.minimumWidth int
|
* @uiDefault Component.minimumWidth int
|
||||||
* @uiDefault Component.isIntelliJTheme boolean
|
* @uiDefault Component.isIntelliJTheme boolean
|
||||||
* @uiDefault PasswordField.placeholderForeground Color
|
* @uiDefault PasswordField.placeholderForeground Color
|
||||||
|
* @uiDefault PasswordField.capsLockIcon Icon
|
||||||
|
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatPasswordFieldUI
|
public class FlatPasswordFieldUI
|
||||||
extends BasicPasswordFieldUI
|
extends BasicPasswordFieldUI
|
||||||
{
|
{
|
||||||
|
protected int arc;
|
||||||
protected int focusWidth;
|
protected int focusWidth;
|
||||||
protected int minimumWidth;
|
protected int minimumWidth;
|
||||||
protected boolean isIntelliJTheme;
|
protected boolean isIntelliJTheme;
|
||||||
protected Color placeholderForeground;
|
protected Color placeholderForeground;
|
||||||
|
protected Icon capsLockIcon;
|
||||||
|
|
||||||
private FocusListener focusListener;
|
private FocusListener focusListener;
|
||||||
|
private KeyListener capsLockListener;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatPasswordFieldUI();
|
return new FlatPasswordFieldUI();
|
||||||
@@ -76,15 +88,13 @@ public class FlatPasswordFieldUI
|
|||||||
protected void installDefaults() {
|
protected void installDefaults() {
|
||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
// use other echoChar on Mac because the default is too large in SF font
|
|
||||||
if( SystemInfo.IS_MAC )
|
|
||||||
LookAndFeel.installProperty( getComponent(), "echoChar", '\u2022' );
|
|
||||||
|
|
||||||
String prefix = getPropertyPrefix();
|
String prefix = getPropertyPrefix();
|
||||||
|
arc = UIManager.getInt( "TextComponent.arc" );
|
||||||
focusWidth = UIManager.getInt( "Component.focusWidth" );
|
focusWidth = UIManager.getInt( "Component.focusWidth" );
|
||||||
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
||||||
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
||||||
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
|
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
|
||||||
|
capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" );
|
||||||
|
|
||||||
LookAndFeel.installProperty( getComponent(), "opaque", focusWidth == 0 );
|
LookAndFeel.installProperty( getComponent(), "opaque", focusWidth == 0 );
|
||||||
|
|
||||||
@@ -96,6 +106,7 @@ public class FlatPasswordFieldUI
|
|||||||
super.uninstallDefaults();
|
super.uninstallDefaults();
|
||||||
|
|
||||||
placeholderForeground = null;
|
placeholderForeground = null;
|
||||||
|
capsLockIcon = null;
|
||||||
|
|
||||||
MigLayoutVisualPadding.uninstall( getComponent() );
|
MigLayoutVisualPadding.uninstall( getComponent() );
|
||||||
}
|
}
|
||||||
@@ -105,7 +116,23 @@ public class FlatPasswordFieldUI
|
|||||||
super.installListeners();
|
super.installListeners();
|
||||||
|
|
||||||
focusListener = new FlatUIUtils.RepaintFocusListener( getComponent() );
|
focusListener = new FlatUIUtils.RepaintFocusListener( getComponent() );
|
||||||
|
capsLockListener = new KeyAdapter() {
|
||||||
|
@Override
|
||||||
|
public void keyPressed( KeyEvent e ) {
|
||||||
|
repaint( e );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void keyReleased( KeyEvent e ) {
|
||||||
|
repaint( e );
|
||||||
|
}
|
||||||
|
private void repaint( KeyEvent e ) {
|
||||||
|
if( e.getKeyCode() == KeyEvent.VK_CAPS_LOCK )
|
||||||
|
e.getComponent().repaint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
getComponent().addFocusListener( focusListener );
|
getComponent().addFocusListener( focusListener );
|
||||||
|
getComponent().addKeyListener( capsLockListener );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -113,7 +140,14 @@ public class FlatPasswordFieldUI
|
|||||||
super.uninstallListeners();
|
super.uninstallListeners();
|
||||||
|
|
||||||
getComponent().removeFocusListener( focusListener );
|
getComponent().removeFocusListener( focusListener );
|
||||||
|
getComponent().removeKeyListener( capsLockListener );
|
||||||
focusListener = null;
|
focusListener = null;
|
||||||
|
capsLockListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Caret createCaret() {
|
||||||
|
return new FlatCaret( UIManager.getString( "TextComponent.selectAllOnFocusPolicy" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -126,11 +160,23 @@ public class FlatPasswordFieldUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintSafely( Graphics g ) {
|
protected void paintSafely( Graphics g ) {
|
||||||
FlatTextFieldUI.paintBackground( g, getComponent(), focusWidth, isIntelliJTheme );
|
FlatTextFieldUI.paintBackground( g, getComponent(), focusWidth, arc, isIntelliJTheme );
|
||||||
FlatTextFieldUI.paintPlaceholder( g, getComponent(), placeholderForeground );
|
FlatTextFieldUI.paintPlaceholder( g, getComponent(), placeholderForeground );
|
||||||
|
paintCapsLock( g );
|
||||||
super.paintSafely( g );
|
super.paintSafely( g );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void paintCapsLock( Graphics g ) {
|
||||||
|
JTextComponent c = getComponent();
|
||||||
|
if( !c.isFocusOwner() ||
|
||||||
|
!Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
int y = (c.getHeight() - capsLockIcon.getIconHeight()) / 2;
|
||||||
|
int x = c.getWidth() - capsLockIcon.getIconWidth() - y;
|
||||||
|
capsLockIcon.paintIcon( c, g, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintBackground( Graphics g ) {
|
protected void paintBackground( Graphics g ) {
|
||||||
// background is painted elsewhere
|
// background is painted elsewhere
|
||||||
|
|||||||
@@ -16,7 +16,12 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Container;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Border for {@link javax.swing.JPopupMenu}.
|
* Border for {@link javax.swing.JPopupMenu}.
|
||||||
@@ -33,4 +38,18 @@ public class FlatPopupMenuBorder
|
|||||||
super( UIManager.getInsets( "PopupMenu.borderInsets" ),
|
super( UIManager.getInsets( "PopupMenu.borderInsets" ),
|
||||||
UIManager.getColor( "PopupMenu.borderColor" ) );
|
UIManager.getColor( "PopupMenu.borderColor" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getBorderInsets( Component c, Insets insets ) {
|
||||||
|
if( c instanceof Container &&
|
||||||
|
((Container)c).getComponentCount() > 0 &&
|
||||||
|
((Container)c).getComponent( 0 ) instanceof JScrollPane )
|
||||||
|
{
|
||||||
|
// e.g. for combobox popups
|
||||||
|
insets.left = insets.top = insets.right = insets.bottom = UIScale.scale( 1 );
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getBorderInsets( c, insets );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.FlatClientProperties.*;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.FontMetrics;
|
import java.awt.FontMetrics;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
@@ -23,6 +24,7 @@ import java.awt.Graphics2D;
|
|||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.geom.Area;
|
import java.awt.geom.Area;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JProgressBar;
|
import javax.swing.JProgressBar;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
@@ -60,6 +62,8 @@ public class FlatProgressBarUI
|
|||||||
protected Dimension horizontalSize;
|
protected Dimension horizontalSize;
|
||||||
protected Dimension verticalSize;
|
protected Dimension verticalSize;
|
||||||
|
|
||||||
|
private PropertyChangeListener propertyChangeListener;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatProgressBarUI();
|
return new FlatProgressBarUI();
|
||||||
}
|
}
|
||||||
@@ -75,11 +79,35 @@ public class FlatProgressBarUI
|
|||||||
verticalSize = UIManager.getDimension( "ProgressBar.verticalSize" );
|
verticalSize = UIManager.getDimension( "ProgressBar.verticalSize" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installListeners() {
|
||||||
|
super.installListeners();
|
||||||
|
|
||||||
|
propertyChangeListener = e -> {
|
||||||
|
switch( e.getPropertyName() ) {
|
||||||
|
case PROGRESS_BAR_LARGE_HEIGHT:
|
||||||
|
case PROGRESS_BAR_SQUARE:
|
||||||
|
progressBar.revalidate();
|
||||||
|
progressBar.repaint();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
progressBar.addPropertyChangeListener( propertyChangeListener );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void uninstallListeners() {
|
||||||
|
super.uninstallListeners();
|
||||||
|
|
||||||
|
progressBar.removePropertyChangeListener( propertyChangeListener );
|
||||||
|
propertyChangeListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dimension getPreferredSize( JComponent c ) {
|
public Dimension getPreferredSize( JComponent c ) {
|
||||||
Dimension size = super.getPreferredSize( c );
|
Dimension size = super.getPreferredSize( c );
|
||||||
|
|
||||||
if( progressBar.isStringPainted() ) {
|
if( progressBar.isStringPainted() || clientPropertyBoolean( c, PROGRESS_BAR_LARGE_HEIGHT, false ) ) {
|
||||||
// recalculate progress height/width to make it smaller
|
// recalculate progress height/width to make it smaller
|
||||||
Insets insets = progressBar.getInsets();
|
Insets insets = progressBar.getInsets();
|
||||||
FontMetrics fm = progressBar.getFontMetrics( progressBar.getFont() );
|
FontMetrics fm = progressBar.getFontMetrics( progressBar.getFont() );
|
||||||
@@ -122,7 +150,9 @@ public class FlatProgressBarUI
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
boolean horizontal = (progressBar.getOrientation() == JProgressBar.HORIZONTAL);
|
boolean horizontal = (progressBar.getOrientation() == JProgressBar.HORIZONTAL);
|
||||||
int arc = Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
|
int arc = clientPropertyBoolean( c, PROGRESS_BAR_SQUARE, false )
|
||||||
|
? 0
|
||||||
|
: Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
|
||||||
|
|
||||||
FlatUIUtils.setRenderingHints( (Graphics2D) g );
|
FlatUIUtils.setRenderingHints( (Graphics2D) g );
|
||||||
|
|
||||||
@@ -163,4 +193,19 @@ public class FlatProgressBarUI
|
|||||||
paintString( g, x, y, width, height, amountFull, insets );
|
paintString( g, x, y, width, height, amountFull, insets );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setAnimationIndex( int newValue ) {
|
||||||
|
super.setAnimationIndex( newValue );
|
||||||
|
|
||||||
|
// On HiDPI screens at 125%, 150% and 175% scaling, it occurs that antialiased painting
|
||||||
|
// may paint one pixel outside of the clipping area. This results in visual artifacts
|
||||||
|
// in indeterminate mode when the progress moves around.
|
||||||
|
// Unfortunately it is not safe to invoke getBox() from here (may throw NPE),
|
||||||
|
// which makes it impractical to get progress box and repaint increased box.
|
||||||
|
// Only solution is to repaint whole progress bar.
|
||||||
|
double systemScaleFactor = UIScale.getSystemScaleFactor( progressBar.getGraphicsConfiguration() );
|
||||||
|
if( (int) systemScaleFactor != systemScaleFactor )
|
||||||
|
progressBar.repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,11 @@
|
|||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
|
import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
|
||||||
|
|
||||||
@@ -74,4 +77,9 @@ public class FlatRadioButtonMenuItemUI
|
|||||||
defaultTextIconGap = scale( defaultTextIconGap );
|
defaultTextIconGap = scale( defaultTextIconGap );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintText( Graphics g, JMenuItem menuItem, Rectangle textRect, String text ) {
|
||||||
|
FlatMenuItemUI.paintText( g, menuItem, textRect, text, disabledForeground, selectionForeground );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ public class FlatRadioButtonUI
|
|||||||
@Override
|
@Override
|
||||||
public Dimension getPreferredSize( JComponent c ) {
|
public Dimension getPreferredSize( JComponent c ) {
|
||||||
Dimension size = super.getPreferredSize( c );
|
Dimension size = super.getPreferredSize( c );
|
||||||
|
if( size == null )
|
||||||
|
return null;
|
||||||
|
|
||||||
// small insets fix
|
// small insets fix
|
||||||
int focusWidth = getIconFocusWidth( c );
|
int focusWidth = getIconFocusWidth( c );
|
||||||
@@ -118,11 +120,13 @@ public class FlatRadioButtonUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paint( Graphics g, JComponent c ) {
|
public void paint( Graphics g, JComponent c ) {
|
||||||
// fill background even if opaque if
|
// fill background even if not opaque if
|
||||||
// - used as cell renderer (because of selection background)
|
// - contentAreaFilled is true and
|
||||||
// - if background was explicitly set to a non-UIResource color
|
// - used as cell renderer (because of selection background)
|
||||||
|
// - or if background was explicitly set to a non-UIResource color
|
||||||
if( !c.isOpaque() &&
|
if( !c.isOpaque() &&
|
||||||
(c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource)) )
|
((AbstractButton)c).isContentAreaFilled() &&
|
||||||
|
(c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource)))
|
||||||
{
|
{
|
||||||
g.setColor( c.getBackground() );
|
g.setColor( c.getBackground() );
|
||||||
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
|
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicRootPaneUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the Flat LaF UI delegate for {@link javax.swing.JRootPane}.
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatRootPaneUI
|
||||||
|
extends BasicRootPaneUI
|
||||||
|
{
|
||||||
|
private static ComponentUI instance;
|
||||||
|
|
||||||
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
|
if( instance == null )
|
||||||
|
instance = new FlatRootPaneUI();
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,9 +25,11 @@ import java.awt.event.MouseEvent;
|
|||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import javax.swing.InputMap;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicScrollBarUI;
|
import javax.swing.plaf.basic.BasicScrollBarUI;
|
||||||
@@ -127,9 +129,24 @@ public class FlatScrollBarUI
|
|||||||
public void propertyChange( PropertyChangeEvent e ) {
|
public void propertyChange( PropertyChangeEvent e ) {
|
||||||
super.propertyChange( e );
|
super.propertyChange( e );
|
||||||
|
|
||||||
if( FlatClientProperties.SCROLL_BAR_SHOW_BUTTONS.equals( e.getPropertyName() ) ) {
|
switch( e.getPropertyName() ) {
|
||||||
scrollbar.revalidate();
|
case FlatClientProperties.SCROLL_BAR_SHOW_BUTTONS:
|
||||||
scrollbar.repaint();
|
scrollbar.revalidate();
|
||||||
|
scrollbar.repaint();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "componentOrientation":
|
||||||
|
// this is missing in BasicScrollBarUI.Handler.propertyChange()
|
||||||
|
InputMap inputMap = (InputMap) UIManager.get( "ScrollBar.ancestorInputMap" );
|
||||||
|
if( !scrollbar.getComponentOrientation().isLeftToRight() ) {
|
||||||
|
InputMap rtlInputMap = (InputMap) UIManager.get( "ScrollBar.ancestorInputMap.RightToLeft" );
|
||||||
|
if( rtlInputMap != null ) {
|
||||||
|
rtlInputMap.setParent( inputMap );
|
||||||
|
inputMap = rtlInputMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SwingUtilities.replaceUIInputMap( scrollbar, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, inputMap );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,15 +26,21 @@ import java.awt.FontMetrics;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
import java.awt.KeyboardFocusManager;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
|
import java.awt.event.InputEvent;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.geom.Path2D;
|
import java.awt.geom.Path2D;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
@@ -82,6 +88,7 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault TabbedPane.tabSelectionHeight int
|
* @uiDefault TabbedPane.tabSelectionHeight int
|
||||||
* @uiDefault TabbedPane.contentSeparatorHeight int
|
* @uiDefault TabbedPane.contentSeparatorHeight int
|
||||||
* @uiDefault TabbedPane.showTabSeparators boolean
|
* @uiDefault TabbedPane.showTabSeparators boolean
|
||||||
|
* @uiDefault TabbedPane.tabSeparatorsFullHeight boolean
|
||||||
* @uiDefault TabbedPane.hasFullBorder boolean
|
* @uiDefault TabbedPane.hasFullBorder boolean
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -89,6 +96,9 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
public class FlatTabbedPaneUI
|
public class FlatTabbedPaneUI
|
||||||
extends BasicTabbedPaneUI
|
extends BasicTabbedPaneUI
|
||||||
{
|
{
|
||||||
|
private static Set<KeyStroke> focusForwardTraversalKeys;
|
||||||
|
private static Set<KeyStroke> focusBackwardTraversalKeys;
|
||||||
|
|
||||||
protected Color disabledForeground;
|
protected Color disabledForeground;
|
||||||
protected Color selectedBackground;
|
protected Color selectedBackground;
|
||||||
protected Color selectedForeground;
|
protected Color selectedForeground;
|
||||||
@@ -103,6 +113,7 @@ public class FlatTabbedPaneUI
|
|||||||
protected int tabSelectionHeight;
|
protected int tabSelectionHeight;
|
||||||
protected int contentSeparatorHeight;
|
protected int contentSeparatorHeight;
|
||||||
protected boolean showTabSeparators;
|
protected boolean showTabSeparators;
|
||||||
|
protected boolean tabSeparatorsFullHeight;
|
||||||
protected boolean hasFullBorder;
|
protected boolean hasFullBorder;
|
||||||
protected boolean tabsOverlapBorder;
|
protected boolean tabsOverlapBorder;
|
||||||
|
|
||||||
@@ -128,6 +139,7 @@ public class FlatTabbedPaneUI
|
|||||||
tabSelectionHeight = UIManager.getInt( "TabbedPane.tabSelectionHeight" );
|
tabSelectionHeight = UIManager.getInt( "TabbedPane.tabSelectionHeight" );
|
||||||
contentSeparatorHeight = UIManager.getInt( "TabbedPane.contentSeparatorHeight" );
|
contentSeparatorHeight = UIManager.getInt( "TabbedPane.contentSeparatorHeight" );
|
||||||
showTabSeparators = UIManager.getBoolean( "TabbedPane.showTabSeparators" );
|
showTabSeparators = UIManager.getBoolean( "TabbedPane.showTabSeparators" );
|
||||||
|
tabSeparatorsFullHeight = UIManager.getBoolean( "TabbedPane.tabSeparatorsFullHeight" );
|
||||||
hasFullBorder = UIManager.getBoolean( "TabbedPane.hasFullBorder" );
|
hasFullBorder = UIManager.getBoolean( "TabbedPane.hasFullBorder" );
|
||||||
tabsOverlapBorder = UIManager.getBoolean( "TabbedPane.tabsOverlapBorder" );
|
tabsOverlapBorder = UIManager.getBoolean( "TabbedPane.tabsOverlapBorder" );
|
||||||
|
|
||||||
@@ -139,11 +151,27 @@ public class FlatTabbedPaneUI
|
|||||||
tabHeight = scale( tabHeight );
|
tabHeight = scale( tabHeight );
|
||||||
tabSelectionHeight = scale( tabSelectionHeight );
|
tabSelectionHeight = scale( tabSelectionHeight );
|
||||||
|
|
||||||
|
// replace focus forward/backward traversal keys with TAB/Shift+TAB because
|
||||||
|
// the default also includes Ctrl+TAB/Ctrl+Shift+TAB, which we need to switch tabs
|
||||||
|
if( focusForwardTraversalKeys == null ) {
|
||||||
|
focusForwardTraversalKeys = Collections.singleton( KeyStroke.getKeyStroke( KeyEvent.VK_TAB, 0 ) );
|
||||||
|
focusBackwardTraversalKeys = Collections.singleton( KeyStroke.getKeyStroke( KeyEvent.VK_TAB, InputEvent.SHIFT_MASK ) );
|
||||||
|
}
|
||||||
|
// Ideally we should use `LookAndFeel.installProperty( tabPane, "focusTraversalKeysForward", keys )` here
|
||||||
|
// instead of `tabPane.setFocusTraversalKeys()`, but WindowsTabbedPaneUI also uses later method
|
||||||
|
// and switching from Windows LaF to FlatLaf would not replace the keys and Ctrl+TAB would not work.
|
||||||
|
tabPane.setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, focusForwardTraversalKeys );
|
||||||
|
tabPane.setFocusTraversalKeys( KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, focusBackwardTraversalKeys );
|
||||||
|
|
||||||
MigLayoutVisualPadding.install( tabPane, null );
|
MigLayoutVisualPadding.install( tabPane, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void uninstallDefaults() {
|
protected void uninstallDefaults() {
|
||||||
|
// restore focus forward/backward traversal keys
|
||||||
|
tabPane.setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null );
|
||||||
|
tabPane.setFocusTraversalKeys( KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null );
|
||||||
|
|
||||||
super.uninstallDefaults();
|
super.uninstallDefaults();
|
||||||
|
|
||||||
disabledForeground = null;
|
disabledForeground = null;
|
||||||
@@ -169,6 +197,7 @@ public class FlatTabbedPaneUI
|
|||||||
switch( e.getPropertyName() ) {
|
switch( e.getPropertyName() ) {
|
||||||
case TABBED_PANE_SHOW_TAB_SEPARATORS:
|
case TABBED_PANE_SHOW_TAB_SEPARATORS:
|
||||||
case TABBED_PANE_HAS_FULL_BORDER:
|
case TABBED_PANE_HAS_FULL_BORDER:
|
||||||
|
case TABBED_PANE_TAB_HEIGHT:
|
||||||
tabPane.revalidate();
|
tabPane.revalidate();
|
||||||
tabPane.repaint();
|
tabPane.repaint();
|
||||||
break;
|
break;
|
||||||
@@ -181,7 +210,7 @@ public class FlatTabbedPaneUI
|
|||||||
protected JButton createScrollButton( int direction ) {
|
protected JButton createScrollButton( int direction ) {
|
||||||
// this method is invoked before installDefaults(), so we can not use color fields here
|
// this method is invoked before installDefaults(), so we can not use color fields here
|
||||||
return new FlatArrowButton( direction, UIManager.getString( "Component.arrowType" ),
|
return new FlatArrowButton( direction, UIManager.getString( "Component.arrowType" ),
|
||||||
UIManager.getColor( "TabbedPane.shadow" ),
|
UIManager.getColor( "TabbedPane.foreground" ),
|
||||||
UIManager.getColor( "TabbedPane.disabledForeground" ), null,
|
UIManager.getColor( "TabbedPane.disabledForeground" ), null,
|
||||||
UIManager.getColor( "TabbedPane.hoverColor" ) );
|
UIManager.getColor( "TabbedPane.hoverColor" ) );
|
||||||
}
|
}
|
||||||
@@ -215,6 +244,7 @@ public class FlatTabbedPaneUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int calculateTabHeight( int tabPlacement, int tabIndex, int fontHeight ) {
|
protected int calculateTabHeight( int tabPlacement, int tabIndex, int fontHeight ) {
|
||||||
|
int tabHeight = clientPropertyInt( tabPane, TABBED_PANE_TAB_HEIGHT, this.tabHeight );
|
||||||
return Math.max( tabHeight, super.calculateTabHeight( tabPlacement, tabIndex, fontHeight ) - 2 /* was added by superclass */ );
|
return Math.max( tabHeight, super.calculateTabHeight( tabPlacement, tabIndex, fontHeight ) - 2 /* was added by superclass */ );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,7 +335,7 @@ public class FlatTabbedPaneUI
|
|||||||
!isLastInRun( tabIndex ) )
|
!isLastInRun( tabIndex ) )
|
||||||
{
|
{
|
||||||
float sepWidth = UIScale.scale( 1f );
|
float sepWidth = UIScale.scale( 1f );
|
||||||
float offset = UIScale.scale( 5f );
|
float offset = tabSeparatorsFullHeight ? 0 : UIScale.scale( 5f );
|
||||||
|
|
||||||
g.setColor( (tabSeparatorColor != null) ? tabSeparatorColor : contentAreaColor );
|
g.setColor( (tabSeparatorColor != null) ? tabSeparatorColor : contentAreaColor );
|
||||||
if( tabPlacement == LEFT || tabPlacement == RIGHT ) {
|
if( tabPlacement == LEFT || tabPlacement == RIGHT ) {
|
||||||
|
|||||||
@@ -22,13 +22,20 @@ import java.awt.Container;
|
|||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Insets;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.util.Objects;
|
||||||
|
import javax.swing.Icon;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTable;
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.border.Border;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.UIResource;
|
||||||
import javax.swing.plaf.basic.BasicTableHeaderUI;
|
import javax.swing.plaf.basic.BasicTableHeaderUI;
|
||||||
import javax.swing.table.TableCellRenderer;
|
import javax.swing.table.TableCellRenderer;
|
||||||
import javax.swing.table.TableColumn;
|
import javax.swing.table.TableColumn;
|
||||||
@@ -49,6 +56,7 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault TableHeader.separatorColor Color
|
* @uiDefault TableHeader.separatorColor Color
|
||||||
* @uiDefault TableHeader.bottomSeparatorColor Color
|
* @uiDefault TableHeader.bottomSeparatorColor Color
|
||||||
* @uiDefault TableHeader.height int
|
* @uiDefault TableHeader.height int
|
||||||
|
* @uiDefault TableHeader.sortIconPosition String right (default), left, top or bottom
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -58,6 +66,7 @@ public class FlatTableHeaderUI
|
|||||||
protected Color separatorColor;
|
protected Color separatorColor;
|
||||||
protected Color bottomSeparatorColor;
|
protected Color bottomSeparatorColor;
|
||||||
protected int height;
|
protected int height;
|
||||||
|
protected int sortIconPosition;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatTableHeaderUI();
|
return new FlatTableHeaderUI();
|
||||||
@@ -70,12 +79,33 @@ public class FlatTableHeaderUI
|
|||||||
separatorColor = UIManager.getColor( "TableHeader.separatorColor" );
|
separatorColor = UIManager.getColor( "TableHeader.separatorColor" );
|
||||||
bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" );
|
bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" );
|
||||||
height = UIManager.getInt( "TableHeader.height" );
|
height = UIManager.getInt( "TableHeader.height" );
|
||||||
|
switch( Objects.toString( UIManager.getString( "TableHeader.sortIconPosition" ), "right" ) ) {
|
||||||
|
default:
|
||||||
|
case "right": sortIconPosition = SwingConstants.RIGHT; break;
|
||||||
|
case "left": sortIconPosition = SwingConstants.LEFT; break;
|
||||||
|
case "top": sortIconPosition = SwingConstants.TOP; break;
|
||||||
|
case "bottom": sortIconPosition = SwingConstants.BOTTOM; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// use own renderer if necessary
|
||||||
|
if( sortIconPosition != SwingConstants.RIGHT ) {
|
||||||
|
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
|
||||||
|
if( defaultRenderer instanceof UIResource )
|
||||||
|
header.setDefaultRenderer( new FlatTableCellHeaderRenderer( defaultRenderer ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void uninstallDefaults() {
|
protected void uninstallDefaults() {
|
||||||
super.uninstallDefaults();
|
super.uninstallDefaults();
|
||||||
|
|
||||||
|
// restore default renderer
|
||||||
|
TableCellRenderer defaultRenderer = header.getDefaultRenderer();
|
||||||
|
if( defaultRenderer instanceof FlatTableCellHeaderRenderer ) {
|
||||||
|
((FlatTableCellHeaderRenderer)defaultRenderer).reset();
|
||||||
|
header.setDefaultRenderer( ((FlatTableCellHeaderRenderer)defaultRenderer).delegate );
|
||||||
|
}
|
||||||
|
|
||||||
separatorColor = null;
|
separatorColor = null;
|
||||||
bottomSeparatorColor = null;
|
bottomSeparatorColor = null;
|
||||||
}
|
}
|
||||||
@@ -215,4 +245,83 @@ public class FlatTableHeaderUI
|
|||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
return (parent instanceof JScrollPane) ? (JScrollPane) parent : null;
|
return (parent instanceof JScrollPane) ? (JScrollPane) parent : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- class FlatTableCellHeaderRenderer ----------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A delegating header renderer that is only used to paint sort arrows at
|
||||||
|
* top, bottom or left position.
|
||||||
|
*/
|
||||||
|
private class FlatTableCellHeaderRenderer
|
||||||
|
implements TableCellRenderer, Border, UIResource
|
||||||
|
{
|
||||||
|
private final TableCellRenderer delegate;
|
||||||
|
|
||||||
|
private int oldHorizontalTextPosition = -1;
|
||||||
|
private Border origBorder;
|
||||||
|
private Icon sortIcon;
|
||||||
|
|
||||||
|
FlatTableCellHeaderRenderer( TableCellRenderer delegate ) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected,
|
||||||
|
boolean hasFocus, int row, int column )
|
||||||
|
{
|
||||||
|
Component c = delegate.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
|
||||||
|
if( !(c instanceof JLabel) )
|
||||||
|
return c;
|
||||||
|
|
||||||
|
JLabel l = (JLabel) c;
|
||||||
|
|
||||||
|
if( sortIconPosition == SwingConstants.LEFT ) {
|
||||||
|
if( oldHorizontalTextPosition < 0 )
|
||||||
|
oldHorizontalTextPosition = l.getHorizontalTextPosition();
|
||||||
|
l.setHorizontalTextPosition( SwingConstants.RIGHT );
|
||||||
|
} else {
|
||||||
|
// top or bottom
|
||||||
|
sortIcon = l.getIcon();
|
||||||
|
origBorder = l.getBorder();
|
||||||
|
l.setIcon( null );
|
||||||
|
l.setBorder( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
if( sortIconPosition == SwingConstants.LEFT && oldHorizontalTextPosition >= 0 ) {
|
||||||
|
Component c = getTableCellRendererComponent( header.getTable(), "", false, false, -1, 0 );
|
||||||
|
if( c instanceof JLabel && ((JLabel)c).getHorizontalTextPosition() == SwingConstants.RIGHT )
|
||||||
|
((JLabel)c).setHorizontalTextPosition( oldHorizontalTextPosition );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||||
|
if( origBorder != null )
|
||||||
|
origBorder.paintBorder( c, g, x, y, width, height );
|
||||||
|
|
||||||
|
if( sortIcon != null ) {
|
||||||
|
int xi = x + ((width - sortIcon.getIconWidth()) / 2);
|
||||||
|
int yi = (sortIconPosition == SwingConstants.TOP)
|
||||||
|
? y + UIScale.scale( 1 )
|
||||||
|
: y + height - sortIcon.getIconHeight()
|
||||||
|
- 1 // for gap
|
||||||
|
- (int) (1 * UIScale.getUserScaleFactor()); // for bottom border
|
||||||
|
sortIcon.paintIcon( c, g, xi, yi );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getBorderInsets( Component c ) {
|
||||||
|
return (origBorder != null) ? origBorder.getBorderInsets( c ) : new Insets( 0, 0, 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBorderOpaque() {
|
||||||
|
return (origBorder != null) ? origBorder.isBorderOpaque() : false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 FormDev Software GmbH
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
|
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||||
|
import java.awt.Component;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Border for various text components (e.g. {@link javax.swing.JTextField}).
|
||||||
|
*
|
||||||
|
* @uiDefault Component.arc int
|
||||||
|
*
|
||||||
|
* @author Karl Tauber
|
||||||
|
*/
|
||||||
|
public class FlatTextBorder
|
||||||
|
extends FlatBorder
|
||||||
|
{
|
||||||
|
protected final int arc = UIManager.getInt( "TextComponent.arc" );
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected float getArc( Component c ) {
|
||||||
|
return scale( (float) arc );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,9 +32,11 @@ import javax.swing.JSpinner;
|
|||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.border.Border;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
import javax.swing.plaf.basic.BasicTextFieldUI;
|
import javax.swing.plaf.basic.BasicTextFieldUI;
|
||||||
|
import javax.swing.text.Caret;
|
||||||
import javax.swing.text.JTextComponent;
|
import javax.swing.text.JTextComponent;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
|
|
||||||
@@ -58,16 +60,19 @@ import com.formdev.flatlaf.FlatClientProperties;
|
|||||||
*
|
*
|
||||||
* <!-- FlatTextFieldUI -->
|
* <!-- FlatTextFieldUI -->
|
||||||
*
|
*
|
||||||
|
* @uiDefault TextComponent.arc int
|
||||||
* @uiDefault Component.focusWidth int
|
* @uiDefault Component.focusWidth int
|
||||||
* @uiDefault Component.minimumWidth int
|
* @uiDefault Component.minimumWidth int
|
||||||
* @uiDefault Component.isIntelliJTheme boolean
|
* @uiDefault Component.isIntelliJTheme boolean
|
||||||
* @uiDefault TextField.placeholderForeground Color
|
* @uiDefault TextField.placeholderForeground Color
|
||||||
|
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatTextFieldUI
|
public class FlatTextFieldUI
|
||||||
extends BasicTextFieldUI
|
extends BasicTextFieldUI
|
||||||
{
|
{
|
||||||
|
protected int arc;
|
||||||
protected int focusWidth;
|
protected int focusWidth;
|
||||||
protected int minimumWidth;
|
protected int minimumWidth;
|
||||||
protected boolean isIntelliJTheme;
|
protected boolean isIntelliJTheme;
|
||||||
@@ -84,6 +89,7 @@ public class FlatTextFieldUI
|
|||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
String prefix = getPropertyPrefix();
|
String prefix = getPropertyPrefix();
|
||||||
|
arc = UIManager.getInt( "TextComponent.arc" );
|
||||||
focusWidth = UIManager.getInt( "Component.focusWidth" );
|
focusWidth = UIManager.getInt( "Component.focusWidth" );
|
||||||
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
|
||||||
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
|
||||||
@@ -119,6 +125,11 @@ public class FlatTextFieldUI
|
|||||||
focusListener = null;
|
focusListener = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Caret createCaret() {
|
||||||
|
return new FlatCaret( UIManager.getString( "TextComponent.selectAllOnFocusPolicy" ) );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void propertyChange( PropertyChangeEvent e ) {
|
protected void propertyChange( PropertyChangeEvent e ) {
|
||||||
super.propertyChange( e );
|
super.propertyChange( e );
|
||||||
@@ -129,7 +140,7 @@ public class FlatTextFieldUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintSafely( Graphics g ) {
|
protected void paintSafely( Graphics g ) {
|
||||||
paintBackground( g, getComponent(), focusWidth, isIntelliJTheme );
|
paintBackground( g, getComponent(), focusWidth, arc, isIntelliJTheme );
|
||||||
paintPlaceholder( g, getComponent(), placeholderForeground );
|
paintPlaceholder( g, getComponent(), placeholderForeground );
|
||||||
super.paintSafely( g );
|
super.paintSafely( g );
|
||||||
}
|
}
|
||||||
@@ -139,13 +150,15 @@ public class FlatTextFieldUI
|
|||||||
// background is painted elsewhere
|
// background is painted elsewhere
|
||||||
}
|
}
|
||||||
|
|
||||||
static void paintBackground( Graphics g, JTextComponent c, int focusWidth, boolean isIntelliJTheme ) {
|
static void paintBackground( Graphics g, JTextComponent c, int focusWidth, int arc, boolean isIntelliJTheme ) {
|
||||||
|
Border border = c.getBorder();
|
||||||
|
|
||||||
// do not paint background if:
|
// do not paint background if:
|
||||||
// - not opaque and
|
// - not opaque and
|
||||||
// - border is not a flat border and
|
// - border is not a flat border and
|
||||||
// - opaque was explicitly set (to false)
|
// - opaque was explicitly set (to false)
|
||||||
// (same behaviour as in AquaTextFieldUI)
|
// (same behaviour as in AquaTextFieldUI)
|
||||||
if( !c.isOpaque() && !(c.getBorder() instanceof FlatBorder) && FlatUIUtils.hasOpaqueBeenExplicitlySet( c ) )
|
if( !c.isOpaque() && !(border instanceof FlatBorder) && FlatUIUtils.hasOpaqueBeenExplicitlySet( c ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// fill background if opaque to avoid garbage if user sets opaque to true
|
// fill background if opaque to avoid garbage if user sets opaque to true
|
||||||
@@ -157,7 +170,8 @@ public class FlatTextFieldUI
|
|||||||
try {
|
try {
|
||||||
FlatUIUtils.setRenderingHints( g2 );
|
FlatUIUtils.setRenderingHints( g2 );
|
||||||
|
|
||||||
float fFocusWidth = (c.getBorder() instanceof FlatBorder) ? scale( (float) focusWidth ) : 0;
|
float fFocusWidth = (border instanceof FlatBorder) ? scale( (float) focusWidth ) : 0;
|
||||||
|
float fArc = (border instanceof FlatTextBorder) ? scale( (float) arc ) : 0;
|
||||||
|
|
||||||
Color background = c.getBackground();
|
Color background = c.getBackground();
|
||||||
g2.setColor( !(background instanceof UIResource)
|
g2.setColor( !(background instanceof UIResource)
|
||||||
@@ -165,7 +179,7 @@ public class FlatTextFieldUI
|
|||||||
: (isIntelliJTheme && (!c.isEnabled() || !c.isEditable())
|
: (isIntelliJTheme && (!c.isEnabled() || !c.isEditable())
|
||||||
? FlatUIUtils.getParentBackground( c )
|
? FlatUIUtils.getParentBackground( c )
|
||||||
: background) );
|
: background) );
|
||||||
FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), fFocusWidth, 0 );
|
FlatUIUtils.paintComponentBackground( g2, 0, 0, c.getWidth(), c.getHeight(), fFocusWidth, fArc );
|
||||||
} finally {
|
} finally {
|
||||||
g2.dispose();
|
g2.dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static com.formdev.flatlaf.FlatClientProperties.*;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.ButtonModel;
|
import javax.swing.ButtonModel;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
@@ -60,12 +61,12 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault ToggleButton.disabledSelectedBackground Color
|
* @uiDefault ToggleButton.disabledSelectedBackground Color
|
||||||
* @uiDefault ToggleButton.toolbar.selectedBackground Color
|
* @uiDefault ToggleButton.toolbar.selectedBackground Color
|
||||||
*
|
*
|
||||||
* @uiDefault ToggleButton.underline.underlineHeight int
|
* @uiDefault ToggleButton.tab.underlineHeight int
|
||||||
* @uiDefault ToggleButton.underline.underlineColor Color
|
* @uiDefault ToggleButton.tab.underlineColor Color
|
||||||
* @uiDefault ToggleButton.underline.disabledUnderlineColor Color
|
* @uiDefault ToggleButton.tab.disabledUnderlineColor Color
|
||||||
* @uiDefault ToggleButton.underline.selectedBackground Color optional
|
* @uiDefault ToggleButton.tab.selectedBackground Color optional
|
||||||
* @uiDefault ToggleButton.underline.hoverBackground Color
|
* @uiDefault ToggleButton.tab.hoverBackground Color
|
||||||
* @uiDefault ToggleButton.underline.focusBackground Color
|
* @uiDefault ToggleButton.tab.focusBackground Color
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -79,12 +80,12 @@ public class FlatToggleButtonUI
|
|||||||
|
|
||||||
protected Color toolbarSelectedBackground;
|
protected Color toolbarSelectedBackground;
|
||||||
|
|
||||||
protected int underlineHeight;
|
protected int tabUnderlineHeight;
|
||||||
protected Color underlineColor;
|
protected Color tabUnderlineColor;
|
||||||
protected Color disabledUnderlineColor;
|
protected Color tabDisabledUnderlineColor;
|
||||||
protected Color underlineSelectedBackground;
|
protected Color tabSelectedBackground;
|
||||||
protected Color underlineHoverBackground;
|
protected Color tabHoverBackground;
|
||||||
protected Color underlineFocusBackground;
|
protected Color tabFocusBackground;
|
||||||
|
|
||||||
private boolean defaults_initialized = false;
|
private boolean defaults_initialized = false;
|
||||||
|
|
||||||
@@ -112,12 +113,12 @@ public class FlatToggleButtonUI
|
|||||||
|
|
||||||
toolbarSelectedBackground = UIManager.getColor( "ToggleButton.toolbar.selectedBackground" );
|
toolbarSelectedBackground = UIManager.getColor( "ToggleButton.toolbar.selectedBackground" );
|
||||||
|
|
||||||
underlineHeight = UIManager.getInt( "ToggleButton.underline.underlineHeight" );
|
tabUnderlineHeight = UIManager.getInt( "ToggleButton.tab.underlineHeight" );
|
||||||
underlineColor = UIManager.getColor( "ToggleButton.underline.underlineColor" );
|
tabUnderlineColor = UIManager.getColor( "ToggleButton.tab.underlineColor" );
|
||||||
disabledUnderlineColor = UIManager.getColor( "ToggleButton.underline.disabledUnderlineColor" );
|
tabDisabledUnderlineColor = UIManager.getColor( "ToggleButton.tab.disabledUnderlineColor" );
|
||||||
underlineSelectedBackground = UIManager.getColor( "ToggleButton.underline.selectedBackground" );
|
tabSelectedBackground = UIManager.getColor( "ToggleButton.tab.selectedBackground" );
|
||||||
underlineHoverBackground = UIManager.getColor( "ToggleButton.underline.hoverBackground" );
|
tabHoverBackground = UIManager.getColor( "ToggleButton.tab.hoverBackground" );
|
||||||
underlineFocusBackground = UIManager.getColor( "ToggleButton.underline.focusBackground" );
|
tabFocusBackground = UIManager.getColor( "ToggleButton.tab.focusBackground" );
|
||||||
|
|
||||||
defaults_initialized = true;
|
defaults_initialized = true;
|
||||||
}
|
}
|
||||||
@@ -129,21 +130,44 @@ public class FlatToggleButtonUI
|
|||||||
defaults_initialized = false;
|
defaults_initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isUnderlineButton( Component c ) {
|
@Override
|
||||||
return c instanceof JToggleButton && clientPropertyEquals( (JToggleButton) c, BUTTON_TYPE, BUTTON_TYPE_UNDERLINE );
|
protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) {
|
||||||
|
super.propertyChange( b, e );
|
||||||
|
|
||||||
|
switch( e.getPropertyName() ) {
|
||||||
|
case BUTTON_TYPE:
|
||||||
|
if( BUTTON_TYPE_TAB.equals( e.getOldValue() ) || BUTTON_TYPE_TAB.equals( e.getNewValue() ) ) {
|
||||||
|
MigLayoutVisualPadding.uninstall( b );
|
||||||
|
MigLayoutVisualPadding.install( b, getFocusWidth( b ) );
|
||||||
|
b.revalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
b.repaint();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TAB_BUTTON_UNDERLINE_HEIGHT:
|
||||||
|
case TAB_BUTTON_UNDERLINE_COLOR:
|
||||||
|
case TAB_BUTTON_SELECTED_BACKGROUND:
|
||||||
|
b.repaint();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isTabButton( Component c ) {
|
||||||
|
return c instanceof JToggleButton && clientPropertyEquals( (JToggleButton) c, BUTTON_TYPE, BUTTON_TYPE_TAB );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void paintBackground( Graphics g, JComponent c ) {
|
protected void paintBackground( Graphics g, JComponent c ) {
|
||||||
if( isUnderlineButton( c ) ) {
|
if( isTabButton( c ) ) {
|
||||||
int height = c.getHeight();
|
int height = c.getHeight();
|
||||||
int width = c.getWidth();
|
int width = c.getWidth();
|
||||||
boolean selected = ((AbstractButton)c).isSelected();
|
boolean selected = ((AbstractButton)c).isSelected();
|
||||||
|
|
||||||
// paint background
|
// paint background
|
||||||
Color background = buttonStateColor( c,
|
Color background = buttonStateColor( c,
|
||||||
selected ? underlineSelectedBackground : null,
|
selected ? clientPropertyColor( c, TAB_BUTTON_SELECTED_BACKGROUND, tabSelectedBackground ) : null,
|
||||||
null, underlineFocusBackground, underlineHoverBackground, null );
|
null, tabFocusBackground, tabHoverBackground, null );
|
||||||
if( background != null ) {
|
if( background != null ) {
|
||||||
g.setColor( background );
|
g.setColor( background );
|
||||||
g.fillRect( 0, 0, width, height );
|
g.fillRect( 0, 0, width, height );
|
||||||
@@ -151,8 +175,10 @@ public class FlatToggleButtonUI
|
|||||||
|
|
||||||
// paint underline if selected
|
// paint underline if selected
|
||||||
if( selected ) {
|
if( selected ) {
|
||||||
int underlineHeight = UIScale.scale( this.underlineHeight );
|
int underlineHeight = UIScale.scale( clientPropertyInt( c, TAB_BUTTON_UNDERLINE_HEIGHT, tabUnderlineHeight ) );
|
||||||
g.setColor( c.isEnabled() ? underlineColor : disabledUnderlineColor );
|
g.setColor( c.isEnabled()
|
||||||
|
? clientPropertyColor( c, TAB_BUTTON_UNDERLINE_COLOR, tabUnderlineColor )
|
||||||
|
: tabDisabledUnderlineColor );
|
||||||
g.fillRect( 0, height - underlineHeight, width, underlineHeight );
|
g.fillRect( 0, height - underlineHeight, width, underlineHeight );
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@@ -186,4 +212,9 @@ public class FlatToggleButtonUI
|
|||||||
|
|
||||||
return super.getForeground( c );
|
return super.getForeground( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getFocusWidth( JComponent c ) {
|
||||||
|
return isTabButton( c ) ? 0 : super.getFocusWidth( c );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import javax.swing.UIManager;
|
|||||||
/**
|
/**
|
||||||
* Border for {@link javax.swing.JToolBar}.
|
* Border for {@link javax.swing.JToolBar}.
|
||||||
*
|
*
|
||||||
|
* @uiDefault ToolBar.borderMargins Insets
|
||||||
* @uiDefault ToolBar.gripColor Color
|
* @uiDefault ToolBar.gripColor Color
|
||||||
*
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
@@ -42,6 +43,10 @@ public class FlatToolBarBorder
|
|||||||
|
|
||||||
protected final Color gripColor = UIManager.getColor( "ToolBar.gripColor" );
|
protected final Color gripColor = UIManager.getColor( "ToolBar.gripColor" );
|
||||||
|
|
||||||
|
public FlatToolBarBorder() {
|
||||||
|
super( UIManager.getInsets( "ToolBar.borderMargins" ) );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||||
// paint grip
|
// paint grip
|
||||||
|
|||||||
@@ -16,18 +16,14 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.event.ContainerEvent;
|
import java.awt.event.ContainerEvent;
|
||||||
import java.awt.event.ContainerListener;
|
import java.awt.event.ContainerListener;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.UIManager;
|
|
||||||
import javax.swing.border.Border;
|
import javax.swing.border.Border;
|
||||||
import javax.swing.border.EmptyBorder;
|
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.UIResource;
|
|
||||||
import javax.swing.plaf.basic.BasicToolBarUI;
|
import javax.swing.plaf.basic.BasicToolBarUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,28 +41,15 @@ import javax.swing.plaf.basic.BasicToolBarUI;
|
|||||||
* @uiDefault ToolBar.floatingForeground Color
|
* @uiDefault ToolBar.floatingForeground Color
|
||||||
* @uiDefault ToolBar.isRollover boolean
|
* @uiDefault ToolBar.isRollover boolean
|
||||||
*
|
*
|
||||||
* <!-- FlatToolBarUI -->
|
|
||||||
*
|
|
||||||
* @uiDefault ToolBar.buttonMargins Insets
|
|
||||||
*
|
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatToolBarUI
|
public class FlatToolBarUI
|
||||||
extends BasicToolBarUI
|
extends BasicToolBarUI
|
||||||
{
|
{
|
||||||
private Border rolloverBorder;
|
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatToolBarUI();
|
return new FlatToolBarUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void uninstallUI( JComponent c ) {
|
|
||||||
super.uninstallUI( c );
|
|
||||||
|
|
||||||
rolloverBorder = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ContainerListener createToolBarContListener() {
|
protected ContainerListener createToolBarContListener() {
|
||||||
return new ToolBarContListener() {
|
return new ToolBarContListener() {
|
||||||
@@ -90,26 +73,15 @@ public class FlatToolBarUI
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// disable rollover border
|
||||||
protected Border createRolloverBorder() {
|
@Override protected void setBorderToRollover( Component c ) {}
|
||||||
return getRolloverBorder();
|
@Override protected void setBorderToNonRollover( Component c ) {}
|
||||||
}
|
@Override protected void setBorderToNormal( Component c ) {}
|
||||||
|
@Override protected void installRolloverBorders( JComponent c ) {}
|
||||||
@Override
|
@Override protected void installNonRolloverBorders( JComponent c ) {}
|
||||||
protected Border createNonRolloverBorder() {
|
@Override protected void installNormalBorders( JComponent c ) {}
|
||||||
return getRolloverBorder();
|
@Override protected Border createRolloverBorder() { return null; }
|
||||||
}
|
@Override protected Border createNonRolloverBorder() { return null; }
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Border getNonRolloverBorder( AbstractButton b ) {
|
|
||||||
return getRolloverBorder();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Border getRolloverBorder() {
|
|
||||||
if( rolloverBorder == null )
|
|
||||||
rolloverBorder = new FlatRolloverMarginBorder();
|
|
||||||
return rolloverBorder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setOrientation( int orientation ) {
|
public void setOrientation( int orientation ) {
|
||||||
@@ -123,46 +95,4 @@ public class FlatToolBarUI
|
|||||||
|
|
||||||
super.setOrientation( orientation );
|
super.setOrientation( orientation );
|
||||||
}
|
}
|
||||||
|
|
||||||
//---- class FlatRolloverMarginBorder -------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Uses button margin only if explicitly set.
|
|
||||||
* Otherwise uses insets specified in constructor.
|
|
||||||
*/
|
|
||||||
private static class FlatRolloverMarginBorder
|
|
||||||
extends EmptyBorder
|
|
||||||
{
|
|
||||||
public FlatRolloverMarginBorder() {
|
|
||||||
super( UIManager.getInsets( "ToolBar.buttonMargins" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Insets getBorderInsets( Component c, Insets insets ) {
|
|
||||||
Insets margin = (c instanceof AbstractButton)
|
|
||||||
? ((AbstractButton) c).getMargin()
|
|
||||||
: null;
|
|
||||||
|
|
||||||
if( margin == null || margin instanceof UIResource ) {
|
|
||||||
insets.top = top;
|
|
||||||
insets.left = left;
|
|
||||||
insets.bottom = bottom;
|
|
||||||
insets.right = right;
|
|
||||||
} else {
|
|
||||||
// margin explicitly set
|
|
||||||
insets.top = margin.top;
|
|
||||||
insets.left = margin.left;
|
|
||||||
insets.bottom = margin.bottom;
|
|
||||||
insets.right = margin.right;
|
|
||||||
}
|
|
||||||
|
|
||||||
// scale
|
|
||||||
insets.top = scale( insets.top );
|
|
||||||
insets.left = scale( insets.left );
|
|
||||||
insets.bottom = scale( insets.bottom );
|
|
||||||
insets.right = scale( insets.right );
|
|
||||||
|
|
||||||
return insets;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import java.awt.Color;
|
|||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Container;
|
import java.awt.Container;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
@@ -37,7 +38,7 @@ import java.util.function.Consumer;
|
|||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
import com.formdev.flatlaf.FlatClientProperties;
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
import com.formdev.flatlaf.util.DerivedColor;
|
import com.formdev.flatlaf.util.DerivedColor;
|
||||||
import com.formdev.flatlaf.util.HiDPIUtils;
|
import com.formdev.flatlaf.util.HiDPIUtils;
|
||||||
@@ -83,6 +84,13 @@ public class FlatUIUtils
|
|||||||
insets1.right + insets2.right );
|
insets1.right + insets2.right );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setInsets( Insets dest, Insets src ) {
|
||||||
|
dest.top = src.top;
|
||||||
|
dest.left = src.left;
|
||||||
|
dest.bottom = src.bottom;
|
||||||
|
dest.right = src.right;
|
||||||
|
}
|
||||||
|
|
||||||
public static Color getUIColor( String key, int defaultColorRGB ) {
|
public static Color getUIColor( String key, int defaultColorRGB ) {
|
||||||
Color color = UIManager.getColor( key );
|
Color color = UIManager.getColor( key );
|
||||||
return (color != null) ? color : new Color( defaultColorRGB );
|
return (color != null) ? color : new Color( defaultColorRGB );
|
||||||
@@ -109,12 +117,19 @@ public class FlatUIUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Color nonUIResource( Color c ) {
|
public static Color nonUIResource( Color c ) {
|
||||||
return (c instanceof ColorUIResource) ? new Color( c.getRGB(), true ) : c;
|
return (c instanceof UIResource) ? new Color( c.getRGB(), true ) : c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Font nonUIResource( Font font ) {
|
||||||
|
return (font instanceof UIResource) ? font.deriveFont( font.getStyle() ) : font;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int minimumWidth( JComponent c, int minimumWidth ) {
|
public static int minimumWidth( JComponent c, int minimumWidth ) {
|
||||||
Object p = c.getClientProperty( FlatClientProperties.MINIMUM_WIDTH );
|
return FlatClientProperties.clientPropertyInt( c, FlatClientProperties.MINIMUM_WIDTH, minimumWidth );
|
||||||
return (p instanceof Integer) ? ((Integer)p).intValue() : minimumWidth;
|
}
|
||||||
|
|
||||||
|
public static int minimumHeight( JComponent c, int minimumHeight ) {
|
||||||
|
return FlatClientProperties.clientPropertyInt( c, FlatClientProperties.MINIMUM_HEIGHT, minimumHeight );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTableCellEditor( Component c ) {
|
public static boolean isTableCellEditor( Component c ) {
|
||||||
@@ -152,7 +167,7 @@ public class FlatUIUtils
|
|||||||
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
||||||
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
||||||
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
||||||
HiDPIUtils.paintAtScale1x( g, x, y, width, height, systemScaleFactor,
|
HiDPIUtils.paintAtScale1x( g, x, y, width, height,
|
||||||
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
||||||
paintComponentOuterBorderImpl( g2d, x2, y2, width2, height2,
|
paintComponentOuterBorderImpl( g2d, x2, y2, width2, height2,
|
||||||
(float) (focusWidth * scaleFactor), (float) (lineWidth * scaleFactor), (float) (arc * scaleFactor) );
|
(float) (focusWidth * scaleFactor), (float) (lineWidth * scaleFactor), (float) (arc * scaleFactor) );
|
||||||
@@ -166,13 +181,22 @@ public class FlatUIUtils
|
|||||||
private static void paintComponentOuterBorderImpl( Graphics2D g, int x, int y, int width, int height,
|
private static void paintComponentOuterBorderImpl( Graphics2D g, int x, int y, int width, int height,
|
||||||
float focusWidth, float lineWidth, float arc )
|
float focusWidth, float lineWidth, float arc )
|
||||||
{
|
{
|
||||||
float outerRadius = (arc > 0) ? arc + focusWidth - UIScale.scale( 2f ) : focusWidth;
|
|
||||||
float ow = focusWidth + lineWidth;
|
float ow = focusWidth + lineWidth;
|
||||||
float innerRadius = outerRadius - ow;
|
float outerArc = arc + (focusWidth * 2);
|
||||||
|
float innerArc = arc - (lineWidth * 2);
|
||||||
|
|
||||||
|
// reduce outer arc slightly for small arcs to make the curve slightly wider
|
||||||
|
if( arc > 0 && arc < UIScale.scale( 10 ) )
|
||||||
|
outerArc -= UIScale.scale( 2f );
|
||||||
|
|
||||||
|
if( outerArc < 0 )
|
||||||
|
outerArc = 0;
|
||||||
|
if( innerArc < 0 )
|
||||||
|
innerArc = 0;
|
||||||
|
|
||||||
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
|
||||||
path.append( createRoundRectanglePath( x, y, width, height, outerRadius, outerRadius, outerRadius, outerRadius ), false );
|
path.append( new RoundRectangle2D.Float( x, y, width, height, outerArc, outerArc ), false );
|
||||||
path.append( createRoundRectanglePath( x + ow, y + ow, width - (ow * 2), height - (ow * 2), innerRadius, innerRadius, innerRadius, innerRadius ), false );
|
path.append( new RoundRectangle2D.Float( x + ow, y + ow, width - (ow * 2), height - (ow * 2), innerArc, innerArc ), false );
|
||||||
g.fill( path );
|
g.fill( path );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +216,7 @@ public class FlatUIUtils
|
|||||||
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
||||||
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
||||||
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
||||||
HiDPIUtils.paintAtScale1x( g, x, y, width, height, systemScaleFactor,
|
HiDPIUtils.paintAtScale1x( g, x, y, width, height,
|
||||||
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
||||||
paintComponentBorderImpl( g2d, x2, y2, width2, height2,
|
paintComponentBorderImpl( g2d, x2, y2, width2, height2,
|
||||||
(float) (focusWidth * scaleFactor), (float) (lineWidth * scaleFactor), (float) (arc * scaleFactor) );
|
(float) (focusWidth * scaleFactor), (float) (lineWidth * scaleFactor), (float) (arc * scaleFactor) );
|
||||||
@@ -206,7 +230,12 @@ public class FlatUIUtils
|
|||||||
private static void paintComponentBorderImpl( Graphics2D g, int x, int y, int width, int height,
|
private static void paintComponentBorderImpl( Graphics2D g, int x, int y, int width, int height,
|
||||||
float focusWidth, float lineWidth, float arc )
|
float focusWidth, float lineWidth, float arc )
|
||||||
{
|
{
|
||||||
float arc2 = arc > lineWidth ? arc - lineWidth : 0f;
|
float arc2 = arc - (lineWidth * 2);
|
||||||
|
|
||||||
|
if( arc < 0 )
|
||||||
|
arc = 0;
|
||||||
|
if( arc2 < 0 )
|
||||||
|
arc2 = 0;
|
||||||
|
|
||||||
RoundRectangle2D.Float r1 = new RoundRectangle2D.Float(
|
RoundRectangle2D.Float r1 = new RoundRectangle2D.Float(
|
||||||
x + focusWidth, y + focusWidth,
|
x + focusWidth, y + focusWidth,
|
||||||
@@ -237,7 +266,7 @@ public class FlatUIUtils
|
|||||||
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
double systemScaleFactor = UIScale.getSystemScaleFactor( g );
|
||||||
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
if( systemScaleFactor != 1 && systemScaleFactor != 2 ) {
|
||||||
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
// paint at scale 1x to avoid clipping on right and bottom edges at 125%, 150% or 175%
|
||||||
HiDPIUtils.paintAtScale1x( g, x, y, width, height, systemScaleFactor,
|
HiDPIUtils.paintAtScale1x( g, x, y, width, height,
|
||||||
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
(g2d, x2, y2, width2, height2, scaleFactor) -> {
|
||||||
paintComponentBackgroundImpl( g2d, x2, y2, width2, height2,
|
paintComponentBackgroundImpl( g2d, x2, y2, width2, height2,
|
||||||
(float) (focusWidth * scaleFactor), (float) (arc * scaleFactor) );
|
(float) (focusWidth * scaleFactor), (float) (arc * scaleFactor) );
|
||||||
@@ -251,6 +280,9 @@ public class FlatUIUtils
|
|||||||
private static void paintComponentBackgroundImpl( Graphics2D g, int x, int y, int width, int height,
|
private static void paintComponentBackgroundImpl( Graphics2D g, int x, int y, int width, int height,
|
||||||
float focusWidth, float arc )
|
float focusWidth, float arc )
|
||||||
{
|
{
|
||||||
|
if( arc < 0 )
|
||||||
|
arc = 0;
|
||||||
|
|
||||||
g.fill( new RoundRectangle2D.Float(
|
g.fill( new RoundRectangle2D.Float(
|
||||||
x + focusWidth, y + focusWidth,
|
x + focusWidth, y + focusWidth,
|
||||||
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
|
width - focusWidth * 2, height - focusWidth * 2, arc, arc ) );
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ public class HiDPIUtils
|
|||||||
paintAtScale1x( g, 0, 0, c.getWidth(), c.getHeight(), painter );
|
paintAtScale1x( g, 0, 0, c.getWidth(), c.getHeight(), painter );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void paintAtScale1x( Graphics2D g, int x, int y, int width, int height, Painter painter ) {
|
|
||||||
paintAtScale1x( g, x, y, width, height, UIScale.getSystemScaleFactor( g ), painter );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paint at system scale factor 1x to avoid rounding issues at 125%, 150% and 175% scaling.
|
* Paint at system scale factor 1x to avoid rounding issues at 125%, 150% and 175% scaling.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -46,38 +42,29 @@ public class HiDPIUtils
|
|||||||
* <p>
|
* <p>
|
||||||
* Uses the same scaling calculation as the JRE uses.
|
* Uses the same scaling calculation as the JRE uses.
|
||||||
*/
|
*/
|
||||||
public static void paintAtScale1x( Graphics2D g, int x, int y, int width, int height,
|
public static void paintAtScale1x( Graphics2D g, int x, int y, int width, int height, Painter painter ) {
|
||||||
double scaleFactor, Painter painter )
|
// save original transform
|
||||||
{
|
AffineTransform transform = g.getTransform();
|
||||||
if( scaleFactor == 1 ) {
|
|
||||||
|
// check whether scaled
|
||||||
|
if( transform.getScaleX() == 1 && transform.getScaleY() == 1 ) {
|
||||||
painter.paint( g, x, y, width, height, 1 );
|
painter.paint( g, x, y, width, height, 1 );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// save original transform
|
|
||||||
AffineTransform transform = g.getTransform();
|
|
||||||
|
|
||||||
// scale rectangle
|
// scale rectangle
|
||||||
Rectangle2D.Double scaledRect = scale( transform, x, y, width, height );
|
Rectangle2D.Double scaledRect = scale( transform, x, y, width, height );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// unscale to factor 1.0
|
// unscale to factor 1.0 and move origin (to whole numbers)
|
||||||
double scale = 1.0 / scaleFactor;
|
g.setTransform( new AffineTransform( 1, 0, 0, 1,
|
||||||
g.scale( scale, scale );
|
Math.floor( scaledRect.x ), Math.floor( scaledRect.y ) ) );
|
||||||
|
|
||||||
// compute origin delta x/y
|
|
||||||
double dx = Math.floor( scaledRect.x ) - transform.getTranslateX();
|
|
||||||
double dy = Math.floor( scaledRect.y ) - transform.getTranslateY();
|
|
||||||
|
|
||||||
// move origin to make sure that origin x/y are at whole numbers
|
|
||||||
if( dx != 0 || dy != 0 )
|
|
||||||
g.translate( dx, dy );
|
|
||||||
|
|
||||||
int swidth = (int) scaledRect.width;
|
int swidth = (int) scaledRect.width;
|
||||||
int sheight = (int) scaledRect.height;
|
int sheight = (int) scaledRect.height;
|
||||||
|
|
||||||
// paint
|
// paint
|
||||||
painter.paint( g, 0, 0, swidth, sheight, scaleFactor );
|
painter.paint( g, 0, 0, swidth, sheight, transform.getScaleX() );
|
||||||
} finally {
|
} finally {
|
||||||
// restore original transform
|
// restore original transform
|
||||||
g.setTransform( transform );
|
g.setTransform( transform );
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class UIScale
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static double getSystemScaleFactor( GraphicsConfiguration gc ) {
|
public static double getSystemScaleFactor( GraphicsConfiguration gc ) {
|
||||||
return isSystemScalingEnabled() ? gc.getDefaultTransform().getScaleX() : 1;
|
return (isSystemScalingEnabled() && gc != null) ? gc.getDefaultTransform().getScaleX() : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---- user scaling (Java 8) ----------------------------------------------
|
//---- user scaling (Java 8) ----------------------------------------------
|
||||||
@@ -156,6 +156,9 @@ public class UIScale
|
|||||||
// Tahoma 11 is used at 100%
|
// Tahoma 11 is used at 100%
|
||||||
if( "Tahoma".equals( font.getFamily() ) )
|
if( "Tahoma".equals( font.getFamily() ) )
|
||||||
fontSizeDivider = 11f;
|
fontSizeDivider = 11f;
|
||||||
|
} else if( SystemInfo.IS_MAC ) {
|
||||||
|
// default font size on macOS is 13
|
||||||
|
fontSizeDivider = 13f;
|
||||||
} else if( SystemInfo.IS_LINUX ) {
|
} else if( SystemInfo.IS_LINUX ) {
|
||||||
// default font size for Unity and Gnome is 15 and for KDE it is 13
|
// default font size for Unity and Gnome is 15 and for KDE it is 13
|
||||||
fontSizeDivider = SystemInfo.IS_KDE ? 13f : 15f;
|
fontSizeDivider = SystemInfo.IS_KDE ? 13f : 15f;
|
||||||
@@ -194,7 +197,7 @@ public class UIScale
|
|||||||
return font;
|
return font;
|
||||||
|
|
||||||
int newFontSize = Math.round( (font.getSize() / fontScaleFactor) * scaleFactor );
|
int newFontSize = Math.round( (font.getSize() / fontScaleFactor) * scaleFactor );
|
||||||
return new FontUIResource( font.getFamily(), font.getStyle(), newFontSize );
|
return new FontUIResource( font.deriveFont( (float) newFontSize ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -202,7 +205,7 @@ public class UIScale
|
|||||||
*/
|
*/
|
||||||
public static FontUIResource scaleFont( FontUIResource font, float scaleFactor ) {
|
public static FontUIResource scaleFont( FontUIResource font, float scaleFactor ) {
|
||||||
int newFontSize = Math.round( font.getSize() * scaleFactor );
|
int newFontSize = Math.round( font.getSize() * scaleFactor );
|
||||||
return new FontUIResource( font.getFamily(), font.getStyle(), newFontSize );
|
return new FontUIResource( font.deriveFont( (float) newFontSize ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
@selectionInactiveForeground=@foreground
|
@selectionInactiveForeground=@foreground
|
||||||
@disabledText=#777777
|
@disabledText=#777777
|
||||||
@textComponentBackground=#45494A
|
@textComponentBackground=#45494A
|
||||||
|
@menuBackground=darken(@background,5%)
|
||||||
@cellFocusColor=#000000
|
@cellFocusColor=#000000
|
||||||
@icon=#adadad
|
@icon=#adadad
|
||||||
|
|
||||||
@@ -130,6 +131,34 @@ Component.focusColor=#3d6185
|
|||||||
Component.linkColor=#589df6
|
Component.linkColor=#589df6
|
||||||
|
|
||||||
|
|
||||||
|
#---- Desktop ----
|
||||||
|
|
||||||
|
Desktop.background=#3E434C
|
||||||
|
|
||||||
|
|
||||||
|
#---- DesktopIcon ----
|
||||||
|
|
||||||
|
DesktopIcon.background=lighten($Desktop.background,10%)
|
||||||
|
|
||||||
|
|
||||||
|
#---- InternalFrame ----
|
||||||
|
|
||||||
|
InternalFrame.activeTitleBackground=darken(@background,10%)
|
||||||
|
InternalFrame.activeTitleForeground=@foreground
|
||||||
|
InternalFrame.inactiveTitleBackground=darken(@background,5%)
|
||||||
|
InternalFrame.inactiveTitleForeground=@disabledText
|
||||||
|
|
||||||
|
InternalFrame.activeBorderColor=lighten($Component.borderColor,10%)
|
||||||
|
InternalFrame.inactiveBorderColor=$Component.borderColor
|
||||||
|
|
||||||
|
InternalFrame.buttonHoverBackground=lighten(10%,autoInverse)
|
||||||
|
InternalFrame.buttonPressedBackground=lighten(20%,autoInverse)
|
||||||
|
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
||||||
|
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
||||||
|
InternalFrame.closeHoverForeground=#fff
|
||||||
|
InternalFrame.closePressedForeground=#fff
|
||||||
|
|
||||||
|
|
||||||
#---- List ----
|
#---- List ----
|
||||||
|
|
||||||
List.background=@textComponentBackground
|
List.background=@textComponentBackground
|
||||||
@@ -144,6 +173,7 @@ Menu.icon.disabledArrowColor=#606060
|
|||||||
#---- MenuBar ----
|
#---- MenuBar ----
|
||||||
|
|
||||||
MenuBar.borderColor=#515151
|
MenuBar.borderColor=#515151
|
||||||
|
MenuBar.hoverBackground=lighten($MenuBar.background,10%)
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItemCheckBox ----
|
#---- MenuItemCheckBox ----
|
||||||
@@ -152,9 +182,14 @@ MenuItemCheckBox.icon.checkmarkColor=#A7A7A7
|
|||||||
MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
|
MenuItemCheckBox.icon.disabledCheckmarkColor=#606060
|
||||||
|
|
||||||
|
|
||||||
|
#---- PasswordField ----
|
||||||
|
|
||||||
|
PasswordField.capsLockIconColor=#ffffff64
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|
||||||
PopupMenu.borderColor=#515151
|
PopupMenu.borderColor=#5e5e5e
|
||||||
|
|
||||||
|
|
||||||
#---- ProgressBar ----
|
#---- ProgressBar ----
|
||||||
@@ -168,9 +203,9 @@ ProgressBar.selectionBackground=@foreground
|
|||||||
#---- ScrollBar ----
|
#---- ScrollBar ----
|
||||||
|
|
||||||
ScrollBar.track=#3F4244
|
ScrollBar.track=#3F4244
|
||||||
ScrollBar.thumb=#5B5E5F
|
ScrollBar.thumb=lighten($ScrollBar.track,10%)
|
||||||
ScrollBar.hoverTrackColor=#434647
|
ScrollBar.hoverTrackColor=lighten($ScrollBar.track,4%)
|
||||||
ScrollBar.hoverThumbColor=#666868
|
ScrollBar.hoverThumbColor=lighten($ScrollBar.thumb,10%)
|
||||||
|
|
||||||
|
|
||||||
#---- Separator ----
|
#---- Separator ----
|
||||||
@@ -206,14 +241,14 @@ TabbedPane.contentAreaColor=#323232
|
|||||||
#---- Table ----
|
#---- Table ----
|
||||||
|
|
||||||
Table.background=@textComponentBackground
|
Table.background=@textComponentBackground
|
||||||
Table.gridColor=#4F5152
|
Table.gridColor=lighten($Table.background,3%)
|
||||||
|
|
||||||
|
|
||||||
#---- TableHeader ----
|
#---- TableHeader ----
|
||||||
|
|
||||||
TableHeader.background=#45494A
|
TableHeader.background=@textComponentBackground
|
||||||
TableHeader.separatorColor=#585858
|
TableHeader.separatorColor=lighten($TableHeader.background,10%)
|
||||||
TableHeader.bottomSeparatorColor=#585858
|
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
|
||||||
|
|
||||||
|
|
||||||
#---- ToggleButton ----
|
#---- ToggleButton ----
|
||||||
|
|||||||
@@ -21,21 +21,26 @@ CheckBoxUI=com.formdev.flatlaf.ui.FlatCheckBoxUI
|
|||||||
CheckBoxMenuItemUI=com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI
|
CheckBoxMenuItemUI=com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI
|
||||||
ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI
|
ColorChooserUI=com.formdev.flatlaf.ui.FlatColorChooserUI
|
||||||
ComboBoxUI=com.formdev.flatlaf.ui.FlatComboBoxUI
|
ComboBoxUI=com.formdev.flatlaf.ui.FlatComboBoxUI
|
||||||
|
DesktopIconUI=com.formdev.flatlaf.ui.FlatDesktopIconUI
|
||||||
|
DesktopPaneUI=com.formdev.flatlaf.ui.FlatDesktopPaneUI
|
||||||
EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI
|
EditorPaneUI=com.formdev.flatlaf.ui.FlatEditorPaneUI
|
||||||
FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI
|
FileChooserUI=com.formdev.flatlaf.ui.FlatFileChooserUI
|
||||||
FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI
|
FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI
|
||||||
|
InternalFrameUI=com.formdev.flatlaf.ui.FlatInternalFrameUI
|
||||||
LabelUI=com.formdev.flatlaf.ui.FlatLabelUI
|
LabelUI=com.formdev.flatlaf.ui.FlatLabelUI
|
||||||
ListUI=com.formdev.flatlaf.ui.FlatListUI
|
ListUI=com.formdev.flatlaf.ui.FlatListUI
|
||||||
MenuUI=com.formdev.flatlaf.ui.FlatMenuUI
|
MenuUI=com.formdev.flatlaf.ui.FlatMenuUI
|
||||||
MenuBarUI=com.formdev.flatlaf.ui.FlatMenuBarUI
|
MenuBarUI=com.formdev.flatlaf.ui.FlatMenuBarUI
|
||||||
MenuItemUI=com.formdev.flatlaf.ui.FlatMenuItemUI
|
MenuItemUI=com.formdev.flatlaf.ui.FlatMenuItemUI
|
||||||
OptionPaneUI=com.formdev.flatlaf.ui.FlatOptionPaneUI
|
OptionPaneUI=com.formdev.flatlaf.ui.FlatOptionPaneUI
|
||||||
|
PanelUI=com.formdev.flatlaf.ui.FlatPanelUI
|
||||||
PasswordFieldUI=com.formdev.flatlaf.ui.FlatPasswordFieldUI
|
PasswordFieldUI=com.formdev.flatlaf.ui.FlatPasswordFieldUI
|
||||||
PopupMenuUI=com.formdev.flatlaf.ui.FlatPopupMenuUI
|
PopupMenuUI=com.formdev.flatlaf.ui.FlatPopupMenuUI
|
||||||
PopupMenuSeparatorUI=com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI
|
PopupMenuSeparatorUI=com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI
|
||||||
ProgressBarUI=com.formdev.flatlaf.ui.FlatProgressBarUI
|
ProgressBarUI=com.formdev.flatlaf.ui.FlatProgressBarUI
|
||||||
RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI
|
RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI
|
||||||
RadioButtonMenuItemUI=com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI
|
RadioButtonMenuItemUI=com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI
|
||||||
|
RootPaneUI=com.formdev.flatlaf.ui.FlatRootPaneUI
|
||||||
ScrollBarUI=com.formdev.flatlaf.ui.FlatScrollBarUI
|
ScrollBarUI=com.formdev.flatlaf.ui.FlatScrollBarUI
|
||||||
ScrollPaneUI=com.formdev.flatlaf.ui.FlatScrollPaneUI
|
ScrollPaneUI=com.formdev.flatlaf.ui.FlatScrollPaneUI
|
||||||
SeparatorUI=com.formdev.flatlaf.ui.FlatSeparatorUI
|
SeparatorUI=com.formdev.flatlaf.ui.FlatSeparatorUI
|
||||||
@@ -59,6 +64,7 @@ ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI
|
|||||||
#---- variables ----
|
#---- variables ----
|
||||||
|
|
||||||
@textComponentMargin=2,6,2,6
|
@textComponentMargin=2,6,2,6
|
||||||
|
@menuItemMargin=2,8,2,8
|
||||||
|
|
||||||
|
|
||||||
#---- system colors ----
|
#---- system colors ----
|
||||||
@@ -86,6 +92,38 @@ info=$ToolTip.background
|
|||||||
infoText=@foreground
|
infoText=@foreground
|
||||||
|
|
||||||
|
|
||||||
|
#---- unused colors ----
|
||||||
|
|
||||||
|
# Colors that are defined in BasicLookAndFeel but are not used in FlatLaf.
|
||||||
|
# Keep them for compatibility (if used in 3rd party app) and give them useful values.
|
||||||
|
|
||||||
|
*.shadow=$controlShadow
|
||||||
|
*.darkShadow=$controlDkShadow
|
||||||
|
*.light=$controlHighlight
|
||||||
|
*.highlight=$controlLtHighlight
|
||||||
|
|
||||||
|
ComboBox.buttonShadow=$controlShadow
|
||||||
|
ComboBox.buttonDarkShadow=$controlDkShadow
|
||||||
|
ComboBox.buttonHighlight=$controlLtHighlight
|
||||||
|
|
||||||
|
InternalFrame.borderColor=$control
|
||||||
|
InternalFrame.borderShadow=$controlShadow
|
||||||
|
InternalFrame.borderDarkShadow=$controlDkShadow
|
||||||
|
InternalFrame.borderHighlight=$controlLtHighlight
|
||||||
|
InternalFrame.borderLight=$controlHighlight
|
||||||
|
|
||||||
|
Label.disabledShadow=$controlShadow
|
||||||
|
|
||||||
|
ScrollBar.trackHighlight=$controlDkShadow
|
||||||
|
ScrollBar.thumbHighlight=$controlLtHighlight
|
||||||
|
ScrollBar.thumbDarkShadow=$controlDkShadow
|
||||||
|
ScrollBar.thumbShadow=$controlShadow
|
||||||
|
|
||||||
|
Slider.focus=$controlDkShadow
|
||||||
|
|
||||||
|
TabbedPane.focus=$controlText
|
||||||
|
|
||||||
|
|
||||||
#---- Button ----
|
#---- Button ----
|
||||||
|
|
||||||
Button.border=com.formdev.flatlaf.ui.FlatButtonBorder
|
Button.border=com.formdev.flatlaf.ui.FlatButtonBorder
|
||||||
@@ -99,6 +137,9 @@ Button.defaultButtonFollowsFocus=false
|
|||||||
|
|
||||||
Button.default.borderWidth=1
|
Button.default.borderWidth=1
|
||||||
|
|
||||||
|
Button.toolbar.margin=3,3,3,3
|
||||||
|
Button.toolbar.spacingInsets=1,2,1,2
|
||||||
|
|
||||||
|
|
||||||
#---- Caret ----
|
#---- Caret ----
|
||||||
|
|
||||||
@@ -117,22 +158,27 @@ CheckBox.rollover=true
|
|||||||
|
|
||||||
#---- CheckBoxMenuItem ----
|
#---- CheckBoxMenuItem ----
|
||||||
|
|
||||||
CheckBoxMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
CheckBoxMenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
|
||||||
CheckBoxMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon
|
CheckBoxMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon
|
||||||
CheckBoxMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
CheckBoxMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
||||||
CheckBoxMenuItem.margin=2,2,2,2
|
CheckBoxMenuItem.margin=@menuItemMargin
|
||||||
|
CheckBoxMenuItem.opaque=false
|
||||||
|
CheckBoxMenuItem.borderPainted=true
|
||||||
|
CheckBoxMenuItem.background=@menuBackground
|
||||||
|
|
||||||
|
|
||||||
#---- ColorChooser ----
|
#---- ColorChooser ----
|
||||||
|
|
||||||
ColorChooser.swatchesSwatchSize=16,16
|
ColorChooser.swatchesSwatchSize={scaledDimension}16,16
|
||||||
ColorChooser.swatchesRecentSwatchSize=16,16
|
ColorChooser.swatchesRecentSwatchSize={scaledDimension}16,16
|
||||||
|
ColorChooser.swatchesDefaultRecentColor=$control
|
||||||
|
|
||||||
|
|
||||||
#---- ComboBox ----
|
#---- ComboBox ----
|
||||||
|
|
||||||
ComboBox.border=com.formdev.flatlaf.ui.FlatRoundBorder
|
ComboBox.border=com.formdev.flatlaf.ui.FlatRoundBorder
|
||||||
ComboBox.padding=2,6,2,6
|
ComboBox.padding=2,6,2,6
|
||||||
|
[mac]ComboBox.showPopupOnNavigation=true
|
||||||
|
|
||||||
|
|
||||||
#---- Component ----
|
#---- Component ----
|
||||||
@@ -145,6 +191,14 @@ Component.arrowType=chevron
|
|||||||
Component.hideMnemonics=true
|
Component.hideMnemonics=true
|
||||||
|
|
||||||
|
|
||||||
|
#---- DesktopIcon ----
|
||||||
|
|
||||||
|
DesktopIcon.border=4,4,4,4
|
||||||
|
DesktopIcon.iconSize=64,64
|
||||||
|
DesktopIcon.closeSize=20,20
|
||||||
|
DesktopIcon.closeIcon=com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
|
||||||
|
|
||||||
|
|
||||||
#---- EditorPane ----
|
#---- EditorPane ----
|
||||||
|
|
||||||
EditorPane.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
EditorPane.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
||||||
@@ -159,6 +213,7 @@ FileChooser.upFolderIcon=com.formdev.flatlaf.icons.FlatFileChooserUpFolderIcon
|
|||||||
FileChooser.homeFolderIcon=com.formdev.flatlaf.icons.FlatFileChooserHomeFolderIcon
|
FileChooser.homeFolderIcon=com.formdev.flatlaf.icons.FlatFileChooserHomeFolderIcon
|
||||||
FileChooser.detailsViewIcon=com.formdev.flatlaf.icons.FlatFileChooserDetailsViewIcon
|
FileChooser.detailsViewIcon=com.formdev.flatlaf.icons.FlatFileChooserDetailsViewIcon
|
||||||
FileChooser.listViewIcon=com.formdev.flatlaf.icons.FlatFileChooserListViewIcon
|
FileChooser.listViewIcon=com.formdev.flatlaf.icons.FlatFileChooserListViewIcon
|
||||||
|
FileChooser.usesSingleFilePane=true
|
||||||
|
|
||||||
|
|
||||||
#---- FileView ----
|
#---- FileView ----
|
||||||
@@ -172,7 +227,7 @@ FileView.floppyDriveIcon=com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon
|
|||||||
|
|
||||||
#---- FormattedTextField ----
|
#---- FormattedTextField ----
|
||||||
|
|
||||||
FormattedTextField.border=com.formdev.flatlaf.ui.FlatBorder
|
FormattedTextField.border=com.formdev.flatlaf.ui.FlatTextBorder
|
||||||
FormattedTextField.margin=@textComponentMargin
|
FormattedTextField.margin=@textComponentMargin
|
||||||
FormattedTextField.background=@textComponentBackground
|
FormattedTextField.background=@textComponentBackground
|
||||||
FormattedTextField.placeholderForeground=@disabledText
|
FormattedTextField.placeholderForeground=@disabledText
|
||||||
@@ -194,6 +249,24 @@ HelpButton.questionMarkColor=$CheckBox.icon.checkmarkColor
|
|||||||
HelpButton.disabledQuestionMarkColor=$CheckBox.icon.disabledCheckmarkColor
|
HelpButton.disabledQuestionMarkColor=$CheckBox.icon.disabledCheckmarkColor
|
||||||
|
|
||||||
|
|
||||||
|
#---- InternalFrame ----
|
||||||
|
|
||||||
|
InternalFrame.border=com.formdev.flatlaf.ui.FlatInternalFrameUI$FlatInternalFrameBorder
|
||||||
|
InternalFrame.borderLineWidth=1
|
||||||
|
InternalFrame.borderMargins=6,6,6,6
|
||||||
|
InternalFrame.buttonSize=24,24
|
||||||
|
InternalFrame.closeIcon=com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
|
||||||
|
InternalFrame.iconifyIcon=com.formdev.flatlaf.icons.FlatInternalFrameIconifyIcon
|
||||||
|
InternalFrame.maximizeIcon=com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon
|
||||||
|
InternalFrame.minimizeIcon=com.formdev.flatlaf.icons.FlatInternalFrameMinimizeIcon
|
||||||
|
InternalFrame.windowBindings=null
|
||||||
|
|
||||||
|
|
||||||
|
#---- InternalFrameTitlePane ----
|
||||||
|
|
||||||
|
InternalFrameTitlePane.border=0,8,0,0
|
||||||
|
|
||||||
|
|
||||||
#---- List ----
|
#---- List ----
|
||||||
|
|
||||||
List.border=1,0,1,0
|
List.border=1,0,1,0
|
||||||
@@ -212,21 +285,35 @@ List.dropLineColor=@dropLineColor
|
|||||||
|
|
||||||
#---- Menu ----
|
#---- Menu ----
|
||||||
|
|
||||||
Menu.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
Menu.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
|
||||||
Menu.arrowIcon=com.formdev.flatlaf.icons.FlatMenuArrowIcon
|
Menu.arrowIcon=com.formdev.flatlaf.icons.FlatMenuArrowIcon
|
||||||
Menu.margin=2,2,2,2
|
Menu.checkIcon=null
|
||||||
|
Menu.margin=@menuItemMargin
|
||||||
|
Menu.submenuPopupOffsetX={scaledInteger}-4
|
||||||
|
Menu.submenuPopupOffsetY={scaledInteger}-4
|
||||||
|
Menu.opaque=false
|
||||||
|
Menu.borderPainted=true
|
||||||
|
Menu.background=@menuBackground
|
||||||
|
|
||||||
|
|
||||||
#---- MenuBar ----
|
#---- MenuBar ----
|
||||||
|
|
||||||
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
|
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
|
||||||
|
MenuBar.background=@menuBackground
|
||||||
|
MenuBar.itemMargins=3,3,3,3
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItem ----
|
#---- MenuItem ----
|
||||||
|
|
||||||
MenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
MenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
|
||||||
MenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
MenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
||||||
MenuItem.margin=2,2,2,2
|
MenuItem.checkIcon=null
|
||||||
|
MenuItem.margin=@menuItemMargin
|
||||||
|
MenuItem.opaque=false
|
||||||
|
MenuItem.borderPainted=true
|
||||||
|
MenuItem.background=@menuBackground
|
||||||
|
MenuItem.acceleratorDelimiter=-
|
||||||
|
[mac]MenuItem.acceleratorDelimiter=
|
||||||
|
|
||||||
|
|
||||||
#---- OptionPane ----
|
#---- OptionPane ----
|
||||||
@@ -254,16 +341,19 @@ OptionPane.warningIcon=com.formdev.flatlaf.icons.FlatOptionPaneWarningIcon
|
|||||||
|
|
||||||
#---- PasswordField ----
|
#---- PasswordField ----
|
||||||
|
|
||||||
PasswordField.border=com.formdev.flatlaf.ui.FlatBorder
|
PasswordField.border=com.formdev.flatlaf.ui.FlatTextBorder
|
||||||
PasswordField.margin=@textComponentMargin
|
PasswordField.margin=@textComponentMargin
|
||||||
PasswordField.background=@textComponentBackground
|
PasswordField.background=@textComponentBackground
|
||||||
PasswordField.placeholderForeground=@disabledText
|
PasswordField.placeholderForeground=@disabledText
|
||||||
|
PasswordField.echoChar=\u2022
|
||||||
|
PasswordField.capsLockIcon=com.formdev.flatlaf.icons.FlatCapsLockIcon
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|
||||||
PopupMenu.border=com.formdev.flatlaf.ui.FlatPopupMenuBorder
|
PopupMenu.border=com.formdev.flatlaf.ui.FlatPopupMenuBorder
|
||||||
PopupMenu.borderInsets=1,1,1,1
|
PopupMenu.borderInsets=4,1,4,1
|
||||||
|
PopupMenu.background=@menuBackground
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenuSeparator ----
|
#---- PopupMenuSeparator ----
|
||||||
@@ -279,6 +369,8 @@ ProgressBar.border=com.formdev.flatlaf.ui.FlatEmptyBorder
|
|||||||
ProgressBar.arc=4
|
ProgressBar.arc=4
|
||||||
ProgressBar.horizontalSize=146,4
|
ProgressBar.horizontalSize=146,4
|
||||||
ProgressBar.verticalSize=4,146
|
ProgressBar.verticalSize=4,146
|
||||||
|
ProgressBar.cycleTime=4000
|
||||||
|
ProgressBar.repaintInterval=15
|
||||||
|
|
||||||
|
|
||||||
#---- RadioButton ----
|
#---- RadioButton ----
|
||||||
@@ -293,10 +385,13 @@ RadioButton.rollover=true
|
|||||||
|
|
||||||
#---- RadioButtonMenuItem ----
|
#---- RadioButtonMenuItem ----
|
||||||
|
|
||||||
RadioButtonMenuItem.border=com.formdev.flatlaf.ui.FlatMarginBorder
|
RadioButtonMenuItem.border=com.formdev.flatlaf.ui.FlatMenuItemBorder
|
||||||
RadioButtonMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon
|
RadioButtonMenuItem.checkIcon=com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon
|
||||||
RadioButtonMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
RadioButtonMenuItem.arrowIcon=com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
|
||||||
RadioButtonMenuItem.margin=2,2,2,2
|
RadioButtonMenuItem.margin=@menuItemMargin
|
||||||
|
RadioButtonMenuItem.opaque=false
|
||||||
|
RadioButtonMenuItem.borderPainted=true
|
||||||
|
RadioButtonMenuItem.background=@menuBackground
|
||||||
|
|
||||||
|
|
||||||
#---- ScrollBar ----
|
#---- ScrollBar ----
|
||||||
@@ -306,6 +401,7 @@ ScrollBar.showButtons=false
|
|||||||
ScrollBar.squareButtons=false
|
ScrollBar.squareButtons=false
|
||||||
ScrollBar.buttonArrowColor=$ComboBox.buttonArrowColor
|
ScrollBar.buttonArrowColor=$ComboBox.buttonArrowColor
|
||||||
ScrollBar.buttonDisabledArrowColor=$ComboBox.buttonDisabledArrowColor
|
ScrollBar.buttonDisabledArrowColor=$ComboBox.buttonDisabledArrowColor
|
||||||
|
ScrollBar.allowsAbsolutePositioning=true
|
||||||
|
|
||||||
|
|
||||||
#---- ScrollPane ----
|
#---- ScrollPane ----
|
||||||
@@ -366,7 +462,8 @@ TabbedPane.tabAreaInsets=0,0,0,0
|
|||||||
TabbedPane.selectedTabPadInsets=0,0,0,0
|
TabbedPane.selectedTabPadInsets=0,0,0,0
|
||||||
TabbedPane.tabRunOverlay=0
|
TabbedPane.tabRunOverlay=0
|
||||||
TabbedPane.tabsOverlapBorder=true
|
TabbedPane.tabsOverlapBorder=true
|
||||||
TabbedPane.shadow=$ComboBox.buttonArrowColor
|
TabbedPane.shadow=@background
|
||||||
|
TabbedPane.contentBorderInsets=null
|
||||||
|
|
||||||
|
|
||||||
#---- Table ----
|
#---- Table ----
|
||||||
@@ -384,6 +481,8 @@ Table.cellFocusColor=@cellFocusColor
|
|||||||
Table.cellNoFocusBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Default
|
Table.cellNoFocusBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Default
|
||||||
Table.focusCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Focused
|
Table.focusCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Focused
|
||||||
Table.focusSelectedCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Selected
|
Table.focusSelectedCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Selected
|
||||||
|
Table.focusCellBackground=@textComponentBackground
|
||||||
|
Table.focusCellForeground=@foreground
|
||||||
Table.selectionInactiveBackground=@selectionInactiveBackground
|
Table.selectionInactiveBackground=@selectionInactiveBackground
|
||||||
Table.selectionInactiveForeground=@selectionInactiveForeground
|
Table.selectionInactiveForeground=@selectionInactiveForeground
|
||||||
Table.dropCellBackground=@dropCellBackground
|
Table.dropCellBackground=@dropCellBackground
|
||||||
@@ -396,6 +495,7 @@ Table.dropLineShortColor=@dropLineShortColor
|
|||||||
|
|
||||||
TableHeader.height=25
|
TableHeader.height=25
|
||||||
TableHeader.cellBorder=2,3,2,3
|
TableHeader.cellBorder=2,3,2,3
|
||||||
|
TableHeader.focusCellBackground=$TableHeader.background
|
||||||
|
|
||||||
|
|
||||||
#---- TextArea ----
|
#---- TextArea ----
|
||||||
@@ -405,9 +505,16 @@ TextArea.margin=@textComponentMargin
|
|||||||
TextArea.background=@textComponentBackground
|
TextArea.background=@textComponentBackground
|
||||||
|
|
||||||
|
|
||||||
|
#---- TextComponent ----
|
||||||
|
|
||||||
|
# allowed values: "never", "once" (default) or "always"
|
||||||
|
TextComponent.selectAllOnFocusPolicy=once
|
||||||
|
TextComponent.arc=0
|
||||||
|
|
||||||
|
|
||||||
#---- TextField ----
|
#---- TextField ----
|
||||||
|
|
||||||
TextField.border=com.formdev.flatlaf.ui.FlatBorder
|
TextField.border=com.formdev.flatlaf.ui.FlatTextBorder
|
||||||
TextField.margin=@textComponentMargin
|
TextField.margin=@textComponentMargin
|
||||||
TextField.background=@textComponentBackground
|
TextField.background=@textComponentBackground
|
||||||
TextField.placeholderForeground=@disabledText
|
TextField.placeholderForeground=@disabledText
|
||||||
@@ -439,28 +546,37 @@ ToggleButton.pressedBackground=$Button.pressedBackground
|
|||||||
ToggleButton.toolbar.hoverBackground=$Button.toolbar.hoverBackground
|
ToggleButton.toolbar.hoverBackground=$Button.toolbar.hoverBackground
|
||||||
ToggleButton.toolbar.pressedBackground=$Button.toolbar.pressedBackground
|
ToggleButton.toolbar.pressedBackground=$Button.toolbar.pressedBackground
|
||||||
|
|
||||||
# button type "underline"
|
# button type "tab"
|
||||||
ToggleButton.underline.underlineHeight=2
|
ToggleButton.tab.underlineHeight=2
|
||||||
ToggleButton.underline.underlineColor=$TabbedPane.underlineColor
|
ToggleButton.tab.underlineColor=$TabbedPane.underlineColor
|
||||||
ToggleButton.underline.disabledUnderlineColor=$TabbedPane.disabledUnderlineColor
|
ToggleButton.tab.disabledUnderlineColor=$TabbedPane.disabledUnderlineColor
|
||||||
ToggleButton.underline.selectedBackground=$?TabbedPane.selectedBackground
|
ToggleButton.tab.selectedBackground=$?TabbedPane.selectedBackground
|
||||||
ToggleButton.underline.hoverBackground=$TabbedPane.hoverColor
|
ToggleButton.tab.hoverBackground=$TabbedPane.hoverColor
|
||||||
ToggleButton.underline.focusBackground=$TabbedPane.focusColor
|
ToggleButton.tab.focusBackground=$TabbedPane.focusColor
|
||||||
|
|
||||||
|
|
||||||
#---- ToolBar ----
|
#---- ToolBar ----
|
||||||
|
|
||||||
ToolBar.border=com.formdev.flatlaf.ui.FlatToolBarBorder
|
ToolBar.border=com.formdev.flatlaf.ui.FlatToolBarBorder
|
||||||
|
ToolBar.borderMargins=2,2,2,2
|
||||||
ToolBar.isRollover=true
|
ToolBar.isRollover=true
|
||||||
ToolBar.buttonMargins=3,3,3,3
|
|
||||||
ToolBar.gripColor=@icon
|
ToolBar.gripColor=@icon
|
||||||
ToolBar.dockingBackground=@background
|
ToolBar.dockingBackground=@background
|
||||||
|
ToolBar.dockingForeground=@foreground
|
||||||
ToolBar.floatingBackground=@background
|
ToolBar.floatingBackground=@background
|
||||||
|
ToolBar.floatingForeground=@disabledText
|
||||||
|
|
||||||
ToolBar.separatorSize=null
|
ToolBar.separatorSize=null
|
||||||
ToolBar.separatorWidth=7
|
ToolBar.separatorWidth=7
|
||||||
ToolBar.separatorColor=$Separator.foreground
|
ToolBar.separatorColor=$Separator.foreground
|
||||||
|
|
||||||
|
ToolBar.spacingBorder=$Button.toolbar.spacingInsets
|
||||||
|
|
||||||
|
|
||||||
|
#---- ToolTipManager ----
|
||||||
|
|
||||||
|
ToolTipManager.enableToolTipMode=activeApplication
|
||||||
|
|
||||||
|
|
||||||
#---- ToolTip ----
|
#---- ToolTip ----
|
||||||
|
|
||||||
@@ -475,11 +591,12 @@ ToolTip.foregroundInactive=@disabledText
|
|||||||
Tree.border=1,1,1,1
|
Tree.border=1,1,1,1
|
||||||
Tree.selectionInactiveBackground=@selectionInactiveBackground
|
Tree.selectionInactiveBackground=@selectionInactiveBackground
|
||||||
Tree.selectionInactiveForeground=@selectionInactiveForeground
|
Tree.selectionInactiveForeground=@selectionInactiveForeground
|
||||||
Tree.textBackground=null
|
Tree.textBackground=$Tree.background
|
||||||
Tree.selectionBorderColor=@cellFocusColor
|
Tree.selectionBorderColor=@cellFocusColor
|
||||||
Tree.dropCellBackground=@dropCellBackground
|
Tree.dropCellBackground=@dropCellBackground
|
||||||
Tree.dropCellForeground=@dropCellForeground
|
Tree.dropCellForeground=@dropCellForeground
|
||||||
Tree.dropLineColor=@dropLineColor
|
Tree.dropLineColor=@dropLineColor
|
||||||
|
Tree.rendererFillBackground=false
|
||||||
Tree.rendererMargins=1,2,1,2
|
Tree.rendererMargins=1,2,1,2
|
||||||
Tree.wideSelection=true
|
Tree.wideSelection=true
|
||||||
Tree.paintLines=false
|
Tree.paintLines=false
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
@selectionInactiveForeground=@foreground
|
@selectionInactiveForeground=@foreground
|
||||||
@disabledText=#8C8C8C
|
@disabledText=#8C8C8C
|
||||||
@textComponentBackground=#ffffff
|
@textComponentBackground=#ffffff
|
||||||
|
@menuBackground=#fff
|
||||||
@cellFocusColor=#000000
|
@cellFocusColor=#000000
|
||||||
@icon=#afafaf
|
@icon=#afafaf
|
||||||
|
|
||||||
@@ -132,11 +133,39 @@ Component.focusColor=#97c3f3
|
|||||||
Component.linkColor=#2470B3
|
Component.linkColor=#2470B3
|
||||||
|
|
||||||
|
|
||||||
|
#---- Desktop ----
|
||||||
|
|
||||||
|
Desktop.background=#E6EBF0
|
||||||
|
|
||||||
|
|
||||||
|
#---- DesktopIcon ----
|
||||||
|
|
||||||
|
DesktopIcon.background=darken($Desktop.background,10%)
|
||||||
|
|
||||||
|
|
||||||
#---- HelpButton ----
|
#---- HelpButton ----
|
||||||
|
|
||||||
HelpButton.questionMarkColor=#4F9EE3
|
HelpButton.questionMarkColor=#4F9EE3
|
||||||
|
|
||||||
|
|
||||||
|
#---- InternalFrame ----
|
||||||
|
|
||||||
|
InternalFrame.activeTitleBackground=#fff
|
||||||
|
InternalFrame.activeTitleForeground=@foreground
|
||||||
|
InternalFrame.inactiveTitleBackground=#fafafa
|
||||||
|
InternalFrame.inactiveTitleForeground=@disabledText
|
||||||
|
|
||||||
|
InternalFrame.activeBorderColor=darken($Component.borderColor,20%)
|
||||||
|
InternalFrame.inactiveBorderColor=$Component.borderColor
|
||||||
|
|
||||||
|
InternalFrame.buttonHoverBackground=darken(10%,autoInverse)
|
||||||
|
InternalFrame.buttonPressedBackground=darken(20%,autoInverse)
|
||||||
|
InternalFrame.closeHoverBackground=lazy(Actions.Red)
|
||||||
|
InternalFrame.closePressedBackground=darken(Actions.Red,10%,lazy)
|
||||||
|
InternalFrame.closeHoverForeground=#fff
|
||||||
|
InternalFrame.closePressedForeground=#fff
|
||||||
|
|
||||||
|
|
||||||
#---- List ----
|
#---- List ----
|
||||||
|
|
||||||
List.background=@textComponentBackground
|
List.background=@textComponentBackground
|
||||||
@@ -151,6 +180,7 @@ Menu.icon.disabledArrowColor=#ABABAB
|
|||||||
#---- MenuBar ----
|
#---- MenuBar ----
|
||||||
|
|
||||||
MenuBar.borderColor=#cdcdcd
|
MenuBar.borderColor=#cdcdcd
|
||||||
|
MenuBar.hoverBackground=darken($MenuBar.background,10%)
|
||||||
|
|
||||||
|
|
||||||
#---- MenuItemCheckBox ----
|
#---- MenuItemCheckBox ----
|
||||||
@@ -159,6 +189,11 @@ MenuItemCheckBox.icon.checkmarkColor=#4F9EE3
|
|||||||
MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
|
MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
|
||||||
|
|
||||||
|
|
||||||
|
#---- PasswordField ----
|
||||||
|
|
||||||
|
PasswordField.capsLockIconColor=#00000064
|
||||||
|
|
||||||
|
|
||||||
#---- PopupMenu ----
|
#---- PopupMenu ----
|
||||||
|
|
||||||
PopupMenu.borderColor=#adadad
|
PopupMenu.borderColor=#adadad
|
||||||
@@ -175,9 +210,9 @@ ProgressBar.selectionBackground=@foreground
|
|||||||
#---- ScrollBar ----
|
#---- ScrollBar ----
|
||||||
|
|
||||||
ScrollBar.track=#F5F5F5
|
ScrollBar.track=#F5F5F5
|
||||||
ScrollBar.thumb=#DBDBDB
|
ScrollBar.thumb=darken($ScrollBar.track,10%)
|
||||||
ScrollBar.hoverTrackColor=#e6e6e6
|
ScrollBar.hoverTrackColor=darken($ScrollBar.track,3%)
|
||||||
ScrollBar.hoverThumbColor=#c6c6c6
|
ScrollBar.hoverThumbColor=darken($ScrollBar.thumb,10%)
|
||||||
|
|
||||||
|
|
||||||
#---- Separator ----
|
#---- Separator ----
|
||||||
@@ -213,14 +248,14 @@ TabbedPane.contentAreaColor=#bfbfbf
|
|||||||
#---- Table ----
|
#---- Table ----
|
||||||
|
|
||||||
Table.background=@textComponentBackground
|
Table.background=@textComponentBackground
|
||||||
Table.gridColor=#F7F7F7
|
Table.gridColor=darken($Table.background,3%)
|
||||||
|
|
||||||
|
|
||||||
#---- TableHeader ----
|
#---- TableHeader ----
|
||||||
|
|
||||||
TableHeader.background=#ffffff
|
TableHeader.background=@textComponentBackground
|
||||||
TableHeader.separatorColor=#e5e5e5
|
TableHeader.separatorColor=darken($TableHeader.background,10%)
|
||||||
TableHeader.bottomSeparatorColor=#e5e5e5
|
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
|
||||||
|
|
||||||
|
|
||||||
#---- ToggleButton ----
|
#---- ToggleButton ----
|
||||||
|
|||||||
7
flatlaf-core/svg/CapsLockIcon.svg
Normal file
7
flatlaf-core/svg/CapsLockIcon.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<g fill="none" fill-rule="evenodd">
|
||||||
|
<rect width="16" height="16" fill="#6E6E6E" rx="3"/>
|
||||||
|
<rect width="6" height="2" x="5" y="12" fill="#FFF"/>
|
||||||
|
<path fill="#FFF" d="M2,8 L8,2 L14,8 L11,8 L11,10 L5,10 L5,8 L2,8 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 326 B |
Binary file not shown.
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -14,11 +14,17 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
version = rootProject.version
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
`java-library`
|
`java-library`
|
||||||
id( "com.jfrog.bintray" ) version "1.8.4"
|
id( "com.jfrog.bintray" )
|
||||||
|
|
||||||
|
// Although artifactory plugin is not used in this subproject, the plugin is required
|
||||||
|
// because otherwise gradle fails with following error:
|
||||||
|
// Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
|
||||||
|
// Cannot cast object 'task ':bintrayUpload''
|
||||||
|
// with class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask_Decorated'
|
||||||
|
// to class 'com.jfrog.bintray.gradle.tasks.BintrayUploadTask'
|
||||||
|
id( "com.jfrog.artifactory" )
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -28,11 +34,6 @@ dependencies {
|
|||||||
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
|
implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
jar {
|
jar {
|
||||||
dependsOn( ":flatlaf-core:jar" )
|
dependsOn( ":flatlaf-core:jar" )
|
||||||
@@ -46,14 +47,18 @@ tasks {
|
|||||||
|
|
||||||
// include all dependencies in jar
|
// include all dependencies in jar
|
||||||
from( {
|
from( {
|
||||||
configurations.runtimeClasspath.get().filter { it.name.endsWith( "jar" ) }.map { zipTree( it ) }
|
configurations.runtimeClasspath.get()
|
||||||
|
.filter { it.name.endsWith( "jar" ) }
|
||||||
|
.map { zipTree( it ).matching {
|
||||||
|
exclude( "META-INF/LICENSE" )
|
||||||
|
} }
|
||||||
} )
|
} )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bintray {
|
bintray {
|
||||||
user = System.getenv( "BINTRAY_USER" ) ?: System.getProperty( "bintray.user" )
|
user = rootProject.extra["bintray.user"] as String?
|
||||||
key = System.getenv( "BINTRAY_KEY" ) ?: System.getProperty( "bintray.key" )
|
key = rootProject.extra["bintray.key"] as String?
|
||||||
|
|
||||||
setConfigurations( "archives" )
|
setConfigurations( "archives" )
|
||||||
|
|
||||||
@@ -67,6 +72,7 @@ bintray {
|
|||||||
name = project.version.toString()
|
name = project.version.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
publish = true
|
publish = rootProject.extra["bintray.publish"] as Boolean
|
||||||
|
dryRun = rootProject.extra["bintray.dryRun"] as Boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.formdev.flatlaf.demo;
|
package com.formdev.flatlaf.demo;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.swing.text.DefaultEditorKit;
|
||||||
import net.miginfocom.swing.*;
|
import net.miginfocom.swing.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,6 +114,10 @@ class BasicComponentsPanel
|
|||||||
JScrollPane scrollPane12 = new JScrollPane();
|
JScrollPane scrollPane12 = new JScrollPane();
|
||||||
JTextPane textPane4 = new JTextPane();
|
JTextPane textPane4 = new JTextPane();
|
||||||
JTextPane textPane5 = new JTextPane();
|
JTextPane textPane5 = new JTextPane();
|
||||||
|
JPopupMenu popupMenu1 = new JPopupMenu();
|
||||||
|
JMenuItem cutMenuItem = new JMenuItem();
|
||||||
|
JMenuItem copyMenuItem = new JMenuItem();
|
||||||
|
JMenuItem pasteMenuItem = new JMenuItem();
|
||||||
|
|
||||||
//======== this ========
|
//======== this ========
|
||||||
setLayout(new MigLayout(
|
setLayout(new MigLayout(
|
||||||
@@ -260,6 +265,8 @@ class BasicComponentsPanel
|
|||||||
|
|
||||||
//---- comboBoxLabel ----
|
//---- comboBoxLabel ----
|
||||||
comboBoxLabel.setText("JComboBox:");
|
comboBoxLabel.setText("JComboBox:");
|
||||||
|
comboBoxLabel.setDisplayedMnemonic('C');
|
||||||
|
comboBoxLabel.setLabelFor(comboBox1);
|
||||||
add(comboBoxLabel, "cell 0 4");
|
add(comboBoxLabel, "cell 0 4");
|
||||||
|
|
||||||
//---- comboBox1 ----
|
//---- comboBox1 ----
|
||||||
@@ -314,6 +321,8 @@ class BasicComponentsPanel
|
|||||||
|
|
||||||
//---- spinnerLabel ----
|
//---- spinnerLabel ----
|
||||||
spinnerLabel.setText("JSpinner:");
|
spinnerLabel.setText("JSpinner:");
|
||||||
|
spinnerLabel.setLabelFor(spinner1);
|
||||||
|
spinnerLabel.setDisplayedMnemonic('S');
|
||||||
add(spinnerLabel, "cell 0 5");
|
add(spinnerLabel, "cell 0 5");
|
||||||
add(spinner1, "cell 1 5,growx");
|
add(spinner1, "cell 1 5,growx");
|
||||||
|
|
||||||
@@ -328,10 +337,13 @@ class BasicComponentsPanel
|
|||||||
|
|
||||||
//---- textFieldLabel ----
|
//---- textFieldLabel ----
|
||||||
textFieldLabel.setText("JTextField:");
|
textFieldLabel.setText("JTextField:");
|
||||||
|
textFieldLabel.setDisplayedMnemonic('T');
|
||||||
|
textFieldLabel.setLabelFor(textField1);
|
||||||
add(textFieldLabel, "cell 0 6");
|
add(textFieldLabel, "cell 0 6");
|
||||||
|
|
||||||
//---- textField1 ----
|
//---- textField1 ----
|
||||||
textField1.setText("editable");
|
textField1.setText("editable");
|
||||||
|
textField1.setComponentPopupMenu(popupMenu1);
|
||||||
add(textField1, "cell 1 6,growx");
|
add(textField1, "cell 1 6,growx");
|
||||||
|
|
||||||
//---- textField2 ----
|
//---- textField2 ----
|
||||||
@@ -356,10 +368,13 @@ class BasicComponentsPanel
|
|||||||
|
|
||||||
//---- formattedTextFieldLabel ----
|
//---- formattedTextFieldLabel ----
|
||||||
formattedTextFieldLabel.setText("JFormattedTextField:");
|
formattedTextFieldLabel.setText("JFormattedTextField:");
|
||||||
|
formattedTextFieldLabel.setLabelFor(formattedTextField1);
|
||||||
|
formattedTextFieldLabel.setDisplayedMnemonic('O');
|
||||||
add(formattedTextFieldLabel, "cell 0 7");
|
add(formattedTextFieldLabel, "cell 0 7");
|
||||||
|
|
||||||
//---- formattedTextField1 ----
|
//---- formattedTextField1 ----
|
||||||
formattedTextField1.setText("editable");
|
formattedTextField1.setText("editable");
|
||||||
|
formattedTextField1.setComponentPopupMenu(popupMenu1);
|
||||||
add(formattedTextField1, "cell 1 7,growx");
|
add(formattedTextField1, "cell 1 7,growx");
|
||||||
|
|
||||||
//---- formattedTextField2 ----
|
//---- formattedTextField2 ----
|
||||||
@@ -582,7 +597,27 @@ class BasicComponentsPanel
|
|||||||
//---- textPane5 ----
|
//---- textPane5 ----
|
||||||
textPane5.setText("no scroll pane");
|
textPane5.setText("no scroll pane");
|
||||||
add(textPane5, "cell 5 11,growx");
|
add(textPane5, "cell 5 11,growx");
|
||||||
|
|
||||||
|
//======== popupMenu1 ========
|
||||||
|
{
|
||||||
|
|
||||||
|
//---- cutMenuItem ----
|
||||||
|
cutMenuItem.setText("Cut");
|
||||||
|
popupMenu1.add(cutMenuItem);
|
||||||
|
|
||||||
|
//---- copyMenuItem ----
|
||||||
|
copyMenuItem.setText("Copy");
|
||||||
|
popupMenu1.add(copyMenuItem);
|
||||||
|
|
||||||
|
//---- pasteMenuItem ----
|
||||||
|
pasteMenuItem.setText("Paste");
|
||||||
|
popupMenu1.add(pasteMenuItem);
|
||||||
|
}
|
||||||
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
// JFormDesigner - End of component initialization //GEN-END:initComponents
|
||||||
|
|
||||||
|
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
|
||||||
|
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
|
||||||
|
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
||||||
|
|||||||
@@ -183,6 +183,8 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
name: "comboBoxLabel"
|
name: "comboBoxLabel"
|
||||||
"text": "JComboBox:"
|
"text": "JComboBox:"
|
||||||
|
"displayedMnemonic": 67
|
||||||
|
"labelFor": new FormReference( "comboBox1" )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 0 4"
|
"value": "cell 0 4"
|
||||||
} )
|
} )
|
||||||
@@ -254,6 +256,8 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
name: "spinnerLabel"
|
name: "spinnerLabel"
|
||||||
"text": "JSpinner:"
|
"text": "JSpinner:"
|
||||||
|
"labelFor": new FormReference( "spinner1" )
|
||||||
|
"displayedMnemonic": 83
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 0 5"
|
"value": "cell 0 5"
|
||||||
} )
|
} )
|
||||||
@@ -281,12 +285,15 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
name: "textFieldLabel"
|
name: "textFieldLabel"
|
||||||
"text": "JTextField:"
|
"text": "JTextField:"
|
||||||
|
"displayedMnemonic": 84
|
||||||
|
"labelFor": new FormReference( "textField1" )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 0 6"
|
"value": "cell 0 6"
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JTextField" ) {
|
add( new FormComponent( "javax.swing.JTextField" ) {
|
||||||
name: "textField1"
|
name: "textField1"
|
||||||
"text": "editable"
|
"text": "editable"
|
||||||
|
"componentPopupMenu": &FormReference0 new FormReference( "popupMenu1" )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 1 6,growx"
|
"value": "cell 1 6,growx"
|
||||||
} )
|
} )
|
||||||
@@ -321,12 +328,15 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JLabel" ) {
|
add( new FormComponent( "javax.swing.JLabel" ) {
|
||||||
name: "formattedTextFieldLabel"
|
name: "formattedTextFieldLabel"
|
||||||
"text": "JFormattedTextField:"
|
"text": "JFormattedTextField:"
|
||||||
|
"labelFor": new FormReference( "formattedTextField1" )
|
||||||
|
"displayedMnemonic": 79
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 0 7"
|
"value": "cell 0 7"
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JFormattedTextField" ) {
|
add( new FormComponent( "javax.swing.JFormattedTextField" ) {
|
||||||
name: "formattedTextField1"
|
name: "formattedTextField1"
|
||||||
"text": "editable"
|
"text": "editable"
|
||||||
|
"componentPopupMenu": #FormReference0
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 1 7,growx"
|
"value": "cell 1 7,growx"
|
||||||
} )
|
} )
|
||||||
@@ -585,7 +595,25 @@ new FormModel {
|
|||||||
} )
|
} )
|
||||||
}, new FormLayoutConstraints( null ) {
|
}, new FormLayoutConstraints( null ) {
|
||||||
"location": new java.awt.Point( 0, 0 )
|
"location": new java.awt.Point( 0, 0 )
|
||||||
"size": new java.awt.Dimension( 790, 715 )
|
"size": new java.awt.Dimension( 790, 440 )
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
|
||||||
|
name: "popupMenu1"
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "cutMenuItem"
|
||||||
|
"text": "Cut"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "copyMenuItem"
|
||||||
|
"text": "Copy"
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "pasteMenuItem"
|
||||||
|
"text": "Paste"
|
||||||
|
} )
|
||||||
|
}, new FormLayoutConstraints( null ) {
|
||||||
|
"location": new java.awt.Point( 0, 500 )
|
||||||
|
"size": new java.awt.Dimension( 91, 87 )
|
||||||
} )
|
} )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.formdev.flatlaf.demo;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.swing.text.DefaultEditorKit;
|
||||||
import com.formdev.flatlaf.demo.intellijthemes.*;
|
import com.formdev.flatlaf.demo.intellijthemes.*;
|
||||||
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
import com.formdev.flatlaf.extras.FlatSVGIcon;
|
||||||
import net.miginfocom.swing.*;
|
import net.miginfocom.swing.*;
|
||||||
@@ -51,6 +52,12 @@ class DemoFrame
|
|||||||
DemoPrefs.getState().putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
|
DemoPrefs.getState().putInt( FlatLafDemo.KEY_TAB, tabbedPane.getSelectedIndex() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void menuItemActionPerformed(ActionEvent e) {
|
||||||
|
SwingUtilities.invokeLater( () -> {
|
||||||
|
JOptionPane.showMessageDialog( this, e.getActionCommand(), "Menu Item", JOptionPane.PLAIN_MESSAGE );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||||
JMenuBar menuBar1 = new JMenuBar();
|
JMenuBar menuBar1 = new JMenuBar();
|
||||||
@@ -68,6 +75,14 @@ class DemoFrame
|
|||||||
JMenuItem deleteMenuItem = new JMenuItem();
|
JMenuItem deleteMenuItem = new JMenuItem();
|
||||||
JMenu viewMenu = new JMenu();
|
JMenu viewMenu = new JMenu();
|
||||||
JCheckBoxMenuItem checkBoxMenuItem1 = new JCheckBoxMenuItem();
|
JCheckBoxMenuItem checkBoxMenuItem1 = new JCheckBoxMenuItem();
|
||||||
|
JMenu menu1 = new JMenu();
|
||||||
|
JMenu subViewsMenu = new JMenu();
|
||||||
|
JMenu subSubViewsMenu = new JMenu();
|
||||||
|
JMenuItem errorLogViewMenuItem = new JMenuItem();
|
||||||
|
JMenuItem searchViewMenuItem = new JMenuItem();
|
||||||
|
JMenuItem projectViewMenuItem = new JMenuItem();
|
||||||
|
JMenuItem structureViewMenuItem = new JMenuItem();
|
||||||
|
JMenuItem propertiesViewMenuItem = new JMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
|
||||||
JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
|
JRadioButtonMenuItem radioButtonMenuItem3 = new JRadioButtonMenuItem();
|
||||||
@@ -103,27 +118,35 @@ class DemoFrame
|
|||||||
//======== fileMenu ========
|
//======== fileMenu ========
|
||||||
{
|
{
|
||||||
fileMenu.setText("File");
|
fileMenu.setText("File");
|
||||||
|
fileMenu.setMnemonic('F');
|
||||||
|
|
||||||
//---- newMenuItem ----
|
//---- newMenuItem ----
|
||||||
newMenuItem.setText("New");
|
newMenuItem.setText("New");
|
||||||
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
newMenuItem.setMnemonic('N');
|
||||||
|
newMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
fileMenu.add(newMenuItem);
|
fileMenu.add(newMenuItem);
|
||||||
|
|
||||||
//---- openMenuItem ----
|
//---- openMenuItem ----
|
||||||
openMenuItem.setText("Open");
|
openMenuItem.setText("Open");
|
||||||
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
openMenuItem.setMnemonic('O');
|
||||||
|
openMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
fileMenu.add(openMenuItem);
|
fileMenu.add(openMenuItem);
|
||||||
fileMenu.addSeparator();
|
fileMenu.addSeparator();
|
||||||
|
|
||||||
//---- closeMenuItem ----
|
//---- closeMenuItem ----
|
||||||
closeMenuItem.setText("Close");
|
closeMenuItem.setText("Close");
|
||||||
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
closeMenuItem.setMnemonic('C');
|
||||||
|
closeMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
fileMenu.add(closeMenuItem);
|
fileMenu.add(closeMenuItem);
|
||||||
fileMenu.addSeparator();
|
fileMenu.addSeparator();
|
||||||
|
|
||||||
//---- exitMenuItem ----
|
//---- exitMenuItem ----
|
||||||
exitMenuItem.setText("Exit");
|
exitMenuItem.setText("Exit");
|
||||||
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
exitMenuItem.setMnemonic('X');
|
||||||
exitMenuItem.addActionListener(e -> exitActionPerformed());
|
exitMenuItem.addActionListener(e -> exitActionPerformed());
|
||||||
fileMenu.add(exitMenuItem);
|
fileMenu.add(exitMenuItem);
|
||||||
}
|
}
|
||||||
@@ -132,37 +155,47 @@ class DemoFrame
|
|||||||
//======== editMenu ========
|
//======== editMenu ========
|
||||||
{
|
{
|
||||||
editMenu.setText("Edit");
|
editMenu.setText("Edit");
|
||||||
|
editMenu.setMnemonic('E');
|
||||||
|
|
||||||
//---- undoMenuItem ----
|
//---- undoMenuItem ----
|
||||||
undoMenuItem.setText("Undo");
|
undoMenuItem.setText("Undo");
|
||||||
undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
undoMenuItem.setMnemonic('U');
|
||||||
|
undoMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
editMenu.add(undoMenuItem);
|
editMenu.add(undoMenuItem);
|
||||||
|
|
||||||
//---- redoMenuItem ----
|
//---- redoMenuItem ----
|
||||||
redoMenuItem.setText("Redo");
|
redoMenuItem.setText("Redo");
|
||||||
redoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
redoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
redoMenuItem.setMnemonic('R');
|
||||||
|
redoMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
editMenu.add(redoMenuItem);
|
editMenu.add(redoMenuItem);
|
||||||
editMenu.addSeparator();
|
editMenu.addSeparator();
|
||||||
|
|
||||||
//---- cutMenuItem ----
|
//---- cutMenuItem ----
|
||||||
cutMenuItem.setText("Cut");
|
cutMenuItem.setText("Cut");
|
||||||
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
cutMenuItem.setMnemonic('C');
|
||||||
editMenu.add(cutMenuItem);
|
editMenu.add(cutMenuItem);
|
||||||
|
|
||||||
//---- copyMenuItem ----
|
//---- copyMenuItem ----
|
||||||
copyMenuItem.setText("Copy");
|
copyMenuItem.setText("Copy");
|
||||||
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
copyMenuItem.setMnemonic('O');
|
||||||
editMenu.add(copyMenuItem);
|
editMenu.add(copyMenuItem);
|
||||||
|
|
||||||
//---- pasteMenuItem ----
|
//---- pasteMenuItem ----
|
||||||
pasteMenuItem.setText("Paste");
|
pasteMenuItem.setText("Paste");
|
||||||
pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
pasteMenuItem.setMnemonic('P');
|
||||||
editMenu.add(pasteMenuItem);
|
editMenu.add(pasteMenuItem);
|
||||||
editMenu.addSeparator();
|
editMenu.addSeparator();
|
||||||
|
|
||||||
//---- deleteMenuItem ----
|
//---- deleteMenuItem ----
|
||||||
deleteMenuItem.setText("Delete");
|
deleteMenuItem.setText("Delete");
|
||||||
deleteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
|
deleteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
|
||||||
|
deleteMenuItem.setMnemonic('D');
|
||||||
|
deleteMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
editMenu.add(deleteMenuItem);
|
editMenu.add(deleteMenuItem);
|
||||||
}
|
}
|
||||||
menuBar1.add(editMenu);
|
menuBar1.add(editMenu);
|
||||||
@@ -170,24 +203,84 @@ class DemoFrame
|
|||||||
//======== viewMenu ========
|
//======== viewMenu ========
|
||||||
{
|
{
|
||||||
viewMenu.setText("View");
|
viewMenu.setText("View");
|
||||||
|
viewMenu.setMnemonic('V');
|
||||||
|
|
||||||
//---- checkBoxMenuItem1 ----
|
//---- checkBoxMenuItem1 ----
|
||||||
checkBoxMenuItem1.setText("Show Toolbar");
|
checkBoxMenuItem1.setText("Show Toolbar");
|
||||||
checkBoxMenuItem1.setSelected(true);
|
checkBoxMenuItem1.setSelected(true);
|
||||||
|
checkBoxMenuItem1.setMnemonic('T');
|
||||||
|
checkBoxMenuItem1.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
viewMenu.add(checkBoxMenuItem1);
|
viewMenu.add(checkBoxMenuItem1);
|
||||||
|
|
||||||
|
//======== menu1 ========
|
||||||
|
{
|
||||||
|
menu1.setText("Show View");
|
||||||
|
menu1.setMnemonic('V');
|
||||||
|
|
||||||
|
//======== subViewsMenu ========
|
||||||
|
{
|
||||||
|
subViewsMenu.setText("Sub Views");
|
||||||
|
subViewsMenu.setMnemonic('S');
|
||||||
|
|
||||||
|
//======== subSubViewsMenu ========
|
||||||
|
{
|
||||||
|
subSubViewsMenu.setText("Sub sub Views");
|
||||||
|
subSubViewsMenu.setMnemonic('U');
|
||||||
|
|
||||||
|
//---- errorLogViewMenuItem ----
|
||||||
|
errorLogViewMenuItem.setText("Error Log");
|
||||||
|
errorLogViewMenuItem.setMnemonic('E');
|
||||||
|
errorLogViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
|
subSubViewsMenu.add(errorLogViewMenuItem);
|
||||||
|
}
|
||||||
|
subViewsMenu.add(subSubViewsMenu);
|
||||||
|
|
||||||
|
//---- searchViewMenuItem ----
|
||||||
|
searchViewMenuItem.setText("Search");
|
||||||
|
searchViewMenuItem.setMnemonic('S');
|
||||||
|
searchViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
|
subViewsMenu.add(searchViewMenuItem);
|
||||||
|
}
|
||||||
|
menu1.add(subViewsMenu);
|
||||||
|
|
||||||
|
//---- projectViewMenuItem ----
|
||||||
|
projectViewMenuItem.setText("Project");
|
||||||
|
projectViewMenuItem.setMnemonic('P');
|
||||||
|
projectViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
|
menu1.add(projectViewMenuItem);
|
||||||
|
|
||||||
|
//---- structureViewMenuItem ----
|
||||||
|
structureViewMenuItem.setText("Structure");
|
||||||
|
structureViewMenuItem.setMnemonic('T');
|
||||||
|
structureViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
|
menu1.add(structureViewMenuItem);
|
||||||
|
|
||||||
|
//---- propertiesViewMenuItem ----
|
||||||
|
propertiesViewMenuItem.setText("Properties");
|
||||||
|
propertiesViewMenuItem.setMnemonic('O');
|
||||||
|
propertiesViewMenuItem.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
|
menu1.add(propertiesViewMenuItem);
|
||||||
|
}
|
||||||
|
viewMenu.add(menu1);
|
||||||
viewMenu.addSeparator();
|
viewMenu.addSeparator();
|
||||||
|
|
||||||
//---- radioButtonMenuItem1 ----
|
//---- radioButtonMenuItem1 ----
|
||||||
radioButtonMenuItem1.setText("Details");
|
radioButtonMenuItem1.setText("Details");
|
||||||
radioButtonMenuItem1.setSelected(true);
|
radioButtonMenuItem1.setSelected(true);
|
||||||
|
radioButtonMenuItem1.setMnemonic('D');
|
||||||
|
radioButtonMenuItem1.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
viewMenu.add(radioButtonMenuItem1);
|
viewMenu.add(radioButtonMenuItem1);
|
||||||
|
|
||||||
//---- radioButtonMenuItem2 ----
|
//---- radioButtonMenuItem2 ----
|
||||||
radioButtonMenuItem2.setText("Small Icons");
|
radioButtonMenuItem2.setText("Small Icons");
|
||||||
|
radioButtonMenuItem2.setMnemonic('S');
|
||||||
|
radioButtonMenuItem2.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
viewMenu.add(radioButtonMenuItem2);
|
viewMenu.add(radioButtonMenuItem2);
|
||||||
|
|
||||||
//---- radioButtonMenuItem3 ----
|
//---- radioButtonMenuItem3 ----
|
||||||
radioButtonMenuItem3.setText("Large Icons");
|
radioButtonMenuItem3.setText("Large Icons");
|
||||||
|
radioButtonMenuItem3.setMnemonic('L');
|
||||||
|
radioButtonMenuItem3.addActionListener(e -> menuItemActionPerformed(e));
|
||||||
viewMenu.add(radioButtonMenuItem3);
|
viewMenu.add(radioButtonMenuItem3);
|
||||||
}
|
}
|
||||||
menuBar1.add(viewMenu);
|
menuBar1.add(viewMenu);
|
||||||
@@ -195,9 +288,11 @@ class DemoFrame
|
|||||||
//======== helpMenu ========
|
//======== helpMenu ========
|
||||||
{
|
{
|
||||||
helpMenu.setText("Help");
|
helpMenu.setText("Help");
|
||||||
|
helpMenu.setMnemonic('H');
|
||||||
|
|
||||||
//---- aboutMenuItem ----
|
//---- aboutMenuItem ----
|
||||||
aboutMenuItem.setText("About");
|
aboutMenuItem.setText("About");
|
||||||
|
aboutMenuItem.setMnemonic('A');
|
||||||
aboutMenuItem.addActionListener(e -> aboutActionPerformed());
|
aboutMenuItem.addActionListener(e -> aboutActionPerformed());
|
||||||
helpMenu.add(aboutMenuItem);
|
helpMenu.add(aboutMenuItem);
|
||||||
}
|
}
|
||||||
@@ -288,6 +383,10 @@ class DemoFrame
|
|||||||
pasteButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/menu-paste.svg" ) );
|
pasteButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/menu-paste.svg" ) );
|
||||||
refreshButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/refresh.svg" ) );
|
refreshButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/refresh.svg" ) );
|
||||||
showToggleButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/show.svg" ) );
|
showToggleButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/show.svg" ) );
|
||||||
|
|
||||||
|
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
|
||||||
|
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
|
||||||
|
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
|
JFDML JFormDesigner: "7.0.0.0.194" Java: "13.0.1" encoding: "UTF-8"
|
||||||
|
|
||||||
new FormModel {
|
new FormModel {
|
||||||
contentType: "form/swing"
|
contentType: "form/swing"
|
||||||
@@ -117,15 +117,20 @@ new FormModel {
|
|||||||
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
name: "fileMenu"
|
name: "fileMenu"
|
||||||
"text": "File"
|
"text": "File"
|
||||||
|
"mnemonic": 70
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "newMenuItem"
|
name: "newMenuItem"
|
||||||
"text": "New"
|
"text": "New"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 78, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 78, 4226, false )
|
||||||
|
"mnemonic": 78
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "openMenuItem"
|
name: "openMenuItem"
|
||||||
"text": "Open"
|
"text": "Open"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 79, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 79, 4226, false )
|
||||||
|
"mnemonic": 79
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator2"
|
name: "separator2"
|
||||||
@@ -134,6 +139,8 @@ new FormModel {
|
|||||||
name: "closeMenuItem"
|
name: "closeMenuItem"
|
||||||
"text": "Close"
|
"text": "Close"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 87, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 87, 4226, false )
|
||||||
|
"mnemonic": 67
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator1"
|
name: "separator1"
|
||||||
@@ -142,21 +149,27 @@ new FormModel {
|
|||||||
name: "exitMenuItem"
|
name: "exitMenuItem"
|
||||||
"text": "Exit"
|
"text": "Exit"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 81, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 81, 4226, false )
|
||||||
|
"mnemonic": 88
|
||||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "exitActionPerformed", false ) )
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "exitActionPerformed", false ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
name: "editMenu"
|
name: "editMenu"
|
||||||
"text": "Edit"
|
"text": "Edit"
|
||||||
|
"mnemonic": 69
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "undoMenuItem"
|
name: "undoMenuItem"
|
||||||
"text": "Undo"
|
"text": "Undo"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 90, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 90, 4226, false )
|
||||||
|
"mnemonic": 85
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "redoMenuItem"
|
name: "redoMenuItem"
|
||||||
"text": "Redo"
|
"text": "Redo"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 89, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 89, 4226, false )
|
||||||
|
"mnemonic": 82
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator4"
|
name: "separator4"
|
||||||
@@ -165,16 +178,19 @@ new FormModel {
|
|||||||
name: "cutMenuItem"
|
name: "cutMenuItem"
|
||||||
"text": "Cut"
|
"text": "Cut"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 88, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 88, 4226, false )
|
||||||
|
"mnemonic": 67
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "copyMenuItem"
|
name: "copyMenuItem"
|
||||||
"text": "Copy"
|
"text": "Copy"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 67, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 67, 4226, false )
|
||||||
|
"mnemonic": 79
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "pasteMenuItem"
|
name: "pasteMenuItem"
|
||||||
"text": "Paste"
|
"text": "Paste"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 86, 4226, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 86, 4226, false )
|
||||||
|
"mnemonic": 80
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator3"
|
name: "separator3"
|
||||||
@@ -183,15 +199,65 @@ new FormModel {
|
|||||||
name: "deleteMenuItem"
|
name: "deleteMenuItem"
|
||||||
"text": "Delete"
|
"text": "Delete"
|
||||||
"accelerator": static javax.swing.KeyStroke getKeyStroke( 127, 0, false )
|
"accelerator": static javax.swing.KeyStroke getKeyStroke( 127, 0, false )
|
||||||
|
"mnemonic": 68
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
name: "viewMenu"
|
name: "viewMenu"
|
||||||
"text": "View"
|
"text": "View"
|
||||||
|
"mnemonic": 86
|
||||||
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
|
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
|
||||||
name: "checkBoxMenuItem1"
|
name: "checkBoxMenuItem1"
|
||||||
"text": "Show Toolbar"
|
"text": "Show Toolbar"
|
||||||
"selected": true
|
"selected": true
|
||||||
|
"mnemonic": 84
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
|
name: "menu1"
|
||||||
|
"text": "Show View"
|
||||||
|
"mnemonic": 86
|
||||||
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
|
name: "subViewsMenu"
|
||||||
|
"text": "Sub Views"
|
||||||
|
"mnemonic": 83
|
||||||
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
|
name: "subSubViewsMenu"
|
||||||
|
"text": "Sub sub Views"
|
||||||
|
"mnemonic": 85
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "errorLogViewMenuItem"
|
||||||
|
"text": "Error Log"
|
||||||
|
"mnemonic": 69
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "searchViewMenuItem"
|
||||||
|
"text": "Search"
|
||||||
|
"mnemonic": 83
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "projectViewMenuItem"
|
||||||
|
"text": "Project"
|
||||||
|
"mnemonic": 80
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "structureViewMenuItem"
|
||||||
|
"text": "Structure"
|
||||||
|
"mnemonic": 84
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
|
name: "propertiesViewMenuItem"
|
||||||
|
"text": "Properties"
|
||||||
|
"mnemonic": 79
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
|
} )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
|
||||||
name: "separator8"
|
name: "separator8"
|
||||||
@@ -201,24 +267,32 @@ new FormModel {
|
|||||||
"text": "Details"
|
"text": "Details"
|
||||||
"selected": true
|
"selected": true
|
||||||
"$buttonGroup": new FormReference( "buttonGroup1" )
|
"$buttonGroup": new FormReference( "buttonGroup1" )
|
||||||
|
"mnemonic": 68
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
|
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
|
||||||
name: "radioButtonMenuItem2"
|
name: "radioButtonMenuItem2"
|
||||||
"text": "Small Icons"
|
"text": "Small Icons"
|
||||||
"$buttonGroup": new FormReference( "buttonGroup1" )
|
"$buttonGroup": new FormReference( "buttonGroup1" )
|
||||||
|
"mnemonic": 83
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
|
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
|
||||||
name: "radioButtonMenuItem3"
|
name: "radioButtonMenuItem3"
|
||||||
"text": "Large Icons"
|
"text": "Large Icons"
|
||||||
"$buttonGroup": new FormReference( "buttonGroup1" )
|
"$buttonGroup": new FormReference( "buttonGroup1" )
|
||||||
|
"mnemonic": 76
|
||||||
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
|
||||||
name: "helpMenu"
|
name: "helpMenu"
|
||||||
"text": "Help"
|
"text": "Help"
|
||||||
|
"mnemonic": 72
|
||||||
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
add( new FormComponent( "javax.swing.JMenuItem" ) {
|
||||||
name: "aboutMenuItem"
|
name: "aboutMenuItem"
|
||||||
"text": "About"
|
"text": "About"
|
||||||
|
"mnemonic": 65
|
||||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "aboutActionPerformed", false ) )
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "aboutActionPerformed", false ) )
|
||||||
} )
|
} )
|
||||||
} )
|
} )
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 thvardhan
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -0,0 +1,267 @@
|
|||||||
|
{
|
||||||
|
"name": "Gradianto Dark Fuchsia",
|
||||||
|
"dark": true,
|
||||||
|
"author": "",
|
||||||
|
"editorScheme": "/Gradianto_dark_fuchsia.xml",
|
||||||
|
"ui": {
|
||||||
|
"*": {
|
||||||
|
"background": "#20022d",
|
||||||
|
"foreground": "#9ca9af",
|
||||||
|
|
||||||
|
"infoForeground": "#6aaf41",
|
||||||
|
|
||||||
|
"selectionBackground": "#4d086d",
|
||||||
|
"selectionForeground": "#c9c9c9",
|
||||||
|
"selectionInactiveBackground": "#37064e",
|
||||||
|
|
||||||
|
|
||||||
|
"disabledForeground": "#646464",
|
||||||
|
"disabledBackground": "#250434",
|
||||||
|
"inactiveBackground": "#250434",
|
||||||
|
|
||||||
|
"errorForeground": "#cd860b",
|
||||||
|
|
||||||
|
"disabledText": "#646464",
|
||||||
|
"Borders.ContrastBorderColor" : "#2b033b",
|
||||||
|
"borderColor": "#38044e",
|
||||||
|
"disabledBorderColor": "#22022f",
|
||||||
|
"focusColor" : "#550979",
|
||||||
|
"focusedBorderColor": "#550979",
|
||||||
|
|
||||||
|
"separatorColor": "#2d033f"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ActionButton": {
|
||||||
|
"hoverBackground": "#320647",
|
||||||
|
"pressedBackground": "#42075c",
|
||||||
|
"hoverBorderColor": "#58077c",
|
||||||
|
"pressedBorderColor": "#3c0555"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Borders": {
|
||||||
|
"color": "#38044e",
|
||||||
|
"ContrastBorderColor": "#38044e"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Button": {
|
||||||
|
"startBackground": "#41295a",
|
||||||
|
"endBackground": "#2F0743",
|
||||||
|
"startBorderColor": "#400080",
|
||||||
|
"endBorderColor": "#6300c5",
|
||||||
|
"shadowColor" : "#400080",
|
||||||
|
"focusedBorderColor" : "#550979",
|
||||||
|
"default.focusColor": "#550979",
|
||||||
|
"disabledBorderColor" : "#2e005d",
|
||||||
|
"default": {
|
||||||
|
"startBackground": "#41295a",
|
||||||
|
"endBackground": "#2f0743",
|
||||||
|
"startBorderColor": "#400080",
|
||||||
|
"endBorderColor": "#6300c5",
|
||||||
|
"focusedBorderColor": "#550979",
|
||||||
|
"focusColor": "#550979"
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
"RadioButton": {
|
||||||
|
"background" : "#41295a",
|
||||||
|
"foreground": "#2f0743"
|
||||||
|
},
|
||||||
|
|
||||||
|
"CompletionPopup": {
|
||||||
|
"matchForeground": "#652683",
|
||||||
|
"matchSelectionForeground": "#9057f2"
|
||||||
|
},
|
||||||
|
|
||||||
|
"MenuBar.borderColor": "#550979",
|
||||||
|
"Menu.borderColor": "#2f0743",
|
||||||
|
|
||||||
|
"NavBar.borderColor": "#2f0743",
|
||||||
|
|
||||||
|
|
||||||
|
"Notification": {
|
||||||
|
|
||||||
|
"errorForeground": "#abb2bf",
|
||||||
|
"errorBackground": "#280e29",
|
||||||
|
"errorBorderColor": "#692746",
|
||||||
|
|
||||||
|
"ToolWindow": {
|
||||||
|
"informativeForeground": "#abb2bf",
|
||||||
|
"informativeBackground": "#4b1d62",
|
||||||
|
"informativeBorderColor": "#3f2d55",
|
||||||
|
|
||||||
|
"warningForeground": "#abb2bf",
|
||||||
|
"warningBackground": "#735822",
|
||||||
|
"warningBorderColor": "#5f4422",
|
||||||
|
|
||||||
|
"errorForeground": "#abb2bf",
|
||||||
|
"errorBackground": "#802d43",
|
||||||
|
"errorBorderColor": "#552029"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"ComboBox": {
|
||||||
|
"background" : "#300444",
|
||||||
|
"nonEditableBackground": "#170b16",
|
||||||
|
"ArrowButton": {
|
||||||
|
"iconColor": "#aeb0b2",
|
||||||
|
"disabledIconColor": "#2a043c",
|
||||||
|
"nonEditableBackground": "#2c152a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Editor": {
|
||||||
|
"shortcutForeground": "#477924"
|
||||||
|
},
|
||||||
|
|
||||||
|
"EditorTabs": {
|
||||||
|
|
||||||
|
"selectedForeground": "#c9c9c9",
|
||||||
|
"selectedBackground": "#4e086f",
|
||||||
|
"underlinedTabBackground": "58097e",
|
||||||
|
"underlineColor": "#58097e",
|
||||||
|
"inactiveMaskColor": "#280a2fff"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Link": {
|
||||||
|
"activeForeground": "#ede891",
|
||||||
|
"hoverForeground": "#ede891",
|
||||||
|
"pressedForeground": "#ede891",
|
||||||
|
"visitedForeground": "#ede891"
|
||||||
|
},
|
||||||
|
|
||||||
|
"FileColor": {
|
||||||
|
"Yellow": "#d19a6614",
|
||||||
|
"Green": "#98c37915",
|
||||||
|
"Blue": "#61afef15",
|
||||||
|
"Violet": "#542a4f",
|
||||||
|
"Orange": "#d13c0015",
|
||||||
|
"Rose": "#ae002f20"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Tree.background": "#2d0340",
|
||||||
|
|
||||||
|
"SearchEverywhere": {
|
||||||
|
|
||||||
|
|
||||||
|
"Tab": {
|
||||||
|
"selectedForeground": "#c9c9c9",
|
||||||
|
"selectedBackground": "#4d086d"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"SearchMatch": {
|
||||||
|
"startBackground": "#d379f2",
|
||||||
|
"endBackground": "#d379f2"
|
||||||
|
},
|
||||||
|
|
||||||
|
"WelcomeScreen": {
|
||||||
|
"Projects.selectionInactiveBackground": "#37064e",
|
||||||
|
"separatorColor": "#2d033f"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ValidationTooltip": {
|
||||||
|
"errorBackground": "#802d43",
|
||||||
|
"errorBorderColor": "#802d43",
|
||||||
|
"warningBackground": "#735822",
|
||||||
|
"warningBorderColor": "#5f4422"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Table": {
|
||||||
|
"stripeColor": "#2d033f",
|
||||||
|
"selectionForeground": "#c9c9c9",
|
||||||
|
"dropLineColor": "#2d033f",
|
||||||
|
"focusCellForeground": "#abb2bf",
|
||||||
|
"gridColor": "#35064c"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ProgressBar": {
|
||||||
|
"trackColor": "#280a2f",
|
||||||
|
"progressColor": "#e78af2",
|
||||||
|
"indeterminateStartColor": "#e78af2",
|
||||||
|
"indeterminateEndColor": "#523569",
|
||||||
|
"failedColor": "#ad3864",
|
||||||
|
"failedEndColor": "#47221d",
|
||||||
|
"passedColor": "#60649e",
|
||||||
|
"passedEndColor": "#251642"
|
||||||
|
},
|
||||||
|
|
||||||
|
"PopupMenu.translucentBackground": "#4d086d",
|
||||||
|
|
||||||
|
"Popup": {
|
||||||
|
"paintBorder": true,
|
||||||
|
"Header.activeBackground": "#4e086f",
|
||||||
|
"Header.inactiveBackground": "#4d086d",
|
||||||
|
"separatorColor" : "#5e0a85",
|
||||||
|
"separatorForeground": "#5e0a85",
|
||||||
|
"Advertiser": {
|
||||||
|
"background": "#490768",
|
||||||
|
"borderColor": "#490768",
|
||||||
|
"borderInsets": "3,8,5,0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ToggleButton": {
|
||||||
|
"onForeground": "#4d086d",
|
||||||
|
"onBackground": "#9ca9af",
|
||||||
|
"offForeground": "#646464",
|
||||||
|
"offBackground": "#280a2f",
|
||||||
|
"buttonColor": "#4e086f",
|
||||||
|
"borderColor": "#4e086f"
|
||||||
|
},
|
||||||
|
"ToolTip": {
|
||||||
|
"background": "#450073",
|
||||||
|
"Actions.background": "#331432"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ToolWindow": {
|
||||||
|
"Header": {
|
||||||
|
"background": "#3b0063",
|
||||||
|
"inactiveBackground": "#370c41"
|
||||||
|
},
|
||||||
|
|
||||||
|
"HeaderTab": {
|
||||||
|
"selectedBackground": "#9C23D9FF",
|
||||||
|
"selectedInactiveBackground": "#4D0080FF",
|
||||||
|
"hoverBackground": "#9C23D9FF",
|
||||||
|
"hoverInactiveBackground": "#4D0080FF"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Button": {
|
||||||
|
"hoverBackground": "#320647",
|
||||||
|
"selectedBackground": "#42075c",
|
||||||
|
"selectedForeground": "#9ca9af"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DragAndDrop": {
|
||||||
|
"areaForeground": "#FFFFFF",
|
||||||
|
"areaBackground": "#42075c",
|
||||||
|
"areaBorderColor": "#4d0080"
|
||||||
|
},
|
||||||
|
"Plugins": {
|
||||||
|
"SectionHeader.background": "#4d0080",
|
||||||
|
"tagBackground": "#42075c",
|
||||||
|
"lightSelectionBackground": "#41075b"
|
||||||
|
},
|
||||||
|
"EditorPane.inactiveBackground": "#1a0225"
|
||||||
|
},
|
||||||
|
"icons": {
|
||||||
|
"ColorPalette": {
|
||||||
|
"Checkbox.Background.Default.Dark": "#3c0555",
|
||||||
|
"Checkbox.Border.Default.Dark": "#460561",
|
||||||
|
"Checkbox.Foreground.Selected.Dark": "#6aae41",
|
||||||
|
|
||||||
|
"Objects.Grey": "#9b8ebe",
|
||||||
|
"Objects.Blue": "#05b4a1",
|
||||||
|
"Objects.RedStatus": "#a8191aff",
|
||||||
|
"Objects.Red": "#aa3c3aff",
|
||||||
|
"Objects.Pink": "#d16979ff",
|
||||||
|
"Objects.Yellow": "#be9418ff",
|
||||||
|
"Objects.Green": "#009c0eff",
|
||||||
|
"Objects.Purple": "#6b48a6ff",
|
||||||
|
"Objects.BlackText": "#131313ff",
|
||||||
|
"Objects.YellowDark": "#8a6c1aff",
|
||||||
|
"Objects.GreenAndroid": "#008b14ff"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,240 @@
|
|||||||
|
{
|
||||||
|
"name": "Gradianto Deep Ocean",
|
||||||
|
"dark": true,
|
||||||
|
"author": "",
|
||||||
|
"editorScheme": "/Gradianto_deep_ocean.xml",
|
||||||
|
"ui": {
|
||||||
|
"*": {
|
||||||
|
"background": "#1c2739",
|
||||||
|
"foreground": "#c1c1c1",
|
||||||
|
|
||||||
|
"infoForeground": "#d7ff18c1",
|
||||||
|
|
||||||
|
"selectionBackground": "#39487e",
|
||||||
|
"selectionForeground": "#e2e2e2",
|
||||||
|
"selectionInactiveBackground": "#2c3d59",
|
||||||
|
|
||||||
|
|
||||||
|
"disabledForeground": "#a3a3a3",
|
||||||
|
"disabledBackground": "#222f44",
|
||||||
|
"inactiveBackground": "#325180",
|
||||||
|
|
||||||
|
"errorForeground": "#b5b5b5",
|
||||||
|
|
||||||
|
"disabledText": "#adadad",
|
||||||
|
"Borders.ContrastBorderColor" : "#0e1624",
|
||||||
|
"borderColor": "#151d2c",
|
||||||
|
"disabledBorderColor": "#0d1022",
|
||||||
|
"focusColor" : "#25334b",
|
||||||
|
"focusedBorderColor": "#2b416a",
|
||||||
|
|
||||||
|
"separatorColor": "#1d304b"
|
||||||
|
},
|
||||||
|
"Tree.background": "#24334a",
|
||||||
|
|
||||||
|
"ActionButton": {
|
||||||
|
"hoverBackground": "#324565",
|
||||||
|
"pressedBackground": "#284267",
|
||||||
|
"hoverBorderColor": "#141834",
|
||||||
|
"pressedBorderColor": "#171c3c"
|
||||||
|
},
|
||||||
|
"Borders": {
|
||||||
|
"color": "#2b3858cc",
|
||||||
|
"ContrastBorderColor": "#0e1624"
|
||||||
|
},
|
||||||
|
"Button": {
|
||||||
|
"startBackground": "#4a75a2",
|
||||||
|
"endBackground": "#4a75a2",
|
||||||
|
"startBorderColor": "#252e4b",
|
||||||
|
"endBorderColor": "#252e4b",
|
||||||
|
"focusedBorderColor" : "#4a75a2",
|
||||||
|
"default.focusColor": "#4a75a2",
|
||||||
|
"disabledBorderColor" : "#193c81",
|
||||||
|
"default": {
|
||||||
|
"startBackground": "#4a75a2",
|
||||||
|
"endBackground": "#4a75a2",
|
||||||
|
"focusColor": "#2969a2"
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"CompletionPopup": {
|
||||||
|
"matchForeground": "#568AF2"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Notification": {
|
||||||
|
|
||||||
|
"errorForeground": "#f5f5f5",
|
||||||
|
"errorBackground": "#c4131e",
|
||||||
|
"errorBorderColor": "#c55e4a",
|
||||||
|
|
||||||
|
"ToolWindow": {
|
||||||
|
"informativeForeground": "#f5f5f5",
|
||||||
|
"informativeBackground": "#414f66",
|
||||||
|
"informativeBorderColor": "#d4745c",
|
||||||
|
|
||||||
|
"warningForeground": "#abb2bf",
|
||||||
|
"warningBackground": "#896a28",
|
||||||
|
"warningBorderColor": "#5f4422",
|
||||||
|
|
||||||
|
"errorForeground": "#abb2bf",
|
||||||
|
"errorBackground": "#923849",
|
||||||
|
"errorBorderColor": "#552029"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ComboBox": {
|
||||||
|
"background" : "#3c557c",
|
||||||
|
"nonEditableBackground": "#466391",
|
||||||
|
"ArrowButton": {
|
||||||
|
"iconColor": "#e3e2f1",
|
||||||
|
"disabledIconColor": "#83828b",
|
||||||
|
"nonEditableBackground": "#607691"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Editor": {
|
||||||
|
"shortcutForeground": "#3f5079"
|
||||||
|
},
|
||||||
|
"EditorTabs": {
|
||||||
|
|
||||||
|
"selectedForeground": "#ececec",
|
||||||
|
"selectedBackground": "#324d65",
|
||||||
|
"underlinedTabBackground": "#324d65",
|
||||||
|
"background": "#243647",
|
||||||
|
"underlineColor": "#46628f",
|
||||||
|
"hoverMaskColor": "#46628f",
|
||||||
|
"inactiveMaskColor": "#24334aff"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Link": {
|
||||||
|
"activeForeground": "#ede891",
|
||||||
|
"hoverForeground": "#ede891",
|
||||||
|
"pressedForeground": "#ede891",
|
||||||
|
"visitedForeground": "#ede891"
|
||||||
|
},
|
||||||
|
"FileColor": {
|
||||||
|
"Yellow": "#d1b14225",
|
||||||
|
"Green": "#98c37925",
|
||||||
|
"Blue": "#61afef25",
|
||||||
|
"Violet": "#542a4f25",
|
||||||
|
"Orange": "#d13c0025",
|
||||||
|
"Rose": "#ae002f25"
|
||||||
|
},
|
||||||
|
"SearchEverywhere": {
|
||||||
|
"Tab": {
|
||||||
|
"selectedForeground": "#ffffff",
|
||||||
|
"selectedBackground": "#314f8f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SearchMatch": {
|
||||||
|
"startBackground": "#67849d",
|
||||||
|
"endBackground": "#2d3f71"
|
||||||
|
},
|
||||||
|
|
||||||
|
"WelcomeScreen": {
|
||||||
|
"Projects.selectionInactiveBackground": "#325180",
|
||||||
|
"separatorColor": "#223757"
|
||||||
|
},
|
||||||
|
"ValidationTooltip": {
|
||||||
|
"errorBackground": "#802d43",
|
||||||
|
"errorBorderColor": "#802d43",
|
||||||
|
"warningBackground": "#735822",
|
||||||
|
"warningBorderColor": "#5f4422"
|
||||||
|
},
|
||||||
|
"Table": {
|
||||||
|
"stripeColor": "#475a6f",
|
||||||
|
"selectionForeground": "#e4e4e4",
|
||||||
|
"dropLineColor": "#586b8d",
|
||||||
|
"focusCellForeground": "#e3e3e3",
|
||||||
|
"gridColor": "#45526f"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ProgressBar": {
|
||||||
|
"trackColor": "#131b2f",
|
||||||
|
"progressColor": "#608fcf",
|
||||||
|
"indeterminateStartColor": "#68a2f2",
|
||||||
|
"indeterminateEndColor": "#304869",
|
||||||
|
"failedColor": "#ad3864",
|
||||||
|
"failedEndColor": "#47221d",
|
||||||
|
"passedColor": "#83d68d",
|
||||||
|
"passedEndColor": "#2f422f"
|
||||||
|
},
|
||||||
|
"windowBorder" : "#282c57",
|
||||||
|
"window": "#282c57",
|
||||||
|
"PopupMenu.translucentBackground": "#26366d",
|
||||||
|
"Popup": {
|
||||||
|
"inactiveBorderColor" : "#252649",
|
||||||
|
"paintBorder": true,
|
||||||
|
"Header.activeBackground": "#39487e",
|
||||||
|
"Header.inactiveBackground": "#325180",
|
||||||
|
"separatorColor" : "#223757",
|
||||||
|
"separatorForeground": "#426aa8",
|
||||||
|
"Advertiser": {
|
||||||
|
"background": "#2f3347",
|
||||||
|
"borderColor": "#141834",
|
||||||
|
"borderInsets": "3,8,5,0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ToggleButton": {
|
||||||
|
"onForeground": "#274368",
|
||||||
|
"onBackground": "#9ca9af",
|
||||||
|
"offForeground": "#646464",
|
||||||
|
"offBackground": "#1c2732",
|
||||||
|
"buttonColor": "#3c5285"
|
||||||
|
},
|
||||||
|
"ToolTip": {
|
||||||
|
"background": "#445a83",
|
||||||
|
"Actions.background": "#252c3a"
|
||||||
|
},
|
||||||
|
"ToolWindow": {
|
||||||
|
"Header": {
|
||||||
|
"background": "#3766ae",
|
||||||
|
"inactiveBackground": "#325180"
|
||||||
|
},
|
||||||
|
|
||||||
|
"HeaderTab": {
|
||||||
|
"selectedBackground": "#39487eff",
|
||||||
|
"selectedInactiveBackground": "#2c3d59ff",
|
||||||
|
"hoverBackground": "#384d71ff",
|
||||||
|
"hoverInactiveBackground": "#25334aff"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Button": {
|
||||||
|
"hoverBackground": "#384d71ff",
|
||||||
|
"selectedBackground": "#39487eff",
|
||||||
|
"selectedForeground": "#b1bfc6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DragAndDrop": {
|
||||||
|
"areaForeground": "#e5e5e5",
|
||||||
|
"areaBackground": "#242b39",
|
||||||
|
"areaBorderColor": "#141834"
|
||||||
|
},
|
||||||
|
"Plugins": {
|
||||||
|
"SectionHeader.background": "#2a3563",
|
||||||
|
"tagBackground": "#3d445a",
|
||||||
|
"lightSelectionBackground": "#3c4b7e"
|
||||||
|
},
|
||||||
|
"EditorPane.inactiveBackground": "#040c25"
|
||||||
|
},
|
||||||
|
"icons": {
|
||||||
|
"ColorPalette": {
|
||||||
|
"Checkbox.Background.Default.Dark": "#3c4861",
|
||||||
|
"Checkbox.Foreground.Selected.Dark": "#00d66e",
|
||||||
|
|
||||||
|
"Checkbox.Background.Disabled": "#212735",
|
||||||
|
"Checkbox.Background.Disabled.Dark": "#212735",
|
||||||
|
|
||||||
|
"Objects.Grey": "#e3e3e3c0",
|
||||||
|
"Objects.Blue": "#4fc3f7c0",
|
||||||
|
"Objects.RedStatus": "#ff5722c0",
|
||||||
|
"Objects.Red": "#ff7274c0",
|
||||||
|
"Objects.Pink": "#ff97b1c0",
|
||||||
|
"Objects.Yellow": "#ffca57c0",
|
||||||
|
"Objects.Green": "#76da84c0",
|
||||||
|
"Objects.Purple": "#d199ffc0",
|
||||||
|
"Objects.BlackText": "#2e2e2ec0",
|
||||||
|
"Objects.YellowDark": "#ffca1ec0",
|
||||||
|
"Objects.GreenAndroid": "#18e66bc0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
{
|
||||||
|
"name": "Gradianto Midnight Blue",
|
||||||
|
"dark": true,
|
||||||
|
"author": "",
|
||||||
|
"editorScheme": "/Gradianto_midnight_blue.xml",
|
||||||
|
"ui": {
|
||||||
|
"*": {
|
||||||
|
"background": "#282839",
|
||||||
|
"foreground": "#d4d4d4",
|
||||||
|
|
||||||
|
"infoForeground": "#00d66e",
|
||||||
|
|
||||||
|
"selectionBackground": "#544092",
|
||||||
|
"selectionForeground": "#e2e2e2",
|
||||||
|
"selectionInactiveBackground": "#48387e",
|
||||||
|
|
||||||
|
|
||||||
|
"disabledForeground": "#a3a3a3",
|
||||||
|
"disabledBackground": "#3f3571",
|
||||||
|
"inactiveBackground": "#52408f",
|
||||||
|
|
||||||
|
"errorForeground": "#ebf1f2",
|
||||||
|
|
||||||
|
"disabledText": "#adadad",
|
||||||
|
"Borders.ContrastBorderColor" : "#221b3c",
|
||||||
|
"borderColor": "#221b3c",
|
||||||
|
"disabledBorderColor": "#221b3c",
|
||||||
|
"focusColor" : "#161227",
|
||||||
|
"focusedBorderColor": "#161227",
|
||||||
|
|
||||||
|
"separatorColor": "#383850"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Tree.background": "#2c2c3e",
|
||||||
|
|
||||||
|
"ActionButton": {
|
||||||
|
"hoverBackground": "#6d55bd",
|
||||||
|
"pressedBackground": "#4b3a81",
|
||||||
|
"hoverBorderColor": "#6d55bd",
|
||||||
|
"pressedBorderColor": "#4b3a81"
|
||||||
|
},
|
||||||
|
"Borders": {
|
||||||
|
"color": "#1b092f",
|
||||||
|
"ContrastBorderColor": "#1a1328"
|
||||||
|
},
|
||||||
|
"Button": {
|
||||||
|
"startBackground": "#544c91",
|
||||||
|
"endBackground": "#544c91",
|
||||||
|
"startBorderColor": "#544c91",
|
||||||
|
"endBorderColor": "#544c91",
|
||||||
|
"focusedBorderColor" : "#5631a2",
|
||||||
|
"default.focusColor": "#5631a2",
|
||||||
|
"disabledBorderColor" : "#442781",
|
||||||
|
"default": {
|
||||||
|
"startBackground": "#544c91",
|
||||||
|
"endBackground": "#544c91",
|
||||||
|
"startBorderColor": "#544c91",
|
||||||
|
"endBorderColor": "#442781",
|
||||||
|
"focusedBorderColor": "#5631a2",
|
||||||
|
"focusColor": "#5631a2"
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"CompletionPopup": {
|
||||||
|
"matchForeground": "#cecb46",
|
||||||
|
"matchSelectionForeground": "#ffcd7e"
|
||||||
|
},
|
||||||
|
"MenuBar.borderColor": "#221b3c",
|
||||||
|
"Menu.borderColor": "#140928",
|
||||||
|
"NavBar.borderColor": "#140928",
|
||||||
|
|
||||||
|
"Notification": {
|
||||||
|
|
||||||
|
"errorForeground": "#f5f5f5",
|
||||||
|
"errorBackground": "#c4131e",
|
||||||
|
"errorBorderColor": "#c55e4a",
|
||||||
|
|
||||||
|
"ToolWindow": {
|
||||||
|
"informativeForeground": "#f5f5f5",
|
||||||
|
"informativeBackground": "#4a4a66",
|
||||||
|
"informativeBorderColor": "#d4745c",
|
||||||
|
|
||||||
|
"warningForeground": "#abb2bf",
|
||||||
|
"warningBackground": "#896a28",
|
||||||
|
"warningBorderColor": "#5f4422",
|
||||||
|
|
||||||
|
"errorForeground": "#abb2bf",
|
||||||
|
"errorBackground": "#923849",
|
||||||
|
"errorBorderColor": "#552029"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ComboBox": {
|
||||||
|
"background" : "#5d5d84",
|
||||||
|
"nonEditableBackground": "#4a4a68",
|
||||||
|
"ArrowButton": {
|
||||||
|
"iconColor": "#e3e2f1",
|
||||||
|
"disabledIconColor": "#667286",
|
||||||
|
"nonEditableBackground": "#464662"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Editor": {
|
||||||
|
"shortcutForeground": "#745279"
|
||||||
|
},
|
||||||
|
|
||||||
|
"EditorTabs": {
|
||||||
|
"underlinedTabBackground": "#3d3d56",
|
||||||
|
"selectedBackground": "#3d3d56",
|
||||||
|
"underlineColor": "#44346e"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Link": {
|
||||||
|
"activeForeground": "#ede891",
|
||||||
|
"hoverForeground": "#ede891",
|
||||||
|
"pressedForeground": "#ede891",
|
||||||
|
"visitedForeground": "#ede891"
|
||||||
|
},
|
||||||
|
"FileColor": {
|
||||||
|
"Yellow": "#d19a6625",
|
||||||
|
"Green": "#98c37925",
|
||||||
|
"Blue": "#61afef25",
|
||||||
|
"Violet": "#542a4f25",
|
||||||
|
"Orange": "#d13c0025",
|
||||||
|
"Rose": "#ae002f25"
|
||||||
|
},
|
||||||
|
"SearchEverywhere": {
|
||||||
|
"Tab": {
|
||||||
|
"selectedForeground": "#ffffff",
|
||||||
|
"selectedBackground": "#52408f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SearchMatch": {
|
||||||
|
"startBackground": "#8787c1",
|
||||||
|
"endBackground": "#8787c1"
|
||||||
|
},
|
||||||
|
|
||||||
|
"WelcomeScreen": {
|
||||||
|
"Projects.selectionInactiveBackground": "#323247",
|
||||||
|
"separatorColor": "#323247"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ValidationTooltip": {
|
||||||
|
"errorBackground": "#802d43",
|
||||||
|
"errorBorderColor": "#802d43",
|
||||||
|
"warningBackground": "#735822",
|
||||||
|
"warningBorderColor": "#5f4422"
|
||||||
|
},
|
||||||
|
"Table": {
|
||||||
|
"stripeColor": "#4e4e6f",
|
||||||
|
"selectionForeground": "#ffffff",
|
||||||
|
"dropLineColor": "#63638d",
|
||||||
|
"focusCellForeground": "#ffffff",
|
||||||
|
"gridColor": "#4e4e6f"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ProgressBar": {
|
||||||
|
"trackColor": "#280a2f",
|
||||||
|
"progressColor": "#8769cf",
|
||||||
|
"indeterminateStartColor": "#a088f2",
|
||||||
|
"indeterminateEndColor": "#3d3f69",
|
||||||
|
"failedColor": "#ad3864",
|
||||||
|
"failedEndColor": "#47221d",
|
||||||
|
"passedColor": "#83d68d",
|
||||||
|
"passedEndColor": "#2f422f"
|
||||||
|
},
|
||||||
|
"PopupMenu.translucentBackground": "#37256d",
|
||||||
|
|
||||||
|
"Popup": {
|
||||||
|
"paintBorder": true,
|
||||||
|
"Header.activeBackground": "#5841a7",
|
||||||
|
"Header.inactiveBackground": "#48388b",
|
||||||
|
"separatorColor" : "#5640a2",
|
||||||
|
"separatorForeground": "#654bbe",
|
||||||
|
"Advertiser": {
|
||||||
|
"background": "#323247",
|
||||||
|
"borderColor": "#140928",
|
||||||
|
"borderInsets": "3,8,5,0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ToggleButton": {
|
||||||
|
"onForeground": "#9ca9af",
|
||||||
|
"onBackground": "#3f2c6d",
|
||||||
|
"offForeground": "#646464",
|
||||||
|
"offBackground": "#232332",
|
||||||
|
"buttonColor": "#411e85",
|
||||||
|
"borderColor": "#140928"
|
||||||
|
},
|
||||||
|
"ToolTip": {
|
||||||
|
"background": "#5c5c83",
|
||||||
|
"Actions.background": "#29293a"
|
||||||
|
},
|
||||||
|
"ToolWindow": {
|
||||||
|
"Header": {
|
||||||
|
"background": "#504896",
|
||||||
|
"inactiveBackground": "#443577"
|
||||||
|
},
|
||||||
|
|
||||||
|
"HeaderTab": {
|
||||||
|
"selectedBackground": "#41415eff",
|
||||||
|
"selectedInactiveBackground": "#363647ff",
|
||||||
|
"hoverBackground": "#4e4e70ff",
|
||||||
|
"hoverInactiveBackground": "#414157ff"
|
||||||
|
},
|
||||||
|
|
||||||
|
"Button": {
|
||||||
|
"hoverBackground": "#4e4e70",
|
||||||
|
"selectedBackground": "#41415e",
|
||||||
|
"selectedForeground": "#9ca9af"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DragAndDrop": {
|
||||||
|
"areaForeground": "#f5f5f5",
|
||||||
|
"areaBackground": "#282839",
|
||||||
|
"areaBorderColor": "#140928"
|
||||||
|
},
|
||||||
|
"Plugins": {
|
||||||
|
"SectionHeader.background": "#392c63",
|
||||||
|
"tagBackground": "#40405a",
|
||||||
|
"lightSelectionBackground": "#48387e"
|
||||||
|
},
|
||||||
|
"EditorPane.inactiveBackground": "#1a0225"
|
||||||
|
},
|
||||||
|
"icons": {
|
||||||
|
"ColorPalette": {
|
||||||
|
"Checkbox.Background.Default.Dark": "#444461",
|
||||||
|
"Checkbox.Foreground.Selected.Dark": "#00d66e",
|
||||||
|
|
||||||
|
|
||||||
|
"Objects.Grey": "#d6d6d6c0",
|
||||||
|
"Objects.Blue": "#4fc3f7c0",
|
||||||
|
"Objects.RedStatus": "#ff5722c0",
|
||||||
|
"Objects.Red": "#ff7274c0",
|
||||||
|
"Objects.Pink": "#ff97b1c0",
|
||||||
|
"Objects.Yellow": "#ffca57c0",
|
||||||
|
"Objects.Green": "#76da84c0",
|
||||||
|
"Objects.Purple": "#d199ffc0",
|
||||||
|
"Objects.BlackText": "#2e2e2ec0",
|
||||||
|
"Objects.YellowDark": "#ffca1ec0",
|
||||||
|
"Objects.GreenAndroid": "#18e66bc0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,8 @@
|
|||||||
"selectionForeground": "#ffffff",
|
"selectionForeground": "#ffffff",
|
||||||
"selectionInactiveBackground": "#C36200",
|
"selectionInactiveBackground": "#C36200",
|
||||||
"selectionBackgroundInactive": "#c36200",
|
"selectionBackgroundInactive": "#c36200",
|
||||||
"background" : "#F5F5F5"
|
"background" : "#FFFFFF",
|
||||||
|
"focusColor" : "#f57900"
|
||||||
},
|
},
|
||||||
|
|
||||||
"Borders": {
|
"Borders": {
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
"startBorderColor": "#C4C4C4",
|
"startBorderColor": "#C4C4C4",
|
||||||
"endBorderColor": "#C4C4C4",
|
"endBorderColor": "#C4C4C4",
|
||||||
"focusedBorderColor" : "#f57900",
|
"focusedBorderColor" : "#f57900",
|
||||||
|
"background" : "#F5F5F5",
|
||||||
"default": {
|
"default": {
|
||||||
"foreground": "#FFFFFF",
|
"foreground": "#FFFFFF",
|
||||||
"startBackground": "#f57900",
|
"startBackground": "#f57900",
|
||||||
@@ -40,17 +42,18 @@
|
|||||||
"WelcomeScreen.background" : "#F5F5F5",
|
"WelcomeScreen.background" : "#F5F5F5",
|
||||||
"WelcomeScreen.Projects.background" : "#ffffff",
|
"WelcomeScreen.Projects.background" : "#ffffff",
|
||||||
|
|
||||||
"List.background" : "#ffffff",
|
|
||||||
|
|
||||||
"MenuBar.foreground" : "#5c616c",
|
"MenuBar.foreground" : "#5c616c",
|
||||||
"Menu.background" : "#ffffff",
|
"Menu.background" : "#ffffff",
|
||||||
"Menu.separatorColor" : "#F5F5F5",
|
"Menu.separatorColor" : "#F5F5F5",
|
||||||
"Menu.foreground" : "#5c616c",
|
"Menu.foreground" : "#5c616c",
|
||||||
"MenuItem.foreground" : "#5c616c",
|
"MenuItem.foreground" : "#5c616c",
|
||||||
"MenuItem.background" : "#ffffff",
|
"MenuItem.background" : "#ffffff",
|
||||||
"PopupMenuSeparator.height" : "1",
|
"PopupMenuSeparator.height" : "2",
|
||||||
|
"Separator.separatorColor" : "#9ba2ab",
|
||||||
|
"Group.separatorColor" : "#9ba2ab",
|
||||||
|
|
||||||
"Tree.background" : "#ffffff",
|
"Tree.background" : "#ffffff",
|
||||||
|
"Tree.rowHeight": "23",
|
||||||
|
|
||||||
"ProgressBar.background" : "#f57900",
|
"ProgressBar.background" : "#f57900",
|
||||||
"ProgressBar.foreground" : "#f57900",
|
"ProgressBar.foreground" : "#f57900",
|
||||||
@@ -69,9 +72,11 @@
|
|||||||
"ParameterInfo.background" : "#fffae3",
|
"ParameterInfo.background" : "#fffae3",
|
||||||
"ParameterInfo.currentOverloadBackground" : "#fffae3",
|
"ParameterInfo.currentOverloadBackground" : "#fffae3",
|
||||||
|
|
||||||
|
"List.background" : "#ffffff",
|
||||||
"List.dropLineColor" : "#f57900",
|
"List.dropLineColor" : "#f57900",
|
||||||
"List.selectionBackground": "#f57900",
|
"List.selectionBackground": "#f57900",
|
||||||
"List.selectionForeground": "#ffffff",
|
"List.selectionForeground": "#ffffff",
|
||||||
|
"List.selectionInactiveBackground": "#C36200",
|
||||||
|
|
||||||
"Table.background" : "#ffffff",
|
"Table.background" : "#ffffff",
|
||||||
"Table.selectionBackground" : "#f57900",
|
"Table.selectionBackground" : "#f57900",
|
||||||
@@ -80,9 +85,12 @@
|
|||||||
"Table.lightSelectionForeground" : "#ffffff",
|
"Table.lightSelectionForeground" : "#ffffff",
|
||||||
"Table.focusCellBackground" : "#f57900",
|
"Table.focusCellBackground" : "#f57900",
|
||||||
"Table.focusCellForeground" : "#ffffff",
|
"Table.focusCellForeground" : "#ffffff",
|
||||||
|
"Table.dropLineColor": "#f57900",
|
||||||
|
"Table.dropLineShortColor": "#f57900",
|
||||||
|
|
||||||
"TabbedPane.underlineColor" : "#f57900",
|
"TabbedPane.underlineColor" : "#f57900",
|
||||||
"TabbedPane.tabSelectionHeight" : 2,
|
"TabbedPane.tabSelectionHeight" : 2,
|
||||||
|
"TabbedPane.background" : "#F5F5F5",
|
||||||
|
|
||||||
"Link.hoverForeground" : "#f57900",
|
"Link.hoverForeground" : "#f57900",
|
||||||
"Link.activeForeground" : "#f57900",
|
"Link.activeForeground" : "#f57900",
|
||||||
@@ -98,8 +106,22 @@
|
|||||||
"TextArea.background" : "#ffffff",
|
"TextArea.background" : "#ffffff",
|
||||||
"TextPane.background" : "#ffffff",
|
"TextPane.background" : "#ffffff",
|
||||||
"PasswordField.background" : "#ffffff",
|
"PasswordField.background" : "#ffffff",
|
||||||
|
"FormattedTextField.background" : "#ffffff",
|
||||||
|
"Editor.background" : "#f5f5f5",
|
||||||
|
"EditorPane.background" : "#ffffff",
|
||||||
|
|
||||||
"CompletionPopup.background" : "#ffffff",
|
"CheckBox.background" : "#F5F5F5",
|
||||||
|
"RadioButton.background" : "#F5F5F5",
|
||||||
|
"Slider.background" : "#F5F5F5",
|
||||||
|
"Spinner.background" : "#F5F5F5",
|
||||||
|
"OptionPane.background" : "#F5F5F5",
|
||||||
|
|
||||||
|
"CompletionPopup": {
|
||||||
|
"selectionBackground" : "#F5790055",
|
||||||
|
"nonFocusedMask": false,
|
||||||
|
"matchForeground": "#F57900",
|
||||||
|
"selectionInactiveBackground": "#C36200"
|
||||||
|
},
|
||||||
|
|
||||||
"Plugins.lightSelectionBackground" : "#dddee1",
|
"Plugins.lightSelectionBackground" : "#dddee1",
|
||||||
"Plugins.SearchField.background" : "#ffffff",
|
"Plugins.SearchField.background" : "#ffffff",
|
||||||
@@ -116,8 +138,10 @@
|
|||||||
"Counter.foreground" : "#ffffff",
|
"Counter.foreground" : "#ffffff",
|
||||||
|
|
||||||
"SearchEverywhere.SearchField.background" : "#ffffff",
|
"SearchEverywhere.SearchField.background" : "#ffffff",
|
||||||
|
"SearchEverywhere.Header.background" : "#F5F5F5",
|
||||||
|
|
||||||
"ToolTip.background" : "#fffae3",
|
"ToolTip.background" : "#F5F5F5",
|
||||||
|
"ToolTip.Actions.background" : "#F5F5F5",
|
||||||
|
|
||||||
"ToolWindow.Header.background" : "#e7e8eb",
|
"ToolWindow.Header.background" : "#e7e8eb",
|
||||||
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
|
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
|
||||||
@@ -128,8 +152,14 @@
|
|||||||
"ToolWindow.HeaderTab.underlineColor" : "#f57900",
|
"ToolWindow.HeaderTab.underlineColor" : "#f57900",
|
||||||
"DefaultTabs.underlineHeight" : 2,
|
"DefaultTabs.underlineHeight" : 2,
|
||||||
"DefaultTabs.underlineColor" : "#f57900",
|
"DefaultTabs.underlineColor" : "#f57900",
|
||||||
|
"DefaultTabs.background" : "#F5F5F5",
|
||||||
"EditorTabs.underlineHeight" : 2,
|
"EditorTabs.underlineHeight" : 2,
|
||||||
"EditorTabs.underlineColor" : "#f57900"
|
"EditorTabs.underlineColor" : "#f57900",
|
||||||
|
"EditorTabs.background" : "#F5F5F5",
|
||||||
|
|
||||||
|
"Notification.background" : "#F5F5F5",
|
||||||
|
"Notification.MoreButton.background" : "#dddee1",
|
||||||
|
"ScrollBar.background" : "#F5F5F5"
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
"selectionForeground": "#ffffff",
|
"selectionForeground": "#ffffff",
|
||||||
"selectionInactiveBackground": "#1e61b0",
|
"selectionInactiveBackground": "#1e61b0",
|
||||||
"selectionBackgroundInactive": "#1e61b0",
|
"selectionBackgroundInactive": "#1e61b0",
|
||||||
"background" : "#F5F5F5"
|
"background" : "#FFFFFF",
|
||||||
|
"focusColor" : "#2679db"
|
||||||
},
|
},
|
||||||
|
|
||||||
"Borders": {
|
"Borders": {
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
"startBorderColor": "#C4C4C4",
|
"startBorderColor": "#C4C4C4",
|
||||||
"endBorderColor": "#C4C4C4",
|
"endBorderColor": "#C4C4C4",
|
||||||
"focusedBorderColor" : "#2679db",
|
"focusedBorderColor" : "#2679db",
|
||||||
|
"background" : "#F5F5F5",
|
||||||
"default": {
|
"default": {
|
||||||
"foreground": "#FFFFFF",
|
"foreground": "#FFFFFF",
|
||||||
"startBackground": "#2679db",
|
"startBackground": "#2679db",
|
||||||
@@ -40,17 +42,18 @@
|
|||||||
"WelcomeScreen.background" : "#F5F5F5",
|
"WelcomeScreen.background" : "#F5F5F5",
|
||||||
"WelcomeScreen.Projects.background" : "#ffffff",
|
"WelcomeScreen.Projects.background" : "#ffffff",
|
||||||
|
|
||||||
"List.background" : "#ffffff",
|
|
||||||
|
|
||||||
"MenuBar.foreground" : "#5c616c",
|
"MenuBar.foreground" : "#5c616c",
|
||||||
"Menu.background" : "#ffffff",
|
"Menu.background" : "#ffffff",
|
||||||
"Menu.separatorColor" : "#F5F5F5",
|
"Menu.separatorColor" : "#F5F5F5",
|
||||||
"Menu.foreground" : "#5c616c",
|
"Menu.foreground" : "#5c616c",
|
||||||
"MenuItem.foreground" : "#5c616c",
|
"MenuItem.foreground" : "#5c616c",
|
||||||
"MenuItem.background" : "#ffffff",
|
"MenuItem.background" : "#ffffff",
|
||||||
"PopupMenuSeparator.height" : "1",
|
"PopupMenuSeparator.height" : "2",
|
||||||
|
"Separator.separatorColor" : "#9ba2ab",
|
||||||
|
"Group.separatorColor" : "#9ba2ab",
|
||||||
|
|
||||||
"Tree.background" : "#ffffff",
|
"Tree.background" : "#ffffff",
|
||||||
|
"Tree.rowHeight": "23",
|
||||||
|
|
||||||
"ProgressBar.background" : "#2679db",
|
"ProgressBar.background" : "#2679db",
|
||||||
"ProgressBar.foreground" : "#2679db",
|
"ProgressBar.foreground" : "#2679db",
|
||||||
@@ -69,9 +72,11 @@
|
|||||||
"ParameterInfo.background" : "#fffae3",
|
"ParameterInfo.background" : "#fffae3",
|
||||||
"ParameterInfo.currentOverloadBackground" : "#fffae3",
|
"ParameterInfo.currentOverloadBackground" : "#fffae3",
|
||||||
|
|
||||||
|
"List.background" : "#ffffff",
|
||||||
"List.dropLineColor" : "#2679db",
|
"List.dropLineColor" : "#2679db",
|
||||||
"List.selectionBackground": "#2679db",
|
"List.selectionBackground": "#2679db",
|
||||||
"List.selectionForeground": "#ffffff",
|
"List.selectionForeground": "#ffffff",
|
||||||
|
"List.selectionInactiveBackground": "#1e61b0",
|
||||||
|
|
||||||
"Table.background" : "#ffffff",
|
"Table.background" : "#ffffff",
|
||||||
"Table.selectionBackground" : "#2679db",
|
"Table.selectionBackground" : "#2679db",
|
||||||
@@ -80,9 +85,12 @@
|
|||||||
"Table.lightSelectionForeground" : "#ffffff",
|
"Table.lightSelectionForeground" : "#ffffff",
|
||||||
"Table.focusCellBackground" : "#2679db",
|
"Table.focusCellBackground" : "#2679db",
|
||||||
"Table.focusCellForeground" : "#ffffff",
|
"Table.focusCellForeground" : "#ffffff",
|
||||||
|
"Table.dropLineColor": "#2679db",
|
||||||
|
"Table.dropLineShortColor": "#2679db",
|
||||||
|
|
||||||
"TabbedPane.underlineColor" : "#2679db",
|
"TabbedPane.underlineColor" : "#2679db",
|
||||||
"TabbedPane.tabSelectionHeight" : 2,
|
"TabbedPane.tabSelectionHeight" : 2,
|
||||||
|
"TabbedPane.background" : "#F5F5F5",
|
||||||
|
|
||||||
"Link.hoverForeground" : "#2679db",
|
"Link.hoverForeground" : "#2679db",
|
||||||
"Link.activeForeground" : "#2679db",
|
"Link.activeForeground" : "#2679db",
|
||||||
@@ -98,8 +106,22 @@
|
|||||||
"TextArea.background" : "#ffffff",
|
"TextArea.background" : "#ffffff",
|
||||||
"TextPane.background" : "#ffffff",
|
"TextPane.background" : "#ffffff",
|
||||||
"PasswordField.background" : "#ffffff",
|
"PasswordField.background" : "#ffffff",
|
||||||
|
"FormattedTextField.background" : "#ffffff",
|
||||||
|
"Editor.background" : "#f5f5f5",
|
||||||
|
"EditorPane.background" : "#ffffff",
|
||||||
|
|
||||||
"CompletionPopup.background" : "#ffffff",
|
"CheckBox.background" : "#F5F5F5",
|
||||||
|
"RadioButton.background" : "#F5F5F5",
|
||||||
|
"Slider.background" : "#F5F5F5",
|
||||||
|
"Spinner.background" : "#F5F5F5",
|
||||||
|
"OptionPane.background" : "#F5F5F5",
|
||||||
|
|
||||||
|
"CompletionPopup": {
|
||||||
|
"selectionBackground" : "#2679db55",
|
||||||
|
"nonFocusedMask": false,
|
||||||
|
"matchForeground": "#2679db",
|
||||||
|
"selectionInactiveBackground": "#1e61b0"
|
||||||
|
},
|
||||||
|
|
||||||
"Plugins.lightSelectionBackground" : "#dddee1",
|
"Plugins.lightSelectionBackground" : "#dddee1",
|
||||||
"Plugins.SearchField.background" : "#ffffff",
|
"Plugins.SearchField.background" : "#ffffff",
|
||||||
@@ -116,8 +138,10 @@
|
|||||||
"Counter.foreground" : "#ffffff",
|
"Counter.foreground" : "#ffffff",
|
||||||
|
|
||||||
"SearchEverywhere.SearchField.background" : "#ffffff",
|
"SearchEverywhere.SearchField.background" : "#ffffff",
|
||||||
|
"SearchEverywhere.Header.background" : "#F5F5F5",
|
||||||
|
|
||||||
"ToolTip.background" : "#fffae3",
|
"ToolTip.background" : "#F5F5F5",
|
||||||
|
"ToolTip.Actions.background" : "#F5F5F5",
|
||||||
|
|
||||||
"ToolWindow.Header.background" : "#e7e8eb",
|
"ToolWindow.Header.background" : "#e7e8eb",
|
||||||
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
|
"ToolWindow.HeaderTab.selectedBackground" : "#dddee1",
|
||||||
@@ -128,8 +152,14 @@
|
|||||||
"ToolWindow.HeaderTab.underlineColor" : "#2679db",
|
"ToolWindow.HeaderTab.underlineColor" : "#2679db",
|
||||||
"DefaultTabs.underlineHeight" : 2,
|
"DefaultTabs.underlineHeight" : 2,
|
||||||
"DefaultTabs.underlineColor" : "#2679db",
|
"DefaultTabs.underlineColor" : "#2679db",
|
||||||
|
"DefaultTabs.background" : "#F5F5F5",
|
||||||
"EditorTabs.underlineHeight" : 2,
|
"EditorTabs.underlineHeight" : 2,
|
||||||
"EditorTabs.underlineColor" : "#2679db"
|
"EditorTabs.underlineColor" : "#2679db",
|
||||||
|
"EditorTabs.background" : "#F5F5F5",
|
||||||
|
|
||||||
|
"Notification.background" : "#F5F5F5",
|
||||||
|
"Notification.MoreButton.background" : "#dddee1",
|
||||||
|
"ScrollBar.background" : "#F5F5F5"
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#42A5F5",
|
"Checkbox.Focus.Wide.Dark": "#42A5F5",
|
||||||
"Checkbox.Foreground.Disabled": "#D3DAE3",
|
"Checkbox.Foreground.Disabled": "#D3DAE3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
|
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
|
||||||
"Checkbox.Background.Selected": "#2f343f",
|
"Checkbox.Background.Selected": "#42A5F5",
|
||||||
"Checkbox.Background.Selected.Dark": "#2f343f",
|
"Checkbox.Background.Selected.Dark": "#2f343f",
|
||||||
"Checkbox.Border.Selected": "#42A5F5",
|
"Checkbox.Border.Selected": "#42A5F5",
|
||||||
"Checkbox.Border.Selected.Dark": "#42A5F5",
|
"Checkbox.Border.Selected.Dark": "#42A5F5",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#42A5F5",
|
"Checkbox.Focus.Wide.Dark": "#42A5F5",
|
||||||
"Checkbox.Foreground.Disabled": "#D3DAE3",
|
"Checkbox.Foreground.Disabled": "#D3DAE3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
|
"Checkbox.Foreground.Disabled.Dark": "#D3DAE3",
|
||||||
"Checkbox.Background.Selected": "#2f343f",
|
"Checkbox.Background.Selected": "#42A5F5",
|
||||||
"Checkbox.Background.Selected.Dark": "#2f343f",
|
"Checkbox.Background.Selected.Dark": "#2f343f",
|
||||||
"Checkbox.Border.Selected": "#42A5F5",
|
"Checkbox.Border.Selected": "#42A5F5",
|
||||||
"Checkbox.Border.Selected.Dark": "#42A5F5",
|
"Checkbox.Border.Selected.Dark": "#42A5F5",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
||||||
"Checkbox.Foreground.Disabled": "#6B727D",
|
"Checkbox.Foreground.Disabled": "#6B727D",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
|
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
|
||||||
"Checkbox.Background.Selected": "#282C34",
|
"Checkbox.Background.Selected": "#2979ff",
|
||||||
"Checkbox.Background.Selected.Dark": "#282C34",
|
"Checkbox.Background.Selected.Dark": "#282C34",
|
||||||
"Checkbox.Border.Selected": "#2979ff",
|
"Checkbox.Border.Selected": "#2979ff",
|
||||||
"Checkbox.Border.Selected.Dark": "#2979ff",
|
"Checkbox.Border.Selected.Dark": "#2979ff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
||||||
"Checkbox.Foreground.Disabled": "#6B727D",
|
"Checkbox.Foreground.Disabled": "#6B727D",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
|
"Checkbox.Foreground.Disabled.Dark": "#6B727D",
|
||||||
"Checkbox.Background.Selected": "#282C34",
|
"Checkbox.Background.Selected": "#2979ff",
|
||||||
"Checkbox.Background.Selected.Dark": "#282C34",
|
"Checkbox.Background.Selected.Dark": "#282C34",
|
||||||
"Checkbox.Border.Selected": "#2979ff",
|
"Checkbox.Border.Selected": "#2979ff",
|
||||||
"Checkbox.Border.Selected.Dark": "#2979ff",
|
"Checkbox.Border.Selected.Dark": "#2979ff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
||||||
"Checkbox.Foreground.Disabled": "#b8b8b9",
|
"Checkbox.Foreground.Disabled": "#b8b8b9",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
|
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
|
||||||
"Checkbox.Background.Selected": "#F4F4F4",
|
"Checkbox.Background.Selected": "#2979ff",
|
||||||
"Checkbox.Background.Selected.Dark": "#F4F4F4",
|
"Checkbox.Background.Selected.Dark": "#F4F4F4",
|
||||||
"Checkbox.Border.Selected": "#2979ff",
|
"Checkbox.Border.Selected": "#2979ff",
|
||||||
"Checkbox.Border.Selected.Dark": "#2979ff",
|
"Checkbox.Border.Selected.Dark": "#2979ff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
"Checkbox.Focus.Wide.Dark": "#2979ff",
|
||||||
"Checkbox.Foreground.Disabled": "#b8b8b9",
|
"Checkbox.Foreground.Disabled": "#b8b8b9",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
|
"Checkbox.Foreground.Disabled.Dark": "#b8b8b9",
|
||||||
"Checkbox.Background.Selected": "#F4F4F4",
|
"Checkbox.Background.Selected": "#2979ff",
|
||||||
"Checkbox.Background.Selected.Dark": "#F4F4F4",
|
"Checkbox.Background.Selected.Dark": "#F4F4F4",
|
||||||
"Checkbox.Border.Selected": "#2979ff",
|
"Checkbox.Border.Selected": "#2979ff",
|
||||||
"Checkbox.Border.Selected.Dark": "#2979ff",
|
"Checkbox.Border.Selected.Dark": "#2979ff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#FF79C5",
|
"Checkbox.Focus.Wide.Dark": "#FF79C5",
|
||||||
"Checkbox.Foreground.Disabled": "#6272A4",
|
"Checkbox.Foreground.Disabled": "#6272A4",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
|
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
|
||||||
"Checkbox.Background.Selected": "#282A36",
|
"Checkbox.Background.Selected": "#FF79C5",
|
||||||
"Checkbox.Background.Selected.Dark": "#282A36",
|
"Checkbox.Background.Selected.Dark": "#282A36",
|
||||||
"Checkbox.Border.Selected": "#FF79C5",
|
"Checkbox.Border.Selected": "#FF79C5",
|
||||||
"Checkbox.Border.Selected.Dark": "#FF79C5",
|
"Checkbox.Border.Selected.Dark": "#FF79C5",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#FF79C5",
|
"Checkbox.Focus.Wide.Dark": "#FF79C5",
|
||||||
"Checkbox.Foreground.Disabled": "#6272A4",
|
"Checkbox.Foreground.Disabled": "#6272A4",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
|
"Checkbox.Foreground.Disabled.Dark": "#6272A4",
|
||||||
"Checkbox.Background.Selected": "#282A36",
|
"Checkbox.Background.Selected": "#FF79C5",
|
||||||
"Checkbox.Background.Selected.Dark": "#282A36",
|
"Checkbox.Background.Selected.Dark": "#282A36",
|
||||||
"Checkbox.Border.Selected": "#FF79C5",
|
"Checkbox.Border.Selected": "#FF79C5",
|
||||||
"Checkbox.Border.Selected.Dark": "#FF79C5",
|
"Checkbox.Border.Selected.Dark": "#FF79C5",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#79CB60",
|
"Checkbox.Focus.Wide.Dark": "#79CB60",
|
||||||
"Checkbox.Foreground.Disabled": "#9ba0a3",
|
"Checkbox.Foreground.Disabled": "#9ba0a3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
|
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
|
||||||
"Checkbox.Background.Selected": "#F7F8FA",
|
"Checkbox.Background.Selected": "#79CB60",
|
||||||
"Checkbox.Background.Selected.Dark": "#F7F8FA",
|
"Checkbox.Background.Selected.Dark": "#F7F8FA",
|
||||||
"Checkbox.Border.Selected": "#79CB60",
|
"Checkbox.Border.Selected": "#79CB60",
|
||||||
"Checkbox.Border.Selected.Dark": "#79CB60",
|
"Checkbox.Border.Selected.Dark": "#79CB60",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#79CB60",
|
"Checkbox.Focus.Wide.Dark": "#79CB60",
|
||||||
"Checkbox.Foreground.Disabled": "#9ba0a3",
|
"Checkbox.Foreground.Disabled": "#9ba0a3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
|
"Checkbox.Foreground.Disabled.Dark": "#9ba0a3",
|
||||||
"Checkbox.Background.Selected": "#F7F8FA",
|
"Checkbox.Background.Selected": "#79CB60",
|
||||||
"Checkbox.Background.Selected.Dark": "#F7F8FA",
|
"Checkbox.Background.Selected.Dark": "#F7F8FA",
|
||||||
"Checkbox.Border.Selected": "#79CB60",
|
"Checkbox.Border.Selected": "#79CB60",
|
||||||
"Checkbox.Border.Selected.Dark": "#79CB60",
|
"Checkbox.Border.Selected.Dark": "#79CB60",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2AA298",
|
"Checkbox.Focus.Wide.Dark": "#2AA298",
|
||||||
"Checkbox.Foreground.Disabled": "#93A1A1",
|
"Checkbox.Foreground.Disabled": "#93A1A1",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
|
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
|
||||||
"Checkbox.Background.Selected": "#F0F0F0",
|
"Checkbox.Background.Selected": "#2AA298",
|
||||||
"Checkbox.Background.Selected.Dark": "#F0F0F0",
|
"Checkbox.Background.Selected.Dark": "#F0F0F0",
|
||||||
"Checkbox.Border.Selected": "#2AA298",
|
"Checkbox.Border.Selected": "#2AA298",
|
||||||
"Checkbox.Border.Selected.Dark": "#2AA298",
|
"Checkbox.Border.Selected.Dark": "#2AA298",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#2AA298",
|
"Checkbox.Focus.Wide.Dark": "#2AA298",
|
||||||
"Checkbox.Foreground.Disabled": "#93A1A1",
|
"Checkbox.Foreground.Disabled": "#93A1A1",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
|
"Checkbox.Foreground.Disabled.Dark": "#93A1A1",
|
||||||
"Checkbox.Background.Selected": "#F0F0F0",
|
"Checkbox.Background.Selected": "#2AA298",
|
||||||
"Checkbox.Background.Selected.Dark": "#F0F0F0",
|
"Checkbox.Background.Selected.Dark": "#F0F0F0",
|
||||||
"Checkbox.Border.Selected": "#2AA298",
|
"Checkbox.Border.Selected": "#2AA298",
|
||||||
"Checkbox.Border.Selected.Dark": "#2AA298",
|
"Checkbox.Border.Selected.Dark": "#2AA298",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#FF9800",
|
"Checkbox.Focus.Wide.Dark": "#FF9800",
|
||||||
"Checkbox.Foreground.Disabled": "#474747",
|
"Checkbox.Foreground.Disabled": "#474747",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#474747",
|
"Checkbox.Foreground.Disabled.Dark": "#474747",
|
||||||
"Checkbox.Background.Selected": "#212121",
|
"Checkbox.Background.Selected": "#FF9800",
|
||||||
"Checkbox.Background.Selected.Dark": "#212121",
|
"Checkbox.Background.Selected.Dark": "#212121",
|
||||||
"Checkbox.Border.Selected": "#FF9800",
|
"Checkbox.Border.Selected": "#FF9800",
|
||||||
"Checkbox.Border.Selected.Dark": "#FF9800",
|
"Checkbox.Border.Selected.Dark": "#FF9800",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#FF9800",
|
"Checkbox.Focus.Wide.Dark": "#FF9800",
|
||||||
"Checkbox.Foreground.Disabled": "#474747",
|
"Checkbox.Foreground.Disabled": "#474747",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#474747",
|
"Checkbox.Foreground.Disabled.Dark": "#474747",
|
||||||
"Checkbox.Background.Selected": "#212121",
|
"Checkbox.Background.Selected": "#FF9800",
|
||||||
"Checkbox.Background.Selected.Dark": "#212121",
|
"Checkbox.Background.Selected.Dark": "#212121",
|
||||||
"Checkbox.Border.Selected": "#FF9800",
|
"Checkbox.Border.Selected": "#FF9800",
|
||||||
"Checkbox.Border.Selected.Dark": "#FF9800",
|
"Checkbox.Border.Selected.Dark": "#FF9800",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#84ffff",
|
"Checkbox.Focus.Wide.Dark": "#84ffff",
|
||||||
"Checkbox.Foreground.Disabled": "#464B5D",
|
"Checkbox.Foreground.Disabled": "#464B5D",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
|
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
|
||||||
"Checkbox.Background.Selected": "#0F111A",
|
"Checkbox.Background.Selected": "#84ffff",
|
||||||
"Checkbox.Background.Selected.Dark": "#0F111A",
|
"Checkbox.Background.Selected.Dark": "#0F111A",
|
||||||
"Checkbox.Border.Selected": "#84ffff",
|
"Checkbox.Border.Selected": "#84ffff",
|
||||||
"Checkbox.Border.Selected.Dark": "#84ffff",
|
"Checkbox.Border.Selected.Dark": "#84ffff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#84ffff",
|
"Checkbox.Focus.Wide.Dark": "#84ffff",
|
||||||
"Checkbox.Foreground.Disabled": "#464B5D",
|
"Checkbox.Foreground.Disabled": "#464B5D",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
|
"Checkbox.Foreground.Disabled.Dark": "#464B5D",
|
||||||
"Checkbox.Background.Selected": "#0F111A",
|
"Checkbox.Background.Selected": "#84ffff",
|
||||||
"Checkbox.Background.Selected.Dark": "#0F111A",
|
"Checkbox.Background.Selected.Dark": "#0F111A",
|
||||||
"Checkbox.Border.Selected": "#84ffff",
|
"Checkbox.Border.Selected": "#84ffff",
|
||||||
"Checkbox.Border.Selected.Dark": "#84ffff",
|
"Checkbox.Border.Selected.Dark": "#84ffff",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#00BCD4",
|
"Checkbox.Focus.Wide.Dark": "#00BCD4",
|
||||||
"Checkbox.Foreground.Disabled": "#D2D4D5",
|
"Checkbox.Foreground.Disabled": "#D2D4D5",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
|
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
|
||||||
"Checkbox.Background.Selected": "#FAFAFA",
|
"Checkbox.Background.Selected": "#00BCD4",
|
||||||
"Checkbox.Background.Selected.Dark": "#FAFAFA",
|
"Checkbox.Background.Selected.Dark": "#FAFAFA",
|
||||||
"Checkbox.Border.Selected": "#00BCD4",
|
"Checkbox.Border.Selected": "#00BCD4",
|
||||||
"Checkbox.Border.Selected.Dark": "#00BCD4",
|
"Checkbox.Border.Selected.Dark": "#00BCD4",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#00BCD4",
|
"Checkbox.Focus.Wide.Dark": "#00BCD4",
|
||||||
"Checkbox.Foreground.Disabled": "#D2D4D5",
|
"Checkbox.Foreground.Disabled": "#D2D4D5",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
|
"Checkbox.Foreground.Disabled.Dark": "#D2D4D5",
|
||||||
"Checkbox.Background.Selected": "#FAFAFA",
|
"Checkbox.Background.Selected": "#00BCD4",
|
||||||
"Checkbox.Background.Selected.Dark": "#FAFAFA",
|
"Checkbox.Background.Selected.Dark": "#FAFAFA",
|
||||||
"Checkbox.Border.Selected": "#00BCD4",
|
"Checkbox.Border.Selected": "#00BCD4",
|
||||||
"Checkbox.Border.Selected.Dark": "#00BCD4",
|
"Checkbox.Border.Selected.Dark": "#00BCD4",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#009688",
|
"Checkbox.Focus.Wide.Dark": "#009688",
|
||||||
"Checkbox.Foreground.Disabled": "#415967",
|
"Checkbox.Foreground.Disabled": "#415967",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#415967",
|
"Checkbox.Foreground.Disabled.Dark": "#415967",
|
||||||
"Checkbox.Background.Selected": "#263238",
|
"Checkbox.Background.Selected": "#009688",
|
||||||
"Checkbox.Background.Selected.Dark": "#263238",
|
"Checkbox.Background.Selected.Dark": "#263238",
|
||||||
"Checkbox.Border.Selected": "#009688",
|
"Checkbox.Border.Selected": "#009688",
|
||||||
"Checkbox.Border.Selected.Dark": "#009688",
|
"Checkbox.Border.Selected.Dark": "#009688",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#009688",
|
"Checkbox.Focus.Wide.Dark": "#009688",
|
||||||
"Checkbox.Foreground.Disabled": "#415967",
|
"Checkbox.Foreground.Disabled": "#415967",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#415967",
|
"Checkbox.Foreground.Disabled.Dark": "#415967",
|
||||||
"Checkbox.Background.Selected": "#263238",
|
"Checkbox.Background.Selected": "#009688",
|
||||||
"Checkbox.Background.Selected.Dark": "#263238",
|
"Checkbox.Background.Selected.Dark": "#263238",
|
||||||
"Checkbox.Border.Selected": "#009688",
|
"Checkbox.Border.Selected": "#009688",
|
||||||
"Checkbox.Border.Selected.Dark": "#009688",
|
"Checkbox.Border.Selected.Dark": "#009688",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#ab47bc",
|
"Checkbox.Focus.Wide.Dark": "#ab47bc",
|
||||||
"Checkbox.Foreground.Disabled": "#515772",
|
"Checkbox.Foreground.Disabled": "#515772",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#515772",
|
"Checkbox.Foreground.Disabled.Dark": "#515772",
|
||||||
"Checkbox.Background.Selected": "#292D3E",
|
"Checkbox.Background.Selected": "#ab47bc",
|
||||||
"Checkbox.Background.Selected.Dark": "#292D3E",
|
"Checkbox.Background.Selected.Dark": "#292D3E",
|
||||||
"Checkbox.Border.Selected": "#ab47bc",
|
"Checkbox.Border.Selected": "#ab47bc",
|
||||||
"Checkbox.Border.Selected.Dark": "#ab47bc",
|
"Checkbox.Border.Selected.Dark": "#ab47bc",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#ab47bc",
|
"Checkbox.Focus.Wide.Dark": "#ab47bc",
|
||||||
"Checkbox.Foreground.Disabled": "#515772",
|
"Checkbox.Foreground.Disabled": "#515772",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#515772",
|
"Checkbox.Foreground.Disabled.Dark": "#515772",
|
||||||
"Checkbox.Background.Selected": "#292D3E",
|
"Checkbox.Background.Selected": "#ab47bc",
|
||||||
"Checkbox.Background.Selected.Dark": "#292D3E",
|
"Checkbox.Background.Selected.Dark": "#292D3E",
|
||||||
"Checkbox.Border.Selected": "#ab47bc",
|
"Checkbox.Border.Selected": "#ab47bc",
|
||||||
"Checkbox.Border.Selected.Dark": "#ab47bc",
|
"Checkbox.Border.Selected.Dark": "#ab47bc",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#ffd866",
|
"Checkbox.Focus.Wide.Dark": "#ffd866",
|
||||||
"Checkbox.Foreground.Disabled": "#5b595c",
|
"Checkbox.Foreground.Disabled": "#5b595c",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
|
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
|
||||||
"Checkbox.Background.Selected": "#2D2A2E",
|
"Checkbox.Background.Selected": "#ffd866",
|
||||||
"Checkbox.Background.Selected.Dark": "#2D2A2E",
|
"Checkbox.Background.Selected.Dark": "#2D2A2E",
|
||||||
"Checkbox.Border.Selected": "#ffd866",
|
"Checkbox.Border.Selected": "#ffd866",
|
||||||
"Checkbox.Border.Selected.Dark": "#ffd866",
|
"Checkbox.Border.Selected.Dark": "#ffd866",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#ffd866",
|
"Checkbox.Focus.Wide.Dark": "#ffd866",
|
||||||
"Checkbox.Foreground.Disabled": "#5b595c",
|
"Checkbox.Foreground.Disabled": "#5b595c",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
|
"Checkbox.Foreground.Disabled.Dark": "#5b595c",
|
||||||
"Checkbox.Background.Selected": "#2D2A2E",
|
"Checkbox.Background.Selected": "#ffd866",
|
||||||
"Checkbox.Background.Selected.Dark": "#2D2A2E",
|
"Checkbox.Background.Selected.Dark": "#2D2A2E",
|
||||||
"Checkbox.Border.Selected": "#ffd866",
|
"Checkbox.Border.Selected": "#ffd866",
|
||||||
"Checkbox.Border.Selected.Dark": "#ffd866",
|
"Checkbox.Border.Selected.Dark": "#ffd866",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#7e57c2",
|
"Checkbox.Focus.Wide.Dark": "#7e57c2",
|
||||||
"Checkbox.Foreground.Disabled": "#697098",
|
"Checkbox.Foreground.Disabled": "#697098",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#697098",
|
"Checkbox.Foreground.Disabled.Dark": "#697098",
|
||||||
"Checkbox.Background.Selected": "#011627",
|
"Checkbox.Background.Selected": "#7e57c2",
|
||||||
"Checkbox.Background.Selected.Dark": "#011627",
|
"Checkbox.Background.Selected.Dark": "#011627",
|
||||||
"Checkbox.Border.Selected": "#7e57c2",
|
"Checkbox.Border.Selected": "#7e57c2",
|
||||||
"Checkbox.Border.Selected.Dark": "#7e57c2",
|
"Checkbox.Border.Selected.Dark": "#7e57c2",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#7e57c2",
|
"Checkbox.Focus.Wide.Dark": "#7e57c2",
|
||||||
"Checkbox.Foreground.Disabled": "#697098",
|
"Checkbox.Foreground.Disabled": "#697098",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#697098",
|
"Checkbox.Foreground.Disabled.Dark": "#697098",
|
||||||
"Checkbox.Background.Selected": "#011627",
|
"Checkbox.Background.Selected": "#7e57c2",
|
||||||
"Checkbox.Background.Selected.Dark": "#011627",
|
"Checkbox.Background.Selected.Dark": "#011627",
|
||||||
"Checkbox.Border.Selected": "#7e57c2",
|
"Checkbox.Border.Selected": "#7e57c2",
|
||||||
"Checkbox.Border.Selected.Dark": "#7e57c2",
|
"Checkbox.Border.Selected.Dark": "#7e57c2",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#d33682",
|
"Checkbox.Focus.Wide.Dark": "#d33682",
|
||||||
"Checkbox.Foreground.Disabled": "#2E5861",
|
"Checkbox.Foreground.Disabled": "#2E5861",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
|
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
|
||||||
"Checkbox.Background.Selected": "#002B36",
|
"Checkbox.Background.Selected": "#d33682",
|
||||||
"Checkbox.Background.Selected.Dark": "#002B36",
|
"Checkbox.Background.Selected.Dark": "#002B36",
|
||||||
"Checkbox.Border.Selected": "#d33682",
|
"Checkbox.Border.Selected": "#d33682",
|
||||||
"Checkbox.Border.Selected.Dark": "#d33682",
|
"Checkbox.Border.Selected.Dark": "#d33682",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#d33682",
|
"Checkbox.Focus.Wide.Dark": "#d33682",
|
||||||
"Checkbox.Foreground.Disabled": "#2E5861",
|
"Checkbox.Foreground.Disabled": "#2E5861",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
|
"Checkbox.Foreground.Disabled.Dark": "#2E5861",
|
||||||
"Checkbox.Background.Selected": "#002B36",
|
"Checkbox.Background.Selected": "#d33682",
|
||||||
"Checkbox.Background.Selected.Dark": "#002B36",
|
"Checkbox.Background.Selected.Dark": "#002B36",
|
||||||
"Checkbox.Border.Selected": "#d33682",
|
"Checkbox.Border.Selected": "#d33682",
|
||||||
"Checkbox.Border.Selected.Dark": "#d33682",
|
"Checkbox.Border.Selected.Dark": "#d33682",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#d33682",
|
"Checkbox.Focus.Wide.Dark": "#d33682",
|
||||||
"Checkbox.Foreground.Disabled": "#C9CCC3",
|
"Checkbox.Foreground.Disabled": "#C9CCC3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
|
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
|
||||||
"Checkbox.Background.Selected": "#fdf6e3",
|
"Checkbox.Background.Selected": "#d33682",
|
||||||
"Checkbox.Background.Selected.Dark": "#fdf6e3",
|
"Checkbox.Background.Selected.Dark": "#fdf6e3",
|
||||||
"Checkbox.Border.Selected": "#d33682",
|
"Checkbox.Border.Selected": "#d33682",
|
||||||
"Checkbox.Border.Selected.Dark": "#d33682",
|
"Checkbox.Border.Selected.Dark": "#d33682",
|
||||||
|
|||||||
@@ -850,7 +850,7 @@
|
|||||||
"Checkbox.Focus.Wide.Dark": "#d33682",
|
"Checkbox.Focus.Wide.Dark": "#d33682",
|
||||||
"Checkbox.Foreground.Disabled": "#C9CCC3",
|
"Checkbox.Foreground.Disabled": "#C9CCC3",
|
||||||
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
|
"Checkbox.Foreground.Disabled.Dark": "#C9CCC3",
|
||||||
"Checkbox.Background.Selected": "#fdf6e3",
|
"Checkbox.Background.Selected": "#d33682",
|
||||||
"Checkbox.Background.Selected.Dark": "#fdf6e3",
|
"Checkbox.Background.Selected.Dark": "#fdf6e3",
|
||||||
"Checkbox.Border.Selected": "#d33682",
|
"Checkbox.Border.Selected": "#d33682",
|
||||||
"Checkbox.Border.Selected.Dark": "#d33682",
|
"Checkbox.Border.Selected.Dark": "#d33682",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user