Normalize plugin panel display

- Add same padding to each panel
- Wrap each panel in JScrollPane
- Clean up plugin panel API and set normalized width, height and layout
to each panel instead of having to manually specify it for each panel
- Make PluginPanel class abstract

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2017-12-22 01:29:22 +01:00
committed by Adam
parent 4568f4302f
commit 19416ba5ca
6 changed files with 127 additions and 147 deletions

View File

@@ -24,11 +24,12 @@
*/ */
package net.runelite.client.plugins.config; package net.runelite.client.plugins.config;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
import static javax.swing.JOptionPane.YES_NO_OPTION;
import static javax.swing.JOptionPane.YES_OPTION;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.FocusListener; import java.awt.event.FocusListener;
@@ -37,10 +38,7 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JColorChooser; import javax.swing.JColorChooser;
@@ -50,17 +48,12 @@ import javax.swing.JFormattedTextField;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
import static javax.swing.JOptionPane.YES_NO_OPTION;
import static javax.swing.JOptionPane.YES_OPTION;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigDescriptor;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
@@ -71,70 +64,37 @@ import net.runelite.client.ui.PluginPanel;
@Slf4j @Slf4j
public class ConfigPanel extends PluginPanel public class ConfigPanel extends PluginPanel
{ {
private static final EmptyBorder BORDER_PADDING = new EmptyBorder(6, 6, 6, 6);
private static final int TEXT_FIELD_WIDTH = 7; private static final int TEXT_FIELD_WIDTH = 7;
private static final int SPINNER_FIELD_WIDTH = 6; private static final int SPINNER_FIELD_WIDTH = 6;
private final ConfigManager configManager; private final ConfigManager configManager;
private JScrollPane scrollPane;
public ConfigPanel(ConfigManager configManager) public ConfigPanel(ConfigManager configManager)
{ {
super();
this.configManager = configManager; this.configManager = configManager;
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); populateConfig();
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
setSize(PANEL_WIDTH, PANEL_HEIGHT);
setLayout(new BorderLayout());
setVisible(true);
} }
public void init() private void populateConfig()
{ {
add(createConfigPanel(), BorderLayout.NORTH); removeAll();
} add(new JLabel("Plugin Configuration", SwingConstants.CENTER));
private List<ConfigDescriptor> getConfig() configManager.getConfigProxies().stream()
{ .map(configManager::getConfigDescriptor)
List<ConfigDescriptor> list = new ArrayList<>(); .sorted(Comparator.comparing(left -> left.getGroup().name()))
for (Object config : configManager.getConfigProxies()) .forEach(cd ->
{ {
ConfigDescriptor configDescriptor = configManager.getConfigDescriptor(config); JPanel groupPanel = new JPanel();
groupPanel.setLayout(new BorderLayout());
JButton viewGroupItemsButton = new JButton(cd.getGroup().name());
viewGroupItemsButton.addActionListener(ae -> openGroupConfigPanel(cd, configManager));
groupPanel.add(viewGroupItemsButton);
add(groupPanel);
});
list.add(configDescriptor); revalidate();
}
return list;
}
private JComponent createConfigPanel()
{
JPanel panel = new JPanel();
panel.setBorder(BORDER_PADDING);
panel.setLayout(new GridLayout(0, 1, 0, 3));
panel.add(new JLabel("Plugin Configuration", SwingConstants.CENTER));
List<ConfigDescriptor> config = getConfig();
// Sort by name
Comparator<ConfigDescriptor> comparator = (ConfigDescriptor left, ConfigDescriptor right) -> left.getGroup().name().compareTo(right.getGroup().name());
config.sort(comparator);
for (ConfigDescriptor cd : config)
{
JPanel groupPanel = new JPanel();
groupPanel.setLayout(new BorderLayout());
JButton viewGroupItemsButton = new JButton(cd.getGroup().name());
viewGroupItemsButton.addActionListener(ae -> openGroupConfigPanel(cd, configManager));
groupPanel.add(viewGroupItemsButton);
panel.add(groupPanel);
}
//Make the panel scrollable
scrollPane = new JScrollPane(panel);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
scrollPane.setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
scrollPane.getVerticalScrollBar().setUnitIncrement(16); //Otherwise scrollspeed is really slow
return scrollPane;
} }
private void changeConfiguration(JComponent component, ConfigDescriptor cd, ConfigItemDescriptor cid) private void changeConfiguration(JComponent component, ConfigDescriptor cd, ConfigItemDescriptor cid)
@@ -186,13 +146,11 @@ public class ConfigPanel extends PluginPanel
private void openGroupConfigPanel(ConfigDescriptor cd, ConfigManager configManager) private void openGroupConfigPanel(ConfigDescriptor cd, ConfigManager configManager)
{ {
JPanel itemPanel = new JPanel(); removeAll();
itemPanel.setBorder(BORDER_PADDING);
itemPanel.setLayout(new GridLayout(0, 1, 0, 6));
String name = cd.getGroup().name() + " Configuration"; String name = cd.getGroup().name() + " Configuration";
JLabel title = new JLabel(name); JLabel title = new JLabel(name);
title.setToolTipText(cd.getGroup().description()); title.setToolTipText(cd.getGroup().description());
itemPanel.add(title, SwingConstants.CENTER); add(title, SwingConstants.CENTER);
for (ConfigItemDescriptor cid : cd.getItems()) for (ConfigItemDescriptor cid : cd.getItems())
{ {
@@ -309,24 +267,19 @@ public class ConfigPanel extends PluginPanel
item.add(box, BorderLayout.EAST); item.add(box, BorderLayout.EAST);
} }
itemPanel.add(item); add(item);
} }
JButton backButton = new JButton("Back"); JButton backButton = new JButton("Back");
backButton.addActionListener(this::getBackButtonListener); backButton.addActionListener(this::getBackButtonListener);
itemPanel.add(backButton); add(backButton);
revalidate();
removeAll();
updateUI();
add(itemPanel, BorderLayout.NORTH);
} }
public void getBackButtonListener(ActionEvent e) public void getBackButtonListener(ActionEvent e)
{ {
removeAll();
updateUI();
add(scrollPane, BorderLayout.NORTH); populateConfig();
} }
} }

