blob: 7a31f97062e2d2f835732e34cabc165b48d6a623 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.swing.laf.flatlaf;
import com.formdev.flatlaf.util.UIScale;
import java.awt.Color;
import javax.swing.InputMap;
import javax.swing.KeyStroke;
import javax.swing.UIDefaults;
import javax.swing.UIDefaults.LazyValue;
import javax.swing.UIManager;
import org.netbeans.swing.laf.flatlaf.ui.FlatTabControlIcon;
import org.netbeans.swing.plaf.LFCustoms;
import org.netbeans.swing.tabcontrol.plaf.TabControlButton;
/**
* LFCustoms for FlatLaf based LAFs (light, dark, etc).
* <p>
* Do not add colors here.
* Instead put colors into {@code FlatLightLaf.properties} or {@code FlatDarkLaf.properties}.
* <p>
* Public only to be accessible by ProxyLazyValue, please don't abuse.
*/
public class FlatLFCustoms extends LFCustoms {
private static final ModifiableColor unifiedBackground = new ModifiableColor();
private static final ModifiableColor quicksearchBackground = new ModifiableColor();
@Override
public Object[] createApplicationSpecificKeysAndValues() {
updateUnifiedBackground();
Color editorContentBorderColor = UIManager.getColor("TabbedContainer.editor.contentBorderColor"); // NOI18N
Object[] removeCtrlPageUpDownKeyBindings = {
"ctrl PAGE_UP", null, // NOI18N
"ctrl PAGE_DOWN", null // NOI18N
};
return new Object[] {
// unified background
"nb.options.categories.tabPanelBackground", unifiedBackground,
"nb.quicksearch.background", quicksearchBackground,
// options
"TitlePane.useWindowDecorations", FlatLafPrefs.isUseWindowDecorations(),
"TitlePane.unifiedBackground", FlatLafPrefs.isUnifiedTitleBar(),
"TitlePane.menuBarEmbedded", FlatLafPrefs.isMenuBarEmbedded(),
"MenuItem.selectionType", FlatLafPrefs.isUnderlineMenuSelection() ? "underline" : null,
"Component.hideMnemonics", !FlatLafPrefs.isAlwaysShowMnemonics(),
// necessary for org.openide.explorer.propertysheet.PropertySheet and others
CONTROLFONT, UIManager.getFont("Label.font"), // NOI18N
EDITOR_TAB_DISPLAYER_UI, "org.netbeans.swing.laf.flatlaf.ui.FlatEditorTabDisplayerUI", // NOI18N
VIEW_TAB_DISPLAYER_UI, "org.netbeans.swing.laf.flatlaf.ui.FlatViewTabDisplayerUI", // NOI18N
SLIDING_BUTTON_UI, "org.netbeans.swing.laf.flatlaf.ui.FlatSlidingButtonUI", // NOI18N
EDITOR_TABSCOMPONENT_BORDER, DPISafeBorder.matte(1, 1, 1, 1, editorContentBorderColor),
EDITOR_TOOLBAR_BORDER, DPISafeBorder.matte(0, 0, 1, 0, editorContentBorderColor),
EDITOR_TAB_CONTENT_BORDER, DPISafeBorder.matte(0, 1, 1, 1, editorContentBorderColor),
VIEW_TAB_CONTENT_BORDER, DPISafeBorder.matte(0, 1, 1, 1, UIManager.getColor("TabbedContainer.view.contentBorderColor")), // NOI18N
// scale on Java 8 and Linux
SPLIT_PANE_DIVIDER_SIZE_VERTICAL, UIScale.scale(4),
SPLIT_PANE_DIVIDER_SIZE_HORIZONTAL, UIScale.scale(4),
// for org.openide.awt.CloseButtonFactory
"nb.close.tab.icon.enabled.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_DEFAULT), // NOI18N
"nb.close.tab.icon.pressed.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_PRESSED), // NOI18N
"nb.close.tab.icon.rollover.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_ROLLOVER), // NOI18N
"nb.bigclose.tab.icon.enabled.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_DEFAULT), // NOI18N
"nb.bigclose.tab.icon.pressed.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_PRESSED), // NOI18N
"nb.bigclose.tab.icon.rollover.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_ROLLOVER), // NOI18N
// for org.netbeans.core.multitabs.ButtonFactory
"nb.multitabs.button.dropdown.icon", FlatTabControlIcon.get(TabControlButton.ID_DROP_DOWN_BUTTON), // NOI18N
"nb.multitabs.button.maximize.icon", FlatTabControlIcon.get(TabControlButton.ID_MAXIMIZE_BUTTON), // NOI18N
"nb.multitabs.button.left.icon", FlatTabControlIcon.get(TabControlButton.ID_SCROLL_LEFT_BUTTON), // NOI18N
"nb.multitabs.button.right.icon", FlatTabControlIcon.get(TabControlButton.ID_SCROLL_RIGHT_BUTTON), // NOI18N
"nb.multitabs.button.rollover", true, // NOI18N
// for module progress.ui
"nb.progress.cancel.icon", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_DEFAULT), // NOI18N
"nb.progress.cancel.icon.pressed", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_PRESSED), // NOI18N
"nb.progress.cancel.icon.mouseover", FlatTabControlIcon.get(TabControlButton.ID_CLOSE_BUTTON, TabControlButton.STATE_ROLLOVER), // NOI18N
// Change some colors from ColorUIResource to Color because they are used as
// background colors for checkboxes (e.g. in org.netbeans.modules.palette.ui.CategoryButton),
// which in FlatLaf paint background only if background color is not a UIResource.
"PropSheet.setBackground", new Color(UIManager.getColor("PropSheet.setBackground").getRGB()), // NOI18N
"PropSheet.selectedSetBackground", new Color(UIManager.getColor("PropSheet.selectedSetBackground").getRGB()), // NOI18N
//#108517 - turn off ctrl+page_up and ctrl+page_down mapping
// Not using UIUtils.addInputMapsWithoutCtrlPageUpAndCtrlPageDown() here because
// this method replaces all key bindings for List, ScrollPane, Table and Tree.
// But FlatLaf uses slightly different key bindings. Especially on macOS the
// key bindings are different for platform specific behavior.
"List.focusInputMap", new LazyModifyInputMap( "List.focusInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
"ScrollPane.ancestorInputMap", new LazyModifyInputMap( "ScrollPane.ancestorInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
"ScrollPane.ancestorInputMap.RightToLeft", new LazyModifyInputMap( "ScrollPane.ancestorInputMap.RightToLeft", removeCtrlPageUpDownKeyBindings ), // NOI18N
"Table.ancestorInputMap", new LazyModifyInputMap( "Table.ancestorInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
"Table.ancestorInputMap.RightToLeft", new LazyModifyInputMap( "Table.ancestorInputMap.RightToLeft", removeCtrlPageUpDownKeyBindings ), // NOI18N
"Tree.focusInputMap", new LazyModifyInputMap( "Tree.focusInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
};
}
static void updateUnifiedBackground() {
boolean unified = FlatLafPrefs.isUnifiedTitleBar() && FlatLafPrefs.isUseWindowDecorations();
unifiedBackground.setRGB(UIManager.getColor(unified ? "Panel.background" : "Tree.background").getRGB()); // NOI18N
quicksearchBackground.setRGB(UIManager.getColor(unified ? "Panel.background" : "MenuBar.background").getRGB()); // NOI18N
}
//---- class ModifiableColor ----------------------------------------------
private static class ModifiableColor
extends Color
{
private int rgb;
public ModifiableColor() {
super(Color.red.getRGB());
rgb = super.getRGB();
}
@Override
public int getRGB() {
return rgb;
}
public void setRGB(int rgb) {
this.rgb = rgb;
}
}
//---- class LazyModifyInputMap -------------------------------------------
/**
* Lazily gets a base input map from the look and feel defaults and
* applies modifications to it specified in bindings.
*/
private static class LazyModifyInputMap
implements LazyValue
{
private final String baseKey;
private final Object[] bindings;
LazyModifyInputMap(String baseKey, Object[] bindings) {
this.baseKey = baseKey;
this.bindings = bindings;
}
@Override
public Object createValue(UIDefaults table) {
// get base input map from look and feel defaults (resolves lazy base input map)
InputMap inputMap = (InputMap) UIManager.getLookAndFeelDefaults().get(baseKey);
// modify input map (replace or remove)
for (int i = 0; i < bindings.length; i += 2) {
KeyStroke keyStroke = KeyStroke.getKeyStroke((String) bindings[i]);
if (bindings[i + 1] != null) {
inputMap.put(keyStroke, bindings[i + 1]);
} else {
inputMap.remove(keyStroke);
}
}
return inputMap;
}
}
}