Browse Source

Don't apply margin when text component is used as cell editor.

pull/222/head
weisj 4 years ago
parent
commit
6df91b7aac
  1. 95
      core/src/main/java/com/github/weisj/darklaf/ui/text/DarkTextListener.java
  2. 77
      core/src/main/java/com/github/weisj/darklaf/ui/text/DarkTextUI.java

95
core/src/main/java/com/github/weisj/darklaf/ui/text/DarkTextListener.java

@ -0,0 +1,95 @@
/*
* 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.text;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.text.Caret;
import javax.swing.text.JTextComponent;
import com.github.weisj.darklaf.util.PropertyKey;
import com.github.weisj.darklaf.util.PropertyUtil;
public class DarkTextListener implements FocusListener, PropertyChangeListener {
private final JTextComponent editor;
private final DarkTextUI ui;
public DarkTextListener(final JTextComponent editor, final DarkTextUI ui) {
this.editor = editor;
this.ui = ui;
}
@Override
public void focusGained(final FocusEvent e) {
Caret caret = editor.getCaret();
if (caret instanceof DarkCaret) {
((DarkCaret) caret).setPaintSelectionHighlight(true);
}
editor.repaint();
}
@Override
public void focusLost(final FocusEvent e) {
Caret caret = editor.getCaret();
JPopupMenu popupMenu = editor.getComponentPopupMenu();
Component other = e.getOppositeComponent();
MenuElement[] path = MenuSelectionManager.defaultManager().getSelectedPath();
if (popupMenu != null && other != null && SwingUtilities.isDescendingFrom(popupMenu, other)
|| path != null && path.length > 0 && path[0] == popupMenu)
return;
if (caret instanceof DarkCaret) {
((DarkCaret) caret).setPaintSelectionHighlight(false);
}
editor.repaint();
}
@Override
public void propertyChange(final PropertyChangeEvent evt) {
String key = evt.getPropertyName();
if (PropertyKey.ANCESTOR.equals(key)
|| DarkTextUI.KEY_IS_LIST_EDITOR.equals(key)
|| DarkTextUI.KEY_IS_TABLE_EDITOR.equals(key)
|| DarkTextUI.KEY_IS_TREE_EDITOR.equals(key)) {
ui.updateMargins();
} else if (DarkTextUI.KEY_ROUNDED_SELECTION.equals(key)) {
boolean rounded = PropertyUtil.getBooleanProperty(editor, DarkTextUI.KEY_ROUNDED_SELECTION);
ui.getDarkCaret().setRoundedSelectionEdges(rounded);
editor.repaint();
} else if (DarkTextUI.KEY_HAS_ERROR.equals(key)) {
editor.repaint();
} else if (DarkTextUI.KEY_EXTEND_LINE_SELECTION.equals(key)) {
boolean extendLines = PropertyUtil.getBooleanProperty(editor, DarkTextUI.KEY_EXTEND_LINE_SELECTION);
ui.getDarkCaret().setLineExtendingEnabled(extendLines);
editor.repaint();
} else if ("border".equals(key)) {
ui.installBorder();
} else if (PropertyKey.ENABLED.equals(key) || PropertyKey.EDITABLE.equals(key)) {
PropertyUtil.installBackground(editor, ui.getBackground(editor));
}
}
}

77
core/src/main/java/com/github/weisj/darklaf/ui/text/DarkTextUI.java

@ -22,14 +22,11 @@
package com.github.weisj.darklaf.ui.text;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicTextUI;
import javax.swing.text.*;
@ -50,12 +47,10 @@ import com.github.weisj.darklaf.ui.text.popup.DarkTextPopupMenu;
import com.github.weisj.darklaf.ui.tooltip.ToolTipConstants;
import com.github.weisj.darklaf.ui.tree.DarkTreeUI;
import com.github.weisj.darklaf.util.DarkUIUtil;
import com.github.weisj.darklaf.util.PropertyKey;
import com.github.weisj.darklaf.util.PropertyUtil;
/** @author Jannis Weis */
public abstract class DarkTextUI extends BasicTextUI
implements PropertyChangeListener, FocusListener, OpacityBufferedUI {
public abstract class DarkTextUI extends BasicTextUI implements OpacityBufferedUI {
protected static final String KEY_PREFIX = "JTextComponent.";
public static final String KEY_ROUNDED_SELECTION = KEY_PREFIX + "roundedSelection";
@ -69,9 +64,12 @@ public abstract class DarkTextUI extends BasicTextUI
protected static final String TOGGLE_INSERT = "toggle_insert";
protected DarkTextListener textListener;
protected JTextComponent editor;
protected DefaultTextRenderer defaultTextRenderer;
protected DarkCaret darkCaret;
protected Insets margins;
@Override
protected Caret createCaret() {
@ -112,15 +110,18 @@ public abstract class DarkTextUI extends BasicTextUI
disabledColor = UIManager.getColor(getPropertyPrefix() + ".disabledBackground");
inactiveColor = UIManager.getColor(getPropertyPrefix() + ".inactiveBackground");
installMargins();
margins = UIManager.getInsets(getPropertyPrefix() + ".margins");
updateMargins();
installBorder();
installPopupMenu();
}
protected void installMargins() {
protected void updateMargins() {
Insets margin = editor.getMargin();
if (margin == null || margin instanceof UIResource) {
editor.setMargin(UIManager.getInsets(getPropertyPrefix() + ".margins"));
editor.setMargin(isInCell(editor) ? new InsetsUIResource(0, 0, 0, 0) : margins);
}
}
@ -176,37 +177,24 @@ public abstract class DarkTextUI extends BasicTextUI
super.uninstallDefaults();
}
@Override
public void propertyChange(final PropertyChangeEvent evt) {
super.propertyChange(evt);
String key = evt.getPropertyName();
if (KEY_ROUNDED_SELECTION.equals(key)) {
boolean rounded = PropertyUtil.getBooleanProperty(editor, DarkTextUI.KEY_ROUNDED_SELECTION);
getDarkCaret().setRoundedSelectionEdges(rounded);
editor.repaint();
} else if (KEY_HAS_ERROR.equals(key)) {
editor.repaint();
} else if (KEY_EXTEND_LINE_SELECTION.equals(key)) {
boolean extendLines = PropertyUtil.getBooleanProperty(editor, DarkTextUI.KEY_EXTEND_LINE_SELECTION);
getDarkCaret().setLineExtendingEnabled(extendLines);
editor.repaint();
} else if ("border".equals(key)) {
installBorder();
} else if (PropertyKey.ENABLED.equals(key) || PropertyKey.EDITABLE.equals(key)) {
PropertyUtil.installBackground(editor, getBackground(editor));
}
}
@Override
protected void installListeners() {
super.installListeners();
editor.addFocusListener(this);
textListener = createTextListener();
editor.addFocusListener(textListener);
editor.addPropertyChangeListener(textListener);
}
protected DarkTextListener createTextListener() {
return new DarkTextListener(editor, this);
}
@Override
protected void uninstallListeners() {
super.uninstallListeners();
editor.removeFocusListener(this);
editor.removeFocusListener(textListener);
editor.removePropertyChangeListener(textListener);
textListener = null;
}
protected Color getBackground(final JTextComponent c) {
@ -408,27 +396,4 @@ public abstract class DarkTextUI extends BasicTextUI
return km;
}
@Override
public void focusGained(final FocusEvent e) {
Caret caret = editor.getCaret();
if (caret instanceof DarkCaret) {
((DarkCaret) caret).setPaintSelectionHighlight(true);
}
editor.repaint();
}
@Override
public void focusLost(final FocusEvent e) {
Caret caret = editor.getCaret();
JPopupMenu popupMenu = editor.getComponentPopupMenu();
Component other = e.getOppositeComponent();
MenuElement[] path = MenuSelectionManager.defaultManager().getSelectedPath();
if (popupMenu != null && other != null && SwingUtilities.isDescendingFrom(popupMenu, other)
|| path != null && path.length > 0 && path[0] == popupMenu)
return;
if (caret instanceof DarkCaret) {
((DarkCaret) caret).setPaintSelectionHighlight(false);
}
editor.repaint();
}
}

Loading…
Cancel
Save