From 4cee3401f68dfa6f8ff9509d310b46b437b5c4b6 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Fri, 19 Jun 2026 22:04:56 -0400 Subject: [PATCH 01/12] update jdk and netbeans --- .github/workflows/maven.yml | 4 +- .gitignore | 1 + modules/AdministrationGUI/pom.xml | 2 +- modules/ColorDepthSearch/pom.xml | 2 +- modules/CommonGUI/pom.xml | 2 +- .../gui/progress/SharedProgressBarUI.java | 9 +- modules/CommonLibraries/pom.xml | 8 +- modules/Core/pom.xml | 30 +- .../core/filecache/AbstractWebDav.java | 2 - .../workstation/core/util/SystemInfo.java | 36 +- modules/DarculaLAF/pom.xml | 76 -- .../revivius/nb/darcula/DarculaLFCustoms.java | 879 ------------------ .../revivius/nb/darcula/DarkIconFilter.java | 90 -- .../revivius/nb/darcula/GuaranteedValue.java | 94 -- .../com/revivius/nb/darcula/Installer.java | 113 --- .../revivius/nb/darcula/RelativeColor.java | 326 ------- .../com/revivius/nb/darcula/ToolbarXP.java | 100 -- .../revivius/nb/darcula/UIBootstrapValue.java | 121 --- .../DarculaLAFOptionsPanelController.java | 149 --- .../nb/darcula/options/DarculaLAFPanel.java | 233 ----- .../darcula/ui/ContentAreaAwareButtonUI.java | 140 --- .../ui/ContentAreaAwareToggleButtonUI.java | 45 - .../darcula/ui/DarculaSplitPaneDivider.java | 147 --- .../nb/darcula/ui/DarculaSplitPaneUI.java | 23 - .../ui/DarkScrollButtonTabbedPaneUI.java | 67 -- .../darcula/ui/FixedCheckBoxMenuItemUI.java | 74 -- .../nb/darcula/ui/FixedMenuItemUIBase.java | 195 ---- .../revivius/nb/darcula/ui/FixedMenuUI.java | 188 ---- .../ui/FixedRadioButtonMenuItemUI.java | 76 -- .../nb/darcula/ui/FixedTableHeaderUI.java | 65 -- .../nb/darcula/ui/IndentAwareTreeUI.java | 54 -- .../ui/InreasedInsetsTableHeaderBorder.java | 18 - .../nb/darcula/ui/OptionsAwareLabelUI.java | 139 --- .../ui/ReducedInsetsDarculaButtonPainter.java | 64 -- .../nb/darcula/ui/RolloverToolBarUI.java | 128 --- modules/DarculaLAF/src/main/nbm/manifest.mf | 7 - .../com/bulenkov/darcula/icons/splitGlueH.png | Bin 262 -> 0 bytes .../com/bulenkov/darcula/icons/splitGlueV.png | Bin 268 -> 0 bytes .../com/revivius/nb/darcula/Bundle.properties | 4 - .../FontsColors/Darcula/annotations.xml | 148 --- .../FontsColors/Darcula/highlights.xml | 32 - .../FontsColors/Darcula/tokenColorings.xml | 24 - .../FontsColors/Darcula/tokenColorings.xml | 13 - .../FontsColors/Darcula/tokenColorings.xml | 34 - .../FontsColors/Darcula/tokenColorings.xml | 29 - .../FontsColors/Darcula/tokenColorings.xml | 5 - .../FontsColors/Darcula/tokenColorings.xml | 30 - .../FontsColors/Darcula/tokenColorings.xml | 17 - .../FontsColors/Darcula/tokenColorings.xml | 17 - .../FontsColors/Darcula/tokenColorings.xml | 18 - .../FontsColors/Darcula/tokenColorings.xml | 32 - .../FontsColors/Darcula/tokenColorings.xml | 23 - .../FontsColors/Darcula/tokenColorings.xml | 44 - .../FontsColors/Darcula/tokenColorings.xml | 11 - .../FontsColors/Darcula/tokenColorings.xml | 63 -- .../FontsColors/Darcula/tokenColorings.xml | 16 - .../FontsColors/Darcula/tokenColorings.xml | 27 - .../FontsColors/Darcula/tokenColorings.xml | 25 - .../FontsColors/Darcula/tokenColorings.xml | 5 - .../FontsColors/Darcula/tokenColorings.xml | 28 - .../FontsColors/Darcula/tokenColorings.xml | 20 - .../com/revivius/nb/darcula/closed.png | Bin 375 -> 0 bytes .../com/revivius/nb/darcula/column-asc.png | Bin 213 -> 0 bytes .../com/revivius/nb/darcula/column-desc.png | Bin 212 -> 0 bytes .../com/revivius/nb/darcula/computer.png | Bin 617 -> 0 bytes .../com/revivius/nb/darcula/detailsView.png | Bin 441 -> 0 bytes .../com/revivius/nb/darcula/file.png | Bin 294 -> 0 bytes .../com/revivius/nb/darcula/floppyDrive.png | Bin 410 -> 0 bytes .../com/revivius/nb/darcula/folder.png | Bin 629 -> 0 bytes .../com/revivius/nb/darcula/hardDrive.png | Bin 754 -> 0 bytes .../com/revivius/nb/darcula/homeFolder.png | Bin 499 -> 0 bytes .../com/revivius/nb/darcula/layer.xml | 215 ----- .../com/revivius/nb/darcula/listView.png | Bin 395 -> 0 bytes .../com/revivius/nb/darcula/newFolder.png | Bin 572 -> 0 bytes .../com/revivius/nb/darcula/open.png | Bin 504 -> 0 bytes .../nb/darcula/options/Bundle.properties | 7 - .../nb/darcula/options/DarculaLAFPanel.form | 136 --- .../revivius/nb/darcula/options/restart.png | Bin 812 -> 0 bytes .../com/revivius/nb/darcula/upFolder.png | Bin 609 -> 0 bytes .../core/multitabs/resources/down_dark.png | Bin 196 -> 0 bytes .../core/multitabs/resources/left_dark.png | Bin 209 -> 0 bytes .../multitabs/resources/maximize_dark.png | Bin 227 -> 0 bytes .../core/multitabs/resources/right_dark.png | Bin 209 -> 0 bytes .../multiview/resources/splitview_dark.png | Bin 247 -> 0 bytes .../cnd/remote/resources/host_no_ssh_dark.png | Bin 780 -> 0 bytes .../remote/resources/host_with_ssh_dark.png | Bin 842 -> 0 bytes .../cnd/remote/resources/sshClosed_dark.gif | Bin 992 -> 0 bytes .../cnd/remote/resources/sshOpen_dark.gif | Bin 1004 -> 0 bytes .../notifications/resources/filter_dark.png | Bin 707 -> 0 bytes .../resources/filter_rollover_dark.png | Bin 704 -> 0 bytes .../resources/notificationsError_dark.png | Bin 474 -> 0 bytes .../resources/notifications_dark.png | Bin 634 -> 0 bytes .../profiler/impl/icons/attachButton_dark.gif | Bin 900 -> 0 bytes .../profiler/impl/icons/closePanel_dark.png | Bin 228 -> 0 bytes .../impl/icons/collapsedSnippet_dark.png | Bin 281 -> 0 bytes .../impl/icons/expandedSnippet_dark.png | Bin 230 -> 0 bytes .../impl/icons/filterContains_dark.png | Bin 402 -> 0 bytes .../impl/icons/filterNotContains_dark.png | Bin 414 -> 0 bytes .../profiler/impl/icons/hideColumn_dark.png | Bin 237 -> 0 bytes .../profiler/impl/icons/libraries_dark.png | Bin 545 -> 0 bytes .../impl/icons/maximizePanel_dark.png | Bin 199 -> 0 bytes .../impl/icons/minimizePanel_dark.png | Bin 153 -> 0 bytes .../profiler/impl/icons/popupArrow_dark.png | Bin 198 -> 0 bytes .../profiler/impl/icons/rename_dark.png | Bin 547 -> 0 bytes .../profiler/impl/icons/restorePanel_dark.png | Bin 208 -> 0 bytes .../profiler/impl/icons/runButton_dark.gif | Bin 870 -> 0 bytes .../icons/snapshotDataObjectCPU32_dark.gif | Bin 1403 -> 0 bytes .../impl/icons/snapshotDataObjectCPU_dark.gif | Bin 1030 -> 0 bytes .../snapshotDataObjectFragment32_dark.gif | Bin 1244 -> 0 bytes .../icons/snapshotDataObjectFragment_dark.gif | Bin 994 -> 0 bytes .../icons/snapshotDataObjectMemory32_dark.gif | Bin 1272 -> 0 bytes .../icons/snapshotDataObjectMemory_dark.gif | Bin 987 -> 0 bytes .../profiler/impl/icons/sortAsc_dark.png | Bin 196 -> 0 bytes .../profiler/impl/icons/sortDesc_dark.png | Bin 199 -> 0 bytes .../ui/resources/columnsSortedAsc_dark.gif | Bin 833 -> 0 bytes .../ui/resources/columnsSortedDesc_dark.gif | Bin 834 -> 0 bytes .../vista_slidebottom_enabled_dark.png | Bin 364 -> 0 bytes .../vista_slidebottom_pressed_dark.png | Bin 368 -> 0 bytes .../vista_slidebottom_rollover_dark.png | Bin 365 -> 0 bytes .../vista_slideleft_enabled_dark.png | Bin 367 -> 0 bytes .../vista_slideleft_pressed_dark.png | Bin 375 -> 0 bytes .../vista_slideleft_rollover_dark.png | Bin 387 -> 0 bytes .../vista_slideright_enabled_dark.png | Bin 368 -> 0 bytes .../vista_slideright_pressed_dark.png | Bin 378 -> 0 bytes .../vista_slideright_rollover_dark.png | Bin 376 -> 0 bytes .../resources/win8_maximize_enabled_dark.png | Bin 185 -> 0 bytes .../resources/win8_minimize_enabled_dark.png | Bin 176 -> 0 bytes .../resources/win8_pin_enabled_dark.png | Bin 223 -> 0 bytes .../resources/win8_popup_disabled_dark.png | Bin 205 -> 0 bytes .../resources/win8_popup_enabled_dark.png | Bin 206 -> 0 bytes .../win8_restore_group_enabled_dark.png | Bin 223 -> 0 bytes .../win8_scrollleft_disabled_dark.png | Bin 218 -> 0 bytes .../win8_scrollleft_enabled_dark.png | Bin 218 -> 0 bytes .../win8_scrollright_disabled_dark.png | Bin 233 -> 0 bytes .../win8_scrollright_enabled_dark.png | Bin 233 -> 0 bytes .../org/openide/awt/resources/arrow_dark.png | Bin 224 -> 0 bytes .../awt/resources/mac_close_enabled_dark.png | Bin 490 -> 0 bytes .../awt/resources/mac_close_pressed_dark.png | Bin 499 -> 0 bytes .../awt/resources/mac_close_rollover_dark.png | Bin 348 -> 0 bytes .../resources/metal_bigclose_enabled_dark.png | Bin 240 -> 0 bytes .../resources/metal_bigclose_pressed_dark.png | Bin 272 -> 0 bytes .../metal_bigclose_rollover_dark.png | Bin 269 -> 0 bytes .../resources/metal_close_enabled_dark.png | Bin 179 -> 0 bytes .../resources/metal_close_pressed_dark.png | Bin 202 -> 0 bytes .../resources/metal_close_rollover_dark.png | Bin 208 -> 0 bytes .../resources/quicksearch/findMenu_dark.png | Bin 559 -> 0 bytes .../toolbar_arrow_horizontal_dark.png | Bin 257 -> 0 bytes .../resources/toolbar_arrow_vertical_dark.png | Bin 253 -> 0 bytes .../resources/win8_bigclose_enabled_dark.png | Bin 232 -> 0 bytes .../win8_bigclose_enabled_dark_old.png | Bin 219 -> 0 bytes modules/DataBrowser/pom.xml | 2 +- modules/GLViewerTools/pom.xml | 2 +- .../janelia/gltools/texture/Texture3d.java | 33 +- .../gltools/texture/TiffImageIOHelper.java | 60 ++ modules/Geometry3d/pom.xml | 2 +- modules/HortaTracer/pom.xml | 2 +- modules/IntegrationAPIs/pom.xml | 2 +- modules/Jogl213Lib/pom.xml | 2 +- modules/Jogl224Lib/pom.xml | 2 +- modules/LMDataBrowser/pom.xml | 2 +- .../CreateSyntheticTiff.java | 39 +- .../gui/large_volume_viewer/PermuteTiff.java | 156 ++-- .../TiffImageIOHelper.java | 60 ++ .../action/GenerateCarveoutAction.java | 5 - .../TiffRoundTripTest.java | 103 ++ modules/N5Viewer/pom.xml | 11 +- modules/SceneWindow/pom.xml | 2 +- modules/SiteHortaCloud/pom.xml | 2 +- modules/SiteJRC/pom.xml | 2 +- modules/Viewer3D/pom.xml | 2 +- .../img_3d_loader/TifVolumeFileLoader.java | 113 +-- .../img_3d_loader/TiffImageIOHelper.java | 60 ++ modules/ViewerController/pom.xml | 2 +- .../action/CreateWorkspaceAction.java | 2 +- .../tileimagery/ExtractOctreeSubvolume.java | 40 +- .../FileBasedOctreeMetadataSniffer.java | 82 +- .../tileimagery/TiffImageIOHelper.java | 60 ++ modules/ViewerInfoPanel/pom.xml | 2 +- modules/application/pom.xml | 18 +- .../src/main/resources/janeliaws.conf | 2 +- modules/application_horta/pom.xml | 18 +- .../src/main/resources/horta.conf | 2 +- modules/branding/pom.xml | 2 +- pom.xml | 57 +- 184 files changed, 698 insertions(+), 4983 deletions(-) delete mode 100644 modules/DarculaLAF/pom.xml delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarculaLFCustoms.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarkIconFilter.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/GuaranteedValue.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/Installer.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/RelativeColor.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ToolbarXP.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/UIBootstrapValue.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFOptionsPanelController.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFPanel.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareButtonUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareToggleButtonUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneDivider.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarkScrollButtonTabbedPaneUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedCheckBoxMenuItemUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuItemUIBase.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedRadioButtonMenuItemUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedTableHeaderUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/IndentAwareTreeUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/InreasedInsetsTableHeaderBorder.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/OptionsAwareLabelUI.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ReducedInsetsDarculaButtonPainter.java delete mode 100644 modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/RolloverToolBarUI.java delete mode 100644 modules/DarculaLAF/src/main/nbm/manifest.mf delete mode 100644 modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueH.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueV.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Bundle.properties delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/annotations.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/highlights.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/application/xml-dtd/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/css/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/html/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/plain/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/resources/script/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-apache-conf/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-diff/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-el/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-json/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-jsp/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-php5/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-properties/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-resources/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-sql/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tag/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tpl/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xhtml/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml-external-parsed-entity/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml/FontsColors/Darcula/tokenColorings.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/closed.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/column-asc.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/column-desc.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/computer.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/detailsView.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/file.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/floppyDrive.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/folder.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/hardDrive.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/homeFolder.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/layer.xml delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/listView.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/newFolder.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/open.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/Bundle.properties delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/DarculaLAFPanel.form delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/restart.png delete mode 100644 modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/upFolder.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/down_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/left_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/maximize_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/right_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/core/multiview/resources/splitview_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/host_no_ssh_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/host_with_ssh_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/sshClosed_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/sshOpen_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/notificationsError_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/notifications_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/attachButton_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/closePanel_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/collapsedSnippet_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/expandedSnippet_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterContains_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterNotContains_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/hideColumn_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/libraries_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/maximizePanel_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/minimizePanel_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/popupArrow_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/rename_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/restorePanel_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/runButton_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU32_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectFragment32_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectFragment_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectMemory32_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectMemory_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/sortAsc_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/sortDesc_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/tasklist/ui/resources/columnsSortedAsc_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/modules/tasklist/ui/resources/columnsSortedDesc_dark.gif delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slidebottom_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slidebottom_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slidebottom_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_maximize_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_minimize_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_pin_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_popup_disabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_popup_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_restore_group_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_disabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollright_disabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollright_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/arrow_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_pressed_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_rollover_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/quicksearch/findMenu_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/toolbar_arrow_horizontal_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/toolbar_arrow_vertical_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/win8_bigclose_enabled_dark.png delete mode 100644 modules/DarculaLAF/src/main/resources/org/openide/awt/resources/win8_bigclose_enabled_dark_old.png create mode 100644 modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/TiffImageIOHelper.java create mode 100644 modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TiffImageIOHelper.java create mode 100644 modules/LargeVolumeViewer/src/test/java/org/janelia/workstation/gui/large_volume_viewer/TiffRoundTripTest.java create mode 100644 modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TiffImageIOHelper.java create mode 100644 modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TiffImageIOHelper.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index d008aea28e..385900efe5 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,10 +21,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '8' + java-version: '21' distribution: 'zulu' cache: maven - name: Build with Maven diff --git a/.gitignore b/.gitignore index 458f62e794..22b5d42e04 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ private local modules/DataBrowser/src/main/resources/my*.properties modules/Core/src/main/resources/my*.properties* +.claude \ No newline at end of file diff --git a/modules/AdministrationGUI/pom.xml b/modules/AdministrationGUI/pom.xml index 770f5d301a..07028653be 100644 --- a/modules/AdministrationGUI/pom.xml +++ b/modules/AdministrationGUI/pom.xml @@ -111,7 +111,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/ColorDepthSearch/pom.xml b/modules/ColorDepthSearch/pom.xml index d14f546fa3..a42a401382 100644 --- a/modules/ColorDepthSearch/pom.xml +++ b/modules/ColorDepthSearch/pom.xml @@ -82,7 +82,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/CommonGUI/pom.xml b/modules/CommonGUI/pom.xml index 24ce314eae..f2b3273279 100644 --- a/modules/CommonGUI/pom.xml +++ b/modules/CommonGUI/pom.xml @@ -124,7 +124,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/CommonGUI/src/main/java/org/janelia/workstation/common/gui/progress/SharedProgressBarUI.java b/modules/CommonGUI/src/main/java/org/janelia/workstation/common/gui/progress/SharedProgressBarUI.java index 02dff80f2e..4874a59b89 100644 --- a/modules/CommonGUI/src/main/java/org/janelia/workstation/common/gui/progress/SharedProgressBarUI.java +++ b/modules/CommonGUI/src/main/java/org/janelia/workstation/common/gui/progress/SharedProgressBarUI.java @@ -3,8 +3,7 @@ import org.eclipse.jetty.util.ConcurrentHashSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sun.swing.DefaultLookup; - +import javax.swing.UIManager; import javax.swing.BoundedRangeModel; import javax.swing.JComponent; import javax.swing.JProgressBar; @@ -459,7 +458,8 @@ private int getRepaintInterval() { } private int initRepaintInterval() { - repaintInterval = DefaultLookup.getInt(progressBar, this, "ProgressBar.repaintInterval", 50); + repaintInterval = UIManager.getInt("ProgressBar.repaintInterval"); + if (repaintInterval == 0) repaintInterval = 50; return repaintInterval; } @@ -478,7 +478,8 @@ private int initRepaintInterval() { // } private int initCycleTime() { - cycleTime = DefaultLookup.getInt(progressBar, this, "ProgressBar.cycleTime", 3000); + cycleTime = UIManager.getInt("ProgressBar.cycleTime"); + if (cycleTime == 0) cycleTime = 3000; return cycleTime; } diff --git a/modules/CommonLibraries/pom.xml b/modules/CommonLibraries/pom.xml index 0cdb1d1406..71daedd8d5 100644 --- a/modules/CommonLibraries/pom.xml +++ b/modules/CommonLibraries/pom.xml @@ -76,11 +76,6 @@ jai-core 1.1.3 - - com.sun.media - jai-codec - 1.1.3 - com.twelvemonkeys.imageio @@ -382,7 +377,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin @@ -456,7 +451,6 @@ com.google.common.reflect com.google.common.util.concurrent com.google.gwt.user.client.rpc - com.sun.media.jai.codec com.twelvemonkeys com.twelvemonkeys.image com.twelvemonkeys.io diff --git a/modules/Core/pom.xml b/modules/Core/pom.xml index 2aba38c292..9eee847c86 100644 --- a/modules/Core/pom.xml +++ b/modules/Core/pom.xml @@ -99,6 +99,34 @@ test + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.3 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.8 + runtime + + + jakarta.activation + jakarta.activation-api + 1.2.2 + + + jakarta.xml.ws + jakarta.xml.ws-api + 2.3.3 + + + jakarta.jws + jakarta.jws-api + 2.1.0 + + @@ -171,7 +199,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/Core/src/main/java/org/janelia/workstation/core/filecache/AbstractWebDav.java b/modules/Core/src/main/java/org/janelia/workstation/core/filecache/AbstractWebDav.java index 3813984d85..185f5e165d 100644 --- a/modules/Core/src/main/java/org/janelia/workstation/core/filecache/AbstractWebDav.java +++ b/modules/Core/src/main/java/org/janelia/workstation/core/filecache/AbstractWebDav.java @@ -1,7 +1,5 @@ package org.janelia.workstation.core.filecache; -import com.sun.org.apache.xpath.internal.operations.Mult; - import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.http.HttpStatus; diff --git a/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java b/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java index 748b730082..eceb7fe367 100644 --- a/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java +++ b/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java @@ -24,8 +24,8 @@ public class SystemInfo { public static final String JAVA_VERSION = System.getProperty("java.version", "unknown"); public static final String JAVA_RUNTIME_NAME = System.getProperty("java.runtime.name", "Java"); public static final String JAVA_RUNTIME_VERSION = System.getProperty("java.runtime.version", "unknown"); - public static final String ARCH_DATA_MODEL = System.getProperty("sun.arch.data.model"); - public static final String SUN_DESKTOP = System.getProperty("sun.desktop"); + public static final String ARCH_DATA_MODEL = System.getProperty("sun.arch.data.model", "64"); + public static final String SUN_DESKTOP = System.getProperty("sun.desktop", ""); public static final String DOWNLOADS_DIR = "Downloads"; public static final String WORKSTATION_FILES_DIR = "Workstation"; @@ -45,8 +45,8 @@ public class SystemInfo { public static final boolean isLinux = OS_NAME_LC.startsWith("linux"); public static final boolean isUnix = !isWindows && !isOS2; - public static final boolean isKDE = SUN_DESKTOP != null && SUN_DESKTOP.toLowerCase().contains("kde"); - public static final boolean isGnome = SUN_DESKTOP != null && SUN_DESKTOP.toLowerCase().contains("gnome"); + public static final boolean isKDE = SUN_DESKTOP.toLowerCase().contains("kde"); + public static final boolean isGnome = SUN_DESKTOP.toLowerCase().contains("gnome"); public static final boolean isMacSystemMenu = isMac && "true".equals(System.getProperty("apple.laf.useScreenMenuBar")); @@ -140,28 +140,40 @@ public static String getInstallDir() { return cp.substring(0,cp.indexOf("JaneliaWorkstation")+"JaneliaWorkstation".length()); } - private static com.sun.management.OperatingSystemMXBean getOSMXBean() { - java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean(); - com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean; - return sunmxbean; + private static java.lang.management.OperatingSystemMXBean getOSMXBean() { + return java.lang.management.ManagementFactory.getOperatingSystemMXBean(); } public static Long getTotalSystemMemory() { try { - return getOSMXBean().getTotalPhysicalMemorySize(); + java.lang.management.OperatingSystemMXBean mxbean = getOSMXBean(); + // JDK 14+ public API: getTotalMemorySize(); earlier public alias is getTotalPhysicalMemorySize on com.sun. + // Use reflection so the code compiles cleanly against the standard API on both JDK 14+ and earlier. + try { + return (Long) mxbean.getClass().getMethod("getTotalMemorySize").invoke(mxbean); + } catch (NoSuchMethodException e2) { + // Fallback for JDK < 14 (should not happen on JDK 21) + return (Long) mxbean.getClass().getMethod("getTotalPhysicalMemorySize").invoke(mxbean); + } } catch (Throwable e) { - log.error("Could not retrieve total system memory",e); + log.error("Could not retrieve total system memory", e); return null; } } public static Long getFreeSystemMemory() { try { - return getOSMXBean().getFreePhysicalMemorySize(); + java.lang.management.OperatingSystemMXBean mxbean = getOSMXBean(); + try { + return (Long) mxbean.getClass().getMethod("getFreeMemorySize").invoke(mxbean); + } catch (NoSuchMethodException e2) { + // Fallback for JDK < 14 + return (Long) mxbean.getClass().getMethod("getFreePhysicalMemorySize").invoke(mxbean); + } } catch (Throwable e) { - log.error("Could not retrieve total system memory",e); + log.error("Could not retrieve free system memory", e); return null; } } diff --git a/modules/DarculaLAF/pom.xml b/modules/DarculaLAF/pom.xml deleted file mode 100644 index e23287914c..0000000000 --- a/modules/DarculaLAF/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - 4.0.0 - - org.janelia - workstation - 9.21 - ../.. - - - DarculaLAF - org.janelia.workstation - darcula - 9.21 - nbm - - - - - - org.janelia.thirdparty - custom-darcula - 1.0.0 - - - - - org.netbeans.api - org-netbeans-modules-options-api - - - org.netbeans.api - org-netbeans-swing-plaf - - - org.netbeans.api - org-openide-awt - - - org.netbeans.api - org-openide-dialogs - - - org.netbeans.api - org-openide-modules - - - org.netbeans.api - org-openide-util - - - org.netbeans.api - org-openide-util-lookup - - - org.netbeans.api - org-openide-util-ui - - - org.netbeans.api - org-openide-windows - - - - - - - - org.codehaus.mojo - nbm-maven-plugin - - - - - diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarculaLFCustoms.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarculaLFCustoms.java deleted file mode 100644 index 8e8496f74f..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarculaLFCustoms.java +++ /dev/null @@ -1,879 +0,0 @@ -package com.revivius.nb.darcula; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Insets; -import java.awt.event.KeyEvent; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.prefs.Preferences; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.InputMap; -import javax.swing.KeyStroke; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.border.MatteBorder; -import javax.swing.plaf.ColorUIResource; - -import org.netbeans.swing.plaf.LFCustoms; -import org.openide.util.ImageUtilities; -import org.openide.util.Lookup; -import org.openide.util.NbPreferences; - -import com.revivius.nb.darcula.options.DarculaLAFOptionsPanelController; -import com.revivius.nb.darcula.options.DarculaLAFPanel; -import com.revivius.nb.darcula.ui.InreasedInsetsTableHeaderBorder; -import com.revivius.nb.darcula.ui.ReducedInsetsDarculaButtonPainter; - -import sun.swing.SwingLazyValue; - -/** - * LFCustoms for Darcula LAF. - * - * KR: Edited to comment out anything that is not needed by the Janelia Workstation, - * mainly IDE/editor features that are not imported by our project and cause errors. - * - * @author Revivius - */ -public class DarculaLFCustoms extends LFCustoms { - - private static final String FONT_DEFAULT_NAME = "Dialog"; - private static final int FONT_DEFAULT_SIZE = 12; - public static final String DEFAULT_FONT = FONT_DEFAULT_NAME + " " + FONT_DEFAULT_SIZE; - - private static final String TAB_FOCUS_FILL_UPPER = "tab_focus_fill_upper"; //NOI18N - private static final String TAB_FOCUS_FILL_LOWER = "tab_focus_fill_lower"; //NOI18N - - private static final String TAB_UNSEL_FILL_UPPER = "tab_unsel_fill_upper"; //NOI18N - private static final String TAB_UNSEL_FILL_LOWER = "tab_unsel_fill_lower"; //NOI18N - - private static final String TAB_SEL_FILL = "tab_sel_fill"; //NOI18N - - private static final String TAB_MOUSE_OVER_FILL_UPPER = "tab_mouse_over_fill_upper"; //NOI18N - private static final String TAB_MOUSE_OVER_FILL_LOWER = "tab_mouse_over_fill_lower"; //NOI18N - - private static final String TAB_ATTENTION_FILL_UPPER = "tab_attention_fill_upper"; //NOI18N - private static final String TAB_ATTENTION_FILL_LOWER = "tab_attention_fill_lower"; //NOI18N - - private static final String TAB_BORDER = "tab_border"; //NOI18N - private static final String TAB_SEL_BORDER = "tab_sel_border"; //NOI18N - private static final String TAB_BORDER_INNER = "tab_border_inner"; //NOI18N - - @Override - public Object[] createGuaranteedKeysAndValues() { - // same color for DarculaMetalTheme getAcceleratorForeground() - Color asfg = new ColorUIResource(187, 187, 187); - - Object[] result = { - "controlShadow", new ColorUIResource(41, 43, 45), - "controlHighlight", new ColorUIResource(70, 72, 74), - "controlDkShadow", new ColorUIResource(41, 43, 45), - "controlLtHighlight", new ColorUIResource(70, 72, 74), - - "Menu.acceleratorSelectionForeground", asfg, - "MenuItem.acceleratorSelectionForeground", asfg, - "CheckBoxMenuItem.acceleratorSelectionForeground", asfg, - "RadioButtonMenuItem.acceleratorSelectionForeground", asfg - }; - - return result; - } - - @Override - public Object[] createLookAndFeelCustomizationKeysAndValues() { - Preferences prefs = NbPreferences.forModule(DarculaLAFPanel.class); - boolean useStretchedTabs = prefs.getBoolean(DarculaLAFOptionsPanelController.STRETCHED_TABS_BOOLEAN, false); - if (useStretchedTabs) { - // stretch view tabs - System.setProperty("winsys.stretching_view_tabs", "true"); - // stretching view tabs seems to be causing resize problems - System.setProperty("NB.WinSys.Splitter.Respect.MinimumSize.Enabled", "false"); - } - - Font controlFont = Font.decode(DEFAULT_FONT); - Integer in = (Integer) UIManager.get(CUSTOM_FONT_SIZE); //NOI18N - if (in != null) { - controlFont = Font.decode(FONT_DEFAULT_NAME + " " + in); - } - - boolean overrideFontOption = prefs.getBoolean(DarculaLAFOptionsPanelController.OVERRIDE_FONT_BOOLEAN, false); - if (overrideFontOption) { - String fontOption = prefs.get(DarculaLAFOptionsPanelController.FONT_STRING, DEFAULT_FONT); - controlFont = Font.decode(fontOption); - } - - /** - * HtmlLabelUI sets the border color to BLUE for focused cells if - * "Tree.selectionBorderColor" is same as background color (see lines - * 230 - 247). Here we modify "Tree.selectionBorderColor" slightly. - * Modification is not noticable to naked eye but enough to stop - * HtmlLabelUI to set focused renderer border color to BLUE. - */ - Color c = UIManager.getColor("Tree.selectionBackground"); - Color focusColor = new Color(c.getRed(), c.getGreen(), c.getBlue() + 1); - - Color foreground1 = new Color(220, 220, 220); // Brightest foreground, for sparse, important things - Color foreground2 = new Color(200, 200, 200); // Dimmer foreground, for things that shouldn't pop as much - Color foreground3 = new Color(190, 190, 190); // Ever dimmer foreground, for things that might be very dense like tables - Color foreground4 = new Color(110, 110, 110); // Dimmest foreground, for disabled items - - Object[] result = { - // The assorted standard NetBeans metal font customizations - CONTROLFONT, controlFont, - SYSTEMFONT, controlFont, - USERFONT, controlFont, - MENUFONT, controlFont, - WINDOWTITLEFONT, controlFont, - SUBFONT, controlFont.deriveFont(Font.PLAIN, Math.min(controlFont.getSize() - 1, 6)), - - - //################################################################################################################## - // Begin customizations for Janelia Workstation - //################################################################################################################## - - // Make all the common labels slightly brighter - "Label.foreground", foreground1, - "CheckBox.foreground", foreground2, - "ProgressBar.foreground", foreground2, - "RadioButton.foreground", foreground2, - - // Menus - "Menu.foreground", foreground2, - "MenuItem.foreground", foreground2, - "CheckBoxMenuItem.foreground", foreground2, - "RadioButtonMenuItem.foreground", foreground2, - "PopupMenu.foreground", foreground2, - - // Disabled menus - "Menu.disabledForeground", foreground4, - "MenuItem.disabledForeground", foreground4, - "CheckBoxMenuItem.disabledForeground", foreground4, - "RadioButtonMenuItem.disabledForeground", foreground4, - "PopupMenu.disabledForeground", foreground4, - - // Menu accelerators - "Menu.acceleratorForeground", foreground4, - "MenuItem.acceleratorForeground", foreground4, - "CheckBoxMenuItem.acceleratorForeground", foreground4, - "RadioButtonMenuItem.acceleratorForeground", foreground4, - - // Explorer trees - "Tree.foreground", foreground1, - "Tree.textForeground", foreground1, - - // Tables - "Table.foreground", foreground3, - "TableHeader.foreground", foreground2, - "Table.cellNoFocusBorder", new TransparentBorder(), - "Table.focusSelectedCellHighlightBorder", new TransparentBorder(), - - // Fix for submenus - "MenuUI", "com.revivius.nb.darcula.ui.FixedMenuUI", - "MenuItemUI", "com.revivius.nb.darcula.ui.FixedMenuItemUIBase", - "RadioButtonMenuItemUI", "com.revivius.nb.darcula.ui.FixedRadioButtonMenuItemUI", - "CheckBoxMenuItemUI", "com.revivius.nb.darcula.ui.FixedCheckBoxMenuItemUI", - - // Fix for table - "TableHeaderUI", "com.revivius.nb.darcula.ui.FixedTableHeaderUI", - - //################################################################################################################## - // End customizations for Janelia Workstation - //################################################################################################################## - - - // Bug in JDK 1.5 thru b59 - pale blue is incorrectly returned for this - "textInactiveText", Color.GRAY, - - /** - * Work around a bug in windows which sets the text area font to - * "MonoSpaced", causing all accessible dialogs to have monospaced text - */ - "TextArea.font", new GuaranteedValue("Label.font", controlFont), - - /** - * HtmlLabelUI uses UIManager.getColor("text") to find background - * color for unselected items. Make sure the background color used - * by HtmlLabelUI is same with the LAF. - */ - "text", new Color(60, 63, 65), - "textText", new Color(187, 187, 187), - "infoText", new Color(187, 187, 187), - - "TabbedPaneUI", "com.revivius.nb.darcula.ui.DarkScrollButtonTabbedPaneUI", - - "LabelUI", "com.revivius.nb.darcula.ui.OptionsAwareLabelUI", - "Label.font", controlFont, - - "ButtonUI", "com.revivius.nb.darcula.ui.ContentAreaAwareButtonUI", - "Button.border", new ReducedInsetsDarculaButtonPainter(), - "Button.font", controlFont, - - "ToggleButtonUI", "com.revivius.nb.darcula.ui.ContentAreaAwareToggleButtonUI", - "ToggleButton.border", new ReducedInsetsDarculaButtonPainter(), - "ToggleButton.font", controlFont, - - "ToolBarUI", "com.revivius.nb.darcula.ui.RolloverToolBarUI", - "ToolBar.font", controlFont, - - "SplitPaneUI", "com.revivius.nb.darcula.ui.DarculaSplitPaneUI", - - SPINNERFONT, controlFont, - "Spinner.font", controlFont, - - /** - * #31 - * Icon provided by Aqua LAF is not visible on dark background - * provide default Metal arrow icon for all LAFs - */ - "Menu.arrowIcon", new SwingLazyValue("javax.swing.plaf.metal.MetalIconFactory", "getMenuArrowIcon"), - "Menu.acceleratorFont", controlFont, - "Menu.font", controlFont, - - "Table.font", controlFont, - "Table.ascendingSortIcon", new ImageIcon(DarculaLFCustoms.class.getResource("column-asc.png")), - "Table.descendingSortIcon", new ImageIcon(DarculaLFCustoms.class.getResource("column-desc.png")), - "Table.focusCellHighlightBorder", new TransparentBorder(), - - "TableHeader.cellBorder", new InreasedInsetsTableHeaderBorder(), - "TableHeader.font", controlFont, - - "TitledBorder.border", BorderFactory.createLineBorder(new Color(41, 43, 45), 1), - "TitledBorder.font", controlFont, - - "MenuItem.acceleratorForeground", new Color(238, 238, 238), - "MenuItem.acceleratorFont", controlFont, - "MenuItem.font", controlFont, - - LISTFONT, controlFont, - "List.font", controlFont, - "List.focusCellHighlightBorder", new TransparentBorder(), - - "TreeUI", "com.revivius.nb.darcula.ui.IndentAwareTreeUI", - TREEFONT, controlFont, - "Tree.font", controlFont, - "Tree.closedIcon", new ImageIcon(DarculaLFCustoms.class.getResource("open.png")), - "Tree.openIcon", new ImageIcon(DarculaLFCustoms.class.getResource("open.png")), - "Tree.selectionBorderColor", focusColor, // Use calculateD border color for HtmlLabelUI. - - // FileChooser icons - "FileView.directoryIcon", new ImageIcon(DarculaLFCustoms.class.getResource("closed.png")), - "FileView.fileIcon", new ImageIcon(DarculaLFCustoms.class.getResource("file.png")), - - "FileChooser.newFolderIcon", new ImageIcon(DarculaLFCustoms.class.getResource("newFolder.png")), - "FileChooser.upFolderIcon", new ImageIcon(DarculaLFCustoms.class.getResource("upFolder.png")), - "FileChooser.homeFolderIcon", new ImageIcon(DarculaLFCustoms.class.getResource("homeFolder.png")), - "FileChooser.detailsViewIcon", new ImageIcon(DarculaLFCustoms.class.getResource("detailsView.png")), - "FileChooser.listViewIcon", new ImageIcon(DarculaLFCustoms.class.getResource("listView.png")), - "FileChooser.computerIcon", new ImageIcon(DarculaLFCustoms.class.getResource("computer.png")), - "FileChooser.hardDriveIcon", new ImageIcon(DarculaLFCustoms.class.getResource("hardDrive.png")), - "FileChooser.floppyDriveIcon", new ImageIcon(DarculaLFCustoms.class.getResource("floppyDrive.png")), - - "CheckBox.font", controlFont, - "CheckBoxMenuItem.acceleratorFont", controlFont, - "CheckBoxMenuItem.font", controlFont, - "CheckBoxMenuItem.acceleratorForeground", new Color(238, 238, 238), - - "ColorChooser.font", controlFont, - - "ComboBox.font", controlFont, - - "EditorPane.font", controlFont, - - "FormattedTextField.font", controlFont, - - "IconButton.font", controlFont, - - "InternalFrame.optionDialogTitleFont", controlFont, - "InternalFrame.paletteTitleFont", controlFont, - "InternalFrame.titleFont", controlFont, - - "MenuBar.font", controlFont, - - "OptionPane.buttonFont", controlFont, - "OptionPane.font", controlFont, - "OptionPane.messageFont", controlFont, - "OptionPane.messageForeground", new Color(187, 187, 187), - - PANELFONT, controlFont, - "Panel.font", controlFont, - - "PasswordField.font", controlFont, - - "PopupMenu.font", controlFont, - - "ProgressBar.font", controlFont, - - "RadioButton.font", controlFont, - "RadioButtonMenuItem.acceleratorFont", controlFont, - "RadioButtonMenuItem.font", controlFont, - "RadioButtonMenuItem.acceleratorForeground", new Color(238, 238, 238), - - "ScrollPane.font", controlFont, - - "Slider.font", controlFont, - - "TabbedPane.font", controlFont, - //"TabbedPane.smallFont", controlFont, - - "TextArea.font", controlFont, - - "TextField.font", controlFont, - - "TextPane.font", controlFont, - - "ToolTip.font", controlFont, - "ToolTip.border", BorderFactory.createLineBorder(new Color(154, 154, 102)), - "ToolTip.borderInactive", BorderFactory.createLineBorder(new Color(154, 154, 102)), - "ToolTip.foregroundInactive", new Color(187, 187, 187), - "ToolTip.backgroundInactive", new Color(92, 92, 66), - - "Viewport.font", controlFont, - }; - - removeEnterFromTreeInputMap(); - - // KR: disable these because we don't use any editors, so it causes errors during L&F initialization -// replaceSearchNotFoundColor(); -// replaceGlyphGutterLineColor(); -// replaceFormDesignerGapBorderColors(); - - replaceLFCustomsTextFgColors(); -// replaceCompletionColors(); -// replaceSQLCompletionColumnColor(); -// replaceJSPCompletionColor(); -// replaceHTMLCompletionColor(); -// replaceCSSPreprocessorCompletionColors(); -// replaceProjectTabColors(); - - return result; - } - - @Override - public Object[] createApplicationSpecificKeysAndValues() { - UIBootstrapValue editorTabsUI = new Windows8EditorColorings( - "org.netbeans.swing.tabcontrol.plaf.Windows8EditorTabDisplayerUI"); - Object viewTabsUI = editorTabsUI.createShared( - "org.netbeans.swing.tabcontrol.plaf.Windows8ViewTabDisplayerUI"); - Object propertySheetValues = new Windows8PropertySheetColorings(); - - Object[] result = { - - - //################################################################################################################## - // Begin customizations for Janelia Workstation - //################################################################################################################## - - // Domain explorer trees - "ws.TreeSecondaryLabel", new Color(172, 145, 83), // Yellowish label for displaying the owner of each node - "ws.TreeExtraLabel", new Color(175, 170, 157), // A third (less-important) label which might contain the size or type of the node - "ws.ComponentBorderColor", new Color(41, 43, 45), - - //################################################################################################################## - // End customizations for Janelia Workstation - //################################################################################################################## - - - // enable _dark postfix for resource loading - "nb.dark.theme", Boolean.TRUE, - "nb.wizard.hideimage", Boolean.TRUE, - - // main toolbar - "Nb.MainWindow.Toolbar.Dragger", "com.revivius.nb.darcula.ToolbarXP", - "Nb.MainWindow.Toolbar.Border", BorderFactory.createMatteBorder(1, 0, 0, 0, new Color(41, 43, 45)), - "Nb.ToolBar.border", BorderFactory.createEmptyBorder(), - - EDITOR_TAB_DISPLAYER_UI, editorTabsUI, - VIEW_TAB_DISPLAYER_UI, viewTabsUI, - SLIDING_BUTTON_UI, "org.netbeans.swing.tabcontrol.plaf.WinXPSlidingButtonUI", - PROPERTYSHEET_BOOTSTRAP, propertySheetValues, - - SCROLLPANE_BORDER, BorderFactory.createLineBorder(new Color(41, 43, 45)), - SCROLLPANE_BORDER_COLOR, new Color(41, 43, 45), - - EDITOR_TOOLBAR_BORDER, BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(41, 43, 45)), - EDITOR_ERRORSTRIPE_SCROLLBAR_INSETS, new Insets(16, 0, 16, 0), - - DESKTOP_BACKGROUND, Color.RED, - DESKTOP_BORDER, BorderFactory.createEmptyBorder(), - WORKPLACE_FILL, Color.RED, - - DESKTOP_SPLITPANE_BORDER, BorderFactory.createEmptyBorder(), - SPLIT_PANE_DIVIDER_SIZE_VERTICAL, 2, - SPLIT_PANE_DIVIDER_SIZE_HORIZONTAL, 2, - - WARNING_FOREGROUND, new Color(254, 183, 24), - ERROR_FOREGROUND, new Color(255, 102, 102), - - // quicksearch - "nb.quicksearch.border", BorderFactory.createEmptyBorder(), - - // progress ui - "nb.progress.cancel.icon", ImageUtilities.loadImage("org/openide/awt/resources/mac_close_rollover_dark.png", false), - "nb.progress.cancel.icon.mouseover", ImageUtilities.loadImage("org/openide/awt/resources/mac_close_enabled_dark.png", false), - "nb.progress.cancel.icon.pressed", ImageUtilities.loadImage("org/openide/awt/resources/mac_close_pressed_dark.png", false), - - // explorer views - "nb.explorer.unfocusedSelBg", new Color(13, 41, 62), - "nb.explorer.unfocusedSelFg", new Color(187, 187, 187), - "nb.explorer.noFocusSelectionBackground", new Color(13, 41, 62), - "nb.explorer.noFocusSelectionForeground", new Color(187, 187, 187), - "ETableHeader.ascendingIcon", new ImageIcon(DarculaLFCustoms.class.getResource("column-asc.png")), - "ETableHeader.descendingIcon", new ImageIcon(DarculaLFCustoms.class.getResource("column-desc.png")), - - // popup switcher - "nb.popupswitcher.border", BorderFactory.createLineBorder(new Color(45, 45, 45)), - - // debugger - "nb.debugger.debugging.currentThread", new Color(30, 80, 28), - "nb.debugger.debugging.highlightColor", new Color(40, 60, 38), - "nb.debugger.debugging.BPHits", new Color(65, 65, 0), - "nb.debugger.debugging.bars.BPHits", new Color(120, 120, 25), - "nb.debugger.debugging.bars.currentThread", new Color(40, 100, 35), - - // heapview - "nb.heapview.border1", new Color(113, 113, 113), - "nb.heapview.border2", new Color(91, 91, 95), - "nb.heapview.border3", new Color(128, 128, 128), - "nb.heapview.foreground", new Color(222, 222, 222), - "nb.heapview.background1", new Color(53, 56, 58), - "nb.heapview.background2", new Color(50, 66, 114), - "nb.heapview.grid1.start", new Color(97, 95, 87), - "nb.heapview.grid1.end", new Color(98, 96, 88), - "nb.heapview.grid2.start", new Color(99, 97, 90), - "nb.heapview.grid2.end", new Color(101, 99, 92), - "nb.heapview.grid3.start", new Color(102, 101, 93), - "nb.heapview.grid3.end", new Color(105, 103, 95), - "nb.heapview.grid4.start", new Color(107, 105, 97), - "nb.heapview.grid4.end", new Color(109, 107, 99), - - // bug tracking - "nb.bugtracking.comment.background", new Color(59, 63, 64), - "nb.bugtracking.comment.foreground", new Color(187, 187, 187), - "nb.bugtracking.label.highlight", new Color(205, 205, 0), - "nb.bugtracking.table.background", new Color(59, 63, 64), - "nb.bugtracking.table.background.alternate", new Color(69, 73, 74), - "nb.bugtracking.new.color", new Color(73, 210, 73), - "nb.bugtracking.modified.color", new Color(26, 184, 255), - "nb.bugtracking.obsolete.color", new Color(142, 142, 142), - "nb.bugtracking.conflict.color", new Color(255, 100, 100), - - // db.dataview - "nb.dataview.table.gridbackground", UIManager.getColor("Table.gridColor"), - "nb.dataview.table.background", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.background"), - "nb.dataview.table.altbackground", new RelativeColor(new Color(0, 0, 0), new Color(30, 30, 30), "Table.background"), - "nb.dataview.table.sqlconstant.foreground", new Color(220, 220, 220), - "nb.dataview.tablecell.focused", /*new RelativeColor(new Color(0, 0, 0), new Color(10, 10, 30), "Table.selectionBackground"), */ new Color(13, 41, 62), - "nb.dataview.table.rollOverRowBackground", new RelativeColor(new Color(0, 0, 0), new Color(30, 30, 30), "Table.selectionBackground"), - "nb.dataview.tablecell.edited.selected.foreground", new Color(241, 255, 177), - "nb.dataview.tablecell.edited.unselected.foreground", /*new Color(0, 255, 16),*/ new Color(172, 221, 124), - "nb.dataview.jxdatetimepicker.background", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.background"), - "nb.dataview.jxdatetimepicker.foreground", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.foreground"), - "nb.dataview.jxdatetimepicker.selectedBackground", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.selectionBackground"), - "nb.dataview.jxdatetimepicker.selectedForeground", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.selectionForeground"), - "nb.dataview.jxdatetimepicker.daysOfTheWeekForeground", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "Table.background"), - "nb.dataview.jxdatetimepicker.todayBackground", new RelativeColor(new Color(0, 0, 0), new Color(20, 20, 20), "TableHeader.background"), - "nb.dataview.jxdatetimepicker.todayPanel.background.gradient.start", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "TableHeader.background"), - "nb.dataview.jxdatetimepicker.todayPanel.background.gradient.end", new RelativeColor(new Color(0, 0, 0), new Color(10, 10, 10), "TableHeader.background"), - "nb.dataview.jxdatetimepicker.todayPanel.linkForeground", new RelativeColor(new Color(0, 0, 0), new Color(0, 0, 0), "TableHeader.foreground"), - - // form designer - "nb.formdesigner.gap.fixed.color", new Color(70, 73, 75), - "nb.formdesigner.gap.resizing.color", new Color(66, 69, 71), - "nb.formdesigner.gap.min.color", new Color(78, 81, 83), - - // link - "nb.html.link.foreground", new Color(125, 160, 225), //NOI18N - "nb.html.link.foreground.hover", new Color(13, 41, 62), //NOI18N - "nb.html.link.foreground.visited", new Color(125, 160, 225), //NOI18N - "nb.html.link.foreground.focus", new Color(13, 41, 62), //NOI18N - - // startpage - "nb.startpage.defaultbackground", Boolean.TRUE, - "nb.startpage.defaultbuttonborder", Boolean.TRUE, - "nb.startpage.bottombar.background", new Color(13, 41, 62), - "nb.startpage.topbar.background", new Color(13, 41, 62), - "nb.startpage.border.color", new Color(13, 41, 62), - "nb.startpage.tab.border1.color", new Color(13, 41, 62), - "nb.startpage.tab.border2.color", new Color(13, 41, 62), - "nb.startpage.rss.details.color", new Color(187, 187, 187), - "nb.startpage.rss.header.color", new Color(125, 160, 225), - "nb.startpage.tab.imagename.selected", "org/netbeans/modules/welcome/resources/tab_selected_dark.png", //NOI18N - "nb.startpage.tab.imagename.rollover", "org/netbeans/modules/welcome/resources/tab_rollover_dark.png", //NOI18N - "nb.startpage.imagename.contentheader", "org/netbeans/modules/welcome/resources/content_banner_dark.png", //NOI18N - "nb.startpage.contentheader.color1", new Color(12, 33, 61), - "nb.startpage.contentheader.color2", new Color(16, 24, 42), - - // autoupdate - "nb.autoupdate.search.highlight", new Color(13, 41, 62), - - // notification displayer balloon - "nb.core.ui.balloon.defaultGradientStartColor", new Color(92, 92, 66), - "nb.core.ui.balloon.defaultGradientFinishColor", new Color(92, 92, 66), - "nb.core.ui.balloon.mouseOverGradientStartColor", new Color(92, 92, 66), - "nb.core.ui.balloon.mouseOverGradientFinishColor", new Color(92, 92, 66).brighter(), - - // git - "nb.versioning.added.color", new Color(73, 210, 73), - "nb.versioning.modified.color", new Color(26, 184, 255), - "nb.versioning.deleted.color", new Color(255, 175, 175), - "nb.versioning.conflicted.color", new Color(255, 100, 100), - "nb.versioning.ignored.color", new Color(142, 142, 142), - "nb.versioning.textannotation.color", Color.WHITE, - "nb.versioning.tooltip.background.color", new Color(92, 92, 66), - - // diff - "nb.diff.added.color", new Color(43, 85, 43), - "nb.diff.changed.color", new Color(40, 85, 112), - "nb.diff.deleted.color", new Color(85, 43, 43), - "nb.diff.applied.color", new Color(68, 113, 82), - "nb.diff.notapplied.color", new Color(67, 105, 141), - "nb.diff.unresolved.color", new Color(130, 30, 30), - "nb.diff.sidebar.deleted.color", new Color(85, 43, 43), - "nb.diff.sidebar.changed.color", new Color(30, 75, 112), - - // output - "nb.output.backgorund", new Color(43, 43, 43), - "nb.output.foreground", new Color(187, 187, 187), - "nb.output.input", new Color(0, 127, 0), - "nb.output.err.foreground", new Color(255, 107, 104), - "nb.output.link.foreground", new Color(126, 174, 241), - "nb.output.link.foreground.important", new Color(126, 174, 241), - "nb.output.warning.foreground", new Color(205, 205, 0), - "nb.output.failure.foreground", new Color(255, 107, 104), - "nb.output.success.foreground", new Color(112, 255, 112), - "nb.output.debug.foreground", new Color(145, 145, 145), - "textHighlight", new Color(240, 119, 70), - }; - - result = maybeEnableIconFilter(result); - - return result; - } - - private class Windows8EditorColorings extends UIBootstrapValue.Lazy { - - public Windows8EditorColorings(String name) { - super(name); - } - - @Override - public Object[] createKeysAndValues() { - return new Object[]{ - //selected & focused - TAB_FOCUS_FILL_UPPER, new Color(75, 110, 175), - TAB_FOCUS_FILL_LOWER, new Color(65, 81, 109), - - //no selection, no focus - TAB_UNSEL_FILL_UPPER, new Color(84, 88, 91), - TAB_UNSEL_FILL_LOWER, new Color(56, 58, 60), - - //selected, no focus - TAB_SEL_FILL, new Color(84, 88, 91), - - //no selection, mouse over - TAB_MOUSE_OVER_FILL_UPPER, new Color(114, 119, 122), - TAB_MOUSE_OVER_FILL_LOWER, new Color(98, 101, 104), - TAB_ATTENTION_FILL_UPPER, new Color(255, 255, 128), - TAB_ATTENTION_FILL_LOWER, new Color(230, 200, 64), - - TAB_BORDER, new Color(41, 43, 45), - TAB_SEL_BORDER, new Color(41, 43, 45), - TAB_BORDER_INNER, new Color(70, 72, 74), - - //Borders for the tab control - EDITOR_TAB_OUTER_BORDER, BorderFactory.createEmptyBorder(), - EDITOR_TAB_CONTENT_BORDER, BorderFactory.createCompoundBorder( - new MatteBorder(0, 1, 1, 1, new Color(41, 43, 45)), - BorderFactory.createEmptyBorder(0, 1, 0, 1) - ), - EDITOR_TAB_TABS_BORDER, BorderFactory.createEmptyBorder(), - VIEW_TAB_OUTER_BORDER, BorderFactory.createEmptyBorder(), - VIEW_TAB_CONTENT_BORDER, new MatteBorder(0, 1, 1, 1, new Color(41, 43, 45)), - VIEW_TAB_TABS_BORDER, BorderFactory.createEmptyBorder() - }; - } - } - - private class Windows8PropertySheetColorings extends UIBootstrapValue.Lazy { - - public Windows8PropertySheetColorings() { - super("propertySheet"); //NOI18N - } - - @Override - public Object[] createKeysAndValues() { - return new Object[]{ - PROPSHEET_BACKGROUND, new Color(69, 73, 74), - PROPSHEET_SELECTION_BACKGROUND, new Color(75, 110, 175), - PROPSHEET_SELECTION_FOREGROUND, Color.WHITE, - PROPSHEET_SET_BACKGROUND, new Color(82, 85, 86), - PROPSHEET_SET_FOREGROUND, Color.WHITE, - PROPSHEET_SELECTED_SET_BACKGROUND, new Color(75, 110, 175), - PROPSHEET_SELECTED_SET_FOREGROUND, Color.WHITE, - PROPSHEET_DISABLED_FOREGROUND, new Color(161, 161, 146), - PROPSHEET_BUTTON_FOREGROUND, new Color(187, 187, 187),}; - } - } - - /** - * Enables invert filter for icons if user requested. - */ - private Object[] maybeEnableIconFilter(Object[] defaults) { - if (NbPreferences.forModule(DarculaLAFPanel.class).getBoolean("invertIcons", false)) { - return appendToArray(defaults, "nb.imageicon.filter", new DarkIconFilter()); - } - return defaults; - } - - private Object[] appendToArray(Object[] result, final String key, final Object value) { - result = Arrays.copyOf(result, result.length + 2); - result[result.length - 2] = key; - result[result.length - 1] = value; - return result; - } - - /** - * DarculaLaf:L354-L358 registers ENTER to invoke 'toggle' action. This seems - * to cause problems as reported in #14 because enter key can not invoke - * default button in dialogs. - */ - private void removeEnterFromTreeInputMap() { - // Make ENTER work in JTrees - InputMap treeInputMap = (InputMap) UIManager.get("Tree.focusInputMap"); - if (treeInputMap != null) { // it's really possible. For example, GTK+ doesn't have such map - treeInputMap.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)); - } - } - - /** - * NOT_FOUND color is hardcoded, should be taken from UIManager. - * Use reflection as in DefaultOutlineCellRenderer. - */ - private static final String SEARCH_BAR_CLASS = "org.netbeans.modules.editor.search.SearchBar"; - private static final String NOT_FOUND_COLOR_FIELD = "NOT_FOUND"; - private void replaceSearchNotFoundColor() { - replaceFieldValue(SEARCH_BAR_CLASS, NOT_FOUND_COLOR_FIELD, new Color(255, 102, 102)); - } - - /** - * DEFAULT_GUTTER_LINE color is hardcoded, should be taken from UIManager. - * Use reflection as in DefaultOutlineCellRenderer. - */ - private static final String GLYPH_GUUTER_CLASS = "org.netbeans.editor.GlyphGutter"; - private static final String DEFAULT_GUTTER_LINE_COLOR_FIELD = "DEFAULT_GUTTER_LINE"; - private void replaceGlyphGutterLineColor() { - replaceFieldValue(GLYPH_GUUTER_CLASS, DEFAULT_GUTTER_LINE_COLOR_FIELD, new Color(136, 136, 136)); - } - - /** - * GAP_BORDER_COLOR and SAW_COLOR are hardcoded, should be taken from UIManager. - * Use reflection as in DefaultOutlineCellRenderer. - */ - private static final String FORMDESIGNER_LAYOUT_PAINTER_CLASS = "org.netbeans.modules.form.layoutdesign.LayoutPainter"; - private static final String GAP_BORDER_COLOR_FIELD = "gapBorderColor"; - private static final String SAW_COLOR_FIELD = "sawColor"; - private void replaceFormDesignerGapBorderColors() { - replaceFieldValue(FORMDESIGNER_LAYOUT_PAINTER_CLASS, GAP_BORDER_COLOR_FIELD, new Color(49, 53, 54)); - replaceFieldValue(FORMDESIGNER_LAYOUT_PAINTER_CLASS, SAW_COLOR_FIELD, new Color(49, 53, 54)); - } - - /** - * LFCustoms.getTextFgColor() && LFCustoms.getTextFgColorHTML() uses - * windowText. DarculaLaf does not override windowText which is initialized - * to Color.BLACK by BasicLookAndFeel (DarculaLaf uses BasicLookAndFeel - * with reflection) - */ - private static final String TEXT_FG_COLOR_HTML_FIELD = "textFgColorHTML"; - private static final String TEXT_FG_COLOR_FIELD = "textFgColor"; - private void replaceLFCustomsTextFgColors() { - replaceFieldValue(LFCustoms.class, TEXT_FG_COLOR_FIELD, new Color(187, 187, 187)); - replaceFieldValue(LFCustoms.class, TEXT_FG_COLOR_HTML_FIELD, ""); - } - - /** - * #21, #26 - * fixes code completion colors for all languages (at least for those extending GsfCompletionItem) - */ - private static final String GSF_COMPLETION_FORMATTER_CLASS = "org.netbeans.modules.csl.editor.completion.GsfCompletionItem$CompletionFormatter"; - private static final String PARAMETER_NAME_COLOR_FIELD = "PARAMETER_NAME_COLOR"; //getHTMLColor(160, 96, 1); - private static final String CLASS_COLOR_FIELD = "CLASS_COLOR"; // getHTMLColor(86, 0, 0); - private static final String PKG_COLOR_FIELD = "PKG_COLOR"; // getHTMLColor(128, 128, 128); - private static final String KEYWORD_COLOR_FIELD = "KEYWORD_COLOR"; //getHTMLColor(0, 0, 153); - private static final String FIELD_COLOR_FIELD = "FIELD_COLOR"; // getHTMLColor(0, 134, 24); - private static final String VARIABLE_COLOR_FIELD = "VARIABLE_COLOR"; // getHTMLColor(0, 0, 124); - private static final String CONSTRUCTOR_COLOR_FIELD = "CONSTRUCTOR_COLOR"; // getHTMLColor(178, 139, 0); - private static final String INTERFACE_COLOR_FIELD = "INTERFACE_COLOR"; // getHTMLColor(64, 64, 64); - private static final String PARAMETERS_COLOR_FIELD = "PARAMETERS_COLOR"; // getHTMLColor(128, 128, 128); - private void replaceCompletionColors() { - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, PARAMETER_NAME_COLOR_FIELD, getHTMLColor(new Color(255, 198, 109))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, CLASS_COLOR_FIELD, getHTMLColor(new Color(214, 128, 128))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, PKG_COLOR_FIELD, getHTMLColor(new Color(128, 214, 128))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, KEYWORD_COLOR_FIELD, getHTMLColor(new Color(180, 180, 255))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, FIELD_COLOR_FIELD, getHTMLColor(new Color(0, 202, 88))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, VARIABLE_COLOR_FIELD, getHTMLColor(new Color(0, 192, 255))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, CONSTRUCTOR_COLOR_FIELD, getHTMLColor(new Color(178, 139, 0))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, INTERFACE_COLOR_FIELD, getHTMLColor(new Color(214, 128, 128))); - replaceFieldValue(GSF_COMPLETION_FORMATTER_CLASS, PARAMETERS_COLOR_FIELD, getHTMLColor(new Color(64, 128, 64))); - } - - /** - * #67, Column color for SQL - */ - private static final String SQL_COMPLETION_ITEM_CLASS = "org.netbeans.modules.db.sql.editor.completion.SQLCompletionItem"; - private static final String COLUMN_COLOR_FIELD = "COLUMN_COLOR"; // getHtmlColor(7, 7, 171); // NOI18N - private void replaceSQLCompletionColumnColor() { - replaceFieldValue(SQL_COMPLETION_ITEM_CLASS, COLUMN_COLOR_FIELD, getHTMLColor(new Color(0, 202, 88))); - } - - /** - * JSP completion colors - */ - private static final String JSP_COMPLETION_ITEM_CLASS = "org.netbeans.modules.web.core.syntax.completion.api.JspCompletionItem"; - private static final String JSP_COLOR_BASE_COMPLETION = "COLOR_BASE_COMPLETION"; - private void replaceJSPCompletionColor() { - replaceFieldValue(JSP_COMPLETION_ITEM_CLASS, JSP_COLOR_BASE_COMPLETION, new Color(204, 105, 50)); - } - - /** - * #106 - * HTML completion colors for HTML Tags and Custom Tags - */ - private static final String HTML_COMPLETION_ITEM_CLASS = "org.netbeans.modules.html.editor.api.completion.HtmlCompletionItem$Tag"; - private static final String CUSTOM_TAG_COMPLETION_ITEM_CLASS = "org.netbeans.modules.html.custom.CustomTagCompletionItem"; - private static final String HTML_DEFAULT_FG_COLOR = "DEFAULT_FG_COLOR"; - private void replaceHTMLCompletionColor() { - replaceFieldValue(HTML_COMPLETION_ITEM_CLASS, HTML_DEFAULT_FG_COLOR, new Color(232, 191, 106)); - replaceFieldValue(CUSTOM_TAG_COMPLETION_ITEM_CLASS, HTML_DEFAULT_FG_COLOR, new Color(64, 127, 255)); - } - - /** - * #91, CSS selector and preprocessor completion colors (LESS and SASS) - */ - private static final String CP_COMPLETION_ITEM_CLASS = "org.netbeans.modules.css.prep.editor.CPCompletionItem"; - private static final String CP_LHS_COLOR_FIELD = "COLOR"; - private static final String CP_RHS_COLOR_FIELD = "ORIGIN_COLOR"; - private void replaceCSSPreprocessorCompletionColors() { - replaceFieldValue(CP_COMPLETION_ITEM_CLASS, CP_LHS_COLOR_FIELD, new Color(0, 164, 164)); - replaceFieldValue(CP_COMPLETION_ITEM_CLASS, CP_RHS_COLOR_FIELD, new Color(255, 255, 255)); - } - - /** - * #85, #88 - * Tab colors for files belonging to same project - */ - private static final String PROJECT_COLOR_TAB_DECORATOR_CLASS = "org.netbeans.core.multitabs.impl.ProjectColorTabDecorator"; - private static final String BACKGROUND_COLORS_FIELD = "backGroundColors"; - private void replaceProjectTabColors() { - List backgroundColors = new ArrayList(); - backgroundColors.add(new Color(96, 135, 117)); - backgroundColors.add(new Color(135, 101, 101)); - backgroundColors.add(new Color(135, 127, 94)); - backgroundColors.add(new Color(96, 119, 135)); - backgroundColors.add(new Color(121, 135, 89)); - backgroundColors.add(new Color(135, 105, 89)); - backgroundColors.add(new Color(108, 135, 96)); - backgroundColors.add(new Color(107, 135, 38)); - backgroundColors.add(new Color(118, 89, 135)); - - replaceFieldValue(PROJECT_COLOR_TAB_DECORATOR_CLASS, BACKGROUND_COLORS_FIELD, backgroundColors); - } - - private static String getHTMLColor(Color c) { - return ""; //NOI18N - } - - private void replaceFieldValue(String className, String fieldName, Object value) { - - Class sbClass = null; - try { - sbClass = ClassLoader.getSystemClassLoader().loadClass(className); - } catch (ClassNotFoundException ex) { - try { - sbClass = Thread.currentThread().getContextClassLoader().loadClass(className); - } catch (ClassNotFoundException ex1) { - try { - ClassLoader systemClassLoader = (ClassLoader) Lookup.getDefault().lookup(ClassLoader.class); - if (systemClassLoader != null) { - - sbClass = systemClassLoader.loadClass(className); - } - } catch (ClassNotFoundException ex2) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not find class, will not be able to replace its field...", ex2); - } - } - } catch (SecurityException ex) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not find class, will not be able to replace its field...", ex); - } catch (IllegalArgumentException ex) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not find class, will not be able to replace its field...", ex); - } - - if (sbClass == null) { - return; - } - - replaceFieldValue(sbClass, fieldName, value); - - } - - private void replaceFieldValue(Class clazz, String fieldName, Object value) { - try { - Field field = clazz.getDeclaredField(fieldName); - - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - - field.set(null, value); - } catch (IllegalAccessException ex) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not replace field...", ex); - } catch (NoSuchFieldException ex) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not replace field...", ex); - } catch (SecurityException ex) { - Logger.getLogger(DarculaLFCustoms.class.getName()).log(Level.INFO, - "Can not replace field...", ex); - } - } - - /** - * Fixes https://github.com/Revivius/nb-darcula/issues/119 - * - * @author markiewb - */ - private static class TransparentBorder implements Border { - - @Override - public Insets getBorderInsets(Component c) { - // KR: add cell padding - return new Insets(5, 5, 5, 5); - } - - @Override - public boolean isBorderOpaque() { - return false; - } - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - } - } - -} \ No newline at end of file diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarkIconFilter.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarkIconFilter.java deleted file mode 100644 index a0967d28a7..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/DarkIconFilter.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright 2013 Oracle and/or its affiliates. All rights reserved. - * - * Oracle and Java are registered trademarks of Oracle and/or its affiliates. - * Other names may be trademarks of their respective owners. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common - * Development and Distribution License("CDDL") (collectively, the - * "License"). You may not use this file except in compliance with the - * License. You can obtain a copy of the License at - * http://www.netbeans.org/cddl-gplv2.html - * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the - * specific language governing permissions and limitations under the - * License. When distributing the software, include this License Header - * Notice in each file and include the License file at - * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the GPL Version 2 section of the License file that - * accompanied this code. If applicable, add the following below the - * License Header, with the fields enclosed by brackets [] replaced by - * your own identifying information: - * "Portions Copyrighted [year] [name of copyright owner]" - * - * If you wish your version of this file to be governed by only the CDDL - * or only the GPL Version 2, indicate your decision by adding - * "[Contributor] elects to include this software in this distribution - * under the [CDDL or GPL Version 2] license." If you do not indicate a - * single choice of license, a recipient has the option to distribute - * your version of this file under either the CDDL, the GPL Version 2 or - * to extend the choice of license to its licensees as provided above. - * However, if you add GPL Version 2 code and therefore, elected the GPL - * Version 2 license, then the option applies only if the new code is - * made subject to such option by the copyright holder. - * - * Contributor(s): - * - * Portions Copyrighted 2013 Sun Microsystems, Inc. - */ -package com.revivius.nb.darcula; - -import java.awt.Color; -import java.awt.image.RGBImageFilter; - -/** - * COPIED from o.n.swing.laf.dark\src\org\netbeans\swing\laf\dark\DarkIconFilter.java - * - * For dark LaFs it inverts icon brightness (=inverts icon image to obtain dark icon, - * then inverts its hue to restore original colors). - * - * @author P. Somol - */ -public class DarkIconFilter extends RGBImageFilter { - - /** in dark LaFs brighten all icons; 0.0f = no change, 1.0f = maximum brightening */ - private static final float DARK_ICON_BRIGHTEN = 0.1f; - - @Override - public int filterRGB(int x, int y, int color) { - int a = color & 0xff000000; - int rgb[] = decode(color); - int inverted[] = invert(rgb); - int result[] = invertHueBrighten(inverted, DARK_ICON_BRIGHTEN); - return a | encode(result); - } - - private int[] invert(int[] rgb) { - return new int[]{255-rgb[0], 255-rgb[1], 255-rgb[2]}; - } - - private int[] invertHueBrighten(int[] rgb, float brighten) { - float hsb[] = new float[3]; - Color.RGBtoHSB(rgb[0], rgb[1], rgb[2], hsb); - return decode(Color.HSBtoRGB(hsb[0] > 0.5f ? hsb[0]-0.5f : hsb[0]+0.5f, hsb[1], hsb[2]+(1.0f-hsb[2])*brighten)); - } - - private int[] decode(int rgb) { - return new int[]{(rgb & 0x00ff0000) >> 16, (rgb & 0x0000ff00) >> 8, rgb & 0x000000ff}; - } - private int encode(int[] rgb) { - return (toBoundaries(rgb[0]) << 16) | (toBoundaries(rgb[1]) << 8) | toBoundaries(rgb[2]); - } - - private int toBoundaries(int color) { - return Math.max(0,Math.min(255,color)); - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/GuaranteedValue.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/GuaranteedValue.java deleted file mode 100644 index 6b54b1b05d..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/GuaranteedValue.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.revivius.nb.darcula; - -import javax.swing.UIDefaults; -import javax.swing.UIManager; -import java.awt.Color; -import java.awt.Font; - -/** - * ------------------------------------------------------------ - * Copy paste from o.n.swing.plaf because it is module private. - * ------------------------------------------------------------ - * - * A simple mechanism for guaranteeing the presence of a value in UIDefaults. - * Some look and feels (GTK/Synth) don't necessarily provide these colors, - * resulting in null pointer exceptions. Since we want to make it easy to - * write maintainable components, it is preferable to centralize guaranteeing - * the value here, rather than have the codebase littered with null tests and - * fallbacks for null colors. - * - * It will either take on the existing value if present, or used the passed - * value if not present. If passed an array of UIManager keys, it will try - * them in order, and use the first value that returns non-null from - * UIManager.get(). - * - * Usage: - *
- * UIManager.put (new GuaranteedValue("controlShadow", Color.LIGHT_GRAY));
- *   or
- * UIManager.put (new GuaranteedValue(new String[] {"Tree.foreground", 
- *    List.foreground", "textText"}, Color.BLACK));
- * 
- * - * It can also be used to ensure a value matches another value, with a fallback - * if it is not present: - *
- * UIManager.put("TextArea.font", new GuaranteedValue ("Label.font", new Font("Dialog", Font.PLAIN, 11)))
- *
- * @author  Tim Boudreau
- */
-public class GuaranteedValue implements UIDefaults.LazyValue {
-    private Object value;
-    /** Creates a new instance of GuaranteedValue */
-    public GuaranteedValue(String key, Object fallback) {
-        //Be fail fast, so no random exceptions from random components later
-        if (key == null || fallback == null) {
-            throw new NullPointerException ("Null parameters: " + key + ',' + fallback);
-        }
-        
-        value = UIManager.get(key);
-        if (value == null) {
-            value = fallback;
-        }
-    }
-    
-    public GuaranteedValue(String[] keys, Object fallback) {
-        //Be fail fast, so no random exceptions from random components later
-        if (keys == null || fallback == null) {
-            throw new NullPointerException ("Null parameters: " + keys + ',' + fallback);
-        }
-        for (int i=0; i < keys.length; i++) {
-            value = UIManager.get(keys[i]);
-            if (value != null) {
-                break;
-            }
-        }
-        if (value == null) {
-            value = fallback;
-        }
-    }
-    
-    public Object createValue(UIDefaults table) {
-        return value;
-    }
-    
-    /** Convenience getter of the value as a color - returns null if this
-     * instance was used for some other type */
-    public Color getColor() {
-        Object o = createValue(null);
-        if (o instanceof Color) {
-            return (Color) o;
-        } else {
-            return null;
-        }
-    }
-
-    public Font getFont() {
-        Object o = createValue(null);
-        if (o instanceof Font) {
-            return (Font) o;
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/Installer.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/Installer.java
deleted file mode 100644
index 97b43d09e4..0000000000
--- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/Installer.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.revivius.nb.darcula;
-
-import com.bulenkov.darcula.DarculaLaf;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.prefs.Preferences;
-import javax.swing.UIManager;
-import org.openide.modules.ModuleInstall;
-import org.openide.util.Lookup;
-import org.openide.util.NbPreferences;
-import org.openide.windows.WindowManager;
-
-/**
- * Makes Darcula LAF available in preferred LAF combo, installs
- * DarculaLFCustoms, set Preferences and switch the editor color profile to
- * Darcula theme.
- *
- * @author Revivius
- */
-public class Installer extends ModuleInstall {
-
-    private static final String COLOR_MODEL_CLASS_NAME = "org.netbeans.modules.options.colors.ColorModel";
-
-    private static boolean SWITCH_EDITOR_COLORS = false;
-
-    @Override
-    public void validate() throws IllegalStateException {
-        Preferences prefs = NbPreferences.root().node("laf");
-        if (!prefs.getBoolean("darcula.installed", false)) {
-            prefs.put("laf", DarculaLaf.class.getName());
-            SWITCH_EDITOR_COLORS = true;
-        }
-        prefs.putBoolean("darcula.installed", true);
-
-        // to make LAF available in Tools > Options > Appearance > Look and Feel
-        UIManager.installLookAndFeel(new UIManager.LookAndFeelInfo(DarculaLaf.NAME, DarculaLaf.class.getName()));
-        UIManager.put("Nb.DarculaLFCustoms", new DarculaLFCustoms());
-    }
-
-    @Override
-    public void restored() {
-        // KR: disable because we don't use any editors
-//        if (SWITCH_EDITOR_COLORS) {
-//            WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
-//                @Override
-//                public void run() {
-//                    switchEditorColorsProfile();
-//                }
-//            });
-//        };
-    }
-
-    /**
-     * Returns if possible to change color profile. Use reflection to
-     * instantiate ColorModel (private package) class and get the current
-     * profile.
-     *
-     * @return {@code true} if current profile not equals this theme profile
-     * name or {@code false} otherwise.
-     */
-    private boolean isChangeEditorColorsPossible() {
-        ClassLoader loader = Lookup.getDefault().lookup(ClassLoader.class);
-        if (loader == null) {
-            loader = Installer.class.getClassLoader();
-        }
-        try {
-            Class claszz = loader.loadClass(COLOR_MODEL_CLASS_NAME);
-            Object colorModel = claszz.newInstance();
-            Method method = claszz.getDeclaredMethod("getCurrentProfile", new Class[0]);
-            Object invokeResult = method.invoke(colorModel, new Object[0]);
-            return invokeResult != null && !DarculaLaf.NAME.equals(invokeResult);
-        } catch (Exception ex) {
-            //ignore
-            Logger.getLogger(Installer.class.getName()).log(Level.INFO, "Cannot get the current editor colors profile.", ex);
-        }
-        return false;
-    }
-
-    /**
-     * Switch the editor color profile if possible. Use reflection to
-     * instantiate ColorModel (private package) class and set the current
-     * profile
-     */
-    private void switchEditorColorsProfile() {
-        if (!isChangeEditorColorsPossible()) {
-            return;
-        }
-
-        ClassLoader loader = Lookup.getDefault().lookup(ClassLoader.class);
-        if (loader == null) {
-            loader = Installer.class.getClassLoader();
-        }
-        try {
-            Class classz = loader.loadClass(COLOR_MODEL_CLASS_NAME);
-            Object colorModel = classz.newInstance();
-            Method method = classz.getDeclaredMethod("setCurrentProfile", String.class);
-            method.invoke(colorModel, DarculaLaf.NAME);
-
-            // method call above changes the token colors but not annotation
-            // colors. these two seems to solve the problem
-            method = classz.getDeclaredMethod("getAnnotations", String.class);
-            Object acs = method.invoke(colorModel, DarculaLaf.NAME);
-
-            method = classz.getDeclaredMethod("setAnnotations", String.class, Collection.class);
-            method.invoke(colorModel, DarculaLaf.NAME, acs);
-        } catch (Exception ex) {
-            //ignore
-            Logger.getLogger(Installer.class.getName()).log(Level.INFO, "Cannot change editors colors profile.", ex);
-        }
-    }
-}
diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/RelativeColor.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/RelativeColor.java
deleted file mode 100644
index 2c80eb6761..0000000000
--- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/RelativeColor.java
+++ /dev/null
@@ -1,326 +0,0 @@
-package com.revivius.nb.darcula;
-
-import javax.swing.UIDefaults;
-import javax.swing.UIManager;
-import java.awt.Color;
-
-/** 
- * ------------------------------------------------------------
- * Copy paste from o.n.swing.plaf because it is module private.
- * ------------------------------------------------------------
- *
- * A color which can be placed into UIDefaults, which is computed from:
- * 
    - *
  • A base color, as defined in a UI spec - this might be the expected value - * for window titlebars, for example
  • - *
  • A target color, as defined in a UI spec, whose color is not the base - * color, but has a relation to it (such as brighter or darker, or - * hue shifted)
  • - *
  • The actual color - which may differ from the base color if the user has - * customized their UI them (for example, changing the color defaults in - * Windows)
  • - *
  • (optional) A color that the result must contrast with sufficiently that - * text will be readable
  • - *
- * When constructing the real value, a color will be generated which has the - * same relationship to the original value as the base color has to the target - * color. - * - *

What this class is for

- * A number of components in NetBeans have colors that should be based on a - * color taken from the desktop theme. Swing provides a mechanism for getting - * these colors, via UIManager, which will supply correct colors based on the - * desktop theme for a variety of operating systems. - *

- * But often the color in a UI specification is not the same as, but related to - * the color that should be used. For example, in windows classic, the tabs - * have a gradient based on a light blue color. The color should be related to - * the dark blue color normally used in Windows for window titles. However, - * if the user has set the window titlebar color to red, a reddish color should - * be used. - *

- * This class allows you to provide a base value (the default Windows - * titlebar color, hardcoded) and a prototype value (the blue color that should - * be used if the desktop colors are the defaults), and the actual - * value retrieved from the UI. The instance of this class is then dropped - * into UIDefaults; code can simply call - * UIManager.getColor("someColor") and get the right color without - * being cluttered with the details of deriving colors. - * - *

How it does what it does

- * The base and prototype are split into HSB color components. The relationship - * between the base and prototype values in saturation and brightness is then - * computed. This same relationship is then applied to the actual value - * as a function of the divergence between the base and actual values - * such that the more a color diverges, the less the relationship is applied - - * so that, if the base color is dark blue and the prototype color is light - * blue, but the actual color is light yellow, you get light yellow (as opposed - * to pure white, which a naive application of the relationship would get). - * - *

Note: It is possible to create cyclic - * references between RelativeColor instances (for example, a RelativeColor - * that has its own key as one of the keys it should fetch). Don't do that. - * - * @author Tim Boudreau - */ -public class RelativeColor implements UIDefaults.LazyValue { - private Color value = null; - private Color fallback = null; - /** Creates a new instance of RelativeColor. - * - * @param base A Color or UIManager key for a color that the target color is related to - * @param target A Color or UIManager key for a color that is what the target color should be if the - * actual color is equal to the base color - * @param actual Either a Color object or a UIManager String key resolvable - * to a color, which represents the - * actual color, which may or may not match the target color - * @param mustContrast Either a Color object or a UIManager String key - * resolvable to a color which must contrast sufficiently with the derived - * color that text will be readable. This parameter may be null; the others - * may not. */ - public RelativeColor(Object base, Object target, Object actual, Object mustContrast) { - if (base == null || target == null || actual == null) { - throw new NullPointerException ("Null argument(s): " + base + ',' - + target + ',' + actual + ',' + mustContrast); - } - if (base instanceof String) { - baseColorKey = (String) base; - } else { - baseColor = (Color) base; - } - if (target instanceof String) { - targetColorKey = (String) target; - } else { - targetColor = (Color) target; - } - if (actual instanceof String) { - actualColorKey = (String) actual; - } else { - actualColor = (Color) actual; - } - if (mustContrast != null) { - if (mustContrast instanceof String) { - mustContrastColorKey = (String) mustContrast; - } else { - mustContrastColor = (Color) mustContrast; - } - } - } - - /** Creates a new instance of RelativeColor. - * - * @param base A Color that the target color is related to - * @param target A Color that is what the target color should be if the - * actual color is equal to the base color - * @param actual Either a Color object or a UIManager String key resolvable - * to a color, which represents the - * actual color, which may or may not match the target color - * @param mustContrast Either a Color object or a UIManager String key - * resolvable to a color which must contrast sufficiently with the derived - * color that text will be readable - */ - public RelativeColor(Color base, Color target, Object actual) { - this (base, target, actual, null); - } - - public void clear() { - value = null; - if (actualColorKey != null) { - actualColor = null; - } - if (targetColorKey != null) { - targetColor = null; - } - if (mustContrastColorKey != null) { - mustContrastColor = null; - } - if (baseColorKey != null) { - baseColor = null; - } - } - - public Object createValue(UIDefaults table) { - if (value != null) { - return value; - } - Color actual = getActualColor(); - Color base = getBaseColor(); - if (actual.equals(base)) { - value = getTargetColor(); - } else { - value = deriveColor (base, actual, getTargetColor()); - } - if (hasMustContrastColor()) { - value = ensureContrast(value, getMustContrastColor()); - } - return value; - } - - /** Convenience getter, as this class is reasonably useful for creating - * derived colors without putting them into UIDefaults */ - public Color getColor() { - return (Color) createValue(null); - } - - private Color targetColor = null; - private String targetColorKey = null; - private Color getTargetColor() { - if (checkState (targetColor, targetColorKey)) { - targetColor = fetchColor(targetColorKey); - } - return targetColor; - } - - private Color baseColor = null; - private String baseColorKey = null; - private Color getBaseColor() { - if (checkState (baseColor, baseColorKey)) { - baseColor = fetchColor(baseColorKey); - } - return baseColor; - } - - private Color mustContrastColor = null; - private String mustContrastColorKey = null; - private Color getMustContrastColor() { - if (checkState (mustContrastColor, mustContrastColorKey)) { - mustContrastColor = fetchColor(mustContrastColorKey); - } - return mustContrastColor; - } - - private Color actualColor = null; - private String actualColorKey = null; - private Color getActualColor() { - if (checkState (actualColor, actualColorKey)) { - actualColor = fetchColor(actualColorKey); - } - return actualColor; - } - - private boolean hasMustContrastColor() { - return mustContrastColor != null || mustContrastColorKey != null; - } - - /** Ensures that the key and color are not null, and returns true if the - * color needs to be loaded. */ - private boolean checkState(Color color, String key) { - if (color == null && key == null) { - throw new NullPointerException("Both color and key are null for " + - this); - } - return color == null; - } - - private Color fetchColor(String key) { - //Todo - check for cyclic references - Color result = UIManager.getColor(key); - if (result == null) { - result = fallback; - } - return result; - } - - /** Does the actual leg-work of deriving the color */ - static Color deriveColor (Color base, Color actual, Color target) { - float[] baseHSB = Color.RGBtoHSB(base.getRed(), base.getGreen(), - base.getBlue(), null); - - float[] targHSB = Color.RGBtoHSB(target.getRed(), target.getGreen(), - target.getBlue(), null); - - float[] actualHSB = Color.RGBtoHSB(actual.getRed(), actual.getGreen(), - actual.getBlue(), null); - - float[] resultHSB = new float[3]; - float[] finalHSB = new float[3]; - - float[] diff = percentageDiff (actualHSB, baseHSB); - - resultHSB[0] = actualHSB[0] + (diff[0] * (targHSB[0] - baseHSB[0])); - resultHSB[1] = actualHSB[1] + (diff[1] * (targHSB[1] - baseHSB[1])); - resultHSB[2] = actualHSB[2] + (diff[2] * (targHSB[2] - baseHSB[2])); - - finalHSB[0] = saturate (resultHSB[0]); - finalHSB[1] = saturate (resultHSB[1]); - finalHSB[2] = saturate (resultHSB[2]); - - //If the target had *some* color, so should our result - if it pretty - //much doesn't, redistribute some of the brightness to the saturation value - if (targHSB[1] > 0.1 && resultHSB[1] <= 0.1) { - resultHSB[1] = resultHSB[2] * 0.25f; - resultHSB[2] = resultHSB[2] - (resultHSB[2] * 0.25f); - } - - Color result = new Color (Color.HSBtoRGB(finalHSB[0], finalHSB[1], finalHSB[2])); - return result; - } - - private static float[] percentageDiff (float[] a, float[] b) { - float[] result = new float[3]; - for (int i=0; i < 3; i++) { - result[i] = 1 - Math.abs(a[i] - b[i]); - if (result[i] == 0) { - result[i] = 1- a[i]; - } - } - return result; - } - - private static final void out (String nm, float[] f) { - //XXX for debugging - deleteme - StringBuffer sb = new StringBuffer(nm); - sb.append(": "); - for (int i=0; i < f.length; i++) { - sb.append (Math.round(f[i] * 100)); - if (i != f.length-1) { - sb.append(','); - sb.append(' '); - } - } - System.err.println(sb.toString()); - } - - /** Saturate a float value, clamping values below 0 to 0 and above 1 to 1 */ - private static float saturate (float f) { - return Math.max(0, Math.min(1, f)); - } - - - static Color ensureContrast (Color target, Color contrast) { - //XXX - this needs some work. What it should really do: - //Determine the distance from 0.5 for brightness and saturation of the contrasting color, to - //determine the direction in which to adjust. Then adjust in that - //direction as a function of the diff between 0.25 and 0.5 of the - //diff between the colors...or something like that. The point is - //there's a danger zone around 0.5 where things that should be - //adjusted away from each other aren't being - - float[] contHSB = Color.RGBtoHSB(contrast.getRed(), contrast.getGreen(), - contrast.getBlue(), null); - - float[] targHSB = Color.RGBtoHSB(target.getRed(), target.getGreen(), - target.getBlue(), null); - - float[] resultHSB = new float[3]; - System.arraycopy(targHSB, 0, resultHSB, 0, 3); - - float satDiff = Math.abs (targHSB[1] - contHSB[1]); - float briDiff = Math.abs (targHSB[2] - contHSB[2]); - - if (targHSB[1] > 0.6 && resultHSB[1] > 0.6 || (briDiff < 0.45f && satDiff < 0.4f)) { - resultHSB[1] /= 3; -// System.err.println("adjusting saturation to " + resultHSB[1] + " from " + targHSB[1]); - satDiff = Math.abs (targHSB[1] - contHSB[1]); - } - - if (briDiff < 0.3 || (satDiff < 0.3 && briDiff < 0.5)) { - float dir = 1.5f * (0.5f - contHSB[2]); - resultHSB[2] = saturate (resultHSB[2] + dir); -// System.err.println("adjusting brightness to " + resultHSB[2] + " from " + targHSB[2]); - } - - Color result = new Color (Color.HSBtoRGB(resultHSB[0], resultHSB[1], resultHSB[2])); - return result; - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ToolbarXP.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ToolbarXP.java deleted file mode 100644 index 81995c1f1d..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ToolbarXP.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.revivius.nb.darcula; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import javax.swing.JPanel; -import javax.swing.UIManager; - -/** - * Copy paste from o.n.swing.plaf. - * @author Revivius - */ -public final class ToolbarXP extends JPanel { - - /** Width of grip. */ - private static final int GRIP_WIDTH = 7; - /** Minimum size. */ - private final Dimension dim; - /** Maximum size. */ - private final Dimension max; - - public ToolbarXP() { - dim = new Dimension(GRIP_WIDTH, GRIP_WIDTH); - max = new Dimension(GRIP_WIDTH, Integer.MAX_VALUE); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - int x = 3; - for (int i = 4; i < getHeight() - 4; i += 4) { - //first draw the rectangular highlight below each dot - g.setColor(UIManager.getColor("controlLtHighlight").brighter()); //NOI18N - g.fillRect(x + 1, i + 1, 2, 2); - //Get the shadow color. We'll paint the darkest dot first, - //and work our way to the lightest - Color col = UIManager.getColor("controlShadow").brighter(); //NOI18N - g.setColor(col); - //draw the darkest dot - g.drawLine(x + 1, i + 1, x + 1, i + 1); - - //Get the color components and calculate the amount each component - //should increase per dot - int red = col.getRed(); - int green = col.getGreen(); - int blue = col.getBlue(); - - //Get the default component background - we start with the dark - //color, and for each dot, add a percentage of the difference - //between this and the background color - Color back = getBackground(); - int rb = back.getRed(); - int gb = back.getGreen(); - int bb = back.getBlue(); - - //Get the amount to increment each component for each dot - int incr = (rb - red) / 5; - int incg = (gb - green) / 5; - int incb = (bb - blue) / 5; - - //Increment the colors - red += incr; - green += incg; - blue += incb; - //Create a slightly lighter color and draw the dot - col = new Color(red, green, blue); - g.setColor(col); - g.drawLine(x + 1, i, x + 1, i); - - //And do it for the next dot, and so on, for all four dots - red += incr; - green += incg; - blue += incb; - col = new Color(red, green, blue); - g.setColor(col); - g.drawLine(x, i + 1, x, i + 1); - - red += incr; - green += incg; - blue += incb; - col = new Color(red, green, blue); - g.setColor(col); - g.drawLine(x, i, x, i); - } - } - - /** - * @return minimum size - */ - @Override - public Dimension getMinimumSize() { - return dim; - } - - @Override - public Dimension getMaximumSize() { - return max; - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/UIBootstrapValue.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/UIBootstrapValue.java deleted file mode 100644 index c64ccec29d..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/UIBootstrapValue.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.revivius.nb.darcula; - -import javax.swing.UIDefaults; -import javax.swing.UIManager; - -/** - * ------------------------------------------------------------ - * Copy paste from o.n.swing.plaf because it is module private. - * ------------------------------------------------------------ - * - * Value that can be placed into UIDefaults, which will put additional items into - * UIDefaults when its value is requested. - *

- * The idea is to avoid putting a lot of things that may not be used into - * UIDefaults on startup. So, for example, the first time a tab control's UI - * is requested, this value will return the string from which the UI can be - * fetched - but first it will put the assorted keys and values that that UI - * will need into UIDefaults. - *

- * Since multiple UIs may require the same things in UIDefaults, there is the - * method createShared(), which will create another instance (really an inner - * class instance) that shares the code and key/value pairs. Whichever is - * asked for first will initialize the keys and values required. So the usage - * pattern is something like: - *

- * Object someKeysAndValues = new Object[] {"fooColor", Color.BLUE, "barColor", Color.RED};
- * UIBootstrapValue bv = new UIBootstrapValue ("com.foo.FnordUIClass", someKeysAndValues);
- * Object next = bv.createShared ("com.foo.ThiptUIClass");
- * UIManager.put ("FnordUI", bv);
- * UIManager.put ("ThiptUI", next);
- * 
- * - * @author Tim Boudreau - */ -public class UIBootstrapValue implements UIDefaults.LazyValue { - private boolean installed = false; - private final String uiClassName; - protected Object[] defaults; - /** Creates a new instance of UIBootstrapValue */ - public UIBootstrapValue(String uiClassName, Object[] defaults) { - this.defaults = defaults; - this.uiClassName = uiClassName; - } - - /** Create the value that UIDefaults will return. If the keys and values - * the UI class we're representing requires have not yet been installed, - * this will install them. - */ - public Object createValue(UIDefaults uidefaults) { - if (!installed) { - installKeysAndValues(uidefaults); - } - return uiClassName; - } - - /** Install the defaults the UI we're representing will need to function */ - private void installKeysAndValues(UIDefaults ui) { - ui.putDefaults (getKeysAndValues()); - installed = true; - } - - public Object[] getKeysAndValues() { - return defaults; - } - - public void uninstall() { - if (defaults == null) { - return; - } - for (int i=0; i < defaults.length; i+=2) { - UIManager.put (defaults[i], null); - } - //null defaults so a Meta instance won't cause us to do work twice - defaults = null; - } - - public String toString() { - return getClass() + " for " + uiClassName; //NOI18N - } - - /** Create another entry value to put in UIDefaults, which will also - * trigger installing the keys and values, to ensure that they are only - * added once, by whichever entry is asked for the value first. */ - public UIDefaults.LazyValue createShared (String uiClassName) { - return new Meta (uiClassName); - } - - private class Meta implements UIDefaults.LazyValue { - private String name; - public Meta (String uiClassName) { - this.name = uiClassName; - } - - public Object createValue(javax.swing.UIDefaults uidefaults) { - if (!installed) { - installKeysAndValues(uidefaults); - } - return name; - } - - public String toString() { - return "Meta-" + super.toString() + " for " + uiClassName; //NOI18N - } - } - - public abstract static class Lazy extends UIBootstrapValue implements UIDefaults.LazyValue { - public Lazy (String uiClassName) { - super (uiClassName, null); - } - - public Object[] getKeysAndValues() { - if (defaults == null) { - defaults = createKeysAndValues(); - } - return defaults; - } - - public abstract Object[] createKeysAndValues(); - - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFOptionsPanelController.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFOptionsPanelController.java deleted file mode 100644 index 5a32b12eee..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFOptionsPanelController.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2016 markiewb. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.revivius.nb.darcula.options; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.prefs.PreferenceChangeEvent; -import java.util.prefs.PreferenceChangeListener; -import javax.swing.JComponent; -import javax.swing.SwingUtilities; -import org.netbeans.spi.options.OptionsPanelController; -import org.openide.LifecycleManager; -import org.openide.awt.NotificationDisplayer; -import org.openide.util.HelpCtx; -import org.openide.util.ImageUtilities; -import org.openide.util.Lookup; -import org.openide.util.NbPreferences; - -@OptionsPanelController.SubRegistration( - location = "Appearance", - displayName = "#AdvancedOption_DisplayName_DarculaLAF", - keywords = "#AdvancedOption_Keywords_DarculaLAF", - keywordsCategory = "Appearance/DarculaLAF" -) -@org.openide.util.NbBundle.Messages({ - "AdvancedOption_DisplayName_DarculaLAF=Darcula Look and Feel", - "AdvancedOption_Keywords_DarculaLAF=darcula laf, dark, theme, font, laf" -}) -public final class DarculaLAFOptionsPanelController extends OptionsPanelController { - - - public static final String OVERRIDE_FONT_BOOLEAN = "overrideFont"; - public static final String FONT_STRING = "font"; - - public static final String OVERRIDE_TREE_INDENT_BOOLEAN = "overrideTreeIndent"; - public static final String TREE_INDENT_INT = "treeIndent"; - - public static final String INVERT_ICONS_BOOLEAN = "invertIcons"; - public static final String STRETCHED_TABS_BOOLEAN = "stretchedTabs"; - - private static final PreferenceChangeListener PREF_LISTENER = new PreferenceChangeListener() { - @Override - public void preferenceChange(PreferenceChangeEvent evt) { - NotificationDisplayer.getDefault().notify( - "Restart IDE", - ImageUtilities.loadImageIcon("com/revivius/nb/darcula/options/restart.png", true), - "Click here to restart IDE and apply new settings.", - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - LifecycleManager.getDefault().markForRestart(); - LifecycleManager.getDefault().exit(); - } - } - ); - } - }; - - static { - NbPreferences.forModule(DarculaLAFPanel.class).addPreferenceChangeListener(PREF_LISTENER); - } - - private DarculaLAFPanel panel; - private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); - private boolean changed; - - @Override - public void update() { - getPanel().load(); - changed = false; - } - - @Override - public void applyChanges() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getPanel().store(); - changed = false; - } - }); - } - - @Override - public void cancel() { - // need not do anything special, if no changes have been persisted yet - } - - @Override - public boolean isValid() { - return getPanel().valid(); - } - - @Override - public boolean isChanged() { - return changed; - } - - @Override - public HelpCtx getHelpCtx() { - return null; // new HelpCtx("...ID") if you have a help set - } - - @Override - public JComponent getComponent(Lookup masterLookup) { - return getPanel(); - } - - @Override - public void addPropertyChangeListener(PropertyChangeListener l) { - pcs.addPropertyChangeListener(l); - } - - @Override - public void removePropertyChangeListener(PropertyChangeListener l) { - pcs.removePropertyChangeListener(l); - } - - private DarculaLAFPanel getPanel() { - if (panel == null) { - panel = new DarculaLAFPanel(this); - } - return panel; - } - - void changed() { - if (!changed) { - changed = true; - pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true); - } - pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null); - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFPanel.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFPanel.java deleted file mode 100644 index 38fcf32fb8..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/options/DarculaLAFPanel.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright 2016 markiewb. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.revivius.nb.darcula.options; - -import com.revivius.nb.darcula.DarculaLFCustoms; -import java.awt.Font; -import java.beans.PropertyEditor; -import java.beans.PropertyEditorManager; -import java.util.prefs.Preferences; -import org.netbeans.spi.options.OptionsPanelController; -import org.openide.DialogDescriptor; -import org.openide.DialogDisplayer; -import org.openide.util.NbPreferences; - -@OptionsPanelController.Keywords( - location = "Appearance", - tabTitle = "Darcula Look and Feel", - keywords = { - "dark theme", - "dark", - "theme", - "laf", - "font", - "look and feel", - "darcula", - "invert", - "invert colors", - "stretched", - "stretched tabs" - } -) -public class DarculaLAFPanel extends javax.swing.JPanel { - - private final DarculaLAFOptionsPanelController controller; - - DarculaLAFPanel(DarculaLAFOptionsPanelController controller) { - this.controller = controller; - initComponents(); - } - - public void reinitUI() { - if (!cbOverride.isSelected()) { - lblFontName.setText(DarculaLFCustoms.DEFAULT_FONT); - } - - lblFont.setEnabled(cbOverride.isSelected()); - lblFontName.setEnabled(cbOverride.isSelected()); - lblRestart.setEnabled(cbOverride.isSelected()); - btnChooseFont.setEnabled(cbOverride.isSelected()); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - - - // //GEN-BEGIN:initComponents - private void initComponents() { - - cbOverride = new javax.swing.JCheckBox(); - lblRestart = new javax.swing.JLabel(); - lblFontName = new javax.swing.JTextField(); - lblFont = new javax.swing.JLabel(); - btnChooseFont = new javax.swing.JButton(); - cbInvertIcons = new javax.swing.JCheckBox(); - cbStretchedTabs = new javax.swing.JCheckBox(); - - org.openide.awt.Mnemonics.setLocalizedText(cbOverride, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.cbOverride.text")); // NOI18N - cbOverride.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - cbOverrideStateChanged(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(lblRestart, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.lblRestart.text")); // NOI18N - - lblFontName.setEditable(false); - lblFontName.setText(org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.lblFontName.text")); // NOI18N - - lblFont.setLabelFor(btnChooseFont); - org.openide.awt.Mnemonics.setLocalizedText(lblFont, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.lblFont.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(btnChooseFont, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.btnChooseFont.text")); // NOI18N - btnChooseFont.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnChooseFontActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(cbInvertIcons, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.cbInvertIcons.text")); // NOI18N - cbInvertIcons.addItemListener(new java.awt.event.ItemListener() { - public void itemStateChanged(java.awt.event.ItemEvent evt) { - cbInvertIconsItemStateChanged(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(cbStretchedTabs, org.openide.util.NbBundle.getMessage(DarculaLAFPanel.class, "DarculaLAFPanel.cbStretchedTabs.text")); // NOI18N - cbStretchedTabs.addItemListener(new java.awt.event.ItemListener() { - public void itemStateChanged(java.awt.event.ItemEvent evt) { - cbStretchedTabsItemStateChanged(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(cbOverride)) - .addGroup(layout.createSequentialGroup() - .addGap(36, 36, 36) - .addComponent(lblFont) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblFontName, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnChooseFont) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblRestart)) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(cbInvertIcons)) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(cbStretchedTabs))) - .addContainerGap(100, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(cbOverride) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lblFontName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lblFont) - .addComponent(lblRestart) - .addComponent(btnChooseFont)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbInvertIcons) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbStretchedTabs) - .addContainerGap(27, Short.MAX_VALUE)) - ); - }// //GEN-END:initComponents - - private void cbOverrideStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_cbOverrideStateChanged - controller.changed(); - reinitUI(); - }//GEN-LAST:event_cbOverrideStateChanged - - private void btnChooseFontActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChooseFontActionPerformed - PropertyEditor pe = PropertyEditorManager.findEditor(Font.class); - Font f = Font.decode(lblFontName.getText()); - pe.setValue(f); - DialogDescriptor dd = new DialogDescriptor( - pe.getCustomEditor(), - "Font Chooser" - ); - dd.setOptions(new Object[]{ - DialogDescriptor.OK_OPTION, - DialogDescriptor.CANCEL_OPTION - }); - DialogDisplayer.getDefault().createDialog(dd).setVisible(true); - if (dd.getValue() == DialogDescriptor.OK_OPTION) { - f = (Font) pe.getValue(); - lblFontName.setText(f.getName() + " " + f.getSize()); - controller.changed(); - } - }//GEN-LAST:event_btnChooseFontActionPerformed - - private void cbInvertIconsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbInvertIconsItemStateChanged - controller.changed(); - }//GEN-LAST:event_cbInvertIconsItemStateChanged - - private void cbStretchedTabsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbStretchedTabsItemStateChanged - controller.changed(); - }//GEN-LAST:event_cbStretchedTabsItemStateChanged - - void load() { - Preferences prefs = NbPreferences.forModule(DarculaLAFPanel.class); - - cbOverride.setSelected(prefs.getBoolean(DarculaLAFOptionsPanelController.OVERRIDE_FONT_BOOLEAN, false)); - lblFontName.setText(prefs.get(DarculaLAFOptionsPanelController.FONT_STRING, DarculaLFCustoms.DEFAULT_FONT)); - - cbInvertIcons.setSelected(prefs.getBoolean(DarculaLAFOptionsPanelController.INVERT_ICONS_BOOLEAN, false)); - cbStretchedTabs.setSelected(prefs.getBoolean(DarculaLAFOptionsPanelController.STRETCHED_TABS_BOOLEAN, false)); - - reinitUI(); - } - - void store() { - Preferences prefs = NbPreferences.forModule(DarculaLAFPanel.class); - - prefs.putBoolean(DarculaLAFOptionsPanelController.OVERRIDE_FONT_BOOLEAN, cbOverride.isSelected()); - prefs.put(DarculaLAFOptionsPanelController.FONT_STRING, lblFontName.getText()); - - prefs.putBoolean(DarculaLAFOptionsPanelController.INVERT_ICONS_BOOLEAN, cbInvertIcons.isSelected()); - prefs.putBoolean(DarculaLAFOptionsPanelController.STRETCHED_TABS_BOOLEAN, cbStretchedTabs.isSelected()); - } - - boolean valid() { - // TODO check whether form is consistent and complete - return true; - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton btnChooseFont; - private javax.swing.JCheckBox cbInvertIcons; - private javax.swing.JCheckBox cbOverride; - private javax.swing.JCheckBox cbStretchedTabs; - private javax.swing.JLabel lblFont; - private javax.swing.JTextField lblFontName; - private javax.swing.JLabel lblRestart; - // End of variables declaration//GEN-END:variables -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareButtonUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareButtonUI.java deleted file mode 100644 index 06141c3471..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareButtonUI.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.iconloader.util.GraphicsConfig; -import com.bulenkov.iconloader.util.GraphicsUtil; -import com.bulenkov.iconloader.util.SystemInfo; -import java.awt.Color; -import java.awt.Component; -import java.awt.FontMetrics; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Rectangle; -import javax.swing.AbstractButton; -import javax.swing.ButtonModel; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.UIResource; -import javax.swing.plaf.basic.BasicButtonUI; -import sun.swing.SwingUtilities2; - -/** - * A minor re-write of DarculaButtonUI to prevent painting background when - * content area filled property is set to false on button. - * - * Mostly copy paste from DarculaButtonUI. - * - * @author Revivius - */ -public class ContentAreaAwareButtonUI extends BasicButtonUI { - - public static ComponentUI createUI(JComponent c) { - return new ContentAreaAwareButtonUI(); - } - - public static boolean isSquare(Component c) { - if (c instanceof JButton) { - JButton b = (JButton) c; - return "square".equals(b.getClientProperty("JButton.buttonType")); - } - return false; - } - - @Override - public void paint(Graphics g, JComponent c) { - Border border = c.getBorder(); - GraphicsConfig config = GraphicsUtil.setupAAPainting(g); - boolean square = isSquare(c); - Graphics2D g2d = (Graphics2D) g; - AbstractButton b = (AbstractButton) c; - if ((c.isEnabled()) && (border != null)) { - //if (!square) { - g2d.setPaint(getBackgroundPaint(c)); - //} - - if (b.isContentAreaFilled()) { - int arc = 5; - if (square) { - arc = 3; - } - - g.fillRoundRect(1, 1, c.getWidth() - 2, c.getHeight() - 2, arc, arc); - } - } - super.paint(g, c); - config.restore(); - } - - protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) { - AbstractButton button = (AbstractButton) c; - ButtonModel model = button.getModel(); - Color fg = button.getForeground(); - if (((fg instanceof UIResource)) && ((button instanceof JButton)) && (((JButton) button).isDefaultButton())) { - Color selectedFg = UIManager.getColor("Button.darcula.selectedButtonForeground"); - if (selectedFg != null) { - fg = selectedFg; - } - } - g.setColor(fg); - - FontMetrics metrics = SwingUtilities2.getFontMetrics(c, g); - int mnemonicIndex = button.getDisplayedMnemonicIndex(); - if (model.isEnabled()) { - SwingUtilities2.drawStringUnderlineCharAt(c, g, text, mnemonicIndex, textRect.x - + getTextShiftOffset(), textRect.y + metrics - .getAscent() + getTextShiftOffset()); - } else { - g.setColor(UIManager.getColor("Button.disabledText")); - SwingUtilities2.drawStringUnderlineCharAt(c, g, text, -1, textRect.x - + getTextShiftOffset(), textRect.y + metrics - .getAscent() + getTextShiftOffset()); - } - } - - - protected Paint getBackgroundPaint(JComponent c) { - JButton b = (JButton) c; - if (b.isDefaultButton()) { - return new GradientPaint( - 0.0F, 0.0F, getSelectedButtonColor1(), - 0.0F, c.getHeight(), getSelectedButtonColor2() - ); - } - return new GradientPaint( - 0.0F, 0.0F, getButtonColor1(), - 0.0F, c.getHeight(), getButtonColor2() - ); - } - - @Override - public void update(Graphics g, JComponent c) { - super.update(g, c); - if (c instanceof JButton) { - JButton b = (JButton) c; - if (b.isDefaultButton() && !SystemInfo.isMac && !c.getFont().isBold()) { - c.setFont(c.getFont().deriveFont(1)); - } - } - } - - protected Color getButtonColor1() { - return UIManager.getColor("Button.darcula.color1"); - } - - protected Color getButtonColor2() { - return UIManager.getColor("Button.darcula.color2"); - } - - protected Color getSelectedButtonColor1() { - return UIManager.getColor("Button.darcula.selection.color1"); - } - - protected Color getSelectedButtonColor2() { - return UIManager.getColor("Button.darcula.selection.color2"); - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareToggleButtonUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareToggleButtonUI.java deleted file mode 100644 index 03de623ee1..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ContentAreaAwareToggleButtonUI.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Paint; -import javax.swing.JComponent; -import javax.swing.JToggleButton; -import javax.swing.plaf.ComponentUI; - -/** - * A minor re-write of DarculaButtonUI to prevent painting background when - * content area filled property is set to false on button and painting a - * noticable background if button is selected. - * - * Adapted from modified DarculaButtonUI. - * - * @author Revivius - */ -public class ContentAreaAwareToggleButtonUI extends ContentAreaAwareButtonUI { - - public static ComponentUI createUI(JComponent c) { - return new ContentAreaAwareToggleButtonUI(); - } - - @Override - protected Paint getBackgroundPaint(JComponent c) { - JToggleButton b = (JToggleButton) c; - if (b.isSelected()) { - return new GradientPaint( - 0.0F, 0.0F, getButtonColor1().brighter(), - 0.0F, c.getHeight(), getButtonColor2().brighter() - ); - } - return new GradientPaint( - 0.0F, 0.0F, getButtonColor1(), - 0.0F, c.getHeight(), getButtonColor2() - ); - } - - @Override - public void update(Graphics g, JComponent c) { - super.update(g, c); - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneDivider.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneDivider.java deleted file mode 100644 index e4e41ab974..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneDivider.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Graphics; - -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JSplitPane; -import javax.swing.border.Border; -import javax.swing.plaf.basic.BasicSplitPaneDivider; - -import com.bulenkov.iconloader.IconLoader; -import com.bulenkov.iconloader.util.DoubleColor; -import com.bulenkov.iconloader.util.Gray; -import com.bulenkov.iconloader.util.UIUtil; - -/** - * Thanks to hudsonb: https://github.com/bulenkov/Darcula/pull/5 - * - * @author Revivius - */ -public class DarculaSplitPaneDivider extends BasicSplitPaneDivider { - private Icon splitGlueV = IconLoader.findIcon("/com/bulenkov/darcula/icons/splitGlueV.png", DarculaSplitPaneDivider.class, true); - private Icon splitGlueH = IconLoader.findIcon("/com/bulenkov/darcula/icons/splitGlueH.png", DarculaSplitPaneDivider.class, true); - - /** - * Creates an instance of DarculaSplitPaneDivider. Registers this - * instance for mouse events and mouse dragged events. - */ - public DarculaSplitPaneDivider(DarculaSplitPaneUI ui) { - super(ui); - } - - @Override - public void paint(Graphics g) { - super.paint(g); - - if(splitPane.getOrientation() == JSplitPane.VERTICAL_SPLIT) - splitGlueV.paintIcon(this, g, getWidth() / 2, (getHeight() - splitGlueV.getIconHeight()) / 2); - else - splitGlueH.paintIcon(this, g, (getWidth() - splitGlueH.getIconWidth()) / 2, getHeight() / 2); - } - - @Override - protected JButton createLeftOneTouchButton() { - JButton b = new JButton() { - public void setBorder(Border b) { - } - - public void paint(Graphics g) { - if (splitPane != null) { - int[] xs = new int[3]; - int[] ys = new int[3]; - int blockSize; - - // Fill the background first ... - g.setColor(this.getBackground()); - g.fillRect(0, 0, this.getWidth(), - this.getHeight()); - - // ... then draw the arrow. - g.setColor(new DoubleColor(Gray._255, UIUtil.getLabelForeground())); - if (orientation == JSplitPane.VERTICAL_SPLIT) { - blockSize = Math.min(getHeight(), ONE_TOUCH_SIZE); - xs[0] = blockSize; - xs[1] = 0; - xs[2] = blockSize << 1; - ys[0] = 0; - ys[1] = ys[2] = blockSize; - g.drawPolygon(xs, ys, 3); // Little trick to make the - // arrows of equal size - } - else { - blockSize = Math.min(getWidth(), ONE_TOUCH_SIZE); - xs[0] = xs[2] = blockSize; - xs[1] = 0; - ys[0] = 0; - ys[1] = blockSize; - ys[2] = blockSize << 1; - } - g.fillPolygon(xs, ys, 3); - } - } - // Don't want the button to participate in focus traversable. - public boolean isFocusTraversable() { - return false; - } - }; - b.setMinimumSize(new Dimension(ONE_TOUCH_SIZE, ONE_TOUCH_SIZE)); - b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - b.setFocusPainted(false); - b.setBorderPainted(false); - b.setRequestFocusEnabled(false); - return b; - } - - @Override - protected JButton createRightOneTouchButton() { - JButton b = new JButton() { - public void setBorder(Border border) { - } - public void paint(Graphics g) { - if (splitPane != null) { - int[] xs = new int[3]; - int[] ys = new int[3]; - int blockSize; - - // Fill the background first ... - g.setColor(this.getBackground()); - g.fillRect(0, 0, this.getWidth(), - this.getHeight()); - - // ... then draw the arrow. - if (orientation == JSplitPane.VERTICAL_SPLIT) { - blockSize = Math.min(getHeight(), ONE_TOUCH_SIZE); - xs[0] = blockSize; - xs[1] = blockSize << 1; - xs[2] = 0; - ys[0] = blockSize; - ys[1] = ys[2] = 0; - } - else { - blockSize = Math.min(getWidth(), ONE_TOUCH_SIZE); - xs[0] = xs[2] = 0; - xs[1] = blockSize; - ys[0] = 0; - ys[1] = blockSize; - ys[2] = blockSize << 1; - } - g.setColor(new DoubleColor(Gray._255, UIUtil.getLabelForeground())); - g.fillPolygon(xs, ys, 3); - } - } - // Don't want the button to participate in focus traversable. - public boolean isFocusTraversable() { - return false; - } - }; - b.setMinimumSize(new Dimension(ONE_TOUCH_SIZE, ONE_TOUCH_SIZE)); - b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - b.setFocusPainted(false); - b.setBorderPainted(false); - b.setRequestFocusEnabled(false); - return b; - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneUI.java deleted file mode 100644 index d93cf33c94..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarculaSplitPaneUI.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import javax.swing.JComponent; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.basic.BasicSplitPaneDivider; -import javax.swing.plaf.basic.BasicSplitPaneUI; - -/** - * Thanks to hudsonb: https://github.com/bulenkov/Darcula/pull/5 - * - * @author Revivius - */ -public class DarculaSplitPaneUI extends BasicSplitPaneUI { - @SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) - public static ComponentUI createUI(JComponent c) { - return new DarculaSplitPaneUI(); - } - - @Override - public BasicSplitPaneDivider createDefaultDivider() { - return new DarculaSplitPaneDivider(this); - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarkScrollButtonTabbedPaneUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarkScrollButtonTabbedPaneUI.java deleted file mode 100644 index 3de4feae50..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/DarkScrollButtonTabbedPaneUI.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2016 Revivius. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.darcula.ui.DarculaTabbedPaneUI; -import java.awt.Color; -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.SwingConstants; -import static javax.swing.SwingConstants.EAST; -import static javax.swing.SwingConstants.NORTH; -import static javax.swing.SwingConstants.SOUTH; -import static javax.swing.SwingConstants.WEST; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.UIResource; -import javax.swing.plaf.basic.BasicArrowButton; - -/** - * Overrides {@link #createScrollButton(int)} to provide a button which is more suitable to dark look and feel. - * @author Revivius - */ -public class DarkScrollButtonTabbedPaneUI extends DarculaTabbedPaneUI { - - public static ComponentUI createUI(JComponent c) { - return new DarkScrollButtonTabbedPaneUI(); - } - - @Override - protected JButton createScrollButton(int direction) { - if (direction != SOUTH && direction != NORTH && direction != EAST && - direction != WEST) { - throw new IllegalArgumentException("Direction must be one of: " + - "SOUTH, NORTH, EAST or WEST"); - } - return new ScrollableTabButton(direction); - } - - private class ScrollableTabButton extends BasicArrowButton implements UIResource, - SwingConstants { - public ScrollableTabButton(int direction) { - super(direction, - new Color(60, 63, 65), - new Color(54, 54, 54), - new Color(169, 169, 169), - new Color(54, 54, 54)); - setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(0, 0, 0, 1), - BorderFactory.createLineBorder(new Color(169, 169, 169))) - ); - } - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedCheckBoxMenuItemUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedCheckBoxMenuItemUI.java deleted file mode 100644 index fb10e77e64..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedCheckBoxMenuItemUI.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; - -import javax.swing.JComponent; -import javax.swing.MenuSelectionManager; -import javax.swing.plaf.ComponentUI; - -import com.bulenkov.iconloader.util.GraphicsConfig; -import com.bulenkov.iconloader.util.Gray; -import com.bulenkov.iconloader.util.UIUtil; - -import sun.swing.MenuItemLayoutHelper; - -/** - * @author Konstantin Bulenkov - */ -public class FixedCheckBoxMenuItemUI extends FixedMenuItemUIBase { - - public static ComponentUI createUI(JComponent c) { - return new FixedCheckBoxMenuItemUI(); - } - - protected String getPropertyPrefix() { - return "CheckBoxMenuItem"; - } - - // Stay open after click - @Override - protected void doClick(MenuSelectionManager msm) { - menuItem.doClick(0); - } - - @Override - protected void paintCheckIcon(Graphics g2, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc, Color foreground) { - Graphics2D g = (Graphics2D) g2; - final GraphicsConfig config = new GraphicsConfig(g); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); - - g.translate(lr.getCheckRect().x+2, lr.getCheckRect().y+2); - - final int sz = 13; - g.setPaint(new GradientPaint(sz / 2, 1, Gray._110, sz / 2, sz, Gray._95)); - g.fillRoundRect(0, 0, sz, sz - 1 , 4, 4); - - g.setPaint(new GradientPaint(sz / 2, 1, Gray._120.withAlpha(0x5a), sz / 2, sz, Gray._105.withAlpha(90))); - g.drawRoundRect(0, (UIUtil.isUnderDarcula() ? 1 : 0), sz, sz - 1, 4, 4); - - g.setPaint(Gray._40.withAlpha(180)); - g.drawRoundRect(0, 0, sz, sz - 1, 4, 4); - - - if (lh.getMenuItem().isSelected()) { - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); - g.setPaint(Gray._30); - g.drawLine(4, 7, 7, 10); - g.drawLine(7, 10, sz, 2); - g.setPaint(Gray._170); - g.drawLine(4, 5, 7, 8); - g.drawLine(7, 8, sz, 0); - } - - g.translate(-lr.getCheckRect().x-2, -lr.getCheckRect().y-2); - config.restore(); - g.setColor(foreground); - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuItemUIBase.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuItemUIBase.java deleted file mode 100644 index 1822853e3a..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuItemUIBase.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; - -import javax.swing.ButtonModel; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.MenuElement; -import javax.swing.MenuSelectionManager; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.basic.BasicMenuItemUI; - -import sun.swing.MenuItemLayoutHelper; -import sun.swing.SwingUtilities2; - -/** - * The Darcula UI doesn't indent non-radio-buttons enough, and the text is not colored correctly. - * - * I don't think these fixes are NetBeans or Workstation specific. They could be merged into Darcula. - */ -public class FixedMenuItemUIBase extends BasicMenuItemUI { - - public static ComponentUI createUI(JComponent c) { - return new FixedMenuItemUIBase(); - } - - public void processMouseEvent(JMenuItem item, MouseEvent e, MenuElement path[], MenuSelectionManager manager) { - Point p = e.getPoint(); - if (p.x >= 0 && p.x < item.getWidth() && p.y >= 0 && p.y < item.getHeight()) { - if (e.getID() == MouseEvent.MOUSE_RELEASED) { - manager.clearSelectedPath(); - item.doClick(0); - item.setArmed(false); - } - else - manager.setSelectedPath(path); - } - else if (item.getModel().isArmed()) { - MenuElement newPath[] = new MenuElement[path.length - 1]; - int i, c; - for (i = 0, c = path.length - 1; i < c; i++) - newPath[i] = path[i]; - manager.setSelectedPath(newPath); - } - } - - protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, Icon arrowIcon, Color background, Color foreground, - int defaultTextIconGap) { - // Save original graphics font and color - Font holdf = g.getFont(); - Color holdc = g.getColor(); - - JMenuItem mi = (JMenuItem) c; - g.setFont(mi.getFont()); - - Rectangle viewRect = new Rectangle(0, 0, mi.getWidth(), mi.getHeight()); - // KR: commenting this out because it does not render correctly - //applyInsets(viewRect, mi.getInsets()); - - MenuItemLayoutHelper lh = new MenuItemLayoutHelper(mi, checkIcon, arrowIcon, viewRect, defaultTextIconGap, acceleratorDelimiter, - mi.getComponentOrientation().isLeftToRight(), mi.getFont(), acceleratorFont, MenuItemLayoutHelper.useCheckAndArrow(menuItem), - getPropertyPrefix()); - MenuItemLayoutHelper.LayoutResult lr = lh.layoutMenuItem(); - - paintBackground(g, mi, background); - paintCheckIcon(g, lh, lr, holdc, foreground); - paintIcon(g, lh, lr, holdc); - paintText(g, lh, lr); - paintAccText(g, lh, lr); - paintArrowIcon(g, lh, lr, foreground); - - // Restore original graphics font and color - g.setColor(holdc); - g.setFont(holdf); - } - - protected void paintIcon(Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc) { - if (lh.getIcon() != null) { - Icon icon; - ButtonModel model = lh.getMenuItem().getModel(); - if (!model.isEnabled()) { - icon = lh.getMenuItem().getDisabledIcon(); - } - else if (model.isPressed() && model.isArmed()) { - icon = lh.getMenuItem().getPressedIcon(); - if (icon == null) { - // Use default icon - icon = lh.getMenuItem().getIcon(); - } - } - else { - icon = lh.getMenuItem().getIcon(); - } - - if (icon != null) { - icon.paintIcon(lh.getMenuItem(), g, lr.getIconRect().x, lr.getIconRect().y); - g.setColor(holdc); - } - } - } - - protected void paintCheckIcon(Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc, Color foreground) { - if (lh.getCheckIcon() != null) { - ButtonModel model = lh.getMenuItem().getModel(); - if (model.isArmed() || (lh.getMenuItem() instanceof JMenu && model.isSelected())) { - g.setColor(foreground); - } - else { - g.setColor(holdc); - } - if (lh.useCheckAndArrow()) { - lh.getCheckIcon().paintIcon(lh.getMenuItem(), g, lr.getCheckRect().x, lr.getCheckRect().y); - } - g.setColor(holdc); - } - } - - protected void paintAccText(Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr) { - if (!lh.getAccText().equals("")) { - ButtonModel model = lh.getMenuItem().getModel(); - g.setFont(lh.getAccFontMetrics().getFont()); - if (!model.isEnabled()) { - // *** paint the accText disabled - if (disabledForeground != null) { - g.setColor(disabledForeground); - SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), lr.getAccRect().x, - lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); - } - else { - g.setColor(lh.getMenuItem().getBackground().brighter()); - SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), lr.getAccRect().x, - lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); - g.setColor(lh.getMenuItem().getBackground().darker()); - SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), lr.getAccRect().x - 1, - lr.getAccRect().y + lh.getFontMetrics().getAscent() - 1); - } - } - else { - // *** paint the accText normally - if (model.isArmed() || (lh.getMenuItem() instanceof JMenu && model.isSelected())) { - g.setColor(acceleratorSelectionForeground); - } - else { - g.setColor(acceleratorForeground); - } - SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), lr.getAccRect().x, - lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); - } - } - } - - protected void paintText(Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr) { - if (!lh.getText().equals("")) { - if (lh.getHtmlView() != null) { - // Text is HTML - lh.getHtmlView().paint(g, lr.getTextRect()); - } - else { - // Text isn't HTML - // KR: fix menu text color - g.setColor(menuItem.getForeground()); - paintText(g, lh.getMenuItem(), lr.getTextRect(), lh.getText()); - } - } - } - - protected void paintArrowIcon(Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color foreground) { - if (lh.getArrowIcon() != null) { - ButtonModel model = lh.getMenuItem().getModel(); - if (model.isArmed() || (lh.getMenuItem() instanceof JMenu && model.isSelected())) { - g.setColor(foreground); - } - if (lh.useCheckAndArrow()) { - lh.getArrowIcon().paintIcon(lh.getMenuItem(), g, lr.getArrowRect().x, lr.getArrowRect().y); - } - } - } - - protected void applyInsets(Rectangle rect, Insets insets) { - if (insets != null) { - rect.x += insets.left; - rect.y += insets.top; - rect.width -= (insets.right + rect.x); - rect.height -= (insets.bottom + rect.y); - } - } -} \ No newline at end of file diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuUI.java deleted file mode 100644 index 40086e1558..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedMenuUI.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Insets; -import java.awt.Rectangle; - -import javax.swing.ButtonModel; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.basic.BasicMenuUI; - -import sun.swing.MenuItemLayoutHelper; -import sun.swing.SwingUtilities2; - -/** - * The Darcula UI doesn't indent non-radio-buttons enough. - * - * This fix is not NetBeans or Workstation specific and could be merged into Darcula. - */ -public class FixedMenuUI extends BasicMenuUI { - - public static ComponentUI createUI(JComponent c) { - return new FixedMenuUI(); - } - - @Override - protected void paintMenuItem(Graphics g, JComponent c, - Icon checkIcon, Icon arrowIcon, - Color background, Color foreground, - int defaultTextIconGap) { - // Save original graphics font and color - Font holdf = g.getFont(); - Color holdc = g.getColor(); - - JMenuItem mi = (JMenuItem) c; - g.setFont(mi.getFont()); - - Rectangle viewRect = new Rectangle(0, 0, mi.getWidth(), mi.getHeight()); - // KR: commenting this out because it does not render correctly -// applyInsets(viewRect, mi.getInsets()); - - MenuItemLayoutHelper lh = new MenuItemLayoutHelper(mi, checkIcon, - arrowIcon, viewRect, defaultTextIconGap, acceleratorDelimiter, - mi.getComponentOrientation().isLeftToRight(), mi.getFont(), - acceleratorFont, MenuItemLayoutHelper.useCheckAndArrow(menuItem), - getPropertyPrefix()); - MenuItemLayoutHelper.LayoutResult lr = lh.layoutMenuItem(); - - paintBackground(g, mi, background); - paintCheckIcon(g, lh, lr, holdc, foreground); - paintIcon(g, lh, lr, holdc); - g.setColor(foreground); - paintText(g, lh, lr); - paintAccText(g, lh, lr); - paintArrowIcon(g, lh, lr, foreground); - - // Restore original graphics font and color - g.setColor(holdc); - g.setFont(holdf); - } - - protected void paintIcon(Graphics g, MenuItemLayoutHelper lh, - MenuItemLayoutHelper.LayoutResult lr, Color holdc) { - if (lh.getIcon() != null) { - Icon icon; - ButtonModel model = lh.getMenuItem().getModel(); - if (!model.isEnabled()) { - icon = lh.getMenuItem().getDisabledIcon(); - } else if (model.isPressed() && model.isArmed()) { - icon = lh.getMenuItem().getPressedIcon(); - if (icon == null) { - // Use default icon - icon = lh.getMenuItem().getIcon(); - } - } else { - icon = lh.getMenuItem().getIcon(); - } - - if (icon != null) { - icon.paintIcon(lh.getMenuItem(), g, lr.getIconRect().x, - lr.getIconRect().y); - g.setColor(holdc); - } - } - } - - protected void paintCheckIcon(Graphics g, MenuItemLayoutHelper lh, - MenuItemLayoutHelper.LayoutResult lr, - Color holdc, Color foreground) { - if (lh.getCheckIcon() != null) { - ButtonModel model = lh.getMenuItem().getModel(); - if (model.isArmed() || (lh.getMenuItem() instanceof JMenu - && model.isSelected())) { - g.setColor(foreground); - } else { - g.setColor(holdc); - } - if (lh.useCheckAndArrow()) { - lh.getCheckIcon().paintIcon(lh.getMenuItem(), g, - lr.getCheckRect().x, lr.getCheckRect().y); - } - g.setColor(holdc); - } - } - - protected void paintAccText(Graphics g, MenuItemLayoutHelper lh, - MenuItemLayoutHelper.LayoutResult lr) { - if (!lh.getAccText().equals("")) { - ButtonModel model = lh.getMenuItem().getModel(); - g.setFont(lh.getAccFontMetrics().getFont()); - if (!model.isEnabled()) { - // *** paint the accText disabled - if (disabledForeground != null) { - g.setColor(disabledForeground); - SwingUtilities2.drawString(lh.getMenuItem(), g, - lh.getAccText(), lr.getAccRect().x, - lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); - } else { - g.setColor(lh.getMenuItem().getBackground().brighter()); - SwingUtilities2.drawString(lh.getMenuItem(), g, - lh.getAccText(), lr.getAccRect().x, - lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); - g.setColor(lh.getMenuItem().getBackground().darker()); - SwingUtilities2.drawString(lh.getMenuItem(), g, - lh.getAccText(), lr.getAccRect().x - 1, - lr.getAccRect().y + lh.getFontMetrics().getAscent() - 1); - } - } else { - // *** paint the accText normally - if (model.isArmed() - || (lh.getMenuItem() instanceof JMenu - && model.isSelected())) { - g.setColor(acceleratorSelectionForeground); - } else { - g.setColor(acceleratorForeground); - } - SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), - lr.getAccRect().x, lr.getAccRect().y + - lh.getAccFontMetrics().getAscent()); - } - } - } - - protected void paintText(Graphics g, MenuItemLayoutHelper lh, - MenuItemLayoutHelper.LayoutResult lr) { - if (!lh.getText().equals("")) { - if (lh.getHtmlView() != null) { - // Text is HTML - lh.getHtmlView().paint(g, lr.getTextRect()); - } else { - // Text isn't HTML - // KR: fix menu text color - g.setColor(menuItem.getForeground()); - paintText(g, lh.getMenuItem(), lr.getTextRect(), lh.getText()); - } - } - } - - protected void paintArrowIcon(Graphics g, MenuItemLayoutHelper lh, - MenuItemLayoutHelper.LayoutResult lr, - Color foreground) { - if (lh.getArrowIcon() != null) { - ButtonModel model = lh.getMenuItem().getModel(); - if (model.isArmed() || (lh.getMenuItem() instanceof JMenu - && model.isSelected())) { - g.setColor(foreground); - } - if (lh.useCheckAndArrow()) { - lh.getArrowIcon().paintIcon(lh.getMenuItem(), g, - lr.getArrowRect().x, lr.getArrowRect().y); - } - } - } - - protected void applyInsets(Rectangle rect, Insets insets) { - if(insets != null) { - rect.x += insets.left; - rect.y += insets.top; - rect.width -= (insets.right + rect.x); - rect.height -= (insets.bottom + rect.y); - } - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedRadioButtonMenuItemUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedRadioButtonMenuItemUI.java deleted file mode 100644 index 04b4c10479..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedRadioButtonMenuItemUI.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Color; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; - -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.plaf.ComponentUI; - -import com.bulenkov.iconloader.util.ColorUtil; -import com.bulenkov.iconloader.util.GraphicsConfig; -import com.bulenkov.iconloader.util.Gray; - -import sun.swing.MenuItemLayoutHelper; - -/** - * @author Konstantin Bulenkov - */ -public class FixedRadioButtonMenuItemUI extends FixedMenuItemUIBase { - - public static ComponentUI createUI(JComponent c) { - return new FixedRadioButtonMenuItemUI(); - } - - protected String getPropertyPrefix() { - return "RadioButtonMenuItem"; - } - - @Override - protected void paintCheckIcon(Graphics g2, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc, Color foreground) { - Graphics2D g = (Graphics2D) g2; - final GraphicsConfig config = new GraphicsConfig(g); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); - - g.translate(lr.getCheckRect().x + 1, lr.getCheckRect().y + 1); - - int rad = 5; - - final int x = 0; - final int y = 0; - final int w = 13; - final int h = 13; - - g.translate(x, y); - - // setup AA for lines - Color bg = lh.getMenuItem().getBackground(); - g.setPaint(new GradientPaint(0, 0, ColorUtil.shift(bg, 1.5), 0, 16, ColorUtil.shift(bg, 1.2))); - - g.fillOval(0, 1, w - 1, h - 1); - - g.setPaint(new GradientPaint(w / 2, 1, Gray._160.withAlpha(90), w / 2, h, Gray._100.withAlpha(90))); - g.drawOval(0, 2, w - 1, h - 1); - - g.setPaint(Gray._40.withAlpha(200)); - g.drawOval(0, 1, w - 1, h - 1); - - if (lh.getMenuItem().isSelected()) { - final boolean enabled = lh.getMenuItem().isEnabled(); - g.setColor(UIManager - .getColor(enabled ? "RadioButton.darcula.selectionEnabledShadowColor" : "RadioButton.darcula.selectionDisabledShadowColor")); - g.fillOval((w - rad) / 2, h / 2, rad, rad); - g.setColor(UIManager.getColor(enabled ? "RadioButton.darcula.selectionEnabledColor" : "RadioButton.darcula.selectionDisabledColor")); - g.fillOval((w - rad) / 2, h / 2 - 1, rad, rad); - } - config.restore(); - g.translate(-x, -y); - - g.translate(-lr.getCheckRect().x - 1, -lr.getCheckRect().y - 1); - config.restore(); - } -} \ No newline at end of file diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedTableHeaderUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedTableHeaderUI.java deleted file mode 100644 index a65c1a6090..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/FixedTableHeaderUI.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.iconloader.util.ColorUtil; -import com.bulenkov.iconloader.util.GraphicsConfig; -import com.bulenkov.iconloader.util.Gray; - -import javax.swing.JComponent; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.basic.BasicTableHeaderUI; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableColumn; -import java.awt.Color; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.util.Enumeration; - -/** - * KR: Fixed: last header cell does not have a right border, making it difficult to resize - * - * @author Konstantin Bulenkov - */ -public class FixedTableHeaderUI extends BasicTableHeaderUI { - - @SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) - public static ComponentUI createUI(JComponent c) { - return new FixedTableHeaderUI(); - } - - @Override - public void paint(Graphics g2, JComponent c) { - final Graphics2D g = (Graphics2D)g2; - final GraphicsConfig config = new GraphicsConfig(g); - final Color bg = c.getBackground(); - g.setPaint(new GradientPaint(0, 0, ColorUtil.shift(bg, 1.4), 0, c.getHeight(), ColorUtil.shift(bg, 0.9))); - final int h = c.getHeight(); - final int w = c.getWidth(); - g.fillRect(0,0, w, h); - g.setPaint(ColorUtil.shift(bg, 0.75)); - g.drawLine(0, h-1, w, h-1); - g.drawLine(w-1, 0, w-1, h-1); - - final Enumeration columns = ((JTableHeader)c).getColumnModel().getColumns(); - - final Color lineColor = ColorUtil.shift(bg, 0.7); - final Color shadow = Gray._255.withAlpha(30); - int offset = 0; - while (columns.hasMoreElements()) { - final TableColumn column = columns.nextElement(); - // Fixed: -// if (columns.hasMoreElements() && column.getWidth() > 0) { - if (column.getWidth() > 0) { - offset += column.getWidth(); - g.setColor(lineColor); - g.drawLine(offset-1, 1, offset-1, h-3); - g.setColor(shadow); - g.drawLine(offset, 1, offset, h-3); - } - } - - config.restore(); - - super.paint(g, c); - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/IndentAwareTreeUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/IndentAwareTreeUI.java deleted file mode 100644 index eae7113732..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/IndentAwareTreeUI.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2017 Revivius. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.darcula.ui.DarculaTreeUI; -import com.revivius.nb.darcula.options.DarculaLAFOptionsPanelController; -import com.revivius.nb.darcula.options.DarculaLAFPanel; - -import java.awt.event.KeyListener; -import java.util.prefs.Preferences; -import javax.swing.JComponent; -import javax.swing.plaf.ComponentUI; -import org.openide.util.NbPreferences; - -/** - * Overriden to workarround isSkinny() method in DarculaTreeUI. - * @author Revivius - */ -public class IndentAwareTreeUI extends DarculaTreeUI { - - private static final Preferences PREFS = NbPreferences.forModule(DarculaLAFPanel.class); - - public static ComponentUI createUI(JComponent c) { - return new IndentAwareTreeUI(); - } - - @Override - protected int getRowX(int row, int depth) { - if (PREFS.getBoolean(DarculaLAFOptionsPanelController.OVERRIDE_TREE_INDENT_BOOLEAN, false)) { - return totalChildIndent * (depth + depthOffset); - } - - return super.getRowX(row, depth); - } - - // Disable alphanumeric node navigation - @Override - protected KeyListener createKeyListener() { - return null; - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/InreasedInsetsTableHeaderBorder.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/InreasedInsetsTableHeaderBorder.java deleted file mode 100644 index 3599167bc8..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/InreasedInsetsTableHeaderBorder.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.darcula.DarculaTableHeaderBorder; -import java.awt.Component; -import java.awt.Insets; - -/** - * Increases table header insets. - * @author Revivius - */ -public class InreasedInsetsTableHeaderBorder extends DarculaTableHeaderBorder { - - @Override - public Insets getBorderInsets(Component c) { - // KR: increased even more - return new Insets(2, 3, 2, 3); - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/OptionsAwareLabelUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/OptionsAwareLabelUI.java deleted file mode 100644 index f167c9ec68..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/OptionsAwareLabelUI.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Graphics; -import java.beans.PropertyChangeEvent; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.border.CompoundBorder; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.metal.MetalLabelUI; -import org.netbeans.swing.plaf.LFCustoms; - -/** - * Many thanks to Neil C. Smith of Praxis-Life. This trick is mostly - * based on his excellent blog article: - * https://praxisintermedia.wordpress.com/2011/09/29/the-dark-arts-of-netbeans-hackery/ - * - * @author Revivius - */ -public class OptionsAwareLabelUI extends MetalLabelUI { - - private static final String OPTIONS_PANEL_NAME = "org.netbeans.modules.options.OptionsPanel"; - - private static boolean bgReplaced = false; - - public static ComponentUI createUI(JComponent c) { - if (c.getClass().getName().startsWith(OPTIONS_PANEL_NAME)) { - return new OptionsAwareLabelUI(); - } - return MetalLabelUI.createUI(c); - } - - private static final Color oldHighlighted = new Color(224, 232, 246); - - private final Color fgNormal = UIManager.getColor("textText"); - private final Color bgNormal = UIManager.getColor("List.background"); - private final Color bgSelected = UIManager.getColor("List.selectionBackground"); - private final Color bgHighlighted = new Color(13, 41, 62); - private final Border normalBorder = new EmptyBorder(6, 8, 6, 8); - private final Border highlightBorder = new CompoundBorder( - new LineBorder(bgNormal), - new EmptyBorder(4, 7, 4, 7) - ); - private boolean ignoreChanges; - - @Override - public void update(Graphics g, JComponent c) { - super.update(g, c); - - if (bgReplaced) { - return; - } - - // In NB 8.1 CategoryButtons are in a JScrollPane - Container parent = SwingUtilities.getAncestorOfClass(JScrollPane.class, c); - if (parent == null) { - parent = SwingUtilities.getAncestorOfClass(JPanel.class, c); - } - // In NB 8.0 CategoryButtons are in a JPanel - if (parent != null) { - parent = parent.getParent(); - } - if (parent != null && (parent instanceof JPanel)) { - JPanel panel = (JPanel) parent; - replaceBg(panel); - panel.setBorder(BorderFactory.createMatteBorder( - 0, 0, 1, 0, UIManager.getColor(LFCustoms.SCROLLPANE_BORDER_COLOR))); - bgReplaced = true; - } - } - - private void replaceBg(JComponent component) { - component.setBackground(bgNormal); - if (component instanceof JScrollPane) { - JScrollPane sc = (JScrollPane) component; - sc.getViewport().setBackground(bgNormal); - sc.getViewport().getView().setBackground(bgNormal); - } - Component[] components = component.getComponents(); - for (Component c : components) { - if (c instanceof JPanel || c instanceof JScrollPane) { - replaceBg((JComponent) c); - } - } - } - - @Override - public void propertyChange(PropertyChangeEvent e) { - if (ignoreChanges) { - super.propertyChange(e); - return; - } - if (!(e.getSource() instanceof JLabel)) { - super.propertyChange(e); - return; - } - JLabel c = (JLabel) e.getSource(); - if ("background".equals(e.getPropertyName())) { - ignoreChanges = true; - Color bgCurrent = c.getBackground(); - if (Color.WHITE.equals(bgCurrent)) { - c.setBackground(bgNormal); - } else if (oldHighlighted.equals(bgCurrent)) { - c.setBackground(bgHighlighted); - } else if (!bgNormal.equals(bgCurrent)) { - c.setBackground(bgSelected); - } - ignoreChanges = false; - } else if ("foreground".equals(e.getPropertyName())) { - ignoreChanges = true; - if (!fgNormal.equals(c.getForeground())) { - c.setForeground(fgNormal); - } - ignoreChanges = false; - } else if ("border".equals(e.getPropertyName())) { - ignoreChanges = true; - Border current = c.getBorder(); - if (current instanceof EmptyBorder) { - c.setBorder(normalBorder); - } else { - c.setBorder(highlightBorder); - } - ignoreChanges = false; - } else { - super.propertyChange(e); - } - } - -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ReducedInsetsDarculaButtonPainter.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ReducedInsetsDarculaButtonPainter.java deleted file mode 100644 index 9508115468..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/ReducedInsetsDarculaButtonPainter.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import com.bulenkov.darcula.DarculaUIUtil; -import com.bulenkov.darcula.ui.DarculaButtonUI; -import com.bulenkov.iconloader.util.GraphicsConfig; -import com.bulenkov.iconloader.util.Gray; -import java.awt.Component; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.RenderingHints; -import javax.swing.border.Border; -import javax.swing.plaf.InsetsUIResource; -import javax.swing.plaf.UIResource; - -/** - * A minor re-write of DarculaButtonPainter to reduce border insets. - * - * Mostly copy paste from DarculaButtonPainter. - * - * @author Revivius - */ -public class ReducedInsetsDarculaButtonPainter implements Border, UIResource { - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - Graphics2D g2d = (Graphics2D) g; - boolean square = DarculaButtonUI.isSquare(c); - if (c.hasFocus()) { - DarculaUIUtil.paintFocusRing(g2d, 2, 2, width - 3, height - 3); - } else { - GraphicsConfig config = new GraphicsConfig(g); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); - g2d.setPaint(new GradientPaint( - width / 2, y, Gray._80.withAlpha(90), - width / 2, height, Gray._90.withAlpha(90))); - - g2d.setPaint(Gray._100.withAlpha(180)); - - int arc = 5; - if (square) { - arc = 3; - } - g.drawRoundRect(x + 1, y + 1, width - 2, height - 2, arc, arc); - - config.restore(); - } - } - - @Override - public Insets getBorderInsets(Component c) { - if (DarculaButtonUI.isSquare(c)) { - return new InsetsUIResource(2, 0, 2, 0); - } - return new InsetsUIResource(4, 6, 4, 6); - } - - @Override - public boolean isBorderOpaque() { - return false; - } -} diff --git a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/RolloverToolBarUI.java b/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/RolloverToolBarUI.java deleted file mode 100644 index 0184b673f9..0000000000 --- a/modules/DarculaLAF/src/main/java/com/revivius/nb/darcula/ui/RolloverToolBarUI.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.revivius.nb.darcula.ui; - -import java.awt.Color; -import java.awt.Component; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import javax.swing.AbstractButton; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.border.LineBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.basic.BasicToolBarUI; -import org.netbeans.swing.plaf.LFCustoms; - -/** - * A ToolBarUI that installs a ChangeListener on buttons to enable rollover for - * JButtons and JToggleButtons. - * - * @author Revivius - */ -public class RolloverToolBarUI extends BasicToolBarUI { - - private static final String LISTENER_KEY = "ToolbarUI.ListenerKey"; - - private static final ChangeListener LISTENER = new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - AbstractButton b = (AbstractButton) e.getSource(); - boolean rollover = b.getModel().isRollover(); - - b.setContentAreaFilled(rollover || b.getModel().isSelected()); - b.setBorderPainted(rollover); - } - }; - - // #24 - // o.openide.awt.ToolbarWithOverflow - private static final PropertyChangeListener BORDER_UPDATER = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - JComponent src = (JComponent) evt.getSource(); - Border border = src.getBorder(); - if (border instanceof LineBorder) { - LineBorder lb = (LineBorder) border; - if (lb.getThickness() == 1 && Color.LIGHT_GRAY.equals(lb.getLineColor())) { - src.setBorder(BorderFactory.createLineBorder(UIManager.getColor(LFCustoms.SCROLLPANE_BORDER_COLOR))); - } - } - } - }; - - public static ComponentUI createUI(JComponent c) { - return new RolloverToolBarUI(); - } - - @Override - public void installUI(JComponent c) { - super.installUI(c); - // #24 - if ("overflowToolbar".equals(toolBar.getName())) { - toolBar.addPropertyChangeListener("border", BORDER_UPDATER); - } - } - - @Override - protected void uninstallDefaults() { - super.uninstallDefaults(); - // #24 - if ("overflowToolbar".equals(toolBar.getName())) { - toolBar.removePropertyChangeListener("border", BORDER_UPDATER); - } - } - - @Override - protected void setBorderToNonRollover(Component c) { - if (c instanceof AbstractButton) { - AbstractButton b = (AbstractButton) c; - configureButton(b); - } - } - - @Override - protected void setBorderToRollover(Component c) { - if (c instanceof AbstractButton) { - AbstractButton b = (AbstractButton) c; - configureButton(b); - } - } - - @Override - protected void setBorderToNormal(Component c) { - if (c instanceof AbstractButton) { - AbstractButton b = (AbstractButton) c; - - b.setBorderPainted(true); - b.setContentAreaFilled(true); - b.setRolloverEnabled(false); - uninstallListener(b); - } - } - - private void configureButton(AbstractButton b) { - b.setBorderPainted(false); - b.setContentAreaFilled(false); - b.setRolloverEnabled(true); - installListener(b); - } - - private void installListener(AbstractButton b) { - Object o = b.getClientProperty(LISTENER_KEY); - if (o == null) { - b.addChangeListener(LISTENER); - LISTENER.stateChanged(new ChangeEvent(b)); - } - } - - private void uninstallListener(AbstractButton b) { - Object o = b.getClientProperty(LISTENER_KEY); - if (o != null) { - b.addChangeListener(LISTENER); - } - } - -} diff --git a/modules/DarculaLAF/src/main/nbm/manifest.mf b/modules/DarculaLAF/src/main/nbm/manifest.mf deleted file mode 100644 index a8e0a1e426..0000000000 --- a/modules/DarculaLAF/src/main/nbm/manifest.mf +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -AutoUpdate-Show-In-Client: true -OpenIDE-Module-Localizing-Bundle: com/revivius/nb/darcula/Bundle.properties -OpenIDE-Module-Layer: com/revivius/nb/darcula/layer.xml -OpenIDE-Module-Install: com/revivius/nb/darcula/Installer.class -OpenIDE-Module-Specification-Version: 3.0 -OpenIDE-Module-Implementation-Version: ${buildNumber} diff --git a/modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueH.png b/modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueH.png deleted file mode 100644 index 459554e08b9c12121c34c9aad7738cf776480390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol?0V4m&-^~V6jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvQS9T^vI+g7;1g`zP&b*;U-K71uu_PH}Clco$!)tcpEb%pkvZ@#!W1<-h7Z);4}Tl z+Noz18&4Xx`|?eil>F)Z_9PvT2ilv>9zV68v!B6ap6+9X%j(a74q)(f^>bP0l+XkK DvV2_w diff --git a/modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueV.png b/modules/DarculaLAF/src/main/resources/com/bulenkov/darcula/icons/splitGlueV.png deleted file mode 100644 index 507f9c5baf959af6cf826c0206046e35d992c41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^fNn{1`ISV`@iy0XB4ude`@%$AjKtZVz*NBqf{Irtt#G+J&fW*wa5h zJyShH1A{L`3xTStJzX3_G=h64L~}J5@UR?Z-{)oP%71V2E5Ey4@?s)v?z3~8tZny7 zoY7b&9}r&sLf`1=9RI!I8*iEa_z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/highlights.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/highlights.xml deleted file mode 100644 index ddc6eccf59..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/highlights.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 21d6cfc461..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/application/xml-dtd/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/application/xml-dtd/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 17889dbc72..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/application/xml-dtd/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/css/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/css/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index d528b5e9cf..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/css/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/html/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/html/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index a4b8967c1d..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/html/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/plain/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/plain/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 2151022def..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/plain/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/resources/script/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/resources/script/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index e591da22f0..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/resources/script/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-apache-conf/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-apache-conf/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 6a16b2e476..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-apache-conf/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-diff/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-diff/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 32cffe8550..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-diff/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-el/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-el/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 9acbc4cbda..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-el/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-json/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-json/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index f57efc1800..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-json/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-jsp/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-jsp/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 957c0a8149..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-jsp/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-php5/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-php5/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index c2a7c68cd4..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-php5/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-properties/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-properties/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index e8640b002d..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-properties/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-resources/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-resources/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 96d518f909..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-resources/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-sql/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-sql/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 07e039eb9a..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-sql/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tag/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tag/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index e32e267154..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tag/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tpl/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tpl/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index aed448426e..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/x-tpl/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xhtml/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xhtml/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index d70d51a85d..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xhtml/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml-external-parsed-entity/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml-external-parsed-entity/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index 382dc745dd..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml-external-parsed-entity/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml/FontsColors/Darcula/tokenColorings.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml/FontsColors/Darcula/tokenColorings.xml deleted file mode 100644 index d510326a7a..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/Editors/text/xml/FontsColors/Darcula/tokenColorings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/closed.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/closed.png deleted file mode 100644 index e38659fbd2bc02a06a0088da5e7b885e6ec77105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)ur?`qG%l_*N+neBE4K%q-nY$Nii4<+2jpLGAkJ*i6kV=2Jo^hhj111`8)dk zZD#ohk`OfYiUiK(5LRKa_^jLy!|*3TPF|Bi9SS}7N&@2?LD;`zkMt_FKe|G+v-_u?^f7x?JO#{6rfJ#k@1Z!bp+mj}#MTTLHZ+5gXGRQu6_!v3$Q#;T+22WQ%mvv4FO#mD- BL4g1O diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/column-desc.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/column-desc.png deleted file mode 100644 index 00d7b5c236f9ad25331e5f776e3b0efed280951a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvTK6T^vI+f_qOLkBdI#+VP>^#}}#ipHWC6BD7RnZjz=_)&ik5lBz3W3Hkc)I$ztaD0e0sz?Y BKz9HD diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/computer.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/computer.png deleted file mode 100644 index dd42408abe7b094aee115b9de66c69756158ea62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmV-v0+#)WP)i=_r>gt+>waz^FvE5M^OY5@oFND<)Z>X1cFCO9&|<0 z`CxZ-CN6dFhc}T*ubd*7Dxo-V5fZot+)(_xsfC zc0Y3Q^Ucl8W!wZVd@vji?PxS2;o;#S9UL4`u^$Wuw%6-D#Q#vOR?D4E=MA5Hw7Au&@b6EUawPS&25O#L_|{2-bo^ED|AwpcWF%d2*+@yIprTe~fT< z_y7(ZH|%d_7`|`F(rybNWDP(GKXCyO-2*h434zPKRWN`90t<&*D-F*N(C$9rpw-)i z?&h6jh7NSXBUu;OK^VdP9K!wZ(5zJ&@@+kp39i>+;Gz0w2_;~R;^lRKqth!8|7{V> zf-uZ@Hje24N(c;tpt4-XoNeN~-G9~%|TtMaWJvXjNV_+okrHI_A z){oC-l$PRC2ZW|Gy@8dNMPhp*$~3;-0lS#YCIf_-kN4UxB;SEz@(xBD{NDk+ZSH7a zCteq`7BVIqd98*gFx{s%7(Cp~JH6{+weJ4%+Ij3oHz)h0@QK$!8;-MT+OL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvTo@x;Tbd_$M!r5?K9TRw3&1XLFJNf@}YN_22UDd%eZFzjqa)zH5uG zk`ZH0+9>-Ei*|<4WO` zKW8#sZDVNRbvO!=DQ9kASS8Hm#=D@2QK@wQs*RdQS`B$7toWnOWyB)QwwsSPS)zfz gK_vMw4-hbHd$4=g>?75SfDUBvboFyt=akR{0CO*9L;wH) diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/floppyDrive.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/floppyDrive.png deleted file mode 100644 index 0d531eb7c8e0bceb0153ce1d409f83b2e885f247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)rk-tjAP!z_0H;J^hqSY9v zb}k|c4m$V%K7(69+d#cFCY7ogpC~w3Ke`J6TIdX#A8nW1+5$omq!P&?zNBWmp!Oj^F$x%{+EyrCHppeB z064$zZ&9;d9$r-v)6skkkeD&B0IT!GP>D51-{6;uZJ?)ARt;_FfBKRVZtET`r#BvO zxRoKBR!2^=Iz4vF&GCS2TBY7-;=DPLdMZ81qCWTY6$1IlXhF)6xey?|E<&3Cz?j!D z(7$8jdmnMYyZv+~6m9$B`bCWF3UVz+cD?TDxXj<`6Y4l&hC9#P;s5{u07*qoM6N<$ Ef*mugvj6}9 diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/folder.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/folder.png deleted file mode 100644 index cf65d02bafe10dcfb3cb2163fa645e2fdb951af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmV-*0*d{KP)b;GmNZZj3JY50DrK9du@c zgdmHF4lIO02B~e@-t&Gr+}jI*dXh7oujhT<-*cRq;eTWK?drLio3|(GHhigr{xPzA zwHWxbp|j}Lc1aDV`RK)m&6m01u|;*^_5SInXSU)108p?dihTi^GKfZ-aFuKY z08R<`Txltm(i8xI6@Z{!KR}p|@uxfiz@SXKcGD!9)N9%q(T&!JO+Ypem+zjDdJ)>cCW?UBD8C zK$^nB!a^>JqM?z>*cD}(Q1(!vWTq`>rw%AXC`m^sO(BY+fkvZIGqa&bPae;nzi@Hp zaKDKzMH7K3V`p<6v$Z>DbRB4+2mraYwY8R+1*#f#I<29}Y7xSe!3x4WN~2W}5lkri zA8Hl?KsY}?59b^Mh@D8C zeE->l8#|eLcNPkT%JVm?bMHTYpF22g4IDqKPTm`T_wmQqZ(Dn{_B}b#tF|tCfR&x!g zkzr7?{RW(C(BJO|RSk`mN(I?Ngv#LH;P63v7e#rPYFX1X6;)N~20AVLy8`T1K)H$% z7^Yg5ko;i&=AG!53)zCbp+>Xz35&AxL@JbyA%{EX+}%KS}gfY?^6#bq*?yrqnflwk@k zPlzO;30}m2aEODp=|Hy7gyoGo=%kpU#=yx`9ahULd8$REUpbXZRhE1w#B-CuKC#D# zRKW+!Z{IB5y>%lw_x$OHV?i0hqtU>&hQY(&_Otoy+RMbXS#s>3Jk4e^U9DChAStAo zq`uGP2DHc!ld~@tip64rBK0b{5R`q;-Q$G;sf(pts-arX1LapB^nQ+-1tLES-6X<4n6&Bpug;N;`#@@veD-dpV4jq`n7Y~pmJ zKhniA+^Eb!MB#zwS@>l+fLIO;6Pfo@x!kvkcAN0iusc>a$eT!)Dh>Z!wQ)V7^r%1T z-9oNr`vidp2e*xlLap|0wX#{&?T0>|PcsYydkkpU7(Xd}uPkhBZpFy3C k*6U67N>c7`&2Iq)0JiRN)T5va^Z)<=07*qoM6N<$g2csZ82|tP diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/homeFolder.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/homeFolder.png deleted file mode 100644 index efbd3c622eb804e3e408135692a27b0203575bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0004ENkl7V?jR{t@*|guiDcbS_fbPFuqNB+!f}>=?Sx7Rs%!y4nQQk@LoKkz-tqav z3{HjODkadH6Kbdh*3dIKyPw91;H|3K5fb#~gc@qWP%nGjkw<>4R9UE@77VrKAwyl4 p_g8pJze5ElaW!S4hT6XjfNy;5?^zgkH7Ec8002ovPDHLkV1oEF*i`@k diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/layer.xml b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/layer.xml deleted file mode 100644 index c588e242d1..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/layer.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/listView.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/listView.png deleted file mode 100644 index 3250a71711873af075f925108aa3969d93e4f50e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvSFax;Tbd_@ABZ>wUyPpzU$$)mV`)_j9aG70kX|IJ{2fuf>|k*X$bd&t z?e@3TPP+YE`<=?1V&m4kKU^Qh*^~=06ny;7_9LxMFueBQTo)17^eN0w*7}{=p!()< zvs9b%247Q4#=Tq)M`xJ5pL1ugl%t;j diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/newFolder.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/newFolder.png deleted file mode 100644 index a7fa87facc03df6817c2976bda98a4d55bb60f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv00052NklJ|A*J3|G&KH{QuWW zZZLj!!{`6Djp}=W@?i{2er2UwufP1i;nEWn3=*5Z^Ys5+hZ_DryJ7>>$o2o{e{L}T z^_=(r>+4qk8>iSUWMJ|wEnj!x$^WItZ)4z1S6=+zda&pJozr&zf4<;>8}Q>P-~W4O zEdE#aJI!Zc@+qxaefH7+MMrL8#jDOd{QvZ-*Z)UXeZV&Vd?xV!;T8Y?53a@j2kB*C z@-C@ae)7Tpc?YiJ#AnVF|G#oB@&Ah}X8)gEw*G(nLdgHK7aISA^fEAc7S}I6dhh?N zJy!|hT}LPX-*R{^m<`ec(#yc)QPe#D;NAbzc3dF|gYgY$!a%*C?7#-ZVn8fKA_nOJ>7@iPFaQAP+!>o~eG8fZ0000< KMNUMnLSTZhScS;a57p{V6 z(V}S4FNj)8fwZYz{eTFHpcX+3X;ERc3fi>~DxyU{pjBHj3rW3dRvPv&wd;LNXYSPs zE4<->Z_W(o^_@90gmVt<2%*81KP)haYv32l8F07;unRN96r%Ts8`=*;^I^eIkZkDb z&@M&mFyg>Yzz__mJZ?&*ilt5S3&-mV;mOsVH!Fm%NA^ zZW)+dDm<4#k|dZJA9FOi*@@9WBA4%<+uq+04A?{Q1^nG!NTu$<$-AJ~`*}2;z~XT# z7~~31;B&h{(+tpcvn3c~5Q)o4FwBH#fxRm#Fd{)!*BrG_uBxxGn`{>EA#Ww{d%f0p z#4S6KsGO0px-6ax diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/Bundle.properties b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/Bundle.properties deleted file mode 100644 index ebf4319ba0..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/Bundle.properties +++ /dev/null @@ -1,7 +0,0 @@ -DarculaLAFPanel.cbOverride.text=Ove&rride default fonts by -DarculaLAFPanel.lblFontName.text=Fontname Size -DarculaLAFPanel.lblFont.text=F&ont: -DarculaLAFPanel.lblRestart.text=(needs restart) -DarculaLAFPanel.btnChooseFont.text=... -DarculaLAFPanel.cbInvertIcons.text=In&vert icon color values (light and dark levels) -DarculaLAFPanel.cbStretchedTabs.text=&Use stretched tabs diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/DarculaLAFPanel.form b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/DarculaLAFPanel.form deleted file mode 100644 index 41ef46bf5a..0000000000 --- a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/DarculaLAFPanel.form +++ /dev/null @@ -1,136 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/restart.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/options/restart.png deleted file mode 100644 index a65144591d3ef531115c92bcb6ee3238bb34042f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmV+{1JnG8P)< zK~y-)b(3jq%K;e1fB$t--PW=)X|!ovi!tZoLmhE55h|NzagAl>Ll@V~2ewFrkVPC{ z)V?4{5Y|PAL}ubxW`sE77>cagX;?~+(SQ3te6R}Ey~+FGO`iA3dpwUINiu!KxWc+) zfD@>H(X^v76(+5Z#@um*b%z0GtGf!o*+bSVguf>kvta*NV51=`)48m$fEiPUF*rMe zp+mBmT6_qg{&jOrWlDm)`TLeCva+#!<(!4(jsijvk%XiW6D0sFCOtDtj?jLiR_L|D zsM&jRhSPPe)L-*lN{ut==r;M+y+UwdjHC%=qW@4EnyB>B$@i1FXYl4Tj-6M!+VbVpJLK&3IS z)McA8_8+XE(V2uy>ynG+`v4Cfy+n+Dc1zv9lZnvVdt$`@9Z8aVrABA6 zW{q6gU>IGY9z4;e8b(*BnZq4twSxwb diff --git a/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/upFolder.png b/modules/DarculaLAF/src/main/resources/com/revivius/nb/darcula/upFolder.png deleted file mode 100644 index 13e7d6ee0fac5b6a1a5021499db134656ceb273d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmV-n0-pVeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0005dNklt z0ntUbUHD_9A;p$wSKbNXol~dVI-5$=g%IS%=GmNvgO--=LeL4TtP~0o>%uvY%Fty* zNzp&i$LGY za)5Andrg_iv(uNfNGA(fv1?)7Jv0t_#qobU!v^FTztc&oBdotJ|3%(BI%C=Vg|OvW<&3BEZ%}I-;%e#-Y}tRHEQd_4WmX%lpzc;zl9Wdu zS=juE+0Xly=6P9bFb$gE1*|QQM()cuEN%aWw4~e*9_GIO!1Iq~OPLQQS_YCJgBLKD zKZ(rh4y2Km)ZNhIm+Rj#y}D;MMxtpsoR5N&))Cz zuw*H|RD|Y_;)d_Vi4K1Z@%$E~k(N~JKs^1njM!qaD$+f4v7|ftIx;Y9?C1WI$O`0h7I;J! zGcfQS0%1l`4X*~Epj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfQ& zE{-7@!O08kDn7kl`bGcz{?5OMgKfbh2?niRt_4K}45G*Q l9Ju24S9Qhtmm_$O#R_N^gQu&X%Q~loCIG{*H{t*Q diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/left_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/left_dark.png deleted file mode 100644 index 4b72c10597dfc9ea49c534b40c9b1f26b0f146ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4v7|ftIx;Y9?C1WI$O`0h7I;J! zGcfQS0%1l`4X*~Epj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvlk; zE{-7@!KJ4T@*Ys&VR8I^KgH>Y`Vw|_$+ZsZhyT=MTWfy*%6`taT;9J?bFu%KE;WzS x*W)HB>A&HOyvPC)ss6*`lm0Pe{-MQ@?0@~{?{ILD&EQ diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/maximize_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/core/multitabs/resources/maximize_dark.png deleted file mode 100644 index 703be44bcab538c79d1f867472a010d9d7cd448b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4v7|ftIx;Y9?C1WI$O`0h7I;J! zGcfQS1YyP<6SLm}1*J+{BT9nv(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6489aC1geVn zba4#P2=1N0$k(92!~F68`YS*BPhJge7kaFk9B^ve1*OcncMf@{M;g^1-8sd^IZb*6 zmymaZk#a(nlr7(jJd2W?5{9F7TlZ;&6&|}VtHf4v7|ftIx;Y9?C1WI$O`0h7I;J! zGcfQS0%1l`4X*~Epj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvlk; zE{-7@!L_Fx`5F{>TrS@GKdB>e@x6r#Pr7G@RPO%PZ~IC&e`V3X*N4yDy`Eeq{Jula zqf2ew=Z@qkhq{mADz39D+`lwl-@fVj(GzPJH&2_Fzopr0QR*> A`2YX_ diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/core/multiview/resources/splitview_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/core/multiview/resources/splitview_dark.png deleted file mode 100644 index 885129dda5e4af45b8955cd8a7e0ab7266dde594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?(3p^r= z85sBuf-vKbiP>*~f>I@}5hcO-X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#y}z zx;Tbd_^<8bPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RX1PTf^ z9HXCjyZ`_I8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900L-9L_t(I zPpy+rNRx3G#}^@;yM;j|Mc0lV>L7ON5QRlx2tj#>BoMQti(VvRGQ@wmOVTu9U35A( zx4qlkKj+#~nR};B-)$~Ia2rmce+Ti??|qg2;GjzneBnL(zMtp!e4pQ|`|q`}u|YH% zB@_zb^ZAe@3A^2n#bO~6iEwo6cjFX36LCe2gwK8;%hSMezqC`2BONrWA&ThROqCu^8Li+nRE@&xC||aL~xW zz#IDd`swNEWqD;CqtRF%5Dteal}f^#LmeZab`39iHJ`#x) zIy*bd18g>%2FPSGtgfcCE4!osPM4qek$2qtaGSUQw70jH2aJ!8Qz#U)`IE_&UtR4E zFSVwtRQFdCHFn^rtHgc10{{IBnvU!`o!M;G)~5mza*}D)Jnd!5?!h`G;dp_2-YwI^9oEMiY;4n9kz>0000< KMNUMnLSTZ7eqTKR diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/host_with_ssh_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/host_with_ssh_dark.png deleted file mode 100644 index 36d3486d23dad1687fcec5c072c03591b3489a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmV-Q1GW5#P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RX1PTf| z9^oWboB#j-9dt!lbVF}#ZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;GP-C2jx!02*{f zSaefwW^{L9a%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0007gNkljv$BywJT+a>DsP_n+{e)&dnX2XPf(T zc3K-Lb7#)Ev&|(0x{>aF@$`Ks@x}w)^ui10;(LDY`#j%wnEzg@tE)&P65x3rp->1M z$AM*8xLhv8<8f>s+g`B;2?}fBl`RMA!c$I7#L6n(4;AVW{}IRkf{RvK^~kx3Lh87j4y%C$BuqMc|taV>~{JTOZX(5rAH=R|ZT>OrTP!$o?~#?9NnnCWvdccBn>F zP#ZdN@Mw3xv(6;B5-#RlM+;&8dI4d$K&xp6h#tb83A&29&Z4yNguwDZoJR{r!bEC@A^(t5Va!%XpsP~+ibSf z*w`5Om_V%LFux$;`+ORQI-2lsxCb4t+HvXmIkY`JjT84;(b9Qfcc|oF*h?Nvi%zFY zX|-BtG#VLj?Dk=(de7qGvoko}-Gb&T`|-$hSJ;;QyI$J0J=8N@n@%QT9m6opA4KH$ UXJO+J@c;k-07*qoM6N<$f?wNbi2wiq diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/sshClosed_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/cnd/remote/resources/sshClosed_dark.gif deleted file mode 100644 index d598f552e192185b340988ec801d2e19cf425a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmZ?wbhEHblwgox_|5$Qj1r?EFib)~@h1x-1H*p?9gu%Od4hpsFT;OM8IKJM4mNWLYsIW6 zIKa%tB(Eco0Tf_km$Ivv5ctTRN!nS={Q)&xsn+d8{H=;%J zvv>;E@N$>E@mZU0$t7{ZROL=RyF`wQff73z*emprbS%lMK&g+W~H<$na tB6OzWf#ZpG)zd}}+8Y`C*{w9A^&-j`Bbt}`uZ}yrYwPRlOw3FS)&N9qZb|?E diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_dark.png deleted file mode 100644 index 96f50d3cd67b6595ea31294f0e77c86f160ad198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmV;!0zCbRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RS1Q`(< z8zsr}(*OVf8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900JLLL_t(I zPh+4tNGhn^pO|0!35frbh)+O`zz^bctN(xh@e_`b0kZhbyZ8PdId=U2v}x1+pE+~p zKS&?c2!g;kHoNlwECx%cq@m8&=Y zFJHbK>~fI2wWDW=qKdi{NDqh)(M}xT&^5IT2}#WR|LoN}Fn;>-?f?Dz_y0eA`t*O0 zI0y&DrPpN_l8;)BE?(wG37!7z*!xCO=kfB)$V+yW3EDuoqbGZ==k0w=#H zu;DNZKzyhaR)Ec57{&_hy~F>11Lof6z?1~C0K^B0ha?qXU=V;Awt8;=e{>91fDUXu zLcoS!xOyFI0f?WRlEtX5W5VDOnheJvJ_x`pxN-S(*!ER({=+bc4_1HWOpCCR|ia}mQi^0Mr08GOG%mN_hd~o|}*zw)#|AS}{AF2cc$N(`cDH=lgD1e)r p2g<^T15O||{_^EB_y7O@832X|BN8e^rGWqd002ovPDHLkV1kqYJMI7g diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/filter_rollover_dark.png deleted file mode 100644 index 876bfcc2892b543366f89e9b6ca74d25cbb0d9ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmV;x0zdtUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RS1Q`(< z8zsr}(*OVf8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900JCIL_t(I zPh+4tNGhn^pO|0!35frbh)+O`zz^bctN(xh@e_`b0kZhbyZ8PdId=U2v}x1+pE+~p zKS&?c2!g;kHoNlwECx%cq@m8&=Y zFJHbK>~fI2wWDW=qKdi{NDqh)(M}xT&^5IT2}#WR|LoN}Fn;>-?f?Dz_y0eA`t*O0 zI0y&DrPpN_l;Ramv0|*iEhzr~`%hos7J&FrDVzYC;UJ6^IQd0^4To6( z;zOly0&IqZFjipi9sd6tF!w$OrX-LBAU;SuB&h%c!vM&z)pPs*qhqKvDzNnk0ULhd z>UFRMAbxU67Nfe334=#yG8}{WFaWaP#^uvt+gHu`55pinR2mf++qf;Vb_@Iu#;yTB zL42qbgS?6sgM~`~m_`QBAmMy)`)b(n-Ru8@Xb>MNjR9nU7?u*YO muq8lj{N>AM?*IS)GXMb4FZnHuF*)i00000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RY2_6qA z5&8%pr~m)}8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900A~hL_t(I zPo0v@O2a@9fTw+x9{MCHkw6ri{~wX!K?Qpf6%Qin6ZPh;*Fc`7x#qThlV(d04~YX` zce69!WOo~}@hP%`9UPzq^9P#KnpLkI<4fcj%+q{cZ+yQh%d&wM%z#F7TBEfeIGy}X zH!ye0<$fp>MbTmB!<^Q>;ixOGY-u~2)moJ2`AHn2>o#ZS4>&Kl^2oVL&#P==Eb6E$ zTP`e3(z>%07*qoM6N<$f|w$|y#N3J diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/notifications_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/notifications/resources/notifications_dark.png deleted file mode 100644 index 061b1cf27fe21d48944b4b32e2ddd0b74a771a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmV-=0)_pFP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RY0~-!9 zC*UZ<4*&oF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900GuXL_t(I zPo0xrPugG<#*aoPfj24d7hs4JSR>6Kw72OxCDt_H=OPqu|yflvnhHjzyn6 z! z3(KV{b}To(qQI5q2|6^8`guBHM$WZ|qnNX>RH#I!?cuaNbn#NbUNDdY6N;_=>m;PeG<%O|2OmP3N62XMOPp0k zGw78BklBdH^Xoxa*_e?opr_8)fBy^rt?cF>cu{;@@T}q`%SBp1JiEk_`8xo303NPZ UjawfVH~;_u07*qoM6N<$f*NEPkpKVy diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/attachButton_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/attachButton_dark.gif deleted file mode 100644 index fa382d9899f00dbdaa4c9a78e48e9f54ac73fda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmZ?wbhEHb6krfw_|50k_`-UoeWBo7*wY-EWDnx=1%SG^^@mp znmljIIS6+XA@bTwMuo4q>g34hBY+W?p$dn}CN6M><9Ir8*oA9$;>gwyygVexR|L zll7mVg2N>huSRAO4T%d6=Cg4APdc~er@sReBM;Xv7ApgX23EFSCE1G4371;~7JJRr JGEiW!1^_?#OPl}z diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/closePanel_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/closePanel_dark.png deleted file mode 100644 index 518a85b3eea2084725102f805220b9b5c363cdcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@!3HEvBYEP06id3JuOkD)`V;1?T`z%r&H|6f zVg?4j!ywFfJby(BP*AGGHKHUqKdq!Zu_%=xATcwqM9KLZGSy zPZ!4!iSX2ZN3I3~9+uzxZT8fk@ckn2MQPS#ktFk33R?|Q%O@{evSL+Z-HPBijUscU zB!;RlKbvO01|%O$WD@{VjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCf`#@Q5sCVBi)4Va7{$>;3=**-JcqUD>a5GYZP+ZaOca0~C@fag8Vm&QB{T zPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FGO)YHW=L?gJj%aE@@L4c+6{^n1t|GN1d zT#rk?xY8sa5G3Kd!e4BshMJWA%-g%~ihfDn!BYD;Cbadt-1igpOLZ-ub3EB8etXi^ zX$^*Kap8ZrEt#UU*7WS@E1Sa)O$iEASh^%Pp8X$Vkzn$f@2Pf1gUFBLE} T+}70rbO3{=tDnm{r-UW|wP0N+ diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/expandedSnippet_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/expandedSnippet_dark.png deleted file mode 100644 index 19fe98282652181f0e6c969198e43df88e58b6c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VEa{HEjtmUzPnffIy#z@XctjR6 zFz_7)VaDV6D^h@hQYEetCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dWHrDUy2q2RV8`4 zIEH8h_jWn*H7M|~Nbf(c|I_XN0=XXzE4R?~k_xZ5F$H?GY;Q zI(aYQKa0+D!5KHDW^DW}6zF?9Z{fd44$rjF6*2UngGm?P@(_; diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterContains_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterContains_dark.png deleted file mode 100644 index cd2a0aa2ce1b6bd465b9d7ccaeceb82d5aedc8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s9009n3L_t(IPo!qu=gmFFrLzN6=6ZFT&KF!~6-UembKLdNjYyLSP4GxS_MJAFdv&k?Sc zcAmb`){3i|Uoq>6(^3~CNO#R9=scq5dS&(UC3sACYJwzCw5o!J(^41e6P!PwXRxrE wzS7<44b&R%l|a#|3TnF`31n=1G5-g`A9kYl5k!>G5dZ)H07*qoM6N<$f;@1i%K!iX diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterNotContains_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/filterNotContains_dark.png deleted file mode 100644 index 396bc537fc99a6b14d13d86d94358cc146a28b35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmV;P0b%}$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0003ENkl% zN=yIum5W#v(T{>CvD*4D>&|i`OM6ui2Y$@n-Lf~yg?~}gG~yjPtXA@|Sjc|4G{^dL zy*9_1SaWKCs#N;Qg>o6!h0;~9PtpV4=W_u_z#2Egk%DK|d?o>Js9f#SV2v~;EWC%; z@mRoaHj`#DvHEQ~HTT5!qHJ=eCkvh8n<8;%>t6jC*LLTed97+5>ux3^2*?odM z`tctJrjr4iR!a!J6@Fh;a#Ivm)2&(cTY{fnfnx3V{-O}R014phee5j782|tP07*qo IM6N<$f~g#?VE_OC diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/hideColumn_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/hideColumn_dark.png deleted file mode 100644 index b1a1c27d6a76180af45c90f6023bbfc55be5df93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRY!3HGPMlP2IQY`6?zK#qG>ra@ocD)2CDDa3Z zW?4GL)}BeV+T4-U+vv( zV3~fG;cIb9TFsuvf2Fow(>S#G>y)U~rpF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900EszL_t(IPov1|$hm$}pj;Cu7kH<5U52iyN6sN9(NjoBuNWR{F5har(4yFKXk5yoEqzvmr zC0HFS!m_6T;ek9>=g^-`1D1`KDd2hHE8nc8zFhcxKEz_NYW=Dd?~I3G;Ld|Xf7Q3_ zjaOo8v>Y45rC9M4N+m>BVpj|dw{AK3tEGR$HP@9Xl_(Kjb;8UdHHXjaOt^(myF)Mx z1Bz+mtV3ET2bo72D1Ljo$MxF07`R+6DBh0-<`uL7^Y|cq{wO$SZv=`crcto9(KKMI zXt3+EnFcx!3ySgjkT9VEg%)DKKGT2+i-FF=f+9;??Ak}*$Pk?V20=2=t!Pdj681UN zn}fxkY_v^ZiqL{$Rus7C76Y%>Yfh6M*>b+Hq@SROVq>8RE&bITbz5SlbtNhqjiw_* jlSKmxEvQQv{0*pgq1Ws?s-ES;00000NkvXXu0mjfD8}V` diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/maximizePanel_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/maximizePanel_dark.png deleted file mode 100644 index 8ccc774c38db884e1bc311ffcc4c340b5e99bfc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@!3HEvBYEP06id3JuOkD)`V;1?T`z%r&H|6f zVg?4j!ywFfJby(BP*AGGHKHUqKdq!Zu_%=xATcwqM9KLZB*V zPZ!4!iSXL4jhqY)9L$^lt8DxB?cD~IeK$TagLw+l=44GH%0_xsr& qC#3!To*)yl^}k$CbH|7N4~**=xA_+Ds(A)9j=|H_&t;ucLK6TqEKLZB*9 sPZ!4!iST3zy9Z}x8voyz$OZ%qekCHo7Z=!h02MHJy85}Sb4q9e00c@V!~g&Q diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/popupArrow_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/popupArrow_dark.png deleted file mode 100644 index eecaccb44b08ff9174b8499888183f594e66cadc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!3HEdXMMW?q!^2X+?^QKos)S9a~60+7BevL9R^{>76Mh7db&7E|-#2+#lqPgg&ebxsLQ00K5aW&i*H diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/rename_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/rename_dark.png deleted file mode 100644 index e0223e053caf7a0cc0ffef726cb87a560cc98d53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0004!NklnlTH90&0IH~tmng%=iz zti=qWjah~@qLD}>c|*txDXo@L%B6+5%qF*O?uKo&i?uNcU*~sD&&hGlQhxR6^gQ3r z_go$oo3_3& z4n*Q<-q_57SR#(8YY4mk2Sw|iAciOAaeVzGYPJpXC91}be*DGdJ%fF88b;fI1Yb~Z z=|v{{o)hKnqiZa=_TgCG5^kL9Mw5$#fPqTq8qkhH~Fo7`rF8*gCuv=}nzN zfv(AhXd;7)P*g-~hVm2cn}4fm=@JUGjqSLJK1<$!p?%5&p_ojS(aPP;O?hn#f_E`^ z{WmhSPx-||LPpzQ5eiCmM*diW-FXu1xF`=jrerGW%tAqtrXIfY2sRGRC1{UO{_~$O zWz|hWL1CF5d%>{e>9l4jkEdQ`N~;V)K|x6+cKr8P^8`e+W++d+yvY=68-#*SXu=I?Mlq>KmQxKLZB)i zPZ!4!iSXR6jl2gOIGFeTSK0FA%bNo%JPz+$`t2$;Mbu9(XFll~TKI_9=<~ey`RyGK zT-f&(l>3!j;5LqazT__3s$blG?1B%E2n&c$+Pc-?qQ)9^pt%g5u6{1-oD!Mv-d^;6wW1uk(+5UGV((4Y2$uF&YBH zHUt!ZvM@3*{AbVs`4E&R7&x36{&UKBY*=uxnT=J!M#JHuQxli0-5+%YN2X40Rt1X! q24!bv1x}Ue8hb&y`>~@!9Fw7OZS64AuZM-YR_n diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU32_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU32_dark.gif deleted file mode 100644 index 18ef12f35f44ae38d3b587da550935cc7aab77bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1403 zcmchW{W}u~0LQmG!u6(-=Sixe^GNB`qw>;~BNZ> z9;eR+2LBci3=TPeAqf0?SXkJ_@Q6#7uZBlNhF*z{f*`KngxrGMz6p(oLgV7@+=ap7 zuf-)s-${yrJ-7}_iA_km0e^T4ksgOgiNBW&PfWd^oR<19BRxGGat{ejMBPcwfu-ce zr=bxU7sLViP(=hn-f=3xefAV1< ze!Q(9VZY!HdjZ0MpX4k^JuXOd6Q;Y1kiUvEPYKcIgy>*F@g;uwHSwbx!n*s&%&hF3 z986(xPH{zMaW$%>22)&~g{{pltHt1|(KtdW7F+(fCa1hU7gv{yYsjl;L{}5>)%8V< zFUuM`aLuprEnRq0FM;@~uA!;^>GOXfkw|1RxtZMA^5XULw%6pg_O8Er@Wl63?S0SQ zP+Q(mNZtKUds)QypIRy0ZVLTfKck&C`F5Ds!t^>fpzLK{}m2GBQG;kM)fT2S<4$Z0@HCF_$yWs{Dm=|gvp&6OoBBl^q|&M+j}ewl$TUE)Y) zCggJ>sgf&IaiwaWOv9IJMDiJtLL*RUMasERsg9-4GZkMZl=Cd*%9v)AJ!25hE{bOL zeC;=}ZbiKKb(-BT=Q3rYNtxoaWLhVkomZ&l<*EgRdO@jKlxy_zx#elif=a8K*6OF` zS0#&U3f+o)`I}0&q@MqxU0hZz8dOVb8ogm*X<4UVSy(dYmcQzk4Z4+YI>X;fE301& zYlhXe|Bm^8jE%tv2mq`D4tZvtSt4p=v{_HV1}%QAi8aFy0p@0D#r0#*69+xlD! z>$;p7Ui#DX63|%`+uMil;%IGh%8lCbgpS7&T;gu31BNm}qGn@v4Psu@604hHZ9As@ z0)j#w$GGL24gBm|a4uq@1v(xa2;%rtUlAwBmCzuoK+Dk0*)HKNk@Q3-d#eQ5hnma; zUw${#V`mwqa<2O9Ve@y83R=*PE#|H+N6MQkWETiW0|;u2v6tm7cTa=VKDX)@uzNLJ zO>e(FhTjSUv-+6_ZbvrN9A*0kScaTNsG{KJn=CvcTg~>tNCkTwF5EkKDcZTH(4!kU zjq>ev@4S%|i!)GrJ(4Uo*tD%rd9~8EMp0SM<}Ma)+--_S4c6{cd!KP}(sMhWIHJuj zu2sZjZ!O|B_-%|fZIqxs;J{3iD<`+pv-5SHMh7zVbrkc0j|()*y_@W$Xi6!V`9nNd zI+RZal>NBHRV^_o!1dH4eRdRq&4J;`z@d`UBG7(YPn6Wy(rCCz9%O3~3)tK6-u4MD zjmsRsh32F3fDBieqSD4fkF=_w#V8*`2$wNdTTaT9Ri7Z>Qi}uXGxUR<@|MqpPC3?V zJKM<7;n*$$_5jNn)v=wNRRA3oOn zG=*Vo5)7suii-`mQ?>G1j|A@A?%cp2_h_MgXR$C(O(nLOlT<{{X9q B*Bt-= diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectCPU_dark.gif deleted file mode 100644 index 791228f1d5e26e3acbb91d7157abbd2a135b5c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1030 zcmZ?wbhEHb6krfw_|5VTrkM2}$vZ$q^|9(P>3-S!D@{i3v%m zscC7MSy_p>m3jFEIeEn?1+{qv#YJUR=_L&rrHw`P-G%i%#r3__^(|HPZ6%HU^-Zny zEuCd8lPcP#RCP?N>zj42+T?DR|DB03cc-P?nqT&y)#X8_cYAwB_k^hvrp=u?efF$5 z^V+5?Y@fTXW8V7y`D-T3Svqm`!BBCe|7xP*Yi)l-FWoo&eM1Ip1r^H_`{WFU#~p>apU=? zTQ9#oeDUGY%a70Bet!M_(~Eas9)0@#=EK*wAHTi)_~XUrKW{$&{P^|9r|*CM{QU3{f&FymGYxW#)5N~(5QWbvZTSw>zwJ1RfB9kdrUI-xVuxsp>-QuaxP--moI z7Kz+<9Xl_xv9V~D1}O`iNN(&iak})P;DM6gyxXiIZiNa84GnA}YyuK?dlnTwW@Kcr F1^`OY1%@ZnGCsnphs%oE7(>blKdq#clteeg1jeT>P`sX%JoZm8Oe(U6g zZBrJtPhGtG@acWW&K^E}`N+jPCokSSarxeAQQ+-amZ$^1+J_k6wLz`ugLO*Poug`Sk4V=NE53y?FQK^@p!-K7M=m`TM7@-#>i$ z@#*W&&)ry=6P(MkOZ&P^^fZg8 zl#@kET~F2P#Jx)CY<8V8-#21OjN+yj$7Qsqs3caVu)2%7bw3MmT#|KFK}%s#!lA9J zudlNWcp>5ajg6~Cea?#5(`9S>g$o`ZGHtxza(j1H>zR&&)7SS%sR&G~aN4oq;UTZK zKM`jtPINRWD0$EGu`HT$xK&>Gi@>tY&(ANg{UhTW<>JT}AGA8|>@4P&*A=;vUR+9T zetUaM@#SL*OSk9WSKx}fu!yzmal&ag|X!`Cl-&^-UzQ0P|4AubH2AQ(} diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectFragment_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectFragment_dark.gif deleted file mode 100644 index c8caf80a4c33f22deb11018d1e065503d7e0eebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmZ?wbhEHb6krfw_|5A~?iA@NyZiMbIe1re!*(P>37nWb@AWr?|! ziFws21+}R~_30%I8KsSxWi2_C?HTnwc{N=nwQYs{jQ^%_8#AU=oap26&L+5TCxp4c~rMt&3 z-#>Nr;fZTcPF;U`?)rn%H=muq_3ZrZ=hyB%zjFW8jYn_pJbH2G>AQQ+-amNp;nB;F z&)?$~~~-PDaoaN~#hZQ>Hf^EfUpX76Z~Oz4oA`KY;fvc$j8h?A3+ za`B5N#r-gM>^M8yNo|XPW0MOf`+pUNg$^PeftKIk_*KR;hrM8bC0qRh*Tj11NQ>CD_U diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectMemory32_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/snapshotDataObjectMemory32_dark.gif deleted file mode 100644 index 660fc606565c42e9faf0e88789d2b7224bc25967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcmZ?wbhEHbRA5kG_|5(eXjiDY5a1afwL@DVgc%S!o%$ z8JT%mS@{XsWr;cENqLpYc~!Z&g*ka8DFrpDg|+F$brluWRkigQB@J0+O*s{KO?~Cf6DnFKRkls4YM)ZmIjydHMt$$B=H~XMmiETB?$-9Mj-I}* zp8m$ZIZgd@n6=f_-hO`Z_S1`ZUtWLs`sU-ecb~t1`0(M= z*Y6*`{P^_s=a=t4zyA33?dR{GzkY*5ca#{^A)xq^g^_{bKZ6d)m7qMq!115qKc|ex zh6M+kIf^x6PHb4{)WTl4V5Y}LrK5%x&mJ^Hd|;d2ui)IYq)6FswzLfUxf_QzEj>NW zFKvluahltydZV~kDKA~zX3URES<<7p>BVt%!)+OfGgaB#CEU908XK2pUDYyBSoY%3 z*45Y71qL}tdT;aOYSGxYBKCCIS`m?g$A@eiKe*i9owZg$@zC`AiK?msvlyIrYE8YBFg?Gmf*n|G9H!=jP}0m3dYbI2?53xV*xDb=ii;#S(&SvKuD) zR&RTIi|@#bduyd#9L0HLOa%ODb`(D1iI@<1ZqAwZCaxJC^ZoYjDq&6Cl&$}mv1*e1 zgTvid<^MZ3&iwr1Y)M1ik@nx;KRo^&kWi?^{=%)~#r1_t_SdWae)*w^$yn6lGTQ~- zz{5?ZUmiSYwl%oX#K5&8@nLIL2E$wdlM)YR0fn{~ioCik3l2zWEZcF6Rl4uQ;ckOI zkHcJCI}#uF=0#js)ML}P;()XR+fO&v3#p*~ zzWvbIeW!06ICJyRxm#z?T{w2>?(xg_uU@}#>gvN2*PfiZ{`AbvXXkD|zjp8WmHV%5 zJbH8I>AQQ+-oJhO_R-6a&)tY@(Ziy6bFEt;1nt84#Z z7F^hPbv3V2&5MIq)0?Cc4mVBxc%VI!Eak75#D<0ASZ(X2eZTV)5rK83Y>euwDOzcQW5PrUL6zu>|$OrYuDWG!h#+)C58Is l?vD=ZbPWC#pBH-+0YZ%vY6jy%Yn44$rjF6*2UngHb7JTw3R diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/sortDesc_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/profiler/impl/icons/sortDesc_dark.png deleted file mode 100644 index 865780479ba4398ef2fa4237d139721322c6ad15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!3HD+k8e2&q*&4&eH|GX)}JtE?Rp7PP~Z_+ z%)r2R7=#&*=dVZs3QCo@MwA5SrEak75#DP@Z7mkYo7IDdVwW f!NFz@RyGfb1rHCl32-~jnXzHf(QX!ICI)K&pHUL9 diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/modules/tasklist/ui/resources/columnsSortedDesc_dark.gif b/modules/DarculaLAF/src/main/resources/org/netbeans/modules/tasklist/ui/resources/columnsSortedDesc_dark.gif deleted file mode 100644 index 2efac235e9159b42cc1edca7da2accb1a80701e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmZ?wbhEHbP@Z7mkZ1VMDdVwW g!NFz@;eXr*HY7GQ@ySc&%m`R?s9S=ajfKG)0KK{r-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzJ58BZ6-5RKs8Nw!=q1_Ex!@0RiFHXXDV z(G9wJbH&__u6BX`DPL!+8cK`k-1A9O>z|;Zxpc-NjTJiH!Mk}5J3O|SHOqP4^SEiL z%PNm=(lI%|x!u&fMIfdmcKN#lGHYI+n&~XSGUqL?+4e=p><+rV-zhS`p<1c?V&gS);C_cw}b9~U(TW69+;BS zQN{ae*Ro}qKDlBH_KuTOrYw6I{e9IcB~8`tZ};{;vh3P-q5HCY_R>2IKz}iKy85}S Ib4q9e04QLII{*Lx diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slidebottom_pressed_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slidebottom_pressed_dark.png deleted file mode 100644 index c50ce3c8c7eb0645f70f9149ec9f5cb085772ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmV-$0gwKPP)003>6 z004820083o004%W004M{007iZ001+*0010$W8ohx00009a7bBm000XQ000XQ0h0Lx zr2qf`8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s9007WQL_t(2Q;m{K z4n#l@hRd8_jwm8tL1JTRC$Y5>y2(rJ)ViizWxk|dGd zq^@gfnnrpqQ4~=ahBCZk7zXP5p4VJl*X7){P2GX#ZQH)4X*xy6aYRI#=<|zspr2rJ z>>0=LS9}8QiR5D2wuPMM`R{4Vvh0t)V%K%2xZjaQV9L4#@L7;teBYNh3l7Zr-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzJ5Sx*Jp{TW(tF#{`KsnJuQ`Y**DMywuD{o0ne1w^wMM@Z2B) zmM5=w$(8lz-oB8LCc(zP$@pFZ-@*@(7c^Bpo6LW2oGrG`Dff2Qy4N-xP8NO1->3cF zC;x2Wu5}ADrLOO0Dy?Cf5XALQ^3v8$YuBU9O z=RdDm>N!beLaJoC9Gl~T!=G*LyB;#&nRH;zb4w1zEfTI1RWCl=tdts=W!RVO{Yy10 zbg63#OH*2!>Bd8)vHv?=13xsRys_`}y__+zZia)THW$m=UF(8FYhUdOyYNZ+v(5fx znL)Pvx3{(Kdv9rf^SkV{)Q35`#|w{yC&q?P?SGuGE!Q|t^^R)$S=EdBToZs^WAJqK Kb6Mw<&;$Us{fcq` diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_pressed_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_pressed_dark.png deleted file mode 100644 index e6fde46b271a941998558c9c87dd172656b78ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DTQQ@AYTTC+!+iE#eED6kA5;R zw9RB-sAy(jxZ=maV7!NcL8dbKp}Y=IEoXs8WHAE+w*Uw;u2tS!3KWzoag8Vm&QB{T zPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FH3x~Gd{h(_?#K1;3^2Lad9v%5N^-!(Qi z&P-5ad&JaL!QuaKZq=G5E%CG#&UstE)Zc9i^4gFq&2yL`_Ihgj=FC|SD(~rP^Lk0_ zkc%sf6|cEJJ#yN#)RRS#(-v#o_#SI$!S1-gHL#?s@9`ZKK09rp;~zEU^s^!&tAsC` z*t(|NHk)|Q<(b)<*T3dVv?>18I%M?i{t=t={)V1Ht9VXD1Sb4gqvO5m%gIeW4-Uth z_%fHq2J4?*r14~%dhGRs7JV1Ct$mZ%xN6mlYx~}7TKEc|`Rv1UxZtGL4~CNR!?6*W SKQ)0~WbkzLb6Mw<&;$VbbBxje diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideleft_rollover_dark.png deleted file mode 100644 index 30c5a74217644515242409404b58c4787a2805d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmV-}0et?6P)003>6 z004820083o004%W004M{007iZ001+*0010$W8ohx00009a7bBm000XR000XR0j(pw zbpQYW8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s90084jL_t(2Q+16= zs)RrgMAN>)zo3XX;kH6`HshK#w8uL6im}pqXaa_2?SEJIc+4uc|1kaunA;ocw?^&9e`zNU^OAsl` zGEnJb=2{Qz>beGzilTtj@|U`ib@1w}Yl>@ai~@I9!&6 h)^&xZY0_>_dIOWQ)S)A1DWL!W002ovPDHLkV1m4vpm6{I diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_enabled_dark.png deleted file mode 100644 index 1498a150bdac26f536d836ee6f1aa0d25406e596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DTQQ@AYTTC+!+iE#eED6kA5;R zw9RB-sAy(jxZ=maV7!NcL8dbKp}Y=IEoXs8WHAE+H$Mn7PWs8b6euWF;u=vBoS#-w zo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzJ51y2{p5RKs838%SQ40v3P>(@0s;&v4* zeCSm0Fj-kitFGmTr>szh4{Lkm9F^^FR|W-m8G24?cwYIyf-m*bP0l+XkKe;JB| diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_pressed_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_pressed_dark.png deleted file mode 100644 index 5e4e7dd868a6f237e6e10e34eb6011ce38e1a216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmV-=0fqjFP)003>6 z004820083o004%W004M{007iZ001+*0010$W8ohx00009a7bBm000XQ000XQ0h0Lx zr2qf`8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s9007!aL_t(2Q;m;H z3WP8WhU1)6M10|U;lhPG!JW7eAE1bb@D$#uV*;(|fHI3O$)EI3TM$Ahf*=6fw!yM2 z)iX_#wClRsSyhB#2)^%YL(a9(;ARR*l0XziRG;T5B&fG-ql`F?^O4Ibq-jbSkp`Z* z+4H>HnCJPck(;j@4a~|Qc`_o$aZnHW+qmyLX$gh0EMJY>6vy!gGl{ycHKPRe?@d{j z-G6M`7P_ue!zYTOAh1@=zVBh4XBdV-^*H#ds;ZRMhSM~`x~{~sEVO7GM|w@uH0-Q^ YFVYdiVZ5cyB>(^b07*qoM6N<$f&jCZbpQYW diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/vista_slideright_rollover_dark.png deleted file mode 100644 index 6e06c5007ff28e33125be480d53f95b16966fbc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DTQQ@AYTTC+!+iE#eED6kA5;R zw9RB-sAy(jxZ=maV7!NcL8dbKp}Y=IEoXs8WHAE+H$Mn7PWs8b6euWF;u=vBoS#-w zo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzJ54Nn)x5RKr{K2NR|0|D37`C3YT7Wy$e z3eD#e?bZ!>j&TULKmNM+$xBJ)ih`*Q8<@_U{TDJ#m&Qo=$-x zlCH9GEBKY4RQhGk+UFTtGEaTZ$J+R5$|9~G`3!Xqe|>1c^N=Gn^q_piw$mFvE@C}h z_F`YY*_XX%t#oc*Esf2&)PBLFSEX(P&-M0AI?c)@vF!C1T)%mzMjjGuOI%PWv-C&* zu62y_RV{smb8owSw(<6BufMu&?Va97yVlKrY|(M^yKMKg)PwoI_Fb=r3 diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_maximize_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_maximize_enabled_dark.png deleted file mode 100644 index 313ebc0c1eb51ddf8e3fb4ee008627cc6f7a986c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RT`cyjv*HQ$qLeIVs=hS@iFcF-+AQ9)s8dA+uXOfB^k82E&Axdz{bX) X9Of*`8})A!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Rq~!Ljv*HQ$r7v;2To1Z_Bt!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Reqi>jv*HQYr6xv7!)|1_x|^_NlldKnUnai`TN5=EP+=iF@`0vJ+RcP zlHPD3wK-Q~@oI-RvQaaB+Pb_HcyCfK#deNqqsf^sW(kQ$)m+qGRR?f!7S_H3n#|zo L>gTe~DWM4fij+m6 diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_popup_disabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_popup_disabled_dark.png deleted file mode 100644 index 9d27bc51dba768d706d7f5a85132074f2d303b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RW_b3jv*HQ$qVcajE$8ggMA;@D;c)AC7Co|O}xx;=!QvyK@6{6uR>3- qFvnw{K!j!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Rkofkjv*HQ$qVcwb{46goRKB_pywmi%#$Ye>J sGs{6@K2Ts4XA5WMkxqBEgaif#E#ud>S2c+p2O7lS>FVdQ&MBb@0G)d~l>h($ diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_restore_group_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_restore_group_enabled_dark.png deleted file mode 100644 index 9b75fa5c445ffe28e9ff0221225f04c63bbc7e50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Reqi>jv*HQYr6xv7!)|1_x|^_NlldKnUnai`TN5=EP+=iF@`0vJ+RcP zlHPD3wK-Q~@oI-RvQaaB+Pb_HcyCfK#deNqqsf^sW(kQ$)m+qGRR?f!7S_H3n#|zo L>gTe~DWM4fij+m6 diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_disabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_disabled_dark.png deleted file mode 100644 index a691d838947ec03b26d08961bc91676ec98ed370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Ri2(Mjv*HQTe}^(7!){IYN!7HAGtA6VUwE|FOS?E!TwcpzKO~CT+*|d z%~gB0cbt0I=e4kZ-C>Ep{E<1@O!E$waokqSX+O>0;q&fQ{N^M#fhj;k89ZJ6T-G@y GGywpb2|>aD diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollleft_enabled_dark.png deleted file mode 100644 index e5cd7a96a93ecd5f6318c307dad8185e22ef95a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0Ri2(Mjv*HQTe}^(7!){I{{Hu`N!_?mVUwFDFOS?ELHE$@(>4@tY3V)N z7(MBj-lEqR7OysNJD%A0uU%)GDC7AQ>z20y+YUcfc2WDU^7^*Y(VBZeLm50>{an^L HB{Ts5V|Ye) diff --git a/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollright_disabled_dark.png b/modules/DarculaLAF/src/main/resources/org/netbeans/swing/tabcontrol/resources/win8_scrollright_disabled_dark.png deleted file mode 100644 index 1f060fbfbe214e4e64f358cf327c01d935264b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RS}*pjv*HQYr79}9x&iJVl(yo{WVX!WJTt@)^2Kk;NfWWxqRB>Gm#3m z73(7vG-Woj2DL}$G#)89I!(+=Zlmk`t=SLDw{HpfB$g@Wp?pbag4>cvKcn)-4)MOo W_|2~zDtdu-FnGH9xvX!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RS}*pjv*HQYr79}9x&iJvgg0ryiHHLWJTt@)^2Kk;NfWWxqRB>Gm#3m z73(7vG-Woj2DL}$G#)89I!(+=Zlmk`t=SLDw{HpfB$g@Wp?pbag4>cvKcn)-4)J&I WU*8U{yq^rTgTd3)&t;ucLK6T%giVY9 diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/arrow_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/arrow_dark.png deleted file mode 100644 index 4ce4b947d6e490914131472c92d5514af3308b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1d!3HGVjK4YnDaPU;cPEB*=VV@jWYQgd9T^xl z_H+M91gYdK@Q5sCVBi)4Va7{$>;3=**-JcqUD>a*NO3aqCT@6G4-}Frag8Vm&QB{T zPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FGu#?!?yL?S#n!gl+Ad#kh^g+EJfd(8-oU*9HsfA2s04z`buO$nR|X8%4tHU9qp|9?q_3E5URdqSO5faWlG My85}Sb4q9e0Jl#`VE_OC diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_enabled_dark.png deleted file mode 100644 index c39cde6edc08eb7620e151290c587f86a181e6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmV003>6 z004820083o004%W004M{007iZ001+*0010$W8ohx00009a7bBm000XS000XS0e@s) zkpKVy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$9Fmkdbk^le!Oi4sRR47w*QcH@1 zKoA`vi(JA}%*qqY0p=p+5Q0X@k6?ZZ5*0&|Ass{;FOc1wVs_pjo7B{6@RL9qp50d0 zd-bZjH6r?G#&|r|@Av!n3|5Pz{H}pV4Ua*CvAqIF4gjmL*)*rR8!- zo6Ux{+b#LNPt)m?JkJw68%@3IY>8}7LJ^ga$UUmLzs4TO>-Ac;#K~k*BiLAMs=QVYf&i}SmdL%; z{l4B2_xnA>JK|!oko{`!tY%q8Q51Dn(J*Xq@a^FwNkZrInV8%i4wH0-z$VDA*Ma!u za-r+>DtPX$1I@;9Y#a^;aXOu#O8if0nyM;AQIM2Ugi+5i9m07*qoM6N<$f;&&qcmMzZ diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_pressed_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_pressed_dark.png deleted file mode 100644 index 816404d5bedd29773f87a10912bc33ab7ddb12a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmV003>6 z004820083o004%W004M{007iZ001+*0010$W8ohx00009a7bBm000XS000XS0e@s) zkpKVy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$9Fmkdbk^le!RY^oaR47w@l2LAg zKoEwD58Q%N^vM(S0KEc11jH3Z6B8sPm>75lfYP)i z!@|sb^Uv(A1OPAXqwBhIyfOQ}$mgFQQO023%tdHLmqr#5klpSaoM)TNWt1?u-!%YX` zY|Un~`PJSK^gNGpdeFA*vIYNZb-&-kcDwCc#rYTwkIp|g$M=1R;}{U`HwWbvG)_T+ zhsQzwBuOAmQ;utY95n21w;N+M9z_v^VF>sSK@bR))9FMz%<<+tUx4;D91aHstFrU? pTw-FA=Xp~UMTy3;EE7tt{Q$pDmyGo&%)kHu002ovPDHLkV1f)d%98*9 diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/mac_close_rollover_dark.png deleted file mode 100644 index 99faa0dd1cfdf80c4647ee75153fee1feebc906e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DTQQ@AYTTC+!+iE#eED6kA5;R zw9RB-sAy(jxZ=maV7!NcL8dbKp}Y=IEoXs8WHAE+w*Uw;u2tS!3KWzoag8Vm&QB{T zPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FFjkEe@ch(_?zNzr^Q3OueiIk*eWlX@O# zhq-KDTL0#x>y1pwIR}5vdg06AyL0(d)u7C^sevLBp6?9zdMonzLu#bcWfP-Y>y$K< z4~JbhWn%EV+;YxR=D6VQbag(M%@2?+kof(xnmL; zx6K@m7e3gvPQD}goZ*?fD;ZpLO1{kT>9tvIxV|tkdu{&=fszllcOP;7DeM0rw~_t9 r+qHH(=Tx6Rxa%vU-{1dFTPhgs|5)9qXJL{D`h&sK)z4*}Q$iB}A$^3W diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_enabled_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_enabled_dark.png deleted file mode 100644 index ec463bdb6cda5c43207295773b31db464f387b8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamUKs7M+SzCeKo%WCjCx45bDP46hOx7_4S6Fo@?*ia+WGRLfc55n0T@z%2yAjF;}# z{Q(L}mAFQf1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85$UTDOw0r<>2Y!7-Hd{ERp%( z%uM6|juNL@nPVPlFvJQ9$?ta)XwX#i6y^z7!s%(8*sw%mO{2!y7qb!?G|pBq+>~0$ cC?UZx!z+$+dHTf#3Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMY7)lKo7+xhXFj&oCU=Yur6o1qWsFt(9BeIx*fm;ZK886+f z`vVk|Dshb{3C>R|DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1LD#6pmF+?LcIYZZ1 zS*UT!E@=-zmy&=gHl7DX8A>mfDV=t_!NbENptmbXp=m_}!wxHjLyJT@46ZT?G6qjP zdU2{#h{KuY4G)7fycCO0d~1;OXk; Jvd$@?2>{d+QOy7V diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_bigclose_rollover_dark.png deleted file mode 100644 index 10975c5bee88f643d475c946f5b2a3c5ac0f0503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamUKs7M+SzCeKo%WCjCx45bDP46hOx7_4S6Fo@?*ia+WGRLfc55n0T@z%2yAjF;}# z{Q(L}mAFQf1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85$UTDOw0r73=BZ7-Hdnw#Si+ zL4kwi_y5~}f}bu*n&vuJN}%ZON`b&y$&RO!_+9GO+jUvq+qgsPb;+BW#;03R0isnQ!=gVd}D^H@uG;(=Qr)tXp9w(#U6W#joHw&>{v;S3j3^ HP6ga=HRs+|JuFlIWPbZ}^mo+Twu<*5Dh@5qTk%xyNuh-!- U`=a?9fLa+mUHx3vIVCg!0M7k1pa1{> diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_pressed_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_pressed_dark.png deleted file mode 100644 index a3114facb1b9b48b2e27f7ed2d2cd34bb17e1cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZSkfJR9T^zbpD<_bdI{un7I;J! zGcfQS24TkI`72U@f>I@}5hcO-X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#&(r zx;Tbt1Sen#qvtIC;C(thHT06B#^R{an^LB{Ts53)(nw diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_rollover_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/metal_close_rollover_dark.png deleted file mode 100644 index 6dca404168956516bc567eca3a32553bd0e2955c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmUKs7M+S!VC(K#9UIO`?1s;*b z3=DjSL74G){)!Z!pj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvh1T zE{-7@!AH9Txfm2UocI2}xhMExz{W|J*30!2y%99-_frU%$lvrQ{<{)~*`|zM@p6s1 yIXX+4dUd0i?`*u|*4|RDqnB`5uz~yQhZ%h=SHEk^U04e=m%-E3&t;ucLK6TH*F%~B diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/quicksearch/findMenu_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/quicksearch/findMenu_dark.png deleted file mode 100644 index c0ab95fca451ee2796e78c94b50b3e1374c7b464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmV+~0?_@5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5dZ)S5dnW>Uy%R+02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0004=NklwixmKueY>EZf!*qU| zq{RDo5%7?q!}{`+AXsexKGg&`)dFi9x`;;8{St= z8N|12@iUlA<~8SlmzFmov=_hQK*N(HiCiuhU&3JFXk9~Bt1NRThc$YAmCtAt4<*Tz z2GBa4?iiJ9HcK9l2S21}tmFy`28NB%Ap_mQSYeRgAK-&b=ijK&G!^7CF_swlL3K|- x(^M$9Y6c$^MUh2i`dX%f>M+<1w7Ntj`~jh#D!LQ&)I9(I002ovPDHLkV1n(i<0Sw9 diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/toolbar_arrow_horizontal_dark.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/toolbar_arrow_horizontal_dark.png deleted file mode 100644 index 5691131bd13ea96c8f2ecf026b0911eb39b5f769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEa{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvRdf zT^vI+f_o=8@--;%usm)2WmdsvE_A4oxn}LQ)gdlDd7Ik(PH#(8Ty%flA#>+zx2AG0 zZn(NR?L@V|BFnmqCdS8(>8PBQSZv~7lzvK5sW&{>i?bx9wqx0qC_@#gN&I>N@3fcN y!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P^!c=q9iy!t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$psGqw z7sn8d;I00SdeU_BXTXb#@Z{*IjU(f7Wf?n)()@*$fvEb{($Y-q4 uKdv+1ea<}f(iZkrT+!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RpFj4jv*HQS9=|~4k!p5`S#!bX81NPJ(aAL7lN5BEsVQAcAl{bd&B0> zC31bj%%a9dx82)U2waPBk3Gnw=N@Y~-S^+JV3x!#w4xJ V2id(8TYy$Dc)I$ztaD0e0sx96OHBX( diff --git a/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/win8_bigclose_enabled_dark_old.png b/modules/DarculaLAF/src/main/resources/org/openide/awt/resources/win8_bigclose_enabled_dark_old.png deleted file mode 100644 index 6e954ee0d365c318e0760794c9d6a6b331393b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rREcXuNpOBzNqJ&XDnmeGW?qS&pKFLhnX#U! zo}q!km!gG0RbHMhjv*HQYkM8J7!){I{{COC+roNTR99-o;XcPjtNbrnOgz?U*s$%l zGRsx7{)atF%rz|-cmMq>7;@X@nAn!P^6QrrD)kCyz6p(t2u|MFoo*QpG?l^A)z4*} HQ$iB}fp0{t diff --git a/modules/DataBrowser/pom.xml b/modules/DataBrowser/pom.xml index 608a0adde0..f6726dcefe 100644 --- a/modules/DataBrowser/pom.xml +++ b/modules/DataBrowser/pom.xml @@ -161,7 +161,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/GLViewerTools/pom.xml b/modules/GLViewerTools/pom.xml index 67a8e999c4..6d6acd4517 100644 --- a/modules/GLViewerTools/pom.xml +++ b/modules/GLViewerTools/pom.xml @@ -84,7 +84,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java index 46f01f18c3..458e704eb0 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java @@ -18,10 +18,9 @@ import javax.media.opengl.GL3; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageDecoder; -import com.sun.media.jai.codec.MemoryCacheSeekableStream; -import com.sun.media.jai.codec.SeekableStream; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; import org.apache.commons.lang3.tuple.Pair; import org.janelia.geometry.util.PerformanceTimer; @@ -762,25 +761,21 @@ public void run() { private RenderedImage[] renderedImagesFromTiffStack(InputStream stackStream) throws IOException { PerformanceTimer timer = new PerformanceTimer(); - SeekableStream tiffStream; - if (stackStream instanceof SeekableStream) { - tiffStream = (SeekableStream) stackStream; - } else { - tiffStream = new MemoryCacheSeekableStream(stackStream); - } - - ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", tiffStream, null); - if (decoder != null) { - LOG.debug("Creating image decoder from tiff file took {} ms", timer.reportMsAndRestart()); - int sz = decoder.getNumPages(); - RenderedImage slices[] = new RenderedImage[sz]; + ImageReader reader = TiffImageIOHelper.getTiffReader(); + ImageInputStream iis = ImageIO.createImageInputStream(stackStream); + reader.setInput(iis); + try { + LOG.debug("Creating image reader from tiff stream took {} ms", timer.reportMsAndRestart()); + int sz = reader.getNumImages(true); + RenderedImage[] slices = new RenderedImage[sz]; for (int z = 0; z < sz; ++z) { - slices[z] = decoder.decodeAsRenderedImage(z); + slices[z] = reader.readAsRenderedImage(z, null); } LOG.debug("Creating RenderedImages for all slices took {} ms", timer.reportMsAndRestart()); return slices; - } else { - return null; + } finally { + reader.dispose(); + iis.close(); } } diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/TiffImageIOHelper.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/TiffImageIOHelper.java new file mode 100644 index 0000000000..f7815683f3 --- /dev/null +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/TiffImageIOHelper.java @@ -0,0 +1,60 @@ +package org.janelia.gltools.texture; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import java.util.Iterator; + +/** + * Helper for acquiring TIFF ImageReader/ImageWriter instances. + *

+ * Under NetBeans module isolation, {@link ImageIO} SPI discovery may fail to find + * TwelveMonkeys providers. This helper first tries the standard SPI route, then + * falls back to instantiating the TwelveMonkeys SPIs directly. + */ +public final class TiffImageIOHelper { + + private TiffImageIOHelper() {} + + /** + * Returns a TIFF {@link ImageReader}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageReaderSpi} directly. + * + * @return a ready-to-use TIFF ImageReader (caller must call {@code setInput}) + * @throws IllegalStateException if no TIFF reader is available + */ + public static ImageReader getTiffReader() { + Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); + if (readers.hasNext()) { + return readers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly (avoids NetBeans classloader issues) + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi() + .createReaderInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageReader available", e); + } + } + + /** + * Returns a TIFF {@link ImageWriter}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageWriterSpi} directly. + * + * @return a ready-to-use TIFF ImageWriter (caller must call {@code setOutput}) + * @throws IllegalStateException if no TIFF writer is available + */ + public static ImageWriter getTiffWriter() { + Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); + if (writers.hasNext()) { + return writers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageWriterSpi() + .createWriterInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageWriter available", e); + } + } +} diff --git a/modules/Geometry3d/pom.xml b/modules/Geometry3d/pom.xml index ed819ba711..b0a4a5aaa3 100644 --- a/modules/Geometry3d/pom.xml +++ b/modules/Geometry3d/pom.xml @@ -44,7 +44,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/HortaTracer/pom.xml b/modules/HortaTracer/pom.xml index d61bc5cf49..e4a064db11 100644 --- a/modules/HortaTracer/pom.xml +++ b/modules/HortaTracer/pom.xml @@ -188,7 +188,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/IntegrationAPIs/pom.xml b/modules/IntegrationAPIs/pom.xml index 91d6085651..952be0dab5 100644 --- a/modules/IntegrationAPIs/pom.xml +++ b/modules/IntegrationAPIs/pom.xml @@ -46,7 +46,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/Jogl213Lib/pom.xml b/modules/Jogl213Lib/pom.xml index 0c7f954631..c9949d293e 100644 --- a/modules/Jogl213Lib/pom.xml +++ b/modules/Jogl213Lib/pom.xml @@ -34,7 +34,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/Jogl224Lib/pom.xml b/modules/Jogl224Lib/pom.xml index a9b0216fbf..c32b0b0a0a 100644 --- a/modules/Jogl224Lib/pom.xml +++ b/modules/Jogl224Lib/pom.xml @@ -34,7 +34,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/LMDataBrowser/pom.xml b/modules/LMDataBrowser/pom.xml index de91dc7fce..04cb85fdf6 100644 --- a/modules/LMDataBrowser/pom.xml +++ b/modules/LMDataBrowser/pom.xml @@ -122,7 +122,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/CreateSyntheticTiff.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/CreateSyntheticTiff.java index c13573f889..70a782bf50 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/CreateSyntheticTiff.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/CreateSyntheticTiff.java @@ -2,16 +2,13 @@ import java.awt.image.BufferedImage; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.util.Iterator; -import com.google.common.collect.Iterators; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageEncoder; -import com.sun.media.jai.codec.TIFFEncodeParam; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; public class CreateSyntheticTiff { @@ -40,22 +37,18 @@ public static void main(String[] args) { } } } - // Write output tiff - TIFFEncodeParam params = new TIFFEncodeParam(); - Iterator it = Iterators.forArray(slices); - if (it.hasNext()) it.next(); // Avoid duplicate first slice - params.setExtraImages(it); - OutputStream out; - try { - out = new FileOutputStream(tiffFile); - ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params); - encoder.encode(slices[0]); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - System.exit(1); + // Write multi-page output tiff using ImageIO + TwelveMonkeys + try (FileOutputStream fos = new FileOutputStream(tiffFile); + ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) { + ImageWriter writer = TiffImageIOHelper.getTiffWriter(); + writer.setOutput(ios); + writer.prepareWriteSequence(null); + for (BufferedImage slice : slices) { + writer.writeToSequence(new IIOImage(slice, null, null), null); + } + writer.endWriteSequence(); + writer.dispose(); } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } @@ -64,5 +57,5 @@ public static void main(String[] args) { public static void usage() { System.out.println("Usage: java -jar CreateSyntheticTiff.jar "); } - + } diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/PermuteTiff.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/PermuteTiff.java index 714d62b6e0..a6fddad618 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/PermuteTiff.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/PermuteTiff.java @@ -2,29 +2,25 @@ import java.awt.image.BufferedImage; import java.awt.image.Raster; +import java.awt.image.RenderedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.media.jai.NullOpImage; -import javax.media.jai.OpImage; - -import com.google.common.collect.Iterators; -import com.sun.media.jai.codec.FileSeekableStream; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageDecoder; -import com.sun.media.jai.codec.ImageEncoder; -import com.sun.media.jai.codec.SeekableStream; -import com.sun.media.jai.codec.TIFFEncodeParam; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; public class PermuteTiff { private static boolean oneFolderAtATime = true; - + /** * @param args */ @@ -46,12 +42,12 @@ public static void main(String[] args) { else permuteOctree(folder); // Serially permute entire tree } - + public static void usage() { System.out.println("Usage: java -jar PermuteTiff.jar "); } - - public static void permuteOctree( File folder ) + + public static void permuteOctree( File folder ) { // Top folders first permuteFolder(folder); @@ -73,7 +69,7 @@ public static void permuteOctree( File folder ) } } } - + public static void permuteFolder (File folder) { if (folder == null) return; @@ -90,58 +86,87 @@ public static void permuteFolder (File folder) { permuteTiff(f); } } - - public static void permuteTiff(File inTiff, File outTiff, int permuteSteps) + + public static void permuteTiff(File inTiff, File outTiff, int permuteSteps) throws IOException { permuteSteps = permuteSteps % 3; - // Load first slice from input file to determine image format - SeekableStream s = new FileSeekableStream(inTiff); - ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", s, null); - NullOpImage slice1 = new NullOpImage( - decoder.decodeAsRenderedImage(0), - null, - null, - OpImage.OP_NETWORK_BOUND); - // Note volume size - int sx = slice1.getWidth(); - int sy = slice1.getHeight(); - int sz = decoder.getNumPages(); - BufferedImage bufferedSlice1 = slice1.getAsBufferedImage(); - // Initialize output slices - int sizeOut[] = {sx, sy, sz}; - permute(sizeOut, permuteSteps); - BufferedImage outSlices[] = new BufferedImage[sizeOut[2]]; - for (int z = 0; z < sizeOut[2]; ++z) - outSlices[z] = new BufferedImage( - sizeOut[0], sizeOut[1], - bufferedSlice1.getType()); - // Copy permuted pixel by pixel - int bandCount = slice1.getColorModel().getNumColorComponents(); - int pixel[] = new int[bandCount]; - for (int z = 0; z < sz; ++z) { - Raster inSlice = decoder.decodeAsRaster(z); - for (int y = 0; y < sy; ++y) { - for (int x = 0; x < sx; ++x) { - int ixOut[] = {x, y, z}; - permute(ixOut, permuteSteps); - BufferedImage outSlice = outSlices[ixOut[2]]; - pixel = inSlice.getPixel(x, y, pixel); - outSlice.getRaster().setPixel(ixOut[0], ixOut[1], pixel); + + // Load input TIFF using ImageIO + TwelveMonkeys + ImageReader reader = TiffImageIOHelper.getTiffReader(); + ImageInputStream iis = ImageIO.createImageInputStream(inTiff); + reader.setInput(iis); + try { + // Read first slice to determine image format + RenderedImage slice1ri = reader.readAsRenderedImage(0, null); + BufferedImage bufferedSlice1 = toBufferedImage(slice1ri); + + // Note volume size + int sx = bufferedSlice1.getWidth(); + int sy = bufferedSlice1.getHeight(); + int sz = reader.getNumImages(true); + + // Initialize output slices + int sizeOut[] = {sx, sy, sz}; + permute(sizeOut, permuteSteps); + BufferedImage outSlices[] = new BufferedImage[sizeOut[2]]; + for (int z = 0; z < sizeOut[2]; ++z) + outSlices[z] = new BufferedImage( + sizeOut[0], sizeOut[1], + bufferedSlice1.getType()); + + // Copy permuted pixel by pixel + int bandCount = bufferedSlice1.getColorModel().getNumColorComponents(); + int pixel[] = new int[bandCount]; + for (int z = 0; z < sz; ++z) { + Raster inSlice = reader.readRaster(z, null); + for (int y = 0; y < sy; ++y) { + for (int x = 0; x < sx; ++x) { + int ixOut[] = {x, y, z}; + permute(ixOut, permuteSteps); + BufferedImage outSlice = outSlices[ixOut[2]]; + pixel = inSlice.getPixel(x, y, pixel); + outSlice.getRaster().setPixel(ixOut[0], ixOut[1], pixel); + } + } + } + + // Write output tiff as multi-page + try (FileOutputStream fos = new FileOutputStream(outTiff); + ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) { + ImageWriter writer = TiffImageIOHelper.getTiffWriter(); + writer.setOutput(ios); + writer.prepareWriteSequence(null); + for (BufferedImage outSlice : outSlices) { + writer.writeToSequence(new IIOImage(outSlice, null, null), null); } + writer.endWriteSequence(); + writer.dispose(); } + } finally { + reader.dispose(); + iis.close(); } - // Write output tiff - TIFFEncodeParam params = new TIFFEncodeParam(); - Iterator it = Iterators.forArray(outSlices); - if (it.hasNext()) it.next(); // Avoid duplicate first slice - params.setExtraImages(it); - OutputStream out = new FileOutputStream(outTiff); - ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params); - encoder.encode(outSlices[0]); - out.close(); } - + + /** + * Convert a RenderedImage to BufferedImage, preserving sample model. + */ + private static BufferedImage toBufferedImage(RenderedImage ri) { + if (ri instanceof BufferedImage) { + return (BufferedImage) ri; + } + BufferedImage bi = new BufferedImage( + ri.getColorModel(), + ri.getColorModel().createCompatibleWritableRaster(ri.getWidth(), ri.getHeight()), + ri.getColorModel().isAlphaPremultiplied(), + null); + java.awt.Graphics2D g = bi.createGraphics(); + g.drawRenderedImage(ri, new java.awt.geom.AffineTransform()); + g.dispose(); + return bi; + } + public static void permuteTiff(File tiffFile) { Pattern filePattern = Pattern.compile("^default\\.(\\d+)\\.tif$"); // Only want to convert default.?.tif @@ -151,9 +176,6 @@ public static void permuteTiff(File tiffFile) { int channel = Integer.parseInt(matcher.group(1)); File yzFile = new File(tiffFile.getParentFile(), "YZ."+channel+".tif"); File zxFile = new File(tiffFile.getParentFile(), "ZX."+channel+".tif"); - // System.out.println( "File:" + f.getAbsoluteFile()); - // System.out.println( " YZ:" + yzFile.getAbsoluteFile()); - // System.out.println( " ZX:" + zxFile.getAbsoluteFile()); if (! yzFile.exists()) { try { System.out.println( "Creating:" + yzFile.getAbsoluteFile()); @@ -171,15 +193,15 @@ public static void permuteTiff(File tiffFile) { // TODO Auto-generated catch block e.printStackTrace(); } - } + } } - + private static void permute(int[] in, int count) { for (int i = 0; i < count; ++i) { permute1(in); } } - + private static void permute1(int[] in) { int first = in[0]; for (int i = 0; i < (in.length-1); ++i) { diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TiffImageIOHelper.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TiffImageIOHelper.java new file mode 100644 index 0000000000..4be2f6d5da --- /dev/null +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TiffImageIOHelper.java @@ -0,0 +1,60 @@ +package org.janelia.workstation.gui.large_volume_viewer; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import java.util.Iterator; + +/** + * Helper for acquiring TIFF ImageReader/ImageWriter instances. + *

+ * Under NetBeans module isolation, {@link ImageIO} SPI discovery may fail to find + * TwelveMonkeys providers. This helper first tries the standard SPI route, then + * falls back to instantiating the TwelveMonkeys SPIs directly. + */ +public final class TiffImageIOHelper { + + private TiffImageIOHelper() {} + + /** + * Returns a TIFF {@link ImageReader}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageReaderSpi} directly. + * + * @return a ready-to-use TIFF ImageReader (caller must call {@code setInput}) + * @throws IllegalStateException if no TIFF reader is available + */ + public static ImageReader getTiffReader() { + Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); + if (readers.hasNext()) { + return readers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly (avoids NetBeans classloader issues) + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi() + .createReaderInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageReader available", e); + } + } + + /** + * Returns a TIFF {@link ImageWriter}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageWriterSpi} directly. + * + * @return a ready-to-use TIFF ImageWriter (caller must call {@code setOutput}) + * @throws IllegalStateException if no TIFF writer is available + */ + public static ImageWriter getTiffWriter() { + Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); + if (writers.hasNext()) { + return writers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageWriterSpi() + .createWriterInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageWriter available", e); + } + } +} diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/action/GenerateCarveoutAction.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/action/GenerateCarveoutAction.java index 9a799c3fc0..5f1196a557 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/action/GenerateCarveoutAction.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/action/GenerateCarveoutAction.java @@ -1,7 +1,6 @@ package org.janelia.workstation.gui.large_volume_viewer.action; import java.awt.event.ActionEvent; -import java.awt.image.BufferedImage; import java.io.*; import java.net.URI; import java.nio.channels.ClosedByInterruptException; @@ -20,10 +19,6 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Iterators; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageEncoder; -import com.sun.media.jai.codec.TIFFEncodeParam; import org.apache.commons.io.FileUtils; import org.janelia.model.domain.tiledMicroscope.TmGeoAnnotation; import org.janelia.model.domain.tiledMicroscope.TmNeuronMetadata; diff --git a/modules/LargeVolumeViewer/src/test/java/org/janelia/workstation/gui/large_volume_viewer/TiffRoundTripTest.java b/modules/LargeVolumeViewer/src/test/java/org/janelia/workstation/gui/large_volume_viewer/TiffRoundTripTest.java new file mode 100644 index 0000000000..2db9013bec --- /dev/null +++ b/modules/LargeVolumeViewer/src/test/java/org/janelia/workstation/gui/large_volume_viewer/TiffRoundTripTest.java @@ -0,0 +1,103 @@ +package org.janelia.workstation.gui.large_volume_viewer; + +import static org.junit.Assert.*; + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferUShort; +import java.awt.image.RenderedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; + +import org.junit.Test; + +/** + * Round-trip validation: write a multi-page 16-bit grayscale TIFF using the + * migrated writer path, read it back using the migrated reader path, and assert + * exact pixel-level fidelity. + */ +public class TiffRoundTripTest { + + private static final int WIDTH = 64; + private static final int HEIGHT = 64; + private static final int PAGES = 3; + + /** Known pixel values for each page (distinctive 16-bit values). */ + private static final int[] PAGE_FILL = { 1000, 32767, 65000 }; + + @Test + public void testMultiPage16bitGrayscaleRoundTrip() throws IOException { + + // ---- WRITE ------------------------------------------------------- + // Build PAGES synthetic 16-bit grayscale images with known pixel values. + BufferedImage[] pages = new BufferedImage[PAGES]; + for (int p = 0; p < PAGES; p++) { + BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_USHORT_GRAY); + short fillValue = (short)(PAGE_FILL[p] & 0xFFFF); + short[] data = ((DataBufferUShort) img.getRaster().getDataBuffer()).getData(); + for (int i = 0; i < data.length; i++) { + data[i] = fillValue; + } + pages[p] = img; + } + + File tmpFile = File.createTempFile("tiff-roundtrip-", ".tif"); + tmpFile.deleteOnExit(); + + // Use the migrated writer path (same as CreateSyntheticTiff / PermuteTiff) + try (FileOutputStream fos = new FileOutputStream(tmpFile); + ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) { + + ImageWriter writer = TiffImageIOHelper.getTiffWriter(); + assertNotNull("Could not obtain a TIFF ImageWriter", writer); + writer.setOutput(ios); + writer.prepareWriteSequence(null); + for (BufferedImage page : pages) { + writer.writeToSequence(new IIOImage(page, null, null), null); + } + writer.endWriteSequence(); + writer.dispose(); + } + + System.out.println("[TiffRoundTripTest] Written " + PAGES + "-page 16-bit TIFF to: " + tmpFile); + + // ---- READ -------------------------------------------------------- + // Use the migrated reader path (same as Texture3d / TifVolumeFileLoader) + ImageReader reader = TiffImageIOHelper.getTiffReader(); + assertNotNull("Could not obtain a TIFF ImageReader", reader); + ImageInputStream iis = ImageIO.createImageInputStream(tmpFile); + reader.setInput(iis); + try { + int numPages = reader.getNumImages(true); + assertEquals("Page count mismatch", PAGES, numPages); + + for (int p = 0; p < numPages; p++) { + RenderedImage ri = reader.readAsRenderedImage(p, null); + assertNotNull("Null RenderedImage for page " + p, ri); + + assertEquals("Width mismatch on page " + p, WIDTH, ri.getWidth()); + assertEquals("Height mismatch on page " + p, HEIGHT, ri.getHeight()); + + // Sample the centre pixel — should be exactly PAGE_FILL[p] + int[] sample = ri.getData().getPixel(WIDTH / 2, HEIGHT / 2, (int[]) null); + int actualValue = sample[0]; + System.out.println("[TiffRoundTripTest] Page " + p + + ": expected=" + PAGE_FILL[p] + + " actual=" + actualValue); + assertEquals("Pixel value mismatch on page " + p, PAGE_FILL[p], actualValue); + } + } finally { + reader.dispose(); + iis.close(); + } + + System.out.println("[TiffRoundTripTest] PASS: 16-bit multi-page TIFF round-trip verified pixel-accurate."); + } +} diff --git a/modules/N5Viewer/pom.xml b/modules/N5Viewer/pom.xml index dcd2c1b8ba..3552605ab0 100644 --- a/modules/N5Viewer/pom.xml +++ b/modules/N5Viewer/pom.xml @@ -52,6 +52,15 @@ org.janelia.saalfeldlab n5-viewer_fiji 5.1.0-kr + + + + com.formdev + flatlaf + + org.janelia.saalfeldlab @@ -119,7 +128,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/SceneWindow/pom.xml b/modules/SceneWindow/pom.xml index ccb8319e71..8dc52ec560 100644 --- a/modules/SceneWindow/pom.xml +++ b/modules/SceneWindow/pom.xml @@ -89,7 +89,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/SiteHortaCloud/pom.xml b/modules/SiteHortaCloud/pom.xml index 8f04f472f2..2df9eb398b 100644 --- a/modules/SiteHortaCloud/pom.xml +++ b/modules/SiteHortaCloud/pom.xml @@ -62,7 +62,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/SiteJRC/pom.xml b/modules/SiteJRC/pom.xml index 9a23c409cc..cacfc3fbec 100644 --- a/modules/SiteJRC/pom.xml +++ b/modules/SiteJRC/pom.xml @@ -70,7 +70,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/Viewer3D/pom.xml b/modules/Viewer3D/pom.xml index e03b599431..702a04ebe3 100644 --- a/modules/Viewer3D/pom.xml +++ b/modules/Viewer3D/pom.xml @@ -61,7 +61,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TifVolumeFileLoader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TifVolumeFileLoader.java index e4422184c7..b60f1fe9c9 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TifVolumeFileLoader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TifVolumeFileLoader.java @@ -6,24 +6,21 @@ package org.janelia.workstation.img_3d_loader; -import com.sun.media.jai.codec.*; - -import javax.media.jai.NullOpImage; -import javax.media.jai.OpImage; -import javax.media.jai.RenderedImageAdapter; - +import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferUShort; import java.awt.image.RenderedImage; - import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; + import org.apache.log4j.Logger; import org.janelia.workstation.img_3d_loader.AbstractVolumeFileLoader; import org.janelia.workstation.img_3d_loader.LoaderSubsetHelper; @@ -37,13 +34,13 @@ public class TifVolumeFileLoader extends AbstractVolumeFileLoader { private LoaderSubsetHelper subsetHelper; private int sheetCountFromFile; - + private static final Logger logger = Logger.getLogger(TifVolumeFileLoader.class); public static final int LOAD_SIZE = 8 * 1024 * 1024; /** * Sets maximum size in all dimensions, to add to outgoing image. - * + * * @param dimensions how many voxels to use. */ public void setOutputDimensions( int[] dimensions ) { @@ -52,18 +49,18 @@ public void setOutputDimensions( int[] dimensions ) { } subsetHelper.setOutputDimensions(dimensions); } - + public void setConversionCharacteristics( double[][] fwdTransform, double[][] invTransform, int[] minCorner, int[] extent, List queryCoords ) { if ( subsetHelper == null ) { - subsetHelper = new LoaderSubsetHelper(); + subsetHelper = new LoaderSubsetHelper(); } subsetHelper.setTransformCharacteristics(fwdTransform, invTransform, minCorner, extent, queryCoords); } - + @Override public void loadVolumeFile( String fileName ) throws Exception { setUnCachedFileName(fileName); - + final File file = new File(fileName); logger.debug("Loading the subset of images."); Collection allImages = loadTIFF( file ); @@ -99,7 +96,7 @@ public void loadVolumeFile( String fileName ) throws Exception { setSx(subsetHelper.getSx()); setSy(subsetHelper.getSy()); setSz(subsetHelper.getSz()); - + sheetSize = subsetHelper.initializeStorage(file.length()); setPixelBytes( subsetHelper.getPixelBytes() ); setArgbTextureIntArray(subsetHelper.getArgbTextureIntArray()); @@ -115,7 +112,7 @@ public void loadVolumeFile( String fileName ) throws Exception { else { if ( expectedWidth != zSlice.getWidth() || expectedHeight != zSlice.getHeight() ) { throw new IllegalStateException( "Image number " + zOffset + - " with HEIGHT=" + zSlice.getHeight() + " and WIDTH=" + + " with HEIGHT=" + zSlice.getHeight() + " and WIDTH=" + zSlice.getWidth() + " has dimensions which do not match previous width * height of " + expectedWidth + " * " + expectedHeight ); } } @@ -130,7 +127,7 @@ public void loadVolumeFile( String fileName ) throws Exception { zOffset ++; } } - + public int initializeStorage(final long fileLength) { setPixelBytes((int)Math.floor( fileLength / ((getSx()*getSy()) * getSz()) )); if ( getPixelBytes() == 4 ) { @@ -141,7 +138,7 @@ public int initializeStorage(final long fileLength) { } return getSx() * getSy(); } - + private void storeToBuffer(int zOffset, int sheetSize, BufferedImage zSlice) { final int outputBufferOffset = zOffset * sheetSize; if ( getPixelBytes() == 1 ) { @@ -174,83 +171,73 @@ else if ( getPixelBytes() == 4 ) { } /** - * Load specified tiff page and return as buffered zSlice. - * From: http://opencapture.googlecode.com/svn/0.0.2/OpenCapture/src/net/filterlogic/util/imaging/ToTIFF.java - * - * @param file - * @param imageToLoad Page to load - * @return BufferedImage + * Load specified tiff pages and return as buffered images. + * + * @param file TIFF file to load + * @return collection of BufferedImages, one per page */ private Collection loadTIFF(File file) { Collection imageCollection = new ArrayList<>(); + ImageReader reader = TiffImageIOHelper.getTiffReader(); try { - BufferedImage wholeImage = null; - SeekableStream s = new FileSeekableStream(file); - - TIFFDecodeParam param = null; - logger.debug("In loadTIFF " + file + " create codec..."); - ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param); + ImageInputStream iis = ImageIO.createImageInputStream(file); + reader.setInput(iis); logger.debug("In loadTIFF " + file + " getting number of pages..."); - int maxPage = dec.getNumPages(); - sheetCountFromFile = maxPage; + int maxPage = reader.getNumImages(true); + sheetCountFromFile = maxPage; if ( subsetHelper != null ) { subsetHelper.setSourceDepth( sheetCountFromFile ); subsetHelper.calculateBoundingZ( sheetCountFromFile ); } if ( logger.isDebugEnabled() ) - logger.debug("In loadTIFF " + file + " NullOpImage loop."); + logger.debug("In loadTIFF " + file + " reading pages loop."); for (int imageToLoad = 0; imageToLoad < maxPage; imageToLoad++) { if ( subsetHelper == null || subsetHelper.inZSubset( imageToLoad ) ) { - RenderedImage op - = new NullOpImage(dec.decodeAsRenderedImage(imageToLoad), - null, - OpImage.OP_IO_BOUND, - null); - wholeImage = renderedToBuffered(op); + RenderedImage ri = reader.readAsRenderedImage(imageToLoad, null); + BufferedImage wholeImage = renderedToBuffered(ri); imageCollection.add(wholeImage); } if ( logger.isDebugEnabled() ) - logger.debug("In loadTIFF " + file + " NullOpImage completed: " + imageToLoad); + logger.debug("In loadTIFF " + file + " page completed: " + imageToLoad); } logger.debug("In loadTIFF " + file + " returning image collection."); - s.close(); - + iis.close(); return imageCollection; - } catch (IOException e) { logger.error(e.toString()); - return null; + } finally { + reader.dispose(); } - } - + /** - * Convert RenderedImage to BufferedImage - * @param img - * @return BufferedImage + * Convert RenderedImage to BufferedImage, preserving sample model (e.g. 16-bit grayscale). + * + * @param img source image + * @return BufferedImage with the same pixel data */ private static BufferedImage renderedToBuffered(RenderedImage img) { - if (img instanceof BufferedImage) - { + if (img instanceof BufferedImage) { return (BufferedImage) img; } - - RenderedImageAdapter imageAdapter = new RenderedImageAdapter(img); - BufferedImage bufImage = imageAdapter.getAsBufferedImage(); - return bufImage; + // Copy to a new BufferedImage preserving the color model and sample model + BufferedImage bi = new BufferedImage( + img.getColorModel(), + img.getColorModel().createCompatibleWritableRaster(img.getWidth(), img.getHeight()), + img.getColorModel().isAlphaPremultiplied(), + null); + Graphics2D g = bi.createGraphics(); + g.drawRenderedImage(img, new java.awt.geom.AffineTransform()); + g.dispose(); + return bi; } - - private void getImage( ImageDecoder dec, int imageToLoad, Collection imageCollection ) throws IOException { - RenderedImage op - = new NullOpImage(dec.decodeAsRenderedImage(imageToLoad), - null, - OpImage.OP_IO_BOUND, - null); - BufferedImage wholeImage = renderedToBuffered(op); + private void getImage( ImageReader reader, int imageToLoad, Collection imageCollection ) throws IOException { + RenderedImage ri = reader.readAsRenderedImage(imageToLoad, null); + BufferedImage wholeImage = renderedToBuffered(ri); imageCollection.add(wholeImage); } diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TiffImageIOHelper.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TiffImageIOHelper.java new file mode 100644 index 0000000000..f41b2e5a95 --- /dev/null +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/img_3d_loader/TiffImageIOHelper.java @@ -0,0 +1,60 @@ +package org.janelia.workstation.img_3d_loader; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import java.util.Iterator; + +/** + * Helper for acquiring TIFF ImageReader/ImageWriter instances. + *

+ * Under NetBeans module isolation, {@link ImageIO} SPI discovery may fail to find + * TwelveMonkeys providers. This helper first tries the standard SPI route, then + * falls back to instantiating the TwelveMonkeys SPIs directly. + */ +public final class TiffImageIOHelper { + + private TiffImageIOHelper() {} + + /** + * Returns a TIFF {@link ImageReader}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageReaderSpi} directly. + * + * @return a ready-to-use TIFF ImageReader (caller must call {@code setInput}) + * @throws IllegalStateException if no TIFF reader is available + */ + public static ImageReader getTiffReader() { + Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); + if (readers.hasNext()) { + return readers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly (avoids NetBeans classloader issues) + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi() + .createReaderInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageReader available", e); + } + } + + /** + * Returns a TIFF {@link ImageWriter}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageWriterSpi} directly. + * + * @return a ready-to-use TIFF ImageWriter (caller must call {@code setOutput}) + * @throws IllegalStateException if no TIFF writer is available + */ + public static ImageWriter getTiffWriter() { + Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); + if (writers.hasNext()) { + return writers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageWriterSpi() + .createWriterInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageWriter available", e); + } + } +} diff --git a/modules/ViewerController/pom.xml b/modules/ViewerController/pom.xml index 9e5856999f..b0f71d8b24 100644 --- a/modules/ViewerController/pom.xml +++ b/modules/ViewerController/pom.xml @@ -168,7 +168,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/action/CreateWorkspaceAction.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/action/CreateWorkspaceAction.java index ccd83766f1..bc894a3ba4 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/action/CreateWorkspaceAction.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/action/CreateWorkspaceAction.java @@ -13,7 +13,7 @@ import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionReferences; -import org.openide.awt.ActionRegistration;; +import org.openide.awt.ActionRegistration; import org.openide.util.NbBundle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/ExtractOctreeSubvolume.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/ExtractOctreeSubvolume.java index 3c6c8d2a89..4bb341442c 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/ExtractOctreeSubvolume.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/ExtractOctreeSubvolume.java @@ -4,14 +4,13 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.net.MalformedURLException; -import java.util.Iterator; -import com.google.common.collect.Iterators; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageEncoder; -import com.sun.media.jai.codec.TIFFEncodeParam; +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; + import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.integration.util.FrameworkAccess; @@ -19,7 +18,7 @@ public class ExtractOctreeSubvolume { /** * Creates a tiff file of a subvolume from an octree on-disk volume. - * + * * @param args */ public static void main(String[] args) { @@ -49,31 +48,34 @@ public static void main(String[] args) { FrameworkAccess.handleException(e); } } - + /** * Implementation with stronger type arguments than main() has... - * @throws IOException + * @throws IOException */ public static void extractSubvolume( Vec3 corner1, Vec3 corner2, double resolutionMicrometers, File inputOctreeFolder, - File outputTiff) throws IOException + File outputTiff) throws IOException { SharedVolumeImage wholeImage = new SharedVolumeImage(); wholeImage.loadURL(inputOctreeFolder.toURI().toURL()); Subvolume subvolume = new Subvolume(corner1, corner2, resolutionMicrometers, wholeImage); - // Write output tiff + // Write multi-page output tiff using ImageIO + TwelveMonkeys BufferedImage outSlices[] = subvolume.getAsBufferedImages(); - TIFFEncodeParam params = new TIFFEncodeParam(); - Iterator it = Iterators.forArray(outSlices); - if (it.hasNext()) it.next(); // Avoid duplicate first slice - params.setExtraImages(it); - OutputStream out = new FileOutputStream(outputTiff); - ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params); - encoder.encode(outSlices[0]); - out.close(); + try (FileOutputStream fos = new FileOutputStream(outputTiff); + ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) { + ImageWriter writer = TiffImageIOHelper.getTiffWriter(); + writer.setOutput(ios); + writer.prepareWriteSequence(null); + for (BufferedImage outSlice : outSlices) { + writer.writeToSequence(new IIOImage(outSlice, null, null), null); + } + writer.endWriteSequence(); + writer.dispose(); + } } private static void usage(String [] args) { diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/FileBasedOctreeMetadataSniffer.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/FileBasedOctreeMetadataSniffer.java index 9081009a85..9507d4b671 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/FileBasedOctreeMetadataSniffer.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/FileBasedOctreeMetadataSniffer.java @@ -1,17 +1,15 @@ package org.janelia.workstation.controller.tileimagery; +import java.awt.image.RenderedImage; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import javax.media.jai.RenderedImageAdapter; - -import com.sun.media.jai.codec.FileSeekableStream; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageDecoder; -import com.sun.media.jai.codec.SeekableStream; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; import org.janelia.it.jacs.model.user_data.tiledMicroscope.CoordinateToRawTransform; import org.janelia.workstation.geom.CoordinateAxis; @@ -174,40 +172,45 @@ void retrieveMetadata() { // Deduce other parameters from first image file contents File tiff = new File(topFolder, CHANNEL_0_STD_TIFF_NAME); - SeekableStream s = new FileSeekableStream(tiff); - ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", s, null); - // Z dimension is related to number of tiff pages - int sz = decoder.getNumPages(); - - // Get X/Y dimensions from first image - RenderedImageAdapter ria = new RenderedImageAdapter( - decoder.decodeAsRenderedImage(0)); - int sx = ria.getWidth(); - int sy = ria.getHeight(); - - log.info("SX={}, SY={}, SZ={}.", sx, sy, sz); - - // Full volume could be much larger than this downsampled tile - int[] tileSize = new int[3]; - tileSize[2] = sz; - if (sz < 1) { - return; + ImageReader reader = TiffImageIOHelper.getTiffReader(); + ImageInputStream iis = ImageIO.createImageInputStream(tiff); + reader.setInput(iis); + try { + // Z dimension is related to number of tiff pages + int sz = reader.getNumImages(true); + + // Get X/Y dimensions and color model from first image + RenderedImage firstImage = reader.readAsRenderedImage(0, null); + int sx = firstImage.getWidth(); + int sy = firstImage.getHeight(); + + log.info("SX={}, SY={}, SZ={}.", sx, sy, sz); + + // Full volume could be much larger than this downsampled tile + int[] tileSize = new int[3]; + tileSize[2] = sz; + if (sz < 1) { + return; + } + tileSize[0] = sx; + tileSize[1] = sy; + tileFormat.setTileSize(tileSize); + + int[] volumeSize = new int[3]; + volumeSize[2] = zoomFactor * sz; + volumeSize[0] = zoomFactor * sx; + volumeSize[1] = zoomFactor * sy; + tileFormat.setVolumeSize(volumeSize); + + int bitDepth = firstImage.getColorModel().getPixelSize(); + tileFormat.setBitDepth(bitDepth); + tileFormat.setIntensityMax((int) Math.pow(2, bitDepth) - 1); + + tileFormat.setSrgb(firstImage.getColorModel().getColorSpace().isCS_sRGB()); + } finally { + reader.dispose(); + iis.close(); } - tileSize[0] = sx; - tileSize[1] = sy; - tileFormat.setTileSize(tileSize); - - int[] volumeSize = new int[3]; - volumeSize[2] = zoomFactor * sz; - volumeSize[0] = zoomFactor * sx; - volumeSize[1] = zoomFactor * sy; - tileFormat.setVolumeSize(volumeSize); - - int bitDepth = ria.getColorModel().getPixelSize(); - tileFormat.setBitDepth(bitDepth); - tileFormat.setIntensityMax((int) Math.pow(2, bitDepth) - 1); - - tileFormat.setSrgb(ria.getColorModel().getColorSpace().isCS_sRGB()); // Setup the origin and the scale. updateOriginAndScale(); @@ -233,4 +236,3 @@ private void updateOriginAndScale() { } } - diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TiffImageIOHelper.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TiffImageIOHelper.java new file mode 100644 index 0000000000..b1202b2961 --- /dev/null +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TiffImageIOHelper.java @@ -0,0 +1,60 @@ +package org.janelia.workstation.controller.tileimagery; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import java.util.Iterator; + +/** + * Helper for acquiring TIFF ImageReader/ImageWriter instances. + *

+ * Under NetBeans module isolation, {@link ImageIO} SPI discovery may fail to find + * TwelveMonkeys providers. This helper first tries the standard SPI route, then + * falls back to instantiating the TwelveMonkeys SPIs directly. + */ +public final class TiffImageIOHelper { + + private TiffImageIOHelper() {} + + /** + * Returns a TIFF {@link ImageReader}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageReaderSpi} directly. + * + * @return a ready-to-use TIFF ImageReader (caller must call {@code setInput}) + * @throws IllegalStateException if no TIFF reader is available + */ + public static ImageReader getTiffReader() { + Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); + if (readers.hasNext()) { + return readers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly (avoids NetBeans classloader issues) + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi() + .createReaderInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageReader available", e); + } + } + + /** + * Returns a TIFF {@link ImageWriter}. Tries SPI discovery first; if that returns + * nothing, falls back to the TwelveMonkeys {@code TIFFImageWriterSpi} directly. + * + * @return a ready-to-use TIFF ImageWriter (caller must call {@code setOutput}) + * @throws IllegalStateException if no TIFF writer is available + */ + public static ImageWriter getTiffWriter() { + Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); + if (writers.hasNext()) { + return writers.next(); + } + // Fallback: instantiate TwelveMonkeys SPI directly + try { + return new com.twelvemonkeys.imageio.plugins.tiff.TIFFImageWriterSpi() + .createWriterInstance(null); + } catch (Exception e) { + throw new IllegalStateException("No TIFF ImageWriter available", e); + } + } +} diff --git a/modules/ViewerInfoPanel/pom.xml b/modules/ViewerInfoPanel/pom.xml index aaa2198741..ff5946eacc 100644 --- a/modules/ViewerInfoPanel/pom.xml +++ b/modules/ViewerInfoPanel/pom.xml @@ -125,7 +125,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/application/pom.xml b/modules/application/pom.xml index 03f106c1fa..ded9de7f2c 100644 --- a/modules/application/pom.xml +++ b/modules/application/pom.xml @@ -28,13 +28,7 @@ branding - - - org.janelia.workstation - darcula - - - + org.janelia.workstation adminstration @@ -205,10 +199,6 @@ org-netbeans-modules-junitlib org.netbeans.modules - - org-netbeans-api-htmlui - org.netbeans.api - org-netbeans-modules-templates org.netbeans.modules @@ -284,7 +274,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin ${clusterName} @@ -442,7 +432,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin @@ -495,7 +485,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/application/src/main/resources/janeliaws.conf b/modules/application/src/main/resources/janeliaws.conf index 7107b3eeea..77bc0e7004 100644 --- a/modules/application/src/main/resources/janeliaws.conf +++ b/modules/application/src/main/resources/janeliaws.conf @@ -5,7 +5,7 @@ default_mac_userdir="${HOME}/Library/Application Support/JaneliaWorkstation/0.4" # options used by the launcher by default, can be overridden by explicit # command line switches -default_options="--branding ${brandingToken} -J-Dbranding.token=${brandingToken} -J-Dapple.awt.brushMetalLook=false -J-XX:+UseParallelGC -J-Dhttp.maxConnections=20 -J-Xms1024m -J-Xmx8192m -J-Dnetbeans.exception.alert.min.level=2000 -J-Dnetbeans.exception.report.min.level=3000 -J-Dplugin.manager.check.interval=10 -J-Dplugin.manager.check.new.plugins=true -J-Dplugin.manager.check.updates=true -J-Djavax.xml.bind.JAXBContext=com.sun.xml.internal.bind.v2.ContextFactory" +default_options="--branding ${brandingToken} --laf com.formdev.flatlaf.FlatDarkLaf -J-Dbranding.token=${brandingToken} -J-Dapple.awt.brushMetalLook=false -J-XX:+UseParallelGC -J-Dhttp.maxConnections=20 -J-Xms1024m -J-Xmx8192m -J-Dnetbeans.exception.alert.min.level=2000 -J-Dnetbeans.exception.report.min.level=3000 -J-Dplugin.manager.check.interval=10 -J-Dplugin.manager.check.new.plugins=true -J-Dplugin.manager.check.updates=true -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.lang.reflect=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.nio=ALL-UNNAMED -J--add-opens=java.base/java.util=ALL-UNNAMED -J--add-opens=java.base/java.security=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J--add-opens=java.desktop/java.awt=ALL-UNNAMED -J--add-opens=java.desktop/sun.awt=ALL-UNNAMED -J--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED" # for development purposes you may wish to append: -J-Dnetbeans.logger.console=true -J-ea diff --git a/modules/application_horta/pom.xml b/modules/application_horta/pom.xml index 10bb694c39..6842d47bcf 100644 --- a/modules/application_horta/pom.xml +++ b/modules/application_horta/pom.xml @@ -28,13 +28,7 @@ branding - - - org.janelia.workstation - darcula - - - + org.janelia.workstation adminstration @@ -186,10 +180,6 @@ org-netbeans-modules-junitlib org.netbeans.modules - - org-netbeans-api-htmlui - org.netbeans.api - org-netbeans-modules-templates org.netbeans.modules @@ -265,7 +255,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin ${clusterName} @@ -423,7 +413,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin @@ -476,7 +466,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/modules/application_horta/src/main/resources/horta.conf b/modules/application_horta/src/main/resources/horta.conf index 356f40b9cf..b8b0cbfe00 100644 --- a/modules/application_horta/src/main/resources/horta.conf +++ b/modules/application_horta/src/main/resources/horta.conf @@ -5,7 +5,7 @@ default_mac_userdir="${HOME}/Library/Application Support/JaneliaWorkstation/0.4" # options used by the launcher by default, can be overridden by explicit # command line switches -default_options="--branding ${brandingToken} -J-Dbranding.token=${brandingToken} -J-Dapple.awt.brushMetalLook=false -J-XX:+UseParallelGC -J-Dhttp.maxConnections=20 -J-Xms1024m -J-Xmx40960m -J-Dnetbeans.exception.alert.min.level=2000 -J-Dnetbeans.exception.report.min.level=3000 -J-Dplugin.manager.check.interval=10 -J-Dplugin.manager.check.new.plugins=true -J-Dplugin.manager.check.updates=true -J-Djavax.xml.bind.JAXBContext=com.sun.xml.internal.bind.v2.ContextFactory" +default_options="--branding ${brandingToken} --laf com.formdev.flatlaf.FlatDarkLaf -J-Dbranding.token=${brandingToken} -J-Dapple.awt.brushMetalLook=false -J-XX:+UseParallelGC -J-Dhttp.maxConnections=20 -J-Xms1024m -J-Xmx40960m -J-Dnetbeans.exception.alert.min.level=2000 -J-Dnetbeans.exception.report.min.level=3000 -J-Dplugin.manager.check.interval=10 -J-Dplugin.manager.check.new.plugins=true -J-Dplugin.manager.check.updates=true -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.lang.reflect=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.nio=ALL-UNNAMED -J--add-opens=java.base/java.util=ALL-UNNAMED -J--add-opens=java.base/java.security=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J--add-opens=java.desktop/java.awt=ALL-UNNAMED -J--add-opens=java.desktop/sun.awt=ALL-UNNAMED -J--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED" # for development purposes you may wish to append: -J-Dnetbeans.logger.console=true -J-ea diff --git a/modules/branding/pom.xml b/modules/branding/pom.xml index 1461ae9c10..5343726a2a 100644 --- a/modules/branding/pom.xml +++ b/modules/branding/pom.xml @@ -25,7 +25,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin diff --git a/pom.xml b/pom.xml index 1b55413d4e..44109cf4c2 100644 --- a/pom.xml +++ b/pom.xml @@ -72,14 +72,15 @@ ${netbeans.run.params.ide} - RELEASE82 + RELEASE300 3.79 - 1.8 - 1.8 + 21 + 21 + 21 -Xlint:-path -Xdoclint:none @@ -123,7 +124,7 @@ 3.1.0 - 3.8.0 + 3.13.0 3.1.1 @@ -149,11 +150,11 @@ 3.0.1 - 2.22.1 + 3.2.5 3.0.0 - 4.1 + 14.5 2.0.0 @@ -163,7 +164,7 @@ 2.7 - 3.0.0-M2 + 3.5.0 @@ -653,21 +654,10 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin ${janeliaws.nbm-maven-plugin.version} true - - - - org.apache.maven.shared - maven-dependency-analyzer - 1.11.1 - - org.apache.maven.plugins @@ -722,7 +712,11 @@ - + + org.panteam + jpackage-maven-plugin + 1.6.0 + org.apache.maven.plugins maven-jarsigner-plugin @@ -823,9 +817,7 @@ maven-compiler-plugin ${janeliaws.javac.debug} - ${janeliaws.javac.optimize} - ${janeliaws.javac.source} - ${janeliaws.javac.target} + ${maven.compiler.release} ${janeliaws.javac.showDeprecation} ${janeliaws.javac.showWarnings} ${janeliaws.javac.fork} @@ -875,7 +867,7 @@ - org.codehaus.mojo + org.apache.netbeans.utilities nbm-maven-plugin true @@ -891,15 +883,7 @@ true Janelia Open Source License license.txt - - - ${clusterName} - false - true - true - true - - warn @@ -957,6 +941,10 @@ 3.2 + + [21,22) + This project requires JDK 21 (Apache NetBeans RELEASE250 does not support newer JDKs). Set JAVA_HOME to a JDK 21. + @@ -1184,8 +1172,7 @@ modules/IntegrationAPIs modules/Core modules/CommonGUI - modules/DarculaLAF - modules/DataBrowser +modules/DataBrowser modules/LMDataBrowser modules/ColorDepthSearch modules/HortaTracer From f30776d5d251ea8e1b322b9f9fa9f5a8da77fa6a Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Fri, 19 Jun 2026 23:30:29 -0400 Subject: [PATCH 02/12] xml dependency --- modules/CommonLibraries/pom.xml | 20 +++++ modules/Core/pom.xml | 12 +++ .../TaskWorkflowViewTopComponent.java | 2 +- modules/WoodstoxLib/pom.xml | 46 ++++++++++ modules/application/pom.xml | 6 ++ modules/application_horta/pom.xml | 6 ++ pom.xml | 83 ++++++++++++++++++- 7 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 modules/WoodstoxLib/pom.xml diff --git a/modules/CommonLibraries/pom.xml b/modules/CommonLibraries/pom.xml index 71daedd8d5..6cdc24e9fa 100644 --- a/modules/CommonLibraries/pom.xml +++ b/modules/CommonLibraries/pom.xml @@ -57,6 +57,10 @@ org.janelia.jacs-storage jacsstorage-clients + + org.janelia.workstation + woodstoxlib + org.janelia.legacy shared @@ -130,6 +134,16 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml ${janeliaws.jackson.version} + + + com.fasterxml.woodstox + woodstox-core + + + org.codehaus.woodstox + stax2-api + + com.fasterxml.jackson.dataformat @@ -281,6 +295,12 @@ org.apache.solr solr-solrj 3.5.0 + + + org.codehaus.woodstox + wstx-asl + + org.apache.jackrabbit diff --git a/modules/Core/pom.xml b/modules/Core/pom.xml index 9eee847c86..e57480e5a4 100644 --- a/modules/Core/pom.xml +++ b/modules/Core/pom.xml @@ -138,6 +138,12 @@ org.apache.axis2 axis2-kernel 1.5.6 + + + org.codehaus.woodstox + wstx-asl + + org.apache.axis2 @@ -153,6 +159,12 @@ org.apache.ws.commons.axiom axiom-impl 1.2.12 + + + org.codehaus.woodstox + wstx-asl + + org.eclipse.jetty diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/task_workflow/TaskWorkflowViewTopComponent.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/task_workflow/TaskWorkflowViewTopComponent.java index 8d24dfb39c..1375103c36 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/task_workflow/TaskWorkflowViewTopComponent.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/task_workflow/TaskWorkflowViewTopComponent.java @@ -191,7 +191,7 @@ public TaskWorkflowViewTopComponent() { } - public static final TaskWorkflowViewTopComponent getInstance() { + public static TaskWorkflowViewTopComponent getInstance() { return (TaskWorkflowViewTopComponent)WindowManager.getDefault().findTopComponent(PREFERRED_ID); } diff --git a/modules/WoodstoxLib/pom.xml b/modules/WoodstoxLib/pom.xml new file mode 100644 index 0000000000..8c8066e847 --- /dev/null +++ b/modules/WoodstoxLib/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + org.janelia + workstation + 9.21 + ../.. + + + WoodstoxLib + org.janelia.workstation + woodstoxlib + 9.21 + nbm + + + + org.codehaus.woodstox + stax2-api + 4.2.1 + + + com.fasterxml.woodstox + woodstox-core + 6.2.7 + + + + + + + org.apache.netbeans.utilities + nbm-maven-plugin + + + com.ctc.wstx.** + org.codehaus.stax2.** + + + + + + + diff --git a/modules/application/pom.xml b/modules/application/pom.xml index ded9de7f2c..c4993cfe25 100644 --- a/modules/application/pom.xml +++ b/modules/application/pom.xml @@ -40,6 +40,12 @@ common-gui + + + org.janelia.workstation + woodstoxlib + + org.janelia.workstation diff --git a/modules/application_horta/pom.xml b/modules/application_horta/pom.xml index 6842d47bcf..9a616e37bb 100644 --- a/modules/application_horta/pom.xml +++ b/modules/application_horta/pom.xml @@ -40,6 +40,12 @@ common-gui + + + org.janelia.workstation + woodstoxlib + + org.janelia.workstation diff --git a/pom.xml b/pom.xml index 44109cf4c2..ae3b4493f5 100644 --- a/pom.xml +++ b/pom.xml @@ -246,6 +246,13 @@ ${project.version} + + + org.janelia.workstation + woodstoxlib + ${project.version} + + org.janelia.workstation @@ -821,6 +828,77 @@ ${janeliaws.javac.showDeprecation} ${janeliaws.javac.showWarnings} ${janeliaws.javac.fork} + + + org.netbeans.api + org-netbeans-api-annotations-common + ${netbeans.version} + + + org.netbeans.api + org-netbeans-modules-options-api + ${netbeans.version} + + + org.netbeans.api + org-netbeans-modules-settings + ${netbeans.version} + + + org.netbeans.api + org-openide-awt + ${netbeans.version} + + + org.netbeans.api + org-openide-filesystems + ${netbeans.version} + + + org.netbeans.api + org-openide-loaders + ${netbeans.version} + + + org.netbeans.api + org-openide-modules + ${netbeans.version} + + + org.netbeans.api + org-openide-nodes + ${netbeans.version} + + + org.netbeans.api + org-openide-util + ${netbeans.version} + + + org.netbeans.api + org-openide-util-lookup + ${netbeans.version} + + + org.netbeans.api + org-openide-windows + ${netbeans.version} + + + + org.netbeans.api.annotations.common.proc.StaticResourceProcessor + org.netbeans.modules.options.OptionsPanelControllerProcessor + org.netbeans.modules.settings.convertors.ConvertorProcessor + org.netbeans.modules.openide.awt.ActionProcessor + org.netbeans.modules.openide.filesystems.declmime.MIMEResolverProcessor + org.netbeans.modules.openide.loaders.DataObjectFactoryProcessor + org.netbeans.modules.openide.modules.PatchedPublicProcessor + org.netbeans.modules.openide.nodes.NodesAnnotationProcessor + org.netbeans.modules.openide.util.NbBundleProcessor + org.netbeans.modules.openide.util.NamedServiceProcessor + org.netbeans.modules.openide.util.ServiceProviderProcessor + org.netbeans.modules.openide.windows.TopComponentProcessor + ${janeliaws.javac.xlint} ${janeliaws.javac.doclint} @@ -942,8 +1020,8 @@ 3.2 - [21,22) - This project requires JDK 21 (Apache NetBeans RELEASE250 does not support newer JDKs). Set JAVA_HOME to a JDK 21. + [21,) + This project requires at least JDK 21 (Apache NetBeans RELEASE300 does not support older JDKs). @@ -1168,6 +1246,7 @@ modules/AdministrationGUI + modules/WoodstoxLib modules/CommonLibraries modules/IntegrationAPIs modules/Core From fbec7d4090cbae4e37da8f62871ea822161f9573 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sat, 20 Jun 2026 00:58:40 -0400 Subject: [PATCH 03/12] update jogl - remove 213 and 224 and replaced them with 260 --- modules/DataBrowser/pom.xml | 4 +- modules/GLViewerTools/pom.xml | 4 +- .../org/janelia/gltools/BasicGL3Actor.java | 2 +- .../janelia/gltools/BasicScreenBlitActor.java | 4 +- .../janelia/gltools/BasicShaderProgram.java | 4 +- .../org/janelia/gltools/BufferClearActor.java | 2 +- .../janelia/gltools/ColorBackgroundActor.java | 2 +- .../java/org/janelia/gltools/Framebuffer.java | 10 +-- .../java/org/janelia/gltools/GL3Actor.java | 2 +- .../java/org/janelia/gltools/GL3Resource.java | 2 +- .../janelia/gltools/LightingBlitActor.java | 2 +- .../java/org/janelia/gltools/MeshActor.java | 2 +- .../org/janelia/gltools/MeshFloatVbo.java | 2 +- .../janelia/gltools/MultipassRenderer.java | 2 +- .../java/org/janelia/gltools/RenderPass.java | 2 +- .../org/janelia/gltools/RenderTarget.java | 8 +-- .../org/janelia/gltools/ShaderProgram.java | 2 +- .../java/org/janelia/gltools/ShaderStep.java | 6 +- .../janelia/gltools/SolidColorGLRenderer.java | 6 +- .../gltools/material/BasicMaterial.java | 2 +- .../gltools/material/DiffuseMaterial.java | 2 +- .../gltools/material/FlatMeshShader.java | 2 +- .../gltools/material/IBLDiffuseMaterial.java | 4 +- .../material/ImageParticleMaterial.java | 4 +- .../janelia/gltools/material/Material.java | 2 +- .../gltools/material/NormalMaterial.java | 2 +- .../gltools/material/OutlineMaterial.java | 6 +- .../material/ScreenGradientColorMaterial.java | 2 +- .../gltools/material/TexCoordMaterial.java | 2 +- .../gltools/material/TransparentEnvelope.java | 4 +- .../material/VolumeSurfaceMaterial.java | 4 +- .../gltools/material/WireframeMaterial.java | 4 +- .../gltools/scenegraph/DisposeGlVisitor.java | 2 +- .../gltools/scenegraph/DrawableNode.java | 2 +- .../scenegraph/SceneGraphRenderer.java | 10 +-- .../janelia/gltools/texture/BasicTexture.java | 6 +- .../janelia/gltools/texture/Texture2d.java | 4 +- .../janelia/gltools/texture/Texture3d.java | 2 +- .../scenegraph/SceneGraphRendererTest.java | 8 +-- modules/HortaTracer/pom.xml | 4 +- .../horta/NeuronTracerTopComponent.java | 2 +- .../horta/actors/CenterCrossHairActor.java | 4 +- .../janelia/horta/actors/ConesMaterial.java | 2 +- .../horta/actors/OmeZarrVolumeActor.java | 4 +- .../horta/actors/OmeZarrVolumeMeshActor.java | 2 +- .../horta/actors/ParentVertexActor.java | 2 +- .../org/janelia/horta/actors/ScaleBar.java | 4 +- .../janelia/horta/actors/SpheresActor.java | 2 +- .../janelia/horta/actors/SpheresMaterial.java | 4 +- .../janelia/horta/actors/TetVolumeActor.java | 4 +- .../horta/actors/TetVolumeMaterial.java | 2 +- .../horta/actors/TetVolumeMeshActor.java | 2 +- .../janelia/horta/blocks/KtxTileCache.java | 2 +- .../horta/blocks/OmeZarrTileCache.java | 2 +- .../janelia/horta/neuronvbo/NeuronVbo.java | 2 +- .../horta/neuronvbo/NeuronVboActor.java | 2 +- .../horta/neuronvbo/NeuronVboPool.java | 2 +- .../horta/render/BackgroundRenderPass.java | 2 +- .../horta/render/NeuronMPRenderer.java | 4 +- .../horta/render/OpaqueRenderPass.java | 4 +- .../janelia/horta/render/RemapColorActor.java | 4 +- .../horta/render/VolumeRenderPass.java | 4 +- .../horta/volume/VolumeMipMaterial.java | 4 +- modules/Jogl213Lib/pom.xml | 68 ------------------- modules/Jogl213Lib/src/main/nbm/manifest.mf | 4 -- .../org/janelia/jogl213lib/Bundle.properties | 2 - modules/Jogl224Lib/pom.xml | 68 ------------------- modules/Jogl224Lib/src/main/nbm/manifest.mf | 4 -- modules/Jogl260Lib/pom.xml | 66 ++++++++++++++++++ modules/Jogl260Lib/src/main/nbm/manifest.mf | 3 + .../org/janelia/jogl260lib}/Bundle.properties | 2 +- modules/LargeVolumeViewer/pom.xml | 4 +- .../large_volume_viewer/GLCanvasWrapper.java | 12 ++-- .../large_volume_viewer/GLContextSharer.java | 21 +++--- .../GLDrawableWrapper.java | 2 +- .../large_volume_viewer/GLJPanelWrapper.java | 10 +-- .../LargeVolumeViewer.java | 6 +- .../large_volume_viewer/OrthogonalViewer.java | 6 +- .../gui/large_volume_viewer/QuadViewUi.java | 2 +- .../gui/large_volume_viewer/SliceActor.java | 6 +- .../large_volume_viewer/SliceRenderer.java | 4 +- .../large_volume_viewer/TileOutlineActor.java | 4 +- .../shader/AnchorShader.java | 2 +- .../shader/NumeralShader.java | 2 +- .../shader/OutlineShader.java | 2 +- .../shader/PassThroughTextureShader.java | 10 +-- .../shader/SliceColorShader.java | 2 +- .../skeleton/AxesActor.java | 8 +-- .../DirectionalReferenceAxesActor.java | 6 +- .../DirectionalReferenceAxesShader.java | 4 +- .../skeleton/GenericVPLinesHelper.java | 4 +- .../skeleton/SkeletonActor.java | 16 ++--- .../skeleton/TracedPathActor.java | 8 +-- modules/SceneWindow/pom.xml | 4 +- .../org/janelia/scenewindow/GLJComponent.java | 2 +- .../scenewindow/GLJComponentFactory.java | 10 +-- .../janelia/scenewindow/SceneRenderer.java | 8 +-- .../org/janelia/scenewindow/SceneWindow.java | 8 +-- .../scenewindow/stereo/AnaglyphRenderer.java | 6 +- .../scenewindow/stereo/HardwareRenderer.java | 12 ++-- .../scenewindow/stereo/LeftEyeRenderer.java | 6 +- .../stereo/MonoscopicRenderer.java | 6 +- .../stereo/SideBySideRenderer.java | 6 +- .../scenewindow/stereo/StereoRenderer.java | 2 +- modules/Viewer3D/pom.xml | 4 +- .../gui/opengl/CompositeGLActor.java | 2 +- .../workstation/gui/opengl/GL2Adapter.java | 2 +- .../gui/opengl/GL2AdapterFactory.java | 12 ++-- .../workstation/gui/opengl/GLActor.java | 4 +- .../gui/opengl/GLActorContext.java | 2 +- .../workstation/gui/opengl/GLError.java | 4 +- .../workstation/gui/opengl/GLOrthoCamera.java | 2 +- .../workstation/gui/opengl/GLResource.java | 4 +- .../gui/opengl/GLSceneComposer.java | 14 ++-- .../workstation/gui/opengl/LightingActor.java | 4 +- .../workstation/gui/opengl/MeshActor.java | 16 ++--- .../gui/opengl/MeshGroupActor.java | 4 +- .../gui/opengl/SolidBackgroundActor.java | 4 +- .../workstation/gui/opengl/VertexBuffer.java | 4 +- .../gui/opengl/demo/GourdDemo.java | 6 +- .../gui/opengl/demo/TeapotDemo.java | 8 +-- .../gui/opengl/demo/TestSrgbFramebuffer.java | 12 ++-- .../gui/opengl/shader/BasicShader.java | 4 +- .../AnaglyphGreenMagentaStereoMode.java | 4 +- .../stereo3d/AnaglyphRedCyanStereoMode.java | 4 +- .../gui/opengl/stereo3d/BasicStereoMode.java | 4 +- .../opengl/stereo3d/HardwareStereoMode.java | 12 ++-- .../opengl/stereo3d/LeftEyeStereoMode.java | 2 +- .../opengl/stereo3d/LeftRightStereoMode.java | 4 +- .../opengl/stereo3d/RightEyeStereoMode.java | 2 +- .../stereo3d/RowInterleavedStereoMode.java | 18 ++--- .../gui/opengl/stereo3d/StereoMode.java | 2 +- .../opengl/stereo3d/StereoModeChooser.java | 2 +- .../gui/static_view/AbstractVolumeBrick.java | 8 +-- .../static_view/RGBExcludableVolumeBrick.java | 4 +- .../shader/RGBExcludableShader.java | 2 +- .../gui/viewer3d/ActorRenderer.java | 2 +- .../gui/viewer3d/BaseGLViewer.java | 6 +- .../gui/viewer3d/BaseRenderer.java | 10 +-- .../workstation/gui/viewer3d/MipRenderer.java | 10 +-- .../gui/viewer3d/OcclusiveRenderer.java | 16 ++--- .../workstation/gui/viewer3d/OpenGLUtils.java | 4 +- .../workstation/gui/viewer3d/TeapotActor.java | 4 +- .../workstation/gui/viewer3d/ViewportGL.java | 2 +- .../gui/viewer3d/VolumeLoader.java | 2 +- .../gui/viewer3d/axes/AxesActor.java | 4 +- .../viewer3d/buffering/VtxCoordBufMgr.java | 2 +- .../viewer3d/error_trap/JaneliaDebugGL2.java | 2 +- .../gui/viewer3d/learning/RectSolid.java | 6 +- .../gui/viewer3d/learning/Rubics.java | 4 +- .../viewer3d/loader/TextureDataBuilder.java | 2 +- .../matrix_support/MatrixManager.java | 2 +- .../gui/viewer3d/mesh/MeshRenderer.java | 10 +-- .../actor/AttributeManagerBufferUploader.java | 2 +- .../viewer3d/mesh/actor/BufferUploader.java | 2 +- .../viewer3d/mesh/actor/MeshDrawActor.java | 10 +-- .../viewer3d/mesh/shader/MeshDrawShader.java | 4 +- .../viewer3d/picking/RenderedIdPicker.java | 10 +-- .../gui/viewer3d/shader/AbstractShader.java | 2 +- .../gui/viewer3d/shader/VoxelRayShader.java | 2 +- .../viewer3d/text/TextTextureMediator.java | 2 +- .../viewer3d/texture/MaskTextureDataBean.java | 2 +- .../texture/RenderMapTextureBean.java | 2 +- .../gui/viewer3d/texture/TextureDataBean.java | 2 +- .../gui/viewer3d/texture/TextureMediator.java | 8 +-- modules/ViewerController/pom.xml | 4 +- .../tileimagery/PyramidTexture.java | 2 +- .../controller/tileimagery/Texture2dGL.java | 4 +- .../tileimagery/TextureData2dGL.java | 8 +-- .../controller/tileimagery/TextureDataI.java | 2 +- .../controller/tileimagery/Tile2d.java | 4 +- .../controller/tileimagery/TileTexture.java | 2 +- pom.xml | 14 +--- 173 files changed, 455 insertions(+), 541 deletions(-) delete mode 100644 modules/Jogl213Lib/pom.xml delete mode 100644 modules/Jogl213Lib/src/main/nbm/manifest.mf delete mode 100644 modules/Jogl213Lib/src/main/resources/org/janelia/jogl213lib/Bundle.properties delete mode 100644 modules/Jogl224Lib/pom.xml delete mode 100644 modules/Jogl224Lib/src/main/nbm/manifest.mf create mode 100644 modules/Jogl260Lib/pom.xml create mode 100644 modules/Jogl260Lib/src/main/nbm/manifest.mf rename modules/{Jogl224Lib/src/main/resources/org/janelia/jogl224lib => Jogl260Lib/src/main/resources/org/janelia/jogl260lib}/Bundle.properties (53%) diff --git a/modules/DataBrowser/pom.xml b/modules/DataBrowser/pom.xml index f6726dcefe..dba48dfb6a 100644 --- a/modules/DataBrowser/pom.xml +++ b/modules/DataBrowser/pom.xml @@ -41,10 +41,10 @@ core - + org.janelia.workstation - jogl213lib + jogl260lib diff --git a/modules/GLViewerTools/pom.xml b/modules/GLViewerTools/pom.xml index 6d6acd4517..ee4dc62ad5 100644 --- a/modules/GLViewerTools/pom.xml +++ b/modules/GLViewerTools/pom.xml @@ -35,10 +35,10 @@ integration - + org.janelia.workstation - jogl224lib + jogl260lib diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicGL3Actor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicGL3Actor.java index efd7335bdb..164afb6581 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicGL3Actor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicGL3Actor.java @@ -2,7 +2,7 @@ package org.janelia.gltools; import java.util.Collection; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.BasicObject3D; import org.janelia.geometry3d.Matrix4; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicScreenBlitActor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicScreenBlitActor.java index 918eefca46..147e63253f 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicScreenBlitActor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicScreenBlitActor.java @@ -2,8 +2,8 @@ import java.io.IOException; import java.util.Collection; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.ChannelBrightnessModel; import org.janelia.geometry3d.Matrix4; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicShaderProgram.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicShaderProgram.java index c579745edd..4e8ce47908 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicShaderProgram.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BasicShaderProgram.java @@ -5,8 +5,8 @@ import java.nio.IntBuffer; import java.util.ArrayList; import java.util.List; -import javax.media.opengl.GL3; -import javax.media.opengl.GLException; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLException; /** * Represents an OpenGL shader diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BufferClearActor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BufferClearActor.java index ab1cede1f4..d83e9e0c44 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/BufferClearActor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/BufferClearActor.java @@ -1,7 +1,7 @@ package org.janelia.gltools; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ColorBackgroundActor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ColorBackgroundActor.java index d81609afd1..cf5eb6d62a 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ColorBackgroundActor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ColorBackgroundActor.java @@ -1,7 +1,7 @@ package org.janelia.gltools; import java.awt.Color; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.ScreenQuadMesh; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/Framebuffer.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/Framebuffer.java index b34663ecf8..7ec244b899 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/Framebuffer.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/Framebuffer.java @@ -3,11 +3,11 @@ import java.util.ArrayList; import java.util.List; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Actor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Actor.java index b22072b840..9d217cebbc 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Actor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Actor.java @@ -1,7 +1,7 @@ package org.janelia.gltools; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.CompositeObject3d; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Resource.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Resource.java index af7914102a..3fabfc5d7a 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Resource.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/GL3Resource.java @@ -1,7 +1,7 @@ package org.janelia.gltools; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; /** * diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/LightingBlitActor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/LightingBlitActor.java index ad35283593..5c96adaaf8 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/LightingBlitActor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/LightingBlitActor.java @@ -2,7 +2,7 @@ import java.io.IOException; import java.io.InputStream; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.material.BasicMaterial; import org.janelia.gltools.material.Material; import org.janelia.gltools.texture.Texture2d; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshActor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshActor.java index f206e55cdf..6319e196d3 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshActor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshActor.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Observable; import java.util.Observer; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.ConstVector; import org.janelia.geometry3d.CompositeObject3d; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshFloatVbo.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshFloatVbo.java index d38bf5f749..ed754b2390 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshFloatVbo.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MeshFloatVbo.java @@ -5,7 +5,7 @@ import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MultipassRenderer.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MultipassRenderer.java index 89b58426f4..7791cf937f 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/MultipassRenderer.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/MultipassRenderer.java @@ -1,7 +1,7 @@ package org.janelia.gltools; import java.util.ArrayList; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; /** diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderPass.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderPass.java index 9f919032ac..c2358f1e39 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderPass.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderPass.java @@ -6,7 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.ComposableObservable; import org.janelia.geometry3d.ObservableInterface; import org.janelia.geometry3d.AbstractCamera; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderTarget.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderTarget.java index 3aa839cad2..84de016c44 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderTarget.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/RenderTarget.java @@ -5,10 +5,10 @@ import com.jogamp.common.nio.Buffers; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLContext; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLContext; /** * One (of possibly many) textures used as render targets in a FrameBuffer diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderProgram.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderProgram.java index 0b7c4ca046..05022e3a17 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderProgram.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderProgram.java @@ -1,7 +1,7 @@ package org.janelia.gltools; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; /** * diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderStep.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderStep.java index 956fb662b6..83bf265af5 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderStep.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/ShaderStep.java @@ -5,9 +5,9 @@ import java.io.IOException; import java.io.InputStream; import java.nio.IntBuffer; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; -import javax.media.opengl.GLException; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLException; import org.apache.commons.io.IOUtils; /** diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/SolidColorGLRenderer.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/SolidColorGLRenderer.java index 1f510c39ed..a8b63f9fce 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/SolidColorGLRenderer.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/SolidColorGLRenderer.java @@ -2,9 +2,9 @@ package org.janelia.gltools; import java.awt.Color; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; /** * Renderer that paints the entire viewport a single color. diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/BasicMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/BasicMaterial.java index 4c6467932d..eb0d0b5be8 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/BasicMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/BasicMaterial.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.MeshActor; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/DiffuseMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/DiffuseMaterial.java index 440dc2036d..2d1e5d4f2d 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/DiffuseMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/DiffuseMaterial.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/FlatMeshShader.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/FlatMeshShader.java index d8a51d3655..cb79c7aafd 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/FlatMeshShader.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/FlatMeshShader.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/IBLDiffuseMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/IBLDiffuseMaterial.java index e1ac7b8143..b746ff6aa0 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/IBLDiffuseMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/IBLDiffuseMaterial.java @@ -2,8 +2,8 @@ package org.janelia.gltools.material; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ImageParticleMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ImageParticleMaterial.java index 44292ff1ef..77658bb486 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ImageParticleMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ImageParticleMaterial.java @@ -4,8 +4,8 @@ import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.PerspectiveCamera; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/Material.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/Material.java index 2cc487a551..098f309091 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/Material.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/Material.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.GL3Resource; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/NormalMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/NormalMaterial.java index c2f2266bd1..68896283d6 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/NormalMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/NormalMaterial.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/OutlineMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/OutlineMaterial.java index a7c7d30493..07b7b94070 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/OutlineMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/OutlineMaterial.java @@ -3,9 +3,9 @@ import java.awt.Color; import java.io.IOException; -import javax.media.opengl.GL; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.BasicShaderProgram; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ScreenGradientColorMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ScreenGradientColorMaterial.java index aeadac25fb..795f074c33 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ScreenGradientColorMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/ScreenGradientColorMaterial.java @@ -1,6 +1,6 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TexCoordMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TexCoordMaterial.java index 4d7d529e1f..986361e80c 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TexCoordMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TexCoordMaterial.java @@ -1,7 +1,7 @@ package org.janelia.gltools.material; -import javax.media.opengl.GL2ES2; +import com.jogamp.opengl.GL2ES2; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TransparentEnvelope.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TransparentEnvelope.java index 2e4443ca00..091994cf6d 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TransparentEnvelope.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/TransparentEnvelope.java @@ -3,8 +3,8 @@ import java.awt.Color; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/VolumeSurfaceMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/VolumeSurfaceMaterial.java index 392fdc405a..08153c1edd 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/VolumeSurfaceMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/VolumeSurfaceMaterial.java @@ -2,8 +2,8 @@ package org.janelia.gltools.material; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/WireframeMaterial.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/WireframeMaterial.java index 4a4b5ed709..46f599f996 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/WireframeMaterial.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/material/WireframeMaterial.java @@ -3,8 +3,8 @@ import java.awt.Color; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderStep; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DisposeGlVisitor.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DisposeGlVisitor.java index 85a6946b32..9709a665cb 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DisposeGlVisitor.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DisposeGlVisitor.java @@ -1,6 +1,6 @@ package org.janelia.gltools.scenegraph; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; /** * diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DrawableNode.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DrawableNode.java index 2c396d61c6..6d64530c74 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DrawableNode.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/DrawableNode.java @@ -1,6 +1,6 @@ package org.janelia.gltools.scenegraph; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; /** * diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/SceneGraphRenderer.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/SceneGraphRenderer.java index 9a408d60df..aa93ad6337 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/SceneGraphRenderer.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/scenegraph/SceneGraphRenderer.java @@ -3,11 +3,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; /** * diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/BasicTexture.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/BasicTexture.java index 7a698f9a3b..fe91c9c6ab 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/BasicTexture.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/BasicTexture.java @@ -8,9 +8,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GL3; import org.apache.commons.lang.ArrayUtils; import org.janelia.gltools.GL3Resource; import org.slf4j.Logger; diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture2d.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture2d.java index cd144afeab..a6f47f4061 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture2d.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture2d.java @@ -6,8 +6,8 @@ import java.io.InputStream; import java.io.PushbackInputStream; import java.nio.ByteBuffer; -import javax.media.opengl.GL; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL3; import org.janelia.gltools.GL3Resource; /** diff --git a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java index 458e704eb0..9774c82727 100644 --- a/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java +++ b/modules/GLViewerTools/src/main/java/org/janelia/gltools/texture/Texture3d.java @@ -16,7 +16,7 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledThreadPoolExecutor; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import javax.imageio.ImageIO; import javax.imageio.ImageReader; diff --git a/modules/GLViewerTools/src/test/java/org/janelia/gltools/scenegraph/SceneGraphRendererTest.java b/modules/GLViewerTools/src/test/java/org/janelia/gltools/scenegraph/SceneGraphRendererTest.java index 689c398d2c..06485b41ad 100644 --- a/modules/GLViewerTools/src/test/java/org/janelia/gltools/scenegraph/SceneGraphRendererTest.java +++ b/modules/GLViewerTools/src/test/java/org/janelia/gltools/scenegraph/SceneGraphRendererTest.java @@ -1,9 +1,9 @@ package org.janelia.gltools.scenegraph; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLOffscreenAutoDrawable; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLDrawableFactory; +import com.jogamp.opengl.GLOffscreenAutoDrawable; +import com.jogamp.opengl.GLProfile; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; diff --git a/modules/HortaTracer/pom.xml b/modules/HortaTracer/pom.xml index e4a064db11..680f41df31 100644 --- a/modules/HortaTracer/pom.xml +++ b/modules/HortaTracer/pom.xml @@ -34,10 +34,10 @@ core - + org.janelia.workstation - jogl224lib + jogl260lib diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/NeuronTracerTopComponent.java b/modules/HortaTracer/src/main/java/org/janelia/horta/NeuronTracerTopComponent.java index 5760fb28fc..2d0c8c07f3 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/NeuronTracerTopComponent.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/NeuronTracerTopComponent.java @@ -46,7 +46,7 @@ import java.util.prefs.Preferences; import javax.imageio.ImageIO; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/CenterCrossHairActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/CenterCrossHairActor.java index cdce974f72..a01cfbb026 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/CenterCrossHairActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/CenterCrossHairActor.java @@ -3,8 +3,8 @@ import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.MeshGeometry; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ConesMaterial.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ConesMaterial.java index e03320abf2..7981bb7bc7 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ConesMaterial.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ConesMaterial.java @@ -2,7 +2,7 @@ import java.awt.Color; import java.io.IOException; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.BasicShaderProgram; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeActor.java index 8b1a670f5d..b6833b5043 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeActor.java @@ -12,8 +12,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL3; -import javax.media.opengl.GL4; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GL4; import java.util.ArrayList; import java.util.Collections; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeMeshActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeMeshActor.java index 2ee1fd1947..e73a8dc8e1 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeMeshActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/OmeZarrVolumeMeshActor.java @@ -16,7 +16,7 @@ import org.janelia.horta.volume.VolumeMipMaterial; import org.janelia.workstation.controller.model.color.ImageColorModel; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import java.io.IOException; import java.util.List; import java.util.ArrayList; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ParentVertexActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ParentVertexActor.java index 7a3cb8967b..cfe3d95356 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ParentVertexActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ParentVertexActor.java @@ -1,7 +1,7 @@ package org.janelia.horta.actors; import java.io.IOException; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.texture.Texture2d; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ScaleBar.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ScaleBar.java index da0349a96e..f92afed7c2 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ScaleBar.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/ScaleBar.java @@ -8,8 +8,8 @@ import java.awt.image.BufferedImage; import java.text.DecimalFormat; import java.text.NumberFormat; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.MeshGeometry; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresActor.java index db8a48f2bf..d5a1af03b2 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresActor.java @@ -1,7 +1,7 @@ package org.janelia.horta.actors; import java.awt.Color; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.workstation.controller.model.DefaultNeuron; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresMaterial.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresMaterial.java index 7f71f5ce65..3e23d14ccf 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresMaterial.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/SpheresMaterial.java @@ -2,8 +2,8 @@ import java.awt.Color; import java.io.IOException; -import javax.media.opengl.GL3; -import javax.media.opengl.GLException; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLException; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.BasicShaderProgram; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeActor.java index 01fcc665a7..87896b9d23 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeActor.java @@ -11,8 +11,8 @@ import java.util.Observable; import java.util.Observer; import javax.imageio.ImageIO; -import javax.media.opengl.GL3; -import javax.media.opengl.GL4; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GL4; import org.janelia.geometry3d.ObservableInterface; import org.janelia.workstation.controller.model.color.ChannelColorModel; import org.janelia.workstation.controller.model.color.ImageColorModel; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMaterial.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMaterial.java index 7f74c91175..f21a3aed69 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMaterial.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMaterial.java @@ -6,7 +6,7 @@ import java.nio.IntBuffer; import java.util.HashSet; import java.util.Set; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.gltools.BasicShaderProgram; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMeshActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMeshActor.java index 6a25b07c0d..8fb07641e2 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMeshActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/actors/TetVolumeMeshActor.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.ConstVector3; import org.janelia.geometry3d.MeshGeometry; import org.janelia.geometry3d.Vector3; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/KtxTileCache.java b/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/KtxTileCache.java index ae1dea8952..0b4ba3361c 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/KtxTileCache.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/KtxTileCache.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Map; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.horta.actors.SortableBlockActor; /** diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/OmeZarrTileCache.java b/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/OmeZarrTileCache.java index 88321253cb..771b5904c6 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/OmeZarrTileCache.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/blocks/OmeZarrTileCache.java @@ -2,7 +2,7 @@ import org.janelia.horta.actors.SortableBlockActor; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import java.util.Collection; import java.util.Map; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVbo.java b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVbo.java index 79c5995d47..4c784fc797 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVbo.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVbo.java @@ -5,7 +5,7 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.*; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.model.domain.tiledMicroscope.TmGeoAnnotation; import org.janelia.model.domain.tiledMicroscope.TmNeuronEdge; import org.janelia.model.domain.tiledMicroscope.TmNeuronMetadata; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboActor.java index a869f70283..f48c7737c5 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboActor.java @@ -2,7 +2,7 @@ import java.util.Collection; import java.util.Iterator; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.Matrix4; import org.janelia.geometry3d.Object3d; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboPool.java b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboPool.java index 2fd485b6f7..7293873846 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboPool.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/neuronvbo/NeuronVboPool.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentLinkedDeque; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.BasicShaderProgram; import org.janelia.gltools.ShaderProgram; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/render/BackgroundRenderPass.java b/modules/HortaTracer/src/main/java/org/janelia/horta/render/BackgroundRenderPass.java index 4bedc63882..71030fd730 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/render/BackgroundRenderPass.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/render/BackgroundRenderPass.java @@ -1,7 +1,7 @@ package org.janelia.horta.render; import java.awt.Color; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL3; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.ColorBackgroundActor; import org.janelia.gltools.RenderPass; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/render/NeuronMPRenderer.java b/modules/HortaTracer/src/main/java/org/janelia/horta/render/NeuronMPRenderer.java index c0af144114..6bc9c1cbc4 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/render/NeuronMPRenderer.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/render/NeuronMPRenderer.java @@ -10,8 +10,8 @@ import java.util.Observable; import java.util.Observer; import java.util.Set; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.ObservableInterface; import org.janelia.workstation.controller.listener.NeuronCreationListener; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/render/OpaqueRenderPass.java b/modules/HortaTracer/src/main/java/org/janelia/horta/render/OpaqueRenderPass.java index 4a090f33cb..06103bb4a3 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/render/OpaqueRenderPass.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/render/OpaqueRenderPass.java @@ -2,8 +2,8 @@ import java.awt.geom.Point2D; import java.nio.ByteBuffer; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.LateralOffsetCamera; import org.janelia.geometry3d.PerspectiveCamera; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/render/RemapColorActor.java b/modules/HortaTracer/src/main/java/org/janelia/horta/render/RemapColorActor.java index cdc634db2b..b95b06e351 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/render/RemapColorActor.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/render/RemapColorActor.java @@ -2,8 +2,8 @@ package org.janelia.horta.render; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.janelia.workstation.controller.model.color.ChannelColorModel; import org.janelia.workstation.controller.model.color.ImageColorModel; import org.janelia.geometry3d.AbstractCamera; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/render/VolumeRenderPass.java b/modules/HortaTracer/src/main/java/org/janelia/horta/render/VolumeRenderPass.java index 65cf639754..f2ccd9dee0 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/render/VolumeRenderPass.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/render/VolumeRenderPass.java @@ -1,7 +1,7 @@ package org.janelia.horta.render; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.gltools.Framebuffer; import org.janelia.gltools.GL3Actor; diff --git a/modules/HortaTracer/src/main/java/org/janelia/horta/volume/VolumeMipMaterial.java b/modules/HortaTracer/src/main/java/org/janelia/horta/volume/VolumeMipMaterial.java index 51c7429f04..91295df000 100644 --- a/modules/HortaTracer/src/main/java/org/janelia/horta/volume/VolumeMipMaterial.java +++ b/modules/HortaTracer/src/main/java/org/janelia/horta/volume/VolumeMipMaterial.java @@ -2,8 +2,8 @@ package org.janelia.horta.volume; import java.io.IOException; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GL3; +import com.jogamp.opengl.GL2ES2; +import com.jogamp.opengl.GL3; import org.apache.commons.io.IOUtils; import org.janelia.geometry3d.*; import org.janelia.workstation.controller.model.color.ChannelColorModel; diff --git a/modules/Jogl213Lib/pom.xml b/modules/Jogl213Lib/pom.xml deleted file mode 100644 index c9949d293e..0000000000 --- a/modules/Jogl213Lib/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - org.janelia - workstation - 9.21 - ../.. - - - Jogl213Lib - org.janelia.workstation - jogl213lib - 9.21 - nbm - - - - - - org.jogamp.jogl - jogl-all-main - 2.1.3 - - - org.jogamp.gluegen - gluegen-rt-main - 2.1.3 - - - - - - - - org.apache.netbeans.utilities - nbm-maven-plugin - - - com.jogamp.common - com.jogamp.common.nio - com.jogamp.common.type - com.jogamp.common.util - com.jogamp.nativewindow.awt - com.jogamp.newt.event - com.jogamp.opengl - com.jogamp.opengl.util - com.jogamp.opengl.util.awt - com.jogamp.opengl.util.gl2 - com.jogamp.opengl.util.glsl - com.jogamp.opengl.util.glsl.fixedfunc - com.jogamp.opengl.util.texture - com.jogamp.opengl.util.texture.awt - javax.media.nativewindow - javax.media.nativewindow.util - javax.media.opengl - javax.media.opengl.awt - javax.media.opengl.fixedfunc - javax.media.opengl.glu - jogamp.opengl - - - - - - - diff --git a/modules/Jogl213Lib/src/main/nbm/manifest.mf b/modules/Jogl213Lib/src/main/nbm/manifest.mf deleted file mode 100644 index a56d29b3d5..0000000000 --- a/modules/Jogl213Lib/src/main/nbm/manifest.mf +++ /dev/null @@ -1,4 +0,0 @@ -Manifest-Version: 1.0 -OpenIDE-Module-Localizing-Bundle: org/janelia/jogl213lib/Bundle.properties -OpenIDE-Module-Specification-Version: ${janeliaws.modules.specification.version} -OpenIDE-Module-Implementation-Version: ${buildNumber} diff --git a/modules/Jogl213Lib/src/main/resources/org/janelia/jogl213lib/Bundle.properties b/modules/Jogl213Lib/src/main/resources/org/janelia/jogl213lib/Bundle.properties deleted file mode 100644 index dc6e3708bb..0000000000 --- a/modules/Jogl213Lib/src/main/resources/org/janelia/jogl213lib/Bundle.properties +++ /dev/null @@ -1,2 +0,0 @@ -OpenIDE-Module-Display-Category=Libraries -OpenIDE-Module-Name=Jogl213 Library diff --git a/modules/Jogl224Lib/pom.xml b/modules/Jogl224Lib/pom.xml deleted file mode 100644 index c32b0b0a0a..0000000000 --- a/modules/Jogl224Lib/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - org.janelia - workstation - 9.21 - ../.. - - - Jogl224Lib - org.janelia.workstation - jogl224lib - 9.21 - nbm - - - - - - org.jogamp.jogl - jogl-all-main - 2.2.4 - - - org.jogamp.gluegen - gluegen-rt-main - 2.2.4 - - - - - - - - org.apache.netbeans.utilities - nbm-maven-plugin - - - com.jogamp.common - com.jogamp.common.nio - com.jogamp.common.type - com.jogamp.common.util - com.jogamp.nativewindow.awt - com.jogamp.newt.event - com.jogamp.opengl - com.jogamp.opengl.util - com.jogamp.opengl.util.awt - com.jogamp.opengl.util.gl2 - com.jogamp.opengl.util.glsl - com.jogamp.opengl.util.glsl.fixedfunc - com.jogamp.opengl.util.texture - com.jogamp.opengl.util.texture.awt - javax.media.nativewindow - javax.media.nativewindow.util - javax.media.opengl - javax.media.opengl.awt - javax.media.opengl.fixedfunc - javax.media.opengl.glu - jogamp.opengl - - - - - - - diff --git a/modules/Jogl224Lib/src/main/nbm/manifest.mf b/modules/Jogl224Lib/src/main/nbm/manifest.mf deleted file mode 100644 index 4820a35d48..0000000000 --- a/modules/Jogl224Lib/src/main/nbm/manifest.mf +++ /dev/null @@ -1,4 +0,0 @@ -Manifest-Version: 1.0 -OpenIDE-Module-Localizing-Bundle: org/janelia/jogl224lib/Bundle.properties -OpenIDE-Module-Specification-Version: ${janeliaws.modules.specification.version} -OpenIDE-Module-Implementation-Version: ${buildNumber} diff --git a/modules/Jogl260Lib/pom.xml b/modules/Jogl260Lib/pom.xml new file mode 100644 index 0000000000..8c3871d4a4 --- /dev/null +++ b/modules/Jogl260Lib/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + org.janelia + workstation + 9.21 + ../.. + + + Jogl260Lib + org.janelia.workstation + jogl260lib + 9.21 + nbm + + + + + + org.jogamp.jogl + jogl-all-main + 2.6.0 + + + org.jogamp.gluegen + gluegen-rt-main + 2.6.0 + + + + + + + + org.apache.netbeans.utilities + nbm-maven-plugin + + + com.jogamp.common + com.jogamp.common.nio + com.jogamp.common.type + com.jogamp.common.util + com.jogamp.nativewindow + com.jogamp.nativewindow.awt + com.jogamp.nativewindow.util + com.jogamp.newt.event + com.jogamp.opengl + com.jogamp.opengl.fixedfunc + com.jogamp.opengl.glu + com.jogamp.opengl.util + com.jogamp.opengl.util.awt + com.jogamp.opengl.util.gl2 + com.jogamp.opengl.util.glsl + com.jogamp.opengl.util.glsl.fixedfunc + com.jogamp.opengl.util.texture + com.jogamp.opengl.util.texture.awt + jogamp.opengl + + + + + + + diff --git a/modules/Jogl260Lib/src/main/nbm/manifest.mf b/modules/Jogl260Lib/src/main/nbm/manifest.mf new file mode 100644 index 0000000000..b71b3b11e5 --- /dev/null +++ b/modules/Jogl260Lib/src/main/nbm/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +OpenIDE-Module-Localizing-Bundle: org/janelia/jogl260lib/Bundle.properties + diff --git a/modules/Jogl224Lib/src/main/resources/org/janelia/jogl224lib/Bundle.properties b/modules/Jogl260Lib/src/main/resources/org/janelia/jogl260lib/Bundle.properties similarity index 53% rename from modules/Jogl224Lib/src/main/resources/org/janelia/jogl224lib/Bundle.properties rename to modules/Jogl260Lib/src/main/resources/org/janelia/jogl260lib/Bundle.properties index c6d1768a8f..45cd3566f9 100644 --- a/modules/Jogl224Lib/src/main/resources/org/janelia/jogl224lib/Bundle.properties +++ b/modules/Jogl260Lib/src/main/resources/org/janelia/jogl260lib/Bundle.properties @@ -1,2 +1,2 @@ OpenIDE-Module-Display-Category=Libraries -OpenIDE-Module-Name=Jogl224 Library +OpenIDE-Module-Name=Jogl260 Library diff --git a/modules/LargeVolumeViewer/pom.xml b/modules/LargeVolumeViewer/pom.xml index c57a47eaae..8862798a11 100644 --- a/modules/LargeVolumeViewer/pom.xml +++ b/modules/LargeVolumeViewer/pom.xml @@ -41,10 +41,10 @@ common-gui - + org.janelia.workstation - jogl213lib + jogl260lib diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLCanvasWrapper.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLCanvasWrapper.java index 464a573930..16c2b00f7e 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLCanvasWrapper.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLCanvasWrapper.java @@ -7,12 +7,12 @@ import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.awt.GLCanvas; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLCapabilitiesChooser; +import com.jogamp.opengl.GLContext; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.awt.GLCanvas; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.ToolTipManager; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLContextSharer.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLContextSharer.java index 3b0397129e..560e63cd31 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLContextSharer.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLContextSharer.java @@ -1,14 +1,14 @@ package org.janelia.workstation.gui.large_volume_viewer; -import javax.media.opengl.DefaultGLCapabilitiesChooser; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; -import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLOffscreenAutoDrawable; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.DefaultGLCapabilitiesChooser; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLCapabilitiesChooser; +import com.jogamp.opengl.GLContext; +import com.jogamp.opengl.GLDrawableFactory; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.GLOffscreenAutoDrawable; +import com.jogamp.opengl.GLProfile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,8 +60,7 @@ private void instantiateMaybe() { factory.getDefaultDevice(), capabilities, chooser, - 1, 1, // Small size that never changes - null); // null means create a new context + 1, 1); // Small size that never changes masterContextPbuffer.addGLEventListener(this); masterContextPbuffer.display(); // Attempt render, to force context creation. } diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLDrawableWrapper.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLDrawableWrapper.java index 899b3dff09..4fbcc16b4c 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLDrawableWrapper.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLDrawableWrapper.java @@ -2,7 +2,7 @@ import java.awt.Component; import java.awt.Graphics; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import javax.swing.JComponent; /** diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLJPanelWrapper.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLJPanelWrapper.java index 42cea83b83..c6b3d55bf5 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLJPanelWrapper.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/GLJPanelWrapper.java @@ -2,11 +2,11 @@ import java.awt.Component; import java.awt.Graphics; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; -import javax.media.opengl.awt.GLJPanel; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLCapabilitiesChooser; +import com.jogamp.opengl.GLContext; +import com.jogamp.opengl.awt.GLJPanel; import javax.swing.JComponent; /** diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/LargeVolumeViewer.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/LargeVolumeViewer.java index b0153647da..575445e680 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/LargeVolumeViewer.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/LargeVolumeViewer.java @@ -31,9 +31,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLCapabilitiesChooser; +import com.jogamp.opengl.GLContext; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/OrthogonalViewer.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/OrthogonalViewer.java index 5479e865fd..5facfa98a1 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/OrthogonalViewer.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/OrthogonalViewer.java @@ -12,9 +12,9 @@ import java.util.List; import java.util.Vector; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLCapabilitiesChooser; +import com.jogamp.opengl.GLContext; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JMenuItem; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/QuadViewUi.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/QuadViewUi.java index c98d85135c..ff803626d9 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/QuadViewUi.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/QuadViewUi.java @@ -19,7 +19,7 @@ import java.util.Arrays; import java.util.List; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.GLProfile; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.border.EtchedBorder; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceActor.java index 47e0905135..700a16ffdf 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceActor.java @@ -1,8 +1,8 @@ package org.janelia.workstation.gui.large_volume_viewer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.controller.model.color.ImageColorModel; import org.janelia.workstation.geom.CoordinateAxis; import org.janelia.workstation.geom.Vec3; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceRenderer.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceRenderer.java index 3929fd59e8..306112f2f9 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceRenderer.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/SliceRenderer.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.large_volume_viewer; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.gui.camera.Camera3d; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TileOutlineActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TileOutlineActor.java index cd377df5f9..ddbbee6217 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TileOutlineActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/TileOutlineActor.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.large_volume_viewer; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.controller.tileimagery.Tile2d; import org.janelia.workstation.controller.tileimagery.TileSet; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/AnchorShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/AnchorShader.java index 0004aa555d..194e79b6c2 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/AnchorShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/AnchorShader.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.large_volume_viewer.shader; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; public class AnchorShader extends PassThroughTextureShader { diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/NumeralShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/NumeralShader.java index be5a74fe24..8d138356e6 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/NumeralShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/NumeralShader.java @@ -5,7 +5,7 @@ import java.awt.image.BufferedImage; import java.nio.ByteBuffer; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import javax.swing.ImageIcon; import org.janelia.workstation.controller.model.color.ChannelColorModel; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/OutlineShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/OutlineShader.java index 41a4659f95..e708dd7510 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/OutlineShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/OutlineShader.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.large_volume_viewer.shader; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; public class OutlineShader extends PassThroughTextureShader { diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/PassThroughTextureShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/PassThroughTextureShader.java index 56eeaca4ee..97de57cc6c 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/PassThroughTextureShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/PassThroughTextureShader.java @@ -2,13 +2,13 @@ import java.nio.IntBuffer; -// import javax.media.opengl.GL2; +// import com.jogamp.opengl.GL2; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.glu.GLU; import org.janelia.workstation.gui.viewer3d.shader.AbstractShader; import org.slf4j.Logger; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/SliceColorShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/SliceColorShader.java index 00a9b3e669..d80c38bef4 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/SliceColorShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/shader/SliceColorShader.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.large_volume_viewer.shader; import java.awt.Color; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.janelia.workstation.controller.model.color.ChannelColorModel; import org.janelia.workstation.controller.model.color.ImageColorModel; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/AxesActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/AxesActor.java index 0840366781..115f0597f2 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/AxesActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/AxesActor.java @@ -12,8 +12,8 @@ import java.nio.IntBuffer; import java.util.ArrayList; import java.util.Collection; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.BoundingBox3d; import org.janelia.workstation.gui.viewer3d.MeshViewContext; import org.janelia.workstation.gui.viewer3d.text.AxisLabel; @@ -158,8 +158,8 @@ public void init(GLAutoDrawable glDrawable) { vertexPointerHelper = new GenericVPLinesHelper(context, "ticked-axes-actor"); this.matrixManager = new MatrixManager( context, - glDrawable.getWidth(), - glDrawable.getHeight() + glDrawable.getSurfaceWidth(), + glDrawable.getSurfaceHeight() ); } catch ( Exception ex ) { diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesActor.java index 3f29807408..50f01b277e 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesActor.java @@ -6,9 +6,9 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.gui.viewer3d.matrix_support.MatrixManager.FocusBehavior; import org.janelia.workstation.gui.opengl.GLActor; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesShader.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesShader.java index e9dca29b00..595f4d678b 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesShader.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/DirectionalReferenceAxesShader.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.large_volume_viewer.skeleton; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; import org.janelia.workstation.gui.viewer3d.OpenGLUtils; import org.janelia.workstation.gui.viewer3d.shader.AbstractShader; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/GenericVPLinesHelper.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/GenericVPLinesHelper.java index 1eae32919c..403755f9d4 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/GenericVPLinesHelper.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/GenericVPLinesHelper.java @@ -1,8 +1,8 @@ package org.janelia.workstation.gui.large_volume_viewer.skeleton; import java.nio.IntBuffer; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.viewer3d.MeshViewContext; import static org.janelia.workstation.gui.viewer3d.OpenGLUtils.reportError; import org.janelia.workstation.gui.viewer3d.matrix_support.MatrixManager; diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/SkeletonActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/SkeletonActor.java index f819d51bc9..0bf25acadd 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/SkeletonActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/SkeletonActor.java @@ -10,10 +10,10 @@ import java.util.List; import java.util.Map; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; import javax.swing.ImageIcon; import org.janelia.workstation.controller.model.TmModelManager; @@ -293,7 +293,7 @@ private synchronized void displayLines(GLAutoDrawable glDrawable) { gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, model.getCummulativeLineOffset(), model.getLineBuffer(), GL.GL_DYNAMIC_DRAW); } - gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); + gl2.glEnableClientState(GL2.GL_VERTEX_ARRAY); lineShader.load(gl2); lineShader.setUniform(gl, "zThickness", getZoomedZThicknessInPixels()); float focus[] = { @@ -303,7 +303,7 @@ private synchronized void displayLines(GLAutoDrawable glDrawable) { lineShader.setUniform3v(gl, "focus", 1, focus); gl.glEnable(GL2.GL_LINE_SMOOTH); gl.glHint(GL2.GL_LINE_SMOOTH_HINT, GL2.GL_NICEST); - gl.glEnableClientState(GL2.GL_COLOR_ARRAY); + gl2.glEnableClientState(GL2.GL_COLOR_ARRAY); List lineOffsets = model.getLineOffsets(); List vertexOffsets = model.getVertexOffsets(); @@ -343,8 +343,8 @@ private synchronized void displayLines(GLAutoDrawable glDrawable) { //log.info("displayLines2 Check4"); - gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); - gl.glDisableClientState(GL2.GL_COLOR_ARRAY); + gl2.glDisableClientState(GL2.GL_VERTEX_ARRAY); + gl2.glDisableClientState(GL2.GL_COLOR_ARRAY); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0); gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0); transparencyDepthMode(gl, false); diff --git a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/TracedPathActor.java b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/TracedPathActor.java index 9374ce7711..97134987fd 100644 --- a/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/TracedPathActor.java +++ b/modules/LargeVolumeViewer/src/main/java/org/janelia/workstation/gui/large_volume_viewer/skeleton/TracedPathActor.java @@ -11,10 +11,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.glu.GLU; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; diff --git a/modules/SceneWindow/pom.xml b/modules/SceneWindow/pom.xml index 8dc52ec560..8e9b429d95 100644 --- a/modules/SceneWindow/pom.xml +++ b/modules/SceneWindow/pom.xml @@ -23,10 +23,10 @@ libraries - + org.janelia.workstation - jogl224lib + jogl260lib diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponent.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponent.java index 6cd9c2b122..9316ba9927 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponent.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponent.java @@ -3,7 +3,7 @@ import java.awt.Component; import java.awt.event.ActionListener; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import javax.swing.JComponent; /** diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponentFactory.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponentFactory.java index f7cb6b4280..dda56078f3 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponentFactory.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/GLJComponentFactory.java @@ -9,11 +9,11 @@ import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.awt.GLCanvas; -import javax.media.opengl.awt.GLJPanel; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.awt.GLCanvas; +import com.jogamp.opengl.awt.GLJPanel; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneRenderer.java index ed18a49a51..2f60972591 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneRenderer.java @@ -8,10 +8,10 @@ import java.util.List; import java.util.Set; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.LateralOffsetCamera; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneWindow.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneWindow.java index 908db90975..b2895490db 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneWindow.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/SceneWindow.java @@ -7,10 +7,10 @@ import java.util.Collection; import java.util.Observable; import java.util.Observer; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLContext; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLContext; +import com.jogamp.opengl.GLProfile; import javax.swing.Action; import javax.swing.JComponent; import org.janelia.geometry3d.AbstractCamera; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/AnaglyphRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/AnaglyphRenderer.java index cfc8a24938..5bef49c435 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/AnaglyphRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/AnaglyphRenderer.java @@ -1,9 +1,9 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.LateralOffsetCamera; import org.janelia.geometry3d.PerspectiveCamera; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/HardwareRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/HardwareRenderer.java index a91b7c5471..615be847f6 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/HardwareRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/HardwareRenderer.java @@ -1,12 +1,12 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL2; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilitiesImmutable; -import javax.media.opengl.GLDrawable; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilitiesImmutable; +import com.jogamp.opengl.GLDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.LateralOffsetCamera; import org.janelia.geometry3d.PerspectiveCamera; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/LeftEyeRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/LeftEyeRenderer.java index 495d3f60cf..3c410e0540 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/LeftEyeRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/LeftEyeRenderer.java @@ -1,9 +1,9 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.camera.BasicFrustumShift; import org.janelia.geometry3d.camera.ConstFrustumShift; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/MonoscopicRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/MonoscopicRenderer.java index 99909e181b..c575542dca 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/MonoscopicRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/MonoscopicRenderer.java @@ -1,9 +1,9 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.DebugGL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.DebugGL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.scenewindow.SceneRenderer; /** diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/SideBySideRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/SideBySideRenderer.java index c609f708fd..0c1141798a 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/SideBySideRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/SideBySideRenderer.java @@ -1,9 +1,9 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.GL; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.geometry3d.AbstractCamera; import org.janelia.geometry3d.LateralOffsetCamera; import org.janelia.geometry3d.PerspectiveCamera; diff --git a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/StereoRenderer.java b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/StereoRenderer.java index b691a2810d..7d19a4a25a 100644 --- a/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/StereoRenderer.java +++ b/modules/SceneWindow/src/main/java/org/janelia/scenewindow/stereo/StereoRenderer.java @@ -1,7 +1,7 @@ package org.janelia.scenewindow.stereo; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.scenewindow.SceneRenderer; /** diff --git a/modules/Viewer3D/pom.xml b/modules/Viewer3D/pom.xml index 702a04ebe3..2afae10acc 100644 --- a/modules/Viewer3D/pom.xml +++ b/modules/Viewer3D/pom.xml @@ -29,10 +29,10 @@ integration - + org.janelia.workstation - jogl213lib + jogl260lib diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/CompositeGLActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/CompositeGLActor.java index b7f9c3ec1e..896e38b34d 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/CompositeGLActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/CompositeGLActor.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Vector; -import javax.media.opengl.GL; +import com.jogamp.opengl.GL; public class CompositeGLActor diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2Adapter.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2Adapter.java index 90757c2d04..66dc7a1fd5 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2Adapter.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2Adapter.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; /** * Allow some parts of GL2 to be faked up in GL3 diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2AdapterFactory.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2AdapterFactory.java index 5f06cd6fa9..a71815e4f7 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2AdapterFactory.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GL2AdapterFactory.java @@ -1,11 +1,11 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.glu.GLU; import org.janelia.workstation.geom.Vec3; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActor.java index da70db9f0a..2d7ad392bb 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActor.java @@ -1,9 +1,9 @@ package org.janelia.workstation.gui.opengl; -// import javax.media.opengl.GL2; +// import com.jogamp.opengl.GL2; import org.janelia.workstation.geom.BoundingBox3d; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; public interface GLActor extends GLResource diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActorContext.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActorContext.java index 92bb6b4df7..74865eab91 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActorContext.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLActorContext.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; // TODO - use GLActorContext as the parameter sent to GLActors public class GLActorContext { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLError.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLError.java index afea67f512..d3ef297b9b 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLError.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLError.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GL; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.glu.GLU; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLOrthoCamera.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLOrthoCamera.java index 2b801c84ea..69d0d34aa1 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLOrthoCamera.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLOrthoCamera.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.geom.Quaternion.AngleAxis; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLResource.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLResource.java index 534cd9c915..3d28c55a7d 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLResource.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLResource.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.opengl; -// import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +// import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; public interface GLResource { public void init(GLAutoDrawable glDrawable); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLSceneComposer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLSceneComposer.java index af9103c63c..716b075f03 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLSceneComposer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/GLSceneComposer.java @@ -1,11 +1,11 @@ package org.janelia.workstation.gui.opengl; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilitiesImmutable; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilitiesImmutable; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.glu.GLU; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.geom.Vec3; @@ -268,7 +268,7 @@ public void setStereoMode(StereoMode mode) { if (this.stereoMode != mode) { stereoMode = mode; stereoModeNeedsCleanup = true; - mode.reshape(glComponent.getWidth(), glComponent.getHeight()); + mode.reshape(glComponent.getSurfaceWidth(), glComponent.getSurfaceHeight()); } viewChangedSignal.emit(); } diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/LightingActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/LightingActor.java index 42518776df..720b6a177e 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/LightingActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/LightingActor.java @@ -2,8 +2,8 @@ import org.janelia.workstation.geom.BoundingBox3d; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; public class LightingActor implements GL3Actor { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshActor.java index 52dcb3aa37..4b0d0392ea 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshActor.java @@ -5,10 +5,10 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.glu.GLU; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.geom.BoundingBox3d; @@ -215,8 +215,8 @@ private void displayUsingVertexBufferObjects(GL2 gl2) { if (vertexNormalVbo < 1) // first time? initializeVbos(gl2); checkGlError(gl, "display mesh using vbos 211"); - gl2gl3.glEnableClientState(GL2.GL_VERTEX_ARRAY); - gl2gl3.glEnableClientState(GL2.GL_NORMAL_ARRAY); + gl2.glEnableClientState(GL2.GL_VERTEX_ARRAY); + gl2.glEnableClientState(GL2.GL_NORMAL_ARRAY); checkGlError(gl, "display mesh using vbos 214"); final int bytesPerVertexNormal = (floatsPerVertex + floatsPerNormal)*bytesPerFloat; @@ -228,8 +228,8 @@ private void displayUsingVertexBufferObjects(GL2 gl2) { gl2.glEnable(GL2.GL_LIGHTING); gl2gl3.glDrawElements(GL.GL_TRIANGLES, indexCount, GL.GL_UNSIGNED_INT, 0); - gl2gl3.glDisableClientState(GL2.GL_NORMAL_ARRAY); - gl2gl3.glDisableClientState(GL2.GL_VERTEX_ARRAY); + gl2.glDisableClientState(GL2.GL_NORMAL_ARRAY); + gl2.glDisableClientState(GL2.GL_VERTEX_ARRAY); checkGlError(gl, "display mesh using vbos"); } diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshGroupActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshGroupActor.java index bb17ba7e02..de218b1e90 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshGroupActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/MeshGroupActor.java @@ -9,8 +9,8 @@ import java.util.List; import java.util.Vector; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; /** * Parent actor so multiple mesh actors can share a single shader diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/SolidBackgroundActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/SolidBackgroundActor.java index 8c1166984c..e6b8e95a15 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/SolidBackgroundActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/SolidBackgroundActor.java @@ -5,8 +5,8 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; import org.janelia.workstation.gui.opengl.shader.BasicShader; import org.janelia.workstation.gui.opengl.shader.SolidColor120Shader; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/VertexBuffer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/VertexBuffer.java index 931371e558..38a9e3a48e 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/VertexBuffer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/VertexBuffer.java @@ -4,8 +4,8 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; // Intended to eventually back actors like MeshActor and VolumeActor public class VertexBuffer { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/GourdDemo.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/GourdDemo.java index a4c0a6b882..9c57233abf 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/GourdDemo.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/GourdDemo.java @@ -4,9 +4,9 @@ import java.awt.Dimension; import java.io.IOException; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLProfile; -import javax.media.opengl.awt.GLCanvas; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLProfile; +import com.jogamp.opengl.awt.GLCanvas; // GLJPanel won't work with GL3! import javax.swing.JFrame; import javax.swing.JMenu; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TeapotDemo.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TeapotDemo.java index acadafec84..bde80470cb 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TeapotDemo.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TeapotDemo.java @@ -4,11 +4,11 @@ import java.awt.Component; import java.awt.Dimension; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLProfile; -import javax.media.opengl.awt.GLCanvas; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLProfile; +import com.jogamp.opengl.awt.GLCanvas; // GLJPanel won't work with hardware stereo 3d -// import javax.media.opengl.awt.GLJPanel; +// import com.jogamp.opengl.awt.GLJPanel; import javax.swing.JFrame; import javax.swing.SwingUtilities; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TestSrgbFramebuffer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TestSrgbFramebuffer.java index 7edd66cb43..e2c0b55b76 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TestSrgbFramebuffer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/demo/TestSrgbFramebuffer.java @@ -1,12 +1,12 @@ package org.janelia.workstation.gui.opengl.demo; import java.awt.Dimension; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.awt.GLCanvas; -import javax.media.opengl.awt.GLJPanel; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.awt.GLCanvas; +import com.jogamp.opengl.awt.GLJPanel; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.SwingUtilities; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/shader/BasicShader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/shader/BasicShader.java index 02aec8f46a..15e5c424d6 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/shader/BasicShader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/shader/BasicShader.java @@ -15,8 +15,8 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; public abstract class BasicShader { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphGreenMagentaStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphGreenMagentaStereoMode.java index 75eb380b1b..5fdf3aa5fc 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphGreenMagentaStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphGreenMagentaStereoMode.java @@ -3,8 +3,8 @@ import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GLAutoDrawable; public class AnaglyphGreenMagentaStereoMode extends BasicStereoMode { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphRedCyanStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphRedCyanStereoMode.java index 590d8a05e3..fb0c02ac64 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphRedCyanStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/AnaglyphRedCyanStereoMode.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.opengl.stereo3d; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/BasicStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/BasicStereoMode.java index 8f81ab2980..f3184d0874 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/BasicStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/BasicStereoMode.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.opengl.stereo3d; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.camera.Camera3d; import org.janelia.workstation.gui.opengl.CameraScreenGeometry; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/HardwareStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/HardwareStereoMode.java index e4809d0801..5b3ac2ed5f 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/HardwareStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/HardwareStereoMode.java @@ -4,12 +4,12 @@ import org.janelia.workstation.gui.opengl.GLError; import org.janelia.workstation.gui.opengl.GLSceneComposer; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilitiesImmutable; -import javax.media.opengl.GLDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilitiesImmutable; +import com.jogamp.opengl.GLDrawable; public class HardwareStereoMode extends BasicStereoMode { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftEyeStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftEyeStereoMode.java index 1bc34a50f7..eb8a41f781 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftEyeStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftEyeStereoMode.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.opengl.stereo3d; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftRightStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftRightStereoMode.java index d3089f41c6..7b354d70ef 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftRightStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/LeftRightStereoMode.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.opengl.stereo3d; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RightEyeStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RightEyeStereoMode.java index c77a940a3b..3514bf50fa 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RightEyeStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RightEyeStereoMode.java @@ -3,7 +3,7 @@ import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; public class RightEyeStereoMode extends BasicStereoMode { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RowInterleavedStereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RowInterleavedStereoMode.java index 3fff8a83ea..f339bdab33 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RowInterleavedStereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/RowInterleavedStereoMode.java @@ -4,13 +4,13 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; -import javax.media.nativewindow.NativeSurface; -import javax.media.nativewindow.NativeWindow; -import javax.media.nativewindow.util.Point; -import javax.media.opengl.GL; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLDrawable; +import com.jogamp.nativewindow.NativeSurface; +import com.jogamp.nativewindow.NativeWindow; +import com.jogamp.nativewindow.util.Point; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLDrawable; import org.janelia.workstation.gui.opengl.GL2Adapter; import org.janelia.workstation.gui.opengl.GLActorContext; @@ -53,8 +53,8 @@ public void display(GLActorContext actorContext, protected void init(GLActorContext context) { GLDrawable g = context.getGLAutoDrawable(); - int w = g.getWidth(); - int h = g.getHeight(); + int w = g.getSurfaceWidth(); + int h = g.getSurfaceHeight(); int top = 0; int left = 0; NativeSurface ns = g.getNativeSurface(); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoMode.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoMode.java index cceeaf4561..af2b59f53a 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoMode.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoMode.java @@ -3,7 +3,7 @@ import org.janelia.workstation.gui.opengl.GLActorContext; import org.janelia.workstation.gui.opengl.GLSceneComposer; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; public interface StereoMode { diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoModeChooser.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoModeChooser.java index 04232d445b..47f9aa8c86 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoModeChooser.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/opengl/stereo3d/StereoModeChooser.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Vector; -import javax.media.opengl.GLDrawable; +import com.jogamp.opengl.GLDrawable; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ButtonGroup; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/AbstractVolumeBrick.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/AbstractVolumeBrick.java index e7dcfac06d..06375520a3 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/AbstractVolumeBrick.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/AbstractVolumeBrick.java @@ -6,10 +6,10 @@ import java.util.Collection; import java.util.Iterator; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLProfile; import org.janelia.workstation.gui.viewer3d.DirectionalAxis; import org.janelia.workstation.gui.viewer3d.OpenGLUtils; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/RGBExcludableVolumeBrick.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/RGBExcludableVolumeBrick.java index 4d9e20c4d8..a362969c09 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/RGBExcludableVolumeBrick.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/RGBExcludableVolumeBrick.java @@ -5,8 +5,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; /** * VolumeTexture class draws a transparent rectangular volume with a 3D opengl texture diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/shader/RGBExcludableShader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/shader/RGBExcludableShader.java index 5d48dc4b04..419db524cf 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/shader/RGBExcludableShader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/static_view/shader/RGBExcludableShader.java @@ -6,7 +6,7 @@ import org.janelia.workstation.gui.viewer3d.texture.TextureMediator; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.nio.IntBuffer; import org.janelia.workstation.gui.viewer3d.shader.TexturedShader; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ActorRenderer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ActorRenderer.java index 5dcec0374c..c229019e77 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ActorRenderer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ActorRenderer.java @@ -11,7 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLAutoDrawable; import java.awt.Point; public abstract class ActorRenderer diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseGLViewer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseGLViewer.java index ae814fe88f..fc67d7773f 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseGLViewer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseGLViewer.java @@ -5,9 +5,9 @@ import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLProfile; -import javax.media.opengl.awt.GLJPanel; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLProfile; +import com.jogamp.opengl.awt.GLJPanel; import javax.swing.JPopupMenu; import org.slf4j.Logger; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseRenderer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseRenderer.java index a3ea1bb650..fa000fe12e 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseRenderer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/BaseRenderer.java @@ -3,11 +3,11 @@ import java.awt.Color; import java.util.ArrayList; import java.util.List; -import javax.media.opengl.GL2; -// import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL2; +// import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLEventListener; +import com.jogamp.opengl.glu.GLU; import org.janelia.workstation.gui.camera.Camera3d; import org.janelia.workstation.gui.opengl.GLActor; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/MipRenderer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/MipRenderer.java index b963f62b29..3151b89590 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/MipRenderer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/MipRenderer.java @@ -2,8 +2,8 @@ import java.awt.Color; import java.util.ArrayList; -import javax.media.opengl.DebugGL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.DebugGL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.gui.opengl.GL2Adapter; @@ -26,8 +26,8 @@ public void display(GLAutoDrawable glDrawable) { this.backgroundColor = new Color( backgroundClrArr[ 0 ], backgroundClrArr[ 1 ], backgroundClrArr[ 2 ] ); super.display(glDrawable); // fills background - setWidthInPixels(glDrawable.getWidth()); - setHeightInPixels(glDrawable.getHeight()); + setWidthInPixels(glDrawable.getSurfaceWidth()); + setHeightInPixels(glDrawable.getSurfaceHeight()); resetOnFirstRedraw(); //final GL2 gl = glDrawable.getGL().getGL2(); @@ -39,7 +39,7 @@ public void display(GLAutoDrawable glDrawable) { gl.glPushMatrix(); gl.glLoadIdentity(); - glDrawable.getWidth(); + glDrawable.getSurfaceWidth(); Vec3 f = getVolumeModel().getCamera3d().getFocus(); // This is what allows (follows) drag in X and Y. Rotation3d rotation = getVolumeModel().getCamera3d().getRotation(); Vec3 u = rotation.times( UP_IN_CAMERA ); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OcclusiveRenderer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OcclusiveRenderer.java index 966219f3e3..c51ef81001 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OcclusiveRenderer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OcclusiveRenderer.java @@ -2,11 +2,11 @@ import java.awt.Color; import java.util.ArrayList; -import javax.media.opengl.DebugGL2; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLProfile; +import com.jogamp.opengl.DebugGL2; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLCapabilities; +import com.jogamp.opengl.GLProfile; import org.janelia.workstation.geom.BoundingBox3d; import org.janelia.workstation.geom.Rotation3d; @@ -55,8 +55,8 @@ public void display(GLAutoDrawable glDrawable) { this.backgroundColor = new Color( backgroundClrArr[ 0 ], backgroundClrArr[ 1 ], backgroundClrArr[ 2 ] ); super.display(glDrawable); // fills background - setWidthInPixels(glDrawable.getWidth()); - setHeightInPixels(glDrawable.getHeight()); + setWidthInPixels(glDrawable.getSurfaceWidth()); + setHeightInPixels(glDrawable.getSurfaceHeight()); resetOnFirstRedraw(); //final GL2 gl = glDrawable.getGL().getGL2(); @@ -72,7 +72,7 @@ public void display(GLAutoDrawable glDrawable) { gl.glPushMatrix(); gl.glLoadIdentity(); - glDrawable.getWidth(); + glDrawable.getSurfaceWidth(); Vec3 f = getVolumeModel().getCamera3d().getFocus(); // This is what allows (follows) drag in X and Y. Rotation3d rotation = getVolumeModel().getCamera3d().getRotation(); Vec3 u = rotation.times( UP_IN_CAMERA ); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OpenGLUtils.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OpenGLUtils.java index 8171cce415..96578ea8f1 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OpenGLUtils.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/OpenGLUtils.java @@ -4,8 +4,8 @@ import java.nio.IntBuffer; import java.util.Set; import java.util.TreeSet; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/TeapotActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/TeapotActor.java index 62c10204ab..b8e57102c5 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/TeapotActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/TeapotActor.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.viewer3d; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; import com.jogamp.opengl.util.gl2.GLUT; import org.janelia.workstation.geom.BoundingBox3d; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ViewportGL.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ViewportGL.java index 2e0b9ae43d..fa42338b6b 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ViewportGL.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/ViewportGL.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.viewer3d; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.janelia.workstation.gui.viewer3d.interfaces.Viewport; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/VolumeLoader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/VolumeLoader.java index 7739aca337..8e04e37037 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/VolumeLoader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/VolumeLoader.java @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.janelia.workstation.img_3d_loader.H265FileLoader; import org.janelia.workstation.gui.viewer3d.loader.LociTextureBuilder; import org.janelia.workstation.img_3d_loader.TifVolumeFileLoader; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/axes/AxesActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/axes/AxesActor.java index d346fd14ed..5fa0314035 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/axes/AxesActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/axes/AxesActor.java @@ -9,8 +9,8 @@ import java.util.ArrayList; import java.util.Collection; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.integration.util.FrameworkAccess; import org.janelia.workstation.geom.Vec3; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/buffering/VtxCoordBufMgr.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/buffering/VtxCoordBufMgr.java index 84c9db2ca3..8e238659ab 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/buffering/VtxCoordBufMgr.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/buffering/VtxCoordBufMgr.java @@ -6,7 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/error_trap/JaneliaDebugGL2.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/error_trap/JaneliaDebugGL2.java index 57848b4b8c..58dca73975 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/error_trap/JaneliaDebugGL2.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/error_trap/JaneliaDebugGL2.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.viewer3d.error_trap; -import javax.media.opengl.*; +import com.jogamp.opengl.*; /** * Created with IntelliJ IDEA. diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/RectSolid.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/RectSolid.java index 282cdc742c..a180e82b2b 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/RectSolid.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/RectSolid.java @@ -7,9 +7,9 @@ import java.nio.ShortBuffer; import java.util.Date; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.geom.BoundingBox3d; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/Rubics.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/Rubics.java index 074638641a..9133527d17 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/Rubics.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/learning/Rubics.java @@ -4,8 +4,8 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.CoordinateAxis; import org.janelia.workstation.geom.Vec3; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/loader/TextureDataBuilder.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/loader/TextureDataBuilder.java index 26826a36b2..c7c85b2ebd 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/loader/TextureDataBuilder.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/loader/TextureDataBuilder.java @@ -5,7 +5,7 @@ import org.janelia.workstation.gui.viewer3d.VolumeDataAcceptor; import org.janelia.workstation.gui.viewer3d.texture.TextureDataI; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; /** * Created with IntelliJ IDEA. diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/matrix_support/MatrixManager.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/matrix_support/MatrixManager.java index ef57360cf0..7630d1139c 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/matrix_support/MatrixManager.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/matrix_support/MatrixManager.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.viewer3d.matrix_support; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.gui.viewer3d.MeshViewContext; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/MeshRenderer.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/MeshRenderer.java index 82af485674..3361388280 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/MeshRenderer.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/MeshRenderer.java @@ -2,9 +2,9 @@ import java.awt.Color; import java.util.ArrayList; -import javax.media.opengl.DebugGL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.DebugGL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.geom.Rotation3d; import org.janelia.workstation.geom.Vec3; import org.janelia.workstation.gui.opengl.GL2Adapter; @@ -49,8 +49,8 @@ public void display(GLAutoDrawable glDrawable) { float[] backgroundClrArr = getVolumeModel().getBackgroundColorFArr(); this.backgroundColor = new Color( backgroundClrArr[ 0 ], backgroundClrArr[ 1 ], backgroundClrArr[ 2 ] ); - setWidthInPixels(glDrawable.getWidth()); - setHeightInPixels(glDrawable.getHeight()); + setWidthInPixels(glDrawable.getSurfaceWidth()); + setHeightInPixels(glDrawable.getSurfaceHeight()); resetOnFirstRedraw(); final GL2Adapter gl = GL2AdapterFactory.createGL2Adapter( glDrawable ); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/AttributeManagerBufferUploader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/AttributeManagerBufferUploader.java index 0009c97471..380afabf3d 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/AttributeManagerBufferUploader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/AttributeManagerBufferUploader.java @@ -3,7 +3,7 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.Map; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; import org.janelia.workstation.mesh_loader.RenderBuffersBean; import org.janelia.workstation.gui.viewer3d.OpenGLUtils; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/BufferUploader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/BufferUploader.java index d4ba90a318..3bcbb87337 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/BufferUploader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/BufferUploader.java @@ -1,6 +1,6 @@ package org.janelia.workstation.gui.viewer3d.mesh.actor; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; /** * Implement this to take on capability of pushing buffers to GPU. diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/MeshDrawActor.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/MeshDrawActor.java index cccf1c8ab3..aa17899882 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/MeshDrawActor.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/actor/MeshDrawActor.java @@ -4,9 +4,9 @@ import java.nio.IntBuffer; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.GLAutoDrawable; import org.janelia.workstation.gui.opengl.GLActor; import org.janelia.workstation.gui.viewer3d.MeshViewContext; @@ -213,12 +213,12 @@ public void init(final GLAutoDrawable glDrawable) { MatrixManager.WindowDef windowDef = new MatrixManager.WindowDef() { @Override public int getWidthInPixels() { - return glDrawable.getWidth(); + return glDrawable.getSurfaceWidth(); } @Override public int getHeightInPixels() { - return glDrawable.getHeight(); + return glDrawable.getSurfaceHeight(); } }; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/shader/MeshDrawShader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/shader/MeshDrawShader.java index 049725320b..f3b36ee611 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/shader/MeshDrawShader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/mesh/shader/MeshDrawShader.java @@ -2,8 +2,8 @@ import org.janelia.workstation.gui.viewer3d.shader.AbstractShader; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/picking/RenderedIdPicker.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/picking/RenderedIdPicker.java index f0f3688f8e..de4b1ee8b9 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/picking/RenderedIdPicker.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/picking/RenderedIdPicker.java @@ -1,9 +1,9 @@ package org.janelia.workstation.gui.viewer3d.picking; -//import javax.media.opengl.GL2GL3; +//import com.jogamp.opengl.GL2GL3; import java.nio.ByteBuffer; -import javax.media.opengl.GL3; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; import java.nio.IntBuffer; import static org.janelia.workstation.gui.viewer3d.OpenGLUtils.reportError; @@ -51,8 +51,8 @@ public RenderedIdPicker(IdCoderProvider idCoderProvider) { * @param glDrawable */ public void init(GLAutoDrawable glDrawable) { - this.viewportWidth = glDrawable.getWidth(); - this.viewportHeight = glDrawable.getHeight(); + this.viewportWidth = glDrawable.getSurfaceWidth(); + this.viewportHeight = glDrawable.getSurfaceHeight(); logger.debug("Establishing width={}, and height={}.", viewportWidth, viewportHeight); GL3 gl = (GL3)glDrawable.getGL().getGL2(); diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/AbstractShader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/AbstractShader.java index a268a303bf..d9e592ffea 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/AbstractShader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/AbstractShader.java @@ -9,7 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/VoxelRayShader.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/VoxelRayShader.java index 378e21d1a4..79538784cc 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/VoxelRayShader.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/shader/VoxelRayShader.java @@ -1,7 +1,7 @@ package org.janelia.workstation.gui.viewer3d.shader; import java.nio.IntBuffer; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; public class VoxelRayShader extends AbstractShader { public static final String VERTEX_SHADER = "VoxelRayVtx.glsl"; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/text/TextTextureMediator.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/text/TextTextureMediator.java index 31edcf7419..ee1ab9ac48 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/text/TextTextureMediator.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/text/TextTextureMediator.java @@ -4,7 +4,7 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.IntBuffer; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.apache.commons.io.IOUtils; import org.janelia.workstation.gui.viewer3d.OpenGLUtils; import org.slf4j.Logger; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/MaskTextureDataBean.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/MaskTextureDataBean.java index 250ab0baf0..c7a7687b9a 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/MaskTextureDataBean.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/MaskTextureDataBean.java @@ -14,7 +14,7 @@ import org.janelia.workstation.gui.viewer3d.renderable.RenderableBean; import org.janelia.workstation.gui.viewer3d.VolumeDataAcceptor; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.nio.ByteOrder; import java.util.Collection; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/RenderMapTextureBean.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/RenderMapTextureBean.java index a7c6e86814..d4bab93ebf 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/RenderMapTextureBean.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/RenderMapTextureBean.java @@ -6,7 +6,7 @@ import java.util.Collection; import java.util.Map; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import org.janelia.workstation.gui.viewer3d.VolumeDataAcceptor; import org.janelia.workstation.gui.viewer3d.VolumeModel; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureDataBean.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureDataBean.java index e763b711be..be1e4e4979 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureDataBean.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureDataBean.java @@ -15,7 +15,7 @@ import org.janelia.workstation.gui.viewer3d.volume_builder.VolumeDataBean; import org.janelia.workstation.gui.viewer3d.VolumeDataAcceptor; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; diff --git a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureMediator.java b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureMediator.java index 7e0c5883ed..17c0bcd867 100644 --- a/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureMediator.java +++ b/modules/Viewer3D/src/main/java/org/janelia/workstation/gui/viewer3d/texture/TextureMediator.java @@ -7,7 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.util.HashMap; @@ -660,9 +660,9 @@ public static String getConstantName( Integer openGlEnumConstant ) { glConstantToName.put( GL2.GL_UNSIGNED_SHORT, "GL2.GL_UNSIGNED_SHORT" ); glConstantToName.put( GL2.GL_LUMINANCE16_ALPHA16, "GL2.GL_LUMINANCE16_ALPHA16"); - glConstantToName.put( javax.media.opengl.GL2GL3.GL_BGRA, "GL2GL3.GL_BGRA" ); - glConstantToName.put( javax.media.opengl.GL2GL3.GL_RGB, "GL2GL3.GL_RGB" ); - glConstantToName.put( javax.media.opengl.GL2GL3.GL_UNSIGNED_SHORT, "GL2GL3.GL_UNSIGNED_SHORT" ); + glConstantToName.put( com.jogamp.opengl.GL2GL3.GL_BGRA, "GL2GL3.GL_BGRA" ); + glConstantToName.put( com.jogamp.opengl.GL2GL3.GL_RGB, "GL2GL3.GL_RGB" ); + glConstantToName.put( com.jogamp.opengl.GL2GL3.GL_UNSIGNED_SHORT, "GL2GL3.GL_UNSIGNED_SHORT" ); } rtnVal = glConstantToName.get( openGlEnumConstant ); diff --git a/modules/ViewerController/pom.xml b/modules/ViewerController/pom.xml index b0f71d8b24..22db480e99 100644 --- a/modules/ViewerController/pom.xml +++ b/modules/ViewerController/pom.xml @@ -46,10 +46,10 @@ viewer3d - + org.janelia.workstation - jogl213lib + jogl260lib diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/PyramidTexture.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/PyramidTexture.java index 07961fafed..98a8d36f12 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/PyramidTexture.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/PyramidTexture.java @@ -1,6 +1,6 @@ package org.janelia.workstation.controller.tileimagery; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; import com.jogamp.opengl.util.texture.TextureCoords; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Texture2dGL.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Texture2dGL.java index eed8ef869d..f377d98df2 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Texture2dGL.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Texture2dGL.java @@ -1,7 +1,7 @@ package org.janelia.workstation.controller.tileimagery; -// import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; +// import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; import com.jogamp.opengl.util.texture.TextureCoords; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureData2dGL.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureData2dGL.java index dbe9fc1e52..b1b07ae032 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureData2dGL.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureData2dGL.java @@ -1,9 +1,9 @@ package org.janelia.workstation.controller.tileimagery; -import javax.media.opengl.GL; -import javax.media.opengl.GL2; -import javax.media.opengl.GL2GL3; -import javax.media.opengl.glu.GLU; +import com.jogamp.opengl.GL; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GL2GL3; +import com.jogamp.opengl.glu.GLU; import com.jogamp.opengl.util.texture.TextureCoords; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureDataI.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureDataI.java index bbf29394a1..266c220d5d 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureDataI.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TextureDataI.java @@ -2,7 +2,7 @@ import org.janelia.workstation.controller.tileimagery.PyramidTexture; -import javax.media.opengl.GL2GL3; +import com.jogamp.opengl.GL2GL3; public interface TextureDataI { public PyramidTexture createTexture(GL2GL3 gl); diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Tile2d.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Tile2d.java index 5e14f5786a..c6edb5644b 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Tile2d.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/Tile2d.java @@ -2,8 +2,8 @@ import java.awt.geom.Point2D; -import javax.media.opengl.GL2; -import javax.media.opengl.GLAutoDrawable; +import com.jogamp.opengl.GL2; +import com.jogamp.opengl.GLAutoDrawable; import com.google.common.base.Preconditions; import com.jogamp.opengl.util.texture.TextureCoords; diff --git a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TileTexture.java b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TileTexture.java index dddf1483ef..46464e36df 100644 --- a/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TileTexture.java +++ b/modules/ViewerController/src/main/java/org/janelia/workstation/controller/tileimagery/TileTexture.java @@ -1,6 +1,6 @@ package org.janelia.workstation.controller.tileimagery; -import javax.media.opengl.GL2; +import com.jogamp.opengl.GL2; /* * Note the subtle distinction between Tile2d and TileTexture diff --git a/pom.xml b/pom.xml index ae3b4493f5..bc9b00b84e 100644 --- a/pom.xml +++ b/pom.xml @@ -267,17 +267,10 @@ ${project.version} - + org.janelia.workstation - jogl213lib - ${project.version} - - - - - org.janelia.workstation - jogl224lib + jogl260lib ${project.version} @@ -1262,8 +1255,7 @@ modules/GLViewerTools modules/Geometry3d modules/SceneWindow - modules/Jogl213Lib - modules/Jogl224Lib + modules/Jogl260Lib modules/branding modules/N5Viewer From f842ed493c6631ea38d4e78db0de53ebf3d3cd1a Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sat, 20 Jun 2026 00:59:32 -0400 Subject: [PATCH 04/12] Updated version to 10.0 --- modules/AdministrationGUI/pom.xml | 4 ++-- modules/ColorDepthSearch/pom.xml | 4 ++-- modules/CommonGUI/pom.xml | 4 ++-- modules/CommonLibraries/pom.xml | 4 ++-- modules/Core/pom.xml | 4 ++-- modules/DataBrowser/pom.xml | 4 ++-- modules/GLViewerTools/pom.xml | 4 ++-- modules/Geometry3d/pom.xml | 4 ++-- modules/HortaTracer/pom.xml | 4 ++-- modules/IntegrationAPIs/pom.xml | 4 ++-- modules/Jogl260Lib/pom.xml | 4 ++-- modules/LMDataBrowser/pom.xml | 4 ++-- modules/LargeVolumeViewer/pom.xml | 4 ++-- modules/N5Viewer/pom.xml | 4 ++-- modules/SceneWindow/pom.xml | 4 ++-- modules/SiteHortaCloud/pom.xml | 4 ++-- modules/SiteJRC/pom.xml | 4 ++-- modules/Viewer3D/pom.xml | 4 ++-- modules/ViewerController/pom.xml | 4 ++-- modules/ViewerInfoPanel/pom.xml | 4 ++-- modules/WoodstoxLib/pom.xml | 4 ++-- modules/application/pom.xml | 4 ++-- modules/application_horta/pom.xml | 4 ++-- modules/branding/pom.xml | 4 ++-- pom.xml | 2 +- 25 files changed, 49 insertions(+), 49 deletions(-) diff --git a/modules/AdministrationGUI/pom.xml b/modules/AdministrationGUI/pom.xml index 07028653be..0271d7ff35 100644 --- a/modules/AdministrationGUI/pom.xml +++ b/modules/AdministrationGUI/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. AdministrationGUI org.janelia.workstation adminstration - 9.21 + 10.0 nbm diff --git a/modules/ColorDepthSearch/pom.xml b/modules/ColorDepthSearch/pom.xml index a42a401382..de361a47ab 100644 --- a/modules/ColorDepthSearch/pom.xml +++ b/modules/ColorDepthSearch/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. ColorDepthSearch org.janelia.workstation colordepth - 9.21 + 10.0 nbm diff --git a/modules/CommonGUI/pom.xml b/modules/CommonGUI/pom.xml index f2b3273279..0351b27920 100644 --- a/modules/CommonGUI/pom.xml +++ b/modules/CommonGUI/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. CommonGUI org.janelia.workstation common-gui - 9.21 + 10.0 nbm diff --git a/modules/CommonLibraries/pom.xml b/modules/CommonLibraries/pom.xml index 6cdc24e9fa..833ed4e140 100644 --- a/modules/CommonLibraries/pom.xml +++ b/modules/CommonLibraries/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. CommonLibraries org.janelia.workstation libraries - 9.21 + 10.0 nbm diff --git a/modules/Core/pom.xml b/modules/Core/pom.xml index e57480e5a4..54a1eda2e6 100644 --- a/modules/Core/pom.xml +++ b/modules/Core/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Core org.janelia.workstation core - 9.21 + 10.0 nbm diff --git a/modules/DataBrowser/pom.xml b/modules/DataBrowser/pom.xml index dba48dfb6a..54758cd740 100644 --- a/modules/DataBrowser/pom.xml +++ b/modules/DataBrowser/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. DataBrowser org.janelia.workstation browser - 9.21 + 10.0 nbm diff --git a/modules/GLViewerTools/pom.xml b/modules/GLViewerTools/pom.xml index ee4dc62ad5..0f569ca23c 100644 --- a/modules/GLViewerTools/pom.xml +++ b/modules/GLViewerTools/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. GLViewerTools org.janelia.workstation gltools - 9.21 + 10.0 nbm diff --git a/modules/Geometry3d/pom.xml b/modules/Geometry3d/pom.xml index b0a4a5aaa3..c258428215 100644 --- a/modules/Geometry3d/pom.xml +++ b/modules/Geometry3d/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Geometry3d org.janelia.workstation geometry3d - 9.21 + 10.0 nbm diff --git a/modules/HortaTracer/pom.xml b/modules/HortaTracer/pom.xml index 680f41df31..a3872453e7 100644 --- a/modules/HortaTracer/pom.xml +++ b/modules/HortaTracer/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. HortaTracer org.janelia.workstation horta - 9.21 + 10.0 nbm diff --git a/modules/IntegrationAPIs/pom.xml b/modules/IntegrationAPIs/pom.xml index 952be0dab5..bfe2542eed 100644 --- a/modules/IntegrationAPIs/pom.xml +++ b/modules/IntegrationAPIs/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. IntegrationAPIs org.janelia.workstation integration - 9.21 + 10.0 nbm diff --git a/modules/Jogl260Lib/pom.xml b/modules/Jogl260Lib/pom.xml index 8c3871d4a4..c3784605df 100644 --- a/modules/Jogl260Lib/pom.xml +++ b/modules/Jogl260Lib/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Jogl260Lib org.janelia.workstation jogl260lib - 9.21 + 10.0 nbm diff --git a/modules/LMDataBrowser/pom.xml b/modules/LMDataBrowser/pom.xml index 04cb85fdf6..8082f7bcfd 100644 --- a/modules/LMDataBrowser/pom.xml +++ b/modules/LMDataBrowser/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. LMDataBrowser org.janelia.workstation lmdatabrowser - 9.21 + 10.0 nbm diff --git a/modules/LargeVolumeViewer/pom.xml b/modules/LargeVolumeViewer/pom.xml index 8862798a11..01acf0e70c 100644 --- a/modules/LargeVolumeViewer/pom.xml +++ b/modules/LargeVolumeViewer/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. LargeVolumeViewer org.janelia.workstation large_volume_viewer - 9.21 + 10.0 nbm diff --git a/modules/N5Viewer/pom.xml b/modules/N5Viewer/pom.xml index 3552605ab0..3a82261908 100644 --- a/modules/N5Viewer/pom.xml +++ b/modules/N5Viewer/pom.xml @@ -5,14 +5,14 @@ workstation org.janelia - 9.21 + 10.0 ../.. N5Viewer org.janelia.workstation n5viewer - 9.21 + 10.0 nbm diff --git a/modules/SceneWindow/pom.xml b/modules/SceneWindow/pom.xml index 8e9b429d95..d946274997 100644 --- a/modules/SceneWindow/pom.xml +++ b/modules/SceneWindow/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. SceneWindow org.janelia.workstation scenegraph - 9.21 + 10.0 nbm diff --git a/modules/SiteHortaCloud/pom.xml b/modules/SiteHortaCloud/pom.xml index 2df9eb398b..baf204908e 100644 --- a/modules/SiteHortaCloud/pom.xml +++ b/modules/SiteHortaCloud/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. SiteHortaCloud org.janelia.workstation sitehortacloud - 9.21 + 10.0 nbm diff --git a/modules/SiteJRC/pom.xml b/modules/SiteJRC/pom.xml index cacfc3fbec..8b9f5db47b 100644 --- a/modules/SiteJRC/pom.xml +++ b/modules/SiteJRC/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. SiteJRC org.janelia.workstation sitejrc - 9.21 + 10.0 nbm diff --git a/modules/Viewer3D/pom.xml b/modules/Viewer3D/pom.xml index 2afae10acc..ecca6bb7b1 100644 --- a/modules/Viewer3D/pom.xml +++ b/modules/Viewer3D/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Viewer3D org.janelia.workstation viewer3d - 9.21 + 10.0 nbm diff --git a/modules/ViewerController/pom.xml b/modules/ViewerController/pom.xml index 22db480e99..a9cc315586 100644 --- a/modules/ViewerController/pom.xml +++ b/modules/ViewerController/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. ViewerController org.janelia.workstation viewercontroller - 9.21 + 10.0 nbm diff --git a/modules/ViewerInfoPanel/pom.xml b/modules/ViewerInfoPanel/pom.xml index ff5946eacc..1ba490676d 100644 --- a/modules/ViewerInfoPanel/pom.xml +++ b/modules/ViewerInfoPanel/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. ViewerInfoPanel org.janelia.workstation infopanel - 9.21 + 10.0 nbm diff --git a/modules/WoodstoxLib/pom.xml b/modules/WoodstoxLib/pom.xml index 8c8066e847..656aee420e 100644 --- a/modules/WoodstoxLib/pom.xml +++ b/modules/WoodstoxLib/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. WoodstoxLib org.janelia.workstation woodstoxlib - 9.21 + 10.0 nbm diff --git a/modules/application/pom.xml b/modules/application/pom.xml index c4993cfe25..1d3a969861 100644 --- a/modules/application/pom.xml +++ b/modules/application/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Janelia Workstation org.janelia.workstation application - 9.21 + 10.0 nbm-application diff --git a/modules/application_horta/pom.xml b/modules/application_horta/pom.xml index 9a616e37bb..2c1d0bfbb0 100644 --- a/modules/application_horta/pom.xml +++ b/modules/application_horta/pom.xml @@ -5,14 +5,14 @@ org.janelia workstation - 9.21 + 10.0 ../.. Horta org.janelia.workstation application_horta - 9.21 + 10.0 nbm-application diff --git a/modules/branding/pom.xml b/modules/branding/pom.xml index 5343726a2a..7f0999ba69 100644 --- a/modules/branding/pom.xml +++ b/modules/branding/pom.xml @@ -5,13 +5,13 @@ org.janelia workstation - 9.21 + 10.0 ../.. org.janelia.workstation branding - 9.21 + 10.0 nbm Branding diff --git a/pom.xml b/pom.xml index bc9b00b84e..f2a5c79c4e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ Janelia Workstation org.janelia workstation - 9.21 + 10.0 pom From 1fb5cfe4bef4e6d9bd68c362b55898e2595625a0 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sat, 20 Jun 2026 00:59:34 -0400 Subject: [PATCH 05/12] Updated module version to 3.80 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2a5c79c4e..7f9d1efbf3 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ RELEASE300 - 3.79 + 3.80 21 From 435c2a2c4bbe771b885d00d647f08a3e1c094050 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sat, 20 Jun 2026 01:00:59 -0400 Subject: [PATCH 06/12] uppdate modules --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7f9d1efbf3..4899041739 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ RELEASE300 - 3.80 + 4.00 21 From 1ebe24a403ea789cb6d08d7850ad589cd0ba8d2c Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sat, 20 Jun 2026 11:32:58 -0400 Subject: [PATCH 07/12] update the application packager --- README.md | 1 - docs/Development.md | 45 ++++++ modules/Core/pom.xml | 8 + modules/application/pom.xml | 145 ++++++++++++++---- .../application/NetBeansJPackageLauncher.java | 99 ++++++++++++ modules/application_horta/pom.xml | 145 ++++++++++++++---- .../application/NetBeansJPackageLauncher.java | 99 ++++++++++++ .../netbeans/core/startup/Bundle.properties | 8 + .../org/netbeans/core/startup/frame1024.png | Bin 0 -> 368862 bytes .../org/netbeans/core/startup/frame256.png | Bin 0 -> 46185 bytes .../netbeans/core/startup/frame32_dark.gif | Bin 0 -> 1196 bytes .../netbeans/core/startup/frame48_dark.gif | Bin 0 -> 2245 bytes .../org/netbeans/core/startup/frame512.png | Bin 0 -> 132172 bytes .../org/netbeans/core/startup/frame_dark.gif | Bin 0 -> 458 bytes .../org/netbeans/core/startup/splash_dark.gif | Bin 0 -> 14925 bytes pom.xml | 5 +- 16 files changed, 494 insertions(+), 61 deletions(-) create mode 100644 modules/application/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java create mode 100644 modules/application_horta/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame1024.png create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame256.png create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame32_dark.gif create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame48_dark.gif create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame512.png create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame_dark.gif create mode 100644 modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/splash_dark.gif diff --git a/README.md b/README.md index d7e9d16add..0e790ad3f8 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,3 @@ The canonical two-server deployment of the MouseLight neuron tracing tools is de ## For Developers For information about building this code base, see the [Development](docs/Development.md). To create an official release, see the [Release](docs/ReleaseProcess.md) documentation. - diff --git a/docs/Development.md b/docs/Development.md index 5dddd27f1e..3f41ffc1f2 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -14,6 +14,51 @@ To build the Janelia HortaCloud application, use the `horta` profile: mvn --batch-mode -T 8 -Djava.awt.headless=true -P horta clean install ``` +To build the full project without running tests: +``` +mvn -DskipTests compile +``` + +### Packaging + +Native application images and installers are built with `jpackage`. + +To build the Janelia Workstation application image: +``` +mvn -Pjaneliaws,deployment -pl modules/application -am -DskipTests -Djpackage.type=APP_IMAGE package +``` + +The generated application image is written under: +``` +modules/application/target/jpackage/ +``` + +To build the Horta application image: +``` +mvn -Phorta,deployment -pl modules/application_horta -am -DskipTests -Djpackage.type=APP_IMAGE package +``` + +The generated application image is written under: +``` +modules/application_horta/target/jpackage/ +``` + +To build a native installer instead of an application image, change `jpackage.type` to the package type for the target operating system: +``` +# macOS +-Djpackage.type=DMG +-Djpackage.type=PKG + +# Windows +-Djpackage.type=MSI +-Djpackage.type=EXE + +# Linux +-Djpackage.type=DEB +``` + +Native packages must be built on the target operating system. For example, build `DMG` or `PKG` on macOS, `MSI` or `EXE` on Windows, and `DEB` on Linux. + ## Running To run the Janelia Workstation application, use the `janeliaws` profile: diff --git a/modules/Core/pom.xml b/modules/Core/pom.xml index 54a1eda2e6..2cd80fd4dd 100644 --- a/modules/Core/pom.xml +++ b/modules/Core/pom.xml @@ -52,6 +52,14 @@ org.netbeans.api org-openide-dialogs + + org.netbeans.api + org-openide-filesystems + + + org.netbeans.api + org-openide-filesystems-nb + org.netbeans.api org-openide-modules diff --git a/modules/application/pom.xml b/modules/application/pom.xml index 1d3a969861..5d26efb312 100644 --- a/modules/application/pom.xml +++ b/modules/application/pom.xml @@ -17,6 +17,9 @@ package + APP_IMAGE + ${basedir}/src/main/app-resources/janeliaws128.png + -Xmx8192m @@ -262,11 +265,26 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + compile-jpackage-launcher + compile + + compile + + + + + org.apache.maven.plugins maven-jar-plugin + launcher @@ -278,37 +296,17 @@ - + org.apache.netbeans.utilities nbm-maven-plugin ${clusterName} - ${clusterName} ${janeliaws.debug.args} ${basedir}/target/${brandingToken}.conf - - ${basedir}/src/main/app-resources/template.xml - - false - - ${project.name.capitalized} - ${clusterName} - ${basedir}/src/main/app-resources/build.xml - ${basedir}/src/main/app-resources/launcher.sh - ${basedir}/src/main/app-resources/janeliaws48.png - ${basedir}/src/main/app-resources/janeliaws.icns - ${basedir}/src/main/app-resources/janeliaws48.png - ${basedir}/src/main/app-resources/ConfigurationLogic.java - ${basedir}/src/main/app-resources/unix.launcher.properties - ${basedir}/src/main/app-resources/windows.launcher.properties - - + default-standalone-zip @@ -414,13 +412,12 @@ - + deployment - none + package @@ -449,17 +446,16 @@ none - + default-standalone-zip package - + - installers-and-site + autoupdate-site - build-installers autoupdate @@ -477,6 +473,85 @@ replace-mac-executable none + + prepare-jpackage-input + package + + run + + + + + + + + + + + + + + org.panteleyev + jpackage-maven-plugin + + + jpackage-native-package + package + + jpackage + + + ${clusterName} + ${project.version} + Howard Hughes Medical Institute + ${project.description} + ${project.build.directory}/jpackage + true + ${jpackage.type} + ${project.build.directory}/jpackage-input + ${project.build.finalName}-launcher.jar + org.janelia.workstation.application.NetBeansJPackageLauncher + ${java.home} + ${jpackage.icon} + + ${project.build.directory}/${brandingToken} + + + -Dworkstation.brandingToken=${brandingToken} + -Dworkstation.clusterName=${clusterName} + -Dbranding.token=${brandingToken} + -Dapple.awt.brushMetalLook=false + -XX:+UseParallelGC + -Dhttp.maxConnections=20 + -Xms1024m + ${jpackage.max.heap} + -Dnetbeans.exception.alert.min.level=2000 + -Dnetbeans.exception.report.min.level=3000 + -Dplugin.manager.check.interval=10 + -Dplugin.manager.check.new.plugins=true + -Dplugin.manager.check.updates=true + --add-exports=java.desktop/sun.swing=ALL-UNNAMED + --add-opens=java.base/java.lang=ALL-UNNAMED + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + --add-opens=java.base/java.net=ALL-UNNAMED + --add-opens=java.base/java.nio=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + --add-opens=java.base/java.security=ALL-UNNAMED + --add-opens=java.desktop/javax.swing=ALL-UNNAMED + --add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED + --add-opens=java.desktop/java.awt=ALL-UNNAMED + --add-opens=java.desktop/sun.awt=ALL-UNNAMED + --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED + + ${janeliaws.appbundle.name} + org.janelia.workstation.${brandingToken} + ${brandingToken} + true + true + true + + @@ -484,6 +559,18 @@ + + macos-jpackage + + + mac + + + + ${basedir}/src/main/app-resources/janeliaws.icns + + + create-autoupdate diff --git a/modules/application/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java b/modules/application/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java new file mode 100644 index 0000000000..0732873f76 --- /dev/null +++ b/modules/application/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java @@ -0,0 +1,99 @@ +package org.janelia.workstation.application; + +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public final class NetBeansJPackageLauncher { + + private NetBeansJPackageLauncher() { + } + + public static void main(String[] args) throws Exception { + String brandingToken = System.getProperty("workstation.brandingToken", "janeliaws"); + String clusterName = System.getProperty("workstation.clusterName", "JaneliaWorkstation"); + + Path payloadRoot = findPayloadRoot(brandingToken); + Path platformRoot = payloadRoot.resolve("platform"); + Path bootJar = platformRoot.resolve("lib").resolve("boot.jar"); + + System.setProperty("netbeans.home", platformRoot.toString()); + + List netbeansArgs = new ArrayList<>(); + netbeansArgs.add("--branding"); + netbeansArgs.add(brandingToken); + netbeansArgs.add("--clusters"); + netbeansArgs.add(clusterPath(payloadRoot, brandingToken, clusterName)); + netbeansArgs.add("--userdir"); + netbeansArgs.add(defaultUserdir(clusterName)); + netbeansArgs.add("--laf"); + netbeansArgs.add("com.formdev.flatlaf.FlatDarkLaf"); + for (String arg : args) { + netbeansArgs.add(arg); + } + + try (URLClassLoader classLoader = new URLClassLoader(new URL[]{bootJar.toUri().toURL()}, + NetBeansJPackageLauncher.class.getClassLoader())) { + Thread.currentThread().setContextClassLoader(classLoader); + Class mainClass = Class.forName("org.netbeans.Main", true, classLoader); + Method main = mainClass.getMethod("main", String[].class); + main.invoke(null, (Object) netbeansArgs.toArray(new String[0])); + } + } + + private static Path findPayloadRoot(String brandingToken) throws Exception { + Path codeSource = Paths.get(NetBeansJPackageLauncher.class.getProtectionDomain() + .getCodeSource() + .getLocation() + .toURI()); + Path appDir = Files.isRegularFile(codeSource) ? codeSource.getParent() : codeSource; + + Path nestedPayload = appDir.resolve(brandingToken); + if (Files.isDirectory(nestedPayload.resolve("platform"))) { + return nestedPayload; + } + Path siblingPayload = appDir.getParent() == null ? null : appDir.getParent().resolve(brandingToken); + if (siblingPayload != null && Files.isDirectory(siblingPayload.resolve("platform"))) { + return siblingPayload; + } + if (Files.isDirectory(appDir.resolve("platform"))) { + return appDir; + } + throw new IllegalStateException("Cannot locate NetBeans platform payload under " + appDir); + } + + private static String clusterPath(Path payloadRoot, String brandingToken, String clusterName) throws Exception { + Path clustersFile = payloadRoot.resolve("etc").resolve(brandingToken + ".clusters"); + List clusterEntries = Files.exists(clustersFile) + ? Files.readAllLines(clustersFile) + : List.of("platform", "extra", clusterName); + + List clusters = new ArrayList<>(); + for (String entry : clusterEntries) { + String trimmed = entry.trim(); + if (trimmed.isEmpty() || trimmed.equals("bin") || trimmed.equals("etc")) { + continue; + } + Path cluster = payloadRoot.resolve(trimmed); + if (Files.isDirectory(cluster)) { + clusters.add(cluster.toString()); + } + } + return String.join(System.getProperty("path.separator"), clusters); + } + + private static String defaultUserdir(String clusterName) { + String home = System.getProperty("user.home"); + String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); + if (os.contains("mac")) { + return home + "/Library/Application Support/" + clusterName + "/0.4"; + } + return home + "/." + clusterName + "/0.4"; + } +} diff --git a/modules/application_horta/pom.xml b/modules/application_horta/pom.xml index 2c1d0bfbb0..2217780a89 100644 --- a/modules/application_horta/pom.xml +++ b/modules/application_horta/pom.xml @@ -17,6 +17,9 @@ package + APP_IMAGE + ${basedir}/src/main/app-resources/horta128.png + -Xmx40960m @@ -243,11 +246,26 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + compile-jpackage-launcher + compile + + compile + + + + + org.apache.maven.plugins maven-jar-plugin + launcher @@ -259,37 +277,17 @@ - + org.apache.netbeans.utilities nbm-maven-plugin ${clusterName} - ${clusterName} ${janeliaws.debug.args} ${basedir}/target/${brandingToken}.conf - - ${basedir}/src/main/app-resources/template.xml - - false - - ${project.name.capitalized} - ${clusterName} - ${basedir}/src/main/app-resources/build.xml - ${basedir}/src/main/app-resources/launcher.sh - ${basedir}/src/main/app-resources/horta48.png - ${basedir}/src/main/app-resources/horta.icns - ${basedir}/src/main/app-resources/horta48.png - ${basedir}/src/main/app-resources/ConfigurationLogic.java - ${basedir}/src/main/app-resources/unix.launcher.properties - ${basedir}/src/main/app-resources/windows.launcher.properties - - + default-standalone-zip @@ -395,13 +393,12 @@ - + deployment - none + package @@ -430,17 +427,16 @@ none - + default-standalone-zip package - + - installers-and-site + autoupdate-site - build-installers autoupdate @@ -458,6 +454,85 @@ replace-mac-executable none + + prepare-jpackage-input + package + + run + + + + + + + + + + + + + + org.panteleyev + jpackage-maven-plugin + + + jpackage-native-package + package + + jpackage + + + ${clusterName} + ${project.version} + Howard Hughes Medical Institute + ${project.description} + ${project.build.directory}/jpackage + true + ${jpackage.type} + ${project.build.directory}/jpackage-input + ${project.build.finalName}-launcher.jar + org.janelia.workstation.application.NetBeansJPackageLauncher + ${java.home} + ${jpackage.icon} + + ${project.build.directory}/${brandingToken} + + + -Dworkstation.brandingToken=${brandingToken} + -Dworkstation.clusterName=${clusterName} + -Dbranding.token=${brandingToken} + -Dapple.awt.brushMetalLook=false + -XX:+UseParallelGC + -Dhttp.maxConnections=20 + -Xms1024m + ${jpackage.max.heap} + -Dnetbeans.exception.alert.min.level=2000 + -Dnetbeans.exception.report.min.level=3000 + -Dplugin.manager.check.interval=10 + -Dplugin.manager.check.new.plugins=true + -Dplugin.manager.check.updates=true + --add-exports=java.desktop/sun.swing=ALL-UNNAMED + --add-opens=java.base/java.lang=ALL-UNNAMED + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + --add-opens=java.base/java.net=ALL-UNNAMED + --add-opens=java.base/java.nio=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + --add-opens=java.base/java.security=ALL-UNNAMED + --add-opens=java.desktop/javax.swing=ALL-UNNAMED + --add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED + --add-opens=java.desktop/java.awt=ALL-UNNAMED + --add-opens=java.desktop/sun.awt=ALL-UNNAMED + --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED + + ${janeliaws.appbundle.name} + org.janelia.workstation.${brandingToken} + ${brandingToken} + true + true + true + + @@ -465,6 +540,18 @@ + + macos-jpackage + + + mac + + + + ${basedir}/src/main/app-resources/horta.icns + + + create-autoupdate diff --git a/modules/application_horta/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java b/modules/application_horta/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java new file mode 100644 index 0000000000..0c06e4b88d --- /dev/null +++ b/modules/application_horta/src/main/java/org/janelia/workstation/application/NetBeansJPackageLauncher.java @@ -0,0 +1,99 @@ +package org.janelia.workstation.application; + +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public final class NetBeansJPackageLauncher { + + private NetBeansJPackageLauncher() { + } + + public static void main(String[] args) throws Exception { + String brandingToken = System.getProperty("workstation.brandingToken", "horta"); + String clusterName = System.getProperty("workstation.clusterName", "Horta"); + + Path payloadRoot = findPayloadRoot(brandingToken); + Path platformRoot = payloadRoot.resolve("platform"); + Path bootJar = platformRoot.resolve("lib").resolve("boot.jar"); + + System.setProperty("netbeans.home", platformRoot.toString()); + + List netbeansArgs = new ArrayList<>(); + netbeansArgs.add("--branding"); + netbeansArgs.add(brandingToken); + netbeansArgs.add("--clusters"); + netbeansArgs.add(clusterPath(payloadRoot, brandingToken, clusterName)); + netbeansArgs.add("--userdir"); + netbeansArgs.add(defaultUserdir(clusterName)); + netbeansArgs.add("--laf"); + netbeansArgs.add("com.formdev.flatlaf.FlatDarkLaf"); + for (String arg : args) { + netbeansArgs.add(arg); + } + + try (URLClassLoader classLoader = new URLClassLoader(new URL[]{bootJar.toUri().toURL()}, + NetBeansJPackageLauncher.class.getClassLoader())) { + Thread.currentThread().setContextClassLoader(classLoader); + Class mainClass = Class.forName("org.netbeans.Main", true, classLoader); + Method main = mainClass.getMethod("main", String[].class); + main.invoke(null, (Object) netbeansArgs.toArray(new String[0])); + } + } + + private static Path findPayloadRoot(String brandingToken) throws Exception { + Path codeSource = Paths.get(NetBeansJPackageLauncher.class.getProtectionDomain() + .getCodeSource() + .getLocation() + .toURI()); + Path appDir = Files.isRegularFile(codeSource) ? codeSource.getParent() : codeSource; + + Path nestedPayload = appDir.resolve(brandingToken); + if (Files.isDirectory(nestedPayload.resolve("platform"))) { + return nestedPayload; + } + Path siblingPayload = appDir.getParent() == null ? null : appDir.getParent().resolve(brandingToken); + if (siblingPayload != null && Files.isDirectory(siblingPayload.resolve("platform"))) { + return siblingPayload; + } + if (Files.isDirectory(appDir.resolve("platform"))) { + return appDir; + } + throw new IllegalStateException("Cannot locate NetBeans platform payload under " + appDir); + } + + private static String clusterPath(Path payloadRoot, String brandingToken, String clusterName) throws Exception { + Path clustersFile = payloadRoot.resolve("etc").resolve(brandingToken + ".clusters"); + List clusterEntries = Files.exists(clustersFile) + ? Files.readAllLines(clustersFile) + : List.of("platform", "extra", clusterName); + + List clusters = new ArrayList<>(); + for (String entry : clusterEntries) { + String trimmed = entry.trim(); + if (trimmed.isEmpty() || trimmed.equals("bin") || trimmed.equals("etc")) { + continue; + } + Path cluster = payloadRoot.resolve(trimmed); + if (Files.isDirectory(cluster)) { + clusters.add(cluster.toString()); + } + } + return String.join(System.getProperty("path.separator"), clusters); + } + + private static String defaultUserdir(String clusterName) { + String home = System.getProperty("user.home"); + String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); + if (os.contains("mac")) { + return home + "/Library/Application Support/" + clusterName + "/0.4"; + } + return home + "/." + clusterName + "/0.4"; + } +} diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 3170d99f23..e5a5a399b9 100644 --- a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,9 +1,17 @@ currentVersion=Janelia Workstation {0} +AWT_AppClassName=Janelia Workstation LBL_splash_window_title=Starting Janelia Workstation +CTL_About_Title=About Janelia Workstation +CTL_About_Detail=Detail +SplashOnByDefault=true SPLASH_HEIGHT=169 SPLASH_WIDTH=358 +SplashShowProgressBar=true SplashProgressBarBounds=0,100,358,2 SplashProgressBarColor=0xFF0000 +SplashProgressBarEdgeColor=0xFF0000 +SplashProgressBarCornerColor=0xFF0000 SplashRunningTextBounds=250,88,100,9 SplashRunningTextColor=0x0 SplashRunningTextFontSize=8 +SplashRunningTextFontType=Dialog diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame1024.png b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame1024.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1447bb6771b06ab3b0fd156181776fc4a78f40 GIT binary patch literal 368862 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%0DXz?ikR+aDdH2lO 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 z%0D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

Ui~oquU>yxF#3yP}O11F{^;x z@-5?XeYq0(8OH|4MKt@xdsKjg?j!V-FG}Tl+B@nB!X1`zA!PD-W7P#8JpxWw9-~ip zHRr}!nCGho$7`BLEdR*hn2Uymys+Fh5Zx^ci#>4Ll7)O$u>@K>J;DkX9)o7*bCFUs zlOJPbgqiNO`qDt^_j$!C-SKIZFXMcAb#-o08(2t#dh&8iL2|#O#(7kg7jgK@#i_Rt z6y$+u>!uwL#`%8#!;UrYOU*M+>{0!8DCSQm#SlYYF^s)spceq+kpxj9s8r zF*Z6ZQ1PrB9gsjJ#z*ZQ6lEVmw8?n5Ctw$|vHLUPg48q?3lkw$Iv}|9sFrgX6?9K{ zLFg?`$gc5D#w34QgVQOaaD4wXEFi98e1`#use-wEU%5BP*rt?6I$q9j9(zdviVc@U6;7aWi9+VqW2a z%d(}bgVf(c(RLqDezjL%0lmUv2%%>*5N$poPCB`^0EttP1B|BS9`jI45v|$%7J1O4Leu_Dx z`LfRt5)&~k67JTF?%JV(f5NmL-dtYoOwbU)(Wu2!ZNei-Ffw}mmEE#bM-mt+eDqD$ zCMy~*&5+bADx!Gr0W__UoV(tSWS-8A+y*E_oCwJy28N@|V6GdDmhyfzj^oKtkiiq?mfk?S* zi-}!JpIIR5e-S0IFEe%2ab9=desgCKTHW=4uShMABAxgPtLTqR4niu@Y?knDTO--X zLv{f&{L6bJpS!0ZvcNQXix_(;^Ele*+CRlL)XGRcdiS~%zVX`FS9j1S@*r)({uZnS>Xc3nr>Uyk$k?g0@Xq^?PJUv28&pd5GZnv0fEz~V zCHqg1#tb9GQCBK&4|~7v%ltCt`j|>-=gaz0*%9`1B|(oy_8~tiGGibL7VODU2}uz( zFB?H@h707;hhrlASt%_5bavMK_JMHhIV(vjn=1Srf9|85f5|BK(kDjsT6Qw!sXQ}e z=Uw}+d@%wdig>{U(a{J}E&36Bncv#kI!`<~d)ZvIeFGp&A$#s=1h%B~Fv?46=M**L zXw50Ox?wSVa~oIg--;%6&_o?0oi8J4eo>l9!gMRUu!jNp%;-(fk|GI$?nwFZB#bw% z63MJ_an;zRNOHA|3DlauB;t~uc86LiXXv7Pboyt&7R3L|+Bq{BDqu@bHTOT=nfyM*`K;m&Aqw}Gvq$*Hx? zeRQGxKZC1e2)lm#;*v$LP(7T-L*y*&CPdsk)Eku9nxzt@xmKdNVEnW<_22NKjUN!C767Xbf-MybVd`OwH23Ia>p&e+isRX+Og*Ghge?jneRzQ;V9Uj+NGp zYpJ1&jBmN1tde~nx2?y02N;NvAwcwvw{GN1yUFOxOCX3fjW#6s{_WY2GyYe+LA$+>^7FSX;0J?v`CIzJ@q_|0UA=`yIf3x343Qc@fk1AV z7mFYKUB#q=&zYNHyq5Fr`~|R4X!$TzD?aRW(foLnNJCBQ=XfwOsn~JQ?!s=h657RIGw-@`)cD*(1MrIL>6UehpwkCh+|pz9j01 zxVTtke|lwH#?1~97>52TJrW%s+GziF@HRn+8%Bw1<1Afl>>Zs`k^^xyGK4l_sy%Kq zci?tDHEHN3ws_`!t$FQwkb{3dVMBxiw}l(JG=zStO*wmgrZn4MXNN*B!O17y?Ch`` z z@##i>HMK@grgC%$q+JXqnCkq-qtw>y?{)7q{OCoc_H~cYG&nV6%Mt~!XTF}v`Qtg7 z^+S5Yy+f~vIZp9aVS7X1GyvZgDKVK`CsP8ds^X?0sOnxc#yR&H1*|pPLQE+S|SDWH){} zZPDvt=0iKK5yJxr_Y)i+&Nb=@s;eYf`0ZQ8-(u|MY-H9Tufs>?p6 zvaCqG;8FoE{b~w$T_9*Ld+ERFNI9N!GIeY=WbgIbbu)D&8h>~8*5P| zXbsQ$`W$@DWd3=j%{8ESdNCeem}YF?l8}H4dOd_@1*SaIO!rn zj9z2zdHIZm$$nSuQVuW4;N?PNDb|}@p1VgDhBR)2fQ3ZwL@0+0PsuY7t3dxvB2ex$ zGcV4`(nch1F8b1GA%_Qz{-pHRu2c~-n|ev`aeQ6U^4ai88AnM5(FnK%L2Nl*MIoMQulu41qd9Z4 z5?bG%@*9q8?(a%o%X+n(e=oP#`~ICspD%1YJh|R$EwkqxZF_OlqqrmVWQd&YC0XpLIlG)1GC{q%AFQ(==bxK_iIVn?SE18S}Vpxh=!=q8StJ zn4CgQj;5!z(Wj0qyL<&ZVdt$Ban4r$jRb5(OA>iSrM*O)>he-8GkOR8adfd{kNH1y z&1Zj5?BVQg8xR^lAe2JX)4x)Qefn%!LsaZrN6(fcz`m=LQ~&(+$@D?Ko9d$lQj2Xb z!gPV72)Jrpu+Y9Dz-BWUR z5Y$vnkAJ7#meoKwq$CT7p!UR*{w9N}ZSe{$TE{EH0S%^p>xxAmoqoZlDM3r-5tcC; zSKoFoojSI3frpwDAfs0+)<0Uy{C}^0j=VZo$am#o)33~!@8X#jxxdz!0hh%Yx~NR@ z{(vqBkY_*{pEidt2p`@u7A|a1;-tLNpR=8#IUiJ!F2`qvL)l`-E+cpvkmqIPS!u(8tl}$~!>Bk`G3x z+-VV_MO>nqEjeeqB9-MEyoQ{*hs{PuQ=Ze_C@2vtLiuQM8cm|CMJ(P0{dy;Sut=`@C7gv#ImHp4VIcyv0;s@N}sZW!bra=g~40bnO>#n_tXh)icq-mnv91hI;spbXV~oN4Z+<4FrEU z(JtKDILpD(-u)auj95m6={Y1ZZ~4=XP;Ha+j+(5jD&gy3H(HqUz=v|(2dJKOOX+J zGr|TX6jsvtdUf$`E;eBl5x#t|{A1j=@x^mLBh8Rl_e)>U`r9oSNVAXv83$t$G<0%6 zLErj?c`8yZfO=EP+s2Ei3uaGK7H-5x3Xb;!I%vtzLGr|d6FQtC+W$vJ($SE0q>bbx)AgITr>BiWD-sITw1s+I^ ze>>A>DhrS?hD9_$m6&3z^^A%m0DKasG^s$qhudG;ZSUGxe{4w)Oyix0zDfpYeR?%X zm;vMmLtpNTU!HS9pY~BdK|6Oel+I=whQlAK-r{~oe^1aW-Kn8R20PO_RfSL&zxC_y zv+>U>6`%zoQ!}jm5{jQv>bKVAQA~3oh2vo#H&{W}Q-tjJ2lD;V1*)&#|SZ5@qS?4>^8QR7Crx9t#}n#(*7OkMa@ESGbz*|}_G_2MDe z`|24T3^;8Vv8MEWgr4u~3%&Bv=6yC8g1(s$0N{f4;J!iuG|Em@N)9Vc64V>5R6(bS z-|Sg^u#N{{qjc~xku4TIbZ&hj&9i5*xnOu$2~bJY_9lDHKDR^$kfNRVVfrRMPn~=z zxjG|31z(BsoN+ibdYm(DYut}FOs@X}JhB0BY`TD|`e!&#pN~;3xIe}U87Ef`7pdEHu&iI$w^ zN80U_SLfn01RRT0|JUX>Ex-3i8>qlfCr^VvrJ%wSs{Cn*Yd)F}iNX$ZXpC#0y1Y{K z4Pg@hMywmI4nqxx7ZfOIf~D!}@O6tX3cJb@qGaG#p?SzZw*K7`XOv+2%M%Ru1n9N- zFJv9k+!Eof2^Zo@JO>@$m3}n_nclYxBQaI|N1+;_AR0|i&@`OzAN0yYocq+AxLczx zwn8#gdth~s49iVgZROtQ(IS&#-w2%$m@I<&Y-`X#zeh1lfzEs2Pk0G51d zSWy=K)KHcFWW?+EaJlHL-AceUFZ0T=99g+071!YWTec%53Nivdx)As{Vngx129IIB z;%6%XzB6yVFN5SHe z8zDLWJ@`NV_YH{>Kr|`^P`+e)Kv$nBg#ti7U-sN_?-4!H#`SqY?IKwg+uh9P=u?4g z34RA>1ggFWg0TF8(380tgugGt*XemHUm+x0qbCp7%Dv8O6Qn6~-iK_@zZ;=@@pZ!0 z<9{1BGbWUb9hh2YGlrvZQxZ{*{{*RTzyx*Yzf6#I$m6Cj8!W&@Mb%2L;2z=IW|(rW z_B?+5=P$BdL30t)UgBI&ug5lKbMQ0+=xgLR$sm9Io}wD`>2be&Kz^mcJI9@m{?XJx zMPJ?CgusRV0#Q~7>`D~R$B*>8t`;ydOn(e5AtfUzNjrrdvVT2i>pqO}j4PYo`EZU~ zwJ6;at$J~%H)&Ud3^e|DN3*usT3ttTkUA-?*-@Z`f7JSu2Efq|vxs~^(R0al%w3H5 zaXz0t2>9!-0WHAiOfk->buqyq{D5;|e`EiTi40>6~2(bXESw4q2IRfmD3U@OZPpsO800}KoT z*EmYQtNeJ~=VZwD)fC$XJBHsg3mc%=$V)dwyUPH4E0I6E1XSbT(xnA5`>qf%FWpZ5 znnFg&U;6lsTHFsdNX&1sxUAoIiHHM4q>a#)CMC z{vbyfQ`o5ilef8sG2e8X$CiCSlaL|;x}dPuS6T&$ux>TXZV)znm2zEwyADj9_9vXU zapUK1drG?{$||#S?~8fs5SVxrr6-%fcUzi~{1S!8IfOp=CZA+!RLgrAor5oBr6fj~ z^}doT0o;M?ka^8kA9l>-g0|x1Ui}F9HA#UR7_Fq=RttD};S54fT{)o_MHxOuy+<|X z(_>Ip#W(Y#Y7m2b-UKNBJ3{=3BJ}_<)B;1=)7G+Ny`Imho?cQLuMk?5^|q{=b+UUu z{<$Z$ImsWjF-^O|j}ha^roqQe45gQ|r0BY})iae@pg*I-N*WWsFhPVS^m22M_%B8L z6it5=T_Gf}Dl9Kdsn(6#hL!Si)fYvQUs=@7CD`(Wzn6fGKKVHrM`75Zcuu2)l*OXI zYGH(X)K~FD)550x=#vV1K|RtO5SsAWtVy|Ng_t9W-TUB~0gp%};md}WVI3i*YM8A{ z5%reKRr)C``Yt>tea}_>9jR~Tb9qKz@cXh3w~`Bis?pfFfF)^w_9Mh?&sYt>z>WA zP38HfE9h|{w;y|x3TIVDS2m;K-<;;s-Jt7o=lqhfa zMW|%o9GhnMII)&qMRw-ROjhw9OSDEEXV#iSmkhoul_5{ePO+wywhdcyGhCLqth`_sjaYg@srdiv&;3 z^tj<5{@h9%%`{1)9c^TQv<8<^sGC`(fueY$;2$HL;sIu_6zZlOoIJ2`mL_gInm@!p zMRjn7WfMv-Gt_U3%vZ!&aXyQL2YA>nRz!+Nu55+ZjX(+!gKmUJ3)@0TqTz3F%#Gzy z-H9B}ecN=0Ettj7M6B|+%jjYh2D&KI`vs(js^4kCREhC5*&m@s1r#O3=fZ2HL@h*p zOdR@a2Rvn1+FAec8ToFPH~c~L?M0Ch8{+rhcpIzA-x)2)ThqolJs`f(>Gd|jgPb<< zd;L!5FqOuSV^@5V>4I!A-ZR5_yv4rlYQZ*9@oD<5$l;d^u*r#nlURMCj>_qcDi6i) zULctMu7bzGb7**vmviv}t;?LJCqr%Y$Dyk9bH*`xOShQB zKF^aQQSVHe<0iiu-KP~0gz2My4bz}h>tL1e@8zgO*xK+hly-|l8vh{Fo%wk)Cz)&P zsrBT=%wVh^j<$y|W`j~JfV-@eR)^5(Bh=VUje8-gQ)Xk2xXQ`UM!%`G_PMGKwVTPq z7;?%DYDo)lSc%LB*SS+? zYZd15nV-U9%B8aNAcvfy<-;xcUK2cy!}-e~&=QElzZF8fz^miyR)H z#a?!dSviTDrux)dgRL=HLqz;>&m;)dps(C9M&lM-5pW52Z|;;tPZMQAsYmHZpIDt?V!a-?^L2-7e}Z2CXw@>#-AMV{aWeq zF$?`YFt1q^k3S+t@yn5$n~z)q1XJ&!LP%MYHc4e2}m0GM^ot5f~xFiv*r-$ec>*LPk0*}ta-nXC23h%!N@ zPSB`$Mk1b4SjEW3*HH6 zFB}~F*g_l1bSE1m2dWRU2v)ZGJ5(GvF6T?&&9y=96so6SZ4h91e=|n94pZcQiYS#- z;o^z_a1cu;4f}WC&yt#(Op%{{J4jQaXjJ=tmuvT#S93#S<}x?pQSq$|A%Z(CS~ol_ zKeur0k^PyX_PxkOjf+wHMRj+7qanfT*V?$JGn+Cy3dt-@Pf%osveM)m(X9<(R23bC z*b{f-^Ca2#9MB`Gvv*^Znbm#*_HBu+>^BPOoY*u}nTC`Nk5TiCiBw|yhXwu160`r8 zB{nUucKv!h;gZ`SoEVB2ki6!1S}lU+@L#>6d60-<7Z50&db0+FTFmm=`%KuEU?x=r zBnas{(IluwaBigXibIG?N`H!{XkVM^Nx%Lyw~*=CsK5*~T)6s~P2A!Xw&I4n3ic^A z_BdFYPvM#EhWv!Nt@>lriv)MlKq*B+bNd^XB<)QEkU>E9= z_30p@?mfIp5V8}(cSiCjee&x&zpHmDNPBX$zQ%eZ(SildIs(n_D(vZmwlmu?P7~ST zm(7hS^0OJfZ1=5_qDumTumJiOL{@JDoW3L719!2TTf4ih;|7!F)T+8q@{dS%msX!9 zQYx&zX=RO2TJ@SJ>vqa*SB@jYS+UIjU1L4rRpLaATC){AKCV`x)vuIkMZ?-}d!T|h zq1+)vR=j3Xd~0>J2!|8IdH_ibl)zuICXggjN=xT-s8+le5lx_j&aYvl|FsTpT^$Kr z4j7PI3uXM^96l#P?LTrs7~7`)8u=J`W=A|`C!_P|P|#4q8ORPDUM1^Xp!sW9JZBxK zpRxh|v(`9#^R=k2y8KY^8ZqVaSLkI@$d^0W^FI?OxFH;_5lLmv}0+V+9Q^cW!&wv^B;;uF9JA!6U2ce2y;q`8- za&Tczg?7^+UVB+f#Y+y1{pVynYkE(dl)BITTqhPzM$8&by0~!wfO3vbEwXCt^S(4r zIXWUv)3@b~ztJD5HGqi)dkgJz5eOZ+^2L9m+=)QpuYWIy;&9jD|BohRA$%}E0Q@I~ zrchazUMIypyezZ*_@+jsQQky*6KeOnoCAkPU0Q=WRrt4wYPZ=UjKL5>=a7N?_L`$a z2a4L?*9eZ&QGXXb8663JH4-(JXO1IOK%x-mXCsuHZ)G{~+tzp=JlsOyVld6fL&)>8 z>+Fvx;dMSCEDS_1E^VsHCl|F=d1-b52U-Z+&82B2i`&w6XLl+`nR`WU+OzF4=z9)o z{fJ;Ev@1q3QXL95cvh{5-&m;)jw&R$^=p`6oRNbA53bFYu|M|dm7=&lo&sqFYAJgz zWcZ;~QqpLfY=NddFGViX3SFgGUD4gg|#D(jZ3sfqY6yUp^8s+?Mw>(v(vOdot}l+bz+t_ z_oGF2i#f&rLyr*zTa#jme?5Q*Kba?M%YLEn5&WOi|L6F%CL3;8fCcHvH8>7vQIWX& zTcUw>gXLY91c#n=Nk79tyuS$uG5uU)SMYl{mtGZRR!;-XDW5(J(*Yu~t0zC)s^B|C z3642+y&U@D<334<5+ja~%;=wZC&PLqsYGaN$kb-g$G`jjJerb-D-_QI)Q4i@4~j^2 zHke>y`~qnfiiexAf6De))Vzfs9rvEF3nU#cTeFO+-XEsq>wmkrc6Ju_cNMzlHjCn= zp))}t7vzfY;U~LEJLX$m-+lkGb9C;P1`Tb@ZxWSS%`t>Bwyy`I_Jz7+lHSyEeaIu_ zU>^Y$SMqgtWVBt9r)*RK)^8q~Y6u4bmabnx{1nXX8v0br9pA2r`X;)*Lw*}CKW%lL z?o1;*3q3jMA2bxA7CxZ!W$7KKuGL!nT^S7u@=8_FS!q22igmHVV*f5I{#nH)SsieI zyfuWI2!qf7U-atxlk{fl@(+_SXIjOhsb+_!Z!|efk1S4h7Psi?mjPeS6k%PvpVNY< z>j!bkT}c1npZ}e+sNjA4w~wJP>e8Jtsvj$ug*ZuZJ^cXUd!&24@9$o_$R*mzT#4%z zsu+@1)H%v%g|!=V!B;dn?Pp%0(UxK6A0`j-gm6IeIkU=50HMmKM9}&e9{o$~oK=iw z(`5n$*8k{AvUA5d2Q8fkxUz*cY@^}>&Lk`6699tz2 zZi*i1ho?C!3V2;Dm$_uPwus=!wCRll0z#x?`ljzv-@|q*J1J2shV^8A<+-ZO*1{xo z;VX?GPIzz%*bPAmY(s2^Y7nfg3lTCTf-V0vFZTVddX8WzZQS*X5oq{vy7@Mw5)9*o z2HqU4ncrG?#ALpPCbl2`mR*nk3Tr-vnSX}7w-g)7b-r&qM}g37DoRW$R3i_@H%`y3U<6ls#~ym z#3E(k7z-UtQC&rQ!@z%uSm0O<`E)b#@96*xM)EF>@Q%Cvv6Z%6!=RhCnHG(6SM?cu|cSXj8s z8`v08$H{(lL@%6kP-ICc5vyzMnV?7|_ho|5ipBE0acZ=?+rmXme|^ySZ5yVvdijd4 zLx1A0VIL2r9%t?W%2Q(XiA(my+sO4AVm=q3z{j7}So;x=nAGM6$gs-$VwRiwdBH?_ zFvx{n)>o)M=tmjbvM(=42it4?#m9>*z13)EjgMV@_D3LC(I=l4CHa!i)t>*hJhe zK8tQ9la)%qhm63*&q)O2?9psVa((PX_~G9%4~iZ>)giT>iag&r zp7%L|DaAiX>736$e|D|?K4HCTy2(NQ4r%=&ZicT(%FiO0b+Dzv?xl;TRvJIku!!mo zW{OTJw6)<{G8E*?GCAx25^T812J0Jzjym1u_!q})e#dgya~c8UtuO7= zt~7l~dxBZ>K**3Bw#;cKuxx61@*NvO@Z_qgmsPi=NZ_|(a}z=d5e@Kj;J+$? ze(QHoMj?M4bV^8p|BS~@zQ2<(r^Tt1yeHXv_$^f0^>NfgeXKBcV_a0lE`M!sxH*M# zgWyL5RtJ|1OI2z92`ujCfI^+Vg1+)dc)G0`?-{MnVg%8B&!C|Ym~+*ix8 ztVD1y0^KYV_kUSs7v^VtDtfiR{hhSZ_#T}{2y5jwrcRs*i=4pa;sap~NDAA3q|)P( z9*?>wz+Xaue9k(eqcW1!4L7P@qO0rfBl_1VHE^2F#nLK|E4p`LB>0cu^WN<8Y(1&xs^3b>1T`nEg7f@bKJ_fKm~$tZc6^@9C(268P}e zDzzgxh@O8t`(=A~d--ek?<4s$`AUsQ|3&Ir`}n*4Hl;UFct|i92q4#}7To;1Ir?#a zo3&p}$I2x^a-X)#$!#f4wL}syVX{l104;W`2|F5r0^5d3VNAqjW^3zVOi*ei073{= z{+~!XoGp&=9C)@7M3yleXx^Q;m%H=$k30U=b?|U}=QxY`r;EiAuZ>ZmUV@>VX`RyS zQ0G}i*P()kV_U+E;-f-9hbs8P&y?>e*a~t|7M%Ur@Fc>fi9LiqeT-r_2B!PSpH-Ds zjo~w4ZLUn!>2xc5=DkN5w}7b=ntobHsi7#LQ@HCWurq}FA4#AME*LLk;>&(NOuHSe z^c&u4kobGk#NcrRxU&b3?u=6~UJ)nswK!(sP$iFR*z{}?Q4*C>B9z|tN#Hs$4YLeV z{D^e>?%rI)@6R(Y`^(nj!^Gp6>6XQ{`Qf`hU`#K4#jN#|Q^SBLh=Xuq$wZ(#YNBqm z-WU4qwaStG`wj;piv(9s+MYrWEO#v8M>s40z~XE!AdHM$BEJN_VTy~6%N)ELjLVN7 zX((a|E5msR{jhmPPQ>x-lzwwDHL2b+e{&IbI^7x^YK;j}2yc1+FWA2ldON~&RNya! z53l{03*#uop}XqL)>iwu72Ft&GWW&P1?@Ug}we3KecCtjnm)sB{96tB1LH$JAg$-!kuf9-4qpQ6^x!! z*ctB~gbZjxL^RfrjcX@1H=6*R+~lfvOsc9yvcT-)*TeNT?2*ZnD+14$ru%)+T5!=8 zoO;$~9dYJ#Nrh>3gEe_O#qPWhzy`iX<_0sSyoeV1{Vm~-$t0gGXq)+-%%%a&pa zp&Te>oKP7+v2_Y+z`osl>R*$lC=c)o!g)wJ)nT%56H8a-=XG9hVi1LYZx|Q;e;711CnKuY)Bx`WRgviARS&+nX3=lPJ`@;dWCsP0vu~gN zRO6MErbc^u3^MlrSFQCmJx?!DhJuuI`!cJQ>#m*BpeTD3C4h0pr$zo_07K*p;YcUU4?hC3J0LB6~6%kMu zQ3qUnjXcw#Qp__ZXRXGMik06{S0ki<`HD}{`R%RJq2e&xDel6e+*V&)Hk+SEm_2MT z)skH%gwDTZp#Pl>TaF8P1OVtk5(^SY+LM1kOB8px-!id92)|C=_sISyrm4c@Wio5p zGm-X~-Q-VP<~o;XcKi`tX6k0!3c`(T^^U?bHHQgO+}YN3bM0-SI0HNaarD8p0*lx- zMgj#JE~zl%6_cpq*48U+dBu7dcaL#xn(SzuktXPs1071-VQnI@LEwhgVF?*sXb8(H zU+OI*c_X}AF#XW{l?Z|BrZ*~NGJ}2oY>!^WkVJmpWR>Z>97|i68PSA zs9!;!WCySx*p?h?IU?xB9`BSbF=?!@)v*_|sQPE{Y4x z1(#;YnX!9AcFTI_jEa0d%&RvU_y3N~Ke-ElMac7Vv8QaK5ubMW1-c2IzZ7i~9EojN zA5JC=7{jJ;&8D83(Rr6VahL+~cj@lW`l& zbVv*yGOe`dWW4;^zrHm1mFg0W#sam*rS*)5v)!HXGP7t@nxG!Xe$AkFB9Z+a^!-61 z4Y!zQh4LX@@ovfc&u=#OO6HwBUrX466r)tWLm5|ng`V=dxcZV>ben48wz{VE3{rjJ zr)e{)>-mXR255@l&Njo)AwZl-=+mJ=jCXD1-YrxU+2N>)4)&Z08wjqaWv@KWsbJp# z#&A$GvV4cxSE3Uq*Rox_;gg(`od$LKa^{Sc`BwvnoRA)GAIB{{gvUb46iUzsPT<2o zdRMZthP;Qa-zqVrR~WiDp!|P5KY_5R?2SRat^1%nT6K9x&g=!jd28#pCoOb(wnv)W zhSY8=CrT5Zq=~D*IAo@0P?C}JK*>Ft1~&_5SqT8Xc^Y>bC`Hx2RCvPir z2aOo}(S4|`uFO2%mu%`gtJsY%Iy<6Vw|Utrg8`G6kmqJ0>D6QPr+}=5&l?p2=X!S) zAMa+*x7*3lPKZ^&TVYfrPUnbskN~Xcw=oE(n425tG>kmb>Lu!*ZfDS0@fi|~80zuR zZff-Q)8C!Xe5IH!y=tn!ySH1LDFxZF36VA#k72B#-Du+Eu;!mnp9-&3prtEkP7Qsa zhz!C9OgZU)PQlK+C-42nAA9H9L9N@wQQugn6H z6{Lnnk+o&rrZ_*Y557$GyTvh+N{`;oYH461&W5>;kBw=*l%nX*VmH|3^2s+Mf`?WW zTPhR4->Y>CL3jVJM?9c$P{MSy$wRA0wIA=ShyJ1|m++4NWI9HVb@%5QRNi=bmYd<^ zI#zGE;qPbk7~2C{9i#VG5&oKZ{|{AP85QTUH9dp71a}DTgS!(Ff&~aL zxVyW%!ypMkf)fZ3T!RK1+zBqh-C-a&^KtII=UwYt```1kS3ljgtE*~%A$fewI}v~} zlGaSc%geb5FPmBB5|Yy)PxVjdH}vH^uDx>(z1KfT%3o|Sb)VN%qciT&00 z7Z$?9OunCQ>S?Po{vOpp`k#uVAmuXnk#Bup1;sbtN{G*}zHS4qaffY)M%|?sOi=ne z+MwhkhYXN*`~rV&A5(({T-g8eIpwO>+NCic7-?$N=Ewr$Olwv}hqrq41i<>>w5*7upyqH}wG}nx8z*YYBH{ z-Y4h4v3juS0L1X4VpM;%VXKJSz`;u~iyu1~Id|&cbp3t5j8M5-QQ%;f>eu52zah05 zx^rZ2pI!05H$#nIJorR61X3oI`i&BDH*fP=zz=|DMF;6axc*Eh1|f(MiaK;FVMZ%i z0A!e<&<+Z>ezv4Ts36Bp`@-Ba^`p1)!3$i1ti0)H*qqZR_Y%3HhSfY>L*b>*ep}h> z48Zwtb2boPDs^f)&HXNU_`)+%_|e?aHUX39@_z_ zB9}e9-y(>tQ(-}?IMZj5DY#K&jR5B& zPF@5eOnBp-s({^yaNw~RFNh9M&rr&P^he$nqo#>%lNxyW$KxCO+LPFvR$R0%RzNXn za(Cx5UOI&?H>8Z?m?&U|QKtE|^26IeVlzYQi2M}rn?g`lEK&=Q;`MhF7H^vo5J53)w=V41bu`L1~x6uz~ zAwY}%573Sd2B2yXS{o7q9x@TW?`JTw$mk#f@XJTp?|}%>G91)wgE_KWZxnMPzjB}< zxm%z{`P4hae5XklU>T38%O;;MTYGoL1bb=HxJeL2VaDe6nh+`Yr%tUYN>fU0<1Gzd z0Fu)^@!hQjns%ls8t_Uac0*__b>?}j78Llq65>N(Ty&E@&_#{qk@$*l94nnhD~ib$ zBkmK*SFHZSV-h0(4@3DDs=1Ve1e3e$mb>t6R?v6q1)~ z^PlB-SrAH6A5~z8?xe+33x|Gj|7sFUl;@DK|jG zzDded#BzfWzhp$0c?>4Fz;=m=?Qj{zWhA&25yrJZ5|_z*nubC>8i5DtcTJXFi3ReY z?Wiq&d{-CZibOk9&muzFcd`9iF(}X=<1F5gb{s!q3>Rw$2E#n?aQkESs9ys=;yF(> zTNi*#-R6fDa&K-KC3ld2@d;I_E1vJ&*BOv_tf;5Gii?5Gp=~Eu9>f5QiKRMJy-^4; zgz`Ey8t$E>=uyB#HMr&1Kow9_Hdz$byZ(|e7GBvglkCrYrXqWQOLeOBPD!lcxj+Xk z<1IRqbN8h$zmRTfc{D=eADWW_`*ZKU{o6HlSYU~l0Hl2|*HX`*Qy1cHPa>$lph)Rs zikU>D2JxEP+ak<|=S2j=X!@bSRP<;ej-OM5bM_)SUy)c6FL2)l-gX39k>U{m152{R zm1_z~nU2Maf5YU_Xq7^V;&K!K0KU&=zgeNimVen2%Fm+6n8j0hY>3^*J^xOkNi(iL zKB|v)F4Z0JhQ%792V}nhsb1;%TY;Lb6xzq@W}Hq5mcl8tP`xk)fK^@+SE4&{9K$}N zVhFbMRwd%BeLb}LOylnEzzWF|Y4nM}Yg*@N)+FR2xq`6L<4xzqhYgl;b&uVeJPaWuoGe{j*^RW;h7d5;qgW z!Vw$1Wu6?hXh4onH>tnAzs!|P_Y`XXYW?Dz)PuM80Bi`Fs%lY#tLa%ilO(7BDzS;y zvAMj2+0@~>l&DYN(EOi_R>XXX1Uo;aS~G5UbyaYcQ?6M~8EdT&Wdd5AF%Z&*f#pkL zh}%c)9Kcc^3NM1CfVg_o|M^i7u_8_ai12Qd+zpvHA0U^j2NATJ=%9dv+hGOjvw}wIRvJ zPm)A!R<{%VZ+^YBZ~rL80t!fdxPa2MyYQrvvu|sJ)zeTY?a9VOi{8C^P!8&X@9;$_ z%JiCii6Ujko21hSY^`y3!N5~I&+MkT#qk;u3tzTdARlDG`kt*L!qZ)c#;cFhc<3j? z@_ODumVt8`M@;mb&sRv*v1!jFTbj93^9B0>w8AILBiQ4?Pha? zAP${uv`UiftM*)hc-QKdIN1ORII_QGw^m>fSEahY?Z9tvF!4_g9xHm!Ch*69bl@*` zr}NLCd{>8omKK^o{r=8pE)`rgl&1?}5i*ilu@z^CE)8!6XZtf9R==3?D=pNR->M)= zv5@Z16yU|kjZrD%GS=9qd2Ji!uOTAT=K(Q`H>^usPWIg$kIR>V;>~{>Ju4d1jT%p>Be`}-UU!VG39uNnUYtU;Dv%E-xWW`o7$=<^W?i)4J=vdzIgE1b9|q3-+b$3fpGc5 zY2dD}eu=66o(^x2IxHCoP}3txyfb}=Jzo>x-wf#0R0j1v?%Go2i!i->$ujHtsQn^q zi1YIHvd2vIS?i_!x>9AYc2!jo_rNRpL5$P$TH7^AUPGrg4{;QW$5Zva(IlJ3A8WlfLPo(&sE<+>$?%}zZ8@9FO0>z&C3+Iwb72t7~ptV=grKC!1z3@D- zDAHH28KSmlGHMn(-1#U%;gsr0bZzHl#QNSY7wJab0@v0L<|WL^P3B-{K z1>3$VKqr1-~+Tim-Gr6B1Ej#v_W&}_h=?QaK`Yeix?Uu zr={W1PvF{vq$Xw_5X7NhWB`nZm)!33jn|IYl~CtX0ES)te(2Le`UKxCu6)JBUss;4 z@lLXlIpihEavR3K{Pu!(8>#E*+pma|KsJC$-WJVi9?)F4!YSOPF_AiC4uu%w^r0g@ zX<5X0c|P=o6Zm?!Vgu*)AH(9_11#{(WxR1l-r%9Q6FJm(u#}!RIiqRhCH_L5KwO$% z5zCfflW-Mn_|V^JOhO%{lQ;6ez0})Pj}GAYSxhDin0elr&>ig*FCKe6^Sv>JTmfDG z$MHUCqn%>^^@~i-dLb}_;pA~-5T`&JG}$=r+3kSYG4rtNce-i9rz*T37Wkvtw>3xv zJbRl$+!Z(dff9*o;3FjMJ)5~D=+Otg%T8nzL!M@hUrQikCu0?NOC$;YN+j;s20{O6?AM9=Hbh)NULUa`NTX_H#k$!XkCnBy*N zLM;(kh%nqN5Dk3Yg4XM=n=-HXfhYq#B3s`@p4P0h?zB(qH}uf5|Jm{^pd8O+9-y5a zJf-&hDln9W0C9~k6z=3k6kYxH0xg`(JtJsViV|yDct|r1soi!{bnN`Ci^7s({Njx;w1QSV2#^L|d%5*XJbV&k33`J(e zg^mSph#x)vas@;d)E5e?_S=GMwqjkcTJh?+d$?2%f$Z53QPXqWRCs12evTUPTO{E4 zc&V3;R`s(Nr~gl@zQvklUYej+Sk0y0P^XRMb*D^jehyi+2YwA0;g%H3riszFDRl3! zC2LT1xm6;2>A4?%&fZI_$HA6)C#O(xc|7c$K3~J$X*6Xxd@F1G{cMhkXFZWl=-8?g z8ID+6a%TD*{DMBboqrdx+y|h!jt;?DWH13rHc#U5{KsQoYcv!Xx@OsS4qKDRI4!*C7i{h?#@E|u{Osxw z#YX&W`dkoBNFt~h7}>Va-i5Nx!aZGRT6cTR{!_{1@mha$>mE`z{&o-B$-GIc$oXXM zX1BpbUy^xf{PDeaI`7J5z{0--0bhSeOsOH}K$UQlzWssf+Sq1FxT&Z}jOz^v^%d+; z;Pok8JoWGdHrsDfkGL#qJ-}PaWU+i&5rqlby%^p-QOCtE{`Js$?O2uCJ=GlVR)d7_ zQ!HBc$u=sW(qAYRYlRA^|HNd88^NBfCh0$Ck>eWbZs*e&wXd#kTd< z8RFF1lO^R&&OaS$CsjKR>}$}MXMmpx;V(*aqss3uio4!N_*RzD{aCq7Fz>J~qTQEV zg0wJ{Q`peQ^=IF2a*0TDxR)fA7M-hnR@i1y`0UtVxAF5pnFvU^wM ze){ZLQ163!d#={kaIvwNBPcG|T#o+|kf_gn=XmkAL%pa=|J%g(Wd&#pUL zysi3;XeF{Tj$x-Pgd+cajS2HIM)4P7r)d!oG#TX7sL2|I43r)!C!J1z^GayxpyfAr zLe^s|`naF(Q$BS;`&AJ`1;Vg-~|8XVG0qp%0R9C6a-pZ9#z^+;oc-OQ8dl@8x z_|QL8wQ7g8_-ME_)c*sb<>Nsqk9zT1665WG#mp7TlN%+f`gjvG(VC#XQmXg!F5t%k z{@N^E_OrZHMiFpra`IL$<<0{gc)M#-tj7rmTqsV{(ke^;bSmgbuXMsib8*|# zN@_i3@owASJLhzZho;tQMs-xj7Q-B^>=!Z(1!-}r*C%G@9auv8OselMyCCq**ts?Y zK-+Gz(Z%fMK8P~pgEv3Vm~G~aQk0O@*;>yBwb(z)Uap8xkH^UypZ*}{jv{6p>c9>JR8#((UOl(P#(ss7xq%d zyMWwrM)W&TNM^|eQb@csnwZ=$Cy9o&gkfcOxn4GLi+v5n8B{GSG_YDGwb?ee=y$p% z+7^w}WZeg9a-B4}7LZ)X2i`gMD;>~dQfhqhS1YuRg-b|%Y2pI$(q9S3gS+<(wT=zT zI{9vn3!Ec!O`M&-TU`w;n|JQc=i`B5X%Rr7V>9{l#^%LMPtrY>;Ooog^$Mxo3BCv` zpP;EJ&~ct6QI9Fdqd61G-dE(pTGXbZYZ?2fT-Hyof#h_6-{vMtyK9w8(b!cS_HRyn zLx9pE4c;QFNwiks%hG99cfz)8ZTz|Mwi=U7VeQ9B?~>5++*FXSst?)K{|OM%<3a-w zLQt>m!!&|Fo1Su))8948Buw9STSgAOWCe&bYrG)ZwA`ID^jP81&Yw@{jqy_|zx2{t z(~7bPC9mF?OCxp}dC@k5C`uk)ycfmvE2)kY6%P1_LK5@pyoVX!M=h;;pkVf{xr|Ujnh{%5!6X_Gn9U z@enwjk!)Uc-VbQ;$-!1EO#yZ2Xyj+^3YgJD^Q8qq{#Ba4%q*~SGH;c=*=7>9%X>Z(aOS;bSR4&gCOit#m9hghQK|d+gkAn_iIGQwl>n9_4_e1w_@=L$GftX6P8i`V*j z=h@kj*kK-{sdBl4;=B6FE_2h@Aih=3<(G7z)5K6lxtB;fdB>lrqQ#url@7zt-2@ye0e|^9j@~)rxS)r1cc0sNocMt_x zGk(i$BBrnnA?1|2y4+&Lhusf-ZRL|zenO|VdfQ6A02D#vczt;tgMX5)Y@;}P8vsA&iy z`X_4e7dwnh9L39|E0J3$Hgt>_ByKL5>`E2I2n&9-Gx{iufMv-lktzY0vAIS5O=_M1 zvJcZAUlO-scSEg&2v_|%LQ{s&ErG{ ztaWWrZi_zW4fbg!Mp_>))dh8L(OyzZqi9q|AYPtO4&Qf=eN3(XjQd&#Wr zYugl@UVT{PT)}Qbb_{Q`r6yU`4zKlaq<^uamc8t)1FDQ4=65Uja|@BqJUtv#wo^7% z%I0V2QBkfqG9*?2UIXK8Jde8zkp3gIwj-gd+25|LPBaUpdp31Oq#7{-V0WSrFQg@< z_36dmZG?iN0D6WtCw&bjj;t8I@LGL~2snCXfecAFg!nI%_OBZwRnzP9C@57B;jER! zpXzKyIg)vO|Bu7-;UNcPg44jQ*=i~T6Kqzbe_Zx9Idih2c*(PwZm((kEBfJle!6Pz`qlnL3dTS<8%bn&e)Q7Ow zmRl_@=oREa@nz7B^a@n_71EYMy#l@T=m&|7k?vHh447ddIxTkXwdqss9J*MwIA2xA z@#eho9~EP4gW#Wx&5HMT(O%aD^i{K7@?spxCO#SR-8}LH+C1U*Xa)BD&tYo;pXNy7 z*?t(^3?J32OTaBx2WuSWEjt^lgu6w_YdL>J|Chaf;ja%!lL034JsbU%J;AgS2bOq& zH-AN+|L)Ur#RZWU493>NY&6UOAl!JPu!m0C!@^Z@g+_wT@oscVc=El%e*3{yR-#fN zae|Vx!Nx0v2Usy@`S2A=8p5eS#`=go#Y+Df{U%nYB|&i6!_s91btTXT;pbr~!5&ho zWoj>L_ep2giVD`UUy6AlUf&AdihLE3Y!RURxasx$w6}bD#Ihy%{#f2vK-Pp^y@}JZ zqf?glV*~bb^K790u3+fB^My}1<|gDT(`n;{MX0or-E%Q9ES-(ai1Nyzr@XZ4!hcoy zUXj0&pxv0T84Zhm+z(}TCmWGJL)!m_jotbJLPag;H`-+&2sRBAutpnp^4s{Uu#u2M zN841*h1K$7h1akdTS~B#b6`!%8Eap{*?<0pW-Wi4HBoLvZK1_44DNjrpSVC0X8XM# z@qIlaNiKKd;rvby)df4I7(6H%N({IN;6;O^e_!eu`x8W7PM!wLdY2U8jM6|+P-;2K z*6r6`2`j$U>YBdRniz{^+`;ZHlaot7?XfyjI~N5xdmshfC2{ zF-hM{F;ENIC%28?A;e7}q%KkHS`8NNQyH!J0VO*$uW!bPcU>}|p^B19B39((vep7& z3~QMN8G?h!o`?QzO;t&KN>M^s9|eN5NGnw`;6T+Jkz2?Vx$={cN?4RsRCY~F;+eZN zTGP&m$T8IB+iw473`>9#l&e$(XR;O8UO;j>b6frT6C?Sl+=94>*$kQz(jtnZb{%%d z*VE?-w#783GyCrxp}TWmO}_f+tmuU{(P$%4t2gy{t&j_;M(OI#BFz!scelf+kg|6n zx5ya)tl`(G(IKT}W-CZ;hSm|^-el`|zM&EzI$*b@aMwI2I~MGLUz7Tfkq*YAURLb)p$VB%T_LVDX# z1Iw(Z7LzNaFN0;MM^u%4j-->T{Y%sF^1*+fa2L(iWe`HhR@N&5NQ}mq3uc~El&kDa z&!+aP*~D|N$wwD^+U0$KrDk_-yNX!JULGz_17Tcq3c)RkzfwlapGdvFo3-Yk!`-B-vEG+^!5dB<+~H+UJeYoH8XR&qQ2Uckxjr$3W@*+AMT) zsA32n3QJ51De70O;EwoWS%b6sv+WPm9EF;y-6$5snB3g4_+NVHK(PRG(4z4?+ zh@2@cZQ%#)>w*H33YtGbjTatfdO{1Vk2k@6f9IC>NSPgrOx8NnR{gMdn(LIx;j!K! z#3hTI9#_{`gXmqK)NV(%0VW*LJL8muq){Hjk(5@mnXc5?cGoyM-BfJ|yX^MsVpCnn zFhgPvcUCJRwUAt7)u<^+kQ?5-aI`PeJ3dV5w|$4CU0zpGZV1`ciRNb?HrfW#eU#5! z_mn=lOKKoqOl&TGcVW$#fRVd8eRmNuiHbO3B znD44tcH&4WxaXjFzFGyE7=rWMZWU*}e_H`QZZ|8jc0?UB*ef$I{Mg65X}5Lot}8gE zUWMfYUoGnh3Co;hC1uzm(H2%Nv?6qGF630MjYO`Qb8!)(ws68&ab(?>VE`2FJ4dj; z&Pbe`p(gi;u}gqRHbJb-|N=3zxkT`{o5IY)mum~v^z)_aQc+V_(eEk zhiZDW`rFbL(Bvx5+`^Z*2CuJ9uU=4Eb=UDH=GpQ5_@))M#Y?pdU}x_DZaYi+I$?K7 zYN8Xq^(0hZY9f!L$)J$O-;tkidogKeA7nDh5)*N@NvyN zbvkckye&<}--^JMda`g-@}#Sa6f&QlGmffpsbIH6^?D*XaS|mj3FAuskrWXi?5^q? zy*#YisCu`2*0Kd`48mN`Qt-P>6*!j^sIgAUFb@7h=wJMl&iIF{s(e%J7~OrS0wjUL zcm)6YJW(6Ga*$2R2i3Nzbk9Jp=}&?I9X*klj}carCM2>`_`^ zc37tOR`~%tNwz@pf9kw}TzD3U2T3J*x|@Jkf*%7~EDAfXOY-JvBr7~-)+iB+sj^8% z;ythNG5>zLvzIdMlQiomg>}bMjVsZRgE&^UYj(TLO%S%vL&-mg$>#kyBF$|#XD~l+ zZbla^=$|w{r+Z+(>;qE8c*dSFu8^CBT6KGz2k&T@TZD#nLY4f6v4T-HloUDD19pkR#in~b}3cqj4XWgD{djrIu0Yg1N%kmXPDqLO&b8gsx@C|d% zyFu`z@RR%-WI;DfzRQWq1hOu!nj=g}V7BQswVJEqRJvuPW`60-(VHjJU+YL@IoLH_ zip4v8V~jT$X7{f+v@ka!N4#V*2mkN*o9tr60g#bAL@1}{dB03<0SD*>fP?S(+wMJT zA0Y$x^f^xgsz*D(Mqqc-I5S=w?F*6&UxPp~ucJPGcVt*Lx zaf=scSMo0z>TUdd*Z$}j=ndI@MgcBelwu?mobWeP!y#}s*8f#f-P{P?90(T?-Bz9! zPfZT>InBlrrby#FmGB|T1;I<*#gL%mJIsC}^h zo@^yRU^;@6E52*1o`uW16Vlmn6AKNY` z;o#0uc*?`e?;6bcyww@Z6?A_c7i+51$4JrVqQVwHx1id#vfNGNIZCt2P5o@y>l23eg{>9m* zq>^!=q`ff-Pm=8b(kEg+Y89<8A8q64<6|(h6n-HL)VIuD3ZM@6JKx-s8pWW0n61lC zE!r}(uguthKo%iZgaa%ShYz0Wfz1{_N10J{Bsq@4>c7avcK=O|?|t<9`;`L$^&=rh z+KKFg`!=ope+z(}y$KNhFtbOcIaMWjF{P;ba{Q;IJM2WLh0y05`XylhzJizg3Uv1B zj3tgA0!*tw1|7dlAY&G~_uX{G+`eQ6$lw(Mz3!;`h7#Y?X71(9AG{?ltoNv0;`TH* z9R2H|{q%w2R-h=D$C|!)!^Diq7MY1L7BxUYa!)K5Gwoqwfj=b~*IbMuDh#X&r3NTp zx1-&42w8652i%Z%A%Y$Vj^N%>6Y*kyZ}r{o*-P{Y>)nE?RZOAyA*q65=I8(_N-At6 z>u77a5x`aEEL z1Ndi$Kek6gl`oF$%Vu}d?sU`wOMfO=ZjL>6RxktrdXMbn`YZDsmODl zC*2}cwj^KK&(%oW+qQHo$4dDF4OldHQG@;W9xbBi9&kyTq7rX`UlVLHZGBx=nn1BG zh>XQA@a}b&zj=3*w|K0W1t=@9PLQC^^SXT}o-5Zo@R56OjC`Lz9~<7V3!gW(uFvzx zMqaJF3k$;X&*pB(A(MlXVhRFh(0Nv1SGM_eNgR<}fzfKD>kcMB*W(c>$}~=7f;^tv zTHaMrNiA+%*d=CeFWKamQe~8QvfHcpzF#1wqG(^4{{R0z-81HP{|Zz_IAJO4e&SMf zgV)7roRol+OlqTx7m;fG1@j{-0!_r%C@226YJ=p$#i8|-02=S(?a`8U?)dAx#nu4D zJQVZDMLn}o{$WMUYAbJRNT!!p|42e;N-EBud~;ca=c>o@_dkU<$5^9|pHC5pi{avaH+lF{it=VT9+^@hS9b))_PWfs_v z3*^EhKod6hG`+Razrk3igpuPy&I)cIAz=hrX6phR>?__6&imwiUzp4wNz)2KM5;TA z8yYpN&uc)ZvSC&OjK90HlPmZ4yK*JWl&P^$$S10M*#bnQ3JZJyHNsEHdHNxy{Q{mQ ze^}!Pf)#cz`E6tlyjt=LY(grKMSC_Zob$qM0|4e5h@?~5ZE-oLc`$Q{m--|poVLz$ z@FQIr50wAWbzXQQf62v`bfZH(10?cU z>5ivI=zQDhiDH2rbGcyV3st9anEZ>f{6vSvN8p?(2gUSlkbE77bb$)|Hzx&t~UW49d#_16!DRqlWChEIN=5?DbeO%h( z3&5~y{&8LrkTxVsw7%8R#nW8ko90utPN*E2)SdUHhS~J+ltf?`W656crgKI??H2KN zbCFI3@q?x`*}iEo_Ip*_EAhs6ia}>;Lqm2J>wLD-O$}|8a;$VOlPut=+j;PwoIr0a zhxk4-uNE*zElTWl7hkyN}`b14qy zi9mz!We_Mr0P#O$z`kNJ|(x7;C~mC-A)=Oq?V+! zn@CSQ<~|fZmyup{giK7-_6c4G<||0~lenM(Mu*6_?a&xAr~wrM}VuA`7@0Cm#iGF1Bd-I3sQIO@1e&unRZT94;Np9_b5Aj zx1>oxXtqx}dCeNQ=b>2*Q?hGgF!O9UILCM;nB)2WAn4-G{nxgFG1q=WO&;0abM262 ztv=6lX9YiBh_$Q};Nk-En6R_OW{^I0pHBLQ-Sh;BX$zz{#ZgctN)7gKf3GK=Bh5zJ&?aj! z%7yg0%zpK=RPLs8 z*gVTe?=oitAV)Jgy|bIs})BJM_!#ZqDBdNY~J!E4$LHuQ(iTc&^MGE z(aiZ=LRL7_u6OLTt9){WIVrrq7^7~r_7I15)n+XFEADk%x z=k@~dk+3RRabWbKxi+I>Qzw2Uuza&ol zUkf>9Q2_-h6g786Y3Nn(&*7P|1vGN-<@Z<<`^kttyOxTyk@)M&>FB#l>8$eob8ulQlVg3#9{8&HkXoe`w zgit{Oi=Q=n{`7a*S~w8!6soS`h=hiLDs5=YJM)7Pc!(tMhcpHyTM=b>Pl-Uq-_sF_ zujndDYDLB1O-;lwq@I7P$;>paz`z}}d zjMr0WELmqlD9rm2k`8cuBf-_HmADb`HSq(s-IK^werV;|$73SD_QYy;R!{YIHV(vUdxY+;#Xb&{)ZNbKagpS~d5wcQ zD(1>(&BhR+=sdG#o+6!WE~M_SyO3`rbF!@RNU1556?Agrv79}L1e*s*F|BWDi+*`y zzq3ijC>U`#&+WnYzH2M{+34hs&tE|a<(l}4KN07{otHX$E`aUh#;$(G^vuj{MR$E$ zE1QodxbTTBWi^sXmw;r(@HZv{UDlo>L%&+H;ORF70lk~VE?#fbcy!C32=Y4=@4w_6 zC;QbYct2B%&y?)9+1-vhD!mnNT^l4291YhS>VKMeuHh`7E3U{;hkDhFS%nBAEFijc zm|5@44tQ<>nk}|6`~^{0Dg>{iJ7;G9Fvqnz_FdFjv`wz!iToGi4U&Vf2Z8GqU$z-UY&Uf+mDb>m~y z#@1z@oNzcr&idVb2fs;Yt=-O6M_L%J>m}eZ)>J7m<`c+d zvld>Y{{1Et8GkC$J5J~J>nM~)IZqWUJ_PgmJ*M<&MpC#N-xB6ba(w#;C!53*enpBS@@$ui&+xRC5Fm=p*gCjU)h&UNcp(=GK`en8F}_BgZwX z?;d_*pPC|CMWc_rhFHRCpp?o4z=nIfX^UcXR7ySkel z>q6|?ivnl&2P;t?H&A83lGW0cTI$Y)y12trXFfW3Kl_R(MRGn9aPN`Ms!ge~K`n?P zv{aJ9;O=)u9&<)9%iMK(X5E*DZPs**uUWSlIm8*TF#maVm^v>VMF| zZL6Nd*mq5KDmn3+%q}cJb2UuIK$iOzjcSjg&o=}5&*t2q`n)Ji=PWKbm_Z>0QI;! z^@|EBmCMmFJ4)AD%H5hZ(O*(+|L-bFMk%HQ6q;4pu5&IRxfq#!>0uQx<$p^tUDN(` z9Fpi~rsJ;XDT+=@c{3w;(T-2H1AjzwKGOK!cPpGTOaLvuEOKE5kHW;12DJWqzlCVd zYSwt?zY;i4&Z$b`5`3NxQJcQhPViL)BS>c@3Lq4ifBYenUR@FDT^!mu{w(_7`PcX7 zlJN#bzXC`OtAzLuaZB86;1A-Jy|JkpKddX|2+_lbO7Rt=#9N*#VRY&eIm^p=eC%F5 zm|mi*S!x&+>*n=T`_>dA2SYDBSd1*ifAcFz?F>@-T|#M!BftASH5>2*6< zb+8+;`7U{az5FS`HxJ{pE}6HjaNCLtmWaJ?Uqwd>@w0(?fF9bqD7n4C1l@2xvH5*zYU$Lizj$#24Evmkvn~aQ=I***Bv|q!RJHq~XBLgKN3Cf8I*;L(zkOtE$b2j2J@vPGOqh%zN&cZP zJ>{;}CTq6_2weyzn5a9i{X@&d(g8qR$DyIYCAPJ%S>}2>OFGzAa zZxLT&WtL;32nI#$t$+0wDWmp?PpQba*b8!ABbRT5fuxa*ddR4Il9_jjY%%f10$cne zV&`K|Z;hvbu~7{wK&g9h;%;Yb6$CNj^%ptDFWjSDSvwf-{By|mXMn=i0-IxQKp#&g z>10bnaG)skHjt)7MakR+8lAUy&TKaswwyF&>7(=sd@k%*m)MOBuP|K@LrK>owJ2Dd za3lYT)a4BM2$L|{BC5CLDt{2FJg}bqV3qqX6KnDhQ30->(yX{$Nj^}*}n$@SvN&;sU|&9O7_0`#c|aVFE3F3dtW6_`DlYr(O4 zIp-LDjKTj`4K>({ju|i!=_h>&JU+NO)8z>4EhgGxJpVh?0Lu03bibo?${Wm9IxKeC-=bP!DUs5K3+O8(kL$Eb15gir(DH z{4r)YpYX~9a!H?y9hUb`!Om@3_di?8#&bDGTy2$9`=L|xO|<*;gpR&jO@3XF!lYsQ zq;nQiJQsuEsiqB|w5e}Q_?nMhefz=^Ll2C}ul8$Yb%QWfoPPfm(_{IPL~-E5QjBl@ zN5=|r|9m?4TaJM7RK8xYUTsKmrWWJdA-nK|vQjU2b7}m@NNe+KcBXzVtA7Z?plciL zlx%FA_@?Mze)-e@c|{TXf4j9pep=M71*PS6jKFN@Xcc&%#Q=nuP?;-ySY0Y|U)|Aj zXv0lT3D6_P6BOF=k)}c=Rgi?nB&Gj^p_ml4Hsgb19Yy)QUT1vr+GHG!zf7>=Los#n z48!Ok0B`Y7Hp(iO%7q-OAk~cB_xs$TNJ+fIG=w&iqm&SI1@+5%dMV0 zwuMjv0I?LjsU&?;2KqX+(k3c9qpjWY)T?>YImZSsr-I{(RJIz!j zN>DsPb^I+FR%pwu{mc5J6JI5?Gui{VY-VjUOHwyvyU%St{Si8spDfZcVasFj5V*^_ zUGT>9!}3K4C=0L*=71B(4>G9b10Se3`P0(0_qXc*a64QyaeY1L)SHAFR~?y2RPU~g zkK&orRcU*~JtTicoUWR3a_WW30s1jS4(2fweQNwae+92NG9dM)W8~48w*; zmYaaML(+ws17nxZwRuc9jpc7@m$>%I^IQNmt#ua8U7JBavrgvY8TSym$_{ghzOrSI z>)w?tBBPfKmk`osb1|DD`mEm&I-6fF@IusZ{=KLZZPqKu0Gqx;)|Hxo1|(_gtgWy8 z%7^E?vL|j;wsw&F88@Vu)5$O-s4|K!N<6^{*HI0I^##sXdKpA39tx`BFK*egEk)*q z;_I9ElBej%G*I7G`4wx}MPdVT6s_W6*tYs;`$ysT=dY{r)@$+k|3Sj@u%gR z!8G!|+yi*SmV8N4=c*0%uNaZ%LOYWIEI=jP`X<;a=Kpc^mQitSUDIe|jazVs;0f*y z2?P?H0158y?(Po3gS)#0cWB%R?(Xi=w{y;u^M2!wJqADcLHFM5HCI*5s<{|duEre< zWtl-&fwepga4In|f+mTOb7RnJ_5B>r)oPboU6lmHFV1-|y9>kJ3EfS4`!-24x7yk` zTlj8o$^79-7RU1fqTS)5A)8QXpA1in6axt|2Qc~|gNZTJqBnr2^!*;8jVg<-5mZ_g zf?}JAmhzRIs>UY5MEeLI;`#@8D53O$pNfCi5&u-@0-6t_K6pg^w9v--OYc*J zw4^okEV7CeLrq9L;k_;LUQTR+Oe=+XL1pNaVUTS;VN*zcs|0{>6WqQDGTe-DBoE0>3W?BUzCbMi^W-4uKY7IQ znZqMpp&tC@=~l^Q*R^L>l&Jdl$7Pz|nNg_v@91PAWjLg}j^xQ3zb zr;E_cr15CS?J$BRLk3A;MCUnqLRwk&-WNqSOQg;tW&Wi98icYO=Z)>aCL&r9_GZy^ zPV@2ylkE;$r0p>6J{pQ*nv z)y!vE6>umez$@F`pe-*3671#Fq!U2V2yf|CaB6|na zAym<)eM^$2kM}&D@JOBW){gCepmM#5zqTXE_B6=1 zh{4J_IKSKBih^nhcXNq?G|7vA1|%HB3p~M1jJAM@6A)AnQPoh^N(jG)&sFhURw1+<+ETXa$ebpN-se5N6o*=Mvp#k{A`ljnDI!mt`N z2BBM*3KV(oXG9u(rLB4zTohI7pJ~`%vMj8u9X(seO$lbd*4|TmyS>C%nr_>fXGK*R zrm90sYezepvFGcB!gPxeJLfJJVQ!2Dagu-@UayswxAabV(;vi&k%Vc6=1 zHv$_&BA-SYwh*+N5bH*DqDh(72OoCx)1#HbY&9@!8c&jiB{8V>IxB=bI9)Fr{yMEy4od zUfA3m-aIpy8kd`>m%C&%)=mo4S~Q08hCdK^!{KB=*vr4ynG8%JA7G?2z{Xu++<7>R zi&PU_q9?KUF&wInMCQKeLV~bGxt5-MX|4!tN&FVothsZWGuE1ITy+5PgF)W-=7Ts} z`r8g`&%9nPIF;la*B+M86=hb1V6?jdzK9Fk^DdInIxiCB`HC}x@jAHR0(;=PTU&;0 zMXkwf9MWoCOAG&(!ZGYMUzr@5I2`R^%v_t53b1v~ew@#$Kd5 zv@;F&!OTsdqzEmhY9zjC4RuXDvSi@`twvkhv={OM80X2|+q2kl{GTqpA~HIe3I()! zmfh;fdhU5qGQa78ERmB;}VAbgvibD<3i`PN1DaCDze10fppD3o%zRo-j?m(HWv z`Zk>BXMK!OntB%y2xfqcAt~4~;LC4Pccc$uWV8~;Mv|oH;Wcnduvg7j7g~M|rxe=p zO|)i=Pdq{~NGq|Q6QSylHo~~piG7=EJnd8l(a;pI&dBv}*qqK0W-&N8WR|bE7=AW; z2wAygu62c!Tv>i^?bqf(zp5MBvbE$h=_(Ctw6Z32#i4Mn8FPKx)*I@SU3Y4U$?RZI?ub#L2NpSjmRH6Fd?bia2~x3iWks89kqeV|H63l z^8f|F_d;x|`nxoz6Om<4ls3q5!7%fNq}mpOJ(Q+&zBYs z9MVlmDPn`#XVHZ7gvW9aR<>0g&pfBlh_@e65E+);ow3 z)m-HqmHa3%z3!)~!Lef4d$8w8_&yO;(LGbGSs#q{7IZlOo}-+yH0Pjm%6|e0a{?qd z38|(6Y!z?&!w}DNVfT>NEq$Ziqx_;b1T^2BUb&Itj3b!VryJb&ptfvos9t5a$c2YL zut(G>)vbRUY0&(|UeyT%nk(N4scVk@T zIj;7W2uFzbYR_OF$4VHYhSfmSFe7}qozGqIQk4^EbDz|_Y~55w!t=UAkj~sA>r8@F zvUzj|`@L&xm~N3|mitvF=EE)Uq#1etsuCd_5TBGzAJC@{nvzPc4ke0!#PPwgpsAw3 zw@@~$tc3+Nec@3gzGJlp=&?lmx*#Cy7%~li6NVU-kB;ApMxN1smLFm(S<32qiWB9K zV+&f86}P`;D9)W>Ly1<1t>wH8P$H%EO@o4u0)Q3y7OBoqMhJPNV5l3im7=LFFiLmy zmP4KoW|FJKju|R=r`0DqXQU`00D{~bMc`IE>|o9Bjg~yn0^sB$fMC68dcKHBJ=q{79T4he+f$!?ZfH@(eLkEQcU&7cGU*z)NbIfsf0G!n7@ox zMyciI6KTzBdAE}&{&qN2VPs*Vod5wFuU2)LTpH|l#cw}qYTYD_pN|DO(B+qxUK*DytN-d(i4EmEdT+Pm-BHZ%bd`0L{+iO98s43BpFI5bWj({ z%b$`=I4{kw$cCtePXa@E?2@E(zmeE@xbkhe3bJCK^v2g~bRXB>LaWsnF>;;Mh-#32 zHON9hul7I@TM^QEdPDQjZ$Rw-E5acd)|fCmy>KvD)_HF}c?@3Xm&YHgTOz0YVLZMi z6p?H-ijhd0_or?)AJutMojl;H>V+-kU8Q0;(P;pSS5p50mWoJ@-5)`K_2_w-Z_=EPR_n#^+!QWNzM7uu%m(^{C`h{p ztjnfigECh`(*04(?3(4wDHq;L}}!6VbdBhG$7 z$w>`D$#IAmh9lPM}lG6C?p zRJ0=Ys`E6WooN%;jkK7lreQ1R={%GnY`y^ZS4g;n!B{dE1JnRB32;&zL0 zbXO=;@DRUb_U|s1CGy$B`>OjON!3Wt;r>{X)DUltlqtc8WfK1a3)Ghzym&!dWFf%y zHm=l^eJbOr88l z4KNvs>SoQKMA23wJU6!I(#ZjtA*xql*43D@hDTvtZl>-_o#rhR79E0PY^4Fdyb2#9 zMCmjp9bfluGE@OFYDCaxKS$jferk@L8hsCV(O}a)&blSly=Wu^j{k-Coz6wRio}3H zv(oCq^o-f8I9Fs69ESAYE>5QF99ITl1Kp?g2wRT0TohdHw2!r^-Kxu5(fvdPuS>?& zZzJpT1xKa&MCUAOs@U^uE%f;s*ghH80o}VNRMhcn(QG_r-t;!fN(Bcg4?9l`gw_1A zEJtwDn;JgZ5^7nepns5V6)jT`^mbWhB97A)bAur(&6^~7zl-UD^Me7X1L-q| z`ia|;ZfvolZxo!fz6=-iD0y3fjE20)ehX;3Zi5ZI!!^|YAvm3P|KJmIjw}+>0}fMi z8iz~d!16P}WJSlva^H(K6NWj;DId7T_Zadl!OV}XN5B&hn|^!#UmDE8DFn{ z{&mx~*pWTw6l#L_$c%P5e1X6AP z=i{X`U$=no#4S(oU=dUEV^+_zG~t-QVn{E5WjSRxAqODN#nWSt?WdjV#u{^DKv@i#o5v%d=Pg0 z?{kN2h1tL{CqS9WJ|l~`Spb}3A08^xLle>PECVtE3%RbX$df1Cr=V6{R1V=i`A$XM z9u3gfFBL$lW5R2QB`yjA#^xlY+Ev8;>8}M-=3-fsQvc`-D%e-e6Yz0aF+wOy$(Ta~ zS!knO{^ziPM!3vHzW1LBaull+#oS!lm7=hZS-+;gbuAeD&l%?uO~|tZHKCl?WU0Zo zCr5+?53aMp*XO)4Il6giU>YyRw4U@_zEqEvC!q}|8VgqBk-Jm7P+HMb?KeTG;8PPA zE4{{M`UD0f8=q`td`gDm4ZDsnZXDm=Vm-lTD)3yaV_pC~eSP-u7e)Gz^6Jey?Gq(L zI2~%eqOS8WMCfuwIDrjdyqHT37M6xGdfOWKk#HD8-gvf$G_%?{Ly!Y>++E!rInLTV z*PF_uM}Q(!K$*+UCnao4cdP%&;hgCWj@5Z?hd-wHLrd&5il2;~>SkRwEZO@m6Y(A{ z>w!$2DS7x8o6lj!KWBOkL+k{h3c7#*i>1v;@;hjKuu8jK#~Ff!Y~6= z;>pejG{A2F%bvETM^wSASDkKup^@idZiW>8b(a^bzl=Fl7JiH0MXE^DUau7rZx?wM z4SroyA$`ArJE04PZ4QzQy&|k)Lggt}S_o zTt*&D?tFJAA<|kRsZzXYO`*e05+Tgc!T1I_tm&=X)i@16-9C`XXRcKWlUiF928-|> z=`={L@3=}+^S65uS^gHUty`I?W{)5>v4brM0ol7h9_eelqU}&xr zg}huMM#eB@AIgx&VZbUfsFJ>fUSoKnW4s?Jd_nAhj(6QIqHUwlr4eu2$N96gk;PiM zxW4Xi-;j_&ijSD9zcgY^t;lBj=33{$@zwHxumH0pY1kX7pdWMy#yc5(P_yl}&}qs} zWAT62ujn6zs?%%mk)6=BF^}^;TJW8pZw~J#ceJgUy7rGpNU*fOgMMcHrkO7Dd5!&H z9|I+;gekJ!bA-XxJN#l3u{-gK=Gy9HR&$hwZI#8Pymlbcs6uJB@1_#M-#OvA)x=!` z_gP}?liR|ZEYgL3sx4Se|0!az!sN+YIZ(mt157nJ=G@yZBI z1OY_iluf?oiL}#$#>Mk#)spGo`vqGOOe0`5lWjigv}mY4LEoF-=eb6NXHkxJ{GA1` zWWO%rIU}4dSQpJH=bS0qdtFD}X$|jC79~MdKctG_>Jt56aT{f-8#SX?Z`^b7g_z{CafUR_?w*7oGH|?TE<$&9kC@=EFJjM3}B*BxMLD(1MEt8q*sCk9^cFM z=YKXLNN#Cf?AC%a-d+6NQT|9`zr#$lsZh4%CwFw1fKjC6cw51yb)B9!Gr%O>`bJuI z|MzKqg0GCdGN;viY4375gq>6g^zUhX)G=|(j;m6LB zTczY+;pCTp54`ZUtSP?mZc)1WKsk;9!E_K3gHWJLA^{m5&L5RL7_|Or5mI45ZL|E|A5wJ*K4}< z_8x!Cr2k{)ILQ4`yaAXLt9bOTY5Rlzmaq)i+Gyh3V)Af`#s`kw(#?zaFD;JYw9$Yu z9tGf6p|-pZ119@(P3Nv3vgM<-W!gO2>`~|C_SM6HSIU1ppCocSgq<2WMC7(rP;;#J zKKnRt=$lZCvO^8u0~pdFxhm%(C`;&pcyAePH1i}^CsB=CC=iRYr^i-DkL2sb+odz- z5hiI@^0Dt(2~21-zQL|z|3AJX91A4f0mxIz4aJ6{OUw=+cS?AAYnE?Vra_|)^zere z*g(aD3Q-H>zekv739mYrE>&!5F|$@sri9Rq8?@sS6wlrr3^c1^a-w4y` zdFF+Xm@PA%P(c+&UZ9Oa0KC-nGiNOst&bMd27<^jEYOdmu8V*?LM9?q2~RlPc2T&z z`=L(7^${Nr=cb3MO;+hZg&9IZ;Xk>q)1wHypywXYme4hCebN0Y%non~x-L$>WtLYq z`zoS(R;MkUL3%5OG;Z;)=H`X+r(Yh^Hu=pkB_#-+oMW>}Stdk61XWOXcE0w<65y-8 zPRS(sV+`jDXJ9QctGh4|bBkeI$wiiQ{0#f2VB4lGDYIyV)FkK`4ZmO71ByO~_2mN; z0ZW0etYcUm;uU4U#CkyU_a1xBeukb};HodM`{&MKK14dWr!>$GuOgBz=~)xPi&IW@ zlkiQ|qtHlOS%OO-+M+e&^%vUZrnZ(gKj4W@;_X+>C}#Odi)hi*+sGrRJfGTE{H7j>rYr&l5OEd;GZ-Mmqn3VEF*8FNXPlxL-VwUYLzyM|P zs9=Zo#68Yp7~K<-QyH}3KET42X#F`sksdYA!TlXW-YIK zCWs57kI^C!iQnur#SyG~A}muD_63UC9T4w|?t=$Du=D-*zRomZ_ILqBH*9Ip82w<= zRa39UvYZy}sckcwBG!wzMlNXB@=$<>qdk;cy`VYPD3Jo$S-3ZU_4h=%zUWZ$#uwRK zjzYH2X3O?B7s))4(>@WXLn`=tN^VF=Il?~0_jL%ER|;=;tYb(*n?J=yus|N@nlI3R zD2#x%C;kfQJ-K@p43wXx4j=oIM#)*Xy^pB0*4942M;7LG>;S+_a3Pl)-I0e<7=JTV zQ+&^g3H?k5g%b5T5l2mI$a1^N?Sfyx^J%V9#NW(B;G%B8wN=OFlQ&Y24stM*(o?g^ z-GU3;h24+8|HCsS7-L?56UX_x*0I?PanjVp+BcRGci!REn|UcL+#>dXZGeiN0WXb? z*5m*T?jlm~?kmPrDOQl;z7MfE87x!WKtb9dw3|W(r;}fD?oMXR9o-jcj6!7>B%_bM zwe97;z-$QfjY({nSXZE{I$`r+&RnG$yZPcQcn(?){-DZrn`w|p;dJgP+fF?#Xy+(5ZXn1a=Q(4X9VClk zujGey8P%pJI8M)1xRY6jazZqjw7;ns_{%_%N@h?IdxM0S=b`z&G0upCkQte!Tk-yL zv&u*R;=;-%_N!Qsp>V0Bkh_{XAHb(wxV-Ysyq60~7S5lv>E8?UpXdtfXssH9%5KxP zdekEqve~dkk165@ViX)x6y@m$i3r`&clhmNkB&cNmnj@!NIM7g+))tt zJL>`IlK06+@+BY}scmH_5EAcHZ1Rv$)X@!F-oZw?&fEQv=Ff@*)QnOAW(WiC9PP1+`DirE%=9IIbPQp@9AP{NSg(Pa> z_yk}o2qO2U60m--OzB*Rh_!2Hr!2s^%Dbox%xQj`nm+AYKV1m(L{nh`gKp{=c}yAa zn1IcdT8o$h5ux{{Ix~ugp7eZ~OZ#~RjDy*%c8!R!;5#iqkwq(jnO~DHE84G3XW23g zzC;G3R0AKIT?6#QnLNWJ7!@jPL&7=k?So)!-$Dh1iwL|3=0$V9QCsYmwSvcQ4R1+m zrAw`FjDdfo2_K$kQ@jYCsL1m{xu?&;-8-_HMJhTEGvBsNlkpRkhkmo|z=jWoJ%FMc zJ3=HBLfzsR7eCbzj;}5^7@&~y4Z2stamrTHAv(29J27uH|MUgiv8ep19^}Vxi&A5O zG}_HUL}5icA1H4^nUw>9>i@b^?A6J$X7#muvpC5+0*p7e!57A*r*7J4wX zUfg0JABR~WtQ?nXE9S4pvgp20p%ce2Q}=IBvPEO`Y#E)q8gH~)qusr3pIqn3tq2&2 z$)l+m;!dH%3ooTNQWC#5|Cn9>N-P)jkmK2^50F3ik$O{vMfKr+(>F#cYp@hID~Dr` z&xkjc^Zb+}s~G%VNY^!a>^<`=#pD~70tS6D7HnOl+G9AmW}yw=tejhh0KQbl2~pjP z?+W5iKJAhV@2=~Ig|jzlAVb|4NcXp3a*Ev^rG>l*{cRNM7l7O<@tTeF9%8RKUz)~d ziuc0xISA}^mkkS|jpCFeUj3&Flg%#;+yC~IYJjqT+LZtr00(4BirrLW>B6NpszBuB z7KG?-L-LPiE%YZSSd$f>=01_Lzd`3OhyHoUO32a{9z53;Oa#Urv57`dv`}QhVFh}N zT`>Q|K@AQfj+8;Y=cqr}%Fe!vz1*&;0cNPd%(2W^ZI4JL&LwGr!<#v=bjy*40XAL> z=iXIV{@mlXuFq1PtE%+LJdh+nl>In%fp7dNiV+8rB1^O|^J&v!<(_Va`JC%NB7)GC zIY@>JnOcqrT{e`f*rm%MMNc9(%ve&Ym%|_BPK{)p2cCo69whO^zW4q=Gvj(PaLgW1 zr_p0;xVWTRnq)d`>Q!4Y0Y>*EX;)KY--L&beCsB;r5nR@qT0(dd^KScRtSo`xUuWK zCgn~P4ia{;;bH1U#@td$)}e1iWD8_ZAtp8JycVZRN{%J@%rd3RQ;6C_ASa!YVfnBP z@i_{bt|NDQWsH97;2M^7&>&#%;cyx3OL~0Ly+lSRH&48h;_g_Ld7StEQ0GryA;kkm zV^995$%+CYff>oGx z73!dSuU9?AUlj^he#*0FCK7;>mHaiCY@r3EtbqTBp}^-qo5QzZrxIFH6E$bZI}bTu z6s#XFSx|any2EIYWwMb_#upUU@zJQ(6koQXH>iPI^JnAiraCXHEb-SWjy*I!>VE7B z{q?u#`RJ;JY%&`fP5%45u0WJkZ9gpu+PZLHGKfF{Vq}vDzV>r@OBFO4ZyNA^w`?`- zq+Ty*NohLYJsbUr;Z3gU+=GelA8*FqWT&7#pyU$f7u!*yYWqkVqZDQ$^!_Vens)}A z9y(^1FoA75ecEJyV4tgA>yEu{T3g?b>DZ zzy2yzhi)yQ7b<})S)OJTl)r4Wu}w{y6IKsi{6zEr;2rddKd=1-`m{g~?|9k%i~$GZ zgLOI}JNlzNLT=dPSA9ADOjBbK?|h4INV`|}E+vLrx*4}B&niuOm-Tkh7kHW_5lZdY zBSWsz_dM-G>6v1o)OCsA}V zYM#J$I_-Dp123cIAB0a$*KIz4Ut z69TML1wo=$A#2#1U-fMm0wdpP;e>(g8JkW zCiQ#$F_DdjLr&R~qOX60n=!yKI{>6)Mgj5^we@@xsT)FiOpZu`!qQC+8A)E?EIX)2 zTi|$36ey$XjeIkfM{k73d1c5m!S2y5;yotHg(d;Wn*FRfA`>+kIlRT!tiU0GKp1{M zQvc{Mdtf&nM0=UVZ!J&ayIZ7+OGvXz3>=cYX0#EiC6R?1b2Iz=Pa4t%op1ul$J*mo zoe!+e^iN@JU5THy5sIfXMqr+C?Wx9K$kfr5#GU2YEUAbp2mi>ljhq4 z#IZLVmtUpf<2UYzK7I6>LTBw0`IOPSEz*z#n13m)@n~gE#Z~y;#x#}NqC!~MD!|8) zhD3rne2`LWR|`THIm;|gJg)N{rQ4fr}ll^n(;{p(=bQ{)7ef8K;)ddwhW2gd(LdjI1RE)*D!*cXFx9MWM%x zvkn;Z!ij?pm=e{BeR3NSwrc|{13e$#_jD^+y?E$<|6{*={XDcdOVLM5t{5WzcGx^S zOK4S|1bpg7g?Uii`sU5loUW31`fJLVmtYGBOT-(2#YSAz+IPjaVp^~z&+=|oV;ma< z047OO_36j?8p}Hl4~CoDB9p1BjDcS{Ssa-WxLw$plbh_k`76(c0>|F1op8?z?N8@dSWXx`0Ktfi(RyxV&$D*D$re3ko%xAcfSNO$0AXI*lNp7;xR+3W9%b( zZMH2SU`%+m4wbR>#fjS(#&Owv5us}1BWE(@#6Sg-{O2MnVbeV-1fLj60Y8dTf6iox z;M~L@;Yi3GfqsMGlE7}3>cIlu_zu}4z)rlqz{bV6g zG_|hZ$9b=>WV#AGv3LLS)40R;JIS_ABjG)XBbC~^ebbR*G@8gJ;z^5`MvdRlI(zj5c?-Kr0xac~+alu9;3rkh=-il>_T3 z{S-}5VBvY*R)w+e?<5a^8hg(`VZl?a7f?uYn4oh+)(Fl79n}d&r^MJjwx6EbAf?Rr zS2k4J-NDw}5^AQK!bx&k1bgZ7wELv!h*Gtkst!6rH8OxRPFgUoNO7wDUH6qmCF=K2 z?ymtgjiTtQ9HGY<*TK=LuM8el9~p83(e>8ZA6!NZknpD4Ef$xE$o3Kw!(>sJ%>S|bf4ntmX6^I*4H-j2f5 zp430N8QX{s7gYj~N#tq#rQm3;+j+($c}A=ez#Pj0!W&@xfW#t*E|~|Yps#ikEY$Ur znZK`hZ0DbjfG8n<<$^Pk|2k=R02!NC6b$1o9H4Y%9j;s-CYY4Coy|belQ>R!^ z&&HTBJg1wb2)-8^--#iqElaNVJ@@kX<7H(~c1*XdW^r1v0O{^kL|5UE2U1#sdl&=# zqCT4n>7*(F$ zVCJ89-h&K2aO!5*0gLgx8Vis^knNKHClj+||4HQ&?xdZ zSs?mQib$jeQf5_Yvq>+KleeQ$h$5->C)3EL-YCg#cr5B5IrcRI`5s8{xW7Cr4K&I# zJ4Yz;1qmh)uVIpjle8?}yTE${eZHFxK$CL;Y$I

0HqSMm)!zMnf53E7yXTYSZ0) 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

;5e-Z#-WbQrQ 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 literal 0 HcmV?d00001 diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame32_dark.gif b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame32_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..26849ed5911e3c6a8378e761cdfd0699fa725b76 GIT binary patch literal 1196 zcmV;d1XKHoP)DacMP0^rDYO(QR4hf&9g^K_iOaY!^I}=DC2rZWi^XME8V?|+O%xA+ zj)@F9bg*T+*^N62iyI=M6zIVM-YTrHQho>TT&AJl0Q9s-~YYG=XqX{ z=qXuZ;aPE`tH$aJinzvnN7YAqHGZ#@BjU-Xou~Y*FVlR>PVzNxC+JTWR!6 zHrc<_A`8#NGYjIjV#9l`^9DX@cfEl(K3&e_8u&U`rW%!K(kHTXj))9xm^BY6iuW8RC&lUmb8>Jvtr& zWj>O&5VJf7NXPH@zvl6H4tTxZeaxwiOOR3G-+x@D{-bKTRgp)(|N7f~fjc5%JDC6t zDKpX&fpdZL2|*DiBqt}Y|9J1-R|^XZ4I-6lLnJ*Qr`p52wQs~S4aso|(d2j{IMT1TcX((vuxR9Q}Kq1 zyXX)Z$k54dI(7511l@*U9a=$X%dN;wD3{VAIM3ea?fccvcxj;|-KEK!S3|$|JLkO5 zInQ%WWwQT2|Ba8_WBp@3L2L!HrDjXRmX@thwv^&;0dKsjqcCgD)%}^|EXySO-Y2MU z&;08L-<$uea6}QPHv*&7BL}i*wEQW;4kw067gB%G0_xeFPHj68l`|hMbgAw8ZDAMU~WNa$W2>; zNWITcOKvDe}O+ zRYbq;qgYa_)zbsb0o46)7~1(6Rw~~+K24#vd=~k7Ow`%cMeI9n!<}2B&)))yYR7)PNs=Nc%~y7(_bpl&GezjBiMcsMpM8>s zhK8uuW+Q9cWol_@rRJ6v{%<(O{x*7x=l=AFyy^y%>)k|%s@An@9tj2y_PZ0zh|zIA zKXNN6aC^DKBQyIAfp~+8S+vZi3O03<0ALFbGLxXx*lxsL05N z1&54F>${VSMQ_L-JfcsY8TmIU!kpncim`e3t~ACesk|(2dMWWa0VSUeSGIhiUyaD% za9h!WkyC5aUMqTq%YyMXE6Qd1_^E&jBuKv`MT7{1@sf_pe>LGn!6V)qU%K+C8IsP2 z(v+%$jlH1r^Hh?Bhu=3&X%GSq0Zh6X)~|e##&@?2VbE!0Di%!6WXLr3{mDKZKD=K~ zo(|v^;6R^n;NUySZ?jvycO1!u=fW=UNahA3;@I(jZv4gsGBG{@lM5LV=5@jrtW0|h z5tnp6hY-Ul6emwErg?x(5gE-GOB|k2rpC>PYTBGg(t->Dn?nGC6yI2)dm1+-AnP4` zI(KJOAli0@dr9M?G61hgE<_0tDqEp@S6uB_VHD&j%%BEFcs09T;YLdmq;BV8G8hch z*49RPz22ujLea4^-H4VD5r^UZUuL+I3-G}en^}~~-$=+6(FyV)>Os=#UOOw?ZYZM0 zre@CK6{mlt<0nqiiIcx@Ha9XU(%IQXJv}{9K1Jo+`gw06p?V5j`u++t9Hat_qB7u` z>zLAfJv;UpA8vq4hKA3wUcQvS@cq8cQN^|`QQMX;UmoIcI;}QaAJyc4qvfv0zgJO^=QW3y^`~z`dmLFXqG!h&Iui98lEcWo1f}3&0Y&Wc?(?CRkSC z@1dB|v@y{PgWVdRl{CPH8_$wUrBcPPM*V&-lS>Jr;!_J&6p&l4iAC~+HT$@3&EiG+ zsW2FgiBuID*2j^_WFm{jvQ7-G?gk%ueEb7ikd%Gz4W>mdp$QVV7%KC(biQ`&8V#5$ zsJXs|&izqCl~vXB+wYZBRehFsSnVC1G%zp#H7fT8k{~P;0pt_fPuwi({De7h-DxvB z^B<+l?H$x$GLx~kj%j=&886mSbEBF1kG)HFyPdq9-ZgAWu0SqfA@UMQF$W%*kY3rj zby^8_7Gags>3ng>>0CWHIQXH%;aD{~I=X<~i&cs?(W{)Ywzg8$o|Qa@Q0q_ad54bt zc$j2b?So@&TI3#eSs`|Q$ndu4USFD;+nwVnO^zQun*Hmk({z{_{r$J!(b2<4==*QJ zDHoc`=OmU3Euy+<93JAxi~iY{gDO@MfbiOZ}{LoBRft0}@F!=OtbjGT3h=QjG{9 zQg}HeGoR%%l96OGB!lte_`16^(!m2lt>O%+mzAK%oALZ4*I30lq{zMm;;43XHojs91XmD0Mbm-8OACDiORbE~` zJv%!)TqK*XHCs_!TpV%i*s&Q04j!CYSXlUo$Ixp+e-Dt~++>gAh5kC{-~IUut2TGB T9i}E;00000NkvXXu0mjfHWyRr literal 0 HcmV?d00001 diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame512.png b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame512.png new file mode 100644 index 0000000000000000000000000000000000000000..af64092e55293772f74267879d7c9f59209e0d14 GIT binary patch literal 132172 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

-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

G=k~X|JC4JX$vKhu^=Hk6HK!R) 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 literal 0 HcmV?d00001 diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame_dark.gif b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/frame_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bfbcc521b0e9fa911e9b034024307619d518269 GIT binary patch literal 458 zcmV;*0X6=KP)nZu9>Y&}*~P4dc+|*?zBg{Qr5G_5TNx z3_oKt;K>xj|4*kG|G(R#3kq0q6v=0^%#VCrVg)w+cDF9biA?CO`||bc|1)RL|G#wk z%K!cQ_p_i|z;eG||NpHn9gI-_vceYZbOtUiNxXsg?%n(U_wGOV4-ByX$l|rpy1MuJ z^!{^kaY-z_lz|7^PP|5NqaCt>0*XG6qa%ryOfqeB~S zUSI(Q+VwUqkRon$@oO!bKyd*9Vp1+6iQ-@Y04y@VHF_yCrvLx|07*qoM6N<$f{@nl AUjP6A literal 0 HcmV?d00001 diff --git a/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/splash_dark.gif b/modules/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/splash_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..64c837102d684b48bb82922a141bc060694058c0 GIT binary patch literal 14925 zcmaKTWmKC%voP+(y-(0v z$@46;v$Hd^vtx-?RhD^&LW}|h1@%r&R#F`b3fcL_pu{Yl%|QS;M>A`XI>^k@*L4IW2n7WjX{)L0p{u0GZ{h67V)hq?#mCVFG8+m? zP{hZ@%)%bz0Wb$y+d2tRoOkq40BkLVD0H}#*pyr(KsL6rer_NQKV?k|KYI&4O9~NT zfS?aQ1c4*S!wlf#=-}ke?;}L<54`-4=fA_O6o7w#c-RY3{F5kMB~^fgvl|G&#lp>O z!N$%B;NfFo=i=t!<6!~-A@8hgysSVrW;Q;4E)IS+AmCqr6p+>2EUoy}C8hth7UWHc z!p6hHg`btx+uNJPn}fyK&6<^+kB^U)4af=vGD9Gk-F=-r%zT)g+$sN!K@#L{;b!aN zVe9M!_>0lZ+}YDZhyp_CKeyoMqNMa6#7^%2VibgBtUhKgtn4gotd5R<_w^5GcMo;Y z|B&%tq1`ooT|lhrAa`d^Hw%b7tSJ9I8N$2&d!fI85Nh~U+-xC2F>{b~w(xWWIeExQ z3Q<7*!(wS`$vtcR z$AA%{0L=Q3UYTG~fH~r)#Lbn^uNx8cew<35908cJM6&p!CZxN}TS)v!ROoQ(2;hhx z=wPbe$Wrm$Krm)752t;xE>2$^S|5}Wn;5_qkOY)wF*#7|)d>e6v$fOQ>V+5dw9k$m=W%CAaJ)ta*6G=oSFC9f(AZ{_dViKCN@ z8kykH-_i(hC#O3}k>Jz^+5VW*O^&CKVH>M@hvXHzOC)hp1sd#t3n8YWo=X5$II-9w ziX!?@R0iYNbc0BjZTOy@kU}(WS0%OErvy4CTWJ%E|P-=l1;Zk;pLg7Luxw zoAxPEVm~?2;~9q)sIUyxqsTl+#nb8X*f*)03(`2LCB#QX17g3+E%fpz!u1sEsisP5 za57iFscEvYg&m+Vh{=wc#9(`3vt!2WI?JTMK~|>_?a$ZVVI7X;<)N=K;3SBKPUAF^ zP?MvYcq=*uegX9zph0$Yp~-2pKs5@aq*o-zkqZ0SZ&b#)4?puka>9xH1EyBBDviy& z5RE_;AyR4F76!HD>`9U&09DS2Mw~`9Ist%at*xabX<#RwiaIe-EIJC{tN5e@`6vZ#J@VBUHM!C|h5;H){p#lLyOZYSw8%YK?3=+_7qa+&X__K# zj%I|@pos2M&&8#9sCI%QM?pzM3f&t})%k|)8CHDltiI60sIX}Z(K7Wxmpc#}nsvi8 zyoeSjQV1Ou_*FeC^dv)eF{0vYfKG!|g|?jdV5{1xNjUZ7cf?rHQNqbcMC%& zJ9T>-yR|kuTmQ=II^FT2x$Xk+YG?u1F7hdqS9DHHCThyarYfL*W-Q7rs)8ee6}#~=ywD;-Uy}nn$=`i3CYQCR@ zGAPzCF`HD_Yf@@VL)n``L+pGyz_GXCpc~5H_OYYHgPMDAgTrdY_u=zGq6?w`$j&kU zys;ux2wo30R1C(a6f#Acogz0Zecqc?lgtJY#aMZoA$*oF02ibBPNv;x1)&7^sHl7? zI>wbh677-Uf8o>WDX?WOd7fybi^-L6*+q(mAJ3$=>d1Kq6Ad}et{=pl_-Q`)g%~`R znz{vZL&rfggjoVBlM9GRqrj!=u&|GC!*zP_nN(l6>xoC1CoN6PwDlzR1e7v_#fiXB zN0!jLfK=zbgr4!s(|#jy?U9BMtL2u0nm2VO|8B}1fpq#7SGz~I1B_fk0sH%a?zN7) zbREruYjji535Lw9f&%LsdVGQmhXDWCDKbAy;fR)wyAx(6L7%t4J7QM&q3=?glz}SB zUS3|4t?<|T1NS~#*%K4YgN&kNn-r+{mK#*oyXFhwWDgjbk12w4_-ZA)Cn{<+0u6YsH^n+pA-E$}G; zskq6SwNq4E=c}O@jov6DLmxWq62fJeMO0?*WjozbFzhCLsNX{aH9R~=iNe#LDKC!# zgh+dAVwiQkW(T>Om1y3OpKk(EqoOxh+m{pSw;Aa>1fQ-Gqx*u!}Tb#5B>?&(rRN#+%aAtJEaa2HO!M zw-Kv6`+b#B1;|be?@NWqmAs>*O|*MHz91x7F9w@&)B5MK`~4@ ze+`BWNVZ}LGzRVOF|Wwd!9^KHQ!ol|`-QGH{P;V&%Tm7Ohwv;L{I%LbdzNtU z!WX@@PrW^F-Z7~m2VtRGSYB_40;m2S+oeg39B~5+=Prtd

U)T?SyirQ-uEElJ^h7(fzZ*xd!Sr=r4=L?X~H&`#o=F0gPfC=I)H5 z3QO;vTqsFB3Vo_LnH<9dw8D{JJ&bHL*isM1}`qiMN86#lk zO@K80`@vN2t)II2ch3FZ;ca3#3(?Gj{GBlkJqe~Yx`5Yn@bGn0#Q33#rPR(e@MCfu zi6(|829k!WixRULB!0!+0tk zW$Spq4gO6!%P8#r1vJTH^b+dhk#fHzB1g^op5u=Py$`0m5XtC4$w1Nw(EnL!{hX3$ z++TiILfVtibEp!FfIA;PSeZukUYa+1!P_C;Tey1l+xP$gkP(3`NLx zk>nOAmA05hRIx)YTl^+JP!o+)S`kuz!#10RQ-k7%K?+b&N1>63`vpx6bCV1k2@fbV zPs*3Pi;FaZ^K%0~yCwbz{_f=7yJ z*)g;Q3uQ-OYfLmNu*FqLXON^E__3(Ne4F@dlM8tG{(P7)agpnP5rwW-DTHaz3ZcrE zW#HwRsm>364(nD`GbS4Ah4uNn5|SmkbSUmcR0kP|RbPg7A44yQioNg~tXy9aQ}Hi# z*Ki+6)=0py7WUlDzPfeSD1I{Ihq;OvZ)Ih#ldjNuo?`QYyu7vQ4h0<<|3H>z3?VgE zFn-A?Td+63VF(9JAb6@!oE$Cyys07o6-Y9nN0_b=kSP^Zc(44pT>wYR`$>Ez$w!2_ zlF{;=Mzwy1R&9i_PxLO?!q1HA&nu}0TV3rjb8BqSMr&2YIz})N#r}&@ehw%-2|k`j zns=;Vx;Wa8ca~%yuxuFjJ0qYwA!4G6O>)Ds;gi$q9?M_rdmz@TOc@S7^^QwPv0B1- zlgfWO2Oe8W&F~@vD*{Uhl_z!w=z8@n!CKaFs>sxz-3+E{i*9%i&cbIW9)-}4EKX`T zm%lVa+Y*%eNgl$;679#jkzahQ-^IHgiPx;ijzVh$$jdiDe=QMr5@x8IROX-AyR#n~ zK?s8XgdGY>K)ekxOATh$k42kR_-ym>ozgdeoOIf%NpCUYMFX`)ukS{_^o*|bVI7wL z_w%_j1hMDmB1FVPxqK1tnC>{#d|;}sgL6*jUBQHwbEOu1RIr-<0S?iEn1@~h&&ncf z&#B-=?#4N7FS>+kPRwPNv~KYwmI z`}#_qywKNH5XSk2vpF9G?>x6@l*XYN4`9N4d>AunV3wilY78DF2F`py3M8bFUEFc@ zA_o1Cwrwf%YwB%9_~dKnF?Y zFkV26g1p7KmYLa%=_=EqT-+>KVE5~T3qOi$#xx$1<7e`lr z#J*HiQBzO$q>Y2^zF-B&6;G0)DA~x3-`de%^sJs|k85k!7g1QV(K7N5FUK#I9so!L z3A#++)Q6v7Jv6Q)QZ8r`PPK zYGF33w46irD(Iv=_a@mL^bN-6ARLU z;QS}wG$6&K33{rTxc007{+oJT0=^HIHyX6CLHnnUH^h|0_IZGe{vr7ty*4KZ;Y2ufcb$`9Mb8dZBh>8d08KOm0y%OyBl^P>X_0A86`I(^~%J z?D_Fl)LMcdc0`psUordpo099ucBjdT%bg&G5ebf3@)NkeR7Lv`^z z^aaBnV)TPFnL?f5Z-pf~N)X<s7+;AegHRgh?gK0o1D6m{mEp0FD z&m6`;|MW6gDqzI2*z{h_Z+>5ZbiMEsz;ZLxDJ8BN&97Q&GR`>njh(0RNT~T_N&6g$R^U0^e5>Z?wZb9=!y0iF%#~ zddhCyMplR69)ad=II?o^b4y+QhjJQjbd@c_4+$vcNPTvu;``>+x)y zz4b!^LfZ-TSFcZUyYr$il`pWhM9&4B}L@Cq{53LRZu1 zR6IXYAGEP~A(t9m(pR~^gSg|fq$qq#ONb~KgW#j$)>clDAmFP5Bp*YkXCs~;*rfR_ z2iyp_{L0vUPzYb_8mzj??Z z7sD*C@KvvE?{U7g0XeHC4m{)i^7yWhxA)SeNvPxQ@E06@PR}NG;MdZp#)y2aMV|}z zsUD~n{N_45&IHI^Ohrd*`80bf;Ne|XpEhC8oQx|rn4c0p*fsh-Je7T1PXhT1i9l`5 zJw@4J9fMT^i@lrdfNCCLm4<`~T3Kh7*ZcB8^OS7MKvnjrk61P}dniEzqwAY^mPYex ze|(gmMEs-lF0Er4>=CSa-ckH1OUsIK@(jDWz7{nNMv7Y&KsI2LS8$b!#x5_Mln({G zxUKbIe^`25Lg&?0`M$EciYB>v>kA1vl4sq2lG->y%sMhM@^^x|cjZh5&62bPNh{2D zjHWJ*0S2fD)XfMa7|h_*AEi=-719uWTe3FZ^P_lF zoUmu`PT_*o4WFhzO&tqZPvDluVM!9P8M?cFfW(#*aJMzQZ9s=i-}M(uEY@hxtep2IJ#q%ggt#-aQmA?5Vbx(C4*N@69lGPjXjP%5ky z-Z&h~G<}#RVR0zd0$fDZB}{;rd9FuCcvW{q-7T;|aWU7|Cmw-Pu2W<#l`It!Q7Pej@rjtz#18rJ!;v_Gta(d% zQxdF#<_8~7>`6gQ%%vg(ur^d?bx$aIa$h8-0bKkkW%7Ha>~z3}Q;QwY?yH{{b#R=? zpi9y!jVbP>w&u7FG6NdOGI^0X;0Psz-T5!Jvsy~Pm6M>nA~8E9C-w}z$Nz?Qf5RuM zth;9nj@I$^!cKwiuN93qJW!UC+#NQkLoaTGhZTqtk}dn-g^VjPibaSKmbd0^Et*l7 z22$u73NZaTR>A<|5?C^5<^bO=maVPW%vIfCLKI~c&SWdaOo^aRt&cFo_YGw^Khz_XM4#QaqbeC!SNbSzDPNGvnF?Wii0bgFqsrC?7bvvb zQohzyVW&O>Btg!i6B}LjBT(SRD%p{C0Ive8U$^NW8U43O*Z0$QlWYq$#jS|=*mca`r&JzED_0IWMDyVb z#GGpwX(6OS??qO?J5_Q3dVPr+Otm}<;bMm|)WbjMsfcMugeZpQ20sTYE2AVpc?Z|b z6j6|EX|2||Nk5MYG?I7n| zBNoDidV3T!Y6eM6x!_8CBbo~IRI$koxm6+tfmCdxFs2upV$}EHGFARjV^Gpj9~9dC z?~DPcK5D({kvT06^T@>=pJ6S<Zv`Z^iDLU4JBC$#&-P+Ot+ zUXF1!8HfWc{$I6_Z;~?Fge%1hW8dR|C!8>W_4G|2(YBFC7T~xn}20* ze@*_xqe8#U6!j`vC^7<6OrR1g_JRId%3?);+rBxkb!z94Q56x@V5(3)->4s!VTn7a zyFCN7l!Hfd(TfH>FM%;cr~2hFOnQrRG~fm-WqL@60qDl&O_ogcO2mvMG(yM=k4-AJ zGow+tA=DNRU6ar$TKlnRuAT(MG>z1wY;q8fPqJYSL`o7 zJHD~VxWP{9uVJvUjIqx+k=-eWDrJlf^Bq0(3PqNJ6>LZ-SbG^I_$m;VH)@#nKm^c~ zPBE_67-g)ow~J~F^MbPbG1$U$Xbd|qRFBLVb-*$eW%o9k#wZ&i)k>o)>Y|iKBiiQU z`C?Bs&UEr+EQ7hSvNB}HGoAd9c~Z~fogY$oD) zZv%;Lv>JS5xoi6CvysUWotc;iiFXXH!2zKcgvZfX^L-1{XZAD|mjDMpN$wM9N^uj0 z^%R-!3lo%36TJf=Tyvd-wty)=ES#qIzK?L9E)82>U+&fvN{xCZv$?9bYQMe`CjM&a zt@7J^^%q&|-Z`|+pI0$#abh;3exJ_uJ?%@qgkX2X+kx@y&yAUs1t6H^Ha`KBE)%9Q31;aTFPUzqQze~ z5H9+)th)4f?g=d?FI$h=e5rM|wY9bX(v<%&H~$h7*Ds&8s)`t}WHeY8^s-#40FEiP-f%Y~oB_43T2NtkX12+_c>5UkVJIO8s(oXs0< z1mV^^<&bra++{f|3I5I}7PEBsjyp#E+%?!s2 zW*Ok;A5IEUiRCkdVuk7KvX*A0XeF)0jFB_Ni9vT(dKY?MgK~f!kD%o_GGvGLkP(xy z$){g7%)|@eWD7~PU0>sgub*jFuAX3Cp-$%L3bfK|bu}k`z=andkkEkBFq+W%O@rTO zSz9^P&UdaBsL6wv1A#zCX3hX$czbpw#BFXw$ z`o2gFg%ceV6JepNY|oCACoj9obHbjLx~Q?N49hBuK0^3gOxcWYvfnlWKC;k-6Q(IH z85B)-NUJ|Jop#RQ=}&mB*I+JzB{|4IHI51V+F&`!P3Ds;{L11!fxr!tFNm04ECyU$ z<(qs1IgijUHEI)z7P0iEQNg|2bW&V3J zrAUFSP#+BSQmfJ>)v~qKFW_6jJst}|7Fl<71AEg3b2=L-OoUinrC3JfNd2a!a1)so z^DBXK89k;3vGksJZRx2h3j0e^2!YL(AzQ7rA7}Lfc`-MkOU2Ed4K$ewXFHgwRVo9D z_s!N!y)vK5<)dh|8ytl>2LO`jQGWYSaHRC zIY*G_C!n7uI<>CpjIl&{dRs=R^2aV7*`TB2CC9tH#YU4luKOn&9_-)wgbPTG`DTn8 z=+*1W$%+AMFf5Jze5vF2!~rtvC>J5?+Rn5L2wGP#qz9!p{d$9sQ@sHJsU%D#xZ`ND z1U8bFlo)nSF+P>&8 zQ(#KKI#FFn?H-*DnvXBnu~yD!($mWl>Bnm=o;shWookfP1jXu?DsI8X-~tP6CBpQ( zeDrp{sKWb#6mFu6gJ~eu$Q=XND2kfW)z6k`TotCw*z!6onh8i!I$%{sE_P?Om!M&v zD3D+1ut-g+ygEj?1iUQT?KWt_gj_8f-(1t(Z|NVK5iQgcCz5pPkS*vHs7#lcW8`=b zw`h4TkwamjL!2fD7iFd&*{U!%tsytphz6!H{OL%YU1F>FElPCset|G7rIk0vIW6k~ z3c;LCHrohLiF_qay*3i-SvK96PrnEosbZ#s+OjY?^lI+r5$GP6Ewb%!%k5dWc=K~oB@zb`a z2x`)4YB&~Rb(Voi5tFK>a9J|@uCX6M&C8F|6fo?#78gj-xIZ;?E(FhQ9Zwb?S_AwD zKDUX;>1wfs8mLnM6r;0#j3YYOYQ!UR`D>B%FBXen+OV#Wp9F#bv>eX>j)3W^(}>pF z2hr87hu*pllif{Gkg6XV73cuvy@JxxP7gUpY&Wl z{jL^h|5uR+aTkJH-xviv&HV={LR;uZ%IcB1-Jj+NO7 z75p6Hv-N8@j$5@jkZR^SmQ2PEo8HeRVab8s2L_UmRuF^;-njSDVdiX-{~EwV>Tf~F z{Vwshvjhopr9n(C00h89Dn)~XSS-j3CS>%#e;vTPRB{!2XNow7KsaA1B-_=JzPGo$ zoc$Q-_nDXaFRmzJ+>`}gk?NJX@b zKmItslM!Ke^z$Bdqn80iVY3yf44R4kZ>q$;+5+z3%Pp9Snutg7fku z=)%4`c{Azz(Dwm5yk5Gxx=6_&RW)--I#N+M(>h+#$!+lV_BLf+9x1yzLdXg!M*qzE zIs)0HU}7SqM9fZM%AIq4b;UYb@PiEv6S3lhSqddRJ-r2Rh=fiM^YSJxE^dinYN^Fp z<#g%W2Ni1o=64xLX_FAEZppzn1tQT&*c>U`fvYPVPfu$Lk+nmQJpMr7<1;Em1K81e zT@95d@1xsrQo!Jqgwg?*W+2UTwGjD zOJY-WB|$$AeQEyZvAUHLXyNJQ<>iXPqRPq{C-2g-G71nxVY@+=*87^8 zsRfBW;@JtY?qPq}?dIs%%nX$Y`XFUc4dCxC+7zjm_AT<7; zvp;DShvQ>oaU|>89~I@~F8Kz4T-2W1{c>MhdD(L8?d=k9$+%zDhZ0DwNyd+lj|KRb zA&NtzludH3j7fbtSD69=eWqGtA>lK74rkZ1aMaEb*%S#p(p;KRHv)^X${zD4y6lY~ zzV04+cI*)GbDp1FKmD*olRk8{7^0@86(Chk(0J}1rLr+FP;%t@en8{GZ^Tlr5p;a% zXJBBk=|!`rtf(?or|+1TKUq~J?{m9r=)#}3<4!|GOKZTSeIV!VK6|+{w6e0|R{~m$ z3xt}R|K;fna#-N?dG+dmZKoXpZ=5^Z*@e?CO-~2+1eM0E(;x9{c#KIAD6yY8*xLs> z_L*$m;a=jVgK7=BtoFuPoaTOy)%v}}ze`KQ+dXYJaOPncKkt4*CtP&jHx_?y+0@;A z_FKo;jhBRH-G$>hJ6=b?!23^{j&Z2dckYV;Qjyl#`@?Tj!bTbfv-<|!*Pp!KKWVG$ zKQG%Kk8pcfJzU|y_4Q_3^{x8*3cja zpO>b(v|1J&62ZnwjWW+Eqkxme8ON1oQG@zbWnD6;o}er5$5Qptic~yC?F2HB-uvCY z$3L%6=U&!CHy{9o#pO1&SpalYtougunLl?9^EUnU9y8Jos@7tzC=LKYsL^eSI%6F5 zX+D8Ct>J88B^dq3eP{(+%a^XEa+3!DbZTtJdAs#qTxkA%s5(x-564ghtV@lI+1s%5 z4WdB;$$fqQYv#d~k#Umi9slzJVMpnH!~M24oS>VMCsE4deNt$X)xf(%(V)01sv>9a zRoC)0CmB7_(I~C4s8+JUmC#VVE`E4P^qZ(CGHNO+=~av>8I|t#xVUk4i-yQ6web$i zkLKnCS1{M*pFdNNBf*Ft9&(HEt~q(DfRQBvlahCwdQP7PZ2|LtE{VDrE|Q$vT^+su z9O9)jcTk*Mh9V=BX=J9sd5Cx(ai+p^Dw@MTtLJ3rU~l96kk%nY_UDKH=pL^We|hGU zaD3&!!2$H=kJx`$SkP9bYftnUm2s?*i{2uOC*s)K9jPMsN8cF)z269}eB1AN9@#mB zW89OudtMx-5wa!XpMh#uIo?&ylw~4LvMfRPHN9A8)@O2jG|8Vg$@Ocaf&;Z~aGp{7 zuYrK|l#xj!U8^(e0w6_4M`NtMaqRrcOU{oD4Nk?v=`=nsc)N12u&{7*yL!2MnX8}` zI7x^q|1NvG>K;@jWPnO}r1HUMy24|TG$CK#_c80u*4ep(E@*UuXT$t?c;^z5denfV zS2S3%{brTyJ1Us>$n%(iTGub*=%7jEwMV`xk@WN|`WpGzqT;&ARUhLJ702@ytw#Y{Mbn6NS3hTG zLux~sA;)QZd-Z-yX7qqk-#{O2uaPHRBThlEvp#S8*2mKqild(n+p!l}st_BqneHbq zoKqgPLi$9vk8;o>6lc|jvbD8!KtRAEw3GLJ{>e!$9f6|4`I9);G|ksew}(0U*?`T@Fa+rWYYh2 zYrVC#HEM%+mGue<(sy&7$?vHTspuKv;gQ0vb$1p&559LA9U&3{yz|7EUGDt-(%$}| zk0QX>d4pKL@!%(0_rZY;D+5E-7pB@TRnO%?&(@`AkPey+c5Zuz#rziTZZZ6mP~+)Y zDpxX>D@#0GYiS;iObnBNdX+oxa90gn?!!~km&2(bD$f-Xbi}U`VvshkUu@AfSWqTR zhCa69;y*;Wc5nU0M&;vUU0ID9Gcn*|x`l0;bZgs>j*xNO;jbIj_^)jVsj`%QQ|eAE5qa?b!R)-L(7!+ z4Ic+m1+Cd7<=yJ_4y4bre0IrbpwJf0`$WF=9tl(ET@SdT-w+><)WIJ04%k0Li`k7d z20Pf`5F~Azw4(E?N3kru#B`&(OThc%`o6Z;={ga93re7}ygWq!mX{1V8llXns3e@M z|KciQ7VXtTz}wvq6XiU9Jg)$I`{Oe2jrIFK27`GtDYmbj@GpnbT3Ww3g6<2t{O>$; zC@l59R?r1Kq!F|@yg*XfO_TXG5wRYuDLZ#9<@#5oci`2@IUy`G)1c(doqA zV=b;Lmya!4+fa;d-+fj{4{WyZzk7jL1^{6j4$WjH`)upm7;DeH>9zmkN^0s{Vnz)!PcSl1=s>Ap5H7 z_r$JE0+2EY!YEXi=|D`{+FhS1It`RC52P79${m(7>Zkgb_n{DvxIZ#c&}my}qT>gr4Kcj<@4Gl^YKzxj%e?kBZ>T z>N=OV1xJJaYsv!1kucwVLDEIH*^cKi(V0_@%x5pzgxroFg0}0)tC^)|8waqNH-5$Q ztUA=|=06tDt}N^0;G`^k?ec_NvIZ?qgXieI0UwKvgQHR)++=<31eOR`r@n@i zm3;GA1$_#Oiv>A2a3o2EM@J?fOs}6HmjVIq_%`oZe>4sv#s|Qua%PeNn>#+qH~0Ph z!B7bzBBG0#pqJOnNo8soR}GDwy@~Ubm|3rm7jWCPy1K^8$2T35KxEQj#*W;t;o;$N z9djXK`e*Voa@`v(R{`ER&B<436| z5d{{y1lh?St+rjCp!+*Ip5_a6)B!0UftW&Z*TQeL+oF9egM;}Wp;Tvc^;2CxyGJ#VcQ(geJC&h$s8XxDTiu(+LaZIE)%pu*MG z*Kaj@Zoq1o&sE^o1>&3d5xIzIYvZ2?y6=r|Id|)|x?n|del8;@5OMC^>f3-C3;(Qv zm@MqR$GL?XT2(dby}pF>9?}iS&gVP#`eNeg<+18F#xKtt)#i75J5APl-vHA2(sAnr zNI1&osDoA#<$(~uO;3OLJ>&)b(@uiGS?Cir7w1UYR(w=n4h|T_w@Sb!8#SJSF#uK6!Zt;DJK;0B4kS$7~~A?K(|pdKJq36o;`^4wefsu zJFI>&`B-FJ)l>sts>v0V>CN4>HZx=F*>JUwA>?rK{s8Ims*^1>6`zdHt$+U-$f;C; z2nBc7rY~+b7?(vmniv#Vfz-@u&^h-t9c<(1=zIR+4bnsSywh7C#Mzq!ziva9HG!{I z^8@wIGE^BBY&GKvenB=)IrOMETIe%4IOX%sLj7_ zXZy`nj*}tk%1X1NoU9^T*4t$lMv{f-)Tf!1<4Y*k#gjiYO;xaBo=WfJib%-FYBQXK zN+^Vdp_xz{cnRUSm>fU-I*vcqx1Bikg2m~&Tc@cV>VUY0kRV*covwLp=hkMGHu`Z? zC$L_Skl50Iz9F!gTNs-(IIH=!w$`xS=JF@?7%}k?<=5X5kl5NLSh*;1x3F<4uVhZn z!Pe>ZsG7C=@kl}52vCqz*r}XfwcO#1aq(kbr&hl^Kx*a}Vz1rb_-JHP(Be_C4sh0U zUS3!ZRUW+jR&64Tt!WIWR4VkrNcCI8U}&D({lymD11m&Q-R1+MGbOWjVR%)&fYI?` zh$-Y*_qm4f;~n_iZ9wVcfr)wBZ0WA*DPEmwHw(XwH}6ffK}NRXce|zrwCin!H^j%8 zFM0&9FG5!bwHGp>-Dr}Q9v&XwdCy&V#Xk3V%zz+nEeFR?@M39MX@b0R_ig&h_p3zr zfh=B)@^YNHCx~5!zb1gBR=T&Z8287sP)}f2p{pdNrT32Je^qgwGZecFL>~`x1LXTK}`?_mn&x>)EEX_=8k0;L3+2#!%MMKz=Lr_u)m7hL4wgy zscQ6vMc+Ns4V&l8TEgDV&&}})TZ?;np?la)lGK!)K)gSG`-PMKa7ngU1U9)LHYn+V zII6UtmN1tG-DH{wgu7$&Fy>YIlVLS8(~D4hVZV-{FA)~#m>JhPyuBqPV0AISSx=2j z^&B{?EvbmS5PGDP3?)FaKo)y(F!u*980)am_6~NrftR_Ld^?FG!Y8-BYiB-MVujUJ z49M`o?_grkNFY94gZ~r@;jUOLJ&Uk-E-@r^u@T@tyx3#F2xa1xt1$BQi_(TRXKUqvJdO?;8q`%8brWE@ ztb3o~NvxL}4^Pvzr$1*qYBMI0lJq!lsr@Va&$S3.0.0 14.5 + 1.7.4 2.0.0 @@ -713,9 +714,9 @@ - org.panteam + org.panteleyev jpackage-maven-plugin - 1.6.0 + ${janeliaws.jpackage-maven-plugin.version} org.apache.maven.plugins From 27594d5ec9bfbc13c86282b21974f7b1dec0bb18 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sun, 21 Jun 2026 18:31:29 -0400 Subject: [PATCH 08/12] formatting --- .../java/org/janelia/workstation/gui/viewer3d/TestMip3d.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/DataBrowser/src/test/java/org/janelia/workstation/gui/viewer3d/TestMip3d.java b/modules/DataBrowser/src/test/java/org/janelia/workstation/gui/viewer3d/TestMip3d.java index 14c4c6cf58..a60d8a88fd 100644 --- a/modules/DataBrowser/src/test/java/org/janelia/workstation/gui/viewer3d/TestMip3d.java +++ b/modules/DataBrowser/src/test/java/org/janelia/workstation/gui/viewer3d/TestMip3d.java @@ -32,7 +32,7 @@ public void run() { Mip3d mipWidget = new Mip3d(); mipWidget.clear(); try { - // mipWidget.loadVolume("/Users/brunsc/smallRefTest.tif"); + // mipWidget.loadVolume("/Users/brunsc/smallRefTest.tif"); // This load-up works perfectly. // String fn = "/Volumes/jacsData/brunsTest/3d_test_images/ConsolidatedSignal2_25.v3dpbd"; From fc12fc1ed511b20983e644e58cc1900a6ac27744 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sun, 21 Jun 2026 19:19:18 -0400 Subject: [PATCH 09/12] removed duplicate dependencies --- docs/Development.md | 12 ++++++++++++ docs/ReleaseProcess.md | 2 ++ modules/Jogl260Lib/pom.xml | 1 + modules/LargeVolumeViewer/pom.xml | 10 +--------- modules/ViewerController/pom.xml | 17 ----------------- 5 files changed, 16 insertions(+), 26 deletions(-) diff --git a/docs/Development.md b/docs/Development.md index 3f41ffc1f2..a497376d6d 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -2,6 +2,12 @@ The Janelia Workstation is built on top of the [Apache NetBeans Platform](https://netbeans.apache.org/kb/docs/platform/). It is recommended for developers to get familiar with the concepts used in this framework before diving into Workstation development. The best starting point is _The Definitive Guide to NetBeans Platform_ by Heiko Bock. +## Requirements + +Use JDK 21 or newer to build, run, and package the Workstation. The project is built against Apache NetBeans Platform RELEASE300 and compiles with `--release 21`, so generated classes target the Java 21 runtime level. + +The Maven enforcer accepts JDK 21 or newer. If multiple JDKs are installed, set `JAVA_HOME` to the JDK version you want Maven and `jpackage` to use. + ## Building To build the Janelia Workstation application for Janelia Research Campus, use the `janeliaws` profile: @@ -23,6 +29,12 @@ mvn -DskipTests compile Native application images and installers are built with `jpackage`. +Run package builds with JDK 21 or newer. For example, on macOS, to select JDK 21 explicitly: + +``` +JAVA_HOME=$(/usr/libexec/java_home -v 21) +``` + To build the Janelia Workstation application image: ``` mvn -Pjaneliaws,deployment -pl modules/application -am -DskipTests -Djpackage.type=APP_IMAGE package diff --git a/docs/ReleaseProcess.md b/docs/ReleaseProcess.md index c4fe651b59..d31888b726 100644 --- a/docs/ReleaseProcess.md +++ b/docs/ReleaseProcess.md @@ -4,6 +4,8 @@ The Workstation client is built and distributed using the [Apache NetBeans Platf ./release.sh +Release builds should be run with JDK 21 or newer. The client is built against Apache NetBeans Platform RELEASE300 and compiles with `--release 21`. + The version number should be in [Semantic Versioning](https://semver.org/) style. This release process automatically increments all module versions, and sets the overall Workstation version. You can then proceed over to the [jacs-cm](https://github.com/JaneliaSciComp/jacs-cm) repository to rebuild the workstation-site container using your newly released Workstation version. ## Docker Build diff --git a/modules/Jogl260Lib/pom.xml b/modules/Jogl260Lib/pom.xml index c3784605df..3aae126881 100644 --- a/modules/Jogl260Lib/pom.xml +++ b/modules/Jogl260Lib/pom.xml @@ -47,6 +47,7 @@ com.jogamp.nativewindow.util com.jogamp.newt.event com.jogamp.opengl + com.jogamp.opengl.awt com.jogamp.opengl.fixedfunc com.jogamp.opengl.glu com.jogamp.opengl.util diff --git a/modules/LargeVolumeViewer/pom.xml b/modules/LargeVolumeViewer/pom.xml index 01acf0e70c..ea2cdc2d09 100644 --- a/modules/LargeVolumeViewer/pom.xml +++ b/modules/LargeVolumeViewer/pom.xml @@ -41,7 +41,7 @@ common-gui - + org.janelia.workstation jogl260lib @@ -133,14 +133,6 @@ amqp-client 5.5.1 - - org.janelia.workstation - viewercontroller - - - org.janelia.workstation - viewercontroller - diff --git a/modules/ViewerController/pom.xml b/modules/ViewerController/pom.xml index a9cc315586..cbb8fc561e 100644 --- a/modules/ViewerController/pom.xml +++ b/modules/ViewerController/pom.xml @@ -41,11 +41,6 @@ core - - org.janelia.workstation - viewer3d - - org.janelia.workstation @@ -145,18 +140,6 @@ org.janelia.workstation viewer3d - - org.janelia.workstation - viewer3d - - - org.janelia.workstation - viewer3d - - - org.janelia.workstation - viewer3d - org.janelia.workstation geometry3d From c9a6da66a5e24598513674408154387c54b5d8c3 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Sun, 21 Jun 2026 20:12:22 -0400 Subject: [PATCH 10/12] removed commented code --- .../browser/gui/lasso/FreehandRoi.java | 13 +- .../workstation/browser/gui/lasso/Roi.java | 1459 +---------------- .../browser/gui/lasso/ShapeRoi.java | 388 +---- 3 files changed, 37 insertions(+), 1823 deletions(-) diff --git a/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/FreehandRoi.java b/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/FreehandRoi.java index 06498cc17a..21aa5e4bf4 100644 --- a/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/FreehandRoi.java +++ b/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/FreehandRoi.java @@ -7,10 +7,7 @@ public class FreehandRoi extends PolygonRoi { public FreehandRoi(int sx, int sy, ImagePlus imp) { super(sx, sy, imp); -// if (Toolbar.getToolId()==Toolbar.FREEROI) - type = FREEROI; -// else -// type = FREELINE; + type = FREEROI; if (nPoints==2) nPoints--; } @@ -29,8 +26,6 @@ protected void grow(int sx, int sy) { xp[nPoints] = ox-x; yp[nPoints] = oy-y; nPoints++; -// if (IJ.altKeyDown()) -// wipeBack(); if (nPoints==xp.length) enlargeArrays(); drawLine(); @@ -76,12 +71,6 @@ void drawLine() { int margin = 4; if (lineWidth>margin && isLine()) margin = lineWidth; -// if (ic!=null) { -// double mag = ic.getMagnification(); -// if (mag<1.0) margin = (int)(margin/mag); -// } -// if (IJ.altKeyDown()) -// margin += 20; // for wipeBack imp.draw(xmin-margin, ymin-margin, (xmax-xmin)+margin*2, (ymax-ymin)+margin*2); } diff --git a/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/Roi.java b/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/Roi.java index f52da25f00..2ecb35810f 100644 --- a/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/Roi.java +++ b/modules/DataBrowser/src/main/java/org/janelia/workstation/browser/gui/lasso/Roi.java @@ -41,9 +41,7 @@ public class Roi extends Object implements Cloneable, java.io.Serializable, Iter public static Roi previousRoi; public static final BasicStroke onePixelWide = new BasicStroke(1); -// protected static Color ROIColor = Prefs.getColor(Prefs.ROICOLOR,Color.yellow); protected static Color ROIColor = Color.yellow; -// protected static int pasteMode = Blitter.COPY; protected static int lineWidth = 1; protected static Color defaultFillColor; private static Vector listeners = new Vector(); @@ -78,7 +76,6 @@ public class Roi extends Object implements Cloneable, java.io.Serializable, Iter private int position; private int channel, slice, frame; private boolean hyperstackPosition; -// private Overlay prototypeOverlay; private boolean subPixel; private boolean activeOverlayRoi; private Properties props; @@ -87,17 +84,11 @@ public class Roi extends Object implements Cloneable, java.io.Serializable, Iter private double ycenter; private boolean listenersNotified; - /** Creates a rectangular ROI. */ public Roi(int x, int y, int width, int height) { this(x, y, width, height, 0); } -// /** Creates a rectangular ROI using double arguments. */ -// public Roi(double x, double y, double width, double height) { -// this(x, y, width, height, 0); -// } - /** Creates a new rounded rectangular ROI. */ public Roi(int x, int y, int width, int height, int cornerDiameter) { setImage(null); @@ -120,25 +111,8 @@ public Roi(int x, int y, int width, int height, int cornerDiameter) { clipHeight = height; state = NORMAL; type = RECTANGLE; -// if (ic!=null) { -// Graphics g = ic.getGraphics(); -// draw(g); -// g.dispose(); -// } fillColor = defaultFillColor; } - -// /** Creates a rounded rectangular ROI using double arguments. */ -// public Roi(double x, double y, double width, double height, int cornerDiameter) { -// this((int)x, (int)y, (int)Math.ceil(width), (int)Math.ceil(height), cornerDiameter); -// bounds = new Rectangle2D.Double(x, y, width, height); -// subPixel = true; -// } -// -// /** Creates a new rectangular Roi. */ -// public Roi(Rectangle r) { -// this(r.x, r.y, r.width, r.height); -// } /** Starts the process of creating a user-defined rectangular Roi, where sx and sy are the starting screen coordinates. */ @@ -161,23 +135,9 @@ public Roi(int sx, int sy, ImagePlus imp, int cornerDiameter) { height = 0; state = CONSTRUCTING; type = RECTANGLE; -// if (cornerDiameter>0) { -// double swidth = RectToolOptions.getDefaultStrokeWidth(); -// if (swidth>0.0) -// setStrokeWidth(swidth); -// Color scolor = RectToolOptions.getDefaultStrokeColor(); -// if (scolor!=null) -// setStrokeColor(scolor); -// } fillColor = defaultFillColor; } -// /** @deprecated */ -// public Roi(int x, int y, int width, int height, ImagePlus imp) { -// this(x, y, width, height); -// setImage(imp); -// } - /** Set the location of the ROI in image coordinates. */ public void setLocation(int x, int y) { this.x = x; @@ -189,20 +149,7 @@ public void setLocation(int x, int y) { bounds.y = y; } } - - /** Set the location of the ROI in image coordinates. */ -// public void setLocation(double x, double y) { -// setLocation((int)x, (int)y); -// if ((int)x==x && (int)y==y) -// return; -// if (bounds!=null) { -// bounds.x = x; -// bounds.y = y; -// } else -// bounds = new Rectangle2D.Double(x, y, width, height); -// subPixel = true; -// } - + public void setImage(ImagePlus imp) { this.imp = imp; cachedMask = null; @@ -238,411 +185,13 @@ public int getState() { /** Returns the perimeter length. */ public double getLength() { double pw=1.0, ph=1.0; -// if (imp!=null) { -// Calibration cal = imp.getCalibration(); -// pw = cal.pixelWidth; -// ph = cal.pixelHeight; -// } return 2.0*width*pw+2.0*height*ph; } - -// /** Returns Feret's diameter, the greatest distance between -// any two points along the ROI boundary. */ -// public double getFeretsDiameter() { -// double[] a = getFeretValues(); -// return a!=null?a[0]:0.0; -// } - -// /** Caculates "Feret" (maximum caliper width), "FeretAngle" -// and "MinFeret" (minimum caliper width), "FeretX" and "FeretY". */ -// public double[] getFeretValues() { -// double min=Double.MAX_VALUE, diameter=0.0, angle=0.0, feretX=0.0, feretY=0.0; -// int p1=0, p2=0; -// double pw=1.0, ph=1.0; -// if (imp!=null) { -// Calibration cal = imp.getCalibration(); -// pw = cal.pixelWidth; -// ph = cal.pixelHeight; -// } -// Polygon poly = getConvexHull(); -// if (poly==null) { -// poly = getPolygon(); -// if (poly==null) return null; -// } -// double w2=pw*pw, h2=ph*ph; -// double dx, dy, d; -// for (int i=0; idiameter) {diameter=d; p1=i; p2=j;} -// } -// } -// Rectangle r = getBounds(); -// double cx = r.x + r.width/2.0; -// double cy = r.y + r.height/2.0; -// int n = poly.npoints; -// double[] x = new double[n]; -// double[] y = new double[n]; -// for (int i=0; ixmax) xmax = xr; -// if (yrymax) ymax = yr; -// } -// double width = xmax - xmin; -// double height = ymax - ymin; -// double min2 = Math.min(width, height); -// min = Math.min(min, min2); -// } -// double x1=poly.xpoints[p1], y1=poly.ypoints[p1]; -// double x2=poly.xpoints[p2], y2=poly.ypoints[p2]; -// if (x1>x2) { -// double tx1=x1, ty1=y1; -// x1=x2; y1=y2; x2=tx1; y2=ty1; -// } -// feretX = x1*pw; -// feretY = y1*ph; -// dx=x2-x1; dy=y1-y2; -// angle = (180.0/Math.PI)*Math.atan2(dy*ph, dx*pw); -// if (angle<0.0) -// angle += 180.0; -// //breadth = getFeretBreadth(poly, angle, x1, y1, x2, y2); -// double[] a = new double[5]; -// a[0] = diameter; -// a[1] = angle; -// a[2] = min; -// a[3] = feretX; -// a[4] = feretY; -// return a; -// } -// -// public Polygon getConvexHull() { -// return getPolygon(); -// } -// -// double getFeretBreadth(Shape shape, double angle, double x1, double y1, double x2, double y2) { -// double cx = x1 + (x2-x1)/2; -// double cy = y1 + (y2-y1)/2; -// AffineTransform at = new AffineTransform(); -// at.rotate(angle*Math.PI/180.0, cx, cy); -// Shape s = at.createTransformedShape(shape); -// Rectangle2D r = s.getBounds2D(); -// return Math.min(r.getWidth(), r.getHeight()); -// /* -// ShapeRoi roi2 = new ShapeRoi(s); -// Roi[] rois = roi2.getRois(); -// if (rois!=null && rois.length>0) { -// Polygon p = rois[0].getPolygon(); -// ImageProcessor ip = imp.getProcessor(); -// for (int i=0; i0) { -// ImageProcessor ip = getMask(); -// Roi roi2 = (new ThresholdToSelection()).convert(ip); -// if (roi2!=null) { -// roi2.setLocation(x, y); -// return roi2.getFloatPolygon(); -// } -// } -// if (subPixelResolution() && bounds!=null) { -// float[] xpoints = new float[4]; -// float[] ypoints = new float[4]; -// xpoints[0] = (float)bounds.x; -// ypoints[0] = (float)bounds.y; -// xpoints[1] = (float)(bounds.x+bounds.width); -// ypoints[1] = (float)bounds.y; -// xpoints[2] = (float)(bounds.x+bounds.width); -// ypoints[2] = (float)(bounds.y+bounds.height); -// xpoints[3] = (float)bounds.x; -// ypoints[3] = (float)(bounds.y+bounds.height); -// return new FloatPolygon(xpoints, ypoints); -// } else { -// Polygon p = getPolygon(); -// return new FloatPolygon(toFloat(p.xpoints), toFloat(p.ypoints), p.npoints); -// } -// } - -// /** Returns, as a FloatPolygon, an interpolated version -// * of this selection that has points spaced 1.0 pixel apart. -// */ -// public FloatPolygon getInterpolatedPolygon() { -// return getInterpolatedPolygon(1.0, false); -// } -// -// /** Returns, as a FloatPolygon, an interpolated version of -// * this selection with points spaced 'interval' pixels apart. -// * If 'smooth' is true, traced and freehand selections are -// * first smoothed using a 3 point running average. -// */ -// public FloatPolygon getInterpolatedPolygon(double interval, boolean smooth) { -// FloatPolygon p = (this instanceof Line)?((Line)this).getFloatPoints():getFloatPolygon(); -// return getInterpolatedPolygon(p, interval, smooth); -// } -// -// /** -// * Returns, as a FloatPolygon, an interpolated version of this selection -// * with points spaced abs('interval') pixels apart. If 'smooth' is true, traced -// * and freehand selections are first smoothed using a 3 point running -// * average. -// * If 'interval' is negative, the program is allowed to decrease abs('interval') -// * so that the last segment will hit the end point -// */ -// protected FloatPolygon getInterpolatedPolygon(FloatPolygon p, double interval, boolean smooth) { -// boolean allowToAdjust = interval < 0; -// interval = Math.abs(interval); -// boolean isLine = this.isLine(); -// double length = p.getLength(isLine); -// -// int npoints = p.npoints; -// if (!isLine) {//**append (and later remove) closing point to end of array -// npoints++; -// p.xpoints = java.util.Arrays.copyOf(p.xpoints, npoints); -// p.xpoints[npoints - 1] = p.xpoints[0]; -// p.ypoints = java.util.Arrays.copyOf(p.ypoints, npoints); -// p.ypoints[npoints - 1] = p.ypoints[0]; -// } -// int npoints2 = (int) (10 + (length * 1.5) / interval);//allow some headroom -// -// double tryInterval = interval; -// double minDiff = 1e9; -// double bestInterval = 0; -// int srcPtr = 0;//index of source polygon -// int destPtr = 0;//index of destination polygon -// double[] destXArr = new double[npoints2]; -// double[] destYArr = new double[npoints2]; -// int nTrials = 50; -// int trial = 0; -// while (trial <= nTrials) { -// destXArr[0] = p.xpoints[0]; -// destYArr[0] = p.ypoints[0]; -// srcPtr = 0; -// destPtr = 0; -// double xA = p.xpoints[0];//start of current segment -// double yA = p.ypoints[0]; -// -// while (srcPtr < npoints - 1) {//collect vertices -// double xC = destXArr[destPtr];//center circle -// double yC = destYArr[destPtr]; -// double xB = p.xpoints[srcPtr + 1];//end of current segment -// double yB = p.ypoints[srcPtr + 1]; -// double[] intersections = lineCircleIntersection(xA, yA, xB, yB, xC, yC, tryInterval, true); -// if (intersections.length >= 2) { -// xA = intersections[0];//only use first of two intersections -// yA = intersections[1]; -// destPtr++; -// destXArr[destPtr] = xA; -// destYArr[destPtr] = yA; -// } else { -// srcPtr++;//no intersection found, pick next segment -// xA = p.xpoints[srcPtr]; -// yA = p.ypoints[srcPtr]; -// } -// } -// destPtr++; -// destXArr[destPtr] = p.xpoints[npoints - 1]; -// destYArr[destPtr] = p.ypoints[npoints - 1]; -// destPtr++; -// if (!allowToAdjust) { -// if (isLine) -// destPtr--; -// break; -// } -// -// int nSegments = destPtr - 1; -// double dx = destXArr[destPtr - 2] - destXArr[destPtr - 1]; -// double dy = destYArr[destPtr - 2] - destYArr[destPtr - 1]; -// double lastSeg = Math.sqrt(dx * dx + dy * dy); -// -// double diff = lastSeg - tryInterval;//always <= 0 -// if (Math.abs(diff) < minDiff) { -// minDiff = Math.abs(diff); -// bestInterval = tryInterval; -// } -// double feedBackFactor = 0.66;//factor <1: applying soft successive approximation -// tryInterval = tryInterval + feedBackFactor * diff / nSegments; -// //stop if tryInterval < 80% of interval, OR if last segment differs < 0.05 pixels -// if ((tryInterval < 0.8 * interval || Math.abs(diff) < 0.05 || trial == nTrials - 1) && trial < nTrials) { -// trial = nTrials;//run one more loop with bestInterval to get best polygon -// tryInterval = bestInterval; -// } else -// trial++; -// } -// if (!isLine) //**remove closing point from end of array -// destPtr--; -// float[] xPoints = new float[destPtr]; -// float[] yPoints = new float[destPtr]; -// for (int jj = 0; jj < destPtr; jj++) { -// xPoints[jj] = (float) destXArr[jj]; -// yPoints[jj] = (float) destYArr[jj]; -// } -// FloatPolygon fPoly = new FloatPolygon(xPoints, yPoints); -// return fPoly; -// } -// -// /** Returns the coordinates of the pixels inside this ROI as an array of Points. -// * @see #getContainedFloatPoints() -// * @see #iterator() -// */ -// public Point[] getContainedPoints() { -// if (isLine()) { -// FloatPolygon p = getInterpolatedPolygon(); -// Point[] points = new Point[p.npoints]; -// for (int i=0; i -// * Calculates intersections of a line segment with a circle -// * Author N.Vischer -// * ax, ay, bx, by: points A and B of line segment -// * cx, cy, rad: Circle center and radius. -// * ignoreOutside: if true, ignores intersections outside the line segment A-B -// * Returns an array of 0, 2 or 4 coordinates (for 0, 1, or 2 intersection -// * points). If two intersection points are returned, they are listed in travel -// * direction A->B -// *

-// */ -// public static double[] lineCircleIntersection(double ax, double ay, double bx, double by, double cx, double cy, double rad, boolean ignoreOutside) { -// //rotates & translates points A, B and C, creating new points A2, B2 and C2. -// //A2 is then on origin, and B2 is on positive x-axis -// -// double dxAC = cx - ax; -// double dyAC = cy - ay; -// double lenAC = Math.sqrt(dxAC * dxAC + dyAC * dyAC); -// -// double dxAB = bx - ax; -// double dyAB = by - ay; -// -// //calculate B2 and C2: -// double xB2 = Math.sqrt(dxAB * dxAB + dyAB * dyAB); -// -// double phi1 = Math.atan2(dyAB, dxAB);//amount of rotation -// double phi2 = Math.atan2(dyAC, dxAC); -// double phi3 = phi1 - phi2; -// double xC2 = lenAC * Math.cos(phi3); -// double yC2 = lenAC * Math.sin(phi3);//rotation & translation is done -// if (Math.abs(yC2) > rad) -// return new double[0];//no intersection found -// double halfChord = Math.sqrt(rad * rad - yC2 * yC2); -// double sectOne = xC2 - halfChord;//first intersection point, still on x axis -// double sectTwo = xC2 + halfChord;//second intersection point, still on x axis -// double[] xyCoords = new double[4]; -// int ptr = 0; -// if ((sectOne >= 0 && sectOne <= xB2) || !ignoreOutside) { -// double sectOneX = Math.cos(phi1) * sectOne + ax;//undo rotation and translation -// double sectOneY = Math.sin(phi1) * sectOne + ay; -// xyCoords[ptr++] = sectOneX; -// xyCoords[ptr++] = sectOneY; -// } -// if ((sectTwo >= 0 && sectTwo <= xB2) || !ignoreOutside) { -// double sectTwoX = Math.cos(phi1) * sectTwo + ax;//undo rotation and translation -// double sectTwoY = Math.sin(phi1) * sectTwo + ay; -// xyCoords[ptr++] = sectTwoX; -// xyCoords[ptr++] = sectTwoY; -// } -// if (halfChord == 0 && ptr > 2) //tangent line returns only one intersection -// ptr = 2; -// xyCoords = java.util.Arrays.copyOf(xyCoords,ptr); -// return xyCoords; -// } /** Returns a copy of this roi. See Thinking is Java by Bruce Eckel (www.eckelobjects.com) for a good description of object cloning. */ @@ -659,7 +208,7 @@ public synchronized Object clone() { } catch (CloneNotSupportedException e) {return null;} } - + protected void grow(int sx, int sy) { if (clipboard!=null) return; int xNew = ic.offScreenX(sx); @@ -729,203 +278,6 @@ private void growConstrained(int xNew, int yNew) { oldHeight = height; } -// protected void moveHandle(int sx, int sy) { -// double asp; -// if (clipboard!=null) return; -// int ox = ic.offScreenX(sx); -// int oy = ic.offScreenY(sy); -// if (ox<0) ox=0; if (oy<0) oy=0; -// if (ox>xMax) ox=xMax; if (oy>yMax) oy=yMax; -// int x1=x, y1=y, x2=x1+width, y2=y+height, xc=x+width/2, yc=y+height/2; -// if (width > 7 && height > 7) { -// asp = (double)width/(double)height; -// asp_bk = asp; -// } else -// asp = asp_bk; -// -// switch (activeHandle) { -// case 0: -// x=ox; y=oy; -// break; -// case 1: -// y=oy; -// break; -// case 2: -// x2=ox; y=oy; -// break; -// case 3: -// x2=ox; -// break; -// case 4: -// x2=ox; y2=oy; -// break; -// case 5: -// y2=oy; -// break; -// case 6: -// x=ox; y2=oy; -// break; -// case 7: -// x=ox; -// break; -// } -// if (x=x2) { -// width=1; -// x=x2=xc; -// } -// if (y>=y2) { -// height=1; -// y=y2=yc; -// } -// bounds = null; -// } -// -// if (constrain) { -// if (activeHandle==1 || activeHandle==5) -// width=height; -// else -// height=width; -// -// if(x>=x2) { -// width=1; -// x=x2=xc; -// } -// if (y>=y2) { -// height=1; -// y=y2=yc; -// } -// switch (activeHandle) { -// case 0: -// x=x2-width; -// y=y2-height; -// break; -// case 1: -// x=xc-width/2; -// y=y2-height; -// break; -// case 2: -// y=y2-height; -// break; -// case 3: -// y=yc-height/2; -// break; -// case 5: -// x=xc-width/2; -// break; -// case 6: -// x=x2-width; -// break; -// case 7: -// y=yc-height/2; -// x=x2-width; -// break; -// } -// if (center) { -// x=xc-width/2; -// y=yc-height/2; -// } -// } -// -// if (aspect && !constrain) { -// if (activeHandle==1 || activeHandle==5) width=(int)Math.rint((double)height*asp); -// else height=(int)Math.rint((double)width/asp); -// -// switch (activeHandle){ -// case 0: -// x=x2-width; -// y=y2-height; -// break; -// case 1: -// x=xc-width/2; -// y=y2-height; -// break; -// case 2: -// y=y2-height; -// break; -// case 3: -// y=yc-height/2; -// break; -// case 5: -// x=xc-width/2; -// break; -// case 6: -// x=x2-width; -// break; -// case 7: -// y=yc-height/2; -// x=x2-width; -// break; -// } -// if (center) { -// x=xc-width/2; -// y=yc-height/2; -// } -// -// // Attempt to preserve aspect ratio when roi very small: -// if (width<8) { -// if(width<1) width = 1; -// height=(int)Math.rint((double)width/asp_bk); -// } -// if (height<8) { -// if(height<1) height =1; -// width=(int)Math.rint((double)height*asp_bk); -// } -// } -// -// updateClipRect(); -// imp.draw(clipX, clipY, clipWidth, clipHeight); -// oldX=x; oldY=y; -// oldWidth=width; oldHeight=height; -// bounds = null; -// subPixel = false; -// } - void move(int sx, int sy) { int xNew = ic.offScreenX(sx); int yNew = ic.offScreenY(sy); @@ -939,103 +291,20 @@ void move(int sx, int sy) { bounds.x += dx; bounds.y += dy; } -// boolean isImageRoi = this instanceof ImageRoi; -// if (clipboard==null && type==RECTANGLE && !isImageRoi) { -// if (x<0) x=0; if (y<0) y=0; -// if ((x+width)>xMax) x = xMax-width; -// if ((y+height)>yMax) y = yMax-height; -// } startX = xNew; startY = yNew; -// if (type==POINT || ((this instanceof TextRoi) && ((TextRoi)this).getAngle()!=0.0)) -// ignoreClipRect = true; updateClipRect(); -// if ((lineWidth>1 && isLine()) || ignoreClipRect || ((this instanceof PolygonRoi)&&((PolygonRoi)this).isSplineFit())) -// imp.draw(); -// else - imp.draw(clipX, clipY, clipWidth, clipHeight); + imp.draw(clipX, clipY, clipWidth, clipHeight); oldX = x; oldY = y; oldWidth = width; oldHeight=height; -// if (isImageRoi) showStatus(); if (bounds!=null) { bounds.x = x; bounds.y = y; } } -// /** Nudge ROI one pixel on arrow key press. */ -// public void nudge(int key) { -// if (WindowManager.getActiveWindow() instanceof ij.plugin.frame.RoiManager) -// return; -// switch(key) { -// case KeyEvent.VK_UP: -// y--; -// if (y<0 && (type!=RECTANGLE||clipboard==null)) -// y = 0; -// break; -// case KeyEvent.VK_DOWN: -// y++; -// if ((y+height)>=yMax && (type!=RECTANGLE||clipboard==null)) -// y = yMax-height; -// break; -// case KeyEvent.VK_LEFT: -// x--; -// if (x<0 && (type!=RECTANGLE||clipboard==null)) -// x = 0; -// break; -// case KeyEvent.VK_RIGHT: -// x++; -// if ((x+width)>=xMax && (type!=RECTANGLE||clipboard==null)) -// x = xMax-width; -// break; -// } -// updateClipRect(); -// if (type==POINT) -// imp.draw(); -// else -// imp.draw(clipX, clipY, clipWidth, clipHeight); -// oldX = x; oldY = y; -// bounds = null; -// showStatus(); -// notifyListeners(RoiListener.MOVED); -// } -// -// /** Nudge lower right corner of rectangular and oval ROIs by -// one pixel based on arrow key press. */ -// public void nudgeCorner(int key) { -// if (type>OVAL || clipboard!=null) -// return; -// switch(key) { -// case KeyEvent.VK_UP: -// height--; -// if (height<1) height = 1; -// notifyListeners(RoiListener.MODIFIED); -// break; -// case KeyEvent.VK_DOWN: -// height++; -// if ((y+height) > yMax) height = yMax-y; -// notifyListeners(RoiListener.MODIFIED); -// break; -// case KeyEvent.VK_LEFT: -// width--; -// if (width<1) width = 1; -// notifyListeners(RoiListener.MODIFIED); -// break; -// case KeyEvent.VK_RIGHT: -// width++; -// if ((x+width) > xMax) width = xMax-x; -// notifyListeners(RoiListener.MODIFIED); -// break; -// } -// updateClipRect(); -// imp.draw(clipX, clipY, clipWidth, clipHeight); -// oldX = x; oldY = y; -// cachedMask = null; -// showStatus(); -// } - // Finds the union of current and previous roi protected void updateClipRect() { clipX = (x<=oldX)?x:oldX; @@ -1043,11 +312,6 @@ protected void updateClipRect() { clipWidth = ((x+width>=oldX+oldWidth)?x+width:oldX+oldWidth) - clipX + 1; clipHeight = ((y+height>=oldY+oldHeight)?y+height:oldY+oldHeight) - clipY + 1; int m = 3; -// if (ic!=null) { -// double mag = ic.getMagnification(); -// if (mag<1.0) -// m = (int)(4.0/mag); -// } m += clipRectMargin(); m = (int)(m+getStrokeWidth()*2); clipX-=m; clipY-=m; @@ -1061,7 +325,6 @@ protected int clipRectMargin() { protected void handleMouseDrag(int sx, int sy, int flags) { if (ic==null) return; constrain = (flags&Event.SHIFT_MASK)!=0; -// center = (flags&Event.CTRL_MASK)!=0 || (IJ.isMacintosh()&&(flags&Event.META_MASK)!=0); center = (flags&Event.CTRL_MASK)!=0 || (SystemInfo.isMac&&(flags&Event.META_MASK)!=0); aspect = (flags&Event.ALT_MASK)!=0; switch(state) { @@ -1071,38 +334,20 @@ protected void handleMouseDrag(int sx, int sy, int flags) { case MOVING: move(sx, sy); break; -// case MOVING_HANDLE: -// moveHandle(sx, sy); -// break; default: break; } -// notifyListeners(state==MOVING?RoiListener.MOVED:RoiListener.MODIFIED); } -// int getHandleSize() { -// double mag = ic!=null?ic.getMagnification():1.0; -// double size = HANDLE_SIZE/mag; -// return (int)(size*mag); -// } - public void draw(Graphics g) { Color color = strokeColor!=null? strokeColor:ROIColor; if (fillColor!=null) color = fillColor; -// if (Interpreter.isBatchMode() && imp!=null && imp.getOverlay()!=null && strokeColor==null && fillColor==null) -// return; g.setColor(color); mag = getMagnification(); int sw = (int)(width*mag); int sh = (int)(height*mag); int sx1 = screenX(x); int sy1 = screenY(y); -// if (subPixelResolution() && bounds!=null) { -// sw = (int)(bounds.width*mag); -// sh = (int)(bounds.height*mag); -// sx1 = screenXD(bounds.x); -// sy1 = screenYD(bounds.y); -// } int sx2 = sx1+sw/2; int sy2 = sy1+sh/2; int sx3 = sx1+sw; @@ -1123,10 +368,7 @@ public void draw(Graphics g) { g.setColor(Color.cyan); g.drawRect(sx1, sy1, sw, sh); } else { -// if (!(this instanceof TextRoi)) -// g.fillRect(sx1, sy1, sw, sh); -// else - g.drawRect(sx1, sy1, sw, sh); + g.drawRect(sx1, sy1, sw, sh); } } else g.drawRect(sx1, sy1, sw, sh); @@ -1148,17 +390,9 @@ public void draw(Graphics g) { if (updateFullWindow) {updateFullWindow = false; imp.draw();} } - -// public void drawOverlay(Graphics g) { -// overlay = true; -// draw(g); -// overlay = false; -// } - + void drawPreviousRoi(Graphics g) { if (previousRoi!=null && previousRoi!=this && previousRoi.modState!=NO_MODS) { -// if (type!=POINT && previousRoi.getType()==POINT && previousRoi.modState!=SUBTRACT_FROM_ROI) -// return; previousRoi.setImage(imp); previousRoi.draw(g); } @@ -1187,50 +421,7 @@ void drawHandle(Graphics g, int x, int y) { g.fillRect(x+2,y+2,1,1); } } -// -// /** -// * @deprecated -// * replaced by drawPixels(ImageProcessor) -// */ -// public void drawPixels() { -// if (imp!=null) -// drawPixels(imp.getProcessor()); -// } -// -// /** Draws the selection outline on the specified ImageProcessor. -// @see ij.process.ImageProcessor#setColor -// @see ij.process.ImageProcessor#setLineWidth -// */ -// public void drawPixels(ImageProcessor ip) { -// endPaste(); -// int saveWidth = ip.getLineWidth(); -// if (getStrokeWidth()>1f) -// ip.setLineWidth((int)Math.round(getStrokeWidth())); -// if (cornerDiameter>0) -// drawRoundedRect(ip); -// else { -// if (ip.getLineWidth()==1) -// ip.drawRect(x, y, width+1, height+1); -// else -// ip.drawRect(x, y, width, height); -// } -// ip.setLineWidth(saveWidth); -// if (Line.getWidth()>1 || getStrokeWidth()>1) -// updateFullWindow = true; -// } -// -// private void drawRoundedRect(ImageProcessor ip) { -// int margin = (int)getStrokeWidth()/2; -// BufferedImage bi = new BufferedImage(width+margin*2+1, height+margin*2+1, BufferedImage.TYPE_BYTE_GRAY); -// Graphics2D g = bi.createGraphics(); -// if (stroke!=null) -// g.setStroke(stroke); -// g.drawRoundRect(margin, margin, width, height, cornerDiameter, cornerDiameter); -// ByteProcessor mask = new ByteProcessor(bi); -// ip.setRoi(x-margin, y-margin, width+margin*2+1, height+margin*2+1); -// ip.fill(mask); -// } - + public boolean contains(int x, int y) { Rectangle r = new Rectangle(this.x, this.y, width, height); boolean contains = r.contains(x, y); @@ -1243,32 +434,9 @@ public boolean contains(int x, int y) { /** Returns a handle number if the specified screen coordinates are inside or near a handle, otherwise returns -1. */ public int isHandle(int sx, int sy) { -// if (clipboard!=null || ic==null) return -1; -// double mag = ic.getMagnification(); -// int margin = IJ.getScreenSize().width>1280?5:3; -// int size = HANDLE_SIZE+margin; -// int halfSize = size/2; -// double x = getXBase(); -// double y = getYBase(); -// double width = getFloatWidth(); -// double height = getFloatHeight(); -// int sx1 = ic.screenXD(x) - halfSize; -// int sy1 = ic.screenYD(y) - halfSize; -// int sx3 = ic.screenXD(x+width) - halfSize; -// int sy3 = ic.screenYD(y+height) - halfSize; -// int sx2 = sx1 + (sx3 - sx1)/2; -// int sy2 = sy1 + (sy3 - sy1)/2; -// if (sx>=sx1&&sx<=sx1+size&&sy>=sy1&&sy<=sy1+size) return 0; -// if (sx>=sx2&&sx<=sx2+size&&sy>=sy1&&sy<=sy1+size) return 1; -// if (sx>=sx3&&sx<=sx3+size&&sy>=sy1&&sy<=sy1+size) return 2; -// if (sx>=sx3&&sx<=sx3+size&&sy>=sy2&&sy<=sy2+size) return 3; -// if (sx>=sx3&&sx<=sx3+size&&sy>=sy3&&sy<=sy3+size) return 4; -// if (sx>=sx2&&sx<=sx2+size&&sy>=sy3&&sy<=sy3+size) return 5; -// if (sx>=sx1&&sx<=sx1+size&&sy>=sy3&&sy<=sy3+size) return 6; -// if (sx>=sx1&&sx<=sx1+size&&sy>=sy2&&sy<=sy2+size) return 7; return -1; } -// + protected void mouseDownInHandle(int handle, int sx, int sy) { state = MOVING_HANDLE; activeHandle = handle; @@ -1281,7 +449,6 @@ protected void handleMouseDown(int sx, int sy) { startY = ic.offScreenY(sy); startXD = ic.offScreenXD(sx); startYD = ic.offScreenYD(sy); - //showStatus(); } } @@ -1289,39 +456,12 @@ protected void handleMouseUp(int screenX, int screenY) { state = NORMAL; if (imp==null) return; imp.draw(clipX-5, clipY-5, clipWidth+10, clipHeight+10); -// if (Recorder.record) { -// String method; -// if (type==OVAL) -// Recorder.record("makeOval", x, y, width, height); -// else if (!(this instanceof TextRoi)) { -// if (cornerDiameter==0) -// Recorder.record("makeRectangle", x, y, width, height); -// else { -// if (Recorder.scriptMode()) -// Recorder.recordCall("imp.setRoi(new Roi("+x+","+y+","+width+","+height+","+cornerDiameter+"));"); -// else -// Recorder.record("makeRectangle", x, y, width, height, cornerDiameter); -// } -// } -// } -// if (Toolbar.getToolId()==Toolbar.OVAL&&Toolbar.getBrushSize()>0) { -// int flags = ic!=null?ic.getModifiers():16; -// if ((flags&16)==0) // erase ROI Brush -// {imp.draw(); return;} -// } modifyRoi(); } void modifyRoi() { if (previousRoi==null || previousRoi.modState==NO_MODS || imp==null) return; -// if (type==POINT || previousRoi.getType()==POINT) { -// if (type==POINT && previousRoi.getType()==POINT) { -// addPoint(); -// } else if (isArea() && previousRoi.getType()==POINT && previousRoi.modState==SUBTRACT_FROM_ROI) -// subtractPoints(); -// return; -// } Roi previous = (Roi)previousRoi.clone(); previous.modState = NO_MODS; ShapeRoi s1 = null; @@ -1352,117 +492,16 @@ void modifyRoi() { imp.setRoi(roi2); previousRoi = previous; } - -// void addPoint() { -// if (!(type==POINT && previousRoi.getType()==POINT)) { -// modState = NO_MODS; -// imp.draw(); -// return; -// } -// previousRoi.modState = NO_MODS; -// PointRoi p1 = (PointRoi)previousRoi; -// FloatPolygon poly = getFloatPolygon(); -// p1.addPoint(imp, poly.xpoints[0], poly.ypoints[0]); -// imp.setRoi(p1); -// } -// -// void subtractPoints() { -// previousRoi.modState = NO_MODS; -// PointRoi p1 = (PointRoi)previousRoi; -// PointRoi p2 = p1.subtractPoints(this); -// if (p2!=null) -// imp.setRoi(p1.subtractPoints(this)); -// else -// imp.deleteRoi(); -// } -// -// /** If 'add' is true, adds this selection to the previous one. If 'subtract' is true, subtracts -// it from the previous selection. Called by the IJ.doWand() method, and the makeRectangle(), -// makeOval(), makePolygon() and makeSelection() macro functions. */ -// public void update(boolean add, boolean subtract) { -// if (previousRoi==null) return; -// if (add) { -// previousRoi.modState = ADD_TO_ROI; -// modifyRoi(); -// } else if (subtract) { -// previousRoi.modState = SUBTRACT_FROM_ROI; -// modifyRoi(); -// } else -// previousRoi.modState = NO_MODS; -// } protected void showStatus() { -// if (imp==null) -// return; - String value; -// if (state!=CONSTRUCTING && (type==RECTANGLE||type==POINT) && width<=25 && height<=25) { -// ImageProcessor ip = imp.getProcessor(); -// double v = ip.getPixelValue(x,y); -// int digits = (imp.getType()==ImagePlus.GRAY8||imp.getType()==ImagePlus.GRAY16)?0:2; -// value = ", value="+IJ.d2s(v,digits); -// } else -// value = ""; -// Calibration cal = imp.getCalibration(); -// String size; -// if (cal.scaled() && !(IJ.altKeyDown()||(state==NORMAL&&IJ.shiftKeyDown()))) -// size = ", w="+IJ.d2s(width*cal.pixelWidth)+" ("+width+"), h="+IJ.d2s(height*cal.pixelHeight)+" ("+height+")"; -// else -// size = ", w="+width+", h="+height; -// IJ.showStatus(imp.getLocationAsString(x,y)+size+value); + // do nothing } /** Always returns null for rectangular Roi's */ public ImageProcessor getMask() { -// if (cornerDiameter>0) -// return (new ShapeRoi(new RoundRectangle2D.Float(x, y, width, height, cornerDiameter, cornerDiameter))).getMask(); -// else - return null; - } -// -// public void startPaste(ImagePlus clipboard) { -// IJ.showStatus("Pasting..."); -// IJ.wait(10); -// this.clipboard = clipboard; -// imp.getProcessor().snapshot(); -// updateClipRect(); -// imp.draw(clipX, clipY, clipWidth, clipHeight); -// } -// -// void updatePaste() { -// if (clipboard!=null) { -// imp.getMask(); -// ImageProcessor ip = imp.getProcessor(); -// ip.reset(); -// int xoffset=0, yoffset=0; -// Roi croi = clipboard.getRoi(); -// if (croi!=null) { -// Rectangle r = croi.getBounds(); -// if (r.x<0) xoffset=-r.x; -// if (r.y<0) yoffset=-r.y; -// } -// ip.copyBits(clipboard.getProcessor(), x+xoffset, y+yoffset, pasteMode); -// if (type!=RECTANGLE) -// ip.reset(ip.getMask()); -// if (ic!=null) -// ic.setImageUpdated(); -// } -// } -// -// public void endPaste() { -// if (clipboard!=null) { -// updatePaste(); -// clipboard = null; -// Undo.setup(Undo.FILTER, imp); -// } -// activeOverlayRoi = false; -// } -// -// public void abortPaste() { -// clipboard = null; -// imp.getProcessor().reset(); -// imp.updateAndDraw(); -// } -// + return null; + } + /** Returns the angle in degrees between the specified line and a horizontal line. */ public double getAngle(int x1, int y1, int x2, int y2) { return getFloatAngle(x1, y1, x2, y2); @@ -1472,11 +511,6 @@ public double getAngle(int x1, int y1, int x2, int y2) { public double getFloatAngle(double x1, double y1, double x2, double y2) { double dx = x2-x1; double dy = y1-y2; -// if (imp!=null && !IJ.altKeyDown()) { -// Calibration cal = imp.getCalibration(); -// dx *= cal.pixelWidth; -// dy *= cal.pixelHeight; -// } return (180.0/Math.PI)*Math.atan2(dy, dx); } @@ -1500,7 +534,6 @@ public static Color getColor() { * overrides the global color set by the static setColor() method. * @see #getStrokeColor * @see #setStrokeWidth - * @see ij.ImagePlus#setOverlay(ij.gui.Overlay) */ public void setStrokeColor(Color c) { strokeColor = c; @@ -1582,12 +615,10 @@ public void setNonScalable(boolean nonScalable) { * the width to 0.0 and the ROI will be drawn using a * a 1 pixel stroke width regardless of the magnification. * @see #setStrokeColor(Color) - * @see ij.ImagePlus#setOverlay(ij.gui.Overlay) */ public void setStrokeWidth(float width) { if (width<0f) width = 0f; - boolean notify = listeners.size()>0 && isLine() && getStrokeWidth()!=width; if (width==0) stroke = null; else if (wideLine) @@ -1596,8 +627,6 @@ else if (wideLine) this.stroke = new BasicStroke(width); if (width>1f) fillColor = null; -// if (notify) -// notifyListeners(RoiListener.MODIFIED); } /** This is a version of setStrokeWidth() that accepts a double argument. */ @@ -1621,15 +650,7 @@ public BasicStroke getStroke() { } protected BasicStroke getScaledStroke() { - if (ic==null) - return stroke; -// double mag = ic.getMagnification(); -// if (mag!=1.0) { -// float width = (float)(stroke.getLineWidth()*mag); -// //return new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); -// return new BasicStroke(width, stroke.getEndCap(), stroke.getLineJoin(), stroke.getMiterLimit(), stroke.getDashArray(), stroke.getDashPhase()); -// } else - return stroke; + return stroke; } /** Returns the name of this ROI, or null. */ @@ -1642,149 +663,6 @@ public void setName(String name) { this.name = name; } -// /** Sets the Paste transfer mode. -// @see ij.process.Blitter -// */ -// public static void setPasteMode(int transferMode) { -// if (transferMode==pasteMode) return; -// pasteMode = transferMode; -// ImagePlus imp = WindowManager.getCurrentImage(); -// if (imp!=null) -// imp.updateAndDraw(); -// } -// -// /** Sets the rounded rectangle corner diameter (pixels). */ -// public void setCornerDiameter(int cornerDiameter) { -// if (cornerDiameter<0) cornerDiameter = 0; -// this.cornerDiameter = cornerDiameter; -// ImagePlus imp = WindowManager.getCurrentImage(); -// if (imp!=null && this==imp.getRoi()) -// imp.updateAndDraw(); -// } -// -// /** Returns the rounded rectangle corner diameter (pixels). */ -// public int getCornerDiameter() { -// return cornerDiameter; -// } -// -// /** Obsolete; replaced by setCornerDiameter(). */ -// public void setRoundRectArcSize(int cornerDiameter) { -// setCornerDiameter(cornerDiameter); -// } -// -// /** Obsolete; replaced by getCornerDiameter(). */ -// public int getRoundRectArcSize() { -// return cornerDiameter; -// } -// -// /** Sets the stack position (image number) of this ROI. In an overlay, this -// * ROI is only displayed when the stack is at the specified position. -// * Set to zero to have the ROI displayed on all images in the stack. -// * @see ij.gui.Overlay -// */ -// public void setPosition(int n) { -// if (n<0) n=0; -// position = n; -// channel = slice = frame = 0; -// hyperstackPosition = false; -// } -// -// /** Returns the stack position (image number) of this ROI, or -// * zero if the ROI is not associated with a particular stack image. -// * @see ij.gui.Overlay -// */ -// public int getPosition() { -// return position; -// } -// -// /** Sets the hyperstack position of this ROI. In an overlay, this -// * ROI is only displayed when the hyperstack is at the specified position. -// * @see ij.gui.Overlay -// */ -// public void setPosition(int channel, int slice, int frame) { -// if (channel<0) channel=0; -// this.channel = channel; -// if (slice<0) slice=0; -// this.slice = slice; -// if (frame<0) frame=0; -// this.frame = frame; -// position = 0; -// hyperstackPosition = true; -// } -// -// /** Returns 'true' if setPosition(C,Z,T) has been called. */ -// public boolean hasHyperStackPosition() { -// return hyperstackPosition; -// } -// -// /** Sets the position of this ROI based on the stack position of the specified image. */ -// public void setPosition(ImagePlus imp ) { -// if (imp==null) -// return; -// if (imp.isHyperStack()) { -// int channel = imp.getDisplayMode()==IJ.COMPOSITE?0:imp.getChannel(); -// setPosition(channel, imp.getSlice(), imp.getFrame()); -// } else if (imp.getStackSize()>1) -// setPosition(imp.getCurrentSlice()); -// else -// setPosition(0); -// } -// -// /** Returns the channel position of this ROI, or zero -// * if this ROI is not associated with a particular channel. -// */ -// public final int getCPosition() { -// return channel; -// } -// -// /** Returns the slice position of this ROI, or zero -// * if this ROI is not associated with a particular slice. -// */ -// public final int getZPosition() { -// return slice==0&&!hyperstackPosition?position:slice; -// } -// -// /** Returns the frame position of this ROI, or zero -// * if this ROI is not associated with a particular frame. -// */ -// public final int getTPosition() { -// return frame; -// } -// -// // Used by the FileSaver and RoiEncoder to save overlay settings. */ -// public void setPrototypeOverlay(Overlay overlay) { -// prototypeOverlay = new Overlay(); -// prototypeOverlay.drawLabels(overlay.getDrawLabels()); -// prototypeOverlay.drawNames(overlay.getDrawNames()); -// prototypeOverlay.drawBackgrounds(overlay.getDrawBackgrounds()); -// prototypeOverlay.setLabelColor(overlay.getLabelColor()); -// prototypeOverlay.setLabelFont(overlay.getLabelFont()); -// } -// -// // Used by the FileOpener and RoiDecoder to restore overlay settings. */ -// public Overlay getPrototypeOverlay() { -// if (prototypeOverlay!=null) -// return prototypeOverlay; -// else -// return new Overlay(); -// } -// -// /** Returns the current paste transfer mode, or NOT_PASTING (-1) -// if no paste operation is in progress. -// @see ij.process.Blitter -// */ -// public int getPasteMode() { -// if (clipboard==null) -// return NOT_PASTING; -// else -// return pasteMode; -// } -// -// /** Returns the current paste transfer mode. */ -// public static int getCurrentPasteMode() { -// return pasteMode; -// } - /** Returns 'true' if this is an area selection. */ public boolean isArea() { return (type>=RECTANGLE && type<=TRACED_ROI) || type==COMPOSITE; @@ -1794,114 +672,26 @@ public boolean isArea() { public boolean isLine() { return type>=LINE && type<=FREELINE; } - -// /** Returns 'true' if this is an ROI primarily used from drawing -// (e.g., TextRoi or Arrow). */ -// public boolean isDrawingTool() { -// //return cornerDiameter>0; -// return false; -// } - + protected double getMagnification() { -// return ic!=null?ic.getMagnification():1.0; return 1.0; } -// -// /** Convenience method that converts Roi type to a human-readable form. */ -// public String getTypeAsString() { -// String s=""; -// switch(type) { -// case POLYGON: s="Polygon"; break; -// case FREEROI: s="Freehand"; break; -// case TRACED_ROI: s="Traced"; break; -// case POLYLINE: s="Polyline"; break; -// case FREELINE: s="Freeline"; break; -// case ANGLE: s="Angle"; break; -// case LINE: s="Straight Line"; break; -// case OVAL: s="Oval"; break; -// case COMPOSITE: s = "Composite"; break; -// case POINT: s="Point"; break; -// default: -// if (this instanceof TextRoi) -// s = "Text"; -// else if (this instanceof ImageRoi) -// s = "Image"; -// else -// s = "Rectangle"; -// break; -// } -// return s; -// } -// + /** Returns true if this ROI is currently displayed on an image. */ public boolean isVisible() { return ic!=null; } -// /** Returns true if this is a slection that supports sub-pixel resolution. */ -// public boolean subPixelResolution() { -// return subPixel; -// } -// -// /** Returns true if this is a PolygonRoi that supports sub-pixel -// resolution and polygons are drawn on zoomed images offset -// down and to the right by 0.5 pixels.. */ -// public boolean getDrawOffset() { -// return false; -// } -// -// public void setDrawOffset(boolean drawOffset) { -// } -// -// public void setIgnoreClipRect(boolean ignoreClipRect) { -// this.ignoreClipRect = ignoreClipRect; -// } - /** Returns 'true' if this ROI is displayed and is also in an overlay. */ public final boolean isActiveOverlayRoi() { -// if (imp==null || this!=imp.getRoi()) - return false; -// Overlay overlay = imp.getOverlay(); -// if (overlay!=null && overlay.contains(this)) -// return true; -// ImageCanvas ic = imp.getCanvas(); -// overlay = ic!=null?ic.getShowAllList():null; // ROI Manager overlay -// return overlay!=null && overlay.contains(this); + return false; } -// /** Checks whether two rectangles are equal. */ -// public boolean equals(Object obj) { -// if (obj instanceof Roi) { -// Roi roi2 = (Roi)obj; -// if (type!=roi2.getType()) return false; -// if (!getBounds().equals(roi2.getBounds())) return false; -// if (getLength()!=roi2.getLength()) return false; -// return true; -// } else -// return false; -// } -// protected int screenX(int ox) {return ic!=null?ic.screenX(ox):ox;} protected int screenY(int oy) {return ic!=null?ic.screenY(oy):oy;} protected int screenXD(double ox) {return ic!=null?ic.screenXD(ox):(int)ox;} protected int screenYD(double oy) {return ic!=null?ic.screenYD(oy):(int)oy;} -// -// /** Converts a float array to an int array using truncation. */ -// public static int[] toInt(float[] arr) { -// return toInt(arr, null, arr.length); -// } -// -// public static int[] toInt(float[] arr, int[] arr2, int size) { -// int n = arr.length; -// if (size>n) size=n; -// int[] temp = arr2; -// if (temp==null || temp.length -// * Author: Peter Haub (phaub at dipsystems.de) -// */ -// public double[] getContourCentroid() { -// double xC=0, yC=0, lSum=0, x, y, dx, dy, l; -// FloatPolygon poly = getFloatPolygon(); -// int nPoints = poly.npoints; -// int n2 = nPoints-1; -// for (int n1=0; n1 * Author: Wilhelm Burger - * @see #getContainedPoints() - * @see #getContainedFloatPoints() */ public Iterator iterator() { // Returns the default (mask-based) point iterator. Note that 'Line' overrides the // iterator() method and returns a specific point iterator. return new RoiPointsIteratorMask(); } - /** * Default iterator over points contained in a mask-backed {@link Roi}. @@ -2177,18 +771,10 @@ private class RoiPointsIteratorMask implements Iterator { private int next; RoiPointsIteratorMask() { -// if (isLine()) { -// Roi roi2 = Selection.lineToArea(Roi.this); -// mask = roi2.getMask(); -// bounds = roi2.getBounds(); -// xbase = roi2.x; -// ybase = roi2.y; -// } else { mask = getMask(); bounds = getBounds(); xbase = Roi.this.x; ybase = Roi.this.y; -// } n = bounds.width * bounds.height; findNext(0); // sets next } @@ -2216,17 +802,6 @@ public void remove() { // finds the next element (from start), sets next private void findNext(int start) { throw new UnsupportedOperationException(); -// if (mask == null) -// next = start; -// else { -// next = n; -// for (int i=start; i=15.0) { - roi = new PolygonRoi(xPoints, yPoints, n, POLYGON); - } - } - break; + int n = xPoints.length; + roi = new PolygonRoi(xPoints, yPoints, n, roiType); + if (roiType==FREEROI) { + double length = roi.getLength(); + if (length/n>=15.0) { + roi = new PolygonRoi(xPoints, yPoints, n, POLYGON); + } } - //if(roi!=null && imp!=null) roi.setImage(imp); return roi; } @@ -598,175 +568,6 @@ public boolean contains(int x, int y) { return shape.contains(x-this.x, y-this.y); } -// /** Caculates "Feret" (maximum caliper width) and "MinFeret" (minimum caliper width). */ -// public double[] getFeretValues() { -// Roi[] rois = getRois(); -// if (rois!=null && rois.length==1) { -// rois[0].setImage(imp); -// return rois[0].getFeretValues(); -// } -// double min=Double.MAX_VALUE, diameter=0.0, angle=0.0; -// int p1=0, p2=0; -// double pw=1.0, ph=1.0; -// if (imp!=null) { -// Calibration cal = imp.getCalibration(); -// pw = cal.pixelWidth; -// ph = cal.pixelHeight; -// } -// Shape shape = getShape(); -// Shape s = null; -// Rectangle2D r = shape.getBounds2D(); -// double cx = r.getX() + r.getWidth()/2; -// double cy = r.getY() + r.getHeight()/2; -// AffineTransform at = new AffineTransform(); -// at.translate(cx, cy); -// for (int i=0; i<181; i++) { -// at.rotate(Math.PI/180.0); -// s = at.createTransformedShape(shape); -// r = s.getBounds2D(); -// double max2 = Math.max(r.getWidth(), r.getHeight()); -// if (max2>diameter) { -// diameter = max2*pw; -// //angle = i; -// } -// double min2 = Math.min(r.getWidth(), r.getHeight()); -// min = Math.min(min, min2); -// } -// if (pw!=ph) { -// diameter = 0.0; -// angle = 0.0; -// } -// if (pw==ph) -// min *= pw; -// else { -// min = 0.0; -// angle = 0.0; -// } -// double[] a = new double[5]; -// a[0] = diameter; -// a[1] = angle; -// a[2] = min; -// a[3] = 0.0; // FeretX -// a[4] = 0.0; // FeretY -// return a; -// } - -// /**Returns the perimeter if this ShapeRoi can be decomposed -// into simple ROIs, otherwise returns zero. */ -// public double getLength() { -// if (width==0 && height==0) -// return 0.0; -// double length = 0.0; -// Roi[] rois = getRois(); -// ImagePlus imp2 = getImage(); -// if (rois!=null) { -// for (int i=0; i -// * "Jens Gravesen. Adaptive subdivision and the length and energy of Bézier curves. Computational Geometry 8:13-31 (1997)" -// * implemented using java.awt.geom.CubicCurve2D.Double. -// * Please visit {@link Graphics Gems IV} for -// * examples of other possible implementations in C and C++. -// */ -// double cBezLength(CubicCurve2D.Double c) { -// double l = 0.0; -// double cl = cclength(c); -// double pl = cplength(c); -// if((pl-cl)/2.0 > maxerror) -// { -// CubicCurve2D.Double[] cc = cBezSplit(c); -// for(int i=0; i<2; i++) l+=cBezLength(cc[i]); -// return l; -// } -// l = 0.5*pl+0.5*cl; -// return l; -// } -// -// /**Calculates the length of a quadratic Bézier curve specified in double precision. -// * The algorithm is based on the theory presented in paper
-// * "Jens Gravesen. Adaptive subdivision and the length and energy of Bézier curves. Computational Geometry 8:13-31 (1997)" -// * implemented using java.awt.geom.CubicCurve2D.Double. -// * Please visit {@link Graphics Gems IV} for -// * examples of other possible implementations in C and C++. -// */ -// double qBezLength(QuadCurve2D.Double c) { -// double l = 0.0; -// double cl = qclength(c); -// double pl = qplength(c); -// if((pl-cl)/2.0 > maxerror) -// { -// QuadCurve2D.Double[] cc = qBezSplit(c); -// for(int i=0; i<2; i++) l+=qBezLength(cc[i]); -// return l; -// } -// l = (2.0*pl+cl)/3.0; -// return l; -// } -// -// /**Splits a cubic Bézier curve in half. -// * @param c A cubic Bézier curve to be divided -// * @return an array with the left and right cubic Bézier subcurves -// * -// */ -// CubicCurve2D.Double[] cBezSplit(CubicCurve2D.Double c) { -// CubicCurve2D.Double[] cc = new CubicCurve2D.Double[2]; -// for (int i=0; i<2 ; i++) cc[i] = new CubicCurve2D.Double(); -// c.subdivide(cc[0],cc[1]); -// return cc; -// } -// -// /**Splits a quadratic Bézier curve in half. -// * @param c A quadratic Bézier curve to be divided -// * @return an array with the left and right quadratic Bézier subcurves -// * -// */ -// QuadCurve2D.Double[] qBezSplit(QuadCurve2D.Double c) { -// QuadCurve2D.Double[] cc = new QuadCurve2D.Double[2]; -// for(int i=0; i<2; i++) cc[i] = new QuadCurve2D.Double(); -// c.subdivide(cc[0],cc[1]); -// return cc; -// } - - // c is an array of even length with x0, y0, x1, y1, ... ,xn, yn coordinate pairs /**Scales a coordinate array with the size calibration of a 2D image. * The array is modified in place. * @param c Array of coordinates in double precision with a fixed structure:
@@ -785,65 +586,6 @@ void scaleCoords(double[] c, double pw, double ph) { } } -// Vector parseSegments(PathIterator pI) { -// Vector v = new Vector(); -// if (parsePath(pI, null, v, null, null)) return v; -// return null; -// } -// -// /** Retrieves the end points and control points of the path as a float array. The array -// contains a sequence of variable length segments that use from from one to seven elements. -// The first element of a segment is the type as defined in the PathIterator interface. SEG_MOVETO -// and SEG_LINETO segments also include two coordinates, SEG_QUADTO segments include four -// coordinates and SEG_CUBICTO segments include six coordinates. */ -// public float[] getShapeAsArray() { -// if(shape==null) return null; -// //if (savedRois!=null) -// // return getSavedRoisAsArray(); -// PathIterator pIt = shape.getPathIterator(new AffineTransform()); -// Vector h = new Vector(); // handles -// Vector s = new Vector(); // segment types -// if (!(parsePath(pIt, null, s, null, h))) return null; -// float[] result = new float[7*s.size()]; -// Point2D.Double p; -// int segType; -// int k=0, j=0; -// int index = 0; -// for (int i=0; i0) { closed = ((int)ux0==(int)usX && (int)uy0==(int)usY); if (closed && (int)ux0!=(int)usX && (int)uy0!=(int)usY) { // this may only happen after a SEG_CLOSE - xCoords.add(new Integer(((Integer)xCoords.elementAt(0)).intValue())); - yCoords.add(new Integer(((Integer)yCoords.elementAt(0)).intValue())); + xCoords.add(Integer.valueOf(((Integer)xCoords.elementAt(0)).intValue())); + yCoords.add(Integer.valueOf(((Integer)yCoords.elementAt(0)).intValue())); } if (rois!=null) { roiType = guessType(count, linesOnly, curvesOnly, closed); @@ -933,8 +670,8 @@ boolean parsePath(PathIterator pIter, double[] params, Vector segments, Vector r x0 = coords[0]; y0 = coords[1]; handles.add(new Point2D.Double(ucoords[0],ucoords[1])); - xCoords.add(new Integer((int)ucoords[0])); - yCoords.add(new Integer((int)ucoords[1])); + xCoords.add(Integer.valueOf((int)ucoords[0])); + yCoords.add(Integer.valueOf((int)ucoords[1])); closed = false; break; case PathIterator.SEG_LINETO: @@ -946,41 +683,10 @@ boolean parsePath(PathIterator pIter, double[] params, Vector segments, Vector r x0 = coords[0]; y0 = coords[1]; handles.add(new Point2D.Double(ucoords[0],ucoords[1])); - xCoords.add(new Integer((int)ucoords[0])); - yCoords.add(new Integer((int)ucoords[1])); + xCoords.add(Integer.valueOf((int)ucoords[0])); + yCoords.add(Integer.valueOf((int)ucoords[1])); closed = ((int)ux0==(int)usX && (int)uy0==(int)usY); break; -// case PathIterator.SEG_QUADTO: -// linesOnly = linesOnly & false; -// curvesOnly = curvesOnly & true; -// curve = new QuadCurve2D.Double(x0,y0,coords[0],coords[2],coords[2],coords[3]); -// pathLength += qBezLength((QuadCurve2D.Double)curve); -// ux0 = ucoords[2]; -// uy0 = ucoords[3]; -// x0 = coords[2]; -// y0 = coords[3]; -// handles.add(new Point2D.Double(ucoords[0],ucoords[1])); -// handles.add(new Point2D.Double(ucoords[2],ucoords[3])); -// xCoords.add(new Integer((int)ucoords[2])); -// yCoords.add(new Integer((int)ucoords[3])); -// closed = ((int)ux0==(int)usX && (int)uy0==(int)usY); -// break; -// case PathIterator.SEG_CUBICTO: -// linesOnly = linesOnly & false; -// curvesOnly = curvesOnly & true; -// curve = new CubicCurve2D.Double(x0,y0,coords[0],coords[1],coords[2],coords[3],coords[4],coords[5]); -// pathLength += cBezLength((CubicCurve2D.Double)curve); -// ux0 = ucoords[4]; -// uy0 = ucoords[5]; -// x0 = coords[4]; -// y0 = coords[5]; -// handles.add(new Point2D.Double(ucoords[0],ucoords[1])); -// handles.add(new Point2D.Double(ucoords[2],ucoords[3])); -// handles.add(new Point2D.Double(ucoords[4],ucoords[5])); -// xCoords.add(new Integer((int)ucoords[4])); -// yCoords.add(new Integer((int)ucoords[5])); -// closed = ((int)ux0==(int)usX && (int)uy0==(int)usY); -// break; case PathIterator.SEG_CLOSE: if((int)ux0 != (int)usX && (int)uy0 != (int)usY) pathLength += Math.sqrt(Math.pow((x0-sX),2.0) + Math.pow((y0-sY),2.0)); closed = true; @@ -992,8 +698,8 @@ boolean parsePath(PathIterator pIter, double[] params, Vector segments, Vector r done = pIter.isDone() || (shapeToRoi&&rois!=null&&rois.size()==1); if (done) { if(closed && (int)x0!=(int)sX && (int)y0!=(int)sY) { // this may only happen after a SEG_CLOSE - xCoords.add(new Integer(((Integer)xCoords.elementAt(0)).intValue())); - yCoords.add(new Integer(((Integer)yCoords.elementAt(0)).intValue())); + xCoords.add(Integer.valueOf(((Integer)xCoords.elementAt(0)).intValue())); + yCoords.add(Integer.valueOf(((Integer)yCoords.elementAt(0)).intValue())); } if (rois!=null) { roiType = shapeToRoi?TRACED_ROI:guessType(count+1, linesOnly, curvesOnly, closed); @@ -1011,15 +717,12 @@ boolean parsePath(PathIterator pIter, double[] params, Vector segments, Vector r public void draw(Graphics g) { Color color = strokeColor!=null? strokeColor:ROIColor; boolean isActiveOverlayRoi = !overlay && isActiveOverlayRoi(); - //IJ.log("draw: "+overlay+" "+isActiveOverlayRoi); if (isActiveOverlayRoi) color = Color.cyan; - if (fillColor!=null) color = fillColor; + if (fillColor != null) color = fillColor; g.setColor(color); AffineTransform aTx = (((Graphics2D)g).getDeviceConfiguration()).getDefaultTransform(); Graphics2D g2d = (Graphics2D)g; -// if (stroke!=null && !isActiveOverlayRoi) -// g2d.setStroke((ic!=null&&ic.getCustomRoi())||isCursor()?stroke:getScaledStroke()); mag = getMagnification(); int basex=0, basey=0; if (ic!=null) { @@ -1028,65 +731,12 @@ public void draw(Graphics g) { } aTx.setTransform(mag, 0.0, 0.0, mag, -basex*mag, -basey*mag); aTx.translate(x, y); - if (fillColor!=null) { -// if (isActiveOverlayRoi) { -// g2d.setColor(Color.cyan); -// g2d.draw(aTx.createTransformedShape(shape)); -// } else -// g2d.fill(aTx.createTransformedShape(shape)); - } else + if (fillColor == null) { g2d.draw(aTx.createTransformedShape(shape)); + } if (stroke!=null) g2d.setStroke(defaultStroke); -// if (Toolbar.getToolId()==Toolbar.OVAL) -// drawRoiBrush(g); -// if (state!=NORMAL && imp!=null && imp.getRoi()!=null) -// showStatus(); -// if (updateFullWindow) -// {updateFullWindow = false; imp.draw();} } -// public void drawRoiBrush(Graphics g) { -// g.setColor(ROIColor); -// int size = Toolbar.getBrushSize(); -// if (size==0 || ic==null) -// return; -// int flags = ic.getModifiers(); -// if ((flags&16)==0) return; // exit if mouse button up -// size = (int)(size*mag); -// Point p = ic.getCursorLoc(); -// int sx = ic.screenX(p.x); -// int sy = ic.screenY(p.y); -// g.drawOval(sx-size/2, sy-size/2, size, size); -// } - -// /**Draws the shape of this object onto the specified ImageProcessor. -// *
This method will always draw a flattened version of the actual shape -// * (i.e., all curve segments will be approximated by line segments). -// */ -// public void drawPixels(ImageProcessor ip) { -// PathIterator pIter = shape.getPathIterator(new AffineTransform(), flatness); -// float[] coords = new float[6]; -// float sx=0f, sy=0f; -// while (!pIter.isDone()) { -// int segType = pIter.currentSegment(coords); -// switch(segType) { -// case PathIterator.SEG_MOVETO: -// sx = coords[0]; -// sy = coords[1]; -// ip.moveTo(x+(int)sx, y+(int)sy); -// break; -// case PathIterator.SEG_LINETO: -// ip.lineTo(x+(int)coords[0], y+(int)coords[1]); -// break; -// case PathIterator.SEG_CLOSE: -// ip.lineTo(x+(int)sx, y+(int)sy); -// break; -// default: break; -// } -// pIter.next(); -// } -// } - /** Returns this ROI's mask pixels as a ByteProcessor with pixels "in" the mask set to white (255) and pixels "outside" the mask set to black (0). */ public ImageProcessor getMask() { From 810ad1843aef63f8bb82f7a81fd987b043a3a62f Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Tue, 23 Jun 2026 10:56:36 -0400 Subject: [PATCH 11/12] change memory usage calls with memory mxbean methods --- .../workstation/core/util/SystemInfo.java | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java b/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java index eceb7fe367..4cf3d1d17b 100644 --- a/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java +++ b/modules/Core/src/main/java/org/janelia/workstation/core/util/SystemInfo.java @@ -1,11 +1,14 @@ package org.janelia.workstation.core.util; +import java.io.File; +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.MemoryUsage; + import org.openide.modules.InstalledFileLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; - /** * Adapted from IDEA code base. * @@ -140,41 +143,24 @@ public static String getInstallDir() { return cp.substring(0,cp.indexOf("JaneliaWorkstation")+"JaneliaWorkstation".length()); } - private static java.lang.management.OperatingSystemMXBean getOSMXBean() { - return java.lang.management.ManagementFactory.getOperatingSystemMXBean(); - } - public static Long getTotalSystemMemory() { try { - java.lang.management.OperatingSystemMXBean mxbean = getOSMXBean(); - // JDK 14+ public API: getTotalMemorySize(); earlier public alias is getTotalPhysicalMemorySize on com.sun. - // Use reflection so the code compiles cleanly against the standard API on both JDK 14+ and earlier. - try { - return (Long) mxbean.getClass().getMethod("getTotalMemorySize").invoke(mxbean); - } catch (NoSuchMethodException e2) { - // Fallback for JDK < 14 (should not happen on JDK 21) - return (Long) mxbean.getClass().getMethod("getTotalPhysicalMemorySize").invoke(mxbean); - } + MemoryMXBean memXBean = ManagementFactory.getMemoryMXBean(); + return memXBean.getHeapMemoryUsage().getInit(); } - catch (Throwable e) { - log.error("Could not retrieve total system memory", e); - return null; + catch (Exception e) { + throw new IllegalStateException("Could not retrieve total system memory", e); } } public static Long getFreeSystemMemory() { try { - java.lang.management.OperatingSystemMXBean mxbean = getOSMXBean(); - try { - return (Long) mxbean.getClass().getMethod("getFreeMemorySize").invoke(mxbean); - } catch (NoSuchMethodException e2) { - // Fallback for JDK < 14 - return (Long) mxbean.getClass().getMethod("getFreePhysicalMemorySize").invoke(mxbean); - } + MemoryMXBean memXBean = ManagementFactory.getMemoryMXBean(); + MemoryUsage memUsage = memXBean.getHeapMemoryUsage(); + return memUsage.getInit() - memUsage.getUsed(); } catch (Throwable e) { - log.error("Could not retrieve free system memory", e); - return null; + throw new IllegalStateException("Could not retrieve free system memory", e); } } From b39b67a2f73892504798fd6587f850274c95bce3 Mon Sep 17 00:00:00 2001 From: Cristian Goina Date: Tue, 23 Jun 2026 11:29:45 -0400 Subject: [PATCH 12/12] formatting --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1e3d3abd25..abcaa8d971 100644 --- a/pom.xml +++ b/pom.xml @@ -1245,7 +1245,7 @@ modules/IntegrationAPIs modules/Core modules/CommonGUI -modules/DataBrowser + modules/DataBrowser modules/LMDataBrowser modules/ColorDepthSearch modules/HortaTracer