Initial commit
This commit is contained in:
389
src/main/java/combatmanager/CombatManager.java
Executable file
389
src/main/java/combatmanager/CombatManager.java
Executable file
@ -0,0 +1,389 @@
|
||||
package combatmanager;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.text.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.util.Objects;
|
||||
import java.util.prefs.Preferences;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class CombatManager extends JFrame {
|
||||
|
||||
public static final BufferedImage PLUS_IMAGE = loadImage("Plus.png", 20, 20);
|
||||
public static final BufferedImage DOWN_ARROW_IMAGE = loadImage("Down Arrow Filled.png", 20, 20);
|
||||
public static final BufferedImage UP_ARROW_IMAGE = loadImage("Up Arrow Filled.png", 20, 20);
|
||||
public static final BufferedImage THREE_BARS_IMAGE = loadImage("Three Bars.png", 20, 20);
|
||||
public static final BufferedImage MAGNIFYING_GLASS_IMAGE = loadImage("Magnifying Glass.png", 20, 20);
|
||||
public static final BufferedImage X_IMAGE = loadImage("X.png", 20, 20);
|
||||
public static final Pattern EMPTY_STRING_PATTERN = Pattern.compile("[ ]*");
|
||||
|
||||
private static final Insets FIVE_ON_SIDES = new Insets(5, 5, 5, 5);
|
||||
private static final Insets NO_INSETS = new Insets(0, 0, 0, 0);
|
||||
|
||||
public static final DocumentFilter digitFilter = new DocumentFilter() {
|
||||
|
||||
@Override
|
||||
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (char c : string.toCharArray()) {
|
||||
if (Character.isDigit(c)) {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
fb.insertString(offset, sb.toString(), attr);
|
||||
checkSize(fb);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (char c : text.toCharArray()) {
|
||||
if (Character.isDigit(c)) {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
fb.replace(offset, length, sb.toString(), attrs);
|
||||
checkSize(fb);
|
||||
}
|
||||
|
||||
private void checkSize(FilterBypass fb) throws BadLocationException {
|
||||
Document d = fb.getDocument();
|
||||
if (d.getLength() != 0) {
|
||||
String text = d.getText(0, d.getLength());
|
||||
try {
|
||||
Integer.parseInt(text);
|
||||
} catch (NumberFormatException e) {
|
||||
d.remove(d.getLength() - 1, 1);
|
||||
checkSize(fb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
private final ComponentAdapter resizeMoveListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
putObject("mainFrameSize", getSize());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
putObject("mainFrameLocation", getLocation());
|
||||
}
|
||||
};
|
||||
|
||||
private final WindowAdapter closeListener = new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
if (enemies.getComponentCount() == 0 || JOptionPane.showConfirmDialog(CombatManager.this, "Are you sure you would like to exit?", "Confirm Exit", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final DocumentListener searchBarListener = new DocumentListener() {
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
filterResults();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
filterResults();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
filterResults();
|
||||
}
|
||||
};
|
||||
|
||||
private final JPanel panel;
|
||||
private final JPanel addPanel;
|
||||
private final JTextField name;
|
||||
private final JTextField health;
|
||||
private final JButton showInfoFrame;
|
||||
private final JButton add;
|
||||
private final JButton filterOpenButton;
|
||||
private final JPanel filterPanel;
|
||||
private final JTextField searchBar;
|
||||
private final JButton filterMenuButton;
|
||||
private final JPopupMenu filterMenu;
|
||||
private final JCheckBoxMenuItem enemiesCheck;
|
||||
private final JCheckBoxMenuItem playerCheck;
|
||||
private final JCheckBoxMenuItem deadCheck;
|
||||
private final JButton removeVisible;
|
||||
private final JButton showVisible;
|
||||
private final JButton hideVisible;
|
||||
private final JButton frameSettings;
|
||||
private final JPopupMenu settingsMenu;
|
||||
private final JCheckBoxMenuItem onTop;
|
||||
private final JCheckBoxMenuItem resizeable;
|
||||
private final JCheckBoxMenuItem visible;
|
||||
private final JCheckBoxMenuItem player;
|
||||
private final JMenuItem frameSize;
|
||||
private final JMenuItem nameSize;
|
||||
private int defaultNameSize = 16;
|
||||
private final JMenuItem infoSize;
|
||||
private int defaultInfoSize = 12;
|
||||
private Dimension defaultFrameSize = new Dimension(75, 75);
|
||||
private final JPanel settings;
|
||||
private final JPanel enemies;
|
||||
private String publicInfo;
|
||||
private String privateInfo;
|
||||
|
||||
public CombatManager() {
|
||||
super("Combat Manager");
|
||||
addPanel = new JPanel(new GridBagLayout());
|
||||
name = new JTextField();
|
||||
health = new JTextField("0");
|
||||
((AbstractDocument) health.getDocument()).setDocumentFilter(digitFilter);
|
||||
showInfoFrame = new JButton("Edit Enemy Info");
|
||||
showInfoFrame.addActionListener(e -> {
|
||||
InfoInputFrame f = new InfoInputFrame(this, publicInfo, privateInfo);
|
||||
if (f.getResponse() == InfoInputFrame.OK_RESPONSE) {
|
||||
publicInfo = f.getPublic();
|
||||
privateInfo = f.getPrivate();
|
||||
}
|
||||
});
|
||||
add = new JButton(new ImageIcon(PLUS_IMAGE));
|
||||
add.setPreferredSize(new Dimension(20, 20));
|
||||
filterOpenButton = new JButton(new ImageIcon(DOWN_ARROW_IMAGE));
|
||||
filterOpenButton.setPreferredSize(new Dimension(20, 20));
|
||||
addPanel.add(addLabel("Name:", name), new GridBagConstraints(0, 0, 2, 1, 0.7, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
addPanel.add(addLabel("Health:", health), new GridBagConstraints(2, 0, 1, 1, 0.4, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
addPanel.add(showInfoFrame, new GridBagConstraints(3, 0, 3, 1, 0.9, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
addPanel.add(add, new GridBagConstraints(6, 0, 1, 1, 0.3, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, NO_INSETS, 0, 0));
|
||||
addPanel.add(filterOpenButton, new GridBagConstraints(7, 0, 1, 1, 0.3, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
searchBar = new JTextField();
|
||||
searchBar.getDocument().addDocumentListener(searchBarListener);
|
||||
filterMenuButton = new JButton(new ImageIcon(MAGNIFYING_GLASS_IMAGE));
|
||||
filterMenuButton.setPreferredSize(new Dimension(20, 20));
|
||||
filterMenu = new JPopupMenu();
|
||||
filterMenuButton.addActionListener(e -> filterMenu.show(filterMenuButton, 0, 0));
|
||||
enemiesCheck = new JCheckBoxMenuItem("Enemies", true);
|
||||
enemiesCheck.addActionListener(e -> filterResults());
|
||||
playerCheck = new JCheckBoxMenuItem("Players", true);
|
||||
playerCheck.addActionListener(e -> filterResults());
|
||||
deadCheck = new JCheckBoxMenuItem("Dead", true);
|
||||
deadCheck.addActionListener(e -> filterResults());
|
||||
filterMenu.add(enemiesCheck);
|
||||
filterMenu.add(playerCheck);
|
||||
filterMenu.add(deadCheck);
|
||||
removeVisible = new JButton("Delete Visible");
|
||||
showVisible = new JButton("Show Visible");
|
||||
hideVisible = new JButton("Hide Visible");
|
||||
frameSettings = new JButton(new ImageIcon(THREE_BARS_IMAGE));
|
||||
frameSettings.setPreferredSize(new Dimension(20, 20));
|
||||
settingsMenu = new JPopupMenu();
|
||||
frameSettings.addActionListener(e -> settingsMenu.show(frameSettings, 0, 0));
|
||||
onTop = new JCheckBoxMenuItem("Always on Top");
|
||||
resizeable = new JCheckBoxMenuItem("Resizeable");
|
||||
visible = new JCheckBoxMenuItem("Visible");
|
||||
player = new JCheckBoxMenuItem("Player");
|
||||
frameSize = new JMenuItem("Frame Size: " + defaultFrameSize.width + "x" + defaultFrameSize.height);
|
||||
frameSize.addActionListener(e -> {
|
||||
Size2DDialog d = new Size2DDialog(this, "Enter default frame size:", defaultFrameSize.width, defaultFrameSize.height);
|
||||
if (d.getResult() == Size2DDialog.OK_RESULT) {
|
||||
defaultFrameSize = d.getInputSize();
|
||||
frameSize.setText("Frame Size: " + defaultFrameSize.width + "x" + defaultFrameSize.height);
|
||||
}
|
||||
});
|
||||
nameSize = new JMenuItem("Name Size: " + defaultNameSize);
|
||||
nameSize.addActionListener(e -> {
|
||||
Size1DDialog d = new Size1DDialog(this, "Enter default name size:", defaultNameSize);
|
||||
if (d.getResult() == Size1DDialog.OK_RESULT) {
|
||||
defaultNameSize = d.getInputSize();
|
||||
nameSize.setText("Name Size: " + defaultNameSize);
|
||||
}
|
||||
});
|
||||
infoSize = new JMenuItem("Info Size: " + defaultInfoSize);
|
||||
infoSize.addActionListener(e -> {
|
||||
Size1DDialog d = new Size1DDialog(this, "Enter default info size:", defaultInfoSize);
|
||||
if (d.getResult() == Size1DDialog.OK_RESULT) {
|
||||
defaultInfoSize = d.getInputSize();
|
||||
infoSize.setText("Info Size: " + defaultInfoSize);
|
||||
}
|
||||
});
|
||||
settingsMenu.add(onTop);
|
||||
settingsMenu.add(resizeable);
|
||||
settingsMenu.add(visible);
|
||||
settingsMenu.addSeparator();
|
||||
settingsMenu.add(player);
|
||||
settingsMenu.addSeparator();
|
||||
settingsMenu.add(frameSize);
|
||||
settingsMenu.add(nameSize);
|
||||
settingsMenu.add(infoSize);
|
||||
filterPanel = new JPanel(new GridBagLayout());
|
||||
filterPanel.add(addLabel("Search:", searchBar), new GridBagConstraints(0, 0, 3, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.add(filterMenuButton, new GridBagConstraints(3, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.add(removeVisible, new GridBagConstraints(4, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.add(showVisible, new GridBagConstraints(5, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.add(hideVisible, new GridBagConstraints(6, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.add(frameSettings, new GridBagConstraints(7, 0, 1, 1, 0.3, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
filterPanel.setVisible(false);
|
||||
filterOpenButton.addActionListener(e -> {
|
||||
if (filterPanel.isVisible()) {
|
||||
filterOpenButton.setIcon(new ImageIcon(DOWN_ARROW_IMAGE));
|
||||
filterPanel.setVisible(false);
|
||||
} else {
|
||||
filterOpenButton.setIcon(new ImageIcon(UP_ARROW_IMAGE));
|
||||
filterPanel.setVisible(true);
|
||||
}
|
||||
});
|
||||
settings = new JPanel(new BorderLayout());
|
||||
settings.add(addPanel, BorderLayout.PAGE_START);
|
||||
settings.add(filterPanel, BorderLayout.PAGE_END);
|
||||
enemies = new JPanel();
|
||||
removeVisible.addActionListener(e -> {
|
||||
if (JOptionPane.showConfirmDialog(this, "Are your sure you would like do delete all visible enemies?", "Delete Enemies", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
|
||||
for (Component c : enemies.getComponents()) {
|
||||
if (c instanceof EnemyEntry) {
|
||||
EnemyEntry en = (EnemyEntry) c;
|
||||
if (en.isVisible()) {
|
||||
en.dispose();
|
||||
enemies.remove(en);
|
||||
}
|
||||
}
|
||||
}
|
||||
enemies.revalidate();
|
||||
enemies.repaint();
|
||||
}
|
||||
});
|
||||
showVisible.addActionListener(e -> {
|
||||
for (Component c : enemies.getComponents()) {
|
||||
if (c instanceof EnemyEntry) {
|
||||
EnemyEntry en = (EnemyEntry) c;
|
||||
if (en.isVisible() && !en.isFrameVisible()) {
|
||||
en.setFrameVisible(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
hideVisible.addActionListener(e -> {
|
||||
for (Component c : enemies.getComponents()) {
|
||||
if (c instanceof EnemyEntry) {
|
||||
EnemyEntry en = (EnemyEntry) c;
|
||||
if (en.isVisible() && en.isFrameVisible()) {
|
||||
en.setFrameVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
add.addActionListener(e -> {
|
||||
int maxHealth = 0;
|
||||
if (health.getText().length() != 0) {
|
||||
maxHealth = Integer.parseInt(health.getText());
|
||||
}
|
||||
String name = "Unnamed";
|
||||
if (!EMPTY_STRING_PATTERN.matcher(this.name.getText()).matches()) {
|
||||
name = this.name.getText();
|
||||
}
|
||||
enemies.add(new EnemyEntry(name, maxHealth, publicInfo, privateInfo, onTop.isSelected(), resizeable.isSelected(), visible.isSelected(), player.isSelected(), defaultFrameSize, defaultNameSize, defaultInfoSize));
|
||||
enemies.revalidate();
|
||||
});
|
||||
BoxLayout enemyLayout = new BoxLayout(enemies, BoxLayout.Y_AXIS);
|
||||
enemies.setLayout(enemyLayout);
|
||||
JScrollPane enemiesScroll = new JScrollPane(enemies);
|
||||
panel = new JPanel(new BorderLayout());
|
||||
panel.add(settings, BorderLayout.PAGE_START);
|
||||
panel.add(enemiesScroll, BorderLayout.CENTER);
|
||||
setContentPane(panel);
|
||||
setSize(getObject("mainFrameSize", new Dimension(500, 500)));
|
||||
setLocation(getObject("mainFrameLocation", new Point(0, 0)));
|
||||
addComponentListener(resizeMoveListener);
|
||||
setMinimumSize(new Dimension(750, 300));
|
||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||
addWindowListener(closeListener);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
private void filterResults() {
|
||||
String search = EMPTY_STRING_PATTERN.matcher(searchBar.getText()).matches() ? null : searchBar.getText().replace(" ", "").toLowerCase();
|
||||
Pattern p = search == null ? null : Pattern.compile(Pattern.quote(search));
|
||||
for (Component c : enemies.getComponents()) {
|
||||
if (c instanceof EnemyEntry) {
|
||||
EnemyEntry e = (EnemyEntry) c;
|
||||
Matcher m = null;
|
||||
if (p != null) {
|
||||
String data = e.getName().trim().replace(" ", "").toLowerCase() + " " + e.getPublicInfo().trim().replace(" ", "").toLowerCase() + " " + e.getHiddenInfo().trim().replace(" ", "").toLowerCase();
|
||||
m = p.matcher(data);
|
||||
}
|
||||
e.setVisible((m == null || m.find()) && ((e.isPlayer() && playerCheck.isSelected()) || (!e.isPlayer() && enemiesCheck.isSelected())) && (deadCheck.isSelected() || e.getHealth() > 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static final Preferences PREFERENCES = Preferences.userRoot().node("dndCombatManager");
|
||||
|
||||
public static void main(String[] args) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
|
||||
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
|
||||
new CombatManager();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T getObject(String key, T def) {
|
||||
byte[] dummy = new byte[0];
|
||||
byte[] data = PREFERENCES.getByteArray(key, dummy);
|
||||
if (data == dummy) {
|
||||
return def;
|
||||
}
|
||||
try {
|
||||
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
|
||||
return (T) in.readObject();
|
||||
} catch (IOException | ClassCastException | ClassNotFoundException e) {
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
public static void putObject(String key, Object obj) {
|
||||
try {
|
||||
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||
ObjectOutputStream out = new ObjectOutputStream(bytes);
|
||||
out.writeObject(Objects.requireNonNull(obj));
|
||||
PREFERENCES.putByteArray(key, bytes.toByteArray());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static BufferedImage loadImage(String name, int width, int height) {
|
||||
try {
|
||||
BufferedImage img = ImageIO.read(ClassLoader.getSystemResource(name));
|
||||
width = width < 1 ? img.getWidth() : width;
|
||||
height = height < 1 ? img.getHeight() : height;
|
||||
BufferedImage newImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g = newImg.createGraphics();
|
||||
g.drawImage(img.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH), 0, 0, null);
|
||||
g.dispose();
|
||||
return newImg;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static JComponent addLabel(String text, JComponent component) {
|
||||
return addLabel(new JLabel(text), component, 3);
|
||||
}
|
||||
|
||||
public static JComponent addLabel(JLabel text, JComponent component, int pad) {
|
||||
JPanel panel = new JPanel(new GridBagLayout());
|
||||
panel.setOpaque(false);
|
||||
panel.add(text, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, pad), 0, 0));
|
||||
panel.add(component, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, NO_INSETS, 0, 0));
|
||||
return panel;
|
||||
}
|
||||
|
||||
}
|
310
src/main/java/combatmanager/EnemyEntry.java
Executable file
310
src/main/java/combatmanager/EnemyEntry.java
Executable file
@ -0,0 +1,310 @@
|
||||
package combatmanager;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.MatteBorder;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.text.AbstractDocument;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class EnemyEntry extends JPanel {
|
||||
|
||||
private static final Insets FIVE_ON_SIDES = new Insets(5, 5, 5, 5);
|
||||
|
||||
private final DocumentListener healthUpdateListener = new DocumentListener() {
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
private void update() {
|
||||
if (getHealth() <= getMaxHealth() / 2) {
|
||||
setBackground(Color.red);
|
||||
frame.setBackground(Color.red);
|
||||
} else {
|
||||
Color c = UIManager.getColor("Panel.background");
|
||||
setBackground(c);
|
||||
frame.setBackground(c);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final DocumentListener nameListener = new DocumentListener() {
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
private void update() {
|
||||
frame.setTitle(name.getText());
|
||||
}
|
||||
};
|
||||
|
||||
private final ComponentAdapter frameSizeListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
frameSize.setText("Frame Size: " + e.getComponent().getWidth() + "x" + e.getComponent().getHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent e) {
|
||||
visible.setSelected(false);
|
||||
}
|
||||
};
|
||||
|
||||
private MouseAdapter moveListener = new MouseAdapter() {
|
||||
private int x;
|
||||
private int y;
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.isShiftDown()) {
|
||||
resizeable.setSelected(!resizeable.isSelected());
|
||||
EnemyFrame f = new EnemyFrame(name.getText(), publicInfo, onTop.isSelected(), resizeable.isSelected(), visible.isSelected(), player.isSelected(), frame.getNameSize(), frame.getInfoSize());
|
||||
f.setSize(frame.getSize());
|
||||
f.setLocation(frame.getLocation());
|
||||
f.addMouseListener(moveListener);
|
||||
f.addMouseMotionListener(moveListener);
|
||||
f.getInfo().addMouseListener(moveListener);
|
||||
f.addComponentListener(frameSizeListener);
|
||||
frame.dispose();
|
||||
frame = f;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (!e.isShiftDown() && e.getSource() == frame) {
|
||||
x = e.getX();
|
||||
y = e.getY();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (!e.isShiftDown() && e.getSource() == frame) {
|
||||
frame.setLocation(e.getXOnScreen() - x, e.getYOnScreen() - y);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final JTextField name;
|
||||
private final JTextField health;
|
||||
private final JTextField maxHealth;
|
||||
private final JButton showInfoFrame;
|
||||
private final JButton copy;
|
||||
private final JButton remove;
|
||||
private EnemyFrame frame;
|
||||
private final JPopupMenu frameMenu;
|
||||
private final JCheckBoxMenuItem onTop;
|
||||
private final JCheckBoxMenuItem resizeable;
|
||||
private final JCheckBoxMenuItem visible;
|
||||
private final JCheckBoxMenuItem player;
|
||||
private final JMenuItem frameSize;
|
||||
private final JMenuItem nameSize;
|
||||
private final JMenuItem infoSize;
|
||||
private final JButton frameMenuButton;
|
||||
private String publicInfo;
|
||||
private String privateInfo;
|
||||
|
||||
public EnemyEntry(String name, int maxHealth, String publicInfo, String privateInfo, boolean onTop, boolean resizeable, boolean visible, boolean player, Dimension size, int nameSize, int infoSize) {
|
||||
super(new GridBagLayout());
|
||||
setBorder(new MatteBorder(1, 1, 1, 1, Color.lightGray));
|
||||
this.name = new JTextField(notNull(name), 7);
|
||||
this.name.getDocument().addDocumentListener(nameListener);
|
||||
this.health = new JTextField(String.valueOf(maxHealth), 3);
|
||||
this.health.getDocument().addDocumentListener(healthUpdateListener);
|
||||
((AbstractDocument) this.health.getDocument()).setDocumentFilter(CombatManager.digitFilter);
|
||||
this.maxHealth = new JTextField(String.valueOf(maxHealth), 3);
|
||||
this.maxHealth.getDocument().addDocumentListener(healthUpdateListener);
|
||||
((AbstractDocument) this.maxHealth.getDocument()).setDocumentFilter(CombatManager.digitFilter);
|
||||
this.publicInfo = publicInfo == null ? "" : publicInfo;
|
||||
this.privateInfo = privateInfo == null ? "" : privateInfo;
|
||||
showInfoFrame = new JButton("Edit Enemy Info");
|
||||
showInfoFrame.addActionListener(e -> {
|
||||
InfoInputFrame f = new InfoInputFrame(SwingUtilities.getWindowAncestor(this), this.publicInfo, this.privateInfo);
|
||||
if (f.getResponse() == InfoInputFrame.OK_RESPONSE) {
|
||||
this.publicInfo = f.getPublic();
|
||||
this.privateInfo = f.getPrivate();
|
||||
frame.setText(this.publicInfo);
|
||||
}
|
||||
});
|
||||
copy = new JButton(new ImageIcon(CombatManager.PLUS_IMAGE));
|
||||
copy.setPreferredSize(new Dimension(20, 20));
|
||||
remove = new JButton(new ImageIcon(CombatManager.X_IMAGE));
|
||||
remove.setPreferredSize(new Dimension(20, 20));
|
||||
frame = new EnemyFrame(name, publicInfo, onTop, resizeable, visible, player, nameSize, infoSize);
|
||||
frame.setSize(size);
|
||||
frame.addComponentListener(frameSizeListener);
|
||||
frame.addMouseListener(moveListener);
|
||||
frame.addMouseMotionListener(moveListener);
|
||||
frame.getInfo().addMouseListener(moveListener);
|
||||
remove.addActionListener(e -> {
|
||||
if (JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), "Are you sure you want to remove this enemy?", "Confirm Remove", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
|
||||
frame.dispose();
|
||||
Container parent = getParent();
|
||||
parent.remove(this);
|
||||
parent.revalidate();
|
||||
parent.repaint();
|
||||
}
|
||||
});
|
||||
frameMenu = new JPopupMenu();
|
||||
this.onTop = new JCheckBoxMenuItem("Always on Top", onTop);
|
||||
this.onTop.addActionListener(e -> frame.setAlwaysOnTop(this.onTop.isSelected()));
|
||||
this.resizeable = new JCheckBoxMenuItem("Resizeable", resizeable);
|
||||
this.visible = new JCheckBoxMenuItem("Visible", visible);
|
||||
this.visible.addActionListener(e -> frame.setVisible(this.visible.isSelected()));
|
||||
this.player = new JCheckBoxMenuItem("Player", player);
|
||||
this.player.addActionListener(e -> frame.setPlayer(this.player.isSelected()));
|
||||
this.frameSize = new JMenuItem("Frame Size: " + frame.getWidth() + "x" + frame.getHeight());
|
||||
this.frameSize.addActionListener(e -> {
|
||||
Size2DDialog d = new Size2DDialog(SwingUtilities.getWindowAncestor(this), "Enter new frame size:", frame.getWidth(), frame.getHeight());
|
||||
if (d.getResult() == Size2DDialog.OK_RESULT) {
|
||||
frame.setSize(d.getInputSize());
|
||||
}
|
||||
});
|
||||
this.nameSize = new JMenuItem("Name Size: " + nameSize);
|
||||
this.nameSize.addActionListener(e -> {
|
||||
Size1DDialog d = new Size1DDialog(SwingUtilities.getWindowAncestor(this), "Enter name size:", frame.getNameSize());
|
||||
if (d.getResult() == Size1DDialog.OK_RESULT) {
|
||||
int s = d.getInputSize();
|
||||
frame.setNameSize(s);
|
||||
this.nameSize.setText("Name Size: " + s);
|
||||
}
|
||||
});
|
||||
this.infoSize = new JMenuItem("Info Size: " + infoSize);
|
||||
this.infoSize.addActionListener(e -> {
|
||||
Size1DDialog d = new Size1DDialog(SwingUtilities.getWindowAncestor(this), "Enter info size:", frame.getInfoSize());
|
||||
if (d.getResult() == Size1DDialog.OK_RESULT) {
|
||||
int s = d.getInputSize();
|
||||
frame.setInfoSize(s);
|
||||
this.infoSize.setText("Info Size: " + s);
|
||||
}
|
||||
});
|
||||
this.resizeable.addActionListener(e -> {
|
||||
EnemyFrame f = new EnemyFrame(this.name.getText(), this.publicInfo, this.onTop.isSelected(), this.resizeable.isSelected(), this.visible.isSelected(), this.player.isSelected(), frame.getNameSize(), frame.getInfoSize());
|
||||
f.setSize(frame.getSize());
|
||||
f.setLocation(frame.getLocation());
|
||||
f.addMouseListener(moveListener);
|
||||
f.addMouseMotionListener(moveListener);
|
||||
f.getInfo().addMouseListener(moveListener);
|
||||
f.addComponentListener(frameSizeListener);
|
||||
frame.dispose();
|
||||
frame = f;
|
||||
});
|
||||
frameMenu.add(this.onTop);
|
||||
frameMenu.add(this.resizeable);
|
||||
frameMenu.add(this.visible);
|
||||
frameMenu.addSeparator();
|
||||
frameMenu.add(this.player);
|
||||
frameMenu.addSeparator();
|
||||
frameMenu.add(frameSize);
|
||||
frameMenu.add(this.nameSize);
|
||||
frameMenu.add(this.infoSize);
|
||||
frameMenuButton = new JButton(new ImageIcon(CombatManager.THREE_BARS_IMAGE));
|
||||
frameMenuButton.setPreferredSize(new Dimension(20, 20));
|
||||
frameMenuButton.addActionListener(e -> frameMenu.show(frameMenuButton, 0, 0));
|
||||
copy.addActionListener(e -> {
|
||||
String newName = this.name.getText();
|
||||
if ((e.getModifiers() & InputEvent.SHIFT_DOWN_MASK) != 0) {
|
||||
newName = (String) JOptionPane.showInputDialog(SwingUtilities.getWindowAncestor(this), "Enter new name:", "Copy Enemy", JOptionPane.QUESTION_MESSAGE, null, null, this.name.getText());
|
||||
}
|
||||
if (newName != null) {
|
||||
EnemyEntry o = new EnemyEntry(newName, getMaxHealth(), this.publicInfo, this.privateInfo, this.onTop.isSelected(), this.resizeable.isSelected(), this.visible.isSelected(), this.player.isSelected(), frame.getSize(), frame.getNameSize(), frame.getInfoSize());
|
||||
o.frame.setSize(frame.getSize());
|
||||
getParent().add(o);
|
||||
getParent().revalidate();
|
||||
}
|
||||
});
|
||||
add(CombatManager.addLabel("Name:", this.name), new GridBagConstraints(0, 0, 2, 1, 0.6, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
add(CombatManager.addLabel("Health:", health), new GridBagConstraints(2, 0, 2, 1, 0.6, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 0), 0, 0));
|
||||
add(new JLabel("/"), new GridBagConstraints(5, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 0, 5, 0), 0, 0));
|
||||
add(this.maxHealth, new GridBagConstraints(6, 0, 2, 1, 0.6, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 5), 0, 0));
|
||||
add(showInfoFrame, new GridBagConstraints(8, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
add(copy, new GridBagConstraints(9, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
add(remove, new GridBagConstraints(10, 0, 1, 1, 0.3, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
add(frameMenuButton, new GridBagConstraints(11, 0, 1, 1, 0.3, 0.3, GridBagConstraints.CENTER, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
}
|
||||
|
||||
public boolean isFrameVisible() {
|
||||
return frame.isVisible();
|
||||
}
|
||||
|
||||
public void setFrameVisible(boolean visible) {
|
||||
frame.setVisible(visible);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
frame.dispose();
|
||||
}
|
||||
|
||||
public int getMaxHealth() {
|
||||
try {
|
||||
return maxHealth.getText().length() == 0 ? 0 : Integer.parseInt(maxHealth.getText());
|
||||
} catch (NumberFormatException e) {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
public int getHealth() {
|
||||
try {
|
||||
return health.getText().length() == 0 ? 0 : Integer.parseInt(health.getText());
|
||||
} catch (NumberFormatException e) {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name.getText();
|
||||
}
|
||||
|
||||
public String getPublicInfo() {
|
||||
return publicInfo;
|
||||
}
|
||||
|
||||
public String getHiddenInfo() {
|
||||
return privateInfo;
|
||||
}
|
||||
|
||||
public boolean isPlayer() {
|
||||
return player.isSelected();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension getPreferredSize() {
|
||||
return getMaximumSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension getMaximumSize() {
|
||||
return new Dimension(getParent().getWidth() - 5, 45);
|
||||
}
|
||||
|
||||
private static String notNull(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
|
||||
}
|
91
src/main/java/combatmanager/EnemyFrame.java
Executable file
91
src/main/java/combatmanager/EnemyFrame.java
Executable file
@ -0,0 +1,91 @@
|
||||
package combatmanager;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.MatteBorder;
|
||||
import java.awt.*;
|
||||
|
||||
public class EnemyFrame extends JFrame {
|
||||
|
||||
private final JPanel panel;
|
||||
private final JLabel name;
|
||||
private final JTextArea info;
|
||||
|
||||
public EnemyFrame(String name, String info, boolean onTop, boolean resizeable, boolean visible, boolean player, int nameSize, int infoSize) {
|
||||
super(name);
|
||||
setResizable(false);
|
||||
setSize(75, 75);
|
||||
setAlwaysOnTop(onTop);
|
||||
setResizable(true);
|
||||
setUndecorated(!resizeable);
|
||||
this.name = new JLabel(name);
|
||||
this.name.setFont(new Font(Font.SANS_SERIF, Font.BOLD, nameSize));
|
||||
this.name.setBorder(new MatteBorder(0, 0, 1, 0, Color.lightGray));
|
||||
if (player) {
|
||||
this.name.setOpaque(true);
|
||||
this.name.setBackground(Color.cyan);
|
||||
}
|
||||
this.info = new JTextArea(info);
|
||||
this.info.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, infoSize));
|
||||
this.info.setDisabledTextColor(this.name.getForeground());
|
||||
this.info.setEnabled(false);
|
||||
this.info.setLineWrap(true);
|
||||
this.info.setBackground(getBackground());
|
||||
JScrollPane infoScroll = new JScrollPane(this.info);
|
||||
infoScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
infoScroll.setBorder(null);
|
||||
panel = new JPanel(new BorderLayout());
|
||||
panel.add(this.name, BorderLayout.PAGE_START);
|
||||
panel.add(infoScroll, BorderLayout.CENTER);
|
||||
setContentPane(panel);
|
||||
setDefaultCloseOperation(HIDE_ON_CLOSE);
|
||||
setVisible(visible);
|
||||
}
|
||||
|
||||
public void setNameSize(int size) {
|
||||
name.setFont(new Font(Font.SANS_SERIF, Font.BOLD, size));
|
||||
}
|
||||
|
||||
public void setInfoSize(int size) {
|
||||
info.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, size));
|
||||
}
|
||||
|
||||
public int getNameSize() {
|
||||
return name.getFont().getSize();
|
||||
}
|
||||
|
||||
public int getInfoSize() {
|
||||
return info.getFont().getSize();
|
||||
}
|
||||
|
||||
public JTextArea getInfo() {
|
||||
return info;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBackground(Color bgColor) {
|
||||
super.setBackground(bgColor);
|
||||
if (panel != null) panel.setBackground(bgColor);
|
||||
if (info != null) info.setBackground(bgColor);
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
info.setText(text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTitle(String title) {
|
||||
super.setTitle(title);
|
||||
if (name != null) this.name.setText(title);
|
||||
}
|
||||
|
||||
public void setPlayer(boolean player) {
|
||||
if (player) {
|
||||
this.name.setOpaque(true);
|
||||
this.name.setBackground(Color.cyan);
|
||||
} else {
|
||||
this.name.setOpaque(false);
|
||||
this.name.setBackground(null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
95
src/main/java/combatmanager/InfoInputFrame.java
Executable file
95
src/main/java/combatmanager/InfoInputFrame.java
Executable file
@ -0,0 +1,95 @@
|
||||
package combatmanager;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
|
||||
public class InfoInputFrame extends JDialog {
|
||||
|
||||
private static final Insets FIVE_ON_SIDES = new Insets(5, 5, 5, 5);
|
||||
|
||||
public static final int OK_RESPONSE = 0;
|
||||
public static final int CANCEL_RESPONSE = 1;
|
||||
|
||||
private final JPanel panel;
|
||||
private final JLabel publicMessage;
|
||||
private final JTextArea publicPane;
|
||||
private final JLabel privateMessage;
|
||||
private final JTextArea privatePane;
|
||||
private final JButton ok;
|
||||
private final JButton cancel;
|
||||
private int response;
|
||||
|
||||
public InfoInputFrame(Window parent, String pm, String hm) {
|
||||
super(parent, "Edit Enemy Info");
|
||||
setModalityType(ModalityType.APPLICATION_MODAL);
|
||||
setAlwaysOnTop(true);
|
||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||
setMinimumSize(new Dimension(200, 200));
|
||||
addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
response = CANCEL_RESPONSE;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
publicMessage = new JLabel("Public:");
|
||||
publicPane = new JTextArea(pm);
|
||||
privateMessage = new JLabel("Private:");
|
||||
privatePane = new JTextArea(hm);
|
||||
ok = new JButton("Ok");
|
||||
ok.addActionListener(e -> {
|
||||
response = OK_RESPONSE;
|
||||
dispose();
|
||||
});
|
||||
cancel = new JButton("Cancel");
|
||||
cancel.addActionListener(e -> {
|
||||
response = CANCEL_RESPONSE;
|
||||
dispose();
|
||||
});
|
||||
panel = new JPanel(new GridBagLayout());
|
||||
panel.add(publicMessage, new GridBagConstraints(0, 0, GridBagConstraints.REMAINDER, 1, 0.0, 0.0,
|
||||
GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(new JScrollPane(publicPane), new GridBagConstraints(0, 1, GridBagConstraints.REMAINDER, 50, 1.0, 1.0,
|
||||
GridBagConstraints.CENTER, GridBagConstraints.BOTH, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(privateMessage, new GridBagConstraints(0, 51, GridBagConstraints.REMAINDER, 1, 0.0, 0.0,
|
||||
GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(new JScrollPane(privatePane), new GridBagConstraints(0, 52, GridBagConstraints.REMAINDER, 50, 1.0,
|
||||
1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(ok, new GridBagConstraints(0, 102, 1, 1, 0.5, 0.5, GridBagConstraints.CENTER,
|
||||
GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(cancel, new GridBagConstraints(1, 102, GridBagConstraints.REMAINDER, 1, 0.5, 0.5,
|
||||
GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
getRootPane().setDefaultButton(ok);
|
||||
setContentPane(panel);
|
||||
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
setSize(screenSize.width / 5, screenSize.height / 4);
|
||||
setLocation(parent.getX() + (parent.getWidth() / 2) - (getWidth() / 2),
|
||||
parent.getY() + (parent.getHeight() / 2) - (getHeight() / 2));
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public int getResponse() {
|
||||
return response;
|
||||
}
|
||||
|
||||
public String getPublic() {
|
||||
return publicPane.getText();
|
||||
}
|
||||
|
||||
public String getPrivate() {
|
||||
return privatePane.getText();
|
||||
}
|
||||
}
|
70
src/main/java/combatmanager/Size1DDialog.java
Executable file
70
src/main/java/combatmanager/Size1DDialog.java
Executable file
@ -0,0 +1,70 @@
|
||||
package combatmanager;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.AbstractDocument;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
public class Size1DDialog extends JDialog {
|
||||
|
||||
public static final int OK_RESULT = 0;
|
||||
public static final int CANCEL_RESULT = 1;
|
||||
|
||||
private static final Insets FIVE_ON_SIDES = new Insets(5, 5, 5, 5);
|
||||
|
||||
private final JPanel panel;
|
||||
private final JLabel message;
|
||||
private final JTextField field;
|
||||
private final JButton ok;
|
||||
private final JButton cancel;
|
||||
private int result;
|
||||
|
||||
public Size1DDialog(Window parent, String message, int size) {
|
||||
super(parent, "Enter Size");
|
||||
setResizable(false);
|
||||
setAlwaysOnTop(true);
|
||||
addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
result = CANCEL_RESULT;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||
setModalityType(ModalityType.APPLICATION_MODAL);
|
||||
this.message = new JLabel(message);
|
||||
field = new JTextField(String.valueOf(size), 4);
|
||||
((AbstractDocument) field.getDocument()).setDocumentFilter(CombatManager.digitFilter);
|
||||
ok = new JButton("Ok");
|
||||
ok.addActionListener(e -> {
|
||||
result = OK_RESULT;
|
||||
dispose();
|
||||
});
|
||||
cancel = new JButton("Cancel");
|
||||
cancel.addActionListener(e -> {
|
||||
result = CANCEL_RESULT;
|
||||
dispose();
|
||||
});
|
||||
panel = new JPanel(new GridBagLayout());
|
||||
panel.add(this.message, new GridBagConstraints(0, 0, 2, 1, 0.2, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(field, new GridBagConstraints(2, 0, GridBagConstraints.REMAINDER, 1, 0.4, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(ok, new GridBagConstraints(0, 1, 1, 1, 0.5, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(cancel, new GridBagConstraints(1, 1, GridBagConstraints.REMAINDER, 1, 0.5, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, FIVE_ON_SIDES, 0, 0));
|
||||
setContentPane(panel);
|
||||
getRootPane().setDefaultButton(ok);
|
||||
pack();
|
||||
setLocation(parent.getX() + (parent.getWidth() / 2) - (getWidth() / 2), parent.getY() + (parent.getHeight() / 2) - (getHeight() / 2));
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public int getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getInputSize() {
|
||||
int size = Integer.parseInt(field.getText());
|
||||
return size == 0 ? 1 : size;
|
||||
}
|
||||
|
||||
}
|
82
src/main/java/combatmanager/Size2DDialog.java
Executable file
82
src/main/java/combatmanager/Size2DDialog.java
Executable file
@ -0,0 +1,82 @@
|
||||
package combatmanager;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.AbstractDocument;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
public class Size2DDialog extends JDialog {
|
||||
|
||||
public static final int OK_RESULT = 0;
|
||||
public static final int CANCEL_RESULT = 1;
|
||||
|
||||
private static final Insets FIVE_ON_SIDES = new Insets(5, 5, 5, 5);
|
||||
|
||||
private final JPanel panel;
|
||||
private final JLabel message;
|
||||
private final JTextField width;
|
||||
private final JTextField height;
|
||||
private final JButton ok;
|
||||
private final JButton cancel;
|
||||
private int result;
|
||||
|
||||
public Size2DDialog(Window parent, String message, int width, int height) {
|
||||
super(parent, "Enter Size");
|
||||
setModalityType(ModalityType.APPLICATION_MODAL);
|
||||
setAlwaysOnTop(true);
|
||||
setResizable(false);
|
||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||
addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
result = CANCEL_RESULT;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
this.message = new JLabel(message);
|
||||
this.width = new JTextField(String.valueOf(width), 4);
|
||||
((AbstractDocument) this.width.getDocument()).setDocumentFilter(CombatManager.digitFilter);
|
||||
this.height = new JTextField(String.valueOf(height), 4);
|
||||
((AbstractDocument) this.height.getDocument()).setDocumentFilter(CombatManager.digitFilter);
|
||||
ok = new JButton("Ok");
|
||||
ok.addActionListener(e -> {
|
||||
result = OK_RESULT;
|
||||
dispose();
|
||||
});
|
||||
cancel = new JButton("Cancel");
|
||||
cancel.addActionListener(e -> {
|
||||
result = CANCEL_RESULT;
|
||||
dispose();
|
||||
});
|
||||
panel = new JPanel(new GridBagLayout());
|
||||
panel.add(this.message, new GridBagConstraints(0, 0, GridBagConstraints.REMAINDER, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(this.width, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.4, GridBagConstraints.PAGE_START, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0));
|
||||
panel.add(new JLabel("x"), new GridBagConstraints(1, 1, 1, 1, 0.1, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 0, 5, 0), 0, 0));
|
||||
panel.add(this.height, new GridBagConstraints(2, 1, GridBagConstraints.REMAINDER, 1, 0.4, 0.0, GridBagConstraints.PAGE_END, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
|
||||
panel.add(ok, new GridBagConstraints(0, 2, 1, 1, 0.7, 0.0, GridBagConstraints.PAGE_START, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
panel.add(cancel, new GridBagConstraints(1, 2, GridBagConstraints.REMAINDER, 1, 0.7, 0.0, GridBagConstraints.PAGE_END, GridBagConstraints.NONE, FIVE_ON_SIDES, 0, 0));
|
||||
setContentPane(panel);
|
||||
getRootPane().setDefaultButton(ok);
|
||||
pack();
|
||||
setLocation(parent.getX() + (parent.getWidth() / 2) - (getWidth() / 2), parent.getY() + (parent.getHeight() / 2) - (getHeight() / 2));
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public int getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public Dimension getInputSize() {
|
||||
int width = 1;
|
||||
if (this.width.getText().length() != 0) {
|
||||
width = Integer.parseInt(this.width.getText());
|
||||
}
|
||||
int height = 1;
|
||||
if (this.height.getText().length() != 0) {
|
||||
height = Integer.parseInt(this.height.getText());
|
||||
}
|
||||
return new Dimension(width == 0 ? 1 : width, height == 0 ? 1 : height);
|
||||
}
|
||||
|
||||
}
|
BIN
src/main/resources/Down Arrow Filled.png
Executable file
BIN
src/main/resources/Down Arrow Filled.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
BIN
src/main/resources/Down Arrow Filled.xcf
Executable file
BIN
src/main/resources/Down Arrow Filled.xcf
Executable file
Binary file not shown.
BIN
src/main/resources/Magnifying Glass.png
Executable file
BIN
src/main/resources/Magnifying Glass.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
BIN
src/main/resources/Magnifying Glass.xcf
Executable file
BIN
src/main/resources/Magnifying Glass.xcf
Executable file
Binary file not shown.
BIN
src/main/resources/Plus.png
Executable file
BIN
src/main/resources/Plus.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
src/main/resources/Plus.xcf
Executable file
BIN
src/main/resources/Plus.xcf
Executable file
Binary file not shown.
BIN
src/main/resources/Three Bars.png
Executable file
BIN
src/main/resources/Three Bars.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
src/main/resources/Three Bars.xcf
Executable file
BIN
src/main/resources/Three Bars.xcf
Executable file
Binary file not shown.
BIN
src/main/resources/Up Arrow Filled.png
Executable file
BIN
src/main/resources/Up Arrow Filled.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
BIN
src/main/resources/Up Arrow Filled.xcf
Executable file
BIN
src/main/resources/Up Arrow Filled.xcf
Executable file
Binary file not shown.
BIN
src/main/resources/X.png
Executable file
BIN
src/main/resources/X.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
BIN
src/main/resources/X.xcf
Executable file
BIN
src/main/resources/X.xcf
Executable file
Binary file not shown.
Reference in New Issue
Block a user