View File

@@ -25,9 +25,10 @@
*/ */
package net.runelite.client.plugins.devtools; package net.runelite.client.plugins.devtools;
import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.util.Collection; import java.util.Collection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -43,16 +44,12 @@ import javax.swing.tree.DefaultTreeModel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
import net.runelite.api.widgets.WidgetItem; import net.runelite.api.widgets.WidgetItem;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
@Slf4j @Slf4j
public class DevToolsPanel extends PluginPanel public class DevToolsPanel extends PluginPanel
{ {
private final EmptyBorder PADDING_BORDER = new EmptyBorder(3, 3, 3, 3);
private JButton renderPlayersBtn = new JButton(); private JButton renderPlayersBtn = new JButton();
private JButton renderNpcsBtn = new JButton(); private JButton renderNpcsBtn = new JButton();
private JButton renderGroundItemsBtn = new JButton(); private JButton renderGroundItemsBtn = new JButton();
@@ -61,8 +58,6 @@ public class DevToolsPanel extends PluginPanel
private JButton renderWallsBtn = new JButton(); private JButton renderWallsBtn = new JButton();
private JButton renderDecorBtn = new JButton(); private JButton renderDecorBtn = new JButton();
private JButton renderInventoryBtn = new JButton(); private JButton renderInventoryBtn = new JButton();
private JButton settingsSnapshotBtn = new JButton();
private JButton settingsClearBtn = new JButton();
private JLabel textLbl = new JLabel(); private JLabel textLbl = new JLabel();
private JLabel textColorLbl = new JLabel(); private JLabel textColorLbl = new JLabel();
@@ -80,26 +75,22 @@ public class DevToolsPanel extends PluginPanel
@Inject @Inject
public DevToolsPanel(@Nullable Client client, DevToolsPlugin plugin) public DevToolsPanel(@Nullable Client client, DevToolsPlugin plugin)
{ {
super();
this.client = client; this.client = client;
this.plugin = plugin; this.plugin = plugin;
settingsTracker = new SettingsTracker(client); settingsTracker = new SettingsTracker(client);
final JPanel borderedWrap = new JPanel();
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); borderedWrap.setLayout(new BorderLayout(0, 3));
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); borderedWrap.add(createOptionsPanel(), BorderLayout.NORTH);
setSize(PANEL_WIDTH, PANEL_HEIGHT); borderedWrap.add(createWidgetTreePanel(), BorderLayout.CENTER);
setLayout(new BorderLayout()); add(borderedWrap);
setVisible(true);
add(createOptionsPanel(), BorderLayout.NORTH);
add(createWidgetTreePanel(), BorderLayout.CENTER);
} }
private JPanel createOptionsPanel() private JPanel createOptionsPanel()
{ {
JPanel container = new JPanel(); JPanel container = new JPanel();
container.setLayout(new GridLayout(5, 2, 3, 3)); container.setLayout(new GridLayout(5, 2, 3, 3));
container.setBorder(PADDING_BORDER);
renderPlayersBtn = new JButton("Players"); renderPlayersBtn = new JButton("Players");
renderPlayersBtn.addActionListener(e -> renderPlayersBtn.addActionListener(e ->
@@ -165,11 +156,11 @@ public class DevToolsPanel extends PluginPanel
}); });
container.add(renderInventoryBtn); container.add(renderInventoryBtn);
settingsSnapshotBtn = new JButton("Get Settings"); JButton settingsSnapshotBtn = new JButton("Get Settings");
settingsSnapshotBtn.addActionListener(settingsTracker::snapshot); settingsSnapshotBtn.addActionListener(settingsTracker::snapshot);
container.add(settingsSnapshotBtn); container.add(settingsSnapshotBtn);
settingsClearBtn = new JButton("Clear Settings"); JButton settingsClearBtn = new JButton("Clear Settings");
settingsClearBtn.addActionListener(settingsTracker::clear); settingsClearBtn.addActionListener(settingsTracker::clear);
container.add(settingsClearBtn); container.add(settingsClearBtn);
@@ -179,7 +170,7 @@ public class DevToolsPanel extends PluginPanel
private JPanel createWidgetTreePanel() private JPanel createWidgetTreePanel()
{ {
JPanel container = new JPanel(); JPanel container = new JPanel();
container.setLayout(new BorderLayout()); container.setLayout(new BorderLayout(0, 3));
JTree tree = new JTree(new DefaultMutableTreeNode()); JTree tree = new JTree(new DefaultMutableTreeNode());
tree.setRootVisible(false); tree.setRootVisible(false);
@@ -205,7 +196,6 @@ public class DevToolsPanel extends PluginPanel
}); });
JScrollPane scrollPane = new JScrollPane(tree); JScrollPane scrollPane = new JScrollPane(tree);
scrollPane.setBorder(PADDING_BORDER);
container.add(scrollPane, BorderLayout.CENTER); container.add(scrollPane, BorderLayout.CENTER);
JButton refreshWidgetsBtn = new JButton("Refresh Widgets"); JButton refreshWidgetsBtn = new JButton("Refresh Widgets");
@@ -217,7 +207,6 @@ public class DevToolsPanel extends PluginPanel
JPanel btnContainer = new JPanel(); JPanel btnContainer = new JPanel();
btnContainer.setLayout(new BorderLayout()); btnContainer.setLayout(new BorderLayout());
btnContainer.setBorder(PADDING_BORDER);
btnContainer.add(refreshWidgetsBtn); btnContainer.add(refreshWidgetsBtn);
container.add(btnContainer, BorderLayout.NORTH); container.add(btnContainer, BorderLayout.NORTH);

