From 253a99ded625d03e4b675d8c62ee20f1c92f5b65 Mon Sep 17 00:00:00 2001 From: Mara Date: Sun, 4 Nov 2018 20:19:37 +0800 Subject: [PATCH] v4.0 --- MyBox/pom.xml | 2 +- .../mybox/controller/AboutController.java | 2 +- .../controller/HtmlEditorController.java | 2 +- .../ImageManufactureAddMarginsController.java | 2 +- .../ImageManufactureArcController.java | 2 +- ...eManufactureBatchAddMarginsController.java | 2 +- .../ImageManufactureBatchArcController.java | 2 +- .../ImageManufactureBatchColorController.java | 53 +- ...eManufactureBatchCutMarginsController.java | 2 +- ...mageManufactureBatchEffectsController.java | 135 +- ...mageManufactureBatchFiltersController.java | 79 +- ...anufactureBatchReplaceColorController.java | 2 +- ...ImageManufactureBatchShadowController.java | 2 +- ...geManufactureBatchWatermarkController.java | 2 +- .../ImageManufactureColorController.java | 122 +- .../ImageManufactureController.java | 8 +- .../ImageManufactureCropController.java | 2 +- .../ImageManufactureCutMarginsController.java | 2 +- .../ImageManufactureEffectsController.java | 143 +- .../ImageManufactureFiltersController.java | 110 +- ...mageManufactureReplaceColorController.java | 59 +- .../ImageManufactureShadowController.java | 2 +- .../ImageManufactureSizeController.java | 2 +- .../ImageManufactureTransformController.java | 2 +- .../ImageManufactureWatermarkController.java | 2 +- .../controller/ImageScopeController.java | 4 +- .../controller/ImageSplitController.java | 2 +- .../controller/ImageViewerController.java | 3 + .../controller/ImagesBlendController.java | 664 ++- .../controller/ImagesCombineController.java | 164 +- .../ImagesCombinePdfController.java | 2 +- .../mybox/controller/MainMenuController.java | 37 +- .../mybox/controller/MyBoxController.java | 13 +- .../controller/WeiboSnapRunController.java | 2 +- .../{tools => image}/FxmlImageTools.java | 210 +- .../mara/mybox/image/ImageAnalyzeTools.java | 43 + .../mara/mybox/image/ImageBlendTools.java | 420 ++ .../mara/mybox/image/ImageColorTools.java | 42 +- .../mara/mybox/image/ImageConvertTools.java | 492 +- .../java/mara/mybox/image/ImageGrayTools.java | 38 +- .../java/mara/mybox/objects/CommonValues.java | 5 +- .../java/mara/mybox/objects/ImageScope.java | 8 +- .../main/java/mara/mybox/tools/FxmlTools.java | 16 +- .../main/java/mara/mybox/tools/PdfTools.java | 1 + .../resources/bundles/Messages.properties | 62 + .../bundles/Messages_en_US.properties | 62 + .../bundles/Messages_zh_CN.properties | 62 + MyBox/src/main/resources/caspian.css | 4271 ----------------- .../resources/docs/AboutColorDistance_en.html | 48 + .../resources/docs/AboutColorDistance_zh.html | 48 + .../resources/docs/AboutImageBlending_en.html | 51 + .../resources/docs/AboutImageBlending_zh.html | 51 + .../docs/AboutImageGrayscale_en.html | 49 + .../docs/AboutImageGrayscale_zh.html | 49 + .../main/resources/docs/HowPackExe_en.html | 53 + .../main/resources/docs/HowPackExe_zh.html | 53 + ...Help.html => ImageCompressionType_en.html} | 6 +- .../docs/ImageCompressionType_zh.html | 122 + .../main/resources/docs/ImageMetaData_en.html | 57 + .../main/resources/docs/ImageMetaData_zh.html | 57 + .../main/resources/docs/ImageSepia_en.html | 49 + .../main/resources/docs/ImageSepia_zh.html | 49 + MyBox/src/main/resources/docs/Java2D_en.html | 49 + MyBox/src/main/resources/docs/Java2D_zh.html | 49 + .../main/resources/docs/mybox_help_en.html | 11 + .../resources/docs/mybox_help_main_en.html | 54 + .../resources/docs/mybox_help_main_zh.html | 54 + .../resources/docs/mybox_help_nav_en.html | 51 + .../resources/docs/mybox_help_nav_zh.html | 51 + .../main/resources/docs/mybox_help_zh.html | 11 + MyBox/src/main/resources/docs/srcHelp.html | 16 - MyBox/src/main/resources/fxml/About.fxml | 6 +- MyBox/src/main/resources/fxml/ImageBlend.fxml | 195 - .../fxml/ImageManufactureBatchColor.fxml | 12 +- .../fxml/ImageManufactureBatchEffects.fxml | 40 +- .../fxml/ImageManufactureBatchFilters.fxml | 15 +- .../resources/fxml/ImageManufactureColor.fxml | 4 + .../fxml/ImageManufactureEffects.fxml | 19 +- .../fxml/ImageManufactureFilters.fxml | 9 +- .../fxml/ImageManufactureReplaceColor.fxml | 4 +- .../src/main/resources/fxml/ImagesBlend.fxml | 187 + .../main/resources/fxml/ImagesCombine.fxml | 57 +- MyBox/src/main/resources/fxml/MainMenu.fxml | 45 +- MyBox/src/main/resources/img/BinF.png | Bin 0 -> 6091 bytes MyBox/src/main/resources/img/FinB.png | Bin 0 -> 5341 bytes MyBox/src/main/resources/img/ab_in.png | Bin 0 -> 12931 bytes MyBox/src/main/resources/img/ba_in.png | Bin 0 -> 9707 bytes MyBox/src/main/resources/styles/MyBox.css | 1 + .../styles/caspian/center-btn-selected.png | Bin 281 -> 0 bytes .../resources/styles/caspian/center-btn.png | Bin 334 -> 0 bytes .../styles/caspian/dialog-confirm.png | Bin 5830 -> 0 bytes .../styles/caspian/dialog-confirm@2x.png | Bin 11665 -> 0 bytes .../resources/styles/caspian/dialog-error.png | Bin 5116 -> 0 bytes .../styles/caspian/dialog-error@2x.png | Bin 9643 -> 0 bytes .../styles/caspian/dialog-fewer-details.png | Bin 3588 -> 0 bytes .../caspian/dialog-fewer-details@2x.png | Bin 4950 -> 0 bytes .../styles/caspian/dialog-information.png | Bin 5571 -> 0 bytes .../styles/caspian/dialog-information@2x.png | Bin 10903 -> 0 bytes .../styles/caspian/dialog-more-details.png | Bin 3593 -> 0 bytes .../styles/caspian/dialog-more-details@2x.png | Bin 4955 -> 0 bytes .../styles/caspian/dialog-warning.png | Bin 5080 -> 0 bytes .../styles/caspian/dialog-warning@2x.png | Bin 9087 -> 0 bytes .../styles/caspian/fxvk-backspace-button.png | Bin 1420 -> 0 bytes .../styles/caspian/fxvk-capslock-button.png | Bin 1451 -> 0 bytes .../styles/caspian/fxvk-enter-button.png | Bin 1490 -> 0 bytes .../styles/caspian/fxvk-shift-button.png | Bin 1406 -> 0 bytes .../styles/caspian/images/backspace-icon.png | Bin 2985 -> 0 bytes .../styles/caspian/images/capslock-icon.png | Bin 1451 -> 0 bytes .../styles/caspian/images/enter-icon.png | Bin 1236 -> 0 bytes .../styles/caspian/images/shift-icon.png | Bin 1304 -> 0 bytes .../styles/caspian/images/vk-dark-pressed.png | Bin 2434 -> 0 bytes .../styles/caspian/images/vk-dark.png | Bin 2458 -> 0 bytes .../styles/caspian/images/vk-hide.png | Bin 1265 -> 0 bytes .../caspian/images/vk-light-pressed.png | Bin 2687 -> 0 bytes .../styles/caspian/images/vk-light.png | Bin 2719 -> 0 bytes .../caspian/images/vk-medium-pressed.png | Bin 2679 -> 0 bytes .../styles/caspian/images/vk-medium.png | Bin 2271 -> 0 bytes .../styles/caspian/left-btn-selected.png | Bin 495 -> 0 bytes .../resources/styles/caspian/left-btn.png | Bin 547 -> 0 bytes .../resources/styles/caspian/menu-shadow.png | Bin 772 -> 0 bytes .../styles/caspian/pattern-transparent.png | Bin 1018 -> 0 bytes .../styles/caspian/right-btn-selected.png | Bin 511 -> 0 bytes .../resources/styles/caspian/right-btn.png | Bin 548 -> 0 bytes .../HTMLEditor-Background-Color-Black.png | Bin 1072 -> 0 bytes .../HTMLEditor-Background-Color-Black@2x.png | Bin 1246 -> 0 bytes .../HTMLEditor-Background-Color-White.png | Bin 1091 -> 0 bytes .../HTMLEditor-Background-Color-White@2x.png | Bin 1236 -> 0 bytes .../HTMLEditor-Background-Color-Yellow.png | Bin 1162 -> 0 bytes .../HTMLEditor-Background-Color-Yellow@2x.png | Bin 1329 -> 0 bytes .../modena/HTMLEditor-Background-Color.png | Bin 1264 -> 0 bytes .../modena/HTMLEditor-Background-Color@2x.png | Bin 1606 -> 0 bytes .../styles/modena/HTMLEditor-Bold-Black.png | Bin 1052 -> 0 bytes .../modena/HTMLEditor-Bold-Black@2x.png | Bin 1197 -> 0 bytes .../styles/modena/HTMLEditor-Bold-White.png | Bin 1049 -> 0 bytes .../modena/HTMLEditor-Bold-White@2x.png | Bin 1195 -> 0 bytes .../styles/modena/HTMLEditor-Bold-Yellow.png | Bin 1130 -> 0 bytes .../modena/HTMLEditor-Bold-Yellow@2x.png | Bin 1280 -> 0 bytes .../styles/modena/HTMLEditor-Bold.png | Bin 1258 -> 0 bytes .../styles/modena/HTMLEditor-Bold@2x.png | Bin 1575 -> 0 bytes .../styles/modena/HTMLEditor-Break-Black.png | Bin 977 -> 0 bytes .../modena/HTMLEditor-Break-Black@2x.png | Bin 1044 -> 0 bytes .../styles/modena/HTMLEditor-Break-White.png | Bin 963 -> 0 bytes .../modena/HTMLEditor-Break-White@2x.png | Bin 1009 -> 0 bytes .../styles/modena/HTMLEditor-Break-Yellow.png | Bin 1033 -> 0 bytes .../modena/HTMLEditor-Break-Yellow@2x.png | Bin 1058 -> 0 bytes .../styles/modena/HTMLEditor-Break.png | Bin 1049 -> 0 bytes .../styles/modena/HTMLEditor-Break@2x.png | Bin 1264 -> 0 bytes .../modena/HTMLEditor-Bullets-Black-rtl.png | Bin 3141 -> 0 bytes .../modena/HTMLEditor-Bullets-Black.png | Bin 969 -> 0 bytes .../HTMLEditor-Bullets-Black@2x-rtl.png | Bin 3249 -> 0 bytes .../modena/HTMLEditor-Bullets-Black@2x.png | Bin 1048 -> 0 bytes .../modena/HTMLEditor-Bullets-White-rtl.png | Bin 3148 -> 0 bytes .../modena/HTMLEditor-Bullets-White.png | Bin 976 -> 0 bytes .../HTMLEditor-Bullets-White@2x-rtl.png | Bin 3247 -> 0 bytes .../modena/HTMLEditor-Bullets-White@2x.png | Bin 1069 -> 0 bytes .../modena/HTMLEditor-Bullets-Yellow-rtl.png | Bin 3153 -> 0 bytes .../modena/HTMLEditor-Bullets-Yellow.png | Bin 1061 -> 0 bytes .../HTMLEditor-Bullets-Yellow@2x-rtl.png | Bin 3252 -> 0 bytes .../modena/HTMLEditor-Bullets-Yellow@2x.png | Bin 1124 -> 0 bytes .../styles/modena/HTMLEditor-Bullets-rtl.png | Bin 3183 -> 0 bytes .../styles/modena/HTMLEditor-Bullets.png | Bin 1108 -> 0 bytes .../modena/HTMLEditor-Bullets@2x-rtl.png | Bin 3335 -> 0 bytes .../styles/modena/HTMLEditor-Bullets@2x.png | Bin 1177 -> 0 bytes .../styles/modena/HTMLEditor-Center-Black.png | Bin 977 -> 0 bytes .../modena/HTMLEditor-Center-Black@2x.png | Bin 1018 -> 0 bytes .../styles/modena/HTMLEditor-Center-White.png | Bin 968 -> 0 bytes .../modena/HTMLEditor-Center-White@2x.png | Bin 1012 -> 0 bytes .../modena/HTMLEditor-Center-Yellow.png | Bin 1041 -> 0 bytes .../modena/HTMLEditor-Center-Yellow@2x.png | Bin 1069 -> 0 bytes .../styles/modena/HTMLEditor-Center.png | Bin 1062 -> 0 bytes .../styles/modena/HTMLEditor-Center@2x.png | Bin 1090 -> 0 bytes .../styles/modena/HTMLEditor-Copy-Black.png | Bin 1013 -> 0 bytes .../modena/HTMLEditor-Copy-Black@2x.png | Bin 1116 -> 0 bytes .../styles/modena/HTMLEditor-Copy-White.png | Bin 1015 -> 0 bytes .../modena/HTMLEditor-Copy-White@2x.png | Bin 1121 -> 0 bytes .../styles/modena/HTMLEditor-Copy-Yellow.png | Bin 1086 -> 0 bytes .../modena/HTMLEditor-Copy-Yellow@2x.png | Bin 1218 -> 0 bytes .../styles/modena/HTMLEditor-Copy.png | Bin 1159 -> 0 bytes .../styles/modena/HTMLEditor-Copy@2x.png | Bin 1286 -> 0 bytes .../styles/modena/HTMLEditor-Cut-Black.png | Bin 1107 -> 0 bytes .../styles/modena/HTMLEditor-Cut-Black@2x.png | Bin 1329 -> 0 bytes .../styles/modena/HTMLEditor-Cut-White.png | Bin 1131 -> 0 bytes .../styles/modena/HTMLEditor-Cut-White@2x.png | Bin 1358 -> 0 bytes .../styles/modena/HTMLEditor-Cut-Yellow.png | Bin 1204 -> 0 bytes .../modena/HTMLEditor-Cut-Yellow@2x.png | Bin 1460 -> 0 bytes .../styles/modena/HTMLEditor-Cut.png | Bin 1446 -> 0 bytes .../styles/modena/HTMLEditor-Cut@2x.png | Bin 2022 -> 0 bytes .../modena/HTMLEditor-Indent-Black-rtl.png | Bin 3179 -> 0 bytes .../styles/modena/HTMLEditor-Indent-Black.png | Bin 982 -> 0 bytes .../modena/HTMLEditor-Indent-Black@2x-rtl.png | Bin 3277 -> 0 bytes .../modena/HTMLEditor-Indent-Black@2x.png | Bin 1071 -> 0 bytes .../modena/HTMLEditor-Indent-White-rtl.png | Bin 3188 -> 0 bytes .../styles/modena/HTMLEditor-Indent-White.png | Bin 995 -> 0 bytes .../modena/HTMLEditor-Indent-White@2x-rtl.png | Bin 3293 -> 0 bytes .../modena/HTMLEditor-Indent-White@2x.png | Bin 1096 -> 0 bytes .../modena/HTMLEditor-Indent-Yellow-rtl.png | Bin 3191 -> 0 bytes .../modena/HTMLEditor-Indent-Yellow.png | Bin 1068 -> 0 bytes .../HTMLEditor-Indent-Yellow@2x-rtl.png | Bin 3292 -> 0 bytes .../modena/HTMLEditor-Indent-Yellow@2x.png | Bin 1157 -> 0 bytes .../styles/modena/HTMLEditor-Indent-rtl.png | Bin 3296 -> 0 bytes .../styles/modena/HTMLEditor-Indent.png | Bin 1174 -> 0 bytes .../modena/HTMLEditor-Indent@2x-rtl.png | Bin 3504 -> 0 bytes .../styles/modena/HTMLEditor-Indent@2x.png | Bin 1297 -> 0 bytes .../styles/modena/HTMLEditor-Italic-Black.png | Bin 1041 -> 0 bytes .../modena/HTMLEditor-Italic-Black@2x.png | Bin 1171 -> 0 bytes .../styles/modena/HTMLEditor-Italic-White.png | Bin 1037 -> 0 bytes .../modena/HTMLEditor-Italic-White@2x.png | Bin 1158 -> 0 bytes .../modena/HTMLEditor-Italic-Yellow.png | Bin 1112 -> 0 bytes .../modena/HTMLEditor-Italic-Yellow@2x.png | Bin 1237 -> 0 bytes .../styles/modena/HTMLEditor-Italic.png | Bin 1208 -> 0 bytes .../styles/modena/HTMLEditor-Italic@2x.png | Bin 1412 -> 0 bytes .../modena/HTMLEditor-Justify-Black.png | Bin 964 -> 0 bytes .../modena/HTMLEditor-Justify-Black@2x.png | Bin 987 -> 0 bytes .../modena/HTMLEditor-Justify-White.png | Bin 951 -> 0 bytes .../modena/HTMLEditor-Justify-White@2x.png | Bin 974 -> 0 bytes .../modena/HTMLEditor-Justify-Yellow.png | Bin 1021 -> 0 bytes .../modena/HTMLEditor-Justify-Yellow@2x.png | Bin 1045 -> 0 bytes .../styles/modena/HTMLEditor-Justify.png | Bin 1035 -> 0 bytes .../styles/modena/HTMLEditor-Justify@2x.png | Bin 1071 -> 0 bytes .../styles/modena/HTMLEditor-Left-Black.png | Bin 971 -> 0 bytes .../modena/HTMLEditor-Left-Black@2x.png | Bin 1004 -> 0 bytes .../styles/modena/HTMLEditor-Left-White.png | Bin 958 -> 0 bytes .../modena/HTMLEditor-Left-White@2x.png | Bin 996 -> 0 bytes .../styles/modena/HTMLEditor-Left-Yellow.png | Bin 1028 -> 0 bytes .../modena/HTMLEditor-Left-Yellow@2x.png | Bin 1051 -> 0 bytes .../styles/modena/HTMLEditor-Left.png | Bin 1046 -> 0 bytes .../styles/modena/HTMLEditor-Left@2x.png | Bin 1073 -> 0 bytes .../modena/HTMLEditor-Numbered-Black-rtl.png | Bin 2796 -> 0 bytes .../modena/HTMLEditor-Numbered-Black.png | Bin 978 -> 0 bytes .../HTMLEditor-Numbered-Black@2x-rtl.png | Bin 2890 -> 0 bytes .../modena/HTMLEditor-Numbered-Black@2x.png | Bin 1128 -> 0 bytes .../modena/HTMLEditor-Numbered-White-rtl.png | Bin 2807 -> 0 bytes .../modena/HTMLEditor-Numbered-White.png | Bin 1007 -> 0 bytes .../HTMLEditor-Numbered-White@2x-rtl.png | Bin 2900 -> 0 bytes .../modena/HTMLEditor-Numbered-White@2x.png | Bin 1123 -> 0 bytes .../modena/HTMLEditor-Numbered-Yellow-rtl.png | Bin 2807 -> 0 bytes .../modena/HTMLEditor-Numbered-Yellow.png | Bin 1083 -> 0 bytes .../HTMLEditor-Numbered-Yellow@2x-rtl.png | Bin 2905 -> 0 bytes .../modena/HTMLEditor-Numbered-Yellow@2x.png | Bin 1187 -> 0 bytes .../styles/modena/HTMLEditor-Numbered-rtl.png | Bin 2853 -> 0 bytes .../styles/modena/HTMLEditor-Numbered.png | Bin 1141 -> 0 bytes .../modena/HTMLEditor-Numbered@2x-rtl.png | Bin 3082 -> 0 bytes .../styles/modena/HTMLEditor-Numbered@2x.png | Bin 1293 -> 0 bytes .../modena/HTMLEditor-Outdent-Black-rtl.png | Bin 3194 -> 0 bytes .../modena/HTMLEditor-Outdent-Black.png | Bin 987 -> 0 bytes .../HTMLEditor-Outdent-Black@2x-rtl.png | Bin 3282 -> 0 bytes .../modena/HTMLEditor-Outdent-Black@2x.png | Bin 1075 -> 0 bytes .../modena/HTMLEditor-Outdent-White-rtl.png | Bin 3190 -> 0 bytes .../modena/HTMLEditor-Outdent-White.png | Bin 995 -> 0 bytes .../HTMLEditor-Outdent-White@2x-rtl.png | Bin 3288 -> 0 bytes .../modena/HTMLEditor-Outdent-White@2x.png | Bin 1126 -> 0 bytes .../modena/HTMLEditor-Outdent-Yellow-rtl.png | Bin 3194 -> 0 bytes .../modena/HTMLEditor-Outdent-Yellow.png | Bin 1092 -> 0 bytes .../HTMLEditor-Outdent-Yellow@2x-rtl.png | Bin 3291 -> 0 bytes .../modena/HTMLEditor-Outdent-Yellow@2x.png | Bin 1158 -> 0 bytes .../styles/modena/HTMLEditor-Outdent-rtl.png | Bin 2929 -> 0 bytes .../styles/modena/HTMLEditor-Outdent.png | Bin 1178 -> 0 bytes .../modena/HTMLEditor-Outdent@2x-rtl.png | Bin 3455 -> 0 bytes .../styles/modena/HTMLEditor-Outdent@2x.png | Bin 1300 -> 0 bytes .../styles/modena/HTMLEditor-Paste-Black.png | Bin 1048 -> 0 bytes .../modena/HTMLEditor-Paste-Black@2x.png | Bin 1202 -> 0 bytes .../styles/modena/HTMLEditor-Paste-White.png | Bin 1051 -> 0 bytes .../modena/HTMLEditor-Paste-White@2x.png | Bin 1227 -> 0 bytes .../styles/modena/HTMLEditor-Paste-Yellow.png | Bin 1109 -> 0 bytes .../modena/HTMLEditor-Paste-Yellow@2x.png | Bin 1302 -> 0 bytes .../styles/modena/HTMLEditor-Paste.png | Bin 1265 -> 0 bytes .../styles/modena/HTMLEditor-Paste@2x.png | Bin 1576 -> 0 bytes .../styles/modena/HTMLEditor-Right-Black.png | Bin 972 -> 0 bytes .../modena/HTMLEditor-Right-Black@2x.png | Bin 989 -> 0 bytes .../styles/modena/HTMLEditor-Right-White.png | Bin 960 -> 0 bytes .../modena/HTMLEditor-Right-White@2x.png | Bin 985 -> 0 bytes .../styles/modena/HTMLEditor-Right-Yellow.png | Bin 1031 -> 0 bytes .../modena/HTMLEditor-Right-Yellow@2x.png | Bin 1045 -> 0 bytes .../styles/modena/HTMLEditor-Right.png | Bin 1035 -> 0 bytes .../styles/modena/HTMLEditor-Right@2x.png | Bin 1075 -> 0 bytes .../modena/HTMLEditor-Strikethrough-Black.png | Bin 1035 -> 0 bytes .../HTMLEditor-Strikethrough-Black@2x.png | Bin 1134 -> 0 bytes .../modena/HTMLEditor-Strikethrough-White.png | Bin 1049 -> 0 bytes .../HTMLEditor-Strikethrough-White@2x.png | Bin 1139 -> 0 bytes .../HTMLEditor-Strikethrough-Yellow.png | Bin 1134 -> 0 bytes .../HTMLEditor-Strikethrough-Yellow@2x.png | Bin 1231 -> 0 bytes .../modena/HTMLEditor-Strikethrough.png | Bin 1214 -> 0 bytes .../modena/HTMLEditor-Strikethrough@2x.png | Bin 1409 -> 0 bytes .../modena/HTMLEditor-Text-Color-Black.png | Bin 1065 -> 0 bytes .../modena/HTMLEditor-Text-Color-Black@2x.png | Bin 1187 -> 0 bytes .../modena/HTMLEditor-Text-Color-White.png | Bin 1078 -> 0 bytes .../modena/HTMLEditor-Text-Color-White@2x.png | Bin 1253 -> 0 bytes .../modena/HTMLEditor-Text-Color-Yellow.png | Bin 1150 -> 0 bytes .../HTMLEditor-Text-Color-Yellow@2x.png | Bin 1305 -> 0 bytes .../styles/modena/HTMLEditor-Text-Color.png | Bin 1272 -> 0 bytes .../modena/HTMLEditor-Text-Color@2x.png | Bin 1567 -> 0 bytes .../modena/HTMLEditor-Underline-Black.png | Bin 1060 -> 0 bytes .../modena/HTMLEditor-Underline-Black@2x.png | Bin 1183 -> 0 bytes .../modena/HTMLEditor-Underline-White.png | Bin 1066 -> 0 bytes .../modena/HTMLEditor-Underline-White@2x.png | Bin 1164 -> 0 bytes .../modena/HTMLEditor-Underline-Yellow.png | Bin 1138 -> 0 bytes .../modena/HTMLEditor-Underline-Yellow@2x.png | Bin 1253 -> 0 bytes .../styles/modena/HTMLEditor-Underline.png | Bin 1260 -> 0 bytes .../styles/modena/HTMLEditor-Underline@2x.png | Bin 1492 -> 0 bytes .../styles/modena/dialog-confirm.png | Bin 5830 -> 0 bytes .../styles/modena/dialog-confirm@2x.png | Bin 11665 -> 0 bytes .../resources/styles/modena/dialog-error.png | Bin 5116 -> 0 bytes .../styles/modena/dialog-error@2x.png | Bin 9643 -> 0 bytes .../styles/modena/dialog-fewer-details.png | Bin 3588 -> 0 bytes .../styles/modena/dialog-fewer-details@2x.png | Bin 4950 -> 0 bytes .../styles/modena/dialog-information.png | Bin 5571 -> 0 bytes .../styles/modena/dialog-information@2x.png | Bin 10903 -> 0 bytes .../styles/modena/dialog-more-details.png | Bin 3593 -> 0 bytes .../styles/modena/dialog-more-details@2x.png | Bin 4955 -> 0 bytes .../styles/modena/dialog-warning.png | Bin 5080 -> 0 bytes .../styles/modena/dialog-warning@2x.png | Bin 9087 -> 0 bytes .../styles/modena/pattern-transparent.png | Bin 1018 -> 0 bytes README.md | 37 +- docs/english_interface.html | 33 +- 314 files changed, 3942 insertions(+), 5176 deletions(-) rename MyBox/src/main/java/mara/mybox/{tools => image}/FxmlImageTools.java (88%) create mode 100644 MyBox/src/main/java/mara/mybox/image/ImageAnalyzeTools.java create mode 100644 MyBox/src/main/java/mara/mybox/image/ImageBlendTools.java delete mode 100644 MyBox/src/main/resources/caspian.css create mode 100644 MyBox/src/main/resources/docs/AboutColorDistance_en.html create mode 100644 MyBox/src/main/resources/docs/AboutColorDistance_zh.html create mode 100644 MyBox/src/main/resources/docs/AboutImageBlending_en.html create mode 100644 MyBox/src/main/resources/docs/AboutImageBlending_zh.html create mode 100644 MyBox/src/main/resources/docs/AboutImageGrayscale_en.html create mode 100644 MyBox/src/main/resources/docs/AboutImageGrayscale_zh.html create mode 100644 MyBox/src/main/resources/docs/HowPackExe_en.html create mode 100644 MyBox/src/main/resources/docs/HowPackExe_zh.html rename MyBox/src/main/resources/docs/{ImageHelp.html => ImageCompressionType_en.html} (97%) create mode 100644 MyBox/src/main/resources/docs/ImageCompressionType_zh.html create mode 100644 MyBox/src/main/resources/docs/ImageMetaData_en.html create mode 100644 MyBox/src/main/resources/docs/ImageMetaData_zh.html create mode 100644 MyBox/src/main/resources/docs/ImageSepia_en.html create mode 100644 MyBox/src/main/resources/docs/ImageSepia_zh.html create mode 100644 MyBox/src/main/resources/docs/Java2D_en.html create mode 100644 MyBox/src/main/resources/docs/Java2D_zh.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_en.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_main_en.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_main_zh.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_nav_en.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_nav_zh.html create mode 100644 MyBox/src/main/resources/docs/mybox_help_zh.html delete mode 100644 MyBox/src/main/resources/docs/srcHelp.html delete mode 100644 MyBox/src/main/resources/fxml/ImageBlend.fxml create mode 100644 MyBox/src/main/resources/fxml/ImagesBlend.fxml create mode 100644 MyBox/src/main/resources/img/BinF.png create mode 100644 MyBox/src/main/resources/img/FinB.png create mode 100644 MyBox/src/main/resources/img/ab_in.png create mode 100644 MyBox/src/main/resources/img/ba_in.png delete mode 100644 MyBox/src/main/resources/styles/caspian/center-btn-selected.png delete mode 100644 MyBox/src/main/resources/styles/caspian/center-btn.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-confirm.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-confirm@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-error.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-error@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-fewer-details.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-fewer-details@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-information.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-information@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-more-details.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-more-details@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-warning.png delete mode 100644 MyBox/src/main/resources/styles/caspian/dialog-warning@2x.png delete mode 100644 MyBox/src/main/resources/styles/caspian/fxvk-backspace-button.png delete mode 100644 MyBox/src/main/resources/styles/caspian/fxvk-capslock-button.png delete mode 100644 MyBox/src/main/resources/styles/caspian/fxvk-enter-button.png delete mode 100644 MyBox/src/main/resources/styles/caspian/fxvk-shift-button.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/backspace-icon.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/capslock-icon.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/enter-icon.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/shift-icon.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-dark-pressed.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-dark.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-hide.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-light-pressed.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-light.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-medium-pressed.png delete mode 100644 MyBox/src/main/resources/styles/caspian/images/vk-medium.png delete mode 100644 MyBox/src/main/resources/styles/caspian/left-btn-selected.png delete mode 100644 MyBox/src/main/resources/styles/caspian/left-btn.png delete mode 100644 MyBox/src/main/resources/styles/caspian/menu-shadow.png delete mode 100644 MyBox/src/main/resources/styles/caspian/pattern-transparent.png delete mode 100644 MyBox/src/main/resources/styles/caspian/right-btn-selected.png delete mode 100644 MyBox/src/main/resources/styles/caspian/right-btn.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Background-Color@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bold@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Break@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Black-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Black@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-White-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-White@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Yellow-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Yellow@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Bullets@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Center@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Copy@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Cut@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Black-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Black@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-White-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-White@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Yellow-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Yellow@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Indent@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Italic@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Justify@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Left@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Black-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Black@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-White-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-White@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Yellow-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Yellow@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Numbered@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Black-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Black@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-White-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-White@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Yellow-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Yellow@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent@2x-rtl.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Outdent@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Paste@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Right@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Strikethrough@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Text-Color@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-Black.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-Black@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-White.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-White@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-Yellow.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline-Yellow@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline.png delete mode 100644 MyBox/src/main/resources/styles/modena/HTMLEditor-Underline@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-confirm.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-confirm@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-error.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-error@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-fewer-details.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-fewer-details@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-information.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-information@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-more-details.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-more-details@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-warning.png delete mode 100644 MyBox/src/main/resources/styles/modena/dialog-warning@2x.png delete mode 100644 MyBox/src/main/resources/styles/modena/pattern-transparent.png diff --git a/MyBox/pom.xml b/MyBox/pom.xml index 7109b7872..96fb5de48 100644 --- a/MyBox/pom.xml +++ b/MyBox/pom.xml @@ -4,7 +4,7 @@ mara MyBox - 3.9 + 4.0 jar MyBox diff --git a/MyBox/src/main/java/mara/mybox/controller/AboutController.java b/MyBox/src/main/java/mara/mybox/controller/AboutController.java index cc2da8bb2..19babfc64 100644 --- a/MyBox/src/main/java/mara/mybox/controller/AboutController.java +++ b/MyBox/src/main/java/mara/mybox/controller/AboutController.java @@ -28,7 +28,7 @@ protected void initializeNext() { date.setText(CommonValues.AppVersionDate); userGuideLink.setText("https://github.com/Mararsh/MyBox/releases/download/v" + CommonValues.AppVersion + "/MyBox-UserGuide-" + CommonValues.AppVersion - + "-" + AppVaribles.getLanguage() + ".pdf"); + + "-Overview-" + AppVaribles.getLanguage() + ".pdf"); FxmlTools.miao8(); diff --git a/MyBox/src/main/java/mara/mybox/controller/HtmlEditorController.java b/MyBox/src/main/java/mara/mybox/controller/HtmlEditorController.java index 752461186..9bf059edb 100644 --- a/MyBox/src/main/java/mara/mybox/controller/HtmlEditorController.java +++ b/MyBox/src/main/java/mara/mybox/controller/HtmlEditorController.java @@ -72,7 +72,7 @@ import mara.mybox.objects.CommonValues; import mara.mybox.tools.FileTools; import static mara.mybox.tools.FxmlTools.badStyle; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import mara.mybox.tools.NetworkTools; import static mara.mybox.tools.NetworkTools.checkWeiboPassport; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureAddMarginsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureAddMarginsController.java index 6961f2672..68fd6b535 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureAddMarginsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureAddMarginsController.java @@ -15,7 +15,7 @@ import javafx.stage.Modality; import static mara.mybox.controller.BaseController.logger; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import static mara.mybox.tools.FxmlTools.badStyle; /** diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureArcController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureArcController.java index fed225bce..70aca9044 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureArcController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureArcController.java @@ -18,7 +18,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.objects.AppVaribles; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import static mara.mybox.tools.FxmlTools.badStyle; /** diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchAddMarginsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchAddMarginsController.java index 23b72b0a0..aa07341f0 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchAddMarginsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchAddMarginsController.java @@ -14,7 +14,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.image.ImageConvertTools; import mara.mybox.objects.AppVaribles; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import static mara.mybox.tools.FxmlTools.badStyle; /** diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchArcController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchArcController.java index 9b680a12c..05bd45f25 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchArcController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchArcController.java @@ -18,7 +18,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.image.ImageConvertTools; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchColorController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchColorController.java index e82a71812..553614f40 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchColorController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchColorController.java @@ -116,7 +116,6 @@ private void checkColorOperationType() { if (colorInput.getText().trim().isEmpty()) { colorInput.setText("10"); } - increaseRadio.setDisable(false); } else if (getMessage("Saturation").equals(selected.getText())) { colorOperationType = ColorOperationType.Sauration; @@ -180,6 +179,46 @@ private void checkColorOperationType() { colorInput.setText("10"); } + } else if (getMessage("Yellow").equals(selected.getText())) { + colorOperationType = ColorOperationType.Yellow; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + + } else if (getMessage("Cyan").equals(selected.getText())) { + colorOperationType = ColorOperationType.Cyan; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + + } else if (getMessage("Magenta").equals(selected.getText())) { + colorOperationType = ColorOperationType.Magenta; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + + } else if (getMessage("RGB").equals(selected.getText())) { + colorOperationType = ColorOperationType.RGB; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + } } @@ -241,6 +280,18 @@ protected BufferedImage handleImage(BufferedImage source) { } else if (colorOperationType == ColorOperationType.Blue) { target = ImageConvertTools.changeBlue(source, value); + } else if (colorOperationType == ColorOperationType.Yellow) { + target = ImageConvertTools.changeYellow(source, value); + + } else if (colorOperationType == ColorOperationType.Cyan) { + target = ImageConvertTools.changeCyan(source, value); + + } else if (colorOperationType == ColorOperationType.Magenta) { + target = ImageConvertTools.changeMagenta(source, value); + + } else if (colorOperationType == ColorOperationType.RGB) { + target = ImageConvertTools.changeRGB(source, value); + } return target; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchCutMarginsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchCutMarginsController.java index 80e7de197..be8257eba 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchCutMarginsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchCutMarginsController.java @@ -18,7 +18,7 @@ import mara.mybox.image.ImageConvertTools; import mara.mybox.objects.AppVaribles; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchEffectsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchEffectsController.java index 5cb76da09..7f8668c58 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchEffectsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchEffectsController.java @@ -6,7 +6,9 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; +import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.TextField; import javafx.scene.control.Toggle; @@ -28,18 +30,22 @@ */ public class ImageManufactureBatchEffectsController extends ImageManufactureBatchController { - protected int threadholding, threadholdingMin, threadholdingMax, effectType, blurRadius, posterizingSize; + protected int threadholding, threadholdingMin, threadholdingMax, effectType, intValue, direction; @FXML protected ToggleGroup effectsGroup; @FXML - protected HBox blurBox, thresholdingBox; + protected HBox thresholdingBox; @FXML - protected ComboBox blurRadiusBox, posterizingBox; + protected ComboBox intBox, stringBox; @FXML protected TextField thresholdingInput, thresholdingMinInput, thresholdingMaxInput; @FXML protected RadioButton thresholdingRadio; + @FXML + protected Label intLabel, stringLabel; + @FXML + protected CheckBox grayCheck; public ImageManufactureBatchEffectsController() { @@ -70,51 +76,69 @@ protected void initOptionsSection() { @Override public void changed(ObservableValue ov, Toggle old_toggle, Toggle new_toggle) { - checkEffetcssOperationType(); + checkEffetcsOperationType(); } }); - checkEffetcssOperationType(); + checkEffetcsOperationType(); - blurRadiusBox.getItems().addAll(Arrays.asList("10", "5", "3", "8", "15", "20", "30")); - blurRadiusBox.valueProperty().addListener(new ChangeListener() { + intBox.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, String oldValue, String newValue) { + int defaultValue = 0; + if (effectType == EffectsOperationType.Blur) { + defaultValue = 1; + } else if (effectType == EffectsOperationType.Posterizing) { + defaultValue = 32; + } else if (effectType == EffectsOperationType.Emboss) { + defaultValue = 3; + } try { - blurRadius = Integer.valueOf(newValue); - if (blurRadius > 0) { - blurRadiusBox.getEditor().setStyle(null); - + String v = newValue; + int pos = v.indexOf(" "); + if (pos > 0) { + v = v.substring(0, pos); + } + intValue = Integer.valueOf(v); + if (intValue > 0) { + intBox.getEditor().setStyle(null); } else { - blurRadius = 1; - blurRadiusBox.getEditor().setStyle(badStyle); + intValue = defaultValue; + intBox.getEditor().setStyle(badStyle); } } catch (Exception e) { - blurRadius = 1; - blurRadiusBox.getEditor().setStyle(badStyle); + intValue = defaultValue; + intBox.getEditor().setStyle(badStyle); } } }); - blurRadiusBox.getSelectionModel().select(0); - posterizingBox.getItems().addAll(Arrays.asList("64", "32", "128", "16")); - posterizingBox.valueProperty().addListener(new ChangeListener() { + stringBox.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, String oldValue, String newValue) { - try { - posterizingSize = Integer.valueOf(newValue); - if (posterizingSize > 0) { - posterizingBox.getEditor().setStyle(null); - } else { - posterizingSize = 32; - posterizingBox.getEditor().setStyle(badStyle); - } - } catch (Exception e) { - posterizingSize = 32; - posterizingBox.getEditor().setStyle(badStyle); + if (newValue == null || newValue.trim().isEmpty()) { + return; + } + if (getMessage("Top").equals(newValue)) { + direction = ImageConvertTools.Direction.Top; + } else if (getMessage("Bottom").equals(newValue)) { + direction = ImageConvertTools.Direction.Bottom; + } else if (getMessage("Left").equals(newValue)) { + direction = ImageConvertTools.Direction.Top; + } else if (getMessage("Right").equals(newValue)) { + direction = ImageConvertTools.Direction.Right; + } else if (getMessage("LeftTop").equals(newValue)) { + direction = ImageConvertTools.Direction.LeftTop; + } else if (getMessage("RightBottom").equals(newValue)) { + direction = ImageConvertTools.Direction.RightBottom; + } else if (getMessage("LeftBottom").equals(newValue)) { + direction = ImageConvertTools.Direction.LeftBottom; + } else if (getMessage("RightTop").equals(newValue)) { + direction = ImageConvertTools.Direction.RightTop; + } else { + direction = ImageConvertTools.Direction.Top; } } }); - posterizingBox.getSelectionModel().select(0); Tooltip tips = new Tooltip("0~255"); // tips.setFont(new Font(16)); @@ -192,24 +216,57 @@ private void checkThresholding() { } } - private void checkEffetcssOperationType() { - blurBox.setDisable(true); + private void checkEffetcsOperationType() { + intLabel.setText(""); + intBox.setDisable(true); + stringLabel.setText(""); + stringBox.setDisable(true); thresholdingBox.setDisable(true); - posterizingBox.setDisable(true); thresholdingInput.setStyle(null); thresholdingMinInput.setStyle(null); thresholdingMaxInput.setStyle(null); + grayCheck.setDisable(true); RadioButton selected = (RadioButton) effectsGroup.getSelectedToggle(); if (getMessage("Blur").equals(selected.getText())) { effectType = EffectsOperationType.Blur; - blurBox.setDisable(false); + intLabel.setText(getMessage("Radius")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("10", "5", "3", "8", "15", "20", "30")); + intBox.setEditable(true); + intValue = 10; + intBox.getSelectionModel().select("10"); } else if (getMessage("Sharpen").equals(selected.getText())) { effectType = EffectsOperationType.Sharpen; } else if (getMessage("EdgeDetection").equals(selected.getText())) { effectType = EffectsOperationType.EdgeDetect; + } else if (getMessage("Emboss").equals(selected.getText())) { + effectType = EffectsOperationType.Emboss; + intLabel.setText(getMessage("Radius")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("3", "5")); + intBox.setEditable(false); + intValue = 3; + intBox.getSelectionModel().select("3"); + stringLabel.setText(getMessage("Direction")); + stringBox.setDisable(false); + stringBox.getItems().clear(); + stringBox.getItems().addAll(Arrays.asList(getMessage("Top"), getMessage("Bottom"), + getMessage("Left"), getMessage("Right"), + getMessage("LeftTop"), getMessage("RightBottom"), + getMessage("LeftBottom"), getMessage("RightTop"))); + direction = ImageConvertTools.Direction.Top; + stringBox.getSelectionModel().select(getMessage("Top")); + grayCheck.setDisable(false); } else if (getMessage("Posterizing").equals(selected.getText())) { effectType = EffectsOperationType.Posterizing; - posterizingBox.setDisable(false); + intLabel.setText(getMessage("Size")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("64", "32", "128", "16")); + intBox.setEditable(false); + intBox.getSelectionModel().select("64"); } else if (getMessage("Thresholding").equals(selected.getText())) { effectType = EffectsOperationType.Thresholding; thresholdingBox.setDisable(false); @@ -222,7 +279,7 @@ protected BufferedImage handleImage(BufferedImage source) { try { BufferedImage target = null; if (effectType == EffectsOperationType.Blur) { - target = ImageConvertTools.blurImage(source, blurRadius); + target = ImageConvertTools.blurImage(source, intValue); } else if (effectType == EffectsOperationType.Sharpen) { target = ImageConvertTools.sharpenImage(source); @@ -234,7 +291,11 @@ protected BufferedImage handleImage(BufferedImage source) { target = ImageConvertTools.thresholding(ImageConvertTools.removeAlpha(source), threadholding, threadholdingMin, threadholdingMax); } else if (effectType == EffectsOperationType.Posterizing) { - target = ImageConvertTools.posterizing(ImageConvertTools.removeAlpha(source), posterizingSize); + target = ImageConvertTools.posterizing(ImageConvertTools.removeAlpha(source), intValue); + + } else if (effectType == EffectsOperationType.Emboss) { + target = ImageConvertTools.embossImage(ImageConvertTools.removeAlpha(source), direction, intValue, grayCheck.isSelected()); + } return target; } catch (Exception e) { diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchFiltersController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchFiltersController.java index f47a69921..22bf56ac1 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchFiltersController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchFiltersController.java @@ -5,6 +5,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; +import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.Slider; import javafx.scene.control.TextField; @@ -26,16 +27,18 @@ */ public class ImageManufactureBatchFiltersController extends ImageManufactureBatchController { - private int threshold, filtersOperationType; + private int intValue, filtersOperationType; @FXML private ToggleGroup filtersGroup; @FXML - private Slider binarySlider; + private Slider valueSlider; @FXML private HBox bwBox; @FXML - private TextField thresholdInput; + private TextField valueInput; + @FXML + protected Label valueLabel, unitLabel, emptyLabel; public ImageManufactureBatchFiltersController() { @@ -48,7 +51,7 @@ protected void initializeNext2() { operationBarController.startButton.disableProperty().bind(Bindings.isEmpty(targetPathInput.textProperty()) .or(targetPathInput.styleProperty().isEqualTo(badStyle)) .or(Bindings.isEmpty(sourceFilesInformation)) - .or(thresholdInput.styleProperty().isEqualTo(badStyle)) + .or(valueInput.styleProperty().isEqualTo(badStyle)) ); } catch (Exception e) { @@ -69,19 +72,19 @@ public void changed(ObservableValue ov, }); checkFiltersType(); - binarySlider.valueProperty().addListener(new ChangeListener() { + valueSlider.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - threshold = newValue.intValue(); - thresholdInput.setText(threshold + ""); + intValue = newValue.intValue(); + valueInput.setText(intValue + ""); } }); - thresholdInput.textProperty().addListener(new ChangeListener() { + valueInput.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { - checkThresholdInput(); + checkValueInput(); } }); @@ -92,12 +95,27 @@ public void changed(ObservableValue observable, private void checkFiltersType() { bwBox.setDisable(true); - thresholdInput.setStyle(null); + valueInput.setStyle(null); + valueLabel.setText(""); + valueSlider.setDisable(true); + valueInput.setDisable(true); + valueInput.setStyle(null); + unitLabel.setText(""); + emptyLabel.setText(""); RadioButton selected = (RadioButton) filtersGroup.getSelectedToggle(); if (getMessage("BlackOrWhite").equals(selected.getText())) { filtersOperationType = FiltersOperationType.BlackOrWhite; bwBox.setDisable(false); - checkThresholdInput(); + valueLabel.setText(getMessage("Threshold")); + valueSlider.setDisable(false); + valueSlider.setMax(99); + valueSlider.setMin(1); + valueSlider.setBlockIncrement(1); + valueSlider.setValue(50); + valueInput.setDisable(false); + unitLabel.setText("%"); + checkValueInput(); + emptyLabel.setText(getMessage("EmptyForDefault")); } else if (getMessage("Gray").equals(selected.getText())) { filtersOperationType = FiltersOperationType.Gray; } else if (getMessage("Invert").equals(selected.getText())) { @@ -114,26 +132,38 @@ private void checkFiltersType() { filtersOperationType = FiltersOperationType.GreenInvert; } else if (getMessage("BlueInvert").equals(selected.getText())) { filtersOperationType = FiltersOperationType.BlueInvert; + } else if (getMessage("Sepia").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Sepia; + bwBox.setDisable(false); + valueLabel.setText(getMessage("Intensity")); + valueSlider.setDisable(false); + valueSlider.setMax(255); + valueSlider.setMin(0); + valueSlider.setBlockIncrement(1); + valueSlider.setValue(80); + valueInput.setDisable(false); + checkValueInput(); } } - private void checkThresholdInput() { + private void checkValueInput() { try { - if (thresholdInput.getText().trim().isEmpty()) { - thresholdInput.setStyle(null); - threshold = -1; + if (filtersOperationType == FiltersOperationType.BlackOrWhite + && valueInput.getText().trim().isEmpty()) { + valueInput.setStyle(null); + intValue = -1; return; } - threshold = Integer.valueOf(thresholdInput.getText()); - if (threshold >= 0 && threshold <= binarySlider.getMax()) { - thresholdInput.setStyle(null); - binarySlider.setValue(threshold); + intValue = Integer.valueOf(valueInput.getText()); + if (intValue >= 0 && intValue <= valueSlider.getMax()) { + valueInput.setStyle(null); + valueSlider.setValue(intValue); } else { - thresholdInput.setStyle(badStyle); + valueInput.setStyle(badStyle); } } catch (Exception e) { - thresholdInput.setStyle(badStyle); + valueInput.setStyle(badStyle); } } @@ -149,10 +179,10 @@ protected BufferedImage handleImage(BufferedImage source) { } else if (filtersOperationType == FiltersOperationType.BlackOrWhite) { - if (threshold < 0) { + if (intValue < 0) { target = ImageGrayTools.color2Binary(source); } else { - target = ImageGrayTools.color2BinaryWithPercentage(source, threshold); + target = ImageGrayTools.color2BinaryWithPercentage(source, intValue); } } else if (filtersOperationType == FiltersOperationType.Red) { @@ -173,6 +203,9 @@ protected BufferedImage handleImage(BufferedImage source) { } else if (filtersOperationType == FiltersOperationType.BlueInvert) { target = ImageConvertTools.makeBlueInvert(source); + } else if (filtersOperationType == FiltersOperationType.Sepia) { + target = ImageConvertTools.sepiaImage(source, intValue); + } return target; } catch (Exception e) { diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchReplaceColorController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchReplaceColorController.java index 23c08ef7c..46c6c06cf 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchReplaceColorController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchReplaceColorController.java @@ -20,7 +20,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.image.ImageConvertTools; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchShadowController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchShadowController.java index 6dd4dc954..6b3f3e92e 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchShadowController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchShadowController.java @@ -18,7 +18,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.image.ImageConvertTools; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchWatermarkController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchWatermarkController.java index 36b7162b7..dc58ee882 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchWatermarkController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureBatchWatermarkController.java @@ -24,7 +24,7 @@ import mara.mybox.image.ImageConvertTools; import mara.mybox.objects.AppVaribles; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import static mara.mybox.tools.FxmlTools.badStyle; /** diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureColorController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureColorController.java index 7c5a9e13c..1c8a2415c 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureColorController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureColorController.java @@ -22,7 +22,7 @@ import mara.mybox.objects.ImageScope; import mara.mybox.objects.ImageScope.AreaScopeType; import mara.mybox.objects.ImageScope.OperationType; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; @@ -59,6 +59,10 @@ public static class ColorOperationType { public static int Red = 4; public static int Green = 5; public static int Blue = 6; + public static int Yellow = 7; + public static int Cyan = 8; + public static int Magenta = 9; + public static int RGB = 10; } @@ -218,6 +222,50 @@ private void checkColorOperationType() { } colorDecreaseButton.setVisible(true); colorIncreaseButton.setText(getMessage("Increase")); + } else if (getMessage("Yellow").equals(selected.getText())) { + colorOperationType = ColorOperationType.Yellow; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + colorDecreaseButton.setVisible(true); + colorIncreaseButton.setText(getMessage("Increase")); + } else if (getMessage("Cyan").equals(selected.getText())) { + colorOperationType = ColorOperationType.Cyan; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + colorDecreaseButton.setVisible(true); + colorIncreaseButton.setText(getMessage("Increase")); + } else if (getMessage("Magenta").equals(selected.getText())) { + colorOperationType = ColorOperationType.Magenta; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + colorDecreaseButton.setVisible(true); + colorIncreaseButton.setText(getMessage("Increase")); + } else if (getMessage("RGB").equals(selected.getText())) { + colorOperationType = ColorOperationType.RGB; + colorSlider.setMax(255); + colorSlider.setMin(1); + colorSlider.setBlockIncrement(1); + colorUnit.setText(""); + if (colorInput.getText().trim().isEmpty()) { + colorInput.setText("10"); + } + colorDecreaseButton.setVisible(true); + colorIncreaseButton.setText(getMessage("Increase")); } } @@ -237,65 +285,41 @@ private void checkColorInput() { @FXML public void increaseColor() { - Task increaseTask = new Task() { - @Override - protected Void call() throws Exception { - final Image newImage; - if (colorOperationType == ColorOperationType.Brightness) { - newImage = FxmlImageTools.changeBrightness(values.getCurrentImage(), colorValue / 100.0f, colorScope); - } else if (colorOperationType == ColorOperationType.Sauration) { - newImage = FxmlImageTools.changeSaturate(values.getCurrentImage(), colorValue / 100.0f, colorScope); - } else if (colorOperationType == ColorOperationType.Hue) { - newImage = FxmlImageTools.changeHue(values.getCurrentImage(), colorValue, colorScope); - } else if (colorOperationType == ColorOperationType.Opacity) { - newImage = FxmlImageTools.setOpacity(values.getCurrentImage(), colorValue / 100.0f, colorScope); - } else if (colorOperationType == ColorOperationType.Red) { - newImage = FxmlImageTools.changeRed(values.getCurrentImage(), colorValue / 255.0, colorScope); - } else if (colorOperationType == ColorOperationType.Green) { - newImage = FxmlImageTools.changeGreen(values.getCurrentImage(), colorValue / 255.0, colorScope); - } else if (colorOperationType == ColorOperationType.Blue) { - newImage = FxmlImageTools.changeBlue(values.getCurrentImage(), colorValue / 255.0, colorScope); - } else { - return null; - } - recordImageHistory(ImageOperationType.Color, newImage); - Platform.runLater(new Runnable() { - @Override - public void run() { - values.setUndoImage(values.getCurrentImage()); - values.setCurrentImage(newImage); - imageView.setImage(newImage); - setImageChanged(true); - } - }); - return null; - } - }; - openHandlingStage(increaseTask, Modality.WINDOW_MODAL); - Thread thread = new Thread(increaseTask); - thread.setDaemon(true); - thread.start(); - + applyChange(colorValue); } @FXML public void decreaseColor() { - Task decreaseTask = new Task() { + applyChange(0 - colorValue); + } + + private void applyChange(final int change) { + Task increaseTask = new Task() { @Override protected Void call() throws Exception { final Image newImage; if (colorOperationType == ColorOperationType.Brightness) { - newImage = FxmlImageTools.changeBrightness(values.getCurrentImage(), 0.0f - colorValue / 100.0f, colorScope); + newImage = FxmlImageTools.changeBrightness(values.getCurrentImage(), change / 100.0f, colorScope); } else if (colorOperationType == ColorOperationType.Sauration) { - newImage = FxmlImageTools.changeSaturate(values.getCurrentImage(), 0.0f - colorValue / 100.0f, colorScope); + newImage = FxmlImageTools.changeSaturate(values.getCurrentImage(), change / 100.0f, colorScope); } else if (colorOperationType == ColorOperationType.Hue) { - newImage = FxmlImageTools.changeHue(values.getCurrentImage(), 0 - colorValue, colorScope); + newImage = FxmlImageTools.changeHue(values.getCurrentImage(), change, colorScope); + } else if (colorOperationType == ColorOperationType.Opacity) { + newImage = FxmlImageTools.setOpacity(values.getCurrentImage(), change / 100.0f, colorScope); } else if (colorOperationType == ColorOperationType.Red) { - newImage = FxmlImageTools.changeRed(values.getCurrentImage(), 0.0 - colorValue / 255.0, colorScope); + newImage = FxmlImageTools.changeRed(values.getCurrentImage(), change / 255.0, colorScope); } else if (colorOperationType == ColorOperationType.Green) { - newImage = FxmlImageTools.changeGreen(values.getCurrentImage(), 0.0 - colorValue / 255.0, colorScope); + newImage = FxmlImageTools.changeGreen(values.getCurrentImage(), change / 255.0, colorScope); } else if (colorOperationType == ColorOperationType.Blue) { - newImage = FxmlImageTools.changeBlue(values.getCurrentImage(), 0.0 - colorValue / 255.0, colorScope); + newImage = FxmlImageTools.changeBlue(values.getCurrentImage(), change / 255.0, colorScope); + } else if (colorOperationType == ColorOperationType.Yellow) { + newImage = FxmlImageTools.changeYellow(values.getCurrentImage(), change / 255.0, colorScope); + } else if (colorOperationType == ColorOperationType.Cyan) { + newImage = FxmlImageTools.changeCyan(values.getCurrentImage(), change / 255.0, colorScope); + } else if (colorOperationType == ColorOperationType.Magenta) { + newImage = FxmlImageTools.changeMagenta(values.getCurrentImage(), change / 255.0, colorScope); + } else if (colorOperationType == ColorOperationType.RGB) { + newImage = FxmlImageTools.changeRGB(values.getCurrentImage(), change / 255.0, colorScope); } else { return null; } @@ -312,8 +336,8 @@ public void run() { return null; } }; - openHandlingStage(decreaseTask, Modality.WINDOW_MODAL); - Thread thread = new Thread(decreaseTask); + openHandlingStage(increaseTask, Modality.WINDOW_MODAL); + Thread thread = new Thread(increaseTask); thread.setDaemon(true); thread.start(); diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureController.java index 11a27fd83..24fe45def 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureController.java @@ -60,7 +60,7 @@ import mara.mybox.tools.DateTools; import mara.mybox.tools.FileTools; import mara.mybox.tools.FxmlTools; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; /** * @Author Mara @@ -218,7 +218,7 @@ public void changed(ObservableValue ov, Number oldValue, Number newValue) { setImage(new File(imageHistories.get(index))); } }); - hisBox.setVisibleRowCount(AppVaribles.getConfigInt("MaxImageHistories", 20)); + hisBox.setVisibleRowCount(15); hisBox.setDisable(!AppVaribles.getConfigBoolean("ImageHis")); } catch (Exception e) { @@ -402,7 +402,7 @@ protected void setImageChanged(boolean imageChanged) { } protected void updateHisBox() { - if (!AppVaribles.getConfigBoolean("ImageHis")) { + if (!AppVaribles.getConfigBoolean("ImageHis") || values.getSourceFile() == null) { hisBox.setDisable(true); return; } @@ -697,6 +697,7 @@ protected void initInterface() { imageView.setCursor(Cursor.OPEN_HAND); setBottomLabel(); setImageChanged(values.isImageChanged()); + updateHisBox(); showRefCheck.setSelected(values.isShowRef()); @@ -1059,7 +1060,6 @@ protected void setScopePane() { if (showScopeCheck == null) { return; } - if (values.getCurrentScope() == null) { values.setScopeImage(null); values.setScopeInfo(null); diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCropController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCropController.java index 920ae6330..a3f2a95fb 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCropController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCropController.java @@ -19,7 +19,7 @@ import javafx.stage.Modality; import static mara.mybox.controller.BaseController.logger; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCutMarginsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCutMarginsController.java index 04069e40f..e06d5ad8e 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCutMarginsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureCutMarginsController.java @@ -23,7 +23,7 @@ import mara.mybox.objects.AppVaribles; import static mara.mybox.objects.AppVaribles.getMessage; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureEffectsController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureEffectsController.java index bc506893b..3d06856fd 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureEffectsController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureEffectsController.java @@ -7,7 +7,9 @@ import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.TextField; import javafx.scene.control.Toggle; @@ -18,8 +20,9 @@ import javafx.scene.text.Font; import javafx.stage.Modality; import static mara.mybox.controller.BaseController.logger; +import mara.mybox.image.ImageConvertTools.Direction; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; @@ -31,13 +34,13 @@ */ public class ImageManufactureEffectsController extends ImageManufactureController { - protected int effectType, blurRadius, posterizingSize; + protected int effectType, intValue, direction; protected int threadholding, threadholdingSmall, threadholdingBig; @FXML protected ToggleGroup effectsGroup; @FXML - protected ComboBox blurRadiusBox, posterizingBox; + protected ComboBox intBox, stringBox; @FXML protected TextField thresholdingInput, thresholdingMinInput, thresholdingMaxInput; @FXML @@ -45,15 +48,20 @@ public class ImageManufactureEffectsController extends ImageManufactureControlle @FXML protected Button effectsOkButton; @FXML - protected HBox blurBox, thresholdingBox, postBox; + protected HBox thresholdingBox; + @FXML + protected Label intLabel, stringLabel; + @FXML + protected CheckBox grayCheck; public static class EffectsOperationType { public static int Blur = 0; public static int Sharpen = 1; - public static int EdgeDetect = 2; - public static int Thresholding = 3; - public static int Posterizing = 4; + public static int Emboss = 2; + public static int EdgeDetect = 3; + public static int Thresholding = 4; + public static int Posterizing = 5; } @@ -93,51 +101,69 @@ protected void initEffectsTab() { @Override public void changed(ObservableValue ov, Toggle old_toggle, Toggle new_toggle) { - checkEffetcssOperationType(); + checkEffetcsOperationType(); } }); - checkEffetcssOperationType(); + checkEffetcsOperationType(); - blurRadiusBox.getItems().addAll(Arrays.asList("10", "5", "3", "8", "15", "20", "30")); - blurRadiusBox.valueProperty().addListener(new ChangeListener() { + intBox.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, String oldValue, String newValue) { + int defaultValue = 0; + if (effectType == EffectsOperationType.Blur) { + defaultValue = 1; + } else if (effectType == EffectsOperationType.Posterizing) { + defaultValue = 32; + } else if (effectType == EffectsOperationType.Emboss) { + defaultValue = 3; + } try { - blurRadius = Integer.valueOf(newValue); - if (blurRadius > 0) { - blurRadiusBox.getEditor().setStyle(null); - + String v = newValue; + int pos = v.indexOf(" "); + if (pos > 0) { + v = v.substring(0, pos); + } + intValue = Integer.valueOf(v); + if (intValue > 0) { + intBox.getEditor().setStyle(null); } else { - blurRadius = 1; - blurRadiusBox.getEditor().setStyle(badStyle); + intValue = defaultValue; + intBox.getEditor().setStyle(badStyle); } } catch (Exception e) { - blurRadius = 1; - blurRadiusBox.getEditor().setStyle(badStyle); + intValue = defaultValue; + intBox.getEditor().setStyle(badStyle); } } }); - blurRadiusBox.getSelectionModel().select(0); - posterizingBox.getItems().addAll(Arrays.asList("64", "32", "128", "16")); - posterizingBox.valueProperty().addListener(new ChangeListener() { + stringBox.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, String oldValue, String newValue) { - try { - posterizingSize = Integer.valueOf(newValue); - if (posterizingSize > 0) { - posterizingBox.getEditor().setStyle(null); - } else { - posterizingSize = 32; - posterizingBox.getEditor().setStyle(badStyle); - } - } catch (Exception e) { - posterizingSize = 32; - posterizingBox.getEditor().setStyle(badStyle); + if (newValue == null || newValue.trim().isEmpty()) { + return; + } + if (getMessage("Top").equals(newValue)) { + direction = Direction.Top; + } else if (getMessage("Bottom").equals(newValue)) { + direction = Direction.Bottom; + } else if (getMessage("Left").equals(newValue)) { + direction = Direction.Top; + } else if (getMessage("Right").equals(newValue)) { + direction = Direction.Right; + } else if (getMessage("LeftTop").equals(newValue)) { + direction = Direction.LeftTop; + } else if (getMessage("RightBottom").equals(newValue)) { + direction = Direction.RightBottom; + } else if (getMessage("LeftBottom").equals(newValue)) { + direction = Direction.LeftBottom; + } else if (getMessage("RightTop").equals(newValue)) { + direction = Direction.RightTop; + } else { + direction = Direction.Top; } } }); - posterizingBox.getSelectionModel().select(0); Tooltip tips = new Tooltip("0~255"); tips.setFont(new Font(16)); @@ -221,24 +247,57 @@ private void checkThresholding() { } } - private void checkEffetcssOperationType() { - blurBox.setDisable(true); + private void checkEffetcsOperationType() { + intLabel.setText(""); + intBox.setDisable(true); + stringLabel.setText(""); + stringBox.setDisable(true); thresholdingBox.setDisable(true); - postBox.setDisable(true); thresholdingInput.setStyle(null); thresholdingMinInput.setStyle(null); thresholdingMaxInput.setStyle(null); + grayCheck.setDisable(true); RadioButton selected = (RadioButton) effectsGroup.getSelectedToggle(); if (getMessage("Blur").equals(selected.getText())) { effectType = EffectsOperationType.Blur; - blurBox.setDisable(false); + intLabel.setText(getMessage("Radius")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("10", "5", "3", "8", "15", "20", "30")); + intBox.setEditable(true); + intValue = 10; + intBox.getSelectionModel().select("10"); } else if (getMessage("Sharpen").equals(selected.getText())) { effectType = EffectsOperationType.Sharpen; } else if (getMessage("EdgeDetection").equals(selected.getText())) { effectType = EffectsOperationType.EdgeDetect; + } else if (getMessage("Emboss").equals(selected.getText())) { + effectType = EffectsOperationType.Emboss; + intLabel.setText(getMessage("Radius")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("3", "5")); + intBox.setEditable(false); + intValue = 3; + intBox.getSelectionModel().select("3"); + stringLabel.setText(getMessage("Direction")); + stringBox.setDisable(false); + stringBox.getItems().clear(); + stringBox.getItems().addAll(Arrays.asList(getMessage("Top"), getMessage("Bottom"), + getMessage("Left"), getMessage("Right"), + getMessage("LeftTop"), getMessage("RightBottom"), + getMessage("LeftBottom"), getMessage("RightTop"))); + direction = Direction.Top; + stringBox.getSelectionModel().select(getMessage("Top")); + grayCheck.setDisable(false); } else if (getMessage("Posterizing").equals(selected.getText())) { effectType = EffectsOperationType.Posterizing; - postBox.setDisable(false); + intLabel.setText(getMessage("Size")); + intBox.setDisable(false); + intBox.getItems().clear(); + intBox.getItems().addAll(Arrays.asList("64", "32", "128", "16")); + intBox.setEditable(false); + intBox.getSelectionModel().select("64"); } else if (getMessage("Thresholding").equals(selected.getText())) { effectType = EffectsOperationType.Thresholding; thresholdingBox.setDisable(false); @@ -253,15 +312,17 @@ public void effectsAction() { protected Void call() throws Exception { final Image newImage; if (effectType == EffectsOperationType.Blur) { - newImage = FxmlImageTools.blurImage(values.getCurrentImage(), blurRadius); + newImage = FxmlImageTools.blurImage(values.getCurrentImage(), intValue); } else if (effectType == EffectsOperationType.Sharpen) { newImage = FxmlImageTools.sharpenImage(values.getCurrentImage()); } else if (effectType == EffectsOperationType.EdgeDetect) { newImage = FxmlImageTools.edgeDetectImage(values.getCurrentImage()); + } else if (effectType == EffectsOperationType.Emboss) { + newImage = FxmlImageTools.embossImage(values.getCurrentImage(), direction, intValue, grayCheck.isSelected()); } else if (effectType == EffectsOperationType.Thresholding) { newImage = FxmlImageTools.thresholdingImage(values.getCurrentImage(), threadholding, threadholdingSmall, threadholdingBig); } else if (effectType == EffectsOperationType.Posterizing) { - newImage = FxmlImageTools.posterizingImage(values.getCurrentImage(), posterizingSize); + newImage = FxmlImageTools.posterizingImage(values.getCurrentImage(), intValue); } else { return null; } diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureFiltersController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureFiltersController.java index a11f61d54..5f7f280d5 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureFiltersController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureFiltersController.java @@ -6,6 +6,7 @@ import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.Slider; import javafx.scene.control.TextField; @@ -22,7 +23,7 @@ import mara.mybox.objects.ImageScope; import mara.mybox.objects.ImageScope.AreaScopeType; import mara.mybox.objects.ImageScope.OperationType; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; @@ -35,12 +36,12 @@ public class ImageManufactureFiltersController extends ImageManufactureController { protected ImageScope filtersScope; - protected int filtersOperationType, threshold; + protected int filtersOperationType, scaleValue; @FXML protected ToggleGroup filtersGroup; @FXML - protected Slider binarySlider; + protected Slider scaleSlider; @FXML protected Button binaryCalculateButton, binaryOkButton, filtersScopeButton; @FXML @@ -48,7 +49,9 @@ public class ImageManufactureFiltersController extends ImageManufactureControlle @FXML protected HBox bwBox; @FXML - protected TextField thresholdInput; + protected TextField scaleInput; + @FXML + protected Label scaleLabel, unitLabel; public static class FiltersOperationType { @@ -61,6 +64,7 @@ public static class FiltersOperationType { public static int RedInvert = 6; public static int GreenInvert = 7; public static int BlueInvert = 8; + public static int Sepia = 9; } @@ -110,20 +114,19 @@ public void changed(ObservableValue ov, }); checkFiltersOperationType(); - binarySlider.valueProperty().addListener(new ChangeListener() { + scaleSlider.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - threshold = newValue.intValue(); - thresholdInput.setText(threshold + ""); + scaleValue = newValue.intValue(); + scaleInput.setText(scaleValue + ""); } }); - binarySlider.setValue(50); - thresholdInput.textProperty().addListener(new ChangeListener() { + scaleInput.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { - checkThresholdInput(); + checkValueInput(); } }); @@ -142,43 +145,66 @@ public void changed(ObservableValue observable, } private void checkFiltersOperationType() { + binaryCalculateButton.setDisable(true); + scaleLabel.setText(""); + scaleSlider.setDisable(true); + scaleInput.setDisable(true); + scaleInput.setStyle(null); + unitLabel.setText(""); RadioButton selected = (RadioButton) filtersGroup.getSelectedToggle(); if (getMessage("BlackOrWhite").equals(selected.getText())) { filtersOperationType = FiltersOperationType.BlackOrWhite; - bwBox.setDisable(false); - } else { - if (getMessage("Gray").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.Gray; - } else if (getMessage("Invert").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.Invert; - } else if (getMessage("Red").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.Red; - } else if (getMessage("Green").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.Green; - } else if (getMessage("Blue").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.Blue; - } else if (getMessage("RedInvert").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.RedInvert; - } else if (getMessage("GreenInvert").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.GreenInvert; - } else if (getMessage("BlueInvert").equals(selected.getText())) { - filtersOperationType = FiltersOperationType.BlueInvert; - } - bwBox.setDisable(true); + binaryCalculateButton.setDisable(false); + scaleLabel.setText(getMessage("Threshold")); + scaleSlider.setDisable(false); + scaleSlider.setMax(99); + scaleSlider.setMin(1); + scaleSlider.setBlockIncrement(1); + scaleSlider.setValue(50); + scaleInput.setDisable(false); + unitLabel.setText("%"); + checkValueInput(); + } else if (getMessage("Gray").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Gray; + } else if (getMessage("Invert").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Invert; + } else if (getMessage("Red").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Red; + } else if (getMessage("Green").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Green; + } else if (getMessage("Blue").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Blue; + } else if (getMessage("RedInvert").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.RedInvert; + } else if (getMessage("GreenInvert").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.GreenInvert; + } else if (getMessage("BlueInvert").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.BlueInvert; + } else if (getMessage("Sepia").equals(selected.getText())) { + filtersOperationType = FiltersOperationType.Sepia; + scaleLabel.setText(getMessage("Intensity")); + scaleSlider.setDisable(false); + scaleSlider.setMax(255); + scaleSlider.setMin(0); + scaleSlider.setBlockIncrement(1); + scaleSlider.setValue(80); + scaleInput.setDisable(false); + checkValueInput(); } + } - private void checkThresholdInput() { + private void checkValueInput() { try { - threshold = Integer.valueOf(thresholdInput.getText()); - if (threshold >= 0 && threshold <= binarySlider.getMax()) { - thresholdInput.setStyle(null); - binarySlider.setValue(threshold); + scaleValue = Integer.valueOf(scaleInput.getText()); + if (scaleValue >= 0 && scaleValue <= scaleSlider.getMax()) { + scaleInput.setStyle(null); + scaleSlider.setValue(scaleValue); } else { - thresholdInput.setStyle(badStyle); + scaleInput.setStyle(badStyle); } } catch (Exception e) { - thresholdInput.setStyle(badStyle); + scaleInput.setStyle(badStyle); } } @@ -218,9 +244,9 @@ public void wholeFiltersScope() { @FXML public void calculateThreshold() { - threshold = ImageGrayTools.calculateThreshold(values.getSourceFile()); - threshold = threshold * 100 / 256; - binarySlider.setValue(threshold); + scaleValue = ImageGrayTools.calculateThreshold(values.getSourceFile()); + scaleValue = scaleValue * 100 / 256; + scaleSlider.setValue(scaleValue); } @FXML @@ -234,7 +260,7 @@ protected Void call() throws Exception { } else if (filtersOperationType == FiltersOperationType.Invert) { newImage = FxmlImageTools.makeInvert(values.getCurrentImage(), filtersScope); } else if (filtersOperationType == FiltersOperationType.BlackOrWhite) { - newImage = FxmlImageTools.makeBinaryFx(values.getCurrentImage(), threshold, filtersScope); + newImage = FxmlImageTools.makeBinaryFx(values.getCurrentImage(), filtersScope, scaleValue); } else if (filtersOperationType == FiltersOperationType.Red) { newImage = FxmlImageTools.keepRed(values.getCurrentImage(), filtersScope); } else if (filtersOperationType == FiltersOperationType.Green) { @@ -247,6 +273,8 @@ protected Void call() throws Exception { newImage = FxmlImageTools.makeGreenInvert(values.getCurrentImage(), filtersScope); } else if (filtersOperationType == FiltersOperationType.BlueInvert) { newImage = FxmlImageTools.makeBlueInvert(values.getCurrentImage(), filtersScope); + } else if (filtersOperationType == FiltersOperationType.Sepia) { + newImage = FxmlImageTools.makeSepia(values.getCurrentImage(), filtersScope, scaleValue); } else { return null; } diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureReplaceColorController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureReplaceColorController.java index 0aaf8e894..4c32b77c9 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureReplaceColorController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureReplaceColorController.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import javafx.application.Platform; +import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.concurrent.Task; @@ -12,6 +13,7 @@ import javafx.scene.control.ColorPicker; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; +import javafx.scene.control.TextField; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.scene.control.ToolBar; @@ -26,11 +28,12 @@ import javafx.stage.Modality; import static mara.mybox.controller.BaseController.logger; import mara.mybox.objects.AppVaribles; -import static mara.mybox.objects.AppVaribles.getMessage; import mara.mybox.objects.CommonValues; import mara.mybox.objects.ImageScope; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; +import static mara.mybox.objects.AppVaribles.getMessage; import mara.mybox.tools.FxmlTools; +import static mara.mybox.tools.FxmlTools.badStyle; /** * @Author Mara @@ -40,7 +43,7 @@ */ public class ImageManufactureReplaceColorController extends ImageManufactureController { - protected int replaceColorScopeType; + protected int replaceColorScopeType, distance; protected ImageScope replaceColorScope; @FXML @@ -56,7 +59,9 @@ public class ImageManufactureReplaceColorController extends ImageManufactureCont @FXML protected HBox originalBox; @FXML - private Label replaceColorLabel; + private Label replaceColorLabel, distanceLabel; + @FXML + private TextField distanceInput; public static class ReplaceColorScopeType { @@ -133,6 +138,20 @@ public void changed(ObservableValue ov, }); checkReplaceColorScope(); + distanceInput.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, + String oldValue, String newValue) { + checkDistance(); + } + }); + distanceInput.setText("20"); + + replaceColorOkButton.disableProperty().bind( + distanceInput.styleProperty().isEqualTo(badStyle) + .or(Bindings.isEmpty(distanceInput.textProperty())) + ); + } catch (Exception e) { logger.error(e.toString()); } @@ -146,14 +165,25 @@ private void checkReplaceColorScope() { setScopeColor(scopeColorPicker.getValue()); originalBox.setDisable(false); replaceColorLabel.setVisible(true); + distanceLabel.setText(getMessage("HueDistance")); + showScopeCheck.setDisable(true); + scopePaneValid = false; + super.setScopePane(); + } else if (AppVaribles.getMessage("Settings").equals(selected.getText())) { originalBox.setDisable(true); replaceColorLabel.setVisible(false); + distanceLabel.setText(""); + } else if (AppVaribles.getMessage("Color").equals(selected.getText())) { replaceColorScopeType = ReplaceColorScopeType.Color; setScopeColor(scopeColorPicker.getValue()); originalBox.setDisable(false); replaceColorLabel.setVisible(true); + distanceLabel.setText(getMessage("ColorDistance")); + showScopeCheck.setDisable(true); + scopePaneValid = false; + super.setScopePane(); } } catch (Exception e) { @@ -161,6 +191,24 @@ private void checkReplaceColorScope() { } } + protected void checkDistance() { + try { + distance = Integer.valueOf(distanceInput.getText()); + distanceInput.setStyle(null); + if (distance >= 0 && distance <= 255) { + distanceInput.setStyle(null); + replaceColorScope.setColorDistance(distance); + replaceColorScope.setHueDistance(distance); + } else { + distanceInput.setStyle(badStyle); + distance = 0; + } + } catch (Exception e) { + distanceInput.setStyle(badStyle); + distance = 0; + } + } + private void setScopeColor(Color color) { try { if (replaceColorScopeType == ReplaceColorScopeType.Settings) { @@ -170,11 +218,8 @@ private void setScopeColor(Color color) { replaceColorScope.setAreaScopeType(ImageScope.AreaScopeType.AllArea); if (replaceColorScopeType == ReplaceColorScopeType.Color) { replaceColorScope.setMatchColor(true); - replaceColorScope.setColorDistance(0); - replaceColorScope.setColorExcluded(false); } else if (replaceColorScopeType == ReplaceColorScopeType.Hue) { replaceColorScope.setMatchColor(false); - replaceColorScope.setHueDistance(0); } else { return; } diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureShadowController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureShadowController.java index 3b6fc9901..097e82622 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureShadowController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureShadowController.java @@ -15,7 +15,7 @@ import static mara.mybox.controller.BaseController.logger; import mara.mybox.objects.AppVaribles; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import static mara.mybox.tools.FxmlTools.badStyle; /** diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureSizeController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureSizeController.java index 2f3d4927d..2020eaee4 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureSizeController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureSizeController.java @@ -30,7 +30,7 @@ import mara.mybox.objects.CommonValues; import mara.mybox.objects.ImageAttributes; import static mara.mybox.tools.FxmlTools.badStyle; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; /** * @Author Mara diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureTransformController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureTransformController.java index 1c0dfebc5..139a44906 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureTransformController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureTransformController.java @@ -17,7 +17,7 @@ import javafx.stage.Modality; import static mara.mybox.controller.BaseController.logger; import static mara.mybox.objects.AppVaribles.getMessage; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureWatermarkController.java b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureWatermarkController.java index c1b369a1f..0892af2db 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageManufactureWatermarkController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageManufactureWatermarkController.java @@ -25,7 +25,7 @@ import mara.mybox.objects.AppVaribles; import static mara.mybox.objects.AppVaribles.getMessage; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageScopeController.java b/MyBox/src/main/java/mara/mybox/controller/ImageScopeController.java index 72bc92be6..296923ed1 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageScopeController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageScopeController.java @@ -43,7 +43,7 @@ import mara.mybox.objects.ImageScope.OperationType; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; /** * @Author Mara @@ -366,6 +366,7 @@ public void changed(ObservableValue observable, checkColorDistance(); } }); + hueDistanceInput.setText("20"); hueDistanceInput.textProperty().addListener(new ChangeListener() { @Override @@ -374,6 +375,7 @@ public void changed(ObservableValue observable, checkHueDistance(); } }); + hueDistanceInput.setText("20"); colorsBox.setCellFactory(new Callback, ListCell>() { @Override diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageSplitController.java b/MyBox/src/main/java/mara/mybox/controller/ImageSplitController.java index 74fc0a110..dc9698b3b 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageSplitController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageSplitController.java @@ -51,7 +51,7 @@ import mara.mybox.tools.FileTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; /** * @Author Mara diff --git a/MyBox/src/main/java/mara/mybox/controller/ImageViewerController.java b/MyBox/src/main/java/mara/mybox/controller/ImageViewerController.java index a82f76088..91cb9c0d6 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImageViewerController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImageViewerController.java @@ -194,6 +194,9 @@ public void paneSize() { } public void fitSize() { + if (imageView.getImage() == null) { + return; + } if (scrollPane.getHeight() < imageView.getImage().getHeight()) { paneSize(); } else { diff --git a/MyBox/src/main/java/mara/mybox/controller/ImagesBlendController.java b/MyBox/src/main/java/mara/mybox/controller/ImagesBlendController.java index 2e8fed1bf..7d8f3fb6a 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImagesBlendController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImagesBlendController.java @@ -1,119 +1,643 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package mara.mybox.controller; -import java.net.URL; -import java.util.ResourceBundle; +import java.awt.Desktop; +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.Arrays; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Task; +import javafx.embed.swing.SwingFXUtils; +import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.fxml.Initializable; +import javafx.scene.Cursor; import javafx.scene.control.Button; -import javafx.scene.control.ColorPicker; +import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.ScrollPane; import javafx.scene.control.SplitPane; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; import javafx.scene.control.TextField; +import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.BorderPane; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import javafx.stage.FileChooser; +import javafx.stage.Modality; +import javax.imageio.ImageIO; +import static mara.mybox.controller.BaseController.logger; +import mara.mybox.image.FxmlImageTools; +import mara.mybox.image.ImageBlendTools.ImagesBlendMode; +import mara.mybox.image.ImageBlendTools.ImagesRelativeLocation; +import mara.mybox.imagefile.ImageFileReaders; +import mara.mybox.imagefile.ImageFileWriters; +import mara.mybox.objects.AppVaribles; +import mara.mybox.objects.CommonValues; +import mara.mybox.objects.ImageFileInformation; +import mara.mybox.tools.FileTools; +import static mara.mybox.tools.FxmlTools.badStyle; /** - * FXML Controller class - * - * @author mara + * @Author Mara + * @CreateDate 2018-10-31 + * @Description + * @License Apache License Version 2.0 */ -public class ImagesBlendController implements Initializable { +public class ImagesBlendController extends ImageViewerController { + + protected String ImageBlendFileTypeKey; + private ImagesRelativeLocation location; + private ImagesBlendMode blendMode; + private int x, y; + private boolean isAreaValid; + private float opacity; + + private File foreFile, backFile, targetFile; + private Image foreImage, backImage; + private ImageFileInformation foreInfo, backInfo; @FXML - private BorderPane thisPane; - @FXML - private Label bottomLabel; - @FXML - private VBox mainPane; + private VBox mainPane, targetBox; @FXML private SplitPane splitPane; @FXML - private Button addButton; - @FXML - private Button upButton; - @FXML - private Button downButton; - @FXML - private Button deleteButton; - @FXML - private Button clearButton; - @FXML - private TableView sourceTable; - @FXML - private TableColumn imageColumn; - @FXML - private TableColumn sizeColumn; - @FXML - private TableColumn fileColumn; - @FXML - private RadioButton arrayColumnRadio; + private ScrollPane foreScroll, backScroll; @FXML - private ToggleGroup arrayGroup; + private ImageView foreView, backView; @FXML - private RadioButton arrayRowRadio; + private HBox foreBox, backBox, opacityHBox, toolBox; @FXML - private RadioButton arrayColumnsRadio; + private ToggleGroup locationGroup; @FXML - private ComboBox columnsBox; + private Button openTargetButton; @FXML - private ColorPicker bgPicker; + private ComboBox targetTypeBox, blendModeBox, opacityBox; @FXML - private ComboBox intervalBox; + private Label foreTitle, foreLabel, backTitle, backLabel; @FXML - private RadioButton sizeKeepRadio; + private Label pointLabel; @FXML - private ToggleGroup sizeGroup; + private Button saveButton, imageSizeButton, paneSizeButton, zoomInButton, zoomOutButton, newWindowButton; @FXML - private RadioButton sizeBiggerRadio; + private TextField pointX, pointY; @FXML - private RadioButton sizeSmallerRadio; + private CheckBox intersectOnlyCheck; + + public ImagesBlendController() { + ImageBlendFileTypeKey = "ImageBlendFileType"; + } + + @Override + protected void initializeNext() { + try { + initSourcesSection(); + initOptionsSection(); + initTargetSection(); + + targetBox.setDisable(true); + } catch (Exception e) { + logger.error(e.toString()); + } + } + + private void initSourcesSection() { + try { + + foreBox.setDisable(true); + backBox.setDisable(true); + } catch (Exception e) { + logger.error(e.toString()); + } + } + + private void initOptionsSection() { + try { + locationGroup.selectedToggleProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue ov, + Toggle old_toggle, Toggle new_toggle) { + checkLocation(); + } + }); + location = ImagesRelativeLocation.Foreground_In_Background; + pointLabel.setText(AppVaribles.getMessage("ClickOnBackgournd")); + + blendModeBox.getItems().addAll(Arrays.asList(AppVaribles.getMessage("NormalMode"), + AppVaribles.getMessage("DissolveMode"), AppVaribles.getMessage("MultiplyMode"), AppVaribles.getMessage("ScreenMode"), + AppVaribles.getMessage("OverlayMode"), AppVaribles.getMessage("HardLightMode"), AppVaribles.getMessage("SoftLightMode"), + AppVaribles.getMessage("ColorDodgeMode"), AppVaribles.getMessage("LinearDodgeMode"), AppVaribles.getMessage("DivideMode"), + AppVaribles.getMessage("ColorBurnMode"), AppVaribles.getMessage("LinearBurnMode"), AppVaribles.getMessage("VividLightMode"), + AppVaribles.getMessage("LinearLightMode"), AppVaribles.getMessage("SubtractMode"), AppVaribles.getMessage("DifferenceMode"), + AppVaribles.getMessage("ExclusionMode"), AppVaribles.getMessage("DarkenMode"), AppVaribles.getMessage("LightenMode"), + AppVaribles.getMessage("HueMode"), AppVaribles.getMessage("SaturationMode"), AppVaribles.getMessage("ColorMode"), + AppVaribles.getMessage("LuminosityMode") + )); + blendModeBox.valueProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue ov, + String oldValue, String newValue) { + checkBlendMode(newValue); + } + }); + blendMode = null; + + pointX.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, + String oldValue, String newValue) { + checkPoint(); + } + }); + pointY.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, + String oldValue, String newValue) { + checkPoint(); + } + }); + isAreaValid = true; + + opacityBox.getItems().addAll(Arrays.asList("0.5", "1.0", "0.3", "0.1", "0.8", "0.2", "0.9", "0.0")); + opacityBox.valueProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue ov, String oldValue, String newValue) { + try { + opacity = Float.valueOf(newValue); + if (opacity >= 0.0f && opacity <= 1.0f) { + opacityBox.getEditor().setStyle(null); + blendImages(); + } else { + opacity = 0.5f; + opacityBox.getEditor().setStyle(badStyle); + } + } catch (Exception e) { + opacity = 0.5f; + opacityBox.getEditor().setStyle(badStyle); + } + } + }); + opacityBox.getSelectionModel().select(0); + opacityHBox.setDisable(true); + + intersectOnlyCheck.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, + Boolean oldValue, Boolean newValue) { + blendImages(); + } + }); + } catch (Exception e) { + logger.error(e.toString()); + } + } + + private void checkLocation() { + if (foreImage == null || backImage == null) { + return; + } + RadioButton selected = (RadioButton) locationGroup.getSelectedToggle(); + if (AppVaribles.getMessage("FinB").equals(selected.getText())) { + location = ImagesRelativeLocation.Foreground_In_Background; + pointLabel.setText(AppVaribles.getMessage("ClickOnBackgournd")); + bottomLabel.setText(AppVaribles.getMessage("BlendedSize") + ": " + + (int) backImage.getWidth() + "*" + (int) backImage.getHeight()); + + } else if (AppVaribles.getMessage("BinF").equals(selected.getText())) { + location = ImagesRelativeLocation.Background_In_Foreground; + pointLabel.setText(AppVaribles.getMessage("ClickOnForegournd")); + bottomLabel.setText(AppVaribles.getMessage("BlendedSize") + ": " + + (int) foreImage.getWidth() + "*" + (int) foreImage.getHeight()); + + } else { + return; + } + pointX.setText("0"); + pointY.setText("0"); + } + + private void checkBlendMode(String mode) { + opacityHBox.setDisable(true); + if (AppVaribles.getMessage("NormalMode").equals(mode)) { + blendMode = ImagesBlendMode.NORMAL; + opacityHBox.setDisable(false); + + } else if (AppVaribles.getMessage("DissolveMode").equals(mode)) { + blendMode = ImagesBlendMode.DISSOLVE; + + } else if (AppVaribles.getMessage("MultiplyMode").equals(mode)) { + blendMode = ImagesBlendMode.MULTIPLY; + + } else if (AppVaribles.getMessage("ScreenMode").equals(mode)) { + blendMode = ImagesBlendMode.SCREEN; + + } else if (AppVaribles.getMessage("OverlayMode").equals(mode)) { + blendMode = ImagesBlendMode.OVERLAY; + + } else if (AppVaribles.getMessage("HardLightMode").equals(mode)) { + blendMode = ImagesBlendMode.HARD_LIGHT; + + } else if (AppVaribles.getMessage("SoftLightMode").equals(mode)) { + blendMode = ImagesBlendMode.SOFT_LIGHT; + + } else if (AppVaribles.getMessage("ColorDodgeMode").equals(mode)) { + blendMode = ImagesBlendMode.COLOR_DODGE; + + } else if (AppVaribles.getMessage("LinearDodgeMode").equals(mode)) { + blendMode = ImagesBlendMode.LINEAR_DODGE; + + } else if (AppVaribles.getMessage("DivideMode").equals(mode)) { + blendMode = ImagesBlendMode.DIVIDE; + + } else if (AppVaribles.getMessage("ColorBurnMode").equals(mode)) { + blendMode = ImagesBlendMode.COLOR_BURN; + + } else if (AppVaribles.getMessage("LinearBurnMode").equals(mode)) { + blendMode = ImagesBlendMode.LINEAR_BURN; + + } else if (AppVaribles.getMessage("VividLightMode").equals(mode)) { + blendMode = ImagesBlendMode.VIVID_LIGHT; + + } else if (AppVaribles.getMessage("LinearLightMode").equals(mode)) { + blendMode = ImagesBlendMode.LINEAR_LIGHT; + + } else if (AppVaribles.getMessage("SubtractMode").equals(mode)) { + blendMode = ImagesBlendMode.SUBTRACT; + + } else if (AppVaribles.getMessage("DifferenceMode").equals(mode)) { + blendMode = ImagesBlendMode.DIFFERENCE; + + } else if (AppVaribles.getMessage("ExclusionMode").equals(mode)) { + blendMode = ImagesBlendMode.EXCLUSION; + + } else if (AppVaribles.getMessage("DarkenMode").equals(mode)) { + blendMode = ImagesBlendMode.DARKEN; + + } else if (AppVaribles.getMessage("LightenMode").equals(mode)) { + blendMode = ImagesBlendMode.LIGHTEN; + + } else if (AppVaribles.getMessage("HueMode").equals(mode)) { + blendMode = ImagesBlendMode.HUE; + + } else if (AppVaribles.getMessage("SaturationMode").equals(mode)) { + blendMode = ImagesBlendMode.SATURATION; + + } else if (AppVaribles.getMessage("ColorMode").equals(mode)) { + blendMode = ImagesBlendMode.COLOR; + + } else if (AppVaribles.getMessage("LuminosityMode").equals(mode)) { + blendMode = ImagesBlendMode.LUMINOSITY; + + } + blendImages(); + } + + private void checkPoint() { + try { + isAreaValid = true; + x = Integer.valueOf(pointX.getText()); + if (x >= 0 && x < backImage.getWidth()) { + pointX.setStyle(null); + isAreaValid = true; + } else { + pointX.setStyle(badStyle); + x = 0; + isAreaValid = false; + } + } catch (Exception e) { + pointX.setStyle(badStyle); + x = 0; + isAreaValid = false; + } + try { + y = Integer.valueOf(pointY.getText()); + if (y >= 0 && y < backImage.getHeight()) { + pointY.setStyle(null); + } else { + pointY.setStyle(badStyle); + y = 0; + isAreaValid = false; + } + } catch (Exception e) { + pointY.setStyle(badStyle); + y = 0; + isAreaValid = false; + } + + blendImages(); + } + + private void initTargetSection() { + try { + toolBox.disableProperty().bind( + foreBox.disableProperty() + .or(backBox.disableProperty()) + .or(blendModeBox.selectionModelProperty().getValue().selectedItemProperty().isNull()) + .or(pointX.styleProperty().isEqualTo(badStyle)) + .or(pointY.styleProperty().isEqualTo(badStyle)) + ); + + } catch (Exception e) { + logger.error(e.toString()); + } + } + @FXML - private RadioButton sizeResizeRadio; + private void selectForegroundImage(ActionEvent event) { + try { + final FileChooser fileChooser = new FileChooser(); + File path = new File(AppVaribles.getConfigValue(sourcePathKey, CommonValues.UserFilePath)); + if (!path.isDirectory()) { + path = new File(CommonValues.UserFilePath); + } + fileChooser.setInitialDirectory(path); + fileChooser.getExtensionFilters().addAll(fileExtensionFilter); + final File file = fileChooser.showOpenDialog(getMyStage()); + if (file == null) { + return; + } + foreFile = file; + AppVaribles.setConfigValue(LastPathKey, foreFile.getParent()); + AppVaribles.setConfigValue(sourcePathKey, foreFile.getParent()); + + final String fileName = file.getPath(); + Task loadTask = new Task() { + @Override + protected Void call() throws Exception { + try { + BufferedImage bufferImage = ImageIO.read(file); + foreImage = SwingFXUtils.toFXImage(bufferImage, null); + foreInfo = ImageFileReaders.readImageMetaData(fileName); + foreInfo.setImage(foreImage); + Platform.runLater(new Runnable() { + @Override + public void run() { + foreView.setPreserveRatio(true); + foreView.setImage(foreImage); + if (foreScroll.getHeight() < foreImage.getHeight()) { + foreView.setFitHeight(foreScroll.getHeight() - 5); + foreView.setFitWidth(foreScroll.getWidth() - 1); + } else { + foreView.setFitHeight(-1); + foreView.setFitWidth(-1); + } + foreTitle.setText(AppVaribles.getMessage("ForegroundImage") + " " + + (int) foreImage.getWidth() + "*" + (int) foreImage.getHeight()); + foreLabel.setText(fileName); + foreBox.setDisable(false); + afterImagesOpened(); + } + }); + } catch (Exception e) { + logger.error(e.toString()); + } + return null; + } + }; + openHandlingStage(loadTask, Modality.WINDOW_MODAL); + Thread thread = new Thread(loadTask); + thread.setDaemon(true); + thread.start(); + + } catch (Exception e) { + logger.error(e.toString()); + } + } + @FXML - private TextField resizeWidthInput; + private void openForegroundImage(ActionEvent event) { + if (foreFile != null) { + openImageManufactureInNew(foreFile.getAbsolutePath()); + } + } + @FXML - private TextField resizeHeightInput; + private void setForegroundPaneSize(ActionEvent event) { + foreView.setFitHeight(foreScroll.getHeight() - 5); + foreView.setFitWidth(foreScroll.getWidth() - 1); + } + @FXML - private RadioButton sizeTotalRadio; + private void setForegroundImageSize(ActionEvent event) { + foreView.setFitHeight(-1); + foreView.setFitWidth(-1); + } + @FXML - private TextField totalWidthInput; + private void selectBackgroundImage(ActionEvent event) { + try { + final FileChooser fileChooser = new FileChooser(); + File path = new File(AppVaribles.getConfigValue(sourcePathKey, CommonValues.UserFilePath)); + if (!path.isDirectory()) { + path = new File(CommonValues.UserFilePath); + } + fileChooser.setInitialDirectory(path); + fileChooser.getExtensionFilters().addAll(fileExtensionFilter); + final File file = fileChooser.showOpenDialog(getMyStage()); + if (file == null) { + return; + } + backFile = file; + AppVaribles.setConfigValue(LastPathKey, backFile.getParent()); + AppVaribles.setConfigValue(sourcePathKey, backFile.getParent()); + + final String fileName = file.getPath(); + Task loadTask = new Task() { + @Override + protected Void call() throws Exception { + try { + BufferedImage bufferImage = ImageIO.read(file); + backImage = SwingFXUtils.toFXImage(bufferImage, null); + backInfo = ImageFileReaders.readImageMetaData(fileName); + backInfo.setImage(backImage); + Platform.runLater(new Runnable() { + @Override + public void run() { + backView.setPreserveRatio(true); + backView.setImage(backImage); + if (backScroll.getHeight() < backImage.getHeight()) { + backView.setFitHeight(backScroll.getHeight() - 5); + backView.setFitWidth(backScroll.getWidth() - 1); + } else { + backView.setFitHeight(-1); + backView.setFitWidth(-1); + } + backTitle.setText(AppVaribles.getMessage("BackgroundImage") + " " + + (int) backImage.getWidth() + "*" + (int) backImage.getHeight()); + backLabel.setText(fileName); + backBox.setDisable(false); + afterImagesOpened(); + } + }); + } catch (Exception e) { + logger.error(e.toString()); + } + return null; + } + }; + openHandlingStage(loadTask, Modality.WINDOW_MODAL); + Thread thread = new Thread(loadTask); + thread.setDaemon(true); + thread.start(); + + } catch (Exception e) { + logger.error(e.toString()); + } + } + + private void afterImagesOpened() { + if (foreImage != null && backImage != null) { + targetBox.setDisable(false); + blendImages(); + } else { + targetBox.setDisable(true); + } + } + @FXML - private TextField totalHeightInput; + private void openBackgroundImage(ActionEvent event) { + if (backFile != null) { + openImageManufactureInNew(backFile.getAbsolutePath()); + } + } + @FXML - private TextField targetPathInput; + private void setBackgroundPaneSize(ActionEvent event) { + backView.setFitHeight(backScroll.getHeight() - 5); + backView.setFitWidth(backScroll.getWidth() - 1); + } + @FXML - private Button openTargetButton; + private void setBackgroundImageSize(ActionEvent event) { + backView.setFitHeight(-1); + backView.setFitWidth(-1); + } + @FXML - private TextField targetPrefixInput; + private void saveAction(ActionEvent event) { + if (image == null) { + return; + } + try { + final FileChooser fileChooser = new FileChooser(); + File path = new File(AppVaribles.getConfigValue(targetPathKey, CommonValues.UserFilePath)); + if (!path.isDirectory()) { + path = new File(CommonValues.UserFilePath); + } + fileChooser.setInitialDirectory(path); + fileChooser.getExtensionFilters().addAll(fileExtensionFilter); + final File file = fileChooser.showSaveDialog(getMyStage()); + if (file == null) { + return; + } + AppVaribles.setConfigValue(targetPathKey, file.getParent()); + targetFile = file; + + Task saveTask = new Task() { + @Override + protected Void call() throws Exception { + try { + String filename = targetFile.getAbsolutePath(); + String format = FileTools.getFileSuffix(filename); + final BufferedImage bufferedImage = FxmlImageTools.getBufferedImage(image); + ImageFileWriters.writeImageFile(bufferedImage, format, filename); + } catch (Exception e) { + logger.error(e.toString()); + } + return null; + } + }; + openHandlingStage(saveTask, Modality.WINDOW_MODAL); + Thread thread = new Thread(saveTask); + thread.setDaemon(true); + thread.start(); + } catch (Exception e) { + logger.error(e.toString()); + } + } + @FXML - private ComboBox targetTypeBox; + private void newWindow(ActionEvent event) { + showImageView(image); + } + @FXML - private Button combineButton; + private void openTargetPath(ActionEvent event) { + try { + Desktop.getDesktop().browse(targetPath.toURI()); + } catch (Exception e) { + + } + } + @FXML - private VBox imageBox; + private void foreClicked(MouseEvent event) { + if (foreImage == null || location != ImagesRelativeLocation.Background_In_Foreground) { + return; + } + foreView.setCursor(Cursor.HAND); + + int xv = (int) Math.round(event.getX() * foreImage.getWidth() / foreView.getBoundsInLocal().getWidth()); + int yv = (int) Math.round(event.getY() * foreImage.getHeight() / foreView.getBoundsInLocal().getHeight()); + + pointX.setText(xv + ""); + pointY.setText(yv + ""); + } + @FXML - private ScrollPane targetScroll; + private void backClicked(MouseEvent event) { + if (backImage == null || location != ImagesRelativeLocation.Foreground_In_Background) { + return; + } + backView.setCursor(Cursor.HAND); + + int xv = (int) Math.round(event.getX() * backImage.getWidth() / backView.getBoundsInLocal().getWidth()); + int yv = (int) Math.round(event.getY() * backImage.getHeight() / backView.getBoundsInLocal().getHeight()); + + pointX.setText(xv + ""); + pointY.setText(yv + ""); + } + @FXML - private ImageView targetView; + protected void imageClicked(MouseEvent event) { + if (image == null) { + return; + } + imageView.setCursor(Cursor.HAND); - /** - * Initializes the controller class. - */ - @Override - public void initialize(URL url, ResourceBundle rb) { - // TODO + int xv = (int) Math.round(event.getX() * image.getWidth() / imageView.getBoundsInLocal().getWidth()); + int yv = (int) Math.round(event.getY() * image.getHeight() / imageView.getBoundsInLocal().getHeight()); + + pointX.setText(xv + ""); + pointY.setText(yv + ""); + + } + + private void blendImages() { + if (!isAreaValid || foreImage == null || backImage == null + || blendMode == null) { + image = null; + imageView.setImage(null); + bottomLabel.setText(""); + return; + } + + bottomLabel.setText(AppVaribles.getMessage("Loading...")); + + image = FxmlImageTools.blendImages(foreImage, backImage, + location, x, y, intersectOnlyCheck.isSelected(), blendMode, opacity); + if (image == null) { + bottomLabel.setText(""); + return; + } + imageView.setImage(image); + fitSize(); + bottomLabel.setText(AppVaribles.getMessage("BlendedSize") + ": " + + (int) image.getWidth() + "*" + (int) image.getHeight()); } } diff --git a/MyBox/src/main/java/mara/mybox/controller/ImagesCombineController.java b/MyBox/src/main/java/mara/mybox/controller/ImagesCombineController.java index 9f897caee..9440f34fa 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImagesCombineController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImagesCombineController.java @@ -1,13 +1,10 @@ package mara.mybox.controller; -import java.awt.Desktop; import java.awt.image.BufferedImage; import java.io.File; -import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Optional; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; @@ -17,14 +14,9 @@ import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.control.Alert; import javafx.scene.control.Button; -import javafx.scene.control.ButtonType; import javafx.scene.control.ColorPicker; import javafx.scene.control.ComboBox; -import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.SelectionMode; import javafx.scene.control.SplitPane; @@ -39,7 +31,7 @@ import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.Pane; +import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.FileChooser; @@ -58,7 +50,7 @@ import mara.mybox.objects.ImageFileInformation; import mara.mybox.tools.FileTools; import static mara.mybox.tools.FxmlTools.badStyle; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; /** * @Author Mara @@ -69,10 +61,11 @@ public class ImagesCombineController extends ImageViewerController { protected String ImageCombineArrayTypeKey, ImageCombineCombineSizeTypeKey, ImageCombineColumnsKey, ImageCombineIntervalKey, ImageCombineMarginsKey; - protected String ImageCombineEachWidthKey, ImageCombineEachHeightKey, ImageCombineTotalWidthKey, ImageCombineTotalHeightKey, ImageCombineFileTypeKey; + protected String ImageCombineEachWidthKey, ImageCombineEachHeightKey, ImageCombineTotalWidthKey, ImageCombineTotalHeightKey; protected String ImageCombineBgColorKey; private ImageCombine imageCombine; + private File targetFile; @FXML private TabPane tabPane; @@ -103,7 +96,7 @@ public class ImagesCombineController extends ImageViewerController { @FXML private VBox mainPane, imagesPane; @FXML - private Label sizeLabel; + private HBox toolBox; public ImagesCombineController() { ImageCombineArrayTypeKey = "ImageCombineArrayTypeKey"; @@ -115,7 +108,6 @@ public ImagesCombineController() { ImageCombineColumnsKey = "ImageCombineColumnsKey"; ImageCombineIntervalKey = "ImageCombineIntervalKey"; ImageCombineMarginsKey = "ImageCombineMarginsKey"; - ImageCombineFileTypeKey = "ImageCombineFileTypeKey"; ImageCombineBgColorKey = "ImageCombineBgColorKey"; } @@ -490,51 +482,12 @@ private void checkTotalHeightValue() { private void initTargetSection() { try { - targetTypeBox.getItems().addAll(CommonValues.SupportedImages); - targetTypeBox.valueProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, - String oldValue, String newValue) { - AppVaribles.setConfigValue(ImageCombineFileTypeKey, newValue); - } - }); - targetTypeBox.getSelectionModel().select(AppVaribles.getConfigValue(ImageCombineFileTypeKey, "png")); - - targetPathInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, - String oldValue, String newValue) { - try { - final File file = new File(newValue); - if (!file.exists() || !file.isDirectory()) { - targetPathInput.setStyle(badStyle); - targetPath = null; - return; - } - targetPathInput.setStyle(null); - AppVaribles.setConfigValue(targetPathKey, file.getPath()); - targetPath = file; - } catch (Exception e) { - targetPathInput.setStyle(badStyle); - targetPath = null; - } - } - }); - targetPathInput.setText(AppVaribles.getConfigValue(targetPathKey, CommonValues.UserFilePath)); - - openTargetButton.disableProperty().bind( - Bindings.isEmpty(targetPathInput.textProperty()) - .or(targetPathInput.styleProperty().isEqualTo(badStyle)) - ); - - toolbar.disableProperty().bind( + toolBox.disableProperty().bind( Bindings.isEmpty(imageCombine.getSourceImages()) ); saveButton.disableProperty().bind( Bindings.isEmpty(imageCombine.getSourceImages()) - .or(openTargetButton.disableProperty()) - .or(targetTypeBox.valueProperty().isNull()) ); } catch (Exception e) { @@ -542,77 +495,58 @@ public void changed(ObservableValue observable, } } - @FXML - private void openTargetPath(ActionEvent event) { - try { - Desktop.getDesktop().browse(targetPath.toURI()); - } catch (Exception e) { - - } - } - @FXML private void saveAction(ActionEvent event) { if (image == null) { return; } - Task saveTask = new Task() { - String filename; + try { + final FileChooser fileChooser = new FileChooser(); + File path = new File(AppVaribles.getConfigValue(targetPathKey, CommonValues.UserFilePath)); + if (!path.isDirectory()) { + path = new File(CommonValues.UserFilePath); + } + fileChooser.setInitialDirectory(path); + fileChooser.getExtensionFilters().addAll(fileExtensionFilter); + final File file = fileChooser.showSaveDialog(getMyStage()); + if (file == null) { + return; + } + AppVaribles.setConfigValue(targetPathKey, file.getParent()); + targetFile = file; - @Override - protected Void call() throws Exception { - try { - String format = targetTypeBox.getSelectionModel().getSelectedItem(); - filename = new File(targetPath.getAbsolutePath() + "/" + targetPrefixInput.getText() + "." + format).getAbsolutePath(); - final BufferedImage bufferedImage = FxmlImageTools.getBufferedImage(image); - ImageFileWriters.writeImageFile(bufferedImage, format, filename); - } catch (Exception e) { - logger.error(e.toString()); - } - Platform.runLater(new Runnable() { - @Override - public void run() { - Alert alert = new Alert(Alert.AlertType.INFORMATION); - alert.setTitle(getMyStage().getTitle()); - String info = MessageFormat.format(AppVaribles.getMessage("FileSaved"), filename); - alert.setContentText(info); - ButtonType buttonOpenInNewWindow = new ButtonType(AppVaribles.getMessage("OpenInNewWindow")); - ButtonType buttonOpen = new ButtonType(AppVaribles.getMessage("Open")); - ButtonType buttonClose = new ButtonType(AppVaribles.getMessage("Close")); - alert.getButtonTypes().setAll(buttonOpenInNewWindow, buttonOpen, buttonClose); - Optional result = alert.showAndWait(); - if (result.get() == buttonOpen) { - try { - if (!stageReloading()) { - return; - } - FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(CommonValues.ImageManufactureFileFxml), AppVaribles.CurrentBundle); - Pane pane = fxmlLoader.load(); - final ImageManufactureController controller = fxmlLoader.getController(); - controller.setMyStage(myStage); - myStage.setScene(new Scene(pane)); - myStage.setTitle(AppVaribles.getMessage("ImageManufacture")); - controller.loadImage(filename); - } catch (Exception e) { - logger.error(e.toString()); - } - } else if (result.get() == buttonOpenInNewWindow) { - openImageManufactureInNew(filename); - } + Task saveTask = new Task() { + + @Override + protected Void call() throws Exception { + try { + String filename = targetFile.getAbsolutePath(); + String format = FileTools.getFileSuffix(filename); + final BufferedImage bufferedImage = FxmlImageTools.getBufferedImage(image); + ImageFileWriters.writeImageFile(bufferedImage, format, filename); + } catch (Exception e) { + logger.error(e.toString()); } - }); - return null; - } - }; - openHandlingStage(saveTask, Modality.WINDOW_MODAL); - Thread thread = new Thread(saveTask); - thread.setDaemon(true); - thread.start(); + return null; + } + }; + openHandlingStage(saveTask, Modality.WINDOW_MODAL); + Thread thread = new Thread(saveTask); + thread.setDaemon(true); + thread.start(); + } catch (Exception e) { + logger.error(e.toString()); + } } @FXML private void newWindow(ActionEvent event) { showImageView(image); +// if (targetFile != null) { +// openImageManufactureInNew(targetFile.getAbsolutePath()); +// } else if (image != null) { +// showImageView(image); +// } } @FXML @@ -778,11 +712,11 @@ private void combineImages() { || eachHeightInput.getStyle().equals(badStyle)) { image = null; imageView.setImage(null); - sizeLabel.setText(""); + bottomLabel.setText(""); return; } - sizeLabel.setText(AppVaribles.getMessage("Loading...")); + bottomLabel.setText(AppVaribles.getMessage("Loading...")); List sources = imageCombine.getSourceImages(); if (imageCombine.getArrayType() == ArrayType.SingleColumn) { @@ -799,7 +733,7 @@ private void combineImages() { } imageView.setImage(image); fitSize(); - sizeLabel.setText(AppVaribles.getMessage("CombinedSize") + ": " + bottomLabel.setText(AppVaribles.getMessage("CombinedSize") + ": " + (int) image.getWidth() + "x" + (int) image.getHeight()); } diff --git a/MyBox/src/main/java/mara/mybox/controller/ImagesCombinePdfController.java b/MyBox/src/main/java/mara/mybox/controller/ImagesCombinePdfController.java index 76032b246..c8cd92e2a 100644 --- a/MyBox/src/main/java/mara/mybox/controller/ImagesCombinePdfController.java +++ b/MyBox/src/main/java/mara/mybox/controller/ImagesCombinePdfController.java @@ -51,7 +51,7 @@ import mara.mybox.objects.CommonValues; import mara.mybox.objects.ImageFileInformation; import mara.mybox.tools.FileTools; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import static mara.mybox.tools.FxmlTools.badStyle; import mara.mybox.tools.PdfTools; diff --git a/MyBox/src/main/java/mara/mybox/controller/MainMenuController.java b/MyBox/src/main/java/mara/mybox/controller/MainMenuController.java index 6f967f25a..61aab987c 100644 --- a/MyBox/src/main/java/mara/mybox/controller/MainMenuController.java +++ b/MyBox/src/main/java/mara/mybox/controller/MainMenuController.java @@ -13,9 +13,9 @@ import javafx.stage.Stage; import mara.mybox.objects.AppVaribles; import mara.mybox.objects.CommonValues; -import mara.mybox.tools.FxmlTools; import static mara.mybox.controller.BaseController.logger; import static mara.mybox.objects.AppVaribles.getConfigValue; +import mara.mybox.tools.FxmlTools; /** * @Author Mara @@ -479,10 +479,15 @@ private void openImageSplit(ActionEvent event) { } @FXML - private void openImageCombine(ActionEvent event) { + private void openImagesCombine(ActionEvent event) { reloadStage(CommonValues.ImagesCombineFxml, AppVaribles.getMessage("ImageCombine")); } + @FXML + private void openImagesBlend(ActionEvent event) { + reloadStage(CommonValues.ImagesBlendFxml, AppVaribles.getMessage("ImagesBlend")); + } + @FXML private void openColorPalette(ActionEvent event) { openStage(CommonValues.ColorPaletteFxml, AppVaribles.getMessage("ColorPalette"), false, false); @@ -542,10 +547,32 @@ private void openWeiboSnap(ActionEvent event) { } @FXML - private void showImageHelp(ActionEvent event) { + private void showHelp(ActionEvent event) { try { - File help = FxmlTools.getUserFile(getClass(), "/docs/ImageHelp.html", "ImageHelp.html"); - Desktop.getDesktop().browse(help.toURI()); + String lang = AppVaribles.getLanguage(); + File mybox_help = FxmlTools.getUserFile(getClass(), + "/docs/mybox_help_" + lang + ".html", "mybox_help_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/mybox_help_nav_" + lang + ".html", "mybox_help_nav_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/mybox_help_main_" + lang + ".html", "mybox_help_main_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/ImageCompressionType_" + lang + ".html", "ImageCompressionType_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/AboutImageBlending_" + lang + ".html", "AboutImageBlending_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/AboutColorDistance_" + lang + ".html", "AboutColorDistance_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/AboutImageGrayscale_" + lang + ".html", "AboutImageGrayscale_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/HowPackExe_" + lang + ".html", "HowPackExe_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/ImageMetaData_" + lang + ".html", "ImageMetaData_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/ImageSepia_" + lang + ".html", "ImageSepia_" + lang + ".html", true); + FxmlTools.getUserFile(getClass(), + "/docs/Java2D_" + lang + ".html", "Java2D_" + lang + ".html", true); + Desktop.getDesktop().browse(mybox_help.toURI()); } catch (Exception e) { logger.error(e.toString()); } diff --git a/MyBox/src/main/java/mara/mybox/controller/MyBoxController.java b/MyBox/src/main/java/mara/mybox/controller/MyBoxController.java index 039c5a7b3..47919c8fc 100644 --- a/MyBox/src/main/java/mara/mybox/controller/MyBoxController.java +++ b/MyBox/src/main/java/mara/mybox/controller/MyBoxController.java @@ -180,6 +180,7 @@ public void handle(ActionEvent event) { reloadStage(CommonValues.ImageSplitFxml, AppVaribles.getMessage("ImageSplit")); } }); + MenuItem ImageCombine = new MenuItem(AppVaribles.getMessage("ImageCombine")); ImageCombine.setOnAction(new EventHandler() { @Override @@ -187,6 +188,15 @@ public void handle(ActionEvent event) { reloadStage(CommonValues.ImagesCombineFxml, AppVaribles.getMessage("ImageCombine")); } }); + + MenuItem ImagesBlend = new MenuItem(AppVaribles.getMessage("ImagesBlend")); + ImagesBlend.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + reloadStage(CommonValues.ImagesBlendFxml, AppVaribles.getMessage("ImagesBlend")); + } + }); + MenuItem imagesCombinePdf = new MenuItem(AppVaribles.getMessage("ImagesCombinePdf")); imagesCombinePdf.setOnAction(new EventHandler() { @Override @@ -229,7 +239,8 @@ public void handle(ActionEvent event) { imageMenu = new ContextMenu(); imageMenu.getItems().addAll(ImageManufacture, manufactureSubMenu, manufactureBatchMenu, new SeparatorMenuItem(), - ImageSplit, ImageCombine, imagesCombinePdf, new SeparatorMenuItem(), + ImageSplit, ImageCombine, ImagesBlend, new SeparatorMenuItem(), + imagesCombinePdf, new SeparatorMenuItem(), imageViewer, imagesViewer, new SeparatorMenuItem(), imageConverter, imageConverterBatch, new SeparatorMenuItem(), colorPalette, pixelsCalculator); diff --git a/MyBox/src/main/java/mara/mybox/controller/WeiboSnapRunController.java b/MyBox/src/main/java/mara/mybox/controller/WeiboSnapRunController.java index 70854d1c4..760947540 100644 --- a/MyBox/src/main/java/mara/mybox/controller/WeiboSnapRunController.java +++ b/MyBox/src/main/java/mara/mybox/controller/WeiboSnapRunController.java @@ -49,7 +49,7 @@ import mara.mybox.objects.WeiboSnapParameters; import mara.mybox.tools.DateTools; import mara.mybox.tools.FileTools; -import mara.mybox.tools.FxmlImageTools; +import mara.mybox.image.FxmlImageTools; import mara.mybox.tools.FxmlTools; import mara.mybox.tools.NetworkTools; import static mara.mybox.tools.NetworkTools.checkWeiboPassport; diff --git a/MyBox/src/main/java/mara/mybox/tools/FxmlImageTools.java b/MyBox/src/main/java/mara/mybox/image/FxmlImageTools.java similarity index 88% rename from MyBox/src/main/java/mara/mybox/tools/FxmlImageTools.java rename to MyBox/src/main/java/mara/mybox/image/FxmlImageTools.java index 9f0e7310b..f588c90ba 100644 --- a/MyBox/src/main/java/mara/mybox/tools/FxmlImageTools.java +++ b/MyBox/src/main/java/mara/mybox/image/FxmlImageTools.java @@ -1,4 +1,4 @@ -package mara.mybox.tools; +package mara.mybox.image; import java.awt.image.BufferedImage; import java.util.List; @@ -23,6 +23,8 @@ import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.scene.text.Text; +import mara.mybox.image.ImageBlendTools.ImagesBlendMode; +import mara.mybox.image.ImageBlendTools.ImagesRelativeLocation; import mara.mybox.image.ImageConvertTools; import mara.mybox.objects.ImageCombine; import mara.mybox.objects.ImageFileInformation; @@ -126,13 +128,7 @@ public static Image changeSaturate(Image image, float change, ImageScope scope) continue; } if (scope == null || scope.inScope(x, y, color)) { - double v = color.getSaturation() * (1.0 + change); - if (v > 1.0) { - v = 1.0; - } - if (v < 0.0) { - v = 0.0; - } + double v = Math.min(Math.max(color.getSaturation() * (1.0 + change), 0.0), 1.0); Color newColor = Color.hsb(color.getHue(), v, color.getBrightness(), color.getOpacity()); pixelWriter.setColor(x, y, newColor); } else { @@ -156,13 +152,7 @@ public static Image changeBrightness(Image image, float change, ImageScope scope continue; } if (scope == null || scope.inScope(x, y, color)) { - double v = color.getBrightness() * (1.0 + change); - if (v > 1.0) { - v = 1.0; - } - if (v < 0.0) { - v = 0.0; - } + double v = Math.min(Math.max(color.getBrightness() * (1.0 + change), 0.0), 1.0); Color newColor = Color.hsb(color.getHue(), color.getSaturation(), v, color.getOpacity()); pixelWriter.setColor(x, y, newColor); } else { @@ -239,12 +229,7 @@ public static Image changeRed(Image image, double change, ImageScope scope) { continue; } if (scope == null || scope.inScope(x, y, color)) { - double red = color.getRed() + change; - if (red > 1.0) { - red = 1.0; - } else if (red < 0.0) { - red = 0.0; - } + double red = Math.min(Math.max(color.getRed() + change, 0.0), 1.0); Color newColor = new Color(red, color.getGreen(), color.getBlue(), color.getOpacity()); pixelWriter.setColor(x, y, newColor); } else { @@ -268,12 +253,7 @@ public static Image changeGreen(Image image, double change, ImageScope scope) { continue; } if (scope == null || scope.inScope(x, y, color)) { - double green = color.getGreen() + change; - if (green > 1.0) { - green = 1.0; - } else if (green < 0.0) { - green = 0.0; - } + double green = Math.min(Math.max(color.getGreen() + change, 0.0), 1.0); Color newColor = new Color(color.getRed(), green, color.getBlue(), color.getOpacity()); pixelWriter.setColor(x, y, newColor); } else { @@ -297,12 +277,7 @@ public static Image changeBlue(Image image, double change, ImageScope scope) { continue; } if (scope == null || scope.inScope(x, y, color)) { - double blue = color.getBlue() + change; - if (blue > 1.0) { - blue = 1.0; - } else if (blue < 0.0) { - blue = 0.0; - } + double blue = Math.min(Math.max(color.getBlue() + change, 0.0), 1.0); Color newColor = new Color(color.getRed(), color.getGreen(), blue, color.getOpacity()); pixelWriter.setColor(x, y, newColor); } else { @@ -313,6 +288,107 @@ public static Image changeBlue(Image image, double change, ImageScope scope) { return newImage; } + public static Image changeYellow(Image image, double change, ImageScope scope) { + PixelReader pixelReader = image.getPixelReader(); + WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); + PixelWriter pixelWriter = newImage.getPixelWriter(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = pixelReader.getColor(x, y); + if (color == Color.TRANSPARENT) { + pixelWriter.setColor(x, y, color); + continue; + } + if (scope == null || scope.inScope(x, y, color)) { + double red = Math.min(Math.max(color.getRed() + change, 0.0), 1.0); + double green = Math.min(Math.max(color.getGreen() + change, 0.0), 1.0); + Color newColor = new Color(red, green, color.getBlue(), color.getOpacity()); + pixelWriter.setColor(x, y, newColor); + } else { + pixelWriter.setColor(x, y, color); + } + } + } + return newImage; + } + + public static Image changeCyan(Image image, double change, ImageScope scope) { + PixelReader pixelReader = image.getPixelReader(); + WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); + PixelWriter pixelWriter = newImage.getPixelWriter(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = pixelReader.getColor(x, y); + if (color == Color.TRANSPARENT) { + pixelWriter.setColor(x, y, color); + continue; + } + if (scope == null || scope.inScope(x, y, color)) { + double green = Math.min(Math.max(color.getGreen() + change, 0.0), 1.0); + double blue = Math.min(Math.max(color.getBlue() + change, 0.0), 1.0); + Color newColor = new Color(color.getRed(), green, blue, color.getOpacity()); + pixelWriter.setColor(x, y, newColor); + } else { + pixelWriter.setColor(x, y, color); + } + } + } + return newImage; + } + + public static Image changeMagenta(Image image, double change, ImageScope scope) { + PixelReader pixelReader = image.getPixelReader(); + WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); + PixelWriter pixelWriter = newImage.getPixelWriter(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = pixelReader.getColor(x, y); + if (color == Color.TRANSPARENT) { + pixelWriter.setColor(x, y, color); + continue; + } + if (scope == null || scope.inScope(x, y, color)) { + double red = Math.min(Math.max(color.getRed() + change, 0.0), 1.0); + double blue = Math.min(Math.max(color.getBlue() + change, 0.0), 1.0); + Color newColor = new Color(red, color.getGreen(), blue, color.getOpacity()); + pixelWriter.setColor(x, y, newColor); + } else { + pixelWriter.setColor(x, y, color); + } + } + } + return newImage; + } + + public static Image changeRGB(Image image, double change, ImageScope scope) { + PixelReader pixelReader = image.getPixelReader(); + WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); + PixelWriter pixelWriter = newImage.getPixelWriter(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = pixelReader.getColor(x, y); + if (color == Color.TRANSPARENT) { + pixelWriter.setColor(x, y, color); + continue; + } + if (scope == null || scope.inScope(x, y, color)) { + double red = Math.min(Math.max(color.getRed() + change, 0.0), 1.0); + double green = Math.min(Math.max(color.getGreen() + change, 0.0), 1.0); + double blue = Math.min(Math.max(color.getBlue() + change, 0.0), 1.0); + Color newColor = new Color(red, green, blue, color.getOpacity()); + pixelWriter.setColor(x, y, newColor); + } else { + pixelWriter.setColor(x, y, color); + } + } + } + return newImage; + } + public static Image keepRed(Image image, ImageScope scope) { PixelReader pixelReader = image.getPixelReader(); WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); @@ -512,7 +588,7 @@ public static Image makeGray(Image image, ImageScope scope) { continue; } if (scope.inScope(x, y, color)) { - pixelWriter.setColor(x, y, color.grayscale()); + pixelWriter.setColor(x, y, color.grayscale()); // JDK internal: 0.21 * red + 0.71 * green + 0.07 * blue } else { pixelWriter.setColor(x, y, color); } @@ -522,7 +598,7 @@ public static Image makeGray(Image image, ImageScope scope) { } - public static Image makeBinaryFx(Image image, int precent, ImageScope scope) { + public static Image makeBinaryFx(Image image, ImageScope scope, int precent) { double p = precent / 100.0; PixelReader pixelReader = image.getPixelReader(); WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); @@ -537,8 +613,7 @@ public static Image makeBinaryFx(Image image, int precent, ImageScope scope) { } if (scope.inScope(x, y, color)) { - double gray = 0.299 * color.getRed() + 0.587 * color.getGreen() + 0.114 * color.getBlue(); -// double gray = 0.21 * color.getRed() + 0.71 * color.getGreen() + 0.07 * color.getBlue(); // refer color.grayscale() + double gray = 0.2126 * color.getRed() + 0.7152 * color.getGreen() + 0.0722 * color.getBlue(); if (gray < p) { pixelWriter.setColor(x, y, Color.BLACK); } else { @@ -553,6 +628,40 @@ public static Image makeBinaryFx(Image image, int precent, ImageScope scope) { } + public static Image makeSepia(Image image, ImageScope scope, int sepiaIntensity) { + PixelReader pixelReader = image.getPixelReader(); + WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight()); + PixelWriter pixelWriter = newImage.getPixelWriter(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = pixelReader.getColor(x, y); + if (color == Color.TRANSPARENT) { + pixelWriter.setColor(x, y, color); + continue; + } + if (scope.inScope(x, y, color)) { + pixelWriter.setColor(x, y, pixel2Sepia(color, sepiaIntensity)); + } else { + pixelWriter.setColor(x, y, color); + } + } + } + return newImage; + + } + + public static Color pixel2Sepia(Color color, int sepiaIntensity) { + int sepiaDepth = 20; + int gray = (int) (color.grayscale().getRed() * 255); + int r = gray, g = gray, b = gray; + r = Math.min(r + (sepiaDepth * 2), 255); + g = Math.min(g + sepiaDepth, 255); + b = Math.min(Math.max(b - sepiaIntensity, 0), 255); + Color newColor = new Color(r / 255.0f, g / 255.0f, b / 255.0f, color.getOpacity()); + return newColor; + } + // https://en.wikipedia.org/wiki/Color_difference public static double calculateColorDistance2(Color color1, Color color2) { if (color1 == color2) { @@ -1214,6 +1323,16 @@ public static Image edgeDetectImage(Image image) { return newImage; } + public static Image embossImage(Image image, int direction, int size, boolean gray) { + if (image == null) { + return null; + } + BufferedImage source = clearAlpha(image); + BufferedImage target = ImageConvertTools.embossImage(source, direction, size, gray); + Image newImage = SwingFXUtils.toFXImage(target, null); + return newImage; + } + public static Image thresholdingImage(Image image, int threshold, int smallValue, int bigValue) { if (image == null) { @@ -1722,4 +1841,21 @@ public static Image blurMarginsFx(Image image, int size) { return newImage; } + public static Image blendImages(Image foreImage, Image backImage, + ImagesRelativeLocation location, int x, int y, + boolean intersectOnly, ImagesBlendMode blendMode, float opacity) { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + BufferedImage source1 = SwingFXUtils.fromFXImage(foreImage, null); + BufferedImage source2 = SwingFXUtils.fromFXImage(backImage, null); + BufferedImage target = ImageBlendTools.blendImages(source1, source2, + location, x, y, intersectOnly, blendMode, opacity); + if (target == null) { + target = source1; + } + Image newImage = SwingFXUtils.toFXImage(target, null); + return newImage; + } + } diff --git a/MyBox/src/main/java/mara/mybox/image/ImageAnalyzeTools.java b/MyBox/src/main/java/mara/mybox/image/ImageAnalyzeTools.java new file mode 100644 index 000000000..97b428f84 --- /dev/null +++ b/MyBox/src/main/java/mara/mybox/image/ImageAnalyzeTools.java @@ -0,0 +1,43 @@ +package mara.mybox.image; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @Author Mara + * @CreateDate 2018-10-27 19:21:31 + * @Version 1.0 + * @Description + * @License Apache License Version 2.0 + */ +public class ImageAnalyzeTools { + + private static final Logger logger = LogManager.getLogger(); + + public int[][] calculateHistogram(BufferedImage source) { + try { + int[] red = new int[256]; + int[] green = new int[256]; + int[] blue = new int[256]; + int width = source.getWidth(); + int height = source.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int color = source.getRGB(i, j); + Color c = new Color(color); + red[c.getRed()]++; + green[c.getGreen()]++; + blue[c.getBlue()]++; + } + } + int[][] h = {red, green, blue}; + return h; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + +} diff --git a/MyBox/src/main/java/mara/mybox/image/ImageBlendTools.java b/MyBox/src/main/java/mara/mybox/image/ImageBlendTools.java new file mode 100644 index 000000000..ac1b8e51a --- /dev/null +++ b/MyBox/src/main/java/mara/mybox/image/ImageBlendTools.java @@ -0,0 +1,420 @@ +package mara.mybox.image; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.util.Random; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @Author Mara + * @CreateDate 2018-10-31 20:03:32 + * @Version 1.0 + * @Description + * @License Apache License Version 2.0 + */ +public class ImageBlendTools { + + private static final Logger logger = LogManager.getLogger(); + + public enum ImagesRelativeLocation { + Foreground_In_Background, + Background_In_Foreground + } + + public enum ImagesCompositeMode { + A_OR_B, + A_AND_B, + A, + B + } + + public enum ImagesBlendMode { + NORMAL, + DISSOLVE, + DARKEN, + MULTIPLY, + COLOR_BURN, + LINEAR_BURN, + SOFT_BURN, + LIGHTEN, + SCREEN, + COLOR_DODGE, + LINEAR_DODGE, + SOFT_DODGE, + DIVIDE, + VIVID_LIGHT, + LINEAR_LIGHT, + SUBTRACT, + AVERAGE, + OVERLAY, + HARD_LIGHT, + SOFT_LIGHT, + DIFFERENCE, + NEGATION, + EXCLUSION, + REFLECT, + GLOW, + FREEZE, + HEAT, + STAMP, + RED, + GREEN, + BLUE, + HUE, + SATURATION, + COLOR, + LUMINOSITY + } + + public static BufferedImage blendImages(BufferedImage foreImage, BufferedImage backImage, + ImagesRelativeLocation location, int x, int y, + boolean intersectOnly, ImagesBlendMode blendMode, float alpha) { + try { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + switch (location) { + case Foreground_In_Background: + if (intersectOnly) { + return blendImagesFinBIntrsectOnly(foreImage, backImage, x, y, blendMode, alpha); + } else { + return blendImagesFinB(foreImage, backImage, x, y, blendMode, alpha); + } + case Background_In_Foreground: + if (intersectOnly) { + return blendImagesBinFIntrsectOnly(foreImage, backImage, x, y, blendMode, alpha); + } else { + return blendImagesBinF(foreImage, backImage, x, y, blendMode, alpha); + } + default: + return foreImage; + } + + } catch (Exception e) { + logger.error(e.toString()); + return foreImage; + } + } + + public static BufferedImage blendImagesFinB(BufferedImage foreImage, BufferedImage backImage, + int x, int y, ImagesBlendMode blendMode, float alpha) { + try { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + int imageType = BufferedImage.TYPE_INT_ARGB; + BufferedImage target = new BufferedImage(backImage.getWidth(), backImage.getHeight(), imageType); + for (int j = 0; j < backImage.getHeight(); j++) { + for (int i = 0; i < backImage.getWidth(); i++) { + target.setRGB(i, j, backImage.getRGB(i, j)); + } + } + int areaWidth = Math.min(backImage.getWidth() - x, foreImage.getWidth()); + int areaHeight = Math.min(backImage.getHeight() - y, foreImage.getHeight()); + for (int j = 0; j < areaHeight; j++) { + for (int i = 0; i < areaWidth; i++) { + int pixelFore = foreImage.getRGB(i, j); + int pixelBack = backImage.getRGB(i + x, j + y); + target.setRGB(i + x, j + y, blendColors(pixelFore, pixelBack, blendMode, alpha)); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage blendImagesFinBIntrsectOnly(BufferedImage foreImage, BufferedImage backImage, + int x, int y, ImagesBlendMode blendMode, float alpha) { + try { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + int imageType = BufferedImage.TYPE_INT_ARGB; + int areaWidth = Math.min(backImage.getWidth() - x, foreImage.getWidth()); + int areaHeight = Math.min(backImage.getHeight() - y, foreImage.getHeight()); + BufferedImage target = new BufferedImage(areaWidth, areaHeight, imageType); + for (int j = 0; j < areaHeight; j++) { + for (int i = 0; i < areaWidth; i++) { + int pixelFore = foreImage.getRGB(i, j); + int pixelBack = backImage.getRGB(i + x, j + y); + target.setRGB(i, j, blendColors(pixelFore, pixelBack, blendMode, alpha)); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage blendImagesBinF(BufferedImage foreImage, BufferedImage backImage, + int x, int y, ImagesBlendMode blendMode, float alpha) { + try { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + int imageType = BufferedImage.TYPE_INT_ARGB; + BufferedImage target = new BufferedImage(foreImage.getWidth(), foreImage.getHeight(), imageType); + for (int j = 0; j < foreImage.getHeight(); j++) { + for (int i = 0; i < foreImage.getWidth(); i++) { + target.setRGB(i, j, foreImage.getRGB(i, j)); + } + } + int areaWidth = Math.min(foreImage.getWidth() - x, backImage.getWidth()); + int areaHeight = Math.min(foreImage.getHeight() - y, backImage.getHeight()); + for (int j = 0; j < areaHeight; j++) { + for (int i = 0; i < areaWidth; i++) { + int pixelFore = foreImage.getRGB(i + x, j + y); + int pixelBack = backImage.getRGB(i, j); + target.setRGB(i + x, j + y, blendColors(pixelFore, pixelBack, blendMode, alpha)); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage blendImagesBinFIntrsectOnly(BufferedImage foreImage, BufferedImage backImage, + int x, int y, ImagesBlendMode blendMode, float alpha) { + try { + if (foreImage == null || backImage == null || blendMode == null) { + return null; + } + int imageType = BufferedImage.TYPE_INT_ARGB; + int areaWidth = Math.min(foreImage.getWidth() - x, backImage.getWidth()); + int areaHeight = Math.min(foreImage.getHeight() - y, backImage.getHeight()); + BufferedImage target = new BufferedImage(areaWidth, areaHeight, imageType); + for (int j = 0; j < areaHeight; j++) { + for (int i = 0; i < areaWidth; i++) { + int pixelFore = foreImage.getRGB(i + x, j + y); + int pixelBack = backImage.getRGB(i, j); + target.setRGB(i, j, blendColors(pixelFore, pixelBack, blendMode, alpha)); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + // https://en.wikipedia.org/wiki/Blend_modes + // https://blog.csdn.net/bravebean/article/details/51392440 + // https://www.cnblogs.com/bigdream6/p/8385886.html + // https://baike.baidu.com/item/%E6%B7%B7%E5%90%88%E6%A8%A1%E5%BC%8F/6700481?fr=aladdin + public static int blendColors(int forePixel, int bacckPixel, + ImagesBlendMode blendMode, float alpha) { + try { + if (blendMode == null) { + return forePixel; + } + Color foreColor = new Color(forePixel); + Color backColor = new Color(bacckPixel); + int red, green, blue; + switch (blendMode) { + case NORMAL: + red = (int) (foreColor.getRed() * alpha + backColor.getRed() * (1.0f - alpha)); + green = (int) (foreColor.getGreen() * alpha + backColor.getGreen() * (1.0f - alpha)); + blue = (int) (foreColor.getBlue() * alpha + backColor.getBlue() * (1.0f - alpha)); + break; + case DISSOLVE: + float opacity = new Random().nextInt(101) / 100.0f; + red = (int) (foreColor.getRed() * opacity + backColor.getRed() * (1.0f - opacity)); + green = (int) (foreColor.getGreen() * opacity + backColor.getGreen() * (1.0f - opacity)); + blue = (int) (foreColor.getBlue() * opacity + backColor.getBlue() * (1.0f - opacity)); + break; + case MULTIPLY: + red = foreColor.getRed() * backColor.getRed() / 255; + green = foreColor.getGreen() * backColor.getGreen() / 255; + blue = foreColor.getBlue() * backColor.getBlue() / 255; + break; + case SCREEN: + red = 255 - (255 - foreColor.getRed()) * (255 - backColor.getRed()) / 255; + green = 255 - (255 - foreColor.getGreen()) * (255 - backColor.getGreen()) / 255; + blue = 255 - (255 - foreColor.getBlue()) * (255 - backColor.getBlue()) / 255; + break; + case OVERLAY: + if (backColor.getRed() < 128) { + red = foreColor.getRed() * backColor.getRed() / 128; + } else { + red = 255 - (255 - foreColor.getRed()) * (255 - backColor.getRed()) / 128; + } + if (backColor.getGreen() < 128) { + green = foreColor.getGreen() * backColor.getGreen() / 128; + } else { + green = 255 - (255 - foreColor.getGreen()) * (255 - backColor.getGreen()) / 128; + } + if (backColor.getBlue() < 128) { + blue = foreColor.getBlue() * backColor.getBlue() / 128; + } else { + blue = 255 - (255 - foreColor.getBlue()) * (255 - backColor.getBlue()) / 128; + } + break; + case HARD_LIGHT: + if (foreColor.getRed() < 128) { + red = foreColor.getRed() * backColor.getRed() / 128; + } else { + red = 255 - (255 - foreColor.getRed()) * (255 - backColor.getRed()) / 128; + } + if (foreColor.getGreen() < 128) { + green = foreColor.getGreen() * backColor.getGreen() / 128; + } else { + green = 255 - (255 - foreColor.getGreen()) * (255 - backColor.getGreen()) / 128; + } + if (foreColor.getBlue() < 128) { + blue = foreColor.getBlue() * backColor.getBlue() / 128; + } else { + blue = 255 - (255 - foreColor.getBlue()) * (255 - backColor.getBlue()) / 128; + } + break; + case SOFT_LIGHT: + if (foreColor.getRed() < 128) { + red = backColor.getRed() + + (2 * foreColor.getRed() - 255) * (backColor.getRed() - backColor.getRed() * backColor.getRed() / 255) / 255; + } else { + red = (int) (backColor.getRed() + + (2 * foreColor.getRed() - 255) * (Math.sqrt(backColor.getRed() / 255.0f) * 255 - backColor.getRed()) / 255); + } + if (foreColor.getRed() < 128) { + green = backColor.getGreen() + + (2 * foreColor.getGreen() - 255) * (backColor.getGreen() - backColor.getGreen() * backColor.getGreen() / 255) / 255; + } else { + green = (int) (backColor.getRed() + + (2 * foreColor.getGreen() - 255) * (Math.sqrt(backColor.getGreen() / 255.0f) * 255 - backColor.getGreen()) / 255); + } + if (foreColor.getRed() < 128) { + blue = backColor.getBlue() + + (2 * foreColor.getBlue() - 255) * (backColor.getBlue() - backColor.getBlue() * backColor.getBlue() / 255) / 255; + } else { + blue = (int) (backColor.getRed() + + (2 * foreColor.getBlue() - 255) * (Math.sqrt(backColor.getBlue() / 255.0f) * 255 - backColor.getBlue()) / 255); + } + break; + case COLOR_DODGE: + red = foreColor.getRed() == 255 ? 255 + : (backColor.getRed() + (foreColor.getRed() * backColor.getRed()) / (255 - foreColor.getRed())); + green = foreColor.getGreen() == 255 ? 255 + : (backColor.getGreen() + (foreColor.getGreen() * backColor.getGreen()) / (255 - foreColor.getGreen())); + blue = foreColor.getBlue() == 255 ? 255 + : (backColor.getBlue() + (foreColor.getBlue() * backColor.getBlue()) / (255 - foreColor.getBlue())); + break; + case LINEAR_DODGE: + red = foreColor.getRed() + backColor.getRed(); + green = foreColor.getGreen() + backColor.getGreen(); + blue = foreColor.getBlue() + backColor.getBlue(); + break; + case DIVIDE: + red = foreColor.getRed() == 0 ? 255 : ((backColor.getRed() * 255) / foreColor.getRed()); + green = foreColor.getGreen() == 0 ? 255 : ((backColor.getGreen() * 255) / foreColor.getGreen()); + blue = foreColor.getBlue() == 0 ? 255 : ((backColor.getBlue() * 255) / foreColor.getBlue()); + break; + case COLOR_BURN: + red = foreColor.getRed() == 0 ? 0 + : (backColor.getRed() - (255 - foreColor.getRed()) * 255 / foreColor.getRed()); + green = foreColor.getGreen() == 0 ? 0 + : (backColor.getGreen() - (255 - foreColor.getGreen()) * 255 / foreColor.getGreen()); + blue = foreColor.getBlue() == 0 ? 0 + : (backColor.getBlue() - (255 - foreColor.getBlue()) * 255 / foreColor.getBlue()); + break; + case LINEAR_BURN: + red = backColor.getRed() == 0 ? 0 + : foreColor.getRed() + backColor.getRed() - 255; + green = backColor.getGreen() == 0 ? 0 + : foreColor.getGreen() + backColor.getGreen() - 255; + blue = backColor.getBlue() == 0 ? 0 + : foreColor.getBlue() + backColor.getBlue() - 255; + break; + case VIVID_LIGHT: + if (foreColor.getRed() < 128) { + red = foreColor.getRed() == 0 ? backColor.getRed() + : (backColor.getRed() - (255 - backColor.getRed()) * (255 - 2 * foreColor.getRed()) / (2 * foreColor.getRed())); + } else { + red = foreColor.getRed() == 255 ? backColor.getRed() + : (backColor.getRed() + backColor.getRed() * (2 * foreColor.getRed() - 255) / (2 * (255 - foreColor.getRed()))); + } + if (foreColor.getGreen() < 128) { + green = foreColor.getGreen() == 0 ? backColor.getGreen() + : (backColor.getGreen() - (255 - backColor.getGreen()) * (255 - 2 * foreColor.getGreen()) / (2 * foreColor.getGreen())); + } else { + green = foreColor.getGreen() == 255 ? backColor.getGreen() + : (backColor.getGreen() + backColor.getGreen() * (2 * foreColor.getGreen() - 255) / (2 * (255 - foreColor.getGreen()))); + } + if (foreColor.getBlue() < 128) { + blue = foreColor.getBlue() == 0 ? backColor.getBlue() + : (backColor.getBlue() - (255 - backColor.getBlue()) * (255 - 2 * foreColor.getBlue()) / (2 * foreColor.getBlue())); + } else { + blue = foreColor.getBlue() == 255 ? backColor.getBlue() + : (backColor.getBlue() + backColor.getBlue() * (2 * foreColor.getBlue() - 255) / (2 * (255 - foreColor.getBlue()))); + } + break; + case LINEAR_LIGHT: + red = 2 * foreColor.getRed() + backColor.getRed() - 255; + green = 2 * foreColor.getGreen() + backColor.getGreen() - 255; + blue = 2 * foreColor.getBlue() + backColor.getBlue() - 255; + break; + case SUBTRACT: + red = backColor.getRed() - foreColor.getRed(); + green = backColor.getGreen() - foreColor.getGreen(); + blue = backColor.getBlue() - foreColor.getBlue(); + break; + case DIFFERENCE: + red = Math.abs(backColor.getRed() - foreColor.getRed()); + green = Math.abs(backColor.getGreen() - foreColor.getGreen()); + blue = Math.abs(backColor.getBlue() - foreColor.getBlue()); + break; + case EXCLUSION: + red = backColor.getRed() + foreColor.getRed() - backColor.getRed() * foreColor.getRed() / 128; + green = backColor.getGreen() + foreColor.getGreen() - backColor.getGreen() * foreColor.getGreen() / 128; + blue = backColor.getBlue() + foreColor.getBlue() - backColor.getBlue() * foreColor.getBlue() / 128; + break; + case DARKEN: + red = Math.min(backColor.getRed(), foreColor.getRed()); + green = Math.min(backColor.getGreen(), foreColor.getGreen()); + blue = Math.min(backColor.getBlue(), foreColor.getBlue()); + break; + case LIGHTEN: + red = Math.max(backColor.getRed(), foreColor.getRed()); + green = Math.max(backColor.getGreen(), foreColor.getGreen()); + blue = Math.max(backColor.getBlue(), foreColor.getBlue()); + break; + case HUE: + float[] hA = ImageColorTools.pixel2HSB(forePixel); + float[] hB = ImageColorTools.pixel2HSB(bacckPixel); + Color hColor = Color.getHSBColor(hA[0], hB[1], hB[2]); + return hColor.getRGB(); + case SATURATION: + float[] sA = ImageColorTools.pixel2HSB(forePixel); + float[] sB = ImageColorTools.pixel2HSB(bacckPixel); + Color sColor = Color.getHSBColor(sB[0], sA[1], sB[2]); + return sColor.getRGB(); + case LUMINOSITY: + float[] bA = ImageColorTools.pixel2HSB(forePixel); + float[] bB = ImageColorTools.pixel2HSB(bacckPixel); + Color newColor = Color.getHSBColor(bB[0], bB[1], bA[2]); + return newColor.getRGB(); + case COLOR: + float[] cA = ImageColorTools.pixel2HSB(forePixel); + float[] cB = ImageColorTools.pixel2HSB(bacckPixel); + Color cColor = Color.getHSBColor(cA[0], cA[1], cB[2]); + return cColor.getRGB(); + default: + return forePixel; + } + Color newColor = new Color( + Math.min(Math.max(red, 0), 255), + Math.min(Math.max(green, 0), 255), + Math.min(Math.max(blue, 0), 255), + Math.min(foreColor.getAlpha() + backColor.getAlpha(), 255)); + return newColor.getRGB(); + } catch (Exception e) { + logger.error(e.toString()); + return forePixel; + } + } + +} diff --git a/MyBox/src/main/java/mara/mybox/image/ImageColorTools.java b/MyBox/src/main/java/mara/mybox/image/ImageColorTools.java index 5dfbd62d6..cae8bf16b 100644 --- a/MyBox/src/main/java/mara/mybox/image/ImageColorTools.java +++ b/MyBox/src/main/java/mara/mybox/image/ImageColorTools.java @@ -38,7 +38,7 @@ public static float[] pixel2HSB(int pixel) { } public static int RGB2GrayPixel(int r, int g, int b, int a) { - int gray = (int) (0.299 * r + 0.587 * g + 0.114 * b); + int gray = RGB2GrayValue(r, g, b); return ImageColorTools.RGB2Pixel(gray, gray, gray, a); } @@ -47,13 +47,20 @@ public static int pixel2GrayPixel(int pixel) { return RGB2GrayPixel(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); } + // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness + // https://en.wikipedia.org/wiki/Grayscale + // Simplest:I = ( R + G + B ) / 3 + // PAL和NTSC(Video) Y'UV and Y'IQ primaries Rec.601 : Y ′ = 0.299 R ′ + 0.587 G ′ + 0.114 B ′ + // HDTV(High Definiton TV) ITU-R primaries Rec.709: Y ′ = 0.2126 R ′ + 0.7152 G ′ + 0.0722 B ′ + // JDK internal: javafx.scene.paint.Color.grayscale() = 0.21 * red + 0.71 * green + 0.07 * blue public static int RGB2GrayValue(int r, int g, int b) { - int gray = (int) (0.299 * r + 0.587 * g + 0.114 * b); + int gray = (2126 * r + 7152 * g + 722 * b) / 10000; return gray; } public static int pixel2GrayValue(int pixel) { Color c = new Color(pixel); + return RGB2GrayValue(c.getRed(), c.getGreen(), c.getBlue()); } @@ -173,4 +180,35 @@ public static Color scaleSaturate(Color color, float scale) { float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); return Color.getHSBColor(hsb[0], hsb[1] * scale, hsb[2]); } + + // https://stackoverflow.com/questions/21899824/java-convert-a-greyscale-and-sepia-version-of-an-image-with-bufferedimage/21900125#21900125 + public static Color pixel2Sepia(int pixel, int sepiaIntensity) { + int sepiaDepth = 20; + int gray = pixel2GrayValue(pixel); + int r = gray, g = gray, b = gray; + r = r + (sepiaDepth * 2); + g = g + sepiaDepth; + if (r > 255) { + r = 255; + } + if (g > 255) { + g = 255; + } + if (b > 255) { + b = 255; + } + // Darken blue color to increase sepia effect + b -= sepiaIntensity; + // normalize if out of bounds + if (b < 0) { + b = 0; + } + if (b > 255) { + b = 255; + } + Color color = new Color(pixel, true); + Color newColor = new Color(r, g, b, color.getAlpha()); + return newColor; + } + } diff --git a/MyBox/src/main/java/mara/mybox/image/ImageConvertTools.java b/MyBox/src/main/java/mara/mybox/image/ImageConvertTools.java index f8a6f8a92..72221c63d 100644 --- a/MyBox/src/main/java/mara/mybox/image/ImageConvertTools.java +++ b/MyBox/src/main/java/mara/mybox/image/ImageConvertTools.java @@ -27,7 +27,6 @@ import mara.mybox.objects.ImageCombine.CombineSizeType; import mara.mybox.objects.ImageFileInformation; import mara.mybox.objects.ImageScope; -import mara.mybox.tools.FxmlImageTools; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,6 +40,19 @@ public class ImageConvertTools { private static final Logger logger = LogManager.getLogger(); + public static class Direction { + + public static int Top = 0; + public static int Bottom = 1; + public static int Left = 2; + public static int Right = 3; + public static int LeftTop = 4; + public static int RightBottom = 5; + public static int LeftBottom = 6; + public static int RightTop = 7; + + } + public static boolean hasAlpha(BufferedImage source) { switch (source.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -95,7 +107,7 @@ public static BufferedImage replaceAlphaAsBlack(BufferedImage source) { if (alpha == color) { target.setRGB(i, j, black); } else { - Color c = new Color(color); + Color c = new Color(color, true); Color newColor = new Color(c.getRed(), c.getGreen(), c.getBlue()); target.setRGB(i, j, newColor.getRGB()); } @@ -122,7 +134,7 @@ public static BufferedImage replaceAlphaAsWhite(BufferedImage source) { if (alpha == color) { target.setRGB(i, j, white); } else { - Color c = new Color(color); + Color c = new Color(color, true); Color newColor = new Color(c.getRed(), c.getGreen(), c.getBlue()); target.setRGB(i, j, newColor.getRGB()); } @@ -222,13 +234,7 @@ public static BufferedImage changeSaturate(BufferedImage source, float change) { for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { float[] hsb = ImageColorTools.pixel2HSB(source.getRGB(i, j)); - float v = hsb[1] * (1.0f + change); - if (v > 1.0f) { - v = 1.0f; - } - if (v < 0.0f) { - v = 0.0f; - } + float v = Math.min(Math.max(hsb[1] * (1.0f + change), 0.0f), 1.0f); Color newColor = Color.getHSBColor(hsb[0], v, hsb[2]); target.setRGB(i, j, newColor.getRGB()); } @@ -252,13 +258,7 @@ public static BufferedImage changeBrightness(BufferedImage source, float change) for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { float[] hsb = ImageColorTools.pixel2HSB(source.getRGB(i, j)); - float v = hsb[2] * (1.0f + change); - if (v > 1.0f) { - v = 1.0f; - } - if (v < 0.0f) { - v = 0.0f; - } + float v = Math.min(Math.max(hsb[2] * (1.0f + change), 0.0f), 1.0f); Color newColor = Color.getHSBColor(hsb[0], hsb[1], v); target.setRGB(i, j, newColor.getRGB()); } @@ -312,15 +312,9 @@ public static BufferedImage changeRed(BufferedImage source, int change) { Color newColor; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); - int v = color.getRed() + change; - if (v > 255) { - v = 255; - } - if (v < 0) { - v = 0; - } - newColor = new Color(v, color.getGreen(), color.getBlue(), color.getAlpha()); + Color color = new Color(source.getRGB(i, j), true); + int red = Math.min(Math.max(color.getRed() + change, 0), 255); + newColor = new Color(red, color.getGreen(), color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); } } @@ -343,15 +337,9 @@ public static BufferedImage changeGreen(BufferedImage source, int change) { Color newColor; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); - int v = color.getGreen() + change; - if (v > 255) { - v = 255; - } - if (v < 0) { - v = 0; - } - newColor = new Color(color.getRed(), v, color.getBlue(), color.getAlpha()); + Color color = new Color(source.getRGB(i, j), true); + int green = Math.min(Math.max(color.getGreen() + change, 0), 255); + newColor = new Color(color.getRed(), green, color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); } } @@ -374,15 +362,114 @@ public static BufferedImage changeBlue(BufferedImage source, int change) { Color newColor; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); - int v = color.getBlue() + change; - if (v > 255) { - v = 255; - } - if (v < 0) { - v = 0; - } - newColor = new Color(color.getRed(), color.getGreen(), v, color.getAlpha()); + Color color = new Color(source.getRGB(i, j), true); + int blue = Math.min(Math.max(color.getBlue() + change, 0), 255); + newColor = new Color(color.getRed(), color.getGreen(), blue, color.getAlpha()); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage changeYellow(BufferedImage source, int change) { + try { + int width = source.getWidth(); + int height = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + BufferedImage target = new BufferedImage(width, height, imageType); + Color newColor; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + Color color = new Color(source.getRGB(i, j), true); + int red = Math.min(Math.max(color.getRed() + change, 0), 255); + int green = Math.min(Math.max(color.getGreen() + change, 0), 255); + newColor = new Color(red, green, color.getBlue(), color.getAlpha()); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage changeCyan(BufferedImage source, int change) { + try { + int width = source.getWidth(); + int height = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + BufferedImage target = new BufferedImage(width, height, imageType); + Color newColor; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + Color color = new Color(source.getRGB(i, j), true); + int green = Math.min(Math.max(color.getGreen() + change, 0), 255); + int blue = Math.min(Math.max(color.getBlue() + change, 0), 255); + newColor = new Color(color.getRed(), green, blue, color.getAlpha()); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage changeMagenta(BufferedImage source, int change) { + try { + int width = source.getWidth(); + int height = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + BufferedImage target = new BufferedImage(width, height, imageType); + Color newColor; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + Color color = new Color(source.getRGB(i, j), true); + int red = Math.min(Math.max(color.getRed() + change, 0), 255); + int blue = Math.min(Math.max(color.getBlue() + change, 0), 255); + newColor = new Color(red, color.getGreen(), blue, color.getAlpha()); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + + public static BufferedImage changeRGB(BufferedImage source, int change) { + try { + int width = source.getWidth(); + int height = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + BufferedImage target = new BufferedImage(width, height, imageType); + Color newColor; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + Color color = new Color(source.getRGB(i, j), true); + int red = Math.min(Math.max(color.getRed() + change, 0), 255); + int green = Math.min(Math.max(color.getGreen() + change, 0), 255); + int blue = Math.min(Math.max(color.getBlue() + change, 0), 255); + newColor = new Color(red, green, blue, color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); } } @@ -401,7 +488,7 @@ public static BufferedImage addAlpha(BufferedImage src, int alpha) { for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { int rgb = src.getRGB(i, j); - Color color = new Color(rgb); + Color color = new Color(rgb, true); Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); target.setRGB(i, j, newcolor.getRGB()); } @@ -424,7 +511,7 @@ public static BufferedImage makeInvert(BufferedImage source) { BufferedImage target = new BufferedImage(width, height, imageType); for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); + Color color = new Color(source.getRGB(i, j), true); Color newColor = new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); @@ -448,7 +535,7 @@ public static BufferedImage makeRedInvert(BufferedImage source) { BufferedImage target = new BufferedImage(width, height, imageType); for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); + Color color = new Color(source.getRGB(i, j), true); Color newColor = new Color(255 - color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); @@ -472,7 +559,7 @@ public static BufferedImage makeGreenInvert(BufferedImage source) { BufferedImage target = new BufferedImage(width, height, imageType); for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); + Color color = new Color(source.getRGB(i, j), true); Color newColor = new Color(color.getRed(), 255 - color.getGreen(), color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); @@ -496,7 +583,7 @@ public static BufferedImage makeBlueInvert(BufferedImage source) { BufferedImage target = new BufferedImage(width, height, imageType); for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - Color color = new Color(source.getRGB(i, j)); + Color color = new Color(source.getRGB(i, j), true); Color newColor = new Color(color.getRed(), color.getGreen(), 255 - color.getBlue(), color.getAlpha()); target.setRGB(i, j, newColor.getRGB()); @@ -576,6 +663,29 @@ public static BufferedImage keepBlue(BufferedImage source) { } } + public static BufferedImage sepiaImage(BufferedImage source, int sepiaIntensity) { + try { + int width = source.getWidth(); + int height = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + BufferedImage target = new BufferedImage(width, height, imageType); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int pixel = source.getRGB(i, j); + Color newColor = ImageColorTools.pixel2Sepia(pixel, sepiaIntensity); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + } + public static BufferedImage replaceColor(BufferedImage source, Color oldColor, Color newColor, int distance, boolean isColor, boolean excluded) { @@ -1147,7 +1257,7 @@ public static BufferedImage showScope(BufferedImage source, ImageScope scope) { for (int j = scope.getLeftY(); j <= scope.getRightY(); j++) { for (int i = scope.getLeftX(); i <= scope.getRightX(); i++) { int rgb = source.getRGB(i, j); - Color color = new Color(rgb); + Color color = new Color(rgb, true); Color newcolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); target.setRGB(i, j, newcolor.getRGB()); } @@ -1473,11 +1583,8 @@ public static javafx.scene.image.Image combineImages(List } } - public static BufferedImage applyFilter(BufferedImage source, Kernel filter) { - if (source == null) { - return null; - } - if (filter == null) { + public static BufferedImage applyConvolveOp(BufferedImage source, Kernel filter) { + if (source == null || filter == null) { return source; } ConvolveOp imageOp = new ConvolveOp(filter, ConvolveOp.EDGE_ZERO_FILL, null); @@ -1485,10 +1592,7 @@ public static BufferedImage applyFilter(BufferedImage source, Kernel filter) { } public static BufferedImage applyConvolveOp(BufferedImage source, ConvolveOp imageOp) { - if (source == null) { - return null; - } - if (imageOp == null) { + if (source == null || imageOp == null) { return source; } int width = source.getWidth(); @@ -1502,6 +1606,50 @@ public static BufferedImage applyConvolveOp(BufferedImage source, ConvolveOp ima return target; } + public static BufferedImage applyConvolve(BufferedImage source, float[][] kernel) { + if (source == null || kernel == null || kernel.length == 0) { + return source; + } + try { + int imageWidth = source.getWidth(); + int imageHeight = source.getHeight(); + int imageType = source.getType(); + if (imageType == BufferedImage.TYPE_CUSTOM) { + imageType = BufferedImage.TYPE_INT_ARGB; + } + int kernelWidth = kernel.length; + int kernelHeight = kernel[0].length; + BufferedImage target = new BufferedImage(imageWidth, imageHeight, imageType); + for (int j = 0; j < imageHeight; j++) { + for (int i = 0; i < imageWidth; i++) { + double red = 0.0, green = 0.0, blue = 0.0; + for (int filterY = 0; filterY < kernelHeight; filterY++) { + for (int filterX = 0; filterX < kernelWidth; filterX++) { + int imageX = (i - kernelWidth / 2 + filterX + imageWidth) % imageWidth; + int imageY = (j - kernelHeight / 2 + filterY + imageHeight) % imageHeight; + Color color = new Color(source.getRGB(imageX, imageY), true); + red += color.getRed() * kernel[filterY][filterX]; + green += color.getGreen() * kernel[filterY][filterX]; + blue += color.getBlue() * kernel[filterY][filterX]; + } + } + red = Math.min(Math.max(red, 0), 255); + green = Math.min(Math.max(green, 0), 255); + blue = Math.min(Math.max(blue, 0), 255); + Color color = new Color(source.getRGB(i, j), true); + Color newColor = new Color((int) red, (int) green, (int) blue, color.getAlpha()); + target.setRGB(i, j, newColor.getRGB()); + } + } + return target; + } catch (Exception e) { + logger.error(e.toString()); + return null; + } + + } + + // https://lodev.org/cgtutor/filtering.html public static Kernel makeGaussFilter(int radius) { if (radius < 1) { return null; @@ -1531,42 +1679,220 @@ public static Kernel makeGaussFilter(int radius) { } public static BufferedImage blurImage(BufferedImage source, int radius) { -// float ninth = 1.0f / 9.0f; -// float[] blurKernel = { -// ninth, ninth, ninth, -// ninth, ninth, ninth, -// ninth, ninth, ninth -// }; -// Kernel k = new Kernel(3, 3, blurKernel); - + float ninth = 1.0f / 9.0f; + float[][] blurKernel = { + {ninth, ninth, ninth}, + {ninth, ninth, ninth}, + {ninth, ninth, ninth} + }; Kernel k = makeGaussFilter(radius); - BufferedImage target = applyFilter(source, k); + BufferedImage target = applyConvolveOp(source, k); +// BufferedImage target = applyConvolve(source, blurKernel); return target; } -// https://www.javaworld.com/article/2076764/java-se/image-processing-with-java-2d.html + // https://www.javaworld.com/article/2076764/java-se/image-processing-with-java-2d.html public static BufferedImage sharpenImage(BufferedImage source) { - float[] sharpenKernel = { - 0.0f, -1.0f, 0.0f, - -1.0f, 5.0f, -1.0f, - 0.0f, -1.0f, 0.0f + float[][] sharpenKernel1 = { + {0.0f, -1.0f, 0.0f}, + {-1.0f, 5.0f, -1.0f}, + {0.0f, -1.0f, 0.0f} }; - Kernel k = new Kernel(3, 3, sharpenKernel); - - BufferedImage target = applyFilter(source, k); + float[] sharpenKernel2 = { + -1.0f, -1.0f, -1.0f, + -1.0f, 9.0f, -1.0f, + -1.0f, -1.0f, -1.0f + }; + Kernel k = new Kernel(3, 3, sharpenKernel2); + BufferedImage target = applyConvolveOp(source, k); +// BufferedImage target = applyConvolve(source, sharpenKernel1); return target; } + // https://en.wikipedia.org/wiki/Image_embossing + public static BufferedImage embossImage(BufferedImage source, + int direction, int size, boolean gray) { + if (size != 3 && size != 5) { + return source; + } + final float[] embossTopKernel = { + 0, 1, 0, + 0, 0, 0, + 0, -1, 0 + }; + final float[] embossBottomKernel = { + 0, -1, 0, + 0, 0, 0, + 0, 1, 0 + }; + final float[] embossLeftKernel = { + 0, 0, 0, + 1, 0, -1, + 0, 0, 0 + }; + final float[] embossRightKernel = { + 0, 0, 0, + -1, 0, 1, + 0, 0, 0 + }; + final float[] embossLeftTopKernel = { + 1, 0, 0, + 0, 0, 0, + 0, 0, -1 + }; + final float[] embossRightBottomKernel = { + -1, 0, 0, + 0, 0, 0, + 0, 0, 1 + }; + final float[] embossLeftBottomKernel = { + 0, 0, -1, + 0, 0, 0, + 1, 0, 0 + }; + final float[] embossRightTopKernel = { + 0, 0, 1, + 0, 0, 0, + -1, 0, 0 + }; + + final float[] embossTopKernel5 = { + 0, 0, -1, 0, 0, + 0, 0, -1, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0 + }; + final float[] embossBottomKernel5 = { + 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, + 0, 0, -1, 0, 0 + }; + final float[] embossLeftKernel5 = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 0, -1, -1, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + }; + final float[] embossRightKernel5 = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + -1, -1, 0, 1, 1, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + }; + final float[] embossLeftTopKernel5 = { + 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1 + }; + final float[] embossRightBottomKernel5 = { + -1, 0, 0, 0, 0, + 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1 + }; + final float[] embossLeftBottomKernel5 = { + 0, 0, 0, 0, -1, + 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0 + }; + final float[] embossRightTopKernel5 = { + 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, + -1, 0, 0, 0, 0 + }; + + Kernel k = null; + if (direction == Direction.Top) { + if (size == 3) { + k = new Kernel(3, 3, embossTopKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossTopKernel5); + } + } else if (direction == Direction.Bottom) { + if (size == 3) { + k = new Kernel(3, 3, embossBottomKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossBottomKernel5); + } + } else if (direction == Direction.Left) { + if (size == 3) { + k = new Kernel(3, 3, embossLeftKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossLeftKernel5); + } + } else if (direction == Direction.Right) { + if (size == 3) { + k = new Kernel(3, 3, embossRightKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossRightKernel5); + } + } else if (direction == Direction.LeftTop) { + if (size == 3) { + k = new Kernel(3, 3, embossLeftTopKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossLeftTopKernel5); + } + } else if (direction == Direction.RightBottom) { + if (size == 3) { + k = new Kernel(3, 3, embossRightBottomKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossRightBottomKernel5); + } + } else if (direction == Direction.LeftBottom) { + if (size == 3) { + k = new Kernel(3, 3, embossLeftBottomKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossLeftBottomKernel5); + } + } else if (direction == Direction.RightTop) { + if (size == 3) { + k = new Kernel(3, 3, embossRightTopKernel); + } else if (size == 5) { + k = new Kernel(5, 5, embossRightTopKernel5); + } + } + + BufferedImage target = applyConvolveOp(source, k); + target = changeRGB(target, 128); + if (gray) { + return ImageGrayTools.color2Gray(target); + } else { + return target; + } + } + // https://www.javaworld.com/article/2076764/java-se/image-processing-with-java-2d.html public static BufferedImage edgeDetect(BufferedImage source) { - float[] edgeDetectKernel = { - 0.0f, -1.0f, 0.0f, - -1.0f, 4.0f, -1.0f, - 0.0f, -1.0f, 0.0f + float[][] edgeDetectKernel1 = { + {0.0f, -1.0f, 0.0f}, + {-1.0f, 4.0f, -1.0f}, + {0.0f, -1.0f, 0.0f} }; - Kernel k = new Kernel(3, 3, edgeDetectKernel); - - BufferedImage target = applyFilter(source, k); + float[][] edgeDetectKernel3 = { + {-1.0f, -1.0f, -1.0f}, + {-1.0f, 8.0f, -1.0f}, + {-1.0f, -1.0f, -1.0f} + }; + float[] edgeDetectKernel2 = { + -1.0f, -1.0f, -1.0f, + -1.0f, 8.0f, -1.0f, + -1.0f, -1.0f, -1.0f + }; + Kernel k = new Kernel(3, 3, edgeDetectKernel2); + BufferedImage target = applyConvolveOp(source, k); +// BufferedImage target = applyConvolve(source, edgeDetectKernel3); return target; } diff --git a/MyBox/src/main/java/mara/mybox/image/ImageGrayTools.java b/MyBox/src/main/java/mara/mybox/image/ImageGrayTools.java index a70e0c1c0..6b19d7980 100644 --- a/MyBox/src/main/java/mara/mybox/image/ImageGrayTools.java +++ b/MyBox/src/main/java/mara/mybox/image/ImageGrayTools.java @@ -79,7 +79,7 @@ public static int OTSU(BufferedImage grayImage) { for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { // int r = 0xFF & grayImage.getRGB(i, j); - int gray = ImageColorTools.pixel2GrayValue(grayImage.getRGB(i, j)); + int gray = ImageColorTools.grayPixel2GrayValue(grayImage.getRGB(i, j)); grayNumber[gray]++; } } @@ -129,6 +129,42 @@ public static int OTSU(BufferedImage grayImage) { } } + public static int getIterationBinary(BufferedImage grayImage) { + try { + int width = grayImage.getWidth(); + int height = grayImage.getHeight(); + + int Threshold = 128; + int preThreshold = 256; + + while (Math.abs(Threshold - preThreshold) > 4) { + int s1 = 0; + int s2 = 0; + int f1 = 0; + int f2 = 0; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int gray = grayImage.getRGB(x, y); + if (gray < Threshold) { + s1 += gray; + f1++; + } else { + s2 += gray; + f2++; + } + } + } + preThreshold = Threshold; + Threshold = (int) ((s1 / f1 + s2 / f2) / 2); + } + return Threshold; + } catch (Exception e) { + logger.error(e.toString()); + return -1; + } + } + public static BufferedImage color2BinaryWithPercentage(BufferedImage image, int percentage) { int threshold = 256 * percentage / 100; return color2BinaryWithThreshold(image, threshold); diff --git a/MyBox/src/main/java/mara/mybox/objects/CommonValues.java b/MyBox/src/main/java/mara/mybox/objects/CommonValues.java index 3e5084d91..63fe9c2cb 100644 --- a/MyBox/src/main/java/mara/mybox/objects/CommonValues.java +++ b/MyBox/src/main/java/mara/mybox/objects/CommonValues.java @@ -18,8 +18,8 @@ */ public class CommonValues { - public static final String AppVersion = "3.9"; - public static final String AppVersionDate = "2018-10-26"; + public static final String AppVersion = "4.0"; + public static final String AppVersionDate = "2018-11-04"; public static final String UserFilePath = System.getProperty("user.home") + File.separator + "mybox"; public static final String UserConfigFile = UserFilePath + File.separator + ".conf.properties"; @@ -95,6 +95,7 @@ public class CommonValues { public static final String ImageMetaDataFxml = "/fxml/ImageMetaData.fxml"; public static final String ImageScopeFxml = "/fxml/ImageScope.fxml"; public static final String ImageSplitFxml = "/fxml/ImageSplit.fxml"; + public static final String ImagesBlendFxml = "/fxml/ImagesBlend.fxml"; public static final String PixelsCalculatorFxml = "/fxml/PixelsCalculator.fxml"; public static final String ColorPaletteFxml = "/fxml/ColorPalette.fxml"; public static final String FilesRenameFxml = "/fxml/FilesRename.fxml"; diff --git a/MyBox/src/main/java/mara/mybox/objects/ImageScope.java b/MyBox/src/main/java/mara/mybox/objects/ImageScope.java index e2baf5b65..04be24543 100644 --- a/MyBox/src/main/java/mara/mybox/objects/ImageScope.java +++ b/MyBox/src/main/java/mara/mybox/objects/ImageScope.java @@ -4,8 +4,8 @@ import java.util.List; import javafx.scene.image.Image; import javafx.scene.paint.Color; -import static mara.mybox.tools.FxmlImageTools.isColorMatch; -import static mara.mybox.tools.FxmlImageTools.isHueMatch; +import static mara.mybox.image.FxmlImageTools.isColorMatch; +import static mara.mybox.image.FxmlImageTools.isHueMatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -51,8 +51,8 @@ public ImageScope() { colors = new ArrayList(); leftX = leftY = rightX = rightY = centerX = centerY = radius = -1; colorExcluded = rectangleExcluded = circleExcluded = false; - colorDistance = 0; - hueDistance = 5; + colorDistance = 20; + hueDistance = 20; opacity = 0.1; } diff --git a/MyBox/src/main/java/mara/mybox/tools/FxmlTools.java b/MyBox/src/main/java/mara/mybox/tools/FxmlTools.java index c1aeedf57..f0c4ae2f9 100644 --- a/MyBox/src/main/java/mara/mybox/tools/FxmlTools.java +++ b/MyBox/src/main/java/mara/mybox/tools/FxmlTools.java @@ -286,15 +286,23 @@ public void changed(ObservableValue observable, } public static File getUserFile(Class someClass, String resourceFile, String userFile) { + return getUserFile(someClass, resourceFile, userFile, false); + } + + // Solution from https://stackoverflow.com/questions/941754/how-to-get-a-path-to-a-resource-in-a-java-jar-file + public static File getUserFile(Class someClass, String resourceFile, String userFile, + boolean deleteExisted) { if (someClass == null || resourceFile == null || userFile == null) { return null; } File file = new File(UserFilePath + "/" + userFile); if (file.exists()) { - return file; + if (deleteExisted) { + file.delete(); + } else { + return file; + } } -// return new File(someClass.getResource(resourceFile).toExternalForm()); - URL url = someClass.getResource(resourceFile); if (url.toString().startsWith("jar:")) { try { @@ -306,7 +314,6 @@ public static File getUserFile(Class someClass, String resourceFile, String user out.write(bytes, 0, read); } } -// file.desleteOnExit(); } catch (Exception e) { logger.error(e.toString()); } @@ -317,7 +324,6 @@ public static File getUserFile(Class someClass, String resourceFile, String user return file; } - // Solution from https://stackoverflow.com/questions/941754/how-to-get-a-path-to-a-resource-in-a-java-jar-file public static File getResourceFile(Class someClass, String resourceFile) { if (someClass == null || resourceFile == null) { return null; diff --git a/MyBox/src/main/java/mara/mybox/tools/PdfTools.java b/MyBox/src/main/java/mara/mybox/tools/PdfTools.java index 19980e45f..1d249a5cc 100644 --- a/MyBox/src/main/java/mara/mybox/tools/PdfTools.java +++ b/MyBox/src/main/java/mara/mybox/tools/PdfTools.java @@ -1,5 +1,6 @@ package mara.mybox.tools; +import mara.mybox.image.FxmlImageTools; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/MyBox/src/main/resources/bundles/Messages.properties b/MyBox/src/main/resources/bundles/Messages.properties index ccfe4f039..10595b6ae 100644 --- a/MyBox/src/main/resources/bundles/Messages.properties +++ b/MyBox/src/main/resources/bundles/Messages.properties @@ -904,3 +904,65 @@ ImageHisComments=Image updating histories can be record for returning to former RectangleLabel=Left click for Left-Top\uff0cright click for Right-Bottom CircleLabel=Left click for Center\uff0cright click for Radius ColorLabel=Click image to pick colors +ImagesBlend=Blend Images +BackgroundImage=Background Image +ForegroundImage=Foreground Image +Emboss=Emboss +Sepia=Sepia +Intensity=Intensity +Direction=Direction +Yellow=Yellow +Magenta=Magenta +Cyan=Cyan +RGB=RGB +BlendOptions=Blend Options +BlendMode=Blend Mode +Addition=Addition +NormalMode=Normal Mode +DifferenceMode=Difference Mode +MultiplyMode=Multiply Mode +ScreenMode=Screen Mode +DarkenMode=Darken Mode +OverlayMode=Overlay Mode +HardLightMode=Hard Light Mode +SoftLightMode=Soft Light Mode +NegationMode=Negation Mode +ColorDodgeMode=Color Dodge Mode +InverseColorDodgeMode=InverseColorDodge Mode +SoftDodgeMode=SoftDodge Mode +ColorBurnMode=Color Burn Mode +InverseColorBurnMode=InverseColorBurn Mode +SoftBurnMode=SoftBurn Mode +ReflectMode=Reflect Mode +GlowMode=Glow Mode +FreezeMode=Freeze Mode +HeatMode=Heat Mode +SubtractMode=Subtract Mode +StampMode=Stamp Mode +LuminosityMode=Luminosity Mode +ExclusionMode=Exclusion Mode +LightenMode=Lighten Mode +CompositeMode=Composite Mode +LeftTopIntersectPoint=Left Top Intersect Point +AorB=A or B +AandB=A and B +BorA=B or A +BandA=B and A +LinearLightMode=Linear Light Mode +VividLightMode=Vivid Light Mode +LinearBurnMode=Linear Burn Mode +DivideMode=Divide Mode +LinearDodgeMode=Linear Dodge Mode(Addition Mode) +DissolveMode=Dissolve Mode +ClickOnForegournd=Click foreground image or blended image to pick the coordinate +ClickOnBackgournd=Click background image or blended image to pick the coordinate +LeftTopOfIntersect=Left Top Corner of Intersect Area +BinF=Background in Foreground +FinB=Foreground in Background +VertexCoordinate=Vertex Coordinate +HueMode=Hue Mode +SaturationMode=Saturation Mode +ColorMode=Color Mode +RelativeLocation=Relative Location +KeepIntersectAreaOnly=Keep Intersect Area Only +BlendedSize=Blended Size diff --git a/MyBox/src/main/resources/bundles/Messages_en_US.properties b/MyBox/src/main/resources/bundles/Messages_en_US.properties index 241c1b4fc..16616529c 100644 --- a/MyBox/src/main/resources/bundles/Messages_en_US.properties +++ b/MyBox/src/main/resources/bundles/Messages_en_US.properties @@ -904,3 +904,65 @@ ImageHisComments=Image updating histories can be record for returning to former RectangleLabel=Left click for Left-Top\uff0cright click for Right-Bottom CircleLabel=Left click for Center\uff0cright click for Radius ColorLabel=Click image to pick colors +ImagesBlend=Blend Images +BackgroundImage=Background Image +ForegroundImage=Foreground Image +Emboss=Emboss +Sepia=Sepia +Intensity=Intensity +Direction=Direction +Yellow=Yellow +Magenta=Magenta +Cyan=Cyan +RGB=RGB +BlendOptions=Blend Options +BlendMode=Blend Mode +Addition=Addition +NormalMode=Normal Mode +DifferenceMode=Difference Mode +MultiplyMode=Multiply Mode +DarkenMode=Darken Mode +OverlayMode=Overlay Mode +HardLightMode=Hard Light Mode +SoftLightMode=Soft Light Mode +NegationMode=Negation Mode +ColorDodgeMode=Color Dodge Mode +InverseColorDodgeMode=InverseColorDodge Mode +SoftDodgeMode=SoftDodge Mode +ColorBurnMode=Color Burn Mode +InverseColorBurnMode=InverseColorBurn Mode +SoftBurnMode=SoftBurn Mode +ReflectMode=Reflect Mode +GlowMode=Glow Mode +FreezeMode=Freeze Mode +HeatMode=Heat Mode +SubtractMode=Subtract Mode +StampMode=Stamp Mode +LuminosityMode=Luminosity Mode +ExclusionMode=Exclusion Mode +LightenMode=Lighten Mode +CompositeMode=Composite Mode +LeftTopIntersectPoint=Left Top Intersect Point +AorB=A or B +AandB=A and B +BorA=B or A +BandA=B and A +LinearLightMode=Linear Light Mode +VividLightMode=Vivid Light Mode +LinearBurnMode=Linear Burn Mode +DivideMode=Divide Mode +LinearDodgeMode=Linear Dodge Mode(Addition Mode) +DissolveMode=Dissolve Mode +ClickOnForegournd=Click foreground image or blended image to pick the coordinate +ClickOnBackgournd=Click background image or blended image to pick the coordinate +LeftTopOfIntersect=Left Top Corner of Intersect Area +BinF=Background in Foreground +FinB=Foreground in Background +VertexCoordinate=Vertex Coordinate +ScreenMode=Screen Mode +HueMode=Hue Mode +SaturationMode=Saturation Mode +ColorMode=Color Mode +RelativeLocation=Relative Location +KeepIntersectAreaOnly=Keep Intersect Area Only +BlendedSize=Blended Size diff --git a/MyBox/src/main/resources/bundles/Messages_zh_CN.properties b/MyBox/src/main/resources/bundles/Messages_zh_CN.properties index 9039f013e..a774fa432 100644 --- a/MyBox/src/main/resources/bundles/Messages_zh_CN.properties +++ b/MyBox/src/main/resources/bundles/Messages_zh_CN.properties @@ -904,3 +904,65 @@ ImageHisComments=\u56fe\u50cf\u4fee\u6539\u5386\u53f2\u53ef\u4ee5\u88ab\u8bb0\u5 RectangleLabel=\u5de6\u952e\u70b9\u51fb\u53d6\u5de6\u4e0a\u89d2\uff0c\u53f3\u952e\u70b9\u51fb\u53d6\u53f3\u4e0b\u89d2 CircleLabel=\u5de6\u952e\u70b9\u51fb\u53d6\u5706\u5fc3\uff0c\u53f3\u952e\u70b9\u51fb\u53d6\u53f3\u4e0b\u89d2\u534a\u5f84\n ColorLabel=\u70b9\u51fb\u56fe\u50cf\u4ee5\u53d6\u8272 +ImagesBlend=\u6df7\u5408\u56fe\u50cf +BackgroundImage=\u80cc\u666f\u56fe\u50cf +ForegroundImage=\u524d\u666f\u56fe\u50cf +Emboss=\u6d6e\u96d5 +Sepia=\u8910\u8272 +Intensity=\u5f3a\u5ea6 +Direction=\u65b9\u5411 +Yellow=\u9ec4\u8272 +Magenta=\u7d2b\u8272 +Cyan=\u9752\u8272 +RGB=\u7ea2\u84dd\u7eff +BlendOptions=\u6df7\u5408\u9009\u9879 +BlendMode=\u6df7\u5408\u6a21\u5f0f +Addition=\u7d2f\u52a0 +NormalMode=\u6b63\u5e38\u6a21\u5f0f +DifferenceMode=\u5dee\u503c\u6a21\u5f0f +MultiplyMode=\u6b63\u7247\u53e0\u5e95\u6a21\u5f0f +ScreenMode=\u6ee4\u8272\u6a21\u5f0f +DarkenMode=\u53d8\u6697\u6a21\u5f0f +OverlayMode=\u53e0\u52a0\u6a21\u5f0f +HardLightMode=\u5f3a\u5149\u6a21\u5f0f +SoftLightMode=\u67d4\u5149\u6a21\u5f0f +NegationMode=Negation +ColorDodgeMode=\u989c\u8272\u51cf\u6de1\u6a21\u5f0f +InverseColorDodgeMode=InverseColorDodge +SoftDodgeMode=SoftDodge +ColorBurnMode=\u989c\u8272\u52a0\u6df1\u6a21\u5f0f +InverseColorBurnMode=InverseColorBurn +SoftBurnMode=SoftBurn +ReflectMode=Reflect +GlowMode=Glow +FreezeMode=Freeze +HeatMode=Heat +SubtractMode=\u51cf\u53bb\u6a21\u5f0f +StampMode=Stamp +LuminosityMode=\u4eae\u5ea6\u6a21\u5f0f +ExclusionMode=\u6392\u9664\u6a21\u5f0f +LightenMode=\u53d8\u4eae\u6a21\u5f0f +CompositeMode=\u7ec4\u5408\u6a21\u5f0f +LeftTopIntersectPoint=\u5de6\u4e0a\u4ea4\u53c9\u70b9 +AorB=A\u6216B +AandB=A\u4e14B +BorA=B\u6216A +BandA=B\u4e0eA +VividLightMode=\u4eae\u5149\u6a21\u5f0f +LinearBurnMode=\u7ebf\u6027\u52a0\u6df1\u6a21\u5f0f +DivideMode=\u5212\u5206\u6a21\u5f0f +LinearDodgeMode=\u7ebf\u6027\u51cf\u6de1\u6a21\u5f0f\uff08\u589e\u52a0\u6a21\u5f0f\uff09 +DissolveMode=\u6eb6\u89e3\u6a21\u5f0f +ClickOnForegournd=\u70b9\u51fb\u524d\u666f\u56fe\u6216\u6df7\u5408\u56fe\u4ee5\u53d6\u5750\u6807 +ClickOnBackgournd=\u70b9\u51fb\u80cc\u666f\u56fe\u6216\u6df7\u5408\u56fe\u4ee5\u53d6\u5750\u6807 +LeftTopOfIntersect=\u4ea4\u53c9\u533a\u57df\u7684\u5de6\u4e0a\u89d2 +BinF=\u80cc\u666f\u56fe\u5728\u524d\u666f\u56fe\u4e2d +FinB=\u524d\u666f\u56fe\u5728\u80cc\u666f\u56fe\u4e2d +VertexCoordinate=\u9876\u70b9\u5750\u6807 +LinearLightMode=\u7ebf\u6027\u5149\u6a21\u5f0f +HueMode=\u8272\u76f8\u6a21\u5f0f +SaturationMode=\u9971\u548c\u5ea6\u6a21\u5f0f +ColorMode=\u989c\u8272\u6a21\u5f0f +RelativeLocation=\u76f8\u5bf9\u4f4d\u7f6e +KeepIntersectAreaOnly=\u53ea\u4fdd\u7559\u4ea4\u53c9\u533a\u57df +BlendedSize=\u6df7\u5408\u540e\u7684\u5927\u5c0f diff --git a/MyBox/src/main/resources/caspian.css b/MyBox/src/main/resources/caspian.css deleted file mode 100644 index 271c9135e..000000000 --- a/MyBox/src/main/resources/caspian.css +++ /dev/null @@ -1,4271 +0,0 @@ -/* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ - -/******************************************************************************* - * * - * CSS Styles for core infrastructure bits. The .root section provides the * - * overall default font and colors used by the rest of the sections. * - * * - ******************************************************************************/ - -.root { - /*************************************************************************** - * * - * The main color palette from which the rest of the colors are derived. * - * * - **************************************************************************/ - - /* A light grey that is the base color for objects. Instead of using - * -fx-base directly, the sections in this file will typically use -fx-color. - */ - -fx-base: #d0d0d0; - - /* A very light grey used for the background of windows. See also - * -fx-text-background-color, which should be used as the -fx-text-fill - * value for text painted on top of backgrounds colored with -fx-background. - */ - -fx-background: #f4f4f4; - - /* Used for the inside of text boxes, password boxes, lists, trees, and - * tables. See also -fx-text-inner-color, which should be used as the - * -fx-text-fill value for text painted on top of backgrounds colored - * with -fx-control-inner-background. - */ - -fx-control-inner-background: white; - - /* One of these colors will be chosen based upon a ladder calculation - * that uses the brightness of a background color. Instead of using these - * colors directly as -fx-text-fill values, the sections in this file should - * use a derived color to match the background in use. See also: - * - * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color - * -fx-text-background-color for text on top of -fx-background - * -fx-text-inner-color for text on top of -fx-control-inner-color - * -fx-selection-bar-text for text on top of -fx-selection-bar - */ - -fx-dark-text-color: black; - -fx-mid-text-color: #292929; - -fx-light-text-color: white; - - /* A bright blue for highlighting/accenting objects. For example: selected - * text; selected items in menus, lists, trees, and tables; progress bars; - * default buttons. - */ - -fx-accent: #0093ff; - - /* A bright blue for the focus indicator of objects. Typically used as the - * first color in -fx-background-color for the "focused" pseudo-class. Also - * typically used with insets of -1.4 to provide a glowing effect. - * - * TODO: should this be derived from -fx-accent? - */ - -fx-focus-color: #0093ff; - - /* The color that is used in styling controls. The default value is based - * on -fx-base, but is changed by pseudoclasses to change the base color. - * For example, the "hover" pseudoclass will typically set -fx-color to - * -fx-hover-base (see below) and the "armed" pseudoclass will typically - * set -fx-color to -fx-pressed-base. - */ - -fx-color: -fx-base; - - /* The opacity level to use for the "disabled" pseudoclass. - */ - -fx-disabled-opacity: 0.4; - - /*************************************************************************** - * * - * Colors that are derived from the main color palette. * - * * - **************************************************************************/ - - /* A little lighter than -fx-base and used as the -fx-color for the - * "hovered" pseudoclass state. - */ - -fx-hover-base: ladder( - -fx-base, - derive(-fx-base,20%) 20%, - derive(-fx-base,30%) 35%, - derive(-fx-base,40%) 50% - ); - - /* A little darker than -fx-base and used as the -fx-color for the - * "armed" pseudoclass state. - * - * TODO: should this be renamed to -fx-armed-base? - */ - -fx-pressed-base: derive(-fx-base,-20%); - - /* Used to specify the body color for focused objects. By default, it's - * the same as -fx-base (i.e., the body color doesn't change when a control - * gets focus). - */ - -fx-focused-base: -fx-base; - - /* The color to use for -fx-text-fill when text is to be painted on top of - * a background filled with the -fx-background color. - */ - -fx-text-background-color: ladder( - -fx-background, - -fx-light-text-color 45%, - -fx-dark-text-color 46%, - -fx-dark-text-color 59%, - -fx-mid-text-color 60% - ); - - /* The default color for all text. Sections should change the -fx-text-fill - * property if change the background color to something else. See also: - * - * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color - * -fx-text-background-color for text on top of -fx-background - * -fx-text-inner-color for text on top of -fx-control-inner-color - * -fx-selection-bar-text for text on top of -fx-selection-bar - */ - -fx-text-fill: -fx-text-background-color; - - /* A little darker than -fx-color and used to draw boxes around objects such - * as progress bars, scroll bars, scroll panes, trees, tables, and lists. - */ - -fx-box-border: ladder( - -fx-color, - black 20%, - derive(-fx-color,-30%) 30% - ); - - /* Darker than -fx-background and used to draw boxes around text boxes and - * password boxes. - */ - -fx-text-box-border: ladder( - -fx-background, - black 10%, - derive(-fx-background, -15%) 30% - ); - - /* Typically lighter than -fx-background and used to provide a small - * highlight under controls and tick marks for checkboxes and radio buttons. - * Often used with an insets of 0 0 -1 0, and is also often the first - * color in a -fx-background-color list. Also is typically replaced by - * -fx-focus-color with an insets of -1.4 in the "focused" pseudoclass. - */ - -fx-shadow-highlight-color: ladder( - -fx-background, - transparent 0%, - derive(-fx-background,40%) 5%, - derive(-fx-background,60%) 70%, - derive(-fx-background,100%) 85%, - derive(-fx-background,100%) 97%, - derive(-fx-background,-10%) 97.5% - ); - - /* A gradient that goes from a little darker than -fx-color on the top to - * even more darker than -fx-color on the bottom. Typically is the second - * color in the -fx-background-color list as the small thin border around - * a control. It is typically the same size as the control (i.e., insets - * are 0). - */ - -fx-outer-border: linear-gradient( - to bottom, - derive(-fx-color,-9%) 0%, - derive(-fx-color,-33%) 100% - ); - - /* A gradient that goes from a bit lighter than -fx-color on the top to - * a little darker at the bottom. Typically is the third color in the - * -fx-background-color list as a thin highlight inside the outer border. - * Insets are typically 1. - */ - -fx-inner-border: linear-gradient( - to bottom, - ladder(-fx-color, - derive(-fx-color,80%) 60%, - white 82%) 0%, - ladder(-fx-color, - derive(-fx-color,20%) 10%, - derive(-fx-color,-10%) 80%) 100% - ); - - -fx-inner-border-horizontal: linear-gradient( - to right, - ladder(-fx-color, - derive(-fx-color,80%) 60%, - white 82%) 0%, - ladder(-fx-color, - derive(-fx-color,20%) 10%, - derive(-fx-color,-10%) 80%) 100% - ); - - -fx-inner-border-bottomup: linear-gradient( - to top, - ladder(-fx-color, - derive(-fx-color,80%) 60%, - white 82%) 0%, - ladder(-fx-color, - derive(-fx-color,20%) 10%, - derive(-fx-color,-10%) 80%) 100%); - - /* A gradient that goes from a little lighter than -fx-color at the top to - * a little darker than -fx-color at the bottom and is used to fill the - * body of many controls such as buttons. Typically is the fourth color - * in the -fx-background-color list and represents main body of the control. - * Insets are typically 2. - */ - -fx-body-color: linear-gradient( - to bottom, - derive(-fx-color,34%) 0%, - derive(-fx-color,-18%) 100% - ); - - -fx-body-color-bottomup: linear-gradient( - to top, - derive(-fx-color,34%) 0%, - derive(-fx-color,-18%) 100% - ); - - /* The color to use as -fx-text-fill when painting text on top of - * backgrounds filled with -fx-base, -fx-color, and -fx-body-color. - */ - -fx-text-base-color: ladder( - -fx-color, - -fx-light-text-color 45%, - -fx-dark-text-color 46%, - -fx-dark-text-color 59%, - -fx-mid-text-color 60% - ); - - /* The color to use as -fx-text-fill when painting text on top of - * backgrounds filled with -fx-control-inner-background. - */ - -fx-text-inner-color: ladder( - -fx-control-inner-background, - -fx-light-text-color 45%, - -fx-dark-text-color 46%, - -fx-dark-text-color 59%, - -fx-mid-text-color 60% - ); - - /* The color to use for small mark-like objects such as checks on check - * boxes, filled in circles in radio buttons, arrows on scroll bars, etc. - */ - -fx-mark-color: ladder( - -fx-color, - white 30%, - derive(-fx-color,-63%) 31% - ); - - /* The small thin light "shadow" for mark-like objects. Typically used in - * conjunction with -fx-mark-color with an insets of 1 0 -1 0. - */ - -fx-mark-highlight-color: ladder( - -fx-color, - derive(-fx-color,80%) 60%, - white 70% - ); - - /* Background for items in list like things such as menus, lists, trees, - * and tables. - * - * TODO: it seems like this should be based upon -fx-accent and we should - * remove the setting -fx-background in all the sections that use - * -fx-selection-bar. - */ - -fx-selection-bar: linear-gradient( - to bottom, - derive(-fx-background,-7%) 0%, - derive(-fx-background,-34%) 100% - ); - - /* The color to use as -fx-text-fill when painting text on top of - * backgrounds filled with -fx-selection-bar. - * - * TODO: it seems like this should be derived from -fx-selection-bar. - */ - -fx-selection-bar-text: ladder( - -fx-background, - -fx-light-text-color 50%, - -fx-mid-text-color 51% - ); - - /* The default border color for a tab. - * - * TODO: should this be -fx-box-border or derived from some other color? - */ - -fx-tab-border-color: -fx-box-border; - - /* These are needed for Popup */ - -fx-background-color: inherit; - -fx-background-radius: inherit; - -fx-background-insets: inherit; - -fx-padding: inherit; - - /* The color to use in ListView/TreeView/TableView to indicate hover. */ - -fx-cell-hover-color: #cce3f4; - - -fx-cell-focus-inner-border: #85b9de; - - /* The colors to use in Pagination */ - -fx-page-bullet-border: #acacac; - -fx-page-indicator-hover-border: #accee5; - - -} - -.mnemonic-underline { - -fx-stroke: transparent; -} - -.text { - -fx-font-smoothing-type: lcd; -} - - -/******************************************************************************* - ******************************************************************************* - ** ** - ** CSS Sections for each control. In general, each control will have a main ** - ** section that defines the following: ** - ** ** - ** .control-name { ** - ** -fx-background-color: a, b, c, d ** - ** -fx-background-insets: e, f, g, h ** - ** -fx-background-radius: i, j, k, l ** - ** -fx-padding: m ** - ** -fx-text-fill: n ** - ** } ** - ** ** - ** where: ** - ** ** - ** -fx-background-color, -fx-background-insets, and -fx-background-radius ** - ** are parallel arrays that specify background colors for the control. ** - ** ** - ** -fx-background represents a sequence of colors for regions that will be ** - ** drawn, one on top of the other. ** - ** ** - ** -fx-background-insets is a comma separated list of insets that represent ** - ** the top right bottom left insets from the edge of the control for each ** - ** color specified in the -fx-background-color list. A single size for ** - ** an inset means the same inset will be used for the top right bottom left ** - ** values. A negative inset will draw outside the bounds of the control. ** - ** ** - ** -fx-background-radius is a comma separated list of values that represent ** - ** the radii of the top right, bottom right, bottom left, and top left ** - ** corners of the rectangle associated with the rectangle from the ** - ** -fx-background-color list. As with insets, a single size for a radius ** - ** means the same radius will be used for all corners. ** - ** ** - ** Typically, the following values will be used: ** - ** ** - ** a/e/i = -fx-shadow-highlight-color, 0 0 -1 0, 5 ** - ** Draws a background highlight dropped 1 pixel down with ** - ** corners with a 5 pixel radius. ** - ** b/f/j = -fx-outer-border, 0, 5 ** - ** Draws an outer border the size of the control (insets = 0) and ** - ** with corners with a 5 pixel radius. ** - ** c/g/k = -fx-inner-border, 1, 4 ** - ** Draws an inner border inset 1 pixel from the control edge and ** - ** with corners with a smaller radius (radius = 4). ** - ** d/h/l = -fx-body-color, 2, 3 ** - ** Draws the body last, inset 2 pixels from the control edge and ** - ** with corners with an even smaller radius (radius = 3). ** - ** m = Padding from the edge of the control to the outer edge of the ** - ** skin content. ** - ** n = If specified, the color chosen for -fx-text-fill should match ** - ** the innermost color from -fx-background-colors (e.g., 'd'). ** - ** See the -fx-text-fill entry in .scene for more information. ** - ** ** - ** The control will also typically define pseudoclass sections for when it ** - ** is focused, when the mouse is hovering over it ("hover") and when the ** - ** mouse button is being held down on it (e.g., "armed"). ** - ** ** - ** For example, in the "focused" pseudoclass, -fx-focus-color will typically ** - ** just replace -fx-shadow-highlight-color and will be drawn so it extents ** - ** outside the control with a glowing effect. The glowing effect is ** - ** achieved by using a non-integer insets value of -1.4 and the radius ** - ** is adjusted accordingly. ** - ** ** - ** .control-name:focused { ** - ** -fx-background-color: -fx-focus-color, b, c, d ** - ** -fx-background-insets: -1.4, f, g, h ** - ** -fx-background-radius: 6.4, j, k, l ** - ** } ** - ** ** - ** In the "hover" pseudoclass, the -fx-color is replaced with -fx-hover-base ** - ** which will result in a re-derivation of the other colors in ** - ** -fx-background-colors: ** - ** ** - ** .control-name:hover { ** - ** -fx-color: -fx-hover-base; ** - ** } ** - ** ** - ** In the "armed" pseudoclass, the -fx-color is replaced with ** - ** -fx-pressed-base, which will result in a rederivation of the other colors ** - ** in -fx-background-colors: ** - ** ** - ** .control-name:armed { ** - ** -fx-color: -fx-pressed-base; ** - ** } ** - ** ** - ** The control will also typically include a "disabled" pseudoclass which ** - ** makes the component transparent: ** - ** ** - ** .control-name:disabled { ** - ** -fx-opacity: -fx-disabled-opacity; ** - ** } ** - ** ** - ******************************************************************************* - ******************************************************************************/ - -/******************************************************************************* - ******************************************************************************* - ** ** - ** NOTE on em values: em values are used for padding and other sizing ** - ** throughout this file. Size values in ems represent fraction of the ** - ** font size in use. As used in this file, each 1/12th represents a pixel ** - ** based upon the default size of 12px. Here's a table for quick reference: ** - ** ** - ** 1px: 0.083333em ** - ** 2px: 0.166667em ** - ** 3px: 0.25em ** - ** 4px: 0.333333em ** - ** 5px: 0.416667em ** - ** 6px: 0.5em ** - ** 7px: 0.583333em ** - ** 8px: 0.666667em ** - ** 9px: 0.75em ** - ** 10px: 0.833333em ** - ** 11px: 0.916667em ** - ** 12px: 1.0em ** - ** ** - ******************************************************************************* - ******************************************************************************/ - -/******************************************************************************* - * * - * Label * - * * - ******************************************************************************/ - -.label { - -fx-text-fill: -fx-text-background-color; -} - -.label:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.label:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/* The opacity of the parent is applied to the children. So we make the - * opacity 1.0 here to avoid double translucency. - */ -/*:disabled > * > .label { - -fx-opacity: 1.0; -}*/ - -/******************************************************************************* - * * - * Button * - * * - ******************************************************************************/ - -.button { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 5, 5, 4, 3; - -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */ - -fx-text-fill: -fx-text-base-color; - -fx-alignment: CENTER; - -fx-content-display: LEFT; -} - -.button:focused { - -fx-color: -fx-focused-base; - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 6.4, 5, 4, 3; -} - -.button:hover { - -fx-color: -fx-hover-base; -} - -.button:armed { - -fx-color: -fx-pressed-base; -} - -.button:default { - -fx-base: -fx-accent; -} - -.button:cancel { -} - -.button:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.button:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} -/******************************************************************************* - * * - * ToggleButton * - * * - ******************************************************************************/ - -.toggle-button { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 5, 5, 4, 3; - -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */ - -fx-text-fill: -fx-text-base-color; - -fx-alignment: CENTER; - -fx-content-display: LEFT; -} - -.toggle-button:focused { - -fx-color: -fx-focused-base; - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 6.4, 5, 4, 3; -} - -.toggle-button:hover { - -fx-color: -fx-hover-base; -} - -.toggle-button:armed { - -fx-color: -fx-pressed-base; -} - -.toggle-button:selected { - -fx-background-color: - -fx-shadow-highlight-color, - linear-gradient(to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100%), - linear-gradient(to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100%), - linear-gradient(to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100%); - -fx-background-insets: 0 0 -1 0, 0, 1, 1; - /* TODO: -fx-text-fill should be derived */ - -fx-text-fill: -fx-light-text-color; -} - -.toggle-button:selected:focused { - -fx-color: -fx-focused-base; - -fx-background-color: - -fx-focus-color, - linear-gradient(to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100%), - linear-gradient(to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100%), - linear-gradient(to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100%); - -fx-background-insets: -1.4, 0, 1, 1; -} - -.toggle-button:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.toggle-button:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/******************************************************************************* - * * - * RadioButton * - * * - ******************************************************************************/ - -.radio-button { - -fx-label-padding: 0.0em 0.0em 0.0em 0.416667em; /* 0 0 0 5 */ - -fx-text-fill: -fx-text-background-color; -} - -.radio-button:focused { - -fx-color: -fx-focused-base; -} - -.radio-button > .radio { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 1.0em; /* large value to make sure this remains circular */ - -fx-padding: 0.333333em; /* 4 -- padding from outside edge to the inner black dot */ -} - -.radio-button:focused > .radio { - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-radius: 1.0em; /* large value to make sure this remains circular */ - -fx-background-insets: -1.4, 0, 1, 2; -} - -.radio-button:hover > .radio { - -fx-color: -fx-hover-base; -} -.radio-button:armed > .radio { - -fx-color: -fx-pressed-base; -} - -.radio-button > .radio > .dot { - -fx-background-color: transparent; - -fx-background-insets: 0; - -fx-background-radius: 1.0em; /* large value to make sure this remains circular */ - -fx-padding: 0.25em; /* 3 -- radius of the inner black dot when selected */ -} - -.radio-button:selected > .radio > .dot { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 0 0 -1 0, 0; -} - -.radio-button:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.radio-button:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/******************************************************************************* - * * - * CheckBox * - * * - ******************************************************************************/ - -.check-box { - -fx-label-padding: 0.0em 0.0em 0.0em 0.416667em; /* 0 0 0 5 */ - -fx-text-fill: -fx-text-background-color; -} - -.check-box:focused { - -fx-color: -fx-focused-base; -} - -.check-box > .box { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 2, 2, 1, 1; - -fx-padding: 0.25em; /* 3 -- padding from the outside edge to the mark */ -} - -.check-box:focused > .box { - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 3.4, 2, 1, 1; -} - -.check-box:hover > .box { - -fx-color: -fx-hover-base; -} - -.check-box:armed > .box { - -fx-color: -fx-pressed-base; -} - -.check-box > .box > .mark { - -fx-background-color: transparent; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.333333em; /* 4 -- this is half the size of the mark */ - -fx-shape: "M0,4H2L3,6L6,0H8L4,8H2Z"; -} - -/* TODO: scale the shape - the problem is that it is not within a square - * boundary. - */ -.check-box:indeterminate > .box > .mark { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-shape: "M0,0H8V2H0Z"; - -fx-scale-shape: false; -} - -.check-box:selected > .box > .mark { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; -} - -.check-box:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.check-box:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/******************************************************************************* - * * - * Hyperlink * - * * - ******************************************************************************/ - -.hyperlink { - -fx-padding: 0.166667em; /* 2 */ - -fx-cursor: hand; - -fx-content-display: LEFT; - -fx-text-fill: -fx-text-background-color; - -fx-border-color: transparent; - -fx-border-width: 1px; -} - -.hyperlink:visited { - -fx-text-fill: -fx-accent; -} - -.hyperlink:focused { - -fx-color: -fx-focused-base; - -fx-border-color: -fx-focus-color; - -fx-border-style: segments(0.166667em, 0.166667em); - -fx-border-width: 1px; -} - -.hyperlink:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.hyperlink:hover { - -fx-underline: true; -} - -.hyperlink:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - - -/******************************************************************************* - * * - * PopupMenu * - * * - ******************************************************************************/ - -.context-menu { - -fx-color: -fx-base; - -fx-background-color: - derive(-fx-color,-40%), - derive(-fx-color,100%), - linear-gradient(to bottom, derive(-fx-color,100%) 0%, derive(-fx-color,50%) 12%, derive(-fx-color,65%) 88%, derive(-fx-color,23%) 100%); - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 6 6 6, 0 5 5 5, 0 4 4 4; -/* -fx-padding: 0.666667em 0.083333em 0.666667em 0.083333em; 8 1 8 1 */ - -fx-padding: 0.333333em 0.083333em 0.666667em 0.083333em; /* 4 1 8 1 */ -} - -.context-menu > .separator { - -fx-padding: 0.0em 0.333333em 0.0em 0.333333em; /* 0 4 0 4 */ -} - -.context-menu > .scroll-arrow { - -fx-padding: 0.416667em 0.416667em 0.416667em 0.416667em; /* 5 */ - -fx-background-color: transparent; -} - -.context-menu > .scroll-arrow:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.context-menu:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/* - * RT-33312 - if the context-menu is belongs to a menu-button, then set the context-menu's -fx-color to -fx-base - * effectively overriding the menu-button:armed, menu-button:hover styling of -fx-color - */ -.menu-button > * > .context-menu { - -fx-color: -fx-base; -} - -/******************************************************************************* - * * - * Menu * - * * - ******************************************************************************/ - -.menu { - -fx-background-color: transparent; - -fx-padding: 0.333333em 0.666667em 0.333333em 0.666667em; /* 4 8 4 8 */ -} - -.menu:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.menu:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} -.menu > .right-container > .arrow { - -fx-padding: 0.458em 0.167em 0.458em 0.167em; /* 4.5 2 4.5 2 */ - -fx-background-color: -fx-mark-color; - -fx-shape: "M0,-4L4,0L0,4Z"; - -fx-scale-shape: false; -} - -.menu:focused > .right-container > .arrow { - -fx-background-color: white; -} - -/* This hides the down arrow that would show on a menu placed in a menubar */ -.menu-bar > .container > .menu > .arrow-button > .arrow { - -fx-padding: 0; - -fx-background-color: transparent; - -fx-shape: null; -} - -.menu-bar > .container > .menu > .arrow-button { - -fx-padding: 0; -} - -.menu-up-arrow { - -fx-padding: 0.666667em 0.416667em 0.0em 0.416667em; /* 8 5 0 5 */ - -fx-background-color: derive(-fx-color,-2%); - -fx-shape: "M0 1 L1 1 L.5 0 Z"; - -fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 1 ); -} - -.menu-down-arrow { - -fx-background-color: derive(-fx-color,-2%); - -fx-padding: 0.666667em 0.416667em 0.0em 0.416667em; /* 8 5 0 5 */ - -fx-shape: "M0 0 L1 0 L.5 1 Z"; - -fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 1 ); -} - - -/******************************************************************************* - * * - * MenuBar * - * * - ******************************************************************************/ - -/* Corresponding hex values for the color derivations used below are: * - * derive(-fx-base,-30%); #929292 * - * derive(-fx-base,-50%); #686868 * - * derive(-fx-base,-70%); #3e3e3e */ - -.menu-bar { - -fx-padding: 0.0em 0.666667em 0.0em 0.666667em; /* 0 8 0 8 */ - -fx-spacing: 0.166667em; /* 2 */ - -fx-base: derive(#d0d0d0,-70%); - -fx-background-color: linear-gradient(to bottom, derive(-fx-color,50%), derive(-fx-color,-30%)), -fx-body-color; - -fx-background-insets: 0, 1 0 1 0; - -fx-background-radius: 0, 0 ; -} - -/* Show nothing for background of normal menu button in a menu bar */ -.menu-bar > .container > .menu-button { - -fx-background-radius: 0; - -fx-background-color: transparent; - -fx-background-insets: 0; -} -/* Change padding of menu buttons when in menu bar */ -.menu-bar > .container > .menu-button > .label { - -fx-padding: 0.333em 0.5em 0.333em 0.5em; /* 4 6 4 6*/ -} - -.menu-bar > .container > .menu-button:hover, .menu-bar > .container > .menu-button:focused, .menu-bar > .container > .menu-button:showing { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -/*.menu-bar .menu:focused:showing, .menu-bar .menu:showing, .menu-bar .menu:focused, .menu:focused:showing, .menu:showing, .menu:focused {*/ -/*.menu-bar .menu-button:showing, .menu-button:showing { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -}*/ - -.menu-bar > .container > .menu-button:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.menu-bar:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -/******************************************************************************* - * * - * MenuItem * - * * - ******************************************************************************/ - -.menu-item { - -fx-background-color: transparent; - -fx-padding: 0.333333em 0.41777em 0.333333em 0.41777em; /* 4 5 4 5 */ -} - -.menu-item > .left-container { - -fx-padding: 0.458em 0.791em 0.458em 0.458em; -} - -.menu-item > .graphic-container { - -fx-padding: 0em 0.333em 0em 0em; -} - -.menu-item >.label { - -fx-padding: 0em 0.5em 0em 0em; - -fx-text-fill: -fx-text-base-color; -} - -.menu-item:disabled > .label { - -fx-opacity: -fx-disabled-opacity; -} - -.menu-item:focused { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.menu-item:focused > .label { - -fx-text-fill: white; -} -.menu-item > .right-container { - -fx-padding: 0em 0em 0em 0.5em; -} - -.menu-item:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - -.radio-menu-item:checked > .left-container > .radio { - -fx-background-color: -fx-mark-color; - -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z"; - -fx-scale-shape: false; -} - -.radio-menu-item:focused:checked > .left-container > .radio { - -fx-background-color: white; -} - -.check-menu-item:checked > .left-container > .check { - -fx-background-color: -fx-mark-color; - -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z"; - -fx-scale-shape: false; -} - -.check-menu-item:focused:checked > .left-container > .check { - -fx-background-color: white; -} - -/*.radio.selected { - -fx-background-color: -fx-mark-color; - -fx-padding: 0.666667em; 8 - -fx-shape: "M7,3.5C7,5.433,5.433,7,3.5,7C1.567,7,0,5.433,0,3.5C0,1.567,1.63,0,3.5,0C5.433,0,7,1.567,7,3.5z"; - -fx-scale-shape: false; -}*/ - -/*.check.checked { - -fx-background-color: -fx-mark-color; - -fx-padding: 0.666667em; 8 - -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z"; - -fx-scale-shape: false; -}*/ - -/* -.menu-item:hover:selected .menu-item-check, .menu-item:focused:selected .menu-item-check,.menu-item:hover:selected .menu-item-radio, .menu-item:focused:selected .menu-item-radio { - -fx-background-color: -fx-selection-bar-text; -} -*/ -.menu-item:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * ChoiceBox * - * * - ******************************************************************************/ - -.choice-box { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 5, 5, 4, 3; - -fx-padding: 0; - -fx-alignment: CENTER; - -fx-content-display: LEFT; -} - -.choice-box:focused { - -fx-color: -fx-focused-base; - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 6.4, 5, 4, 3; -} - -.choice-box:hover { - -fx-color: -fx-hover-base; -} - -.choice-box:showing { - -fx-color: -fx-pressed-base; -} - -.choice-box > .label { - -fx-padding: 0.166667em 0.333333em 0.25em 0.5em; /* 2 4 3 6 */ - -fx-text-fill: -fx-text-base-color; -} - -.choice-box > .open-button { - -fx-background-color: null; - -fx-padding: 0.083333em 0.666667em 0 0; /* 1 0 0 8 */ -} - -.choice-box > .open-button > .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - /* padding determines the size of the arrow; - this should match the design size in the SVG */ - -fx-padding: 0.166667em 0.333333em 0.166667em 0.333333em; /* 2 3.5 2 3.5 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -.choice-box > .context-menu { - -fx-background-radius: 6, 5, 4; -} - -/*.choice-box > .context-menu > .menu-item { - -fx-accelerator-gutter: 0; -}*/ - -/* TODO: need to use the ID here. For some reason, the other form does not - * work. This might be related to popup issues. - */ -/*.choice-box > * > .menu-item-radio {*/ -#choice-box-menu-item > * > .menu-item-radio { - /* When we show RadioMenuItems in ChoiceBox, we replace the radio shape with - a check mark, which looks much better */ - -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z"; - -fx-scale-shape: false; -} - -.choice-box:disabled { - -fx-opacity: -fx-disabled-opacity; -} - - -/******************************************************************************* - * * - * Slider * - * * - ******************************************************************************/ - -.slider > .thumb { - -fx-background-color: - derive(-fx-color,-36%), - derive(-fx-color,73%), - linear-gradient(to bottom, derive(-fx-color,-19%),derive(-fx-color,61%)); - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 1.0em; /* makes sure this remains circular */ - -fx-padding: 0.583333em; /* 7 */ -} - -.slider:focused > .thumb { - -fx-color: -fx-focused-base; - -fx-background-color: - -fx-focus-color, - derive(-fx-color,-36%), - derive(-fx-color,73%), - linear-gradient(to bottom, derive(-fx-color,-19%),derive(-fx-color,61%)); - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 1.0em; /* makes sure this remains circular */ -} - -.slider > .thumb:hover { - -fx-color: -fx-hover-base; -} - -/* Uncomment when RT-10521 is fixed. -.slider .thumb:pressed { - -fx-color: -fx-pressed-base; -} -*/ - -.slider > .track { - -fx-background-color: - -fx-shadow-highlight-color, - derive(-fx-color,-22%), - linear-gradient(to bottom, derive(-fx-color,-15.5%), derive(-fx-color,34%) 30%, derive(-fx-color,68%)); - -fx-background-insets: 1 0 -1 0, 0, 1; - -fx-background-radius: 2.5, 2.5, 1.5; - -fx-padding: 0.208333em; /* 2.5 */ -} - -.slider:vertical > .track { - -fx-background-color: - -fx-shadow-highlight-color, - derive(-fx-color,-22%), - linear-gradient(to right, derive(-fx-color,-15.5%), derive(-fx-color,34%) 30%, derive(-fx-color,68%)); - -fx-background-insets: 0 -1 0 1, 0, 1; -} - -.slider > .axis { - -fx-tick-mark-stroke: ladder(-fx-background, derive(-fx-background,30%) 40%, derive(-fx-background,-30%) 41%); - -fx-tick-label-font-size: 0.833333em; - -fx-tick-label-fill: -fx-text-background-color; -} - -.slider:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * ScrollBar * - * * - ******************************************************************************/ - -.scroll-bar:horizontal { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%); - -fx-background-insets: 0, 1; -} - -.scroll-bar:horizontal:focused { - -fx-background-color: - -fx-focus-color, - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%); - -fx-background-insets: -1.4, 0, 1; -} - -.scroll-bar:vertical { - -fx-background-color: - -fx-box-border, - linear-gradient(to top, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%); - -fx-background-insets: 0, 1; -} - -.scroll-bar:vertical:focused { - -fx-background-color: - -fx-focus-color, - -fx-box-border, - linear-gradient(to top, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%); - -fx-background-insets: -1.4, 0, 1; -} - -.scroll-bar:horizontal > .thumb { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,95%), derive(-fx-color,10%)), - linear-gradient(to bottom, derive(-fx-color,38%), derive(-fx-color,-16%)); - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0.5em; /* makes sure this remains circular */ -} - -.scroll-bar:vertical > .thumb { - -fx-background-color: - -fx-box-border, - linear-gradient(to right, derive(-fx-color,95%), derive(-fx-color,10%)), - linear-gradient(to right, derive(-fx-color,38%), derive(-fx-color,-16%)); - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0.5em; /* makes sure this remains circular */ -} - -.scroll-bar:focused > .thumb { - -fx-color: -fx-focused-base; -} - -.scroll-bar > .thumb:hover { - -fx-color: -fx-hover-base; -} - -/* Uncomment when RT-10521 is fixed. -.scroll-bar .thumb:pressed { - -fx-color: -fx-pressed-base; -} -*/ - -.scroll-bar:horizontal > .track { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%)); - -fx-background-insets: 0, 1; - -fx-background-radius: 0.5em; /* makes sure this remains circular */ -} -.scroll-bar:horizontal > .track-background { - -fx-background-color: - -fx-box-border, - linear-gradient(to top, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%)); - -fx-background-insets: 0, 1; -} - -.scroll-bar:vertical > .track { - -fx-background-color: - -fx-box-border, - linear-gradient(to right, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%)); - -fx-background-insets: 0, 1; - -fx-background-radius: 0.5em; /* makes sure this remains circular */ -} - -.scroll-bar:vertical > .track-background { - -fx-background-color: - -fx-box-border, - linear-gradient(to left, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%)); - -fx-background-insets: 0, 1; -} - -.scroll-bar > .increment-button { - -fx-background-color: transparent; - -fx-background-insets: 0; - -fx-padding: 0.25em; /* 3 */ -} - -.scroll-bar > .decrement-button { - -fx-background-color: transparent; - -fx-background-insets: 0; - -fx-padding: 0.25em; /* 3 */ -} - -.scroll-bar:horizontal > .increment-button > .increment-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.5em 0.333333em 0.0em 0.0em; /* 6 4 0 0 */ - -fx-shape: "M 4 0 L 0 -3 L 0 3 z"; -} - -.scroll-bar:vertical > .increment-button > .increment-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.333333em 0.5em 0.0em 0.0em; /* 4 6 0 0 */ - -fx-shape: "M -3 0 L 0 4 L 3 0 z"; -} - -.scroll-bar:horizontal > .decrement-button > .decrement-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.5em 0.333333em 0.0em 0.0em; /* 6 4 0 0 */ - -fx-shape: "M 0 0 L 4 -3 L 4 3 z"; -} - -.scroll-bar:vertical > .decrement-button > .decrement-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.333333em 0.5em 0.0em 0.0em; /* 4 6 0 0 */ - -fx-shape: "M -3 0 L 0 -4 L 3 0 z"; -} - -.scroll-bar:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/* The opacity of the parent is applied to the children. So we make the - * opacity 1.0 here to avoid double translucency. - */ -/*:disabled > * > .scroll-bar { - -fx-opacity: 1.0; -}*/ - -/******************************************************************************* - * * - * ScrollPane * - * * - ******************************************************************************/ - -.scroll-pane { - -fx-background-color: -fx-box-border,-fx-background; - -fx-background-insets: 0, 1; - -fx-padding: 1.0; -} - -.scroll-pane:focused { - -fx-background-color: -fx-focus-color, -fx-box-border, -fx-background; - -fx-background-insets: -1.4, 0, 1; -} - -.scroll-pane > * > .scroll-bar:horizontal { - -fx-background-insets: 0, 1 0 0 0; - -fx-padding: 0.0 0.0 0.0 0.0; -} - -.scroll-pane > * > .scroll-bar:vertical { - -fx-background-insets: 0, 0 0 0 1; - -fx-padding: 0.0 0.0 0.0 0.0; -} - -.scroll-pane > .corner { - -fx-background-color: -fx-box-border, -fx-base; - -fx-background-insets: 0, 1 0 0 1; -} - -.scroll-pane:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * Separator * - * * - ******************************************************************************/ - -.separator > .line { - -fx-border-style: segments(0.166667em, 0.166667em); - -fx-border-width: 0.083333em; /* 1 */ -} - -.separator:horizontal > .line { - -fx-background-color: null; - -fx-padding: 0.083333em 0.0em 0.0em 0.0em; /* 1 0 0 0 */ - -fx-border-color: derive(-fx-background,-20%) transparent transparent transparent; -} - -.separator:vertical > .line { - -fx-background-color: null; - -fx-padding: 0.0em 0.083333em 0.0em 0.0em; /* 0 1 0 0 */ - -fx-border-color: transparent derive(-fx-background,-20%) transparent transparent; -} - -/******************************************************************************* - * * - * TextInput * - * * - ******************************************************************************/ - -.text-input { - -fx-text-fill: -fx-text-inner-color; - -fx-highlight-fill: derive(-fx-control-inner-background,-20%); - -fx-highlight-text-fill: -fx-text-inner-color; -} - -.text-input:focused { - -fx-highlight-fill: -fx-accent; - -fx-highlight-text-fill: white; -} - -/******************************************************************************* - * * - * TextField * - * * - ******************************************************************************/ - -.text-field { - -fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 3, 2, 2; - -fx-padding: 0.25em 0.416667em 0.333333em 0.416667em; /* 3 5 4 5 */ - -fx-text-fill: -fx-text-inner-color; - -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%); - -fx-cursor: text; -} - -.text-field:focused { - -fx-background-color: -fx-focus-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: -0.4, 1, 2; - -fx-background-radius: 3.4, 2, 2; - -fx-prompt-text-fill: transparent; -} - -.text-field:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * PasswordField * - * * - ******************************************************************************/ - -.password-field { - -fx-text-fill: -fx-text-inner-color; -} - -/******************************************************************************* - * * - * TextArea * - * * - ******************************************************************************/ - -.text-area { - -fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 3, 2, 2; - -fx-padding: 1; - -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%); -} - -.text-area > .scroll-pane { - -fx-background-color: transparent; -} - -.text-area .content { - -fx-padding: 3 5 3 5; - -fx-cursor: text; -} - -.text-area:focused { - -fx-background-color: -fx-focus-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: -0.4, 1, 2; - -fx-background-radius: 3.4, 2, 2; - -fx-prompt-text-fill: transparent; -} - -.text-area:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * Customised CSS for controls placed directly within cells * - * * - ******************************************************************************/ - -.cell > .choice-box { - -fx-background-color: transparent; - -fx-background-insets: 0; - -fx-background-radius: 0; - -fx-padding: 0.0em 0.5em 0.0em 0.0em; /* 0 6 0 0 */ - -fx-alignment: CENTER_LEFT; - -fx-content-display: LEFT; -} - -.cell > .choice-box > .label { - -fx-padding: 0em 0.333333em 0.0em 0.333333; /* 2 4 3 6 */ -} - -.cell:focused:selected > .choice-box > .label { - -fx-text-fill: white; -} - -.cell:focused:selected > .choice-box > .open-button > .arrow { - -fx-background-color: -fx-mark-highlight-color, white; -} - -/******************************************************************************* - * * - * ListView and ListCell * - * * - ******************************************************************************/ - -.list-view { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ -} - -.list-view:focused { - -fx-background-color: -fx-focus-color,-fx-box-border,-fx-control-inner-background; - -fx-background-insets: -1.4, 0, 1; - -fx-background-radius: 1.4, 0, 0; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ -} - -.list-view > .virtual-flow > .scroll-bar:vertical{ - -fx-background-insets: 0, 0 0 0 1; - -fx-padding: -1 -1 -1 0; -} - -.list-view > .virtual-flow > .scroll-bar:horizontal{ - -fx-background-insets: 0, 1 0 0 0; - -fx-padding: 0 -1 -1 -1; -} - -.list-view:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.list-view > .virtual-flow > .corner { - -fx-background-color: -fx-box-border, -fx-base; - -fx-background-insets: 0, 1 0 0 1; -} - -.list-cell { - -fx-background-color: -fx-control-inner-background; - -fx-padding: 0.25em; /* 3 */ - -fx-text-fill: -fx-text-inner-color; - -fx-opacity: 1; -} - -.list-cell:odd { - -fx-background-color: derive(-fx-control-inner-background,-5%); -} - -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:focused { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background; - -fx-background-insets: 0, 1, 2; -} - -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:focused:odd { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, derive(-fx-control-inner-background,-5%); - -fx-background-insets: 0, 1, 2; -} - -/* When the list-cell is selected and focused */ -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:selected { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-background: -fx-accent; - -fx-text-fill: -fx-selection-bar-text; -} - -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:selected:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-text-fill: -fx-selection-bar-text; -} - -/* When the ListView is _not_ focused, we show alternate selection colors */ -.list-cell:filled:selected:focused, -.list-cell:filled:selected, -.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected { - -fx-background-color: lightgray; - -fx-text-fill: -fx-selection-bar-text; -} - -.list-cell:filled:selected:focused:disabled, -.list-cell:filled:selected:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.list-cell:filled:hover { - -fx-background-color: -fx-cell-hover-color; - -fx-text-fill: -fx-text-inner-color; -} - -.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:hover { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0, 1, 2; - -fx-text-fill: -fx-text-inner-color; -} - -.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, -.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover { - -fx-background-color: linear-gradient(to right, derive(-fx-accent,-7%), derive(-fx-accent,-25%)); -} - -/******************************************************************************* - * * - * TreeView and TreeCell * - * * - ******************************************************************************/ - -.tree-view { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ -} - -.tree-view:focused { - -fx-background-color: -fx-focus-color,-fx-box-border,-fx-control-inner-background; - -fx-background-insets: -1.4, 0, 1; - -fx-background-radius: 1.4, 0, 0; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ -} - -.tree-view > .virtual-flow > .scroll-bar:vertical{ - -fx-background-insets: 0, 0 0 0 1; - -fx-padding: -1 -1 -1 0; -} - -.tree-view > .virtual-flow > .scroll-bar:horizontal{ - -fx-background-insets: 0, 1 0 0 0; - -fx-padding: 0 -1 -1 -1; -} - -.tree-view:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.tree-view > .virtual-flow > .corner { - -fx-background-color: -fx-box-border, -fx-base; - -fx-background-insets: 0, 1 0 0 1; -} - -.tree-cell { - -fx-background-color: -fx-control-inner-background; - -fx-padding: 0.25em; /* 3 */ - -fx-text-fill: -fx-text-inner-color; - -fx-indent: 10; -} - -.tree-cell .label { - -fx-padding: 0.0em 0.0em 0.0em 0.25em; /* 0 0 0 3 */ -} - -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:focused { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background; - -fx-background-insets: 0, 1, 2; -} - -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:selected { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-background: -fx-accent; - -fx-text-fill: -fx-selection-bar-text; -} - -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:selected, -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:selected:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:selected:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-text-fill: -fx-selection-bar-text; -} - -/* When the TreeView is _not_ focused, we show alternate selection colors */ -.tree-cell:filled:selected:focused, -.tree-cell:filled:selected { - -fx-background-color: lightgray; - -fx-text-fill: -fx-selection-bar-text; -} - -.tree-cell:filled:selected:focused:disabled, -.tree-cell:filled:selected:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.tree-cell > .tree-disclosure-node, -.tree-table-row-cell > .tree-disclosure-node { - -fx-padding: 4 2 4 8; - -fx-background-color: transparent; -} - -.tree-cell > .tree-disclosure-node:disabled, -.tree-table-row-cell > .tree-disclosure-node:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.tree-cell > .tree-disclosure-node > .arrow, -.tree-table-row-cell > .tree-disclosure-node > .arrow { - -fx-background-color: -fx-mark-color; - -fx-padding: 0.333333em; /* 4 */ - -fx-shape: "M 0 -4 L 8 0 L 0 4 z"; -} - -.tree-cell:expanded > .tree-disclosure-node > .arrow, -.tree-table-row-cell:expanded > .tree-disclosure-node > .arrow { - -fx-rotate: 90; -} - -.tree-cell:filled:selected > .tree-disclosure-node > .arrow, -.tree-table-row-cell:filled:selected > .tree-disclosure-node > .arrow { - -fx-background-color: -fx-selection-bar-text; -} - -.tree-cell:filled:hover, -.tree-table-row-cell:filled:hover { - -fx-background-color: -fx-cell-hover-color; - -fx-text-fill: -fx-text-inner-color; -} - -.tree-cell:filled:hover > .tree-disclosure-node > .arrow, -.tree-table-row-cell:filled:hover > .tree-disclosure-node > .arrow { - -fx-background-color: -fx-mark-color; -} - -.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:hover, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:hover { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0, 1, 2; - -fx-text-fill: -fx-text-inner-color; -} - -.tree-cell:filled:selected:hover > .tree-disclosure-node > .arrow, -.tree-table-row-cell:filled:selected:hover > .tree-disclosure-node > .arrow { - -fx-background-color: -fx-selection-bar-text; -} - -/******************************************************************************* - * * - * MenuButton * - * * - ******************************************************************************/ - -.menu-button { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-background-radius: 5, 5, 4, 3; - -fx-padding: 0.0em; /* 0 */ - -fx-text-fill: -fx-text-base-color; -} - -.menu-button > .label { - /* TODO workaround for RT-19062 */ - -fx-text-fill: -fx-text-base-color; - - /* The MenuButton skin uses an inner Label part */ - -fx-padding: 0.166667em 0.667em 0.25em 0.833333em; /* 2 8 3 10 */ -} - -.menu-button:focused { - -fx-color: -fx-focused-base; - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1.4, 0, 1, 2; - -fx-background-radius: 6.4, 4, 5, 3; -} - -.menu-button:hover { - -fx-color: -fx-hover-base; -} - -.menu-button:armed { - -fx-color: -fx-pressed-base; -} - -.menu-button > .arrow-button { - -fx-background-insets: 0; - -fx-background-radius: 0; - -fx-padding: 0.5em 0.667em 0.5em 0.0em; /* 6 8 6 0 */ -} - -.menu-button > .arrow-button > .arrow { - -fx-background-insets: 1 0 -1 0, 0; - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-padding: 0.25em; /* 3 */ - -fx-shape: "M 0 -3.5 v 7 l 4 -3.5 z"; -} - -.menu-button:openvertically > .arrow-button > .arrow { - -fx-padding: 0.166667em 0.333333em 0.166667em 0.333333em; /* 2 4 2 4 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -.menu-button:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.menu-button:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - - - -/******************************************************************************* - * * - * SplitMenuButton * - * * - ******************************************************************************/ - -.split-menu-button { - -fx-background-color: -fx-shadow-highlight-color; - -fx-background-insets: 0 0 -1 0; - -fx-background-radius: 5; - -fx-padding: 0.0em; /* 0 */ - -fx-text-fill: -fx-text-base-color; -} - -.split-menu-button:focused { - -fx-color: -fx-focused-base; - -fx-background-color: -fx-focus-color; - -fx-background-insets: -1.4; - -fx-background-radius: 6.4; -} - -.split-menu-button > .label:hover { - -fx-color: -fx-hover-base; -} - -.split-menu-button:armed > .label { - -fx-color: -fx-pressed-base; -} - -/* The SplitMenuButton skin uses an inner Label part */ -.split-menu-button > .label { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1 0 1 1, 2 1 2 2; - -fx-background-radius: 5 0 0 5, 4 0 0 4, 3 0 0 3; - -fx-padding: 0.166667em 0.667em 0.25em 0.833333em; /* 2 8 3 10 */ -} - -.split-menu-button > .arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; - -fx-padding: 0.5em 0.667em 0.5em 0.667em; /* 6 8 6 8 */ -} - -.split-menu-button > .arrow-button:hover { - -fx-color: -fx-hover-base; -} - -.split-menu-button > .arrow-button:pressed { - -fx-color: -fx-pressed-base; -} - -.split-menu-button > .arrow-button > .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.25em; /* 3 */ - -fx-shape: "M 0 -3.5 v 7 l 4 -3.5 z"; -} - -.split-menu-button:openvertically > .arrow-button > .arrow { - -fx-padding: 0.166667em 0.333333em 0.166667em 0.333333em; /* 2 4 2 4 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -.split-menu-button:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.split-menu-button:show-mnemonics > .mnemonic-underline { - -fx-stroke: -fx-text-fill; -} - - - -/******************************************************************************* - * * - * Tooltip * - * * - ******************************************************************************/ - -.tooltip { - -fx-background-color: - linear-gradient(#cec340, #a59c31), - linear-gradient(#fefefc, #e6dd71), - linear-gradient(#fef592, #e5d848); - -fx-background-insets: 0,1,2; - -fx-padding: 0.333333em 0.666667em 0.333333em 0.666667em; /* 4 8 4 8 */ - -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 ); -} - -/******************************************************************************* - * * - * Toolbar * - * * - * Corresponding hex values for the color derivations used below are: * - * derive(-fx-base,-20%); #a6a6a6 * - * derive(-fx-base,-30%); #929292 * - * derive(-fx-base,-35%); #878787 * - * derive(-fx-base,-50%); #686868 * - * derive(-fx-base,-60%); #535353 * - * derive(-fx-base,65%); #efefef * - * * - ******************************************************************************/ - -.tool-bar:vertical { - -fx-background: derive(-fx-base,-20%); - -fx-background-color: - linear-gradient(to right, derive(-fx-base,-30%), derive(-fx-base,-60%)), - linear-gradient(to right, derive(-fx-base,65%) 2%, derive(-fx-base,-20%) 95%); - -fx-background-insets: 0, 0 1 0 1; - -fx-background-radius: 0 ; - -fx-padding: 0.833em 0.416667em 0.833em 0.416667em; /* 10 5 10 5 */ - -fx-spacing: 0.333em; /* 4 */ - -fx-alignment: TOP_LEFT; -} - -.tool-bar > .container > .separator:vertical > .line { - -fx-border-style: solid; - -fx-background-color: null; - -fx-border-color: transparent derive(-fx-base,-35%) transparent transparent; -} - -.tool-bar > .container > .separator:horizontal > .line { - -fx-border-style: solid; - -fx-background-color: null; - -fx-border-color: transparent transparent derive(-fx-base,-35%) transparent; -} - -.tool-bar:vertical > .container > .separator { - -fx-orientation: horizontal; - -fx-padding: 0.0em 0.0835em 0.0em 0.0835em; /* 0 1 0 1 */ -} - -.tool-bar:horizontal { - -fx-background: derive(-fx-base,-30%); - -fx-background-color: - linear-gradient(to bottom, derive(-fx-base,-30%), derive(-fx-base,-60%)), - linear-gradient(to bottom, derive(-fx-base,65%) 2%, derive(-fx-base,-20%) 95%); - -fx-background-insets: 0, 1 0 1 0; - -fx-background-radius: 0, 0 ; - -fx-padding: 0.416667em 0.833em 0.416667em 0.833em; /* 5 10 5 10 */ - -fx-spacing: 0.333em; /* 4 */ - -fx-alignment: CENTER_LEFT; -} - -.tool-bar:horizontal > .container > .separator { - -fx-orientation: vertical; - -fx-padding: 0.0835em 0.0em 0.0835em 0.0em; /* 1 0 1 0 */ -} - -.tool-bar-overflow-button { - -fx-background-color: transparent; - -fx-padding: 0.666667em 0.916667em 0em 0em; /* 8 11 0 0 */ -} - -.tool-bar-overflow-button > .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.666667em 0.916667em 0em 0em; /* 8 11 0 0 */ - -fx-shape: "M337.273,297.622l-0.016,1.069l2.724,2.639l-2.723,2.628l0.015,1.048h0.881l3.81-3.685l-3.788-3.699H337.273z M343.783,297.622h-0.902l-0.015,1.069l2.724,2.639l-2.724,2.628l0.015,1.048h0.882l3.809-3.685L343.783,297.622z" ; -} - -.tool-bar-overflow-button:focused > .arrow { - -fx-background-color: -fx-mark-highlight-color, derive(-fx-accent, -15%); - -fx-background-insets: 1 0 -1 0, 0; -} - -.tool-bar-overflow-button:hover > .arrow { - -fx-background-color: -fx-mark-highlight-color, derive(-fx-hover-base, -35%); - -fx-background-insets: 1 0 -1 0, 0; -} - -/******************************************************************************* - * * - * ProgressBar * - * * - ******************************************************************************/ - -.progress-bar { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%)); - -fx-background-insets: 0, 1; - -fx-indeterminate-bar-length: 60; - -fx-indeterminate-bar-escape: true; - -fx-indeterminate-bar-flip: true; - -fx-indeterminate-bar-animation-time: 2; -} - -.progress-bar > .bar { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-accent,95%), derive(-fx-accent,10%)), - linear-gradient(to bottom, derive(-fx-accent,38%), -fx-accent); - -fx-background-insets: 0, 1, 2; - -fx-padding: 0.416667em; /* 5 */ -} - -.progress-bar:indeterminate > .bar { - -fx-background-color: linear-gradient(to left, transparent, -fx-accent); -} - -.progress-bar > .track { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%)); - -fx-background-insets: 0, 1; -} - -.progress-bar:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/******************************************************************************* - * * - * ProgressIndicator * - * * - ******************************************************************************/ - -.progress-indicator { - -fx-indeterminate-segment-count: 8; - -fx-spin-enabled: true; -} - -.progress-indicator > .determinate-indicator > .indicator { - -fx-background-color: - -fx-box-border, - -fx-outer-border, - -fx-inner-border, - -fx-body-color; - -fx-background-insets: 1 0 -1 0, 0, 1, 2; - -fx-padding: 1px; -} - -.progress-indicator > .determinate-indicator > .progress { - -fx-background-color: - linear-gradient(to bottom, derive(-fx-accent,38%), derive(-fx-accent,-60%)), - linear-gradient(to bottom, derive(-fx-accent,20%), -fx-accent); - -fx-background-insets: 0, 1; - -fx-padding: 0.25em; /* 3px */ -} - -/* TODO: scaling the shape seems to make it disappear */ -.progress-indicator > .determinate-indicator > .tick { - -fx-background-color: -fx-mark-color, white; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.416667em; /* 5 */ - -fx-shape: "M 0,5 L 2.5,5 L 3.7,7.5 L 7.5,0 L 10,0 L 5,10 L 2.5,10 Z"; - -fx-scale-shape: false; -} - -.progress-indicator:indeterminate > .spinner { - -fx-padding: 0.833333em; /* 10 */ -} - -.progress-indicator > .percentage { - -fx-font-size: 0.916667em; /* 11pt - 1 less than the default font */ - -fx-fill: -fx-text-background-color; -} - -.progress-indicator:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.progress-indicator:indeterminate .segment { - -fx-background-color: -fx-accent; -} -.progress-indicator:indeterminate .segment0 { - -fx-shape:"M18.191,4.264l-2.457,1.721l0,0C16.559,7.161,17,8.564,17,10h3C20,7.948,19.369,5.946,18.191,4.264z"; -} -.progress-indicator:indeterminate .segment1 { - -fx-shape:"M11.736,0.152l-0.521,2.955l0,0c1.416,0.249,2.719,0.928,3.734,1.943l2.122-2.121C15.62,1.478,13.758,0.508,11.736,0.152z"; -} -.progress-indicator:indeterminate .segment2 { - -fx-shape:"M10,0C7.947,0,5.945,0.631,4.264,1.809l1.72,2.457l0,0C7.162,3.442,8.563,3,10,3V0z"; -} -.progress-indicator:indeterminate .segment3 { - -fx-shape:"M2.929,2.929C1.478,4.38,0.508,6.242,0.152,8.264l2.955,0.521l0,0C3.356,7.369,4.035,6.066,5.05,5.05l0,0L2.929,2.929z"; -} -.progress-indicator:indeterminate .segment4 { - -fx-shape:"M0,10c0,2.052,0.631,4.055,1.809,5.735l2.458-1.721C3.442,12.838,3,11.437,3,10H0z"; -} -.progress-indicator:indeterminate .segment5 { - -fx-shape:"M8.785,16.894c-1.416-0.25-2.719-0.929-3.735-1.944l0,0l-2.122,2.122c1.451,1.45,3.313,2.42,5.335,2.776L8.785,16.894z"; -} -.progress-indicator:indeterminate .segment6 { - -fx-shape:"M14.016,15.734C12.838,16.558,11.437,17,10,17v3c2.053,0,4.055-0.632,5.736-1.809L14.016,15.734z"; -} -.progress-indicator:indeterminate .segment7 { - -fx-shape:"M16.894,11.215c-0.249,1.415-0.929,2.719-1.944,3.734l2.122,2.122c1.45-1.451,2.421-3.314,2.776-5.335L16.894,11.215z"; -} - -/******************************************************************************* - * * - * TableView * - * * - ******************************************************************************/ - -.table-view { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0,1; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ - - /* Constants used throughout the tableview. - * TODO: Should these be derived from the palette in .scene? - */ - -fx-table-header-border-color: #959595; -/* -fx-table-header-background-color: linear (0%,0%) to (0%,100%) stops (80%, #bbbbbb) (10%, #f6f6f6);*/ - -fx-table-cell-border-color: #bbbbbb; -} - -/** Draws focus border around tableview */ -.table-view:focused, -.tree-table-view:focused { - -fx-background-color: -fx-focus-color,-fx-box-border,-fx-control-inner-background; - -fx-background-insets: -1.4, 0, 1; - -fx-background-radius: 1.4, 0, 0; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ -} - -.table-view:disabled, -.tree-table-view:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.table-view > .virtual-flow > .scroll-bar:vertical, -.tree-table-view > .virtual-flow > .scroll-bar:vertical { - -fx-background-insets: 0, 0 0 0 1; - -fx-padding: -1 -1 -1 0; -} - -.table-view > .virtual-flow > .scroll-bar:horizontal, -.tree-table-view > .virtual-flow > .scroll-bar:horizontal { - -fx-background-insets: 0, 1 0 0 0; - -fx-padding: 0 -1 -1 -1; -} - -.table-view > .virtual-flow > .corner, -.tree-table-view > .virtual-flow > .corner { - -fx-background-color: -fx-box-border, -fx-base; - -fx-background-insets: 0, 1 0 0 1; -} - -/* Each row in the table is a table-row-cell. Inside a table-row-cell is any - number of table-cell. */ -.table-row-cell { - -fx-background-color: -fx-table-cell-border-color, -fx-control-inner-background; - -fx-background-insets: 0, 0 0 1 0; - -fx-padding: 0.0em; /* 0 */ - -fx-text-fill: -fx-text-inner-color; -} - -.table-row-cell:odd { - -fx-background-color: -fx-table-cell-border-color, derive(-fx-control-inner-background,-5%); - -fx-background-insets: 0, 0 0 1 0; -} - -.table-row-cell:focused, -.tree-table-row-cell:focused { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background; - -fx-background-insets: 0, 1, 2; -} - -.table-row-cell:focused:odd { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, derive(-fx-control-inner-background,-5%); - -fx-background-insets: 0, 1, 2; -} - -/* When the table-row-cell is selected and focused */ -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:focused:selected, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:selected { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-background: -fx-accent; - -fx-text-fill: -fx-selection-bar-text; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected > .table-cell, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:selected > .tree-table-cell { - -fx-text-fill: -fx-selection-bar-text; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:selected { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.table-view:row-selection:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:focused:selected:hover, -.tree-table-view:row-selection:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:selected:hover{ - -fx-background: -fx-accent; - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0, 1, 2; - -fx-text-fill: -fx-selection-bar-text; -} - -/* When the TableView is _not_ focused, we show alternate selection colors */ -.table-row-cell:filled:selected:focused, -.table-row-cell:filled:selected, -.tree-table-row-cell:filled:selected:focused, -.tree-table-row-cell:filled:selected { - -fx-background-color: lightgray; - -fx-text-fill: -fx-selection-bar-text; -} - -.table-row-cell:selected:disabled, -.tree-table-row-cell:selected:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:hover { - -fx-background-color: -fx-table-cell-border-color, -fx-cell-hover-color; - -fx-background-insets: 0, 0 0 1 0; - -fx-text-fill: -fx-text-inner-color; -} - -.tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:hover { - /* No 1-pixel bottom border for the TreeTableView (unlike the TableView above) */ - -fx-background-color: -fx-cell-hover-color; - -fx-background-insets: 0; - -fx-text-fill: -fx-text-inner-color; -} - -.table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:focused:hover, -.tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:hover { - -fx-background-color: -fx-table-cell-border-color, -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0, 0 0 1 0, 1 1 2 1, 2 2 3 2, 3 3 4 3; - -fx-text-fill: -fx-text-inner-color; -} - -.table-cell { - -fx-padding: 0.166667em; /* 2px, plus border adds 1px */ - - -fx-background-color: transparent; - -fx-border-color: transparent -fx-table-cell-border-color transparent transparent; - -fx-border-width: 0.083333em; /* 1 */ - -fx-cell-size: 2.0em; /* 24 */ - -fx-text-fill: -fx-text-inner-color; -} - -/* When in constrained resize mode, the right-most visible cell should not have - a right-border, as it is not possible to get this cleanly out of view without - introducing horizontal scrollbars (see RT-14886). */ -.table-view:constrained-resize > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:last-visible, -.tree-table-view:constrained-resize > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:last-visible { - -fx-border-color: transparent; -} -.table-view:constrained-resize > .column-header:last-visible, -.tree-table-view:constrained-resize > .column-header:last-visible { - -fx-border-width: 0.083333em 0.0em 0.083333em 0.083333em, 0.083333em 0.0em 0.083333em 0.083333em; -} -.table-view:constrained-resize .filler, -.tree-table-view:constrained-resize .filler { - -fx-border-color: - derive(-fx-base, 80%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%) - derive(-fx-base, 10%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%), - /* Outer border: */ - transparent -fx-table-header-border-color -fx-table-header-border-color -fx-table-header-border-color; - -fx-border-insets: 0 1 1 1, 0 0 0 0; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:focused, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:focused { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled .table-cell:focused:selected, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled .tree-table-cell:focused:selected { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; - -fx-background: -fx-accent; - -fx-text-fill: -fx-selection-bar-text; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:selected, -.table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:hover:selected, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:selected, -.tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:hover:selected { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; - -fx-background-insets: 0 0 1 0; -} - -.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:selected:hover, -.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:focused:selected:hover{ - -fx-background: -fx-accent; - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; - -fx-text-fill: -fx-selection-bar-text; -} - -/* When the TableView is _not_ focused, we show alternate selection colors */ - .table-row-cell:filled > .table-cell:selected:focused, - .table-row-cell:filled > .table-cell:selected, - .tree-table-row-cell:filled > .tree-table-cell:selected:focused, - .tree-table-row-cell:filled > .tree-table-cell:selected { - -fx-background-color: lightgray; - -fx-text-fill: -fx-selection-bar-text; -} - -.table-cell:selected:disabled, -.tree-table-cell:selected:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -/*.table-cell:focused { - -fx-background-color: -fx-focus-color, -fx-control-inner-background; - -fx-background-insets: 0, 1.4; -}*/ - -.table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:hover, -.tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:hover { - -fx-background-color: -fx-cell-hover-color; - -fx-text-fill: -fx-text-inner-color; - -fx-background-insets: 0 0 1 0; -} - -.table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:hover, -.tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:focused:hover { - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; - -fx-text-fill: -fx-text-inner-color; -} - -/* The column-resize-line is shown when the user is attempting to resize a column. */ -.table-view .column-resize-line, -.tree-table-view .column-resize-line { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-padding: 0.0em 0.0416667em 0.0em 0.0416667em; /* 0 0.571429 0 0.571429 */ -} - -/* This is the area behind the column headers. An ideal place to specify background - and border colors for the whole area (not individual column-header's). */ -.table-view .column-header-background, -.tree-table-view .column-header-background { - -fx-background-color: -fx-body-color; - -fx-padding: 0; -} - -/* The column header row is made up of a number of column-header, one for each - TableColumn, and a 'filler' area that extends from the right-most column - to the edge of the tableview, or up to the 'column control' button. */ -.table-view .column-header, -.tree-table-view .column-header { - -fx-text-fill: -fx-selection-bar-text; - - /* TODO: for some reason, this doesn't scale. */ - -fx-font-size: 1.083333em; /* 13pt - 1 more than the default font */ - -fx-size: 25; - -fx-border-style: solid; - -fx-border-color: - /* - Inner border: we have different colours along the top, right, bottom and left. - Refer to RT-12298 for the spec. - */ - derive(-fx-base, 80%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%) - derive(-fx-base, 10%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%), - /* Outer border: */ - transparent -fx-table-header-border-color -fx-table-header-border-color transparent; - -fx-border-insets: 0 1 1 0, 0 0 0 0; - -fx-border-width: 0.083333em, 0.083333em; -} - -.table-view .filler, -.tree-table-view .filler { - -fx-size: 25; - -fx-border-style: solid; - -fx-border-color: - /* - Inner border: we have different colours along the top, right, bottom and left. - Refer to RT-12298 for the spec. - */ - derive(-fx-base, 80%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%) - derive(-fx-base, 10%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%), - /* Outer border: */ - transparent transparent -fx-table-header-border-color transparent; - -fx-border-insets: 0 0 1 0, 0 0 0 0; - -fx-border-width: 0.083333em, 0.083333em 0 0.083333em 0.083333em; -} - -.table-view .column-header .sort-order-dots-container, -.tree-table-view .column-header .sort-order-dots-container{ - -fx-padding: 2 0 2 0; -} - -.table-view .column-header .sort-order, -.tree-table-view .column-header .sort-order{ - -fx-font-size: 0.916667em; /* 11pt - 1 less than the default font */ -} - -.table-view .column-header .sort-order-dot, -.tree-table-view .column-header .sort-order-dot { - -fx-background-color: derive(-fx-mark-highlight-color, 40%), -fx-mark-color; - -fx-padding: 0.0625em 0.104em 0.0625em 0.104em; -} - -.table-view .column-header .sort-order-dot.ascending, -.tree-table-view .column-header .sort-order-dot.ascending { - -fx-background-insets: -1 0 1 0, 0; -} - -.table-view .column-header .sort-order-dot.descending, -.tree-table-view .column-header .sort-order-dot.descending { - -fx-background-insets: 1 0 -1 0, 0; -} - -.table-view .column-header .label, -.tree-table-view .column-header .label { - -fx-alignment: center; -} - -.table-view > .column-header-background > .show-hide-columns-button, -.tree-table-view > .column-header-background > .show-hide-columns-button{ - -fx-background-color: -fx-body-color; - - -fx-border-color: - /* inner border: A copy of the inner border used above in the general column header area. */ - derive(-fx-base, 80%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%), - derive(-fx-base, 10%) - linear-gradient(to bottom, derive(-fx-base,80%) 20%, derive(-fx-base,-10%) 90%), - /* outer border: Slightly different to the above*/ - transparent transparent -fx-table-header-border-color -fx-table-header-border-color; - -fx-border-insets: 0 0 0 1, 0 0 0 0; -} - -.table-view .show-hide-column-image, -.tree-table-view .show-hide-column-image { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - - -fx-padding: 0.25em; /* 3px */ - -fx-shape: "M398.902,298.045c0.667,0,1.333,0,2,0c0,0.667,0,1.333,0,2c0.667,0,1.333,0,2,0c0,0.667,0,1.333,0,2c-0.667,0-1.333,0-2,0c0,0.666,0,1.332,0,1.999c-0.667,0-1.333,0-2,0c0-0.667,0-1.333,0-1.999c-0.666,0-1.333,0-1.999,0c0-0.667,0-1.334,0-2c0.666,0,1.333,0,1.999,0C398.902,299.378,398.902,298.711,398.902,298.045z"; -} - -/*.nested-column-header .column-header { - -fx-background-color: transparent; -}*/ - -/* When a column is being 'dragged' to be placed in a different position, there - is a region that follows along the column header area to indicate where the - column will be dropped. This region can be styled using the .column-drag-header - name. */ -.table-view .column-drag-header, -.tree-table-view .column-drag-header { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-border-color: transparent; - -fx-opacity: 0.6; -} - -/* Semi-transparent overlay to indicate the column that is currently being moved */ -.table-view .column-overlay, -.tree-table-view .column-overlay { - -fx-background-color: darkgray; - -fx-opacity: 0.3; -} - -.table-view /*> column-header-background > nested-column-header >*/ .arrow, -.tree-table-view /*> column-header-background > nested-column-header >*/ .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.25em 0.3125em 0.25em 0.3125em; /* 3 3.75 3 3.75 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -/* This is shown when the table has no rows and/or no columns. */ -.table-view .empty-table, -.tree-table-view .empty-table { - -fx-background-color: white; - -fx-font-size: 1.166667em; /* 14pt - 2 more than the default font */ -} - -/******************************************************************************* - * * - * TitledPane * - * * - ******************************************************************************/ - -.titled-pane { - -fx-text-fill: -fx-text-base-color; -} - -.titled-pane:focused { - -fx-text-fill: white; -} - -.titled-pane > .title { - -fx-background-color: -fx-box-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */ -} - -.titled-pane:focused > .title { - -fx-color: -fx-focus-color; -} - -.titled-pane > .title > .arrow-button { - -fx-background-color: null; - -fx-background-insets: 0; - -fx-background-radius: 0; - -fx-padding: 0.0em 0.25em 0.0em 0.0em; /* 0 3 0 0 */ -} - -.titled-pane > .title > .arrow-button > .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.25em 0.3125em 0.25em 0.3125em; /* 3 3.75 3 3.75 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -.titled-pane > *.content { - -fx-background-color: - -fx-box-border, - linear-gradient(to bottom, derive(-fx-color,-02%), derive(-fx-color,65%) 12%, derive(-fx-color,23%) 88%, derive(-fx-color,50%) 99%, -fx-box-border); - -fx-background-insets: 0, 0 1 1 1; - -fx-padding: 0.167em; -} - -.titled-pane:focused > .title > .arrow-button > .arrow { - -fx-background-color: white; -} - - -/******************************************************************************* - * * - * Accordion * - * * - ******************************************************************************/ - -.accordion > .titled-pane > .title { - -fx-background-color: - -fx-box-border, - -fx-inner-border, - -fx-body-color; - -fx-background-insets: -1 0 0 0, 0 1 1 1, 1 2 2 2; - -fx-background-radius: 0, 0, 0; -} - -.accordion > .first-titled-pane > .title { - -fx-background-insets: 0, 1, 2; -} - -.accordion > .titled-pane:focused > .title { - -fx-color: -fx-focus-color; -} - -.accordion > .titled-pane:focused { - -fx-text-fill: white; -} - -.accordion > .titled-pane:focused > .title > .arrow-button > .arrow { - -fx-background-color: white; -} - -.accordion > .titled-pane:focused > .titled-pane:collapsed > .title > .arrow-button > .arrow { - -fx-background-color: white; -} - -.accordion > .titled-pane:collapsed:focused > .title { - -fx-color: -fx-focus-color; -} - -.accordion > .titled-pane:expanded:focused > .title { - -fx-color: -fx-focus-color; -} - -.accordion > .titled-pane:hover > .title { - -fx-color: -fx-hover-base; -} - -/******************************************************************************* - * * - * SplitPane * - * * - ******************************************************************************/ - -.tab-pane > * > .tab-pane, -.tab-pane > * > .table-view, -.tab-pane > * > .list-view, -.tab-pane > * > .tree-view, -.tab-pane > * > .scroll-pane, -.tab-pane > * > .split-pane, -.split-pane > * > .tab-pane, -.split-pane > * > .table-view, -.split-pane > * > .list-view, -.split-pane > * > .tree-view, -.split-pane > * > .scroll-pane, -.split-pane > * > .split-pane { - -fx-background-insets: 0, 0; - -fx-padding: 0; - } - -.split-pane { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1; - -fx-padding: 1; -} - -.split-pane > .split-pane-divider { - -fx-padding: 0 2 0 2; /* 0 3 0 3 */ -} - -/* horizontal the two nodes are placed to the left/right of each other. */ -.split-pane:horizontal > .split-pane-divider { - -fx-border-color: transparent -fx-box-border transparent #BBBBBB; - -fx-background-color: transparent, -fx-inner-border-horizontal; - -fx-background-insets: 0, 0 1 0 1; -} - -/* vertical the two nodes are placed on top of each other. */ -.split-pane:vertical > .split-pane-divider { - -fx-border-color: #BBBBBB transparent -fx-box-border transparent; - -fx-background-color: transparent, -fx-inner-border; - -fx-background-insets: 0, 1 0 1 0; -} - -.split-pane > .split-pane-divider > .horizontal-grabber { - -fx-padding: 5 1 5 1; - -fx-background-color: #FFFFFF, -fx-box-border; - -fx-background-insets: 1 0 -1 0, 0; - -fx-shape: "M0 0 L0 0 L2 0 L2 2 L0 2 Z M0 4 L0 4 L2 4 L2 6 L0 6 Z M0 8 L0 8 L2 8 L2 10 L0 10 Z"; -} - -.split-pane > .split-pane-divider > .vertical-grabber { - -fx-padding: 1 5 1 5; - -fx-background-color: #FFFFFF, -fx-box-border; - -fx-background-insets: 1 0 -1 0, 0; - -fx-shape: "M0 0 L0 0 L2 0 L2 2 L0 2 Z M4 0 L4 0 L4 2 L6 2 L6 0 Z M8 0 L8 0 L8 2 L10 2 L10 0 Z"; -} - -/******************************************************************************* - * * - * TabPane * - * * - ******************************************************************************/ - -.tab-pane { - /* -fx-tab-min-width: 4.583em; 55 */ - /* -fx-tab-max-width: 4.583em; 55 */ - -fx-tab-min-height: 1.75em; /* 21 */ - -fx-tab-max-height: 1.75em; /* 21 */ -} - -.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-label { - -fx-background-color: transparent; - -fx-alignment: CENTER; - -fx-text-fill: -fx-text-base-color; -} -/* -.tab *.tab-label Text { - -fx-effect: dropshadow(two-pass-box , rgba(255, 255, 255, 0.4), 1, 0.0 , 0, 1); -}*/ - -.tab-pane > .tab-content-area { - -fx-background-color: -fx-control-inner-background; - -fx-padding: 0.0em; /* 0 */ - /* -fx-opacity: -fx-disabled-opacity;*/ -} - -.tab-pane > .tab-header-area > .headers-region > .tab { - /* This is how it is done in Button, but the -1 inset caused a white line */ - /* to appear beneath the tab, which looks bad, so it's taken out below. */ -/* -fx-background-color: -fx-shadow-highlight-color, -fx-tab-border-color, -fx-inner-border, -fx-body-color; - -fx-background-radius: 5 5 0 0, 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-background-insets: 0 0 -1 0, 0, 1, 2;*/ - /*-fx-background-insets: 0, 1, 2;*/ - -fx-background-insets: 0 1 1 0, 1 2 1 1, 2 3 1 2; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-padding: 0.083333em 0.5em 0.083333em 0.5em; /* 1 6 1 6 */ -/* -fx-text-fill: -fx-text-base-color;*/ -} - -.tab-pane > .tab-header-area > .headers-region > .tab:top { - -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:right { - -fx-background-color: -fx-tab-border-color, -fx-inner-border-bottomup, -fx-body-color-bottomup; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:bottom { - -fx-background-color: -fx-tab-border-color, -fx-inner-border-bottomup, -fx-body-color-bottomup; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:left { - -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:hover { - -fx-color: -fx-hover-base; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:selected { -/* -fx-background-color: white;*/ - -/* -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-background-insets: 0, 1 1 0 1, 2 2 0 2;*/ - -fx-background-color: -fx-tab-border-color, -fx-control-inner-background; - -fx-background-insets: 0 1 0 0, 1 2 0 1; - -fx-background-radius: 5 5 0 0, 4 4 0 0; -} - -.tab-pane:focused > .tab-header-area > .headers-region > .tab:selected .focus-indicator { - -fx-border-style: segments(0.166667em, 0.166667em); - -fx-border-width: 1; - -fx-border-color: -fx-focus-color; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:disabled { - -fx-opacity: -fx-disabled-opacity; -} - -.tab-pane > .tab-header-area > .headers-region > .tab:disabled:hover { - -fx-color: -fx-base; - -fx-opacity: -fx-disabled-opacity; -} - -.tab-pane > .tab-header-area > .tab-header-background { - -fx-background-color: -fx-outer-border, -fx-inner-border, derive(-fx-color, -20%); - -fx-effect: innershadow(two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 0); -} - -/*.tab-pane *.tab-header-area {*/ - /* I would like to use -fx-tab-border-color here, but for some reason it */ - /* just isn't the correct color, even though it works in :top above */ -/* -fx-background-color: -fx-tab-border-color, lightgray;*/ -/*}*/ - -.tab-pane:top > .tab-header-area { - -fx-background-insets: 0, 0 0 1 0; - -fx-padding: 0.416667em 0.166667em 0.0em 0.833em; /* 5 2 0 10 */ -} - -.tab-pane:bottom > .tab-header-area { - -fx-background-insets: 0, 1 0 0 0; - -fx-padding: 0 0.166667em 0.416667em 0.833em; /* 0 2 5 0 */ -} - -.tab-pane:left > .tab-header-area { - -fx-background-insets: 0, 0 1 0 0; - -fx-padding: 0.833em 0.0em 0.166667em 0.416667em; /* 10 0 2 5 */ -} - -.tab-pane:right > .tab-header-area { - -fx-background-insets: 0, 0 0 0 1; - -fx-padding: 0.833em 0.416667em 0.166667em 0.0em; /* 10 5 2 0 */ -} - -/* TODO: scaling the shape seems to make it way too large */ -.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button { - -fx-background-color: -fx-mark-color; - -fx-shape: "M 0,0 H1 L 4,3 7,0 H8 V1 L 5,4 8,7 V8 H7 L 4,5 1,8 H0 V7 L 3,4 0,1 Z"; - -fx-scale-shape: false; - -fx-effect: dropshadow(two-pass-box , rgba(255, 255, 255, 0.4), 1, 0.0 , 0, 1); -} - -.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button:hover { - -fx-background-color: derive(-fx-mark-color, -30%); -} - -/* CONTROL BUTTONS */ -.tab-pane > .tab-header-area > .control-buttons-tab { - -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-padding: 0.083333em 0.25em 0.083333em 0.25em; /* 1 3 1 3 */ -} - -.tab-pane > .tab-header-area > .control-buttons-tab > .container > .tab-down-button { - -fx-background-color: transparent; - -fx-padding: 0.0em 0.416667em 0.0em 0.416667em; /* 0 5 0 5 */ -} - -.tab-pane > .tab-header-area > .control-buttons-tab > .container > .tab-down-button:hover { - -fx-background-color: -fx-body-color; - -fx-color: -fx-hover-base; -} - -.tab-pane > .tab-header-area > .control-buttons-tab > .container > .tab-down-button .arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.238083em 0.416667em 0.238083em 0.416667em; /* 2.857 5 2.857 5 */ - -fx-shape: "M 0 0 H 7 L 3.5 4 z"; -} - -/* FLOATING TABS CUSTOMISATION */ -.tab-pane.floating > .tab-header-area > .tab-header-background { - -fx-background-color: null; -} - -.tab-pane.floating > .tab-header-area { - -fx-background-color: null; -} - -.tab-pane.floating > .tab-content-area { - -fx-background-color: -fx-tab-border-color, -fx-control-inner-background; - -fx-background-insets: 0, 1; - -fx-background-radius: 5, 4; - -fx-padding: 2; -} - -.tab-pane.floating > .tab-header-area > .headers-region > .tab { - -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0 1 1 0, 1 2 1 1, 2 3 1 2; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; -} - -.tab-pane.floating > .tab-header-area > .headers-region > .tab:selected { - -fx-background-color: -fx-tab-border-color, -fx-control-inner-background; - -fx-background-insets: 0 1 -1 0, 1 2 -1 1; - -fx-background-radius: 5 5 0 0, 4 4 0 0; -} - -/*.tab-pane:floating *.control-buttons-tab { - -fx-padding: 0.083333em 0.25em 0.083333em 0.25em; - -fx-background-color: -fx-tab-border-color, -fx-inner-border, -fx-body-color; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; - -fx-background-insets: 0, 1 1 0 1, 2 2 0 2; -}*/ - - - - -/* ====== CHART TOP LEVEL ITEMS =========================================================== */ -.chart { - -fx-padding: 5px; -} -.chart-content { - -fx-padding: 10px; -} -.chart-title { - -fx-font-size: 1.4em; -} -.chart-legend { - -fx-background-color: ladder(-fx-background, derive(-fx-box-border, -10%) 50%, derive(-fx-box-border, 10%) 51%), - ladder(-fx-background, derive(-fx-control-inner-background, 5%) 50%, derive(-fx-control-inner-background, -5%) 51%); - -fx-background-insets: 0,1; - -fx-background-radius: 6,5; - -fx-padding: 6px; -} - -/* ====== AXIS ============================================================================ */ -.axis { - -fx-tick-label-font-size: 0.833333em; /* 10 pix */ - -fx-tick-label-fill: -fx-text-background-color; -} -.axis:top { - -fx-border-color: transparent transparent #666666 transparent; -} -.axis:right { - -fx-border-color: transparent transparent transparent #666666; -} -.axis:bottom { - -fx-border-color: #666666 transparent transparent transparent; -} -.axis:left { - -fx-border-color: transparent #666666 transparent transparent; -} -.axis-tick-mark { - -fx-fill: null; - -fx-stroke: #666666; -} -.axis-minor-tick-mark { - -fx-fill: null; - -fx-stroke: #AAAAAA; -} - -.axis .text { - -fx-font-smoothing-type: lcd; -} - -/* ====== CHART PLOT BACKGROUND =========================================================== */ -.chart-plot-background { - -fx-background-color: #f5f5f5; -} -.chart-vertical-grid-lines { - -fx-stroke: #dddddd; -} -.chart-horizontal-grid-lines { - -fx-stroke: #dddddd; -} -.chart-alternative-column-fill { - -fx-fill: #eeeeee; - -fx-stroke: transparent; - -fx-stroke-width: 0; -} -.chart-alternative-row-fill { - -fx-fill: #eeeeee; - -fx-stroke: transparent; - -fx-stroke-width: 0; -} -.chart-vertical-zero-line { - -fx-stroke: #999999; -} -.chart-horizontal-zero-line { - -fx-stroke: #999999; -} -/* ====== SCATTER CHART =========================================================== */ -.chart-symbol { /* solid circle */ - -fx-background-color: #f9d900; - -fx-background-radius: 5px; - -fx-padding: 5px; -} -.default-color1.chart-symbol { /* solid square */ - -fx-background-color: #a9e200; - -fx-background-radius: 0; -} -.default-color2.chart-symbol { /* solid diamond */ - -fx-background-color: #22bad9; - -fx-background-radius: 0; - -fx-padding: 7px 5px 7px 5px; - -fx-shape: "M5,0 L10,9 L5,18 L0,9 Z"; -} -.default-color3.chart-symbol { /* cross */ - -fx-background-color: #0181e2; - -fx-background-radius: 0; - -fx-background-insets: 0; - -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,10 L0,10 L0,8 L4,5 L0,2 L0,0 Z"; -} -.default-color4.chart-symbol { /* solid triangle */ - -fx-background-color: #2f357f; - -fx-background-radius: 0; - -fx-background-insets: 0; - -fx-shape: "M5,0 L10,8 L0,8 Z"; -} -.default-color5.chart-symbol { /* hollow circle */ - -fx-background-color: #860061, white; - -fx-background-insets: 0, 2; - -fx-background-radius: 5px; - -fx-padding: 5px; -} -.default-color6.chart-symbol { /* hollow square */ - -fx-background-color: #c62b00, white; - -fx-background-insets: 0, 2; - -fx-background-radius: 0; -} -.default-color7.chart-symbol { /* hollow diamond */ - -fx-background-color: #ff5700, white; - -fx-background-radius: 0; - -fx-background-insets: 0, 2.5; - -fx-padding: 7px 5px 7px 5px; - -fx-shape: "M5,0 L10,9 L5,18 L0,9 Z"; -} - -/* ====== LINE CHART =========================================================== */ -.chart-line-symbol { - -fx-background-color: #f9d900, white; - -fx-background-insets: 0, 2; - -fx-background-radius: 5px; - -fx-padding: 5px; -} -.chart-series-line { - -fx-stroke: #f9d900; - -fx-stroke-width: 4px; - -fx-effect: dropshadow( two-pass-box , rgba(0,0,0,0.3) , 8, 0.0 , 0 , 3 ); -} -.default-color0.chart-line-symbol { -fx-background-color: #f9d900, white; } -.default-color1.chart-line-symbol { -fx-background-color: #a9e200, white; } -.default-color2.chart-line-symbol { -fx-background-color: #22bad9, white; } -.default-color3.chart-line-symbol { -fx-background-color: #0181e2, white; } -.default-color4.chart-line-symbol { -fx-background-color: #2f357f, white; } -.default-color5.chart-line-symbol { -fx-background-color: #860061, white; } -.default-color6.chart-line-symbol { -fx-background-color: #c62b00, white; } -.default-color7.chart-line-symbol { -fx-background-color: #ff5700, white; } -.default-color0.chart-series-line { -fx-stroke: #f9d900; } -.default-color1.chart-series-line { -fx-stroke: #a9e200; } -.default-color2.chart-series-line { -fx-stroke: #22bad9; } -.default-color3.chart-series-line { -fx-stroke: #0181e2; } -.default-color4.chart-series-line { -fx-stroke: #2f357f; } -.default-color5.chart-series-line { -fx-stroke: #860061; } -.default-color6.chart-series-line { -fx-stroke: #c62b00; } -.default-color7.chart-series-line { -fx-stroke: #ff5700; } - -/* ====== AREA CHART =========================================================== */ -.chart-area-symbol { - -fx-background-color: #f9d900, white; - -fx-background-insets: 0, 1; - -fx-background-radius: 4px; /* makes sure this remains circular */ - -fx-padding: 3px; -} -.default-color0.chart-area-symbol { -fx-background-color: #f9d900, white; } -.default-color1.chart-area-symbol { -fx-background-color: #a9e200, white; } -.default-color2.chart-area-symbol { -fx-background-color: #22bad9, white; } -.default-color3.chart-area-symbol { -fx-background-color: #0181e2, white; } -.default-color4.chart-area-symbol { -fx-background-color: #2f357f, white; } -.default-color5.chart-area-symbol { -fx-background-color: #860061, white; } -.default-color6.chart-area-symbol { -fx-background-color: #c62b00, white; } -.default-color7.chart-area-symbol { -fx-background-color: #ff5700, white; } -.chart-series-area-line { - -fx-stroke: #f9d900; - -fx-stroke-width: 1px; -} -.default-color0.chart-series-area-line { -fx-stroke: #c2a902; } -.default-color1.chart-series-area-line { -fx-stroke: #88b501; } -.default-color2.chart-series-area-line { -fx-stroke: #22bad9; } -.default-color3.chart-series-area-line { -fx-stroke: #0181e2; } -.default-color4.chart-series-area-line { -fx-stroke: #2f357f; } -.default-color5.chart-series-area-line { -fx-stroke: #860061; } -.default-color6.chart-series-area-line { -fx-stroke: #c62b00; } -.default-color7.chart-series-area-line { -fx-stroke: #ff5700; } -.chart-series-area-fill { - -fx-stroke: null; - -fx-fill: #f9d90044; -} -.default-color0.chart-series-area-fill { -fx-fill: #f9d90044; } -.default-color1.chart-series-area-fill { -fx-fill: #a9e20044; } -.default-color2.chart-series-area-fill { -fx-fill: #22bad944; } -.default-color3.chart-series-area-fill { -fx-fill: #0181e244; } -.default-color4.chart-series-area-fill { -fx-fill: #2f357f44; } -.default-color5.chart-series-area-fill { -fx-fill: #86006144; } -.default-color6.chart-series-area-fill { -fx-fill: #c62b0044; } -.default-color7.chart-series-area-fill { -fx-fill: #ff570044; } -.area-legend-symbol { - -fx-padding: 6px; - -fx-background-radius: 6px; /* makes sure this remains circular */ - -fx-background-insets: 0, 3; -} -/* ====== BUBBLE CHART =========================================================== */ -.bubble-legend-symbol { - -fx-background-radius: 8px; - -fx-padding: 8px; -} -.chart-bubble { - -fx-bubble-fill: #f9d900; - -fx-background-color: radial-gradient(center 50% 50%, radius 80%, derive(-fx-bubble-fill,20%), derive(-fx-bubble-fill,-30%)); -} -.default-color0.chart-bubble { -fx-bubble-fill: #f9d900aa; } -.default-color1.chart-bubble { -fx-bubble-fill: #a9e200aa; } -.default-color2.chart-bubble { -fx-bubble-fill: #22bad9aa; } -.default-color3.chart-bubble { -fx-bubble-fill: #0181e2aa; } -.default-color4.chart-bubble { -fx-bubble-fill: #2f357faa; } -.default-color5.chart-bubble { -fx-bubble-fill: #860061aa; } -.default-color6.chart-bubble { -fx-bubble-fill: #c62b00aa; } -.default-color7.chart-bubble { -fx-bubble-fill: #ff5700aa; } - -/* ====== BAR CHART =========================================================== */ -/* TODO flip gradient vertical for negative bars */ -.chart-bar { - -fx-bar-fill: #22bad9; - -fx-background-color: linear-gradient(derive(-fx-bar-fill,-30%), derive(-fx-bar-fill,-40%)), - linear-gradient(derive(-fx-bar-fill,80%), derive(-fx-bar-fill, 0%)), - linear-gradient(derive(-fx-bar-fill,30%), derive(-fx-bar-fill,-10%)); - -fx-background-insets: 0,1,2; - -fx-background-radius: 5 5 0 0, 4 4 0 0, 3 3 0 0; -} - -.negative.chart-bar { - -fx-background-color: linear-gradient(to top, derive(-fx-bar-fill,-30%), derive(-fx-bar-fill,-40%)), - linear-gradient(to top, derive(-fx-bar-fill, 80%), derive(-fx-bar-fill,0%)), - linear-gradient(to top, derive(-fx-bar-fill,30%), derive(-fx-bar-fill,-10%)); - -fx-background-radius: 0 0 5 5, 0 0 4 4, 0 0 3 3; -} -.bar-chart:horizontal .chart-bar, .stacked-bar-chart:horizontal .chart-bar { - -fx-background-color: linear-gradient(to left, derive(-fx-bar-fill,-30%), derive(-fx-bar-fill,-40%)), - linear-gradient(to left, derive(-fx-bar-fill,80%), derive(-fx-bar-fill, 0%)), - linear-gradient(to left, derive(-fx-bar-fill,30%), derive(-fx-bar-fill,-10%)); - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; -} -.bar-chart:horizontal .negative.chart-bar, .stacked-bar-chart:horizontal .negative.chart-bar { - -fx-background-color: linear-gradient(to right, derive(-fx-bar-fill,-30%), derive(-fx-bar-fill,-40%)), - linear-gradient(to right, derive(-fx-bar-fill, 80%), derive(-fx-bar-fill, 0%)), - linear-gradient(to right, derive(-fx-bar-fill,30%), derive(-fx-bar-fill,-10%)); - -fx-background-radius: 5 0 0 5, 4 0 0 4, 3 0 0 3; -} -.default-color0.chart-bar { -fx-bar-fill: #f9d900; } -.default-color1.chart-bar { -fx-bar-fill: #a9e200; } -.default-color2.chart-bar { -fx-bar-fill: #22bad9; } -.default-color3.chart-bar { -fx-bar-fill: #0181e2; } -.default-color4.chart-bar { -fx-bar-fill: #2f357f; } -.default-color5.chart-bar { -fx-bar-fill: #860061; } -.default-color6.chart-bar { -fx-bar-fill: #c62b00; } -.default-color7.chart-bar { -fx-bar-fill: #ff5700; } -.bar-legend-symbol { - -fx-padding: 8px; -} -/* ====== PIE CHART ============================================================== */ -.chart-pie { - -fx-pie-color: #2f357f; - -fx-background-color: radial-gradient(radius 100%, derive(-fx-pie-color,55%), derive(-fx-pie-color,-20%)); - -fx-background-insets: 0; - -fx-border-color: derive(-fx-pie-color,-30%); -} -.chart-pie-label { - -fx-padding: 3px; - -fx-fill: -fx-text-base-color; -} -.chart-pie-label-line { - -fx-stroke: #aaaaaa; - -fx-fill: #aaaaaa; -} -.default-color0.chart-pie { -fx-pie-color: #f9d900; } -.default-color1.chart-pie { -fx-pie-color: #a9e200; } -.default-color2.chart-pie { -fx-pie-color: #22bad9; } -.default-color3.chart-pie { -fx-pie-color: #0181e2; } -.default-color4.chart-pie { -fx-pie-color: #2f357f; } -.default-color5.chart-pie { -fx-pie-color: #860061; } -.default-color6.chart-pie { -fx-pie-color: #c62b00; } -.default-color7.chart-pie { -fx-pie-color: #ff5700; } -.negative.chart-pie { - -fx-pie-color: transparent; - -fx-background-color: white; -} -.pie-legend-symbol.chart-pie { - -fx-background-radius: 8px; - -fx-padding: 8px; - -fx-border-color: null; -} - -/* -------------- CODE FOR THE NON-EDITABLE COMBO-BOX -------------- */ - -/* ------- MAIN BUTTON ------- */ -.combo-box-base { - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-radius: 5, 5, 4, 3; - -fx-background-insets: 0 0 -1 0, 0, 1, 2; - -fx-padding: 0; -} - -.combo-box-base:hover { - -fx-color: -fx-hover-base; -} - -/*------- THIS SPECIFIES THE BUTTON COLOR WHEN THE POPUP MENU IS SHOWING -------*/ -.combo-box-base:showing { - -fx-color: -fx-pressed-base; -} - -.combo-box-base:focused { - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-radius: 6.4, 4, 5, 3; - -fx-background-insets: -1.4, 0, 1, 2; -} - -.combo-box-base:disabled { - -fx-opacity: .4; -} - -/* ------- OPEN BUTTON ------- */ -.combo-box-base > .arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; - -fx-padding: 0 0.667em 0 0.667em; /* 6 8 6 8 */ - /*-fx-padding: 0; *//* 6 8 6 8 */ -} - -.combo-box-base:hover > .arrow-button, -.date-picker:hover > .arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; -} - -.combo-box-base:showing > .arrow-button, -.date-picker:showing > .arrow-button { - -fx-color: -fx-pressed-base; -} - -/* ------- ARROW* ------- */ -.combo-box-base > .arrow-button > .arrow, -.web-view .form-select-button .arrow { - -fx-background-insets: 1 0 -1 0, 0; - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-padding: 0.166667em 0.333333em 0.166667em 0.333333em; /* 2 4 2 4 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -.web-view .form-select-button { - -fx-background-radius: 2, 2, 1, 0; - -fx-background-insets: 2 2 1 2, 2, 3, 4; -} - -/* ------- POPUP MENU ------- */ -/* --- .combo-box .popup-menu, .combo-box .menu-item, .combo-box .popup-menu .menu-item-radio -all inherit from Menu Control's popup-menu. --- */ - - -/* -------------- CODE FOR THE EDITABLE COMBO-BOX -------------- */ - -/* ------- TEXTBOX SEGMENT OF COMBO BOX ------- */ -/*--- The editable ComboBox TextBox inherits its properties from the TextBox Control. -Only the properties with values that are different from the TextBox are specified here. ---*/ - -.combo-box-base:editable > .text-field, -.date-picker > .text-field { - -fx-padding: 0.166667em 0.416667em 0.25em 0.416667em; /* 2 5 3 5 */ - /*-fx-padding: 0px;*/ - /*-fx-background-color: yellow;*/ - -fx-background-radius: 4 0 0 4, 3 0 0 3, 2 0 0 2; - -fx-background-insets: 0 0 -1 0, 0, 1 0 1 1; -} - -.combo-box-base:editable:focused, -.date-picker:focused { - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-control-inner-background; - -fx-background-radius: 5.4, 3, 2; - -fx-background-insets: -1.4, 0, 1; -} - -/* -------------- STYLES FOR THE DEFAULT LISTVIEW-BASED COMBOBOX ------------- */ - -/* Customise the ListCell that appears in the ComboBox button itself */ -.combo-box > .list-cell { - -fx-background: transparent; - -fx-background-color: transparent; - -fx-text-fill: -fx-text-base-color; - -fx-padding: 0.25em 0 0.166667em 0.583333em; /* 3 0 2 7 */ - -fx-cell-size: 1.7500em; /* 21 */ -} - -.combo-box-popup > .list-view { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1; - -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 ); -} - -.combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell { - -fx-padding: 4 0 4 5; - - /* No alternate highlighting */ - -fx-background-color: -fx-control-inner-background; -} - -.combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, -.combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover { - -fx-background: -fx-accent; - -fx-background-color: -fx-selection-bar; - -fx-text-fill: -fx-selection-bar-text; -} - -.combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:hover { - -fx-background-color: -fx-cell-hover-color; - -fx-text-fill: -fx-text-inner-color; -} - -.combo-box-popup > .list-view > .placeholder > .label { - -fx-text-fill: derive(-fx-control-inner-background,-30%); -} - -/* -------------------------- STYLES FOR THE COLOR-PICKER CONTROL ----- */ - -.color-picker { - -fx-color-rect-width: 0.916667em; /* 11px */ - -fx-color-rect-height: 0.916667em; /* 11px */ -} -.color-picker > .arrow-button { - -fx-background-color: null; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; -} - -.combo-box-base.color-picker.split-button > .arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 5 5 0, 0 4 4 0, 0 3 3 0; - -fx-padding: 0.5em 0.416667em 0.5em 0.416667em; /* 6 5 6 5 */ -} - -.color-picker:hover { - -fx-color: -fx-base; -} - -/** Fix for RT-35422 where border was being shown incorrectly on non-split-buttons */ -.combo-box-base.color-picker:hover > .arrow-button { - -fx-background-insets: 0, 1 1 1 0, 2 2 2 0; -} - -.color-picker.button { - -fx-padding: 0 5 0 0; -} - -.color-picker.button > .arrow-button { - -fx-background-color: -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1; - -fx-background-radius: 0 5 5 0, 0 4 4 0; -} - -.color-picker > .split-button > .arrow-button:hover { - -fx-color: -fx-hover-base; -} - -.color-picker > .split-button > .color-picker-label:hover { - -fx-color: -fx-hover-base; -} - -.color-picker > .color-picker-label > .picker-color { - -fx-padding: 0.416667em 0.333333em 0.416667em 0.333333em; /* 5 4 5 4 */ - -fx-background-color: null; -} - -.color-picker > .color-picker-label > .picker-color > .picker-color-rect { - -fx-stroke: -fx-pressed-base; - -fx-stroke-type: inside; -} - -.color-palette { - -fx-spacing: 15px; - -fx-background-color: - derive(-fx-color,-40%), - derive(-fx-color,100%), - linear-gradient(to bottom, - derive(-fx-color,100%) 0%, - derive(-fx-color,50%) 12%, - derive(-fx-color,65%) 88%, - derive(-fx-color,23%) 100%); - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 6 6 6, 0 5 5 5, 0 4 4 4; - -fx-padding: 15 15 15 15; - -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 ); -} - -.color-palette > .color-picker-grid > .color-square > .color-rect { - -fx-stroke: black; - -fx-stroke-width: 0.4; - -fx-border-color: black; -} - -.color-palette > .color-picker-grid { - -fx-border-color: transparent; -} - -.color-palette > .color-picker-grid > .color-square { - -fx-background-color: transparent; - -fx-background-insets: -1, 0; - -fx-padding: 0.5; - -fx-border: black; -} - -/* the color over which the user is hovering */ -.color-palette-region > .color-square.hover-square { - -fx-background-color: black; - -fx-background-insets: -1; - -fx-padding: 1; -} - -.color-palette > .separator > .line { - -fx-border-color: -fx-text-box-border transparent transparent transparent, - -fx-shadow-highlight-color transparent transparent transparent; - -fx-border-insets: 0, 1 0 0 0; - -fx-border-style: none; - -fx-padding: 0; -} - - -/* ------- CUSTOM COLOR DIALOG ------- */ -.custom-color-dialog > .color-rect-pane { - -fx-spacing: 0.75em; - -fx-pref-height: 16.666667em; - -fx-alignment: top-left; - -fx-fill-height: true; -} - -.custom-color-dialog .color-rect-pane .color-rect { - -fx-min-width: 16.666667em; - -fx-min-height: 16.666667em; -} - -.custom-color-dialog .color-rect-pane .color-rect-border { - -fx-border-color: derive(-fx-base, -20%); -} - -.custom-color-dialog > .color-rect-pane #color-rect-indicator { - -fx-background-color: null; - -fx-border-color: white; - -fx-border-radius: 0.4166667em; - -fx-translate-x: -0.4166667em; - -fx-translate-y: -0.4166667em; - -fx-pref-width: 0.833333em; - -fx-pref-height: 0.833333em; - -fx-effect: dropshadow(three-pass-box, black, 2, 0.0, 0, 1); -} - -.custom-color-dialog > .color-rect-pane > .color-bar { - -fx-min-width: 1.666667em; - -fx-min-height: 16.666667em; - -fx-max-width: 1.666667em; - -fx-border-color: derive(-fx-base, -20%); -} - -.custom-color-dialog > .color-rect-pane > .color-bar > #color-bar-indicator { - -fx-border-radius: 0.333333em; - -fx-border-color: white; - -fx-effect: dropshadow(three-pass-box, black, 2, 0.0, 0, 1); - -fx-pref-width: 2em; - -fx-pref-height: 0.833333em; - -fx-translate-x: -0.1666667em; - -fx-translate-y: -0.4166667em; -} - -.custom-color-dialog { - -fx-background-color: -fx-background; - -fx-padding: 1.25em; - -fx-spacing: 1.25em; -} - -/* The fix for RT-37494 forces the web color text's major direction to - * LTR. The following keeps the text right-aligned when in RTL mode. */ -.custom-color-dialog .webcolor-field:dir(rtl) > .text-field:dir(ltr) { - -fx-alignment: baseline-right; -} - - -/* -------- Toggle Button ---------------- */ -.custom-color-dialog .controls-pane .toggle-button { - -fx-background-radius: 0.333333em, 0.333333em, 0.25em, 0.1666667em; - -fx-padding: 0.25em 0.5em 0.25em 0.5em; -} - -.custom-color-dialog .controls-pane .toggle-button:focused { - -fx-background-color: - rgba(23,134,248,0.2), - -fx-focus-color, - -fx-inner-border, - -fx-body-color; -} -.custom-color-dialog .controls-pane .toggle-button:selected Text { - -fx-effect: dropshadow( one-pass-box , rgba(0,0,0,0.9) , 2, 0.0 , 0 , 1 ); -} - -.custom-color-dialog .controls-pane .toggle-button:selected { - -fx-background-color: - -fx-shadow-highlight-color, - linear-gradient( to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100% ), - linear-gradient( to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100% ), - linear-gradient( to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100% ); - -fx-background-insets: 0 0 -0.083333em 0, 0, 0.083333em, 0.083333em; - /* TODO: -fx-text-fill should be derived */ - -fx-text-fill: -fx-light-text-color; -} -.custom-color-dialog .controls-pane .left-pill { - -fx-background-radius: 0.25em 0 0 0.25em; - -fx-background-insets: 0 0 -0.083333em 0, 0, 0.083333em 0 0.083333em 0.083333em, 0.1666667em 0 0.1666667em 0.1666667em; - -fx-border-color: transparent -fx-outer-border transparent transparent; - -fx-border-insets: 0.333333em 0 0.333333em 0; - -fx-padding: -0.1666667em 0.666667em -0.1666667em 0.666667em; -} -.custom-color-dialog .controls-pane .left-pill:focused { - -fx-background-radius: 0.25em 0 0 0.25em; - -fx-background-insets: -0.11666667em 0 -0.11666667em -0.11666667em, 0 0 0 0, 0.083333em, 0.1666667em; - -fx-border-color: transparent; -} -.custom-color-dialog .controls-pane .left-pill:selected, .controls-pane .left-pill:selected:focused { - -fx-background-insets: 0 0 -0.083333em 0, 0, 0.083333em 0 0.083333em 0.083333em, 0.083333em 0 0.083333em 0.083333em; - -fx-border-color: transparent; -} -.custom-color-dialog .controls-pane .center-pill { - -fx-background-radius: 0; - -fx-background-insets: 0; - -fx-background-insets: 0 0 -0.083333em 0, 0, 0.083333em 0 0.083333em 0, 0.1666667em 0 0.1666667em 0; - -fx-border-color: transparent -fx-outer-border transparent transparent; - -fx-border-insets: 0.333333em 0 0.333333em 0; - -fx-padding: -0.1666667em 0.666667em -0.1666667em 0.666667em; -} -.custom-color-dialog .controls-pane .center-pill:focused { - -fx-background-radius: 0; - -fx-background-insets: -0.11666667em 0 -0.11666667em -0.083333em, 0 0 0 -0.083333em, 0.083333em 0.083333em 0.083333em 0, 0.1666667em 0.1666667em 0.1666667em 0.083333em; - -fx-border-color: transparent; -} -.custom-color-dialog .controls-pane .center-pill:selected, .controls-pane .center-pill:selected:focused { - -fx-background-insets: -0.11666667em 0 -0.11666667em -0.083333em, 0 0 0 -0.083333em, 0.083333em 0.083333em 0.083333em 0, 0.083333em 0.083333em 0.083333em 0; - -fx-border-color: transparent; -} - -.custom-color-dialog .controls-pane .right-pill { - -fx-background-radius: 0 0.25em 0.25em 0; - -fx-background-insets: 0 0 -0.083333em 0, 0, 0.083333em 0.083333em 0.083333em 0, 0.1666667em 0.1666667em 0.1666667em 0; - -fx-padding: 0.25em 0.666667em 0.25em 0.666667em; -} -.custom-color-dialog .controls-pane .right-pill:focused { - -fx-background-radius: 0 0.25em 0.25em 0; - -fx-background-insets: -0.11666667em -0.11666667em -0.11666667em -0.083333em, 0 0 0 -0.083333em, 0.083333em 0.083333em 0.083333em 0, 0.1666667em 0.1666667em 0.1666667em 0.083333em; -} -.custom-color-dialog .controls-pane .right-pill:selected, .controls-pane .right-pill:selected:focused { - -fx-background-insets: -0.11666667em -0.11666667em -0.11666667em -0.083333em, 0 0 0 -0.083333em, 0.083333em 0.083333em 0.083333em 0, 0.083333em 0.083333em 0.083333em 0; -} - -.custom-color-dialog .controls-pane .current-new-color-grid #current-new-color-border { - -fx-border-color: derive(-fx-base, -20%); - -fx-border-width: 2px; -} - -.custom-color-dialog .controls-pane .current-new-color-grid .color-rect { - -fx-min-width: 10.666667em; - -fx-min-height: 1.75em; - -fx-pref-width: 10.666667em; - -fx-pref-height: 1.75em; -} - -.custom-color-dialog .transparent-pattern { - -fx-background-image: url("pattern-transparent.png"); - -fx-background-repeat: repeat; - -fx-background-size: auto; -} - -.custom-color-dialog .controls-pane #spacer1 { - -fx-min-height: 0.1666667em; - -fx-max-height: 0.1666667em; - -fx-pref-height: 0.1666667em; -} - -.custom-color-dialog .controls-pane #spacer2 { - -fx-min-height: 1em; - -fx-max-height: 1em; - -fx-pref-height: 1em; -} - -.custom-color-dialog .controls-pane #settings-pane { - -fx-hgap: 0.4166667em; - -fx-vgap: 0.3333333em; -} - -.custom-color-dialog .controls-pane #settings-pane .settings-label { - -fx-min-width: 5.75em; -} - -.custom-color-dialog .controls-pane #settings-pane .settings-unit { - -fx-max-width: 1.5em; - -fx-min-width: 1.5em; - -fx-pref-width: 1.5em; -} - -.custom-color-dialog .controls-pane #settings-pane .slider { - -fx-pref-width: 8.25em; -} - -.custom-color-dialog .controls-pane .color-input-field { - -fx-pref-column-count: 3; - -fx-max-width: 3.25em; - -fx-min-width: 3.25em; - -fx-pref-width: 3.25em; -} - -.custom-color-dialog .controls-pane .web-field { - -fx-pref-column-count: 6; - -fx-pref-width: 8.25em; -} - -.custom-color-dialog .controls-pane #spacer-side { - -fx-min-width: 0.5em; - -fx-pref-width: 0.5em; -} - -.custom-color-dialog .controls-pane #spacer-bottom { - -fx-pref-height: 0.833333em; - -fx-min-height: 0.833333em; -} - -.custom-color-dialog .controls-pane .customcolor-controls-background { - -fx-background-color: -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: - 0.8333333em 0 0.4166667em 0, - 1em 0.166667em 0.5833333em 0.166667em; - -fx-background-radius: 0.3333333em, 0.166667em; -} - -.custom-color-dialog .controls-pane .current-new-color-grid .label { - -fx-padding: 0 0 0 0.4166667em; -} - -.custom-color-dialog .controls-pane #buttons-hbox { - -fx-spacing: 0.333333em; - -fx-padding: 1em 0 0 0; - -fx-alignment: bottom-right; -} - - - - -/******************************************************************************* - * * - * DatePicker * - * * - ******************************************************************************/ - -.date-picker > .arrow-button > .arrow { - -fx-shape: "M0,0v9h9V0H0z M2,8H1V7h1V8z M2,6H1V5h1V6z M2,4H1V3h1V4z M4,8H3V7h1V8z M4,6H3V5h1V6z M4,4H3V3h1V4z M6,8H5V7h1V8z M6,6H5 V5h1V6z M6,4H5V3h1V4z M8,8H7V7h1V8z M8,6H7V5h1V6z M8,4H7V3h1V4z"; - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.416667em 0.416667em 0.333333em 0.333333em; /*5 5 4 4 */ - -fx-scale-shape: true; -} - -.date-picker-popup { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 1; - /*-fx-background-radius: 0 6 6 6, 0 5 5 5;*/ - -fx-background-radius: 0; - -fx-padding: 0; - -fx-alignment: CENTER; /* VBox */ - -fx-spacing: 0; /* VBox */ - -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 ); -} -.date-picker-popup > .month-year-pane { - -fx-padding: 0.5em; /* 6 6 6 6 */ - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0; -} -.date-picker-popup > * > .spinner { - -fx-spacing: 0.25em; - -fx-alignment: CENTER; - -fx-fill-height: false; -} -.date-picker-popup > * > .spinner > .button { - -fx-background-color: transparent; - -fx-background-radius: 0; -} -.date-picker-popup > * > .spinner > .button:hover { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-radius: 3, 2, 1; -} -.date-picker-popup > * > .spinner > .button:focused { - -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-focus-color, -fx-body-color; - -fx-background-radius: 3, 2, 1; -} -.date-picker-popup > * > .spinner > .left-button { - -fx-padding: 0 0.333333em 0 0.25em; /* 0 4 0 3 */ -} -.date-picker-popup > * > .spinner > .right-button { - -fx-padding: 0 0.25em 0 0.333333em; /* 0 3 0 4 */ -} -.date-picker-popup > * > .spinner > .button > .right-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.5em 0.333333em 0 0; /* 6 4 0 0 */ - -fx-shape: "M 4 0 L 0 -3 L 0 3 z"; - -fx-scale-shape: true; -} -.date-picker-popup > * > .spinner > .button > .left-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.5em 0.333333em 0 0; /* 6 4 0 0 */ - -fx-shape: "M 0 0 L 4 -3 L 4 3 z"; - -fx-scale-shape: true; -} -.date-picker-popup > * > .spinner > .label { - -fx-alignment: CENTER; -} -.date-picker-popup > .month-year-pane > .secondary-label { - -fx-alignment: BASELINE_CENTER; - -fx-padding: 0.5em 0 0 0; /* 6 0 0 0 */ - -fx-text-fill: firebrick; -} -.date-picker-popup > .calendar-grid { - -fx-background-color: derive(-fx-base, 6.8%); - -fx-background-insets: 1; - -fx-padding: 1; -} -.date-picker-popup > * > .date-cell { - -fx-background-color: transparent; - -fx-background-insets: 1, 2; - -fx-padding: 0.166667em; - -fx-alignment: BASELINE_CENTER; - -fx-opacity: 1.0; -} -.date-cell:disabled > * { - -fx-opacity: -fx-disabled-opacity; -} -.date-picker-popup > * > .day-name-cell, -.date-picker-popup > * > .week-number-cell { - -fx-font-size: 0.916667em; -} -.date-picker-popup > * > .week-number-cell { - /* Add one pixel to the top padding to - * compensate for the smaller font size. */ - -fx-padding: 0.416667em 0.583333em 0.333333em 0.583333em; /* 5 7 4 7 */ - -fx-border-color: -fx-background; - -fx-border-width: 1px; - -fx-background: -fx-control-inner-background; - -fx-background-color: -fx-background; - -fx-text-fill: -fx-accent; -} -.date-picker-popup > * > .day-cell { - -fx-padding: 0.333333em 0.583333em 0.333333em 0.583333em; /* 4 7 4 7 */ - -fx-border-color: derive(-fx-control-inner-background,-10%); - -fx-border-width: 1px; - -fx-background: -fx-control-inner-background; - -fx-background-color: -fx-background; - -fx-text-fill: -fx-text-background-color; -} -.date-picker-popup > * > .hijrah-day-cell { - -fx-alignment: TOP_LEFT; - -fx-padding: 0.083333em 0.333333em 0.083333em 0.333333em; /* 1 4 1 4 */ - -fx-cell-size: 2.75em; -} -.date-picker-popup > * > .day-cell > .secondary-text { - -fx-fill: firebrick; -} -.date-picker-popup > * > .today { - -fx-background-color: -fx-control-inner-background, derive(-fx-base, -10%), -fx-control-inner-background; - -fx-background-insets: 1, 2, 3; -} -.date-picker-popup > * > .day-cell:hover, -.date-picker-popup > * > .selected, -.date-picker-popup > * > .previous-month.selected, -.date-picker-popup > * > .next-month.selected { - -fx-background-color: -fx-selection-bar; - -fx-background: -fx-accent; -} -.date-picker-popup > * > .today:hover, -.date-picker-popup > * > .today.selected { - -fx-background-color: -fx-selection-bar, derive(-fx-base, -10%),-fx-selection-bar; -} -.date-picker-popup > * > .day-cell:focused, -.date-picker-popup > * > .today:focused { - -fx-background-color: -fx-control-inner-background, -fx-cell-focus-inner-border, -fx-control-inner-background; - -fx-background-insets: 1, 2, 3; -} -.date-picker-popup > * > .day-cell:focused:hover, -.date-picker-popup > * > .today:focused:hover, -.date-picker-popup > * > .today.selected:focused, -.date-picker-popup > * > .selected:focused { - -fx-background-color: -fx-selection-bar, -fx-cell-focus-inner-border, -fx-selection-bar; -} -.date-picker-popup > * > .previous-month, -.date-picker-popup > * > .next-month { - -fx-background: derive(-fx-control-inner-background,-5%); -} -.date-picker-popup > * > .previous-month:hover, -.date-picker-popup > * > .next-month:hover { - -fx-background: lightgrey; - -fx-text-fill: -fx-dark-text-color; -} -.date-picker-popup > * > .day-cell:hover > .secondary-text, -.date-picker-popup > * > .previous-month > .secondary-text, -.date-picker-popup > * > .next-month > .secondary-text, -.date-picker-popup > * > .selected > .secondary-text { - -fx-fill: -fx-text-background-color; -} -.date-picker-popup > * > .previous-month.today, -.date-picker-popup > * > .next-month.today { - -fx-background-color: derive(-fx-control-inner-background,-5%), derive(-fx-base, -10%), derive(-fx-control-inner-background,-5%); -} -.date-picker-popup > * > .previous-month.today:hover, -.date-picker-popup > * > .next-month.today:hover { - -fx-background-color: lightgrey, derive(-fx-base, -10%), lightgrey; -} - - - -/* -------------------------- STYLES FOR PAGINATION CONTROL ----- */ -.pagination { - -fx-padding: 0; - -fx-arrows-visible: true; - -fx-tooltip-visible: true; - -fx-page-information-visible: true; - -fx-page-information-alignment: bottom; -} -.pagination > .page { - -fx-background-color: transparent; -} - -.pagination > .pagination-control { - -fx-background-color: transparent; - -fx-padding: 0.833333em 0em 0.833333em 0em; -} - -.pagination > .pagination-control > .control-box { - -fx-spacing: 4; - -fx-alignment: center; -} - -.pagination > .pagination-control > .control-box > .left-arrow-button{ - -fx-background-radius: 0; - -fx-padding: 0.166667em 0.416em 0.25em 0.333em; -} -.pagination > .pagination-control > .control-box > .right-arrow-button { - -fx-background-radius: 0; - -fx-padding: 0.166667em 0.333em 0.25em 0.416em; -} - -.pagination > .pagination-control .left-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.375em 0.291em 0.375em 0.291em; - -fx-shape: "M 0 0 L -13 7 L 0 13 z"; - -fx-scale-shape: true; -} - -.pagination > .pagination-control .right-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.375em 0.291em 0.375em 0.291em; - -fx-shape: "M 0 0 L 13 7 L 0 13 z"; - -fx-scale-shape: true; -} - -.pagination > .pagination-control > .control-box > .bullet-button { - -fx-background-radius: 0, 4em, 4em, 4em, 4em; - -fx-padding: 0.333em; - - -fx-background-color: transparent, -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 4 4 3 4, 5, 6, 7; -} - -.pagination > .pagination-control > .control-box > .bullet-button:selected { - -fx-base: -fx-accent; -} - -.pagination.bullet > .pagination-control > .control-box > .left-arrow-button, -.pagination.bullet > .pagination-control > .control-box > .right-arrow-button { - -fx-background-radius: 4em; -} - -.pagination > .pagination-control > .control-box > .number-button { - -fx-background-radius: 0; - -fx-padding: 0.166667em 0.25em 0.25em 0.333em; - -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; -} - -.pagination > .pagination-control > .control-box > .number-button:selected { - -fx-base: -fx-accent; -} -.pagination > .pagination-control > .page-information { - -fx-padding: 0.416em 0 0 0; -} - - -/******************************************************************************* - * * - * TreeTableView * - * Note: A lot of the CSS for TreeTableView is included with the TreeView and * - * TableView CSS styles elsewhere in caspian.css (as they are the same, just * - * targeting different CSS style classes). * - ******************************************************************************/ -.tree-table-view { - -fx-background-color: -fx-box-border, -fx-control-inner-background; - -fx-background-insets: 0,1; - - /* There is some oddness if padding is in em values rather than pixels, - in particular, the left border of the control doesn't show. */ - -fx-padding: 1; /* 0.083333em; */ - - /* Constants used throughout the tableview. - * TODO: Should these be derived from the palette in .scene? - */ - -fx-table-header-border-color: #959595; -/* -fx-table-header-background-color: linear (0%,0%) to (0%,100%) stops (80%, #bbbbbb) (10%, #f6f6f6);*/ - -fx-table-cell-border-color: #bbbbbb; -} - -.tree-table-row-cell { - -fx-background-color: -fx-control-inner-background; - -fx-padding: 0.0em; /* 0 */ - -fx-text-fill: -fx-text-inner-color; -} - -.tree-table-cell { - -fx-padding: 0.166667em; /* 2px, plus border adds 1px */ - - -fx-background-color: transparent; - -fx-border-color: transparent -fx-table-cell-border-color transparent transparent; - -fx-border-width: 0.083333em; /* 1 */ - -fx-cell-size: 2.0em; /* 24 */ - -fx-text-fill: -fx-text-inner-color; -} - - -/******************************************************************************* - * * - * TreeTableView cell spanning * - * * - ******************************************************************************/ - -.cell-span-tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell { - -fx-background-color: transparent; -} - -/* All table-row-cells - we don't care if they are even or odd */ -.cell-span-tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell { - -fx-background-color: -fx-table-cell-border-color, -fx-control-inner-background; - -fx-background-insets: 0, 0 1 0 0; - -fx-alignment: center; -} - -/** Selection styles */ -/*.cell-span-table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:focused:selected, */ -.cell-span-tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:selected > .tree-table-cell, -.cell-span-tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:selected > .tree-table-cell, -.cell-span-tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:selected:hover > .tree-table-cell, -.cell-span-tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:filled:selected, -.cell-span-tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:filled:focused:selected, -.cell-span-tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:filled:focused:selected:hover{ - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; - -fx-background: -fx-accent; - -fx-text-fill: -fx-selection-bar-text; -} - -/** Hover styles */ -/** --- Row selection mode hover */ -.cell-span-tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:hover > .tree-table-cell { - -fx-background-color: -fx-table-cell-border-color, -fx-cell-hover-color; - -fx-background-insets: 0, 0 0 1 0; - -fx-text-fill: -fx-text-inner-color; -} - -.cell-span-tree-table-view:row-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:hover > .tree-table-cell { - -fx-background-color: -fx-table-cell-border-color, -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0, 0 0 1 0, 1 1 2 1, 2 2 3 2, 3 3 4 3; - -fx-text-fill: -fx-text-inner-color; -} - -/** --- Cell selection mode hover */ -.cell-span-tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:hover{ - -fx-background-color: -fx-table-cell-border-color, -fx-cell-hover-color; - -fx-text-fill: -fx-text-inner-color; - -fx-background-insets: 0, 0 0 1 0; -} - -.cell-span-tree-table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled > .tree-table-cell:focused:hover{ - -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color; - -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; - -fx-text-fill: -fx-text-inner-color; -} -/** End of hover styles */ - -/******************************************************************************** - * * - * HTMLEditor * - * * - ********************************************************************************/ - -.html-editor { - -fx-border-width: 1; - -fx-border-style: solid; - -fx-padding: 0; - -fx-border-color: derive(-fx-base,-35%); -} -.html-editor .button, -.html-editor .toggle-button { - -fx-padding: 0.333333em 0.833333em 0.416667em 0.833333em; /* 2 10 3 10 */ -} -.html-editor .combo-box > .list-cell { - -fx-cell-size: 2.0833em; /* 21 */ -} -/* Each Toolbar is constructed of two stacked shapes */ -.html-editor > * > .top-toolbar { - -fx-background-color: - linear-gradient(to bottom, white 10%, derive(-fx-base, 50%) 90%), - linear-gradient(to bottom, derive(-fx-base, 65%) 0%, derive(-fx-base, 5%) 90%); - -fx-background-insets: 0, 1; - -fx-border-color: transparent transparent derive(-fx-base,-20%) transparent, transparent; - -fx-border-width: 1, 0; - -fx-padding: 0.333em 0.5em 0.333em 0.5em; /* 4 6 4 6;*/ -} - -.html-editor > * > .bottom-toolbar { - -fx-background-color: - linear-gradient(to bottom, derive(-fx-base, 50%) 10%, derive(-fx-base, -60%) 90%), - linear-gradient(to bottom, derive(-fx-base, 5%) 0%, derive(-fx-base, -15%) 90%); - -fx-background-insets: 0, 1; - -fx-border-color: transparent derive(-fx-base,50%) transparent derive(-fx-base,50%), - transparent transparent derive(-fx-base,-60%) transparent; - -fx-border-width: 1, 0; - -fx-padding: 0.166667em 0.5em 0.166667em 1.5em; /* 2 6 2 6;*/ -} - -.html-editor-foreground, .html-editor-background { - -fx-color-label-visible: false; - -fx-color-rect-x: 0; - -fx-color-rect-y: 10; - -fx-color-rect-width: 16; - -fx-color-rect-height: 5; - -fx-padding: 0; -} -.html-editor-foreground > .color-picker-label, -.html-editor-background > .color-picker-label { - -fx-padding: 0 0 -0.083333em 0; -} -/* Note: The Separator is constructed of a 1-pixel shape -whose borders are styled. Only the right border is specified -with a color; the other three borders are transparent.*/ - -/* Note: This first section of CSS (below) specifies the Separator's color. -Specifying the color here ensures the same color for both .top-toolbar -and .bottom-toolbar Separators, as they will inherit the color. */ - -.html-editor > * > * > .separator:vertical > .line{ - -fx-border-style: solid; - -fx-background-color: null; - -fx-border-color: transparent derive(-fx-base,-35%) transparent transparent; /* #878787 */ -} - -/* Note: This next section of CSS (below) specifies the Separator's length. -The length of the Separator is determined by adding its -fx-padding values -to the top and bottom -fx-padding values of the parent toolbar. */ - -.html-editor > * > .top-toolbar > .separator { - -fx-padding: 1 0 1 0; -} - -.html-editor > * > .bottom-toolbar:horizontal { - -fx-padding: 0.417em; /* 5px */ -} - -.html-editor > * > .bottom-toolbar > .separator { - -fx-padding: 1 2 1 2; -} - -.html-editor > * > * > .button { - -fx-background-color: null; - -fx-background-insets: -1, 0, 1; - -fx-background-radius: 0.25em; /* 3 */ - -fx-padding: 0.25em; /* 3 */ - -fx-alignment: CENTER; - -fx-graphic-vpos: CENTER; -} - -.html-editor > * > .top-toolbar > .button:hover { - -fx-background-color: transparent, derive(-fx-base,-10%), derive(-fx-base,65%); -} - -.html-editor > * > .bottom-toolbar > .button:hover { - -fx-background-color: transparent, derive(-fx-base,-25%), derive(-fx-base,15%); -} - -.html-editor > * > * > .toggle-button { - -fx-background-color: transparent; - -fx-background-insets: -1, 0, 1; - -fx-background-radius: 3; - -fx-padding: 0.25em; /* 3 */ - -fx-alignment: CENTER; - -fx-graphic-vpos: CENTER; -} - -.html-editor > * > .top-toolbar > .toggle-button:hover { - -fx-background-color: transparent, derive(-fx-base,-10%), derive(-fx-base,65%); -} - -.html-editor > * > .bottom-toolbar > .toggle-button:hover { - -fx-background-color: transparent, derive(-fx-base,-25%), derive(-fx-base,15%); -} - -.html-editor > * > .toggle-button:focused { - -fx-color: transparent; - -fx-background-color: -fx-focus-color, derive(-fx-base,-25%), derive(-fx-base,15%); - -fx-background-insets: -1.2, 0, 1; - -fx-background-radius: 3.2, 3, 3; -} - -.html-editor > * > * > .toggle-button:selected { - -fx-background-color: transparent, - linear-gradient(to bottom, derive(-fx-base, -70%) 10%, derive(-fx-base, -40%) 90%), - linear-gradient(to bottom, derive(-fx-base, -40%) 0%, derive(-fx-base, -20%) 50%, derive(-fx-base, -10%) 98%, derive(-fx-base, -35%) 100%); -} - -.html-editor > * > * > .font-menu-button { - -fx-background-radius: 5, 5, 4, 3; -} - -.html-editor > * > * > .font-menu-button .label{ - -fx-padding: 0.166667em 0.5em 0.25em 0.5em; /* 2 6 3 6 */ -} - -/******************************************************************************* - * * - * Spinner * - * * - ******************************************************************************/ - -.spinner { - -fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: 0, 0 0 1 0, 1 1 2 1; - -fx-background-radius: 3, 3, 2; -} -.spinner:focused, -.spinner:contains-focus { - -fx-background-color: -fx-focus-color, -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: -1.4 -1.4 -0.4 -1.4, 0 0 1 0, 1 1 2 1; - -fx-background-radius: 4, 3, 2; -} -.spinner:disabled { - -fx-opacity: -fx-disabled-opacity; -} -.spinner > .text-field { - -fx-background-color: -fx-text-box-border, -fx-control-inner-background; - -fx-background-insets: 0 0 1 0, 1 0 2 1; - -fx-background-radius: 3 0 0 3, 2 0 0 2; -} - -.spinner .increment-arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: 0, 1, 2; - -fx-background-radius: 0 3 0 0, 0 2 0 0, 0 1 0 0; - -fx-padding: 0.333em 0.666em 0.333em 0.666em; /* 4 8 4 8 */ -} -.spinner .decrement-arrow-button { - -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color; - -fx-background-insets: -1 0 1 0, 0 1 2 1, 0 2 3 2; - -fx-background-radius: 0 0 3 0, 0 0 2 0, 0 0 1 0; - -fx-padding: 0.250em 0.666em 0.5em 0.666em; /* 3 8 6 8 */ -} - -.spinner .increment-arrow-button .increment-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: -0.6 0 1 0, 0; - -fx-padding: 0.167em 0.333em 0.167em 0.333em; /* 2 4 2 4 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; - -fx-rotate: 180; -} -.spinner .decrement-arrow-button .decrement-arrow { - -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; - -fx-background-insets: 1 0 -1 0, 0; - -fx-padding: 0.167em 0.333em 0.167em 0.333em; /* 2 4 2 4 */ - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - -/* Spinner - Horizontal arrows */ -.spinner.split-arrows-horizontal .increment-arrow-button .increment-arrow, -.spinner.arrows-on-right-horizontal .increment-arrow-button .increment-arrow, -.spinner.arrows-on-left-horizontal .increment-arrow-button .increment-arrow, -.spinner.split-arrows-horizontal .decrement-arrow-button .decrement-arrow, -.spinner.arrows-on-right-horizontal .decrement-arrow-button .decrement-arrow, -.spinner.arrows-on-left-horizontal .decrement-arrow-button .decrement-arrow{ - -fx-padding: 0.333em 0.166em 0.333em 0.166em; /* 4 2 4 2 */ - -fx-shape: "M 4 0 v 7 l -4 -3.5 z"; -} - -/* Spinner - STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL */ -.spinner.arrows-on-right-horizontal .increment-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 0, 2 2 3 1; - -fx-background-radius: 0 3 3 0, 0 2 2 0, 0 1 1 0; - -fx-padding: 0.333em 0.666em 0.333em 0.583em; /* 4 8 4 7 */ - -} -.spinner.arrows-on-right-horizontal .decrement-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 1, 2 2 3 2; - -fx-background-radius: 0, 0, 0; - -fx-padding: 0.333em 0.666em 0.333em 0.666em; /* 4 8 4 8 */ -} - -/* Spinner - STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL */ -.spinner.arrows-on-left-vertical > .text-field { - -fx-background-insets: 0 0 1 0, 1 1 2 0; - -fx-background-radius: 0 3 3 0, 0 2 2 0; -} -.spinner.arrows-on-left-vertical .increment-arrow-button { - -fx-background-radius: 3 0 0 0, 2 0 0 0, 1 0 0 0; -} -.spinner.arrows-on-left-vertical .decrement-arrow-button { - -fx-background-radius: 0 0 0 3, 0 0 0 2, 0 0 0 1; -} - -/* Spinner - STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL */ -.spinner.arrows-on-left-horizontal > .text-field { - -fx-background-insets: 0 0 1 -1, 1 1 2 -1; - -fx-background-radius: 0 3 3 0, 0 2 2 0; -} -.spinner.arrows-on-left-horizontal .increment-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 0, 2 2 3 1; - -fx-background-radius: 0, 0, 0; - -fx-padding: 0.333em 0.666em 0.333em 0.583em; /* 4 8 4 7 */ -} -.spinner.arrows-on-left-horizontal .decrement-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 1, 2 2 3 2; - -fx-background-radius: 3 0 0 3, 2 0 0 2, 1 0 0 1; - -fx-padding: 0.333em 0.666em 0.333em 0.666em; /* 4 8 4 8 */ -} - -/* Spinner - STYLE_CLASS_SPLIT_ARROWS_VERTICAL */ -.spinner.split-arrows-vertical > .text-field { - -fx-background-insets: 0, 0 1 0 1; - -fx-background-radius: 0, 0; -} -.spinner.split-arrows-vertical .increment-arrow-button { - -fx-background-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0; -} -.spinner.split-arrows-vertical .decrement-arrow-button { - -fx-background-insets: -1 0 1 0, 0 1 2 1, 1 2 3 2; - -fx-background-radius: 0 0 3 3, 0 0 2 2, 0 0 1 1; - -fx-padding: 0.25em 0.666em 0.417em 0.666em; /* 3 8 5 8 */ -} - -/* Spinner - STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL */ -.spinner.split-arrows-horizontal > .text-field { - -fx-background-insets: 0 0 1 0, 1 0 2 0; - -fx-background-radius: 0, 0; -} -.spinner.split-arrows-horizontal .increment-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 1, 2 2 3 2; - -fx-background-radius: 0 3 3 0, 0 2 2 0, 0 1 1 0; - -fx-padding: 0.333em 0.666em 0.333em 0.666em; /* 4 8 4 8 */ -} -.spinner.split-arrows-horizontal .decrement-arrow-button { - -fx-background-insets: 0 0 1 0, 1 1 2 1, 2 2 3 2; - -fx-background-radius: 3 0 0 3, 2 0 0 2, 1 0 0 1; - -fx-padding: 0.333em 0.666em 0.333em 0.666em; /* 4 8 4 8 */ -} - -/******************************************************************************* - * * - * Dialog * - * * - ******************************************************************************/ - -.dialog-pane { - -fx-background-color: -fx-background; - -fx-padding: 0; -} - -.dialog-pane > .expandable-content { - -fx-padding: 0.666em; /* 8px */ -} - -.dialog-pane > .button-bar > .container { - -fx-padding: 0.833em; /* 10px */ -} - -.dialog-pane > .content.label { - -fx-alignment: top-left; - -fx-padding: 1.333em 0.833em 0 0.833em; /* 16px 10px 0px 10px */ -} - -.dialog-pane > .content { - -fx-padding: 0.833em; /* 10 */ -} - -.dialog-pane:no-header .graphic-container { - -fx-padding: 0.833em 0 0 0.833em; /* 10px 0px 0px 10px */ -} - -.dialog-pane:header .header-panel { - /*-fx-padding: 0.833em 1.166em 0.833em 1.166em; *//* 10px 14px 10px 14px */ - -fx-padding: 0.833em; /* 10px */ - -fx-background-color: -fx-box-border, linear-gradient(-fx-background, derive(-fx-background, 30%)); - -fx-background-insets: 0, 0 0 1 0; -} - -.dialog-pane:header .header-panel .label { - -fx-font-size: 1.167em; /* 14px */ - -fx-wrap-text: true; -} - -.dialog-pane:header .header-panel .graphic-container { - /* This prevents the text in the header running directly into the graphic */ - -fx-padding: 0 0 0 0.833em; /* 0px 0px 0px 10px */ -} - -.dialog-pane > .button-bar > .container > .details-button { - -fx-alignment: baseline-left; - -fx-focus-traversable: false; - -fx-padding: 0.416em; /* 5px */ - -fx-font-size: 0.833em; /* 10px */ -} - -.dialog-pane > .button-bar > .container > .details-button.more { - -fx-graphic: url("dialog-more-details.png"); -} - -.dialog-pane > .button-bar > .container > .details-button.less { - -fx-graphic: url("dialog-fewer-details.png"); -} - -.dialog-pane > .button-bar > .container > .details-button:hover { - -fx-underline: true; -} - -.alert.confirmation.dialog-pane, -.text-input-dialog.dialog-pane, -.choice-dialog.dialog-pane { - -fx-graphic: url("dialog-confirm.png"); -} - -.alert.information.dialog-pane { - -fx-graphic: url("dialog-information.png"); -} - -.alert.error.dialog-pane { - -fx-graphic: url("dialog-error.png"); -} - -.alert.warning.dialog-pane { - -fx-graphic: url("dialog-warning.png"); -} diff --git a/MyBox/src/main/resources/docs/AboutColorDistance_en.html b/MyBox/src/main/resources/docs/AboutColorDistance_en.html new file mode 100644 index 000000000..d0c30c4b3 --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutColorDistance_en.html @@ -0,0 +1,48 @@ + + + + + About Color Distance + + + + +

+

About Color Distance

+
+ +

Please refer following:

+ + + diff --git a/MyBox/src/main/resources/docs/AboutColorDistance_zh.html b/MyBox/src/main/resources/docs/AboutColorDistance_zh.html new file mode 100644 index 000000000..c55b243fe --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutColorDistance_zh.html @@ -0,0 +1,48 @@ + + + + + 关于颜色距离 + + + + +

+

关于颜色距离

+
+ +

请参考以下网文

+ + + diff --git a/MyBox/src/main/resources/docs/AboutImageBlending_en.html b/MyBox/src/main/resources/docs/AboutImageBlending_en.html new file mode 100644 index 000000000..728cc091b --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutImageBlending_en.html @@ -0,0 +1,51 @@ + + + + + About Image Blending + + + + +

+

About Image Blending

+
+ +

Please refer following:

+ + + + + + diff --git a/MyBox/src/main/resources/docs/AboutImageBlending_zh.html b/MyBox/src/main/resources/docs/AboutImageBlending_zh.html new file mode 100644 index 000000000..cf9883ea1 --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutImageBlending_zh.html @@ -0,0 +1,51 @@ + + + + + 关于图像的混合模式 + + + + +

+

关于图像的混合模式

+
+ +

请参考以下网文

+ + + + + + diff --git a/MyBox/src/main/resources/docs/AboutImageGrayscale_en.html b/MyBox/src/main/resources/docs/AboutImageGrayscale_en.html new file mode 100644 index 000000000..b429400c2 --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutImageGrayscale_en.html @@ -0,0 +1,49 @@ + + + + + About Image Grayscale + + + + +

+

About Image Grayscale

+
+ +

Please refer following:

+ + + + diff --git a/MyBox/src/main/resources/docs/AboutImageGrayscale_zh.html b/MyBox/src/main/resources/docs/AboutImageGrayscale_zh.html new file mode 100644 index 000000000..a78c69a1a --- /dev/null +++ b/MyBox/src/main/resources/docs/AboutImageGrayscale_zh.html @@ -0,0 +1,49 @@ + + + + + 关于图像的灰度 + + + + +

+

关于图像的灰度

+
+ +

请参考以下网文

+ + + + diff --git a/MyBox/src/main/resources/docs/HowPackExe_en.html b/MyBox/src/main/resources/docs/HowPackExe_en.html new file mode 100644 index 000000000..db229c838 --- /dev/null +++ b/MyBox/src/main/resources/docs/HowPackExe_en.html @@ -0,0 +1,53 @@ + + + + + How to pack execution program + + + + +

+

How to pack execution program

+
+ +

Copy the compiled Jar fle to a temprary directory, like "D:\tmp\src". And execute following command, ("javapackager" is under bin path of JDK)

+

+ javapackager -deploy -native image -appclass mara.mybox.MainApp -srcdir D:\tmp\src -outdir D:\tmp\out -outfile MyBox -name MyBox +

+

The exe files are generated under "D:\tmp\out".

+

If this command asks for extra tools, download them as its prompts.

+ + + diff --git a/MyBox/src/main/resources/docs/HowPackExe_zh.html b/MyBox/src/main/resources/docs/HowPackExe_zh.html new file mode 100644 index 000000000..8e3440f2b --- /dev/null +++ b/MyBox/src/main/resources/docs/HowPackExe_zh.html @@ -0,0 +1,53 @@ + + + + + 如何打包成exe程序 + + + + +

+

如何打包成exe程序

+
+ +

把编译后的jar文件复制到一个临时目录下,如“D:\tmp\src”,然后执行以下命令:(命令“javapackager”在JDK的bin目录下)

+

+ javapackager -deploy -native image -appclass mara.mybox.MainApp -srcdir D:\tmp\src -outdir D:\tmp\out -outfile MyBox -name MyBox +

+

可运行的exe文件就生成在目录“D:\tmp\out”下了。

+

如果此命令提示缺少辅助工具,则按提示下载。

+ + + diff --git a/MyBox/src/main/resources/docs/ImageHelp.html b/MyBox/src/main/resources/docs/ImageCompressionType_en.html similarity index 97% rename from MyBox/src/main/resources/docs/ImageHelp.html rename to MyBox/src/main/resources/docs/ImageCompressionType_en.html index 707422586..314ca2ec3 100644 --- a/MyBox/src/main/resources/docs/ImageHelp.html +++ b/MyBox/src/main/resources/docs/ImageCompressionType_en.html @@ -6,7 +6,7 @@ --> - Some Description about image attributes + About Image Compression Type -
+

+

About Image Compression Type

+
diff --git a/MyBox/src/main/resources/docs/ImageCompressionType_zh.html b/MyBox/src/main/resources/docs/ImageCompressionType_zh.html new file mode 100644 index 000000000..cabb14a02 --- /dev/null +++ b/MyBox/src/main/resources/docs/ImageCompressionType_zh.html @@ -0,0 +1,122 @@ + + + + + 图像的压缩类型 + + + + + +

+

图像的压缩类型

+
+ +
+
+ + + + + + + +
图像格式"bmp"支持的压缩类型
+ 基于类接口"com.github.jaiimageio.plugins.bmp.BMPImageWriteParam"整理
+
压缩类型 描述 图像类型
BI_RGB Uncompressed RLE <= 8-bits/sample
BI_RLE8 8-bit Run Length Encoding <= 8-bits/sample
BI_RLE4 4-bit Run Length Encoding <= 4-bits/sample
BI_BITFIELDS Packed data 16 or 32 bits/sample
BI_JPEG JPEG encoded grayscale or RGB image
+
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
图像格式"tif"/"tiff"支持的压缩类型
+ 基于类接口"com.github.jaiimageio.plugins.tiff.TIFFImageWriteParam"整理
+
压缩类型 描述 参考
CCITT RLEModified Huffman compressionTIFF 6.0 Specification, Section 10
CCITT T.4CCITT T.4 bilevel encoding/Group 3 facsimile compressionTIFF 6.0 Specification, Section 11
CCITT T.6CCITT T.6 bilevel encoding/Group 4 facsimile compressionTIFF 6.0 Specification, Section 11
LZWLZW compressionTIFF 6.0 Specification, Section 13
JPEG"New" JPEG-in-TIFF compressionTIFF + Technical Note #2
ZLib"Deflate/Inflate" compression + Adobe Photoshop® TIFF Technical Notes (PDF)
PackBitsByte-oriented, run length compressionTIFF 6.0 Specification, Section 9
Deflate"Zip-in-TIFF" compression + ZLIB Compressed Data Format Specification, + + DEFLATE Compressed Data Format Specification
EXIF JPEGEXIF-specific JPEG compressionEXIF 2.2 Specification + (PDF), section 4.5.5, "Basic Structure of Thumbnail Data"
+
+ +
+ + + + + diff --git a/MyBox/src/main/resources/docs/ImageMetaData_en.html b/MyBox/src/main/resources/docs/ImageMetaData_en.html new file mode 100644 index 000000000..6c3121b53 --- /dev/null +++ b/MyBox/src/main/resources/docs/ImageMetaData_en.html @@ -0,0 +1,57 @@ + + + + + About Image Meta Data + + + + +

+

About Image Meta Data

+
+ +

Please refer the offical definition:

+ + + + + + + diff --git a/MyBox/src/main/resources/docs/ImageMetaData_zh.html b/MyBox/src/main/resources/docs/ImageMetaData_zh.html new file mode 100644 index 000000000..9f51c61cb --- /dev/null +++ b/MyBox/src/main/resources/docs/ImageMetaData_zh.html @@ -0,0 +1,57 @@ + + + + + 图像的元数据 + + + + +

+

图像的元数据

+
+ +

请参考官方定义

+ + + + + + + diff --git a/MyBox/src/main/resources/docs/ImageSepia_en.html b/MyBox/src/main/resources/docs/ImageSepia_en.html new file mode 100644 index 000000000..6740c3cea --- /dev/null +++ b/MyBox/src/main/resources/docs/ImageSepia_en.html @@ -0,0 +1,49 @@ + + + + + How to get sepia image + + + + +

+

How to get sepia image

+
+ +

Please refer following:

+ + + diff --git a/MyBox/src/main/resources/docs/ImageSepia_zh.html b/MyBox/src/main/resources/docs/ImageSepia_zh.html new file mode 100644 index 000000000..26679ac40 --- /dev/null +++ b/MyBox/src/main/resources/docs/ImageSepia_zh.html @@ -0,0 +1,49 @@ + + + + + 如何把图像转变成褐色 + + + + +

+

如何把图像转变成褐色

+
+ +

请参考以下网文

+ + + diff --git a/MyBox/src/main/resources/docs/Java2D_en.html b/MyBox/src/main/resources/docs/Java2D_en.html new file mode 100644 index 000000000..33a43f1d0 --- /dev/null +++ b/MyBox/src/main/resources/docs/Java2D_en.html @@ -0,0 +1,49 @@ + + + + + How to use Java 2D + + + + +

+

How to use Java 2D

+
+ +

Please refer following:

+ + + diff --git a/MyBox/src/main/resources/docs/Java2D_zh.html b/MyBox/src/main/resources/docs/Java2D_zh.html new file mode 100644 index 000000000..bd196e018 --- /dev/null +++ b/MyBox/src/main/resources/docs/Java2D_zh.html @@ -0,0 +1,49 @@ + + + + + 如何运用Java 2D + + + + +

+

如何运用Java 2D

+
+ +

请参考以下网文

+ + + diff --git a/MyBox/src/main/resources/docs/mybox_help_en.html b/MyBox/src/main/resources/docs/mybox_help_en.html new file mode 100644 index 000000000..bd5c98323 --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_en.html @@ -0,0 +1,11 @@ + + + + MyBox Helps + + + + + + + diff --git a/MyBox/src/main/resources/docs/mybox_help_main_en.html b/MyBox/src/main/resources/docs/mybox_help_main_en.html new file mode 100644 index 000000000..7c597da05 --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_main_en.html @@ -0,0 +1,54 @@ + + + + + + + +

+

MyBox

+
+ +

This is GUI program based on JavaFx to provide simple and easy functions. It's free and open sources.

+

Project Main Page:

+ +

MyBox is developed with NetBeans:

+ +

It is based on following open sources softwares or libraries:

+ + + + + + + + + + \ No newline at end of file diff --git a/MyBox/src/main/resources/docs/mybox_help_main_zh.html b/MyBox/src/main/resources/docs/mybox_help_main_zh.html new file mode 100644 index 000000000..70a24b145 --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_main_zh.html @@ -0,0 +1,54 @@ + + + + + + + +

+

MyBox

+
+ +

这是利用JavaFx开发的图形化界面程序,目标是提供简单易用的功能。免费开源。

+

项目主页:

+ +

MyBox使用NetBeans开发:

+ +

基于以下开源软件/开源库:

+ + + + + + + + + + \ No newline at end of file diff --git a/MyBox/src/main/resources/docs/mybox_help_nav_en.html b/MyBox/src/main/resources/docs/mybox_help_nav_en.html new file mode 100644 index 000000000..6e4f53d9b --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_nav_en.html @@ -0,0 +1,51 @@ + + + + + + + + + +

+ + + + + + + + + + + + + + diff --git a/MyBox/src/main/resources/docs/mybox_help_nav_zh.html b/MyBox/src/main/resources/docs/mybox_help_nav_zh.html new file mode 100644 index 000000000..a4e97598f --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_nav_zh.html @@ -0,0 +1,51 @@ + + + + + + + + + +

+ + + + + + + + + + + + + + diff --git a/MyBox/src/main/resources/docs/mybox_help_zh.html b/MyBox/src/main/resources/docs/mybox_help_zh.html new file mode 100644 index 000000000..b55e2a0a0 --- /dev/null +++ b/MyBox/src/main/resources/docs/mybox_help_zh.html @@ -0,0 +1,11 @@ + + + + MyBox帮助 + + + + + + + diff --git a/MyBox/src/main/resources/docs/srcHelp.html b/MyBox/src/main/resources/docs/srcHelp.html deleted file mode 100644 index cbdf1b722..000000000 --- a/MyBox/src/main/resources/docs/srcHelp.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - TODO supply a title - - - - -
javapackager -deploy -native image -appclass mara.mybox.MainApp -srcdir D:\tmp\src -outdir D:\tmp\out -outfile MyBox -name MyBox
- - diff --git a/MyBox/src/main/resources/fxml/About.fxml b/MyBox/src/main/resources/fxml/About.fxml index b0cd08c1c..6e1cb1ddd 100644 --- a/MyBox/src/main/resources/fxml/About.fxml +++ b/MyBox/src/main/resources/fxml/About.fxml @@ -5,12 +5,12 @@ - + - - + + diff --git a/MyBox/src/main/resources/fxml/ImageBlend.fxml b/MyBox/src/main/resources/fxml/ImageBlend.fxml deleted file mode 100644 index 38d945d54..000000000 --- a/MyBox/src/main/resources/fxml/ImageBlend.fxml +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - - - -
diff --git a/MyBox/src/main/resources/fxml/ImageManufactureBatchColor.fxml b/MyBox/src/main/resources/fxml/ImageManufactureBatchColor.fxml index 6f476581a..1f4220b26 100644 --- a/MyBox/src/main/resources/fxml/ImageManufactureBatchColor.fxml +++ b/MyBox/src/main/resources/fxml/ImageManufactureBatchColor.fxml @@ -46,9 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + @@ -92,7 +90,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + @@ -104,6 +102,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + @@ -188,7 +190,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + - - - @@ -163,7 +164,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + @@ -105,10 +106,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.