Browse Source

Made decorations creation process more flexible and independent of the platform specific implementation.

Signed-off-by: weisj <weisj@arcor.de>
pull/48/head
weisj 5 years ago
parent
commit
1dbc8ff662
  1. 38
      core/src/main/java/com/github/weisj/darklaf/DarkLaf.java
  2. 27
      core/src/main/java/com/github/weisj/darklaf/LafManager.java
  3. 49
      core/src/main/java/com/github/weisj/darklaf/decorations/DefaultDecorationsProvider.java
  4. 57
      core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorations.java
  5. 53
      core/src/main/java/com/github/weisj/darklaf/decorations/JNIDecorationsProvider.java
  6. 2
      core/src/main/java/com/github/weisj/darklaf/decorations/windows/CloseButtonUI.java
  7. 44
      core/src/main/java/com/github/weisj/darklaf/decorations/windows/DarkTitlePaneWindows.java
  8. 2
      core/src/main/java/com/github/weisj/darklaf/decorations/windows/TitlePaneIcon.java
  9. 48
      core/src/main/java/com/github/weisj/darklaf/decorations/windows/WindowsDecorationsProvider.java
  10. 2
      core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java
  11. 32
      core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CustomTitlePane.java
  12. 19
      core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java
  13. 18
      windows/src/main/cpp/JNIDecorations.cpp
  14. 8
      windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorationsWindows.java

38
core/src/main/java/com/github/weisj/darklaf/DarkLaf.java