View File

@@ -24,8 +24,16 @@
*/ */
package net.runelite.client.plugins.hiscore; package net.runelite.client.plugins.hiscore;
import static net.runelite.http.api.hiscore.HiscoreSkill.*;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import java.awt.*; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
@@ -34,14 +42,25 @@ import java.util.List;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.*; import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.event.MouseInputAdapter; import javax.swing.event.MouseInputAdapter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Experience; import net.runelite.api.Experience;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
import net.runelite.http.api.hiscore.*; import net.runelite.http.api.hiscore.HiscoreClient;
import static net.runelite.http.api.hiscore.HiscoreSkill.*; import net.runelite.http.api.hiscore.HiscoreEndpoint;
import net.runelite.http.api.hiscore.HiscoreResult;
import net.runelite.http.api.hiscore.HiscoreSkill;
import net.runelite.http.api.hiscore.Skill;
@Slf4j @Slf4j
public class HiscorePanel extends PluginPanel public class HiscorePanel extends PluginPanel
@@ -77,19 +96,13 @@ public class HiscorePanel extends PluginPanel
public HiscorePanel() public HiscorePanel()
{ {
super();
// Panel "constants" // Panel "constants"
// This was an EtchedBorder, but the style would change when the window was maximized. // This was an EtchedBorder, but the style would change when the window was maximized.
Border subPanelBorder = BorderFactory.createLineBorder(this.getBackground().brighter(), 2); Border subPanelBorder = BorderFactory.createLineBorder(this.getBackground().brighter(), 2);
Insets subPanelInsets = new Insets(2, 4, 2, 4);
Font labelFont = UIManager.getFont("Label.font"); Font labelFont = UIManager.getFont("Label.font");
// Setting base panel size
Dimension panelSize = new Dimension(PANEL_WIDTH, PANEL_HEIGHT);
setMinimumSize(panelSize);
setPreferredSize(panelSize);
setSize(panelSize);
setVisible(true);
// Create GBL to arrange sub items // Create GBL to arrange sub items
GridBagLayout gridBag = new GridBagLayout(); GridBagLayout gridBag = new GridBagLayout();
setLayout(gridBag); setLayout(gridBag);
@@ -124,7 +137,7 @@ public class HiscorePanel extends PluginPanel
c.gridy = 0; c.gridy = 0;
c.weightx = 1; c.weightx = 1;
c.weighty = 0; c.weighty = 0;
c.insets = subPanelInsets; c.insets = new Insets(0, 0, 3, 0);
gridBag.setConstraints(inputPanel, c); gridBag.setConstraints(inputPanel, c);
add(inputPanel); add(inputPanel);

View File

@@ -30,7 +30,6 @@ import net.runelite.client.ui.PluginPanel;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.GridLayout;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.HashMap; import java.util.HashMap;
@@ -42,7 +41,6 @@ import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@@ -50,7 +48,6 @@ public class XpPanel extends PluginPanel
{ {
private Map<Skill, JPanel> labelMap = new HashMap<>(); private Map<Skill, JPanel> labelMap = new HashMap<>();
private final XpTrackerPlugin xpTracker; private final XpTrackerPlugin xpTracker;
private JPanel statsPanel;
@Inject @Inject
@Nullable @Nullable
@@ -62,15 +59,9 @@ public class XpPanel extends PluginPanel
@Inject @Inject
public XpPanel(XpTrackerPlugin xpTracker) public XpPanel(XpTrackerPlugin xpTracker)
{ {
super();
this.xpTracker = xpTracker; this.xpTracker = xpTracker;
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
setSize(PANEL_WIDTH, PANEL_HEIGHT);
setVisible(true);
statsPanel = new JPanel();
statsPanel.setLayout(new GridLayout(24, 1));
try try
{ {
for (Skill skill : Skill.values()) for (Skill skill : Skill.values())
@@ -90,14 +81,9 @@ public class XpPanel extends PluginPanel
} }
JButton resetButton = new JButton("Reset All"); JButton resetButton = new JButton("Reset All");
resetButton.setPreferredSize(new Dimension(PANEL_WIDTH, 32));
resetButton.addActionListener((e) -> executor.execute(this::resetAllSkillXpHr)); resetButton.addActionListener((e) -> executor.execute(this::resetAllSkillXpHr));
resetButton.setPreferredSize(new Dimension(0, 32));
statsPanel.add(resetButton); add(resetButton);
JScrollPane scroll = new JScrollPane(statsPanel);
scroll.add(statsPanel);
add(statsPanel);
} }
private JButton makeSkillResetButton(Skill skill) throws IOException private JButton makeSkillResetButton(Skill skill) throws IOException
@@ -114,13 +100,12 @@ public class XpPanel extends PluginPanel
BorderLayout borderLayout = new BorderLayout(); BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(12); borderLayout.setHgap(12);
JPanel iconLevel = new JPanel(borderLayout); JPanel iconLevel = new JPanel(borderLayout);
iconLevel.setPreferredSize(new Dimension(PANEL_WIDTH, 32)); iconLevel.setPreferredSize(new Dimension(0, 32));
String skillIcon = "/skill_icons/" + skill.getName().toLowerCase() + ".png"; String skillIcon = "/skill_icons/" + skill.getName().toLowerCase() + ".png";
log.debug("Loading skill icon from {}", skillIcon); log.debug("Loading skill icon from {}", skillIcon);
JLabel icon = new JLabel(new ImageIcon(ImageIO.read(XpPanel.class.getResourceAsStream(skillIcon)))); JLabel icon = new JLabel(new ImageIcon(ImageIO.read(XpPanel.class.getResourceAsStream(skillIcon))));
iconLevel.add(icon, BorderLayout.LINE_START); iconLevel.add(icon, BorderLayout.LINE_START);
iconLevel.add(levelLabel, BorderLayout.CENTER); iconLevel.add(levelLabel, BorderLayout.CENTER);
iconLevel.add(makeSkillResetButton(skill), BorderLayout.LINE_END); iconLevel.add(makeSkillResetButton(skill), BorderLayout.LINE_END);
@@ -131,9 +116,8 @@ public class XpPanel extends PluginPanel
{ {
int skillIdx = skill.ordinal(); int skillIdx = skill.ordinal();
xpTracker.getXpInfos()[skillIdx].reset(client.getSkillExperience(skill)); xpTracker.getXpInfos()[skillIdx].reset(client.getSkillExperience(skill));
statsPanel.remove(labelMap.get(skill)); remove(labelMap.get(skill));
statsPanel.revalidate(); revalidate();
statsPanel.repaint();
} }
public void resetAllSkillXpHr() public void resetAllSkillXpHr()
@@ -165,11 +149,10 @@ public class XpPanel extends PluginPanel
JLabel xpHr = (JLabel) skillPanel.getComponent(1); JLabel xpHr = (JLabel) skillPanel.getComponent(1);
xpHr.setText(NumberFormat.getInstance().format(skillXPInfo.getXpHr()) + " xp/hr"); xpHr.setText(NumberFormat.getInstance().format(skillXPInfo.getXpHr()) + " xp/hr");
if (skillPanel.getParent() != statsPanel) if (skillPanel.getParent() != this)
{ {
statsPanel.add(skillPanel); add(skillPanel);
statsPanel.revalidate(); revalidate();
statsPanel.repaint();
} }
} }
} }

