Initial commit

This commit is contained in:
2022-08-28 14:53:19 -07:00
commit 9778664b2b
22 changed files with 1729 additions and 0 deletions

View 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;
}
}

View 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;
}
}

View 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);
}
}
}

View 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();
}
}

View 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;
}
}

View 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);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

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

Binary file not shown.