@ -24,11 +24,11 @@
package com.github.weisj.darklaf; package com.github.weisj.darklaf;
import com.github.weisj.darklaf.components.border.DarkBorders; 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.theme.Theme;
import com.github.weisj.darklaf.ui.popupmenu.DarkPopupMenuUI; import com.github.weisj.darklaf.ui.popupmenu.DarkPopupMenuUI;
import com.github.weisj.darklaf.util.PropertyLoader; import com.github.weisj.darklaf.util.PropertyLoader;
import com.github.weisj.darklaf.platform.SystemInfo;
import sun.awt.AppContext; import sun.awt.AppContext;
import javax.swing.*; 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 Logger LOGGER = Logger.getLogger(DarkLaf.class.getName());
private static final String NAME = "Darklaf"; private static final String NAME = "Darklaf";
private static boolean decorationsEnabled = true;
private final BasicLookAndFeel base; 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 @Override
public UIDefaults getDefaults() { public UIDefaults getDefaults() {
try { try {
@ -104,10 +87,9 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener
initInputMapDefaults(defaults); initInputMapDefaults(defaults);
loadThemeDefaults(defaults); loadThemeDefaults(defaults);
initIdeaDefaults(defaults); initIdeaDefaults(defaults);
patchComboBox(metalDefaults, defaults);
JFrame.setDefaultLookAndFeelDecorated(true); patchComboBox(metalDefaults, defaults);
JDialog.setDefaultLookAndFeelDecorated(true); setupDecorations();
return defaults; return defaults;
} catch (final Exception e) { } catch (final Exception e) {
@ -116,6 +98,12 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener
return super.getDefaults(); return super.getDefaults();
} }
private void setupDecorations() {
JNIDecorations.updateLibrary();
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
}
protected void adjustPlatformSpecifics(final Properties uiProps) { protected void adjustPlatformSpecifics(final Properties uiProps) {
boolean useScreenMenuBar = Boolean.getBoolean("apple.laf.useScreenMenuBar"); boolean useScreenMenuBar = Boolean.getBoolean("apple.laf.useScreenMenuBar");
// If user wants to use Apple menu bar, then we need to keep the default // 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(); StyleSheet styleSheet = currentTheme.loadStyleSheet();
new HTMLEditorKit().setStyleSheet(styleSheet); new HTMLEditorKit().setStyleSheet(styleSheet);
setDecorationsEnabled(currentTheme.useCustomDecorations());
} }
@SuppressWarnings({"HardCodedStringLiteral"}) @SuppressWarnings({"HardCodedStringLiteral"})
@ -388,8 +375,9 @@ public class DarkLaf extends BasicLookAndFeel implements PropertyChangeListener
@Override @Override
public boolean getSupportsWindowDecorations() { public boolean getSupportsWindowDecorations() {
return LafManager.getTheme().useCustomDecorations() return LafManager.isDecorationsEnabled()
&& JNIDecorations.isCustomDecorationSupported(); && LafManager.getTheme().useCustomDecorations()
&& JNIDecorations.isCustomDecorationSupported();
} }

27
core/src/main/java/com/github/weisj/darklaf/LafManager.java

@ -44,6 +44,7 @@ public final class LafManager {
private static Theme theme; private static Theme theme;
private static boolean logEnabled = false; private static boolean logEnabled = false;
private static boolean decorationsOverwrite = true;
static { static {
/* /*
@ -76,6 +77,32 @@ public final class LafManager {
LafManager.logEnabled = logEnabled; 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. * Get the current theme. This method will never return null even if the LaF isn#t currently installed.
* *

49
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;
}
}

57
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();
}
}

53
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();
}

2
core/src/main/java/com/github/weisj/darklaf/ui/rootpane/CloseButtonUI.java → 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.github.weisj.darklaf.ui.rootpane; package com.github.weisj.darklaf.decorations.windows;
import com.github.weisj.darklaf.ui.button.DarkButtonUI; import com.github.weisj.darklaf.ui.button.DarkButtonUI;

44
core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkTitlePane.java → core/src/main/java/com/github/weisj/darklaf/decorations/windows/DarkTitlePaneWindows.java

@ -22,11 +22,12 @@
* SOFTWARE. * 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.decorators.AncestorAdapter;
import com.github.weisj.darklaf.icons.ScaledIcon; 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 com.github.weisj.darklaf.util.Scale;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
@ -36,12 +37,7 @@ import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener; import javax.swing.event.AncestorListener;
import javax.swing.plaf.UIResource; import javax.swing.plaf.UIResource;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.*;
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.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.List; import java.util.List;
@ -50,7 +46,7 @@ import java.util.List;
* @author Konstantin Bulenkov * @author Konstantin Bulenkov
* @author Jannis Weis * @author Jannis Weis
*/ */
public class DarkTitlePane extends JComponent { public class DarkTitlePaneWindows extends CustomTitlePane {
private static final int PAD = 5; private static final int PAD = 5;
private static final int BAR_HEIGHT = 28; private static final int BAR_HEIGHT = 28;
private static final int BUTTON_WIDTH = 46; private static final int BUTTON_WIDTH = 46;
@ -133,7 +129,7 @@ public class DarkTitlePane extends JComponent {
private Color activeForeground; private Color activeForeground;
private Color border; private Color border;
public DarkTitlePane(final JRootPane root) { public DarkTitlePaneWindows(final JRootPane root) {
this.rootPane = root; this.rootPane = root;
rootPane.addContainerListener(rootPaneContainerListener); rootPane.addContainerListener(rootPaneContainerListener);
rootPane.getLayeredPane().addContainerListener(layeredPaneContainerListener); rootPane.getLayeredPane().addContainerListener(layeredPaneContainerListener);
@ -192,7 +188,7 @@ public class DarkTitlePane extends JComponent {
protected void uninstallDecorations() { protected void uninstallDecorations() {
window = null; window = null;
JNIDecorations.uninstallDecorations(windowHandle); JNIDecorationsWindows.uninstallDecorations(windowHandle);
windowHandle = 0; windowHandle = 0;
rootPane.removeContainerListener(rootPaneContainerListener); rootPane.removeContainerListener(rootPaneContainerListener);
rootPane.getLayeredPane().removeContainerListener(layeredPaneContainerListener); rootPane.getLayeredPane().removeContainerListener(layeredPaneContainerListener);
@ -205,12 +201,12 @@ public class DarkTitlePane extends JComponent {
public void install() { public void install() {
if (window != null) { if (window != null) {
if (window instanceof Dialog || window instanceof Frame) { if (window instanceof Dialog || window instanceof Frame) {
windowHandle = JNIDecorations.getHWND(window); windowHandle = JNIDecorationsWindows.getHWND(window);
JNIDecorations.installDecorations(windowHandle); JNIDecorationsWindows.installDecorations(windowHandle);
updateResizeBehaviour(); updateResizeBehaviour();
Color color = window.getBackground(); 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) { if (window instanceof Frame) {
@ -240,7 +236,7 @@ public class DarkTitlePane extends JComponent {
private WindowListener createWindowListener() { private WindowListener createWindowListener() {
return new DarkTitlePane.WindowHandler(); return new DarkTitlePaneWindows.WindowHandler();
} }
@ -363,15 +359,15 @@ public class DarkTitlePane extends JComponent {
} }
private void minimize() { private void minimize() {
JNIDecorations.minimize(windowHandle); JNIDecorationsWindows.minimize(windowHandle);
} }
private void maximize() { private void maximize() {
JNIDecorations.maximize(windowHandle); JNIDecorationsWindows.maximize(windowHandle);
} }
private void restore() { private void restore() {
JNIDecorations.restore(windowHandle); JNIDecorationsWindows.restore(windowHandle);
} }
private void createActions() { private void createActions() {
@ -473,7 +469,7 @@ public class DarkTitlePane extends JComponent {
boolean res = isResizable(window, rootPane); boolean res = isResizable(window, rootPane);
if (oldResizable != res) { if (oldResizable != res) {
oldResizable = res; oldResizable = res;
JNIDecorations.setResizable(windowHandle, res); JNIDecorationsWindows.setResizable(windowHandle, res);
} }
} }
@ -716,9 +712,9 @@ public class DarkTitlePane extends JComponent {
right = tmp; right = tmp;
} }
JNIDecorations.updateValues(windowHandle, Scale.scaleWidth(left), JNIDecorationsWindows.updateValues(windowHandle, Scale.scaleWidth(left),
Scale.scaleWidth(right), Scale.scaleWidth(right),
Scale.scaleHeight(height)); Scale.scaleHeight(height));
} }
@ -748,7 +744,7 @@ public class DarkTitlePane extends JComponent {
setState(frame.getExtendedState(), true); setState(frame.getExtendedState(), true);
} }
if ("resizable".equals(name)) { if ("resizable".equals(name)) {
JNIDecorations.setResizable(windowHandle, Boolean.TRUE.equals(pce.getNewValue())); JNIDecorationsWindows.setResizable(windowHandle, Boolean.TRUE.equals(pce.getNewValue()));
getRootPane().repaint(); getRootPane().repaint();
} }
} else if ("title".equals(name)) { } else if ("title".equals(name)) {
@ -763,7 +759,7 @@ public class DarkTitlePane extends JComponent {
repaint(); repaint();
} else if ("background".equals(name) && pce.getNewValue() instanceof Color) { } else if ("background".equals(name) && pce.getNewValue() instanceof Color) {
Color color = (Color) pce.getNewValue(); Color color = (Color) pce.getNewValue();
JNIDecorations.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue()); JNIDecorationsWindows.setBackground(windowHandle, color.getRed(), color.getGreen(), color.getBlue());
} }
} }
} }

2
core/src/main/java/com/github/weisj/darklaf/ui/rootpane/TitlePaneIcon.java → 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.github.weisj.darklaf.ui.rootpane; package com.github.weisj.darklaf.decorations.windows;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;

48
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();
}
}

2
core/src/main/java/com/github/weisj/darklaf/ui/internalframe/DarkInternalFrameTitlePane.java

@ -23,8 +23,8 @@
*/ */
package com.github.weisj.darklaf.ui.internalframe; 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.icons.EmptyIcon;
import com.github.weisj.darklaf.ui.rootpane.TitlePaneIcon;
import sun.swing.SwingUtilities2; import sun.swing.SwingUtilities2;
import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleContext;

32
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();
}

19
core/src/main/java/com/github/weisj/darklaf/ui/rootpane/DarkRootPaneUI.java

@ -24,7 +24,7 @@
package com.github.weisj.darklaf.ui.rootpane; 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.*;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
@ -42,7 +42,7 @@ import java.beans.PropertyChangeListener;
*/ */
public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener { public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener {
private Window window; private Window window;
private DarkTitlePane titlePane; private CustomTitlePane titlePane;
private LayoutManager layoutManager; private LayoutManager layoutManager;
private LayoutManager oldLayout; private LayoutManager oldLayout;
private JRootPane rootPane; private JRootPane rootPane;
@ -139,7 +139,7 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener
} }
private void installClientDecorations(final JRootPane root) { private void installClientDecorations(final JRootPane root) {
DarkTitlePane titlePane = createTitlePane(root); CustomTitlePane titlePane = JNIDecorations.createTitlePane(root);
setTitlePane(root, titlePane); setTitlePane(root, titlePane);
updateWindow(root.getParent()); updateWindow(root.getParent());
installLayout(root); installLayout(root);
@ -154,11 +154,7 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener
} }
} }
protected DarkTitlePane createTitlePane(final JRootPane root) { private void setTitlePane(final JRootPane root, final CustomTitlePane titlePane) {
return new DarkTitlePane(root);
}
private void setTitlePane(final JRootPane root, final DarkTitlePane titlePane) {
JLayeredPane layeredPane = root.getLayeredPane(); JLayeredPane layeredPane = root.getLayeredPane();
JComponent oldTitlePane = getTitlePane(); JComponent oldTitlePane = getTitlePane();
@ -222,8 +218,11 @@ public class DarkRootPaneUI extends BasicRootPaneUI implements HierarchyListener
if (currWindow != null) { if (currWindow != null) {
if (currWindow != window) { if (currWindow != window) {
if (!JNIDecorations.isCustomDecorationSupported()) return; if (!JNIDecorations.isCustomDecorationSupported()
if (rootPane.getWindowDecorationStyle() == JRootPane.NONE) return; || rootPane.getWindowDecorationStyle() == JRootPane.NONE) {
uninstallClientDecorations(rootPane);
return;
}
updateClientDecoration(); updateClientDecoration();
} }
window = currWindow; window = currWindow;

18
windows/src/main/cpp/JNIDecorations.cpp

@ -22,7 +22,7 @@
* SOFTWARE. * SOFTWARE.
*/ */
#include "JNIDecorations.h" #include "JNIDecorations.h"
#include "com_github_weisj_darklaf_platform_windows_JNIDecorations.h" #include "com_github_weisj_darklaf_platform_windows_JNIDecorationsWindows.h"
#include <dwmapi.h> #include <dwmapi.h>
#include <iostream> #include <iostream>
#include <map> #include <map>
@ -130,7 +130,7 @@ LRESULT CALLBACK WindowWrapper::WindowProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
auto wrap = wrapper_map[handle]; auto wrap = wrapper_map[handle];
@ -141,7 +141,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setResizable(JNIEn
} }
JNIEXPORT void JNICALL 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) jint l, jint r, jint h)
{ {
HWND handle = reinterpret_cast<HWND>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
@ -155,7 +155,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_updateValues(JNIEn
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
auto wrap = wrapper_map[handle]; auto wrap = wrapper_map[handle];
@ -166,7 +166,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_setBackground(JNIE
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
@ -194,7 +194,7 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_installDecorations
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
auto wrap = wrapper_map[handle]; auto wrap = wrapper_map[handle];
@ -209,21 +209,21 @@ Java_com_github_weisj_darklaf_platform_windows_JNIDecorations_uninstallDecoratio
//Window functions. //Window functions.
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
ShowWindow(handle, SW_MINIMIZE); ShowWindow(handle, SW_MINIMIZE);
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
ShowWindow(handle, SW_MAXIMIZE); ShowWindow(handle, SW_MAXIMIZE);
} }
JNIEXPORT void JNICALL 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>(hwnd); HWND handle = reinterpret_cast<HWND>(hwnd);
ShowWindow(handle, SW_RESTORE); ShowWindow(handle, SW_RESTORE);

8
windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorations.java → windows/src/main/java/com/github/weisj/darklaf/platform/windows/JNIDecorationsWindows.java

@ -36,16 +36,12 @@ import java.util.logging.Logger;
/** /**
* @author Jannis Weis * @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 supported;
private static boolean loaded; 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 updateValues(final long hwnd, final int left, final int right, final int height);
public static native void setResizable(final long hwnd, final boolean resizable); public static native void setResizable(final long hwnd, final boolean resizable);
Loading…
Cancel
Save