From 753c0731a31c01a3a68be1a6efcd4862061c8e05 Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 10 Jan 2014 03:01:52 +0000 Subject: [PATCH] Fix performance of list boxes Skin border for list on ListChooser dialogs --- .../src/main/java/forge/gui/ListChooser.java | 4 +- .../main/java/forge/gui/toolbox/FList.java | 44 ++++++++++++------- .../main/java/forge/gui/toolbox/FSkin.java | 35 ++++++++++++--- 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/forge-gui/src/main/java/forge/gui/ListChooser.java b/forge-gui/src/main/java/forge/gui/ListChooser.java index 03a30ef0d0a..547ecb2fc76 100644 --- a/forge-gui/src/main/java/forge/gui/ListChooser.java +++ b/forge-gui/src/main/java/forge/gui/ListChooser.java @@ -28,7 +28,6 @@ import java.util.List; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JList; -import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.WindowConstants; @@ -42,6 +41,7 @@ import forge.FThreads; import forge.gui.toolbox.FList; import forge.gui.toolbox.FMouseAdapter; import forge.gui.toolbox.FOptionPane; +import forge.gui.toolbox.FScrollPane; /** * A simple class that shows a list of choices in a dialog. Two properties @@ -102,7 +102,7 @@ public class ListChooser { this.lstChoices.setCellRenderer(new TransformedCellRenderer(display)); } - this.optionPane = new FOptionPane(null, title, null, new JScrollPane(this.lstChoices), options, minChoices < 0 ? 0 : -1); + this.optionPane = new FOptionPane(null, title, null, new FScrollPane(this.lstChoices), options, minChoices < 0 ? 0 : -1); this.optionPane.setButtonEnabled(0, minChoices <= 0); if (minChoices != -1) { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/FList.java b/forge-gui/src/main/java/forge/gui/toolbox/FList.java index 524e2ca7ee9..c400a560a62 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/FList.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/FList.java @@ -1,6 +1,8 @@ package forge.gui.toolbox; import java.awt.Component; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import javax.swing.DefaultListCellRenderer; import javax.swing.JLabel; @@ -9,7 +11,6 @@ import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.border.EmptyBorder; -import forge.gui.toolbox.FSkin.SkinnedLabel; import forge.gui.toolbox.FSkin.SkinnedList; /** @@ -20,7 +21,7 @@ import forge.gui.toolbox.FSkin.SkinnedList; public class FList extends SkinnedList { public FList() { super(); - applySkin(); + initialize(); } /** * A JList object using Forge skin properties. @@ -30,7 +31,7 @@ public class FList extends SkinnedList { */ public FList(final ListModel model0) { super(model0); - applySkin(); + initialize(); } /** @@ -41,17 +42,32 @@ public class FList extends SkinnedList { */ public FList(E[] o0) { super(o0); - applySkin(); + initialize(); } - /** - * TODO: Write javadoc for this method. - */ - private void applySkin() { + private void initialize() { this.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + this.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); + this.setSelectionForeground(this.getSkin().getForeground()); + this.setFont(FSkin.getFont(12)); + this.setCellRenderer(new ComplexCellRenderer()); - ListCellRenderer renderer = new ComplexCellRenderer(); - setCellRenderer(renderer); + this.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent arg0) { + updateSelectionBackground(); + } + + @Override + public void focusLost(FocusEvent arg0) { + updateSelectionBackground(); + } + }); + updateSelectionBackground(); + } + + private void updateSelectionBackground() { + this.setSelectionBackground(FSkin.getColor(hasFocus() ? FSkin.Colors.CLR_ACTIVE : FSkin.Colors.CLR_INACTIVE)); } private class ComplexCellRenderer implements ListCellRenderer { @@ -61,15 +77,9 @@ public class FList extends SkinnedList { public Component getListCellRendererComponent(JList lst0, E1 val0, int i0, boolean isSelected, boolean cellHasFocus) { - JLabel defaultItem = (JLabel) defaultRenderer.getListCellRendererComponent( + JLabel lblItem = (JLabel) defaultRenderer.getListCellRendererComponent( lst0, val0, i0, isSelected, cellHasFocus); - SkinnedLabel lblItem = new SkinnedLabel(defaultItem.getText()); - lblItem.setBorder(new EmptyBorder(4, 3, 4, 3)); - lblItem.setBackground(FSkin.getColor(hasFocus() ? FSkin.Colors.CLR_ACTIVE : FSkin.Colors.CLR_INACTIVE)); - lblItem.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - lblItem.setFont(FSkin.getFont(12)); - lblItem.setOpaque(isSelected); return lblItem; } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/FSkin.java b/forge-gui/src/main/java/forge/gui/toolbox/FSkin.java index 03925ca8799..caafc23a035 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/FSkin.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/FSkin.java @@ -2018,6 +2018,25 @@ public enum FSkin { super.reapply(comp); } } + public static class JSkinSkin> extends JComponentSkin { + private SkinColor selectionForeground, selectionBackground; + + protected JSkinSkin() { + } + + protected void setSelectionForeground(T comp, SkinColor skinColor) { comp.setSelectionForeground(skinColor != null ? skinColor.color : null); this.selectionForeground = skinColor; } + protected void resetSelectionForeground() { this.selectionForeground = null; } + + protected void setSelectionBackground(T comp, SkinColor skinColor) { comp.setSelectionBackground(skinColor != null ? skinColor.color : null); this.selectionBackground = skinColor; } + protected void resetSelectionBackground() { this.selectionBackground = null; } + + @Override + protected void reapply(T comp) { + if (this.selectionForeground != null) { setSelectionForeground(comp, this.selectionForeground); } + if (this.selectionBackground != null) { setSelectionBackground(comp, this.selectionBackground); } + super.reapply(comp); + } + } public static interface ISkinnedComponent { public ComponentSkin getSkin(); @@ -2222,9 +2241,9 @@ public enum FSkin { public static class SkinnedList extends JList implements ISkinnedComponent> { private static final long serialVersionUID = -2449981390420167627L; - private JComponentSkin> skin; - public JComponentSkin> getSkin() { - if (skin == null) { skin = new JComponentSkin>(); } + private JSkinSkin> skin; + public JSkinSkin> getSkin() { + if (skin == null) { skin = new JSkinSkin>(); } return skin; } @@ -2247,6 +2266,12 @@ public enum FSkin { public void setBorder(SkinBorder skinBorder) { getSkin().setBorder(this, skinBorder); } @Override public void setBorder(Border border) { getSkin().resetBorder(); super.setBorder(border); } + public void setSelectionForeground(SkinColor skinColor) { getSkin().setSelectionForeground(this, skinColor); } + @Override public void setSelectionForeground(Color color) { getSkin().resetSelectionForeground(); super.setSelectionForeground(color); } + + public void setSelectionBackground(SkinColor skinColor) { getSkin().setSelectionBackground(this, skinColor); } + @Override public void setSelectionBackground(Color color) { getSkin().resetSelectionBackground(); super.setSelectionBackground(color); } + @Override protected void paintComponent(Graphics g) { getSkin().update(this); @@ -2825,10 +2850,10 @@ public enum FSkin { @Override public void setBorder(Border border) { getSkin().resetBorder(); super.setBorder(border); } public void setSelectionForeground(SkinColor skinColor) { getSkin().setSelectionForeground(this, skinColor); } - public void setSelectionForeground(Color color) { getSkin().resetSelectionForeground(); super.setSelectionForeground(color); } + @Override public void setSelectionForeground(Color color) { getSkin().resetSelectionForeground(); super.setSelectionForeground(color); } public void setSelectionBackground(SkinColor skinColor) { getSkin().setSelectionBackground(this, skinColor); } - public void setSelectionBackground(Color color) { getSkin().resetSelectionBackground(); super.setSelectionBackground(color); } + @Override public void setSelectionBackground(Color color) { getSkin().resetSelectionBackground(); super.setSelectionBackground(color); } @Override protected void paintComponent(Graphics g) {