diff --git a/core/src/main/java/com/github/weisj/darklaf/DarkLaf.java b/core/src/main/java/com/github/weisj/darklaf/DarkLaf.java index 259fdc07..31c12d21 100644 --- a/core/src/main/java/com/github/weisj/darklaf/DarkLaf.java +++ b/core/src/main/java/com/github/weisj/darklaf/DarkLaf.java @@ -24,11 +24,11 @@ package com.github.weisj.darklaf; import com.github.weisj.darklaf.components.border.DarkBorders; -import com.github.weisj.darklaf.platform.windows.JNIDecorations; +import com.github.weisj.darklaf.decorations.JNIDecorations; +import com.github.weisj.darklaf.platform.SystemInfo; import com.github.weisj.darklaf.theme.Theme; import com.github.weisj.darklaf.ui.popupmenu.DarkPopupMenuUI; import com.github.weisj.darklaf.util.PropertyLoader; -import com.github.weisj.darklaf.platform.SystemInfo; import sun.awt.AppContext; import javax.swing.*; @@ -55,7 +55,6 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener private static final Logger LOGGER = Logger.getLogger(DarkLaf.class.getName()); private static final String NAME = "Darklaf"; - private static boolean decorationsEnabled = true; private final BasicLookAndFeel base; /** @@ -77,22 +76,6 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener } - public static boolean isDecorationsEnabled() { - return LafManager.getTheme().useCustomDecorations() && decorationsEnabled; - } - - public static void setDecorationsEnabled(final boolean decorationsEnabled) { - if (DarkLaf.decorationsEnabled != decorationsEnabled) { - DarkLaf.decorationsEnabled = decorationsEnabled; - if (decorationsEnabled) { - boolean update = JNIDecorations.updateLibrary(); - if (update) { - LafManager.updateLaf(); - } - } - } - } - @Override public UIDefaults getDefaults() { try { @@ -104,10 +87,9 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener initInputMapDefaults(defaults); loadThemeDefaults(defaults); initIdeaDefaults(defaults); - patchComboBox(metalDefaults, defaults); - JFrame.setDefaultLookAndFeelDecorated(true); - JDialog.setDefaultLookAndFeelDecorated(true); + patchComboBox(metalDefaults, defaults); + setupDecorations(); return defaults; } catch (final Exception e) { @@ -116,6 +98,12 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener return super.getDefaults(); } + private void setupDecorations() { + JNIDecorations.updateLibrary(); + JFrame.setDefaultLookAndFeelDecorated(true); + JDialog.setDefaultLookAndFeelDecorated(true); + } + protected void adjustPlatformSpecifics(final Properties uiProps) { boolean useScreenMenuBar = Boolean.getBoolean("apple.laf.useScreenMenuBar"); // If user wants to use Apple menu bar, then we need to keep the default @@ -184,7 +172,6 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener StyleSheet styleSheet = currentTheme.loadStyleSheet(); new HTMLEditorKit().setStyleSheet(styleSheet); - setDecorationsEnabled(currentTheme.useCustomDecorations()); } @SuppressWarnings({"HardCodedStringLiteral"}) @@ -388,8 +375,9 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener @Override public boolean getSupportsWindowDecorations() { - return LafManager.getTheme().useCustomDecorations() - && JNIDecorations.isCustomDecorationSupported(); + return LafManager.isDecorationsEnabled() + && LafManager.getTheme().useCustomDecorations() + && JNIDecorations.isCustomDecorationSupported(); } diff --git a/core/src/main/java/com/github/weisj/darklaf/LafManager.java b/core/src/main/java/com/github/weisj/darklaf/LafManager.java index ddec6405..785551a1 100644 --- a/core/src/main/java/com/github/weisj/darklaf/LafManager.java +++ b/core/src/main/java/com/github/weisj/darklaf/LafManager.java @@ -44,6 +44,7 @@ public final class LafManager { private static Theme theme; private static boolean logEnabled = false; + private static boolean decorationsOverwrite = true; static { /* @@ -76,6 +77,32 @@ public final class LafManager { LafManager.logEnabled = logEnabled; } + /** + * Returns whther custom decorations should be used. + * If this returns true decorations still might not be used if the theme or platform don't support them. + * + * @return true if decorations should be used. + */ + public static boolean isDecorationsEnabled() { + return decorationsOverwrite; + } + + /** + * Set globally whether decorations are enabled. By default this is true. + * Decorations are used if this value is set to true and the current platform and theme support + * custom decorations. + * + * @param enabled true if decorations should be used if available. + */ + public static void setDecorationsEnabled(final boolean enabled) { + if (decorationsOverwrite != enabled) { + decorationsOverwrite = enabled; + if (!decorationsOverwrite) { + updateLaf(); + } + } + } + /** * Get the current theme. This method will never return null even if the LaF isn#t currently installed. * diff --git a/core/src/main/java/com/github/weisj/darklaf/decorations/DefaultDecorationsProvider.java b/core/src/main/java/com/github/weisj/darklaf/decorations/DefaultDecorationsProvider.java new file mode 100644 index 00000000..f553b863 --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/DefaultDecorationsProvider.java @@ -0,0 +1,49 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.weisj.darklaf.decorations; + +import com.github.weisj.darklaf.ui.rootpane.CustomTitlePane; + +import javax.swing.*; + +public class DefaultDecorationsProvider implements JNIDecorationsProvider { + @Override + public CustomTitlePane createTitlePane(final JRootPane rootPane) { + return new CustomTitlePane() { + @Override + public void uninstall() { + } + }; + } + + @Override + public boolean isCustomDecorationSupported() { + return false; + } + + @Override + public boolean updateLibrary() { + return false; + } +} diff --git a/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorations.java b/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorations.java new file mode 100644 index 00000000..10a07ab5 --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorations.java @@ -0,0 +1,57 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.weisj.darklaf.decorations; + +import com.github.weisj.darklaf.decorations.windows.WindowsDecorationsProvider; +import com.github.weisj.darklaf.platform.SystemInfo; +import com.github.weisj.darklaf.ui.rootpane.CustomTitlePane; + +import javax.swing.*; + +public final class JNIDecorations { + + private static JNIDecorationsProvider decorationsProvider; + + static { + //Extend for different platforms. + if (SystemInfo.isWindows) { + decorationsProvider = new WindowsDecorationsProvider(); + } else { + decorationsProvider = new DefaultDecorationsProvider(); + } + } + + public static CustomTitlePane createTitlePane(final JRootPane rootPane) { + return decorationsProvider.createTitlePane(rootPane); + } + + + public static boolean isCustomDecorationSupported() { + return decorationsProvider.isCustomDecorationSupported(); + } + + public static boolean updateLibrary() { + return decorationsProvider.updateLibrary(); + } +} diff --git a/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorationsProvider.java b/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorationsProvider.java new file mode 100644 index 00000000..9a37645a --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorationsProvider.java @@ -0,0 +1,53 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.weisj.darklaf.decorations; + +import com.github.weisj.darklaf.ui.rootpane.CustomTitlePane; + +import javax.swing.*; + +public interface JNIDecorationsProvider { + + /** + * Create the custom title pane. + * + * @param rootPane The root pane to create the title pane for. + * @return the custom title pane. + */ + CustomTitlePane createTitlePane(final JRootPane rootPane); + + /** + * Returns whether custom decorations are supported. + * + * @return true if decorations are supported. + */ + boolean isCustomDecorationSupported(); + + /** + * Load the decorations library if necessary. + * + * @return true if successful and library wasn't already loaded. + */ + boolean updateLibrary(); +} diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CloseButtonUI.java b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/CloseButtonUI.java similarity index 97% rename from core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CloseButtonUI.java rename to core/src/main/java/com/github/weisj/darklaf/decorations/windows/CloseButtonUI.java index 5adf62d2..c43a203e 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CloseButtonUI.java +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/CloseButtonUI.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package com.github.weisj.darklaf.ui.rootpane; +package com.github.weisj.darklaf.decorations.windows; import com.github.weisj.darklaf.ui.button.DarkButtonUI; diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkTitlePane.java b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/DarkTitlePaneWindows.java similarity index 95% rename from core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkTitlePane.java rename to core/src/main/java/com/github/weisj/darklaf/decorations/windows/DarkTitlePaneWindows.java index 487a05e5..e68c100e 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkTitlePane.java +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/DarkTitlePaneWindows.java @@ -22,11 +22,12 @@ * SOFTWARE. */ -package com.github.weisj.darklaf.ui.rootpane; +package com.github.weisj.darklaf.decorations.windows; import com.github.weisj.darklaf.decorators.AncestorAdapter; import com.github.weisj.darklaf.icons.ScaledIcon; -import com.github.weisj.darklaf.platform.windows.JNIDecorations; +import com.github.weisj.darklaf.platform.windows.JNIDecorationsWindows; +import com.github.weisj.darklaf.ui.rootpane.CustomTitlePane; import com.github.weisj.darklaf.util.Scale; import sun.awt.SunToolkit; @@ -36,12 +37,7 @@ import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import javax.swing.plaf.UIResource; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; +import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; @@ -50,7 +46,7 @@ import java.util.List; * @author Konstantin Bulenkov * @author Jannis Weis */ -public class DarkTitlePane extends JComponent { +public class DarkTitlePaneWindows extends CustomTitlePane { private static final int PAD = 5; private static final int BAR_HEIGHT = 28; private static final int BUTTON_WIDTH = 46; @@ -133,7 +129,7 @@ public class DarkTitlePane extends JComponent { private Color activeForeground; private Color border; - public DarkTitlePane(final JRootPane root) { + public DarkTitlePaneWindows(final JRootPane root) { this.rootPane = root; rootPane.addContainerListener(rootPaneContainerListener); rootPane.getLayeredPane().addContainerListener(layeredPaneContainerListener); @@ -192,7 +188,7 @@ public class DarkTitlePane extends JComponent { protected void uninstallDecorations() { window = null; - JNIDecorations.uninstallDecorations(windowHandle); + JNIDecorationsWindows.uninstallDecorations(windowHandle); windowHandle = 0; rootPane.removeContainerListener(rootPaneContainerListener); rootPane.getLayeredPane().removeContainerListener(layeredPaneContainerListener); @@ -205,12 +201,12 @@ public class DarkTitlePane extends JComponent { public void install() { if (window != null) { if (window instanceof Dialog || window instanceof Frame) { - windowHandle = JNIDecorations.getHWND(window); + windowHandle = JNIDecorationsWindows.getHWND(window); - JNIDecorations.installDecorations(windowHandle); + JNIDecorationsWindows.installDecorations(windowHandle); updateResizeBehaviour(); Color color = window.getBackground(); - JNIDecorations.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue()); + JNIDecorationsWindows.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue()); } if (window instanceof Frame) { @@ -240,7 +236,7 @@ public class DarkTitlePane extends JComponent { private WindowListener createWindowListener() { - return new DarkTitlePane.WindowHandler(); + return new DarkTitlePaneWindows.WindowHandler(); } @@ -363,15 +359,15 @@ public class DarkTitlePane extends JComponent { } private void minimize() { - JNIDecorations.minimize(windowHandle); + JNIDecorationsWindows.minimize(windowHandle); } private void maximize() { - JNIDecorations.maximize(windowHandle); + JNIDecorationsWindows.maximize(windowHandle); } private void restore() { - JNIDecorations.restore(windowHandle); + JNIDecorationsWindows.restore(windowHandle); } private void createActions() { @@ -473,7 +469,7 @@ public class DarkTitlePane extends JComponent { boolean res = isResizable(window, rootPane); if (oldResizable != res) { oldResizable = res; - JNIDecorations.setResizable(windowHandle, res); + JNIDecorationsWindows.setResizable(windowHandle, res); } } @@ -716,9 +712,9 @@ public class DarkTitlePane extends JComponent { right = tmp; } - JNIDecorations.updateValues(windowHandle, Scale.scaleWidth(left), - Scale.scaleWidth(right), - Scale.scaleHeight(height)); + JNIDecorationsWindows.updateValues(windowHandle, Scale.scaleWidth(left), + Scale.scaleWidth(right), + Scale.scaleHeight(height)); } @@ -748,7 +744,7 @@ public class DarkTitlePane extends JComponent { setState(frame.getExtendedState(), true); } if ("resizable".equals(name)) { - JNIDecorations.setResizable(windowHandle, Boolean.TRUE.equals(pce.getNewValue())); + JNIDecorationsWindows.setResizable(windowHandle, Boolean.TRUE.equals(pce.getNewValue())); getRootPane().repaint(); } } else if ("title".equals(name)) { @@ -763,7 +759,7 @@ public class DarkTitlePane extends JComponent { repaint(); } else if ("background".equals(name) && pce.getNewValue() instanceof Color) { Color color = (Color) pce.getNewValue(); - JNIDecorations.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue()); + JNIDecorationsWindows.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue()); } } } diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/TitlePaneIcon.java b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/TitlePaneIcon.java similarity index 97% rename from core/src/main/java/com/github/weisj/darklaf/ui/rootpane/TitlePaneIcon.java rename to core/src/main/java/com/github/weisj/darklaf/decorations/windows/TitlePaneIcon.java index dd6e6b4c..30ce48c3 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/TitlePaneIcon.java +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/TitlePaneIcon.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package com.github.weisj.darklaf.ui.rootpane; +package com.github.weisj.darklaf.decorations.windows; import javax.swing.*; import java.awt.*; diff --git a/core/src/main/java/com/github/weisj/darklaf/decorations/windows/WindowsDecorationsProvider.java b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/WindowsDecorationsProvider.java new file mode 100644 index 00000000..eb49ed18 --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/decorations/windows/WindowsDecorationsProvider.java @@ -0,0 +1,48 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.weisj.darklaf.decorations.windows; + +import com.github.weisj.darklaf.decorations.JNIDecorationsProvider; +import com.github.weisj.darklaf.platform.windows.JNIDecorationsWindows; +import com.github.weisj.darklaf.ui.rootpane.CustomTitlePane; + +import javax.swing.*; + +public class WindowsDecorationsProvider implements JNIDecorationsProvider { + + @Override + public CustomTitlePane createTitlePane(final JRootPane rootPane) { + return new DarkTitlePaneWindows(rootPane); + } + + @Override + public boolean isCustomDecorationSupported() { + return JNIDecorationsWindows.isCustomDecorationSupported(); + } + + @Override + public boolean updateLibrary() { + return JNIDecorationsWindows.updateLibrary(); + } +} diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java b/core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java index f9ae89f2..c5017d54 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java @@ -23,8 +23,8 @@ */ package com.github.weisj.darklaf.ui.internalframe; +import com.github.weisj.darklaf.decorations.windows.TitlePaneIcon; import com.github.weisj.darklaf.icons.EmptyIcon; -import com.github.weisj.darklaf.ui.rootpane.TitlePaneIcon; import sun.swing.SwingUtilities2; import javax.accessibility.AccessibleContext; diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CustomTitlePane.java b/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CustomTitlePane.java new file mode 100644 index 00000000..a0e82aa9 --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CustomTitlePane.java @@ -0,0 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.weisj.darklaf.ui.rootpane; + +import javax.swing.*; + +public abstract class CustomTitlePane extends JComponent { + + + public abstract void uninstall(); +} diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java b/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java index 1e4b3162..f7530cbb 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java @@ -24,7 +24,7 @@ package com.github.weisj.darklaf.ui.rootpane; -import com.github.weisj.darklaf.platform.windows.JNIDecorations; +import com.github.weisj.darklaf.decorations.JNIDecorations; import javax.swing.*; import javax.swing.plaf.ComponentUI; @@ -42,7 +42,7 @@ import java.beans.PropertyChangeListener; */ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener { private Window window; - private DarkTitlePane titlePane; + private CustomTitlePane titlePane; private LayoutManager layoutManager; private LayoutManager oldLayout; private JRootPane rootPane; @@ -139,7 +139,7 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener } private void installClientDecorations(final JRootPane root) { - DarkTitlePane titlePane = createTitlePane(root); + CustomTitlePane titlePane = JNIDecorations.createTitlePane(root); setTitlePane(root, titlePane); updateWindow(root.getParent()); installLayout(root); @@ -154,11 +154,7 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener } } - protected DarkTitlePane createTitlePane(final JRootPane root) { - return new DarkTitlePane(root); - } - - private void setTitlePane(final JRootPane root, final DarkTitlePane titlePane) { + private void setTitlePane(final JRootPane root, final CustomTitlePane titlePane) { JLayeredPane layeredPane = root.getLayeredPane(); JComponent oldTitlePane = getTitlePane(); @@ -222,8 +218,11 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener if (currWindow != null) { if (currWindow != window) { - if (!JNIDecorations.isCustomDecorationSupported()) return; - if (rootPane.getWindowDecorationStyle() == JRootPane.NONE) return; + if (!JNIDecorations.isCustomDecorationSupported() + || rootPane.getWindowDecorationStyle() == JRootPane.NONE) { + uninstallClientDecorations(rootPane); + return; + } updateClientDecoration(); } window = currWindow; diff --git a/windows/src/main/cpp/JNIDecorations.cpp b/windows/src/main/cpp/JNIDecorations.cpp index 9e17b54c..734a5f0a 100644 --- a/windows/src/main/cpp/JNIDecorations.cpp +++ b/windows/src/main/cpp/JNIDecorations.cpp @@ -22,7 +22,7 @@ * SOFTWARE. */ #include "JNIDecorations.h" -#include "com_github_weisj_darklaf_platform_windows_JNIDecorations.h" +#include "com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows.h" #include #include #include @@ -130,7 +130,7 @@ LRESULT CALLBACK WindowWrapper::WindowProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_ } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setResizable(JNIEnv *env, jclass obj, jlong hwnd, jboolean res) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_setResizable(JNIEnv *env, jclass obj, jlong hwnd, jboolean res) { HWND handle = reinterpret_cast(hwnd); auto wrap = wrapper_map[handle]; @@ -141,7 +141,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setResizable(JNIEn } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_updateValues(JNIEnv *env, jclass obj, jlong hwnd, +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_updateValues(JNIEnv *env, jclass obj, jlong hwnd, jint l, jint r, jint h) { HWND handle = reinterpret_cast(hwnd); @@ -155,7 +155,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_updateValues(JNIEn } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setBackground(JNIEnv *env, jclass obj, jlong hwnd, jint r, jint g, jint b) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_setBackground(JNIEnv *env, jclass obj, jlong hwnd, jint r, jint g, jint b) { HWND handle = reinterpret_cast(hwnd); auto wrap = wrapper_map[handle]; @@ -166,7 +166,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setBackground(JNIE } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_installDecorations(JNIEnv *env, jclass obj, jlong hwnd) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_installDecorations(JNIEnv *env, jclass obj, jlong hwnd) { HWND handle = reinterpret_cast(hwnd); @@ -194,7 +194,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_installDecorations } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_uninstallDecorations(JNIEnv *env, jclass obj, jlong hwnd) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_uninstallDecorations(JNIEnv *env, jclass obj, jlong hwnd) { HWND handle = reinterpret_cast(hwnd); auto wrap = wrapper_map[handle]; @@ -209,21 +209,21 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_uninstallDecoratio //Window functions. JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_minimize(JNIEnv *env, jclass obj, jlong hwnd) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_minimize(JNIEnv *env, jclass obj, jlong hwnd) { HWND handle = reinterpret_cast(hwnd); ShowWindow(handle, SW_MINIMIZE); } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_maximize(JNIEnv *env, jclass obj, jlong hwnd) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_maximize(JNIEnv *env, jclass obj, jlong hwnd) { HWND handle = reinterpret_cast(hwnd); ShowWindow(handle, SW_MAXIMIZE); } JNIEXPORT void JNICALL -Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_restore(JNIEnv *env, jclass obj, jlong hwnd) +Java_com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows_restore(JNIEnv *env, jclass obj, jlong hwnd) { HWND handle = reinterpret_cast(hwnd); ShowWindow(handle, SW_RESTORE); diff --git a/windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorations.java b/windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorationsWindows.java similarity index 97% rename from windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorations.java rename to windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorationsWindows.java index 8fabf411..05b9b709 100644 --- a/windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorations.java +++ b/windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorationsWindows.java @@ -36,16 +36,12 @@ import java.util.logging.Logger; /** * @author Jannis Weis */ -public class JNIDecorations { +public class JNIDecorationsWindows { - private static final Logger LOGGER = Logger.getLogger(JNIDecorations.class.getName()); + private static final Logger LOGGER = Logger.getLogger(JNIDecorationsWindows.class.getName()); private static boolean supported; private static boolean loaded; - static { - updateLibrary(); - } - public static native void updateValues(final long hwnd, final int left, final int right, final int height); public static native void setResizable(final long hwnd, final boolean resizable);