View File

@@ -33,6 +33,8 @@ import java.util.Enumeration;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource; import javax.swing.plaf.FontUIResource;
@@ -45,9 +47,9 @@ import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI;
@Slf4j @Slf4j
public class ClientUI extends JFrame public class ClientUI extends JFrame
{ {
private static final int PANEL_WIDTH = 809; private static final int CLIENT_WIDTH = 809;
private static final int PANEL_HEIGHT = 536; private static final int SCROLLBAR_WIDTH = 17;
private static final int EXPANDED_WIDTH = PANEL_WIDTH + PluginPanel.PANEL_WIDTH; private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH;
private final RuneLite runelite; private final RuneLite runelite;
private JPanel container; private JPanel container;
@@ -92,8 +94,7 @@ public class ClientUI extends JFrame
assert SwingUtilities.isEventDispatchThread(); assert SwingUtilities.isEventDispatchThread();
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setMinimumSize(new Dimension(CLIENT_WIDTH, 0));
addWindowListener(new WindowAdapter() addWindowListener(new WindowAdapter()
{ {
@Override @Override
@@ -140,23 +141,46 @@ public class ClientUI extends JFrame
} }
pluginPanel = panel; pluginPanel = panel;
navContainer.add(pluginPanel, BorderLayout.WEST); navContainer.add(wrapPanel(pluginPanel), BorderLayout.WEST);
container.validate(); container.validate();
this.setMinimumSize(new Dimension(EXPANDED_WIDTH, PANEL_HEIGHT)); this.setMinimumSize(new Dimension(EXPANDED_WIDTH, 0));
} }
void contract() void contract()
{ {
navContainer.remove(1); navContainer.remove(1);
container.validate(); container.validate();
this.setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); this.setMinimumSize(new Dimension(CLIENT_WIDTH, 0));
if (this.getWidth() == EXPANDED_WIDTH) if (this.getWidth() == EXPANDED_WIDTH)
{ {
this.setSize(PANEL_WIDTH, PANEL_HEIGHT); this.setSize(CLIENT_WIDTH, getHeight());
} }
pluginPanel = null; pluginPanel = null;
} }
private JPanel wrapPanel(PluginPanel panel)
{
final JPanel northPanel = new JPanel();
northPanel.setLayout(new BorderLayout());
northPanel.add(panel, BorderLayout.NORTH);
final JScrollPane scrollPane = new JScrollPane(northPanel);
scrollPane.getVerticalScrollBar().setUnitIncrement(16); //Otherwise scrollspeed is really slow
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
final JPanel panelWrap = new JPanel();
// Adjust the preferred size to expand to width of scrollbar to
// to preven scrollbar overlapping over contents
panelWrap.setPreferredSize(new Dimension(
PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH,
0));
panelWrap.setLayout(new BorderLayout());
panelWrap.add(scrollPane, BorderLayout.CENTER);
return panelWrap;
}
private void checkExit() private void checkExit()
{ {
Client client = runelite.getClient(); Client client = runelite.getClient();

View File

@@ -24,9 +24,27 @@
*/ */
package net.runelite.client.ui; package net.runelite.client.ui;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class PluginPanel extends JPanel public abstract class PluginPanel extends JPanel
{ {
public static final int PANEL_WIDTH = 225, PANEL_HEIGHT = 503; public static final int PANEL_WIDTH = 225;
private static final int OFFSET = 6;
private static final EmptyBorder BORDER_PADDING = new EmptyBorder(OFFSET, OFFSET, OFFSET, OFFSET);
public PluginPanel()
{
super();
setBorder(BORDER_PADDING);
setLayout(new GridLayout(0, 1, 0, 3));
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(PANEL_WIDTH, super.getPreferredSize().height);
}
} }