Compare commits

...

25 Commits

Author SHA1 Message Date
OMGeeky
775aba3a3f refactor: improve bounds checking in getElementAt method in CommonEditor 2025-06-18 13:53:49 +02:00
OMGeeky
bec4ddb71c refactor: update object handling in ReplaceArea and TMXMapEditor for consistency 2025-06-18 13:53:31 +02:00
OMGeeky
58603d32a1 add todo 2025-06-16 12:38:12 +02:00
OMGeeky
829bb336b8 cleanup 2025-06-16 12:38:00 +02:00
OMGeeky
57cf71da17 refactor: simplify panel creation for rewards and conditions in DialogueEditor & NPCEditor 2025-06-16 12:33:35 +02:00
OMGeeky
84dbca6ce1 refactor: encapsulate death effect panel creation in CommonEditor 2025-06-16 12:12:25 +02:00
OMGeeky
d6d742feac cleanup 2025-06-16 11:46:54 +02:00
OMGeeky
b775be08fc refactor: update createListPanel to return a result object containing both panel and list 2025-06-16 11:46:22 +02:00
OMGeeky
63d6397da5 refactor: streamline list panel creation in DroplistEditor & ItemEditor 2025-06-16 11:16:12 +02:00
OMGeeky
ee6907efdd refactor: streamline requirements panel creation in DialogueEditor 2025-06-16 10:50:32 +02:00
OMGeeky
02210d7581 refactor: clean up formatting and remove unnecessary line breaks in editor classes 2025-06-16 10:45:01 +02:00
OMGeeky
8a7ad08aa7 refactor: add navigation handling for replies in CommonEditor and DialogueEditor 2025-06-16 10:44:44 +02:00
OMGeeky
0081c325bb refactor: simplify stages panel creation in QuestEditor 2025-06-16 10:25:50 +02:00
OMGeeky
e10bcfe20f refactor: remove isCollapsed parameter and handle collapsing logic in DialogueEditor 2025-06-16 10:17:30 +02:00
OMGeeky
9deac7047f formatting 2025-06-16 10:11:41 +02:00
OMGeeky
0befc5563b refactor: change more ListModel implementations to AtListModel 2025-06-16 10:11:06 +02:00
OMGeeky
f747c40520 refactor: change StagesListModel to AtListModel 2025-06-16 09:57:17 +02:00
OMGeeky
92be506c11 refactor: add option to enable up down buttons or not 2025-06-16 09:56:40 +02:00
OMGeeky
64ea5377bf refactor: extract common ListModel implementation to AtListModel
and use that for moving elements up and down
2025-06-16 09:46:14 +02:00
OMGeeky
719be70744 refactor: extract replies panel creation to CommonEditor 2025-06-16 09:28:21 +02:00
OMGeeky
8f846c6098 add lambda call interfaces for single and multiple arguments 2025-06-16 09:27:19 +02:00
OMGeeky
975d13f36f extract wordWrap function to common class 2025-06-16 08:31:22 +02:00
OMGeeky
0a1fef4198 refactor: simplify link method by extracting parsing/linking logic 2025-06-16 08:23:43 +02:00
OMGeeky
5809d33bb4 refactor: remove unnecessary blank lines in multiple classes 2025-06-16 08:23:31 +02:00
OMGeeky
d8797fa826 add .output.txt to .gitignore 2025-06-16 07:49:46 +02:00
25 changed files with 6234 additions and 7221 deletions

1
.gitignore vendored
View File

@@ -11,3 +11,4 @@ ATCS.jar
/packaging/common/ATCS.env.bat /packaging/common/ATCS.env.bat
/packaging/common/ATCS.env /packaging/common/ATCS.env
/packaging/common/ATCS_v*.zip /packaging/common/ATCS_v*.zip
/.output.txt

View File

@@ -190,4 +190,30 @@ public abstract class GameDataElement implements ProjectTreeNode, Serializable {
public abstract List<SaveEvent> attemptSave(); public abstract List<SaveEvent> attemptSave();
/**
* Checks if the current state indicates that parsing/linking should be skipped.
* @return true if the operation should be skipped, false otherwise
*/
protected boolean shouldSkipParseOrLink() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
//This type of state is unrelated to parsing/linking.
return true;
}
if (this.state == State.linked) {
//Already linked.
return true;
}
return false;
}
/**
* Ensures the element is parsed if needed based on its current state.
*/
protected void ensureParseIfNeeded() {
if (this.state == State.init) {
//Not parsed yet.
this.parse();
}
}
} }

View File

@@ -224,17 +224,10 @@ public class ActorCondition extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
if (this.icon_id != null) { if (this.icon_id != null) {
String spritesheetId = this.icon_id.split(":")[0]; String spritesheetId = this.icon_id.split(":")[0];
if (getProject().getSpritesheet(spritesheetId) == null) { if (getProject().getSpritesheet(spritesheetId) == null) {

View File

@@ -206,17 +206,10 @@ public class Dialogue extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking dialogue "+id+". No parent project found."); Notification.addError("Error linking dialogue "+id+". No parent project found.");

View File

@@ -129,17 +129,10 @@ public class Droplist extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking droplist "+id+". No parent project found."); Notification.addError("Error linking droplist "+id+". No parent project found.");

View File

@@ -206,17 +206,10 @@ public class Item extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking item "+id+". No parent project found."); Notification.addError("Error linking item "+id+". No parent project found.");

View File

@@ -171,17 +171,10 @@ public class ItemCategory extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
//Nothing to link to :D //Nothing to link to :D
this.state = State.linked; this.state = State.linked;

View File

@@ -26,8 +26,7 @@ public abstract class JSONElement extends GameDataElement {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void parse() { public void parse() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return; return;
} }
JSONParser parser = new JSONParser(); JSONParser parser = new JSONParser();

View File

@@ -208,17 +208,10 @@ public class NPC extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
Project proj = getProject(); Project proj = getProject();
if (proj == null) { if (proj == null) {
Notification.addError("Error linking item "+id+". No parent project found."); Notification.addError("Error linking item "+id+". No parent project found.");

View File

@@ -113,17 +113,10 @@ public class Quest extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
for (QuestStage stage : stages) { for (QuestStage stage : stages) {
stage.link(); stage.link();

View File

@@ -59,17 +59,10 @@ public class QuestStage extends JSONElement {
@Override @Override
public void link() { public void link() {
if (this.state == State.created || this.state == State.modified || this.state == State.saved) { if (shouldSkipParseOrLink()) {
//This type of state is unrelated to parsing/linking.
return;
}
if (this.state == State.init) {
//Not parsed yet.
this.parse();
} else if (this.state == State.linked) {
//Already linked.
return; return;
} }
ensureParseIfNeeded();
//Nothing to link to :D //Nothing to link to :D
this.state = State.linked; this.state = State.linked;

View File

@@ -71,6 +71,9 @@ public class ReplaceArea extends MapObject {
addReplacement(repl); addReplacement(repl);
return repl; return repl;
} }
public ReplaceArea.Replacement createReplacement(String source, String target) {
return new Replacement(source, target);
}
public void addReplacement(ReplaceArea.Replacement repl) { public void addReplacement(ReplaceArea.Replacement repl) {
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>(); if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();

View File

@@ -6,13 +6,8 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -28,10 +23,7 @@ import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel; import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
@@ -54,6 +46,8 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithSingleArg;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class DialogueEditor extends JSONElementEditor { public class DialogueEditor extends JSONElementEditor {
@@ -178,163 +172,62 @@ public class DialogueEditor extends JSONElementEditor {
messageField = addTranslatableTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener); messageField = addTranslatableTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener);
switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener); switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener);
CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: "); String rewardsTitle = "Reaching this phrase gives the following rewards: ";
rewards.setLayout(new JideBoxLayout(rewards, JideBoxLayout.PAGE_AXIS)); RewardsCellRenderer rewardsCellRenderer = new RewardsCellRenderer();
rewardsListModel = new RewardsListModel(dialogue); rewardsListModel = new RewardsListModel(dialogue);
rewardsList = new JList(rewardsListModel); final boolean rewardsMoveUpDownEnabled = false;
rewardsList.setCellRenderer(new RewardsCellRenderer());
rewardsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Dialogue.Reward> rewardsResult = CommonEditor.createListPanel(
rewards.add(new JScrollPane(rewardsList), JideBoxLayout.FIX); rewardsTitle,
final JPanel rewardsEditorPane = new JPanel(); rewardsCellRenderer,
final JButton createReward = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); rewardsListModel,
final JButton deleteReward = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); dialogue.writable,
deleteReward.setEnabled(false); rewardsMoveUpDownEnabled,
rewardsList.addListSelectionListener(new ListSelectionListener() { (e) -> selectedReward = e,
@Override () -> selectedReward,
public void valueChanged(ListSelectionEvent e) { this::updateRewardsEditorPane,
selectedReward = (Dialogue.Reward) rewardsList.getSelectedValue(); listener,
if (selectedReward == null) { Dialogue.Reward::new);
deleteReward.setEnabled(false); CollapsiblePanel rewards = rewardsResult.panel;
} else { rewardsList = rewardsResult.list;
deleteReward.setEnabled(true);
}
updateRewardsEditorPane(rewardsEditorPane, selectedReward, listener);
}
});
if (dialogue.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReward.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Dialogue.Reward reward = new Dialogue.Reward();
rewardsListModel.addItem(reward);
rewardsList.setSelectedValue(reward, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteReward.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReward != null) {
rewardsListModel.removeItem(selectedReward);
selectedReward = null;
rewardsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReward, JideBoxLayout.FIX);
listButtonsPane.add(deleteReward, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
rewards.add(listButtonsPane, JideBoxLayout.FIX);
}
if (dialogue.rewards == null || dialogue.rewards.isEmpty()) { if (dialogue.rewards == null || dialogue.rewards.isEmpty()) {
rewards.collapse(); rewards.collapse();
} }
rewardsEditorPane.setLayout(new JideBoxLayout(rewardsEditorPane, JideBoxLayout.PAGE_AXIS));
rewards.add(rewardsEditorPane, JideBoxLayout.FIX);
pane.add(rewards, JideBoxLayout.FIX); pane.add(rewards, JideBoxLayout.FIX);
CollapsiblePanel replies = new CollapsiblePanel("Replies / Next Phrase: "); String title = "Replies / Next Phrase: ";
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS)); RepliesCellRenderer cellRenderer = new RepliesCellRenderer();
repliesListModel = new RepliesListModel(dialogue);
repliesList = new JList(repliesListModel); repliesListModel = new DialogueEditor.RepliesListModel(dialogue);
repliesList.setCellRenderer(new RepliesCellRenderer()); boolean moveUpDownEnabled = true;
repliesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CallWithSingleArg<Dialogue.Reply> selectedReplyChanged = e -> {
replies.add(new JScrollPane(repliesList), JideBoxLayout.FIX); selectedReply = e;
final JPanel repliesEditorPane = new JPanel(); if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
final JButton createReply = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); replyTextCache = selectedReply.text;
final JButton deleteReply = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); } else {
final JButton moveReplyUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon())); replyTextCache = null;
final JButton moveReplyDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
repliesList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedReply = (Dialogue.Reply) repliesList.getSelectedValue();
if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
replyTextCache = selectedReply.text;
} else {
replyTextCache = null;
}
if (selectedReply != null) {
deleteReply.setEnabled(true);
moveReplyUp.setEnabled(repliesList.getSelectedIndex() > 0);
moveReplyDown.setEnabled(repliesList.getSelectedIndex() < (repliesListModel.getSize() - 1));
} else {
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
}
updateRepliesEditorPane(repliesEditorPane, selectedReply, listener);
} }
}); };
if (dialogue.writable) { CollapsiblePanel replies = CommonEditor.createListPanel(
JPanel listButtonsPane = new JPanel(); title,
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); cellRenderer,
createReply.addActionListener(new ActionListener() { repliesListModel,
@Override dialogue.writable,
public void actionPerformed(ActionEvent e) { moveUpDownEnabled,
Dialogue.Reply reply = new Dialogue.Reply(); selectedReplyChanged,
repliesListModel.addItem(reply); ()->selectedReply,
repliesList.setSelectedValue(reply, true); this::updateRepliesEditorPane,
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. listener,
} Dialogue.Reply::new).panel;
});
deleteReply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReply != null) {
repliesListModel.removeItem(selectedReply);
selectedReply = null;
repliesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveReplyUp.addActionListener(new ActionListener() {
@Override boolean isEmpty = dialogue.replies == null || dialogue.replies.isEmpty();
public void actionPerformed(ActionEvent e) { if (isEmpty) {
if (selectedReply != null) {
repliesListModel.moveUp(selectedReply);
repliesList.setSelectedValue(selectedReply, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveReplyDown.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedReply != null) {
repliesListModel.moveDown(selectedReply);
repliesList.setSelectedValue(selectedReply, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReply, JideBoxLayout.FIX);
listButtonsPane.add(deleteReply, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyUp, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyDown, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
replies.add(listButtonsPane, JideBoxLayout.FIX);
}
if (dialogue.replies == null || dialogue.replies.isEmpty()) {
replies.collapse(); replies.collapse();
} }
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
pane.add(replies, JideBoxLayout.FIX); pane.add(replies, JideBoxLayout.FIX);
} }
public void updateRewardsEditorPane(final JPanel pane, final Dialogue.Reward reward, final FieldUpdateListener listener) { public void updateRewardsEditorPane(final JPanel pane, final Dialogue.Reward reward, final FieldUpdateListener listener) {
@@ -586,80 +479,24 @@ public class DialogueEditor extends JSONElementEditor {
updateRepliesParamsEditorPane(repliesParamsPane, reply, listener); updateRepliesParamsEditorPane(repliesParamsPane, reply, listener);
pane.add(repliesParamsPane, JideBoxLayout.FIX); pane.add(repliesParamsPane, JideBoxLayout.FIX);
CollapsiblePanel requirementsPane = new CollapsiblePanel("Requirements the player must fulfill to select this reply: "); ReplyRequirementsCellRenderer cellRenderer = new ReplyRequirementsCellRenderer();
requirementsPane.setLayout(new JideBoxLayout(requirementsPane, JideBoxLayout.PAGE_AXIS)); String title = "Requirements the player must fulfill to select this reply: ";
requirementsListModel = new ReplyRequirementsListModel(reply); requirementsListModel = new ReplyRequirementsListModel(reply);
requirementsList = new JList(requirementsListModel);
requirementsList.setCellRenderer(new ReplyRequirementsCellRenderer());
requirementsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
requirementsPane.add(new JScrollPane(requirementsList), JideBoxLayout.FIX);
final JPanel requirementsEditorPane = new JPanel();
final JButton createReq = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteReq = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
deleteReq.setEnabled(false);
requirementsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedRequirement = (Requirement) requirementsList.getSelectedValue();
if (selectedRequirement != null) {
deleteReq.setEnabled(true);
} else {
deleteReq.setEnabled(false);
}
updateRequirementsEditorPane(requirementsEditorPane, selectedRequirement, listener);
}
});
requirementsList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
if (requirementsList.getSelectedValue() != null && ((Requirement)requirementsList.getSelectedValue()).required_obj != null) {
ATContentStudio.frame.openEditor(((Requirement)requirementsList.getSelectedValue()).required_obj);
ATContentStudio.frame.selectInTree(((Requirement)requirementsList.getSelectedValue()).required_obj);
}
}
}
});
requirementsList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
ATContentStudio.frame.openEditor(((Requirement)requirementsList.getSelectedValue()).required_obj);
ATContentStudio.frame.selectInTree(((Requirement)requirementsList.getSelectedValue()).required_obj);
}
}
});
if (((Dialogue)target).writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Requirement req = new Requirement();
requirementsListModel.addItem(req);
requirementsList.setSelectedValue(req, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteReq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedRequirement != null) {
requirementsListModel.removeItem(selectedRequirement);
selectedRequirement = null;
requirementsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createReq, JideBoxLayout.FIX); final boolean moveUpDownEnabled = false;
listButtonsPane.add(deleteReq, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); CollapsiblePanel requirementsPane = CommonEditor.createListPanel(
requirementsPane.add(listButtonsPane, JideBoxLayout.FIX); title,
} cellRenderer,
requirementsEditorPane.setLayout(new JideBoxLayout(requirementsEditorPane, JideBoxLayout.PAGE_AXIS)); requirementsListModel,
requirementsPane.add(requirementsEditorPane, JideBoxLayout.FIX); target.writable,
moveUpDownEnabled,
(e)->selectedRequirement=e,
()->selectedRequirement,
this::updateRequirementsEditorPane,
listener,
Requirement::new).panel;
if (reply.requirements == null || reply.requirements.isEmpty()) { if (reply.requirements == null || reply.requirements.isEmpty()) {
requirementsPane.collapse(); requirementsPane.collapse();
} }
@@ -812,67 +649,23 @@ public class DialogueEditor extends JSONElementEditor {
} }
public static class RewardsListModel implements ListModel<Dialogue.Reward> { public static class RewardsListModel extends CommonEditor.AtListModel<Dialogue.Reward, Dialogue> {
Dialogue source;
public RewardsListModel(Dialogue dialogue) { public RewardsListModel(Dialogue dialogue) {
this.source = dialogue; super(dialogue);
} }
@Override @Override
public int getSize() { protected List<Dialogue.Reward> getInner() {
if (source.rewards == null) return 0; return source.rewards;
return source.rewards.size();
} }
@Override @Override
public Dialogue.Reward getElementAt(int index) { protected void setInner(List<Dialogue.Reward> value) {
if (source.rewards == null) return null; source.rewards = value;
return source.rewards.get(index);
} }
public void addItem(Dialogue.Reward item) { }
if (source.rewards == null) {
source.rewards = new ArrayList<Dialogue.Reward>();
}
source.rewards.add(item);
int index = source.rewards.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Dialogue.Reward item) {
int index = source.rewards.indexOf(item);
source.rewards.remove(item);
if (source.rewards.isEmpty()) {
source.rewards = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Dialogue.Reward item) {
int index = source.rewards.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class RewardsCellRenderer extends DefaultListCellRenderer { public static class RewardsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -981,88 +774,21 @@ public class DialogueEditor extends JSONElementEditor {
} }
public static class RepliesListModel implements ListModel<Dialogue.Reply> { public static class RepliesListModel extends CommonEditor.AtListModel<Dialogue.Reply, Dialogue> {
Dialogue source;
public RepliesListModel(Dialogue dialogue) { public RepliesListModel(Dialogue dialogue) {
this.source = dialogue; super(dialogue);
}
@Override
public int getSize() {
if (source.replies == null) return 0;
return source.replies.size();
} }
@Override @Override
public Dialogue.Reply getElementAt(int index) { protected List<Dialogue.Reply> getInner() {
if (source.replies == null) return null; return source.replies;
return source.replies.get(index);
}
public void addItem(Dialogue.Reply item) {
if (source.replies == null) {
source.replies = new ArrayList<Dialogue.Reply>();
}
source.replies.add(item);
int index = source.replies.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
source.replies.remove(item);
if (source.replies.isEmpty()) {
source.replies = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
Dialogue.Reply exchanged = source.replies.get(index - 1);
source.replies.set(index, exchanged);
source.replies.set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(Dialogue.Reply item) {
int index = source.replies.indexOf(item);
Dialogue.Reply exchanged = source.replies.get(index + 1);
source.replies.set(index, exchanged);
source.replies.set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected void setInner(List<Dialogue.Reply> value) {
listeners.remove(l); source.replies = value;
} }
} }
public static class RepliesCellRenderer extends DefaultListCellRenderer { public static class RepliesCellRenderer extends DefaultListCellRenderer {
@@ -1115,70 +841,27 @@ public class DialogueEditor extends JSONElementEditor {
} }
} }
public static class ReplyRequirementsListModel implements ListModel<Requirement> { public static class ReplyRequirementsListModel extends CommonEditor.AtListModel<Requirement, Dialogue.Reply> {
Dialogue.Reply reply; public ReplyRequirementsListModel(Dialogue.Reply reply) {
super(reply);
}
public ReplyRequirementsListModel(Dialogue.Reply reply) { @Override
this.reply = reply; protected List<Requirement> getInner() {
} return source.requirements;
}
@Override @Override
public int getSize() { protected void setInner(List<Requirement> value) {
if (reply.requirements == null) return 0; source.requirements = value;
return reply.requirements.size(); }
}
@Override @Override
public Requirement getElementAt(int index) { protected GameDataElement getNavigationElement(Requirement element) {
if (reply.requirements == null) return null; return element != null ? element.required_obj : null;
return reply.requirements.get(index); }
} }
public void addItem(Requirement item) {
if (reply.requirements == null) {
reply.requirements = new ArrayList<Requirement>();
}
reply.requirements.add(item);
int index = reply.requirements.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Requirement item) {
int index = reply.requirements.indexOf(item);
reply.requirements.remove(item);
if (reply.requirements.isEmpty()) {
reply.requirements = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Requirement item) {
int index = reply.requirements.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class ReplyRequirementsCellRenderer extends DefaultListCellRenderer { public static class ReplyRequirementsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;

View File

@@ -1,28 +1,17 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.Component; import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
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.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -32,8 +21,8 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem; import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem;
import com.gpl.rpg.atcontentstudio.model.gamedata.Item; import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class DroplistEditor extends JSONElementEditor { public class DroplistEditor extends JSONElementEditor {
@@ -58,7 +47,6 @@ public class DroplistEditor extends JSONElementEditor {
addEditorTab(json_view_id, getJSONView()); addEditorTab(json_view_id, getJSONView());
} }
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override @Override
public void insertFormViewDataField(JPanel pane) { public void insertFormViewDataField(JPanel pane) {
@@ -69,60 +57,23 @@ public class DroplistEditor extends JSONElementEditor {
idField = addTextField(pane, "Droplist ID: ", droplist.id, droplist.writable, listener); idField = addTextField(pane, "Droplist ID: ", droplist.id, droplist.writable, listener);
CollapsiblePanel itemsPane = new CollapsiblePanel("Items in this droplist: "); String title = "Items in this droplist: ";
itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS)); DroppedItemsCellRenderer cellRenderer = new DroppedItemsCellRenderer();
droppedItemsListModel = new DroppedItemsListModel(droplist); droppedItemsListModel = new DroppedItemsListModel(droplist);
final JList itemsList = new JList(droppedItemsListModel); final boolean moveUpDownEnabled = false;
itemsList.setCellRenderer(new DroppedItemsCellRenderer());
itemsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CollapsiblePanel itemsPane = CommonEditor.createListPanel(
itemsPane.add(new JScrollPane(itemsList), JideBoxLayout.FIX); title,
final JPanel droppedItemsEditorPane = new JPanel(); cellRenderer,
final JButton createDroppedItem = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); droppedItemsListModel,
final JButton deleteDroppedItem = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); droplist.writable,
deleteDroppedItem.setEnabled(false); moveUpDownEnabled,
itemsList.addListSelectionListener(new ListSelectionListener() { (e) -> selectedItem = e,
@Override () -> selectedItem,
public void valueChanged(ListSelectionEvent e) { this::updateDroppedItemsEditorPane,
selectedItem = (Droplist.DroppedItem) itemsList.getSelectedValue(); listener,
if (selectedItem == null) { Droplist.DroppedItem::new).panel;
deleteDroppedItem.setEnabled(false);
} else {
deleteDroppedItem.setEnabled(true);
}
updateDroppedItemsEditorPane(droppedItemsEditorPane, selectedItem, listener);
}
});
if (droplist.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createDroppedItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Droplist.DroppedItem tempItem = new Droplist.DroppedItem();
droppedItemsListModel.addItem(tempItem);
itemsList.setSelectedValue(tempItem, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteDroppedItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedItem != null) {
droppedItemsListModel.removeItem(selectedItem);
selectedItem = null;
itemsList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createDroppedItem, JideBoxLayout.FIX);
listButtonsPane.add(deleteDroppedItem, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
itemsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
droppedItemsEditorPane.setLayout(new JideBoxLayout(droppedItemsEditorPane, JideBoxLayout.PAGE_AXIS));
itemsPane.add(droppedItemsEditorPane, JideBoxLayout.FIX);
if (droplist.dropped_items == null || droplist.dropped_items.isEmpty()) { if (droplist.dropped_items == null || droplist.dropped_items.isEmpty()) {
itemsPane.collapse(); itemsPane.collapse();
} }
@@ -132,8 +83,8 @@ public class DroplistEditor extends JSONElementEditor {
} }
public void updateDroppedItemsEditorPane(JPanel pane, DroppedItem di, FieldUpdateListener listener) { public void updateDroppedItemsEditorPane(JPanel pane, DroppedItem di, FieldUpdateListener listener) {
boolean writable = ((Droplist)target).writable; boolean writable = target.writable;
Project proj = ((Droplist)target).getProject(); Project proj = target.getProject();
pane.removeAll(); pane.removeAll();
if (itemCombo != null) { if (itemCombo != null) {
removeElementListener(itemCombo); removeElementListener(itemCombo);
@@ -148,65 +99,20 @@ public class DroplistEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public class DroppedItemsListModel implements ListModel<Droplist.DroppedItem> { public static class DroppedItemsListModel extends CommonEditor.AtListModel<Droplist.DroppedItem, Droplist> {
Droplist source;
public DroppedItemsListModel(Droplist droplist) { public DroppedItemsListModel(Droplist droplist) {
this.source = droplist; super(droplist);
} }
@Override @Override
public int getSize() { protected List<Droplist.DroppedItem> getInner() {
if (source.dropped_items == null) return 0; return source.dropped_items;
return source.dropped_items.size();
} }
@Override @Override
public Droplist.DroppedItem getElementAt(int index) { protected void setInner(List<Droplist.DroppedItem> value) {
if (source.dropped_items == null) return null; source.dropped_items = value;
return source.dropped_items.get(index);
}
public void addItem(Droplist.DroppedItem item) {
if (source.dropped_items == null) {
source.dropped_items = new ArrayList<Droplist.DroppedItem>();
}
source.dropped_items.add(item);
int index = source.dropped_items.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Droplist.DroppedItem item) {
int index = source.dropped_items.indexOf(item);
source.dropped_items.remove(item);
if (source.dropped_items.isEmpty()) {
source.dropped_items = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Droplist.DroppedItem item) {
int index = source.dropped_items.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
} }
} }
@@ -214,7 +120,7 @@ public class DroplistEditor extends JSONElementEditor {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@Override @Override
public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (c instanceof JLabel) { if (c instanceof JLabel) {
JLabel label = ((JLabel)c); JLabel label = ((JLabel)c);
@@ -253,12 +159,12 @@ public class DroplistEditor extends JSONElementEditor {
skipNext = false; skipNext = false;
return; return;
} }
if (target.id.equals((String) value)) return; if (target.id.equals(value)) return;
if (idChanging()) { if (idChanging()) {
droplist.id = (String) value; droplist.id = (String) value;
DroplistEditor.this.name = droplist.getDesc(); DroplistEditor.this.name = droplist.getDesc();
droplist.childrenChanged(new ArrayList<ProjectTreeNode>()); droplist.childrenChanged(new ArrayList<>());
ATContentStudio.frame.editorChanged(DroplistEditor.this); ATContentStudio.frame.editorChanged(DroplistEditor.this);
} else { } else {
cancelIdEdit(idField); cancelIdEdit(idField);
@@ -290,7 +196,7 @@ public class DroplistEditor extends JSONElementEditor {
if (droplist.state != GameDataElement.State.modified) { if (droplist.state != GameDataElement.State.modified) {
droplist.state = GameDataElement.State.modified; droplist.state = GameDataElement.State.modified;
DroplistEditor.this.name = droplist.getDesc(); DroplistEditor.this.name = droplist.getDesc();
droplist.childrenChanged(new ArrayList<ProjectTreeNode>()); droplist.childrenChanged(new ArrayList<>());
ATContentStudio.frame.editorChanged(DroplistEditor.this); ATContentStudio.frame.editorChanged(DroplistEditor.this);
} }
updateJsonViewText(droplist.toJsonString()); updateJsonViewText(droplist.toJsonString());

View File

@@ -5,7 +5,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -17,15 +16,8 @@ import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -41,6 +33,7 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class ItemEditor extends JSONElementEditor { public class ItemEditor extends JSONElementEditor {
@@ -98,7 +91,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner equipConditionMagnitude; private JSpinner equipConditionMagnitude;
private CollapsiblePanel hitEffectPane; private CollapsiblePanel hitEffectPane;
private Common.HitEffect hitEffect; private Common.HitEffect hitEffect;//TODO: Check if this was set anywhere before my changes
private JSpinner hitHPMin; private JSpinner hitHPMin;
private JSpinner hitHPMax; private JSpinner hitHPMax;
private JSpinner hitAPMin; private JSpinner hitAPMin;
@@ -231,59 +224,25 @@ public class ItemEditor extends JSONElementEditor {
equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener); equipIncUseCost = addIntegerField(equipEffectPane, "Increase item use cost: ", equipEffect.increase_use_item_cost, true, item.writable, listener);
equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener); equipIncReequipCost = addIntegerField(equipEffectPane, "Increase reequip cost: ", equipEffect.increase_reequip_cost, true, item.writable, listener);
equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener); equipIncAttackCost = addIntegerField(equipEffectPane, "Increase attack cost: ", equipEffect.increase_attack_cost, true, item.writable, listener);
CollapsiblePanel equipConditionsPane = new CollapsiblePanel("Actor Conditions applied when equipped: "); String title = "Actor Conditions applied when equipped: ";
equipConditionsPane.setLayout(new JideBoxLayout(equipConditionsPane, JideBoxLayout.PAGE_AXIS)); ConditionsCellRenderer cellRenderer = new ConditionsCellRenderer();
equipConditionsModel = new ConditionsListModel(equipEffect); equipConditionsModel = new ConditionsListModel(equipEffect);
equipConditionsList = new JList(equipConditionsModel); final boolean moveUpDownEnabled = false;
equipConditionsList.setCellRenderer(new ConditionsCellRenderer());
equipConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.ConditionEffect> equipConditionsCreation = CommonEditor.createListPanel(
equipConditionsPane.add(new JScrollPane(equipConditionsList), JideBoxLayout.FIX); title,
final JPanel equipConditionsEditorPane = new JPanel(); cellRenderer,
final JButton createEquipCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); equipConditionsModel,
final JButton deleteEquipCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
equipConditionsList.addListSelectionListener(new ListSelectionListener() { moveUpDownEnabled,
@Override (e) -> selectedEquipEffectCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedEquipEffectCondition,
selectedEquipEffectCondition = (Common.ConditionEffect) equipConditionsList.getSelectedValue(); this::updateEquipConditionEditorPane,
if (selectedEquipEffectCondition == null) { listener,
deleteEquipCondition.setEnabled(false); Common.ConditionEffect::new);
} else { CollapsiblePanel equipConditionsPane = equipConditionsCreation.panel;
deleteEquipCondition.setEnabled(true); equipConditionsList = equipConditionsCreation.list;
}
updateEquipConditionEditorPane(equipConditionsEditorPane, selectedEquipEffectCondition, listener);
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createEquipCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.ConditionEffect condition = new Common.ConditionEffect();
equipConditionsModel.addItem(condition);
equipConditionsList.setSelectedValue(condition, true);
listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteEquipCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedEquipEffectCondition != null) {
equipConditionsModel.removeItem(selectedEquipEffectCondition);
selectedEquipEffectCondition = null;
equipConditionsList.clearSelection();
listener.valueChanged(equipConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createEquipCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteEquipCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
equipConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
equipConditionsEditorPane.setLayout(new JideBoxLayout(equipConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
equipConditionsPane.add(equipConditionsEditorPane, JideBoxLayout.FIX);
if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) { if (item.equip_effect == null || item.equip_effect.conditions == null || item.equip_effect.conditions.isEmpty()) {
equipConditionsPane.collapse(); equipConditionsPane.collapse();
} }
@@ -293,127 +252,55 @@ public class ItemEditor extends JSONElementEditor {
equipEffectPane.collapse(); equipEffectPane.collapse();
} }
hitEffectPane = new CollapsiblePanel("Effect on every hit: "); CommonEditor.CreateDeathEffectPanelResult hitEffectPanelResult = CommonEditor.createDeathEffectPanel(item.hit_effect, item.writable, listener, "Effect on every hit: ");
hitEffectPane.setLayout(new JideBoxLayout(hitEffectPane, JideBoxLayout.PAGE_AXIS)); hitEffectPane = hitEffectPanelResult.panel;
if (item.hit_effect == null) { hitHPMin = hitEffectPanelResult.HPMin;
hitEffect = new Common.HitEffect(); hitHPMax = hitEffectPanelResult.HPMax;
} else { hitAPMax = hitEffectPanelResult.APMax;
hitEffect = item.hit_effect; hitAPMin = hitEffectPanelResult.APMin;
}
hitHPMin = addIntegerField(hitEffectPane, "HP bonus min: ", hitEffect.hp_boost_min, true, item.writable, listener); String hitSourceTitle = "Actor Conditions applied to the source: ";
hitHPMax = addIntegerField(hitEffectPane, "HP bonus max: ", hitEffect.hp_boost_max, true, item.writable, listener); TimedConditionsCellRenderer hitSourceCellRenderer = new TimedConditionsCellRenderer();
hitAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, item.writable, listener); hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect);
hitAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, item.writable, listener); final boolean hitSourceMoveUpDownEnabled = false;
final CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: ");
hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitSourceConditionsCreation = CommonEditor.createListPanel(
hitSourceConditionsModel = new SourceTimedConditionsListModel(hitEffect); hitSourceTitle,
hitSourceConditionsList = new JList(hitSourceConditionsModel); hitSourceCellRenderer,
hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer()); hitSourceConditionsModel,
hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); item.writable,
hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); hitSourceMoveUpDownEnabled,
final JPanel sourceTimedConditionsEditorPane = new JPanel(); (e) -> selectedHitEffectSourceCondition = e,
final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); () -> selectedHitEffectSourceCondition,
final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); this::updateHitSourceTimedConditionEditorPane,
hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { listener,
@Override Common.TimedConditionEffect::new);
public void valueChanged(ListSelectionEvent e) { final CollapsiblePanel hitSourceConditionsPane = hitSourceConditionsCreation.panel;
selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); hitSourceConditionsList = hitSourceConditionsCreation.list;
updateHitSourceTimedConditionEditorPane(sourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener);
if (selectedHitEffectSourceCondition == null) {
deleteHitSourceCondition.setEnabled(false);
} else {
deleteHitSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitSourceConditionsModel.addItem(condition);
hitSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectSourceCondition != null) {
hitSourceConditionsModel.removeItem(selectedHitEffectSourceCondition);
selectedHitEffectSourceCondition = null;
hitSourceConditionsList.clearSelection();
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
sourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(sourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitSourceConditionsPane.add(sourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) { if (item.hit_effect == null || item.hit_effect.conditions_source == null || item.hit_effect.conditions_source.isEmpty()) {
hitSourceConditionsPane.collapse(); hitSourceConditionsPane.collapse();
} }
hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); String hitTargetTitle = "Actor Conditions applied to the target: ";
hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitTargetCellRenderer = new TimedConditionsCellRenderer();
hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect); hitTargetConditionsModel = new TargetTimedConditionsListModel(hitEffect);
hitTargetConditionsList = new JList(hitTargetConditionsModel); final boolean hitTargetMoveUpDownEnabled = false;
hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel2 = CommonEditor.createListPanel(
hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); hitTargetTitle,
final JPanel targetTimedConditionsEditorPane = new JPanel(); hitTargetCellRenderer,
final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitTargetConditionsModel,
final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitTargetMoveUpDownEnabled,
@Override (e) -> selectedHitEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectTargetCondition,
selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); this::updateHitTargetTimedConditionEditorPane,
updateHitTargetTimedConditionEditorPane(targetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); listener,
if (selectedHitEffectTargetCondition == null) { Common.TimedConditionEffect::new);
deleteHitTargetCondition.setEnabled(false); final CollapsiblePanel hitTargetConditionsPane = (CollapsiblePanel) listPanel2.panel;
} else { hitTargetConditionsList = listPanel2.list;
deleteHitTargetCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitTargetConditionsModel.addItem(condition);
hitTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectTargetCondition != null) {
hitTargetConditionsModel.removeItem(selectedHitEffectTargetCondition);
selectedHitEffectTargetCondition = null;
hitTargetConditionsList.clearSelection();
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
targetTimedConditionsEditorPane.setLayout(new JideBoxLayout(targetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitTargetConditionsPane.add(targetTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) { if (item.hit_effect == null || item.hit_effect.conditions_target == null || item.hit_effect.conditions_target.isEmpty()) {
hitTargetConditionsPane.collapse(); hitTargetConditionsPane.collapse();
} }
@@ -424,71 +311,38 @@ public class ItemEditor extends JSONElementEditor {
pane.add(hitEffectPane, JideBoxLayout.FIX); pane.add(hitEffectPane, JideBoxLayout.FIX);
killEffectPane = new CollapsiblePanel(killLabel);
killEffectPane.setLayout(new JideBoxLayout(killEffectPane, JideBoxLayout.PAGE_AXIS));
if (item.kill_effect == null) { if (item.kill_effect == null) {
killEffect = new Common.DeathEffect(); killEffect = new Common.DeathEffect();
} else { } else {
killEffect = item.kill_effect; killEffect = item.kill_effect;
} }
killHPMin = addIntegerField(killEffectPane, "HP bonus min: ", killEffect.hp_boost_min, true, item.writable, listener);
killHPMax = addIntegerField(killEffectPane, "HP bonus max: ", killEffect.hp_boost_max, true, item.writable, listener);
killAPMin = addIntegerField(killEffectPane, "AP bonus min: ", killEffect.ap_boost_min, true, item.writable, listener);
killAPMax = addIntegerField(killEffectPane, "AP bonus max: ", killEffect.ap_boost_max, true, item.writable, listener);
final CollapsiblePanel killSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: ");
killSourceConditionsPane.setLayout(new JideBoxLayout(killSourceConditionsPane, JideBoxLayout.PAGE_AXIS));
killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect);
killSourceConditionsList = new JList(killSourceConditionsModel);
killSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
killSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
killSourceConditionsPane.add(new JScrollPane(killSourceConditionsList), JideBoxLayout.FIX);
final JPanel killSourceTimedConditionsEditorPane = new JPanel();
final JButton createKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteKillSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
killSourceConditionsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedKillEffectCondition = (Common.TimedConditionEffect) killSourceConditionsList.getSelectedValue();
updateKillSourceTimedConditionEditorPane(killSourceTimedConditionsEditorPane, selectedKillEffectCondition, listener);
if (selectedKillEffectCondition == null) {
deleteKillSourceCondition.setEnabled(false);
} else {
deleteKillSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createKillSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
killSourceConditionsModel.addItem(condition);
killSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteKillSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedKillEffectCondition != null) {
killSourceConditionsModel.removeItem(selectedKillEffectCondition);
selectedKillEffectCondition = null;
killSourceConditionsList.clearSelection();
listener.valueChanged(killSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createKillSourceCondition, JideBoxLayout.FIX); CommonEditor.CreateDeathEffectPanelResult x = CommonEditor.createDeathEffectPanel(killEffect, item.writable, listener, killLabel);
listButtonsPane.add(deleteKillSourceCondition, JideBoxLayout.FIX); killEffectPane = x.panel;
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY); killHPMin = x.HPMin;
killSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX); killHPMax = x.HPMax;
} killAPMin = x.APMin;
killSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(killSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS)); killAPMax = x.APMax;
killSourceConditionsPane.add(killSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
String killSourceTitle = "Actor Conditions applied to the source: ";
TimedConditionsCellRenderer killSourceCellRenderer = new TimedConditionsCellRenderer();
killSourceConditionsModel = new SourceTimedConditionsListModel(killEffect);
final boolean killSourceMoveUpDownEnabled = false;
CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel = CommonEditor.createListPanel(
killSourceTitle,
killSourceCellRenderer,
killSourceConditionsModel,
item.writable,
killSourceMoveUpDownEnabled,
(e) -> selectedKillEffectCondition = e,
() -> selectedKillEffectCondition,
this::updateKillSourceTimedConditionEditorPane,
listener,
Common.TimedConditionEffect::new);
final CollapsiblePanel killSourceConditionsPane = listPanel.panel;
killSourceConditionsList = listPanel.list;
if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) { if (item.kill_effect == null || item.kill_effect.conditions_source == null || item.kill_effect.conditions_source.isEmpty()) {
killSourceConditionsPane.collapse(); killSourceConditionsPane.collapse();
} }
@@ -499,13 +353,14 @@ public class ItemEditor extends JSONElementEditor {
pane.add(killEffectPane, JideBoxLayout.FIX); pane.add(killEffectPane, JideBoxLayout.FIX);
hitReceivedEffectPane = new CollapsiblePanel("Effect on every hit received: ");
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
if (item.hit_received_effect == null) { if (item.hit_received_effect == null) {
hitReceivedEffect = new Common.HitReceivedEffect(); hitReceivedEffect = new Common.HitReceivedEffect();
} else { } else {
hitReceivedEffect = item.hit_received_effect; hitReceivedEffect = item.hit_received_effect;
} }
String titleHitReceived = "Effect on every hit received: ";
hitReceivedEffectPane = new CollapsiblePanel(titleHitReceived);
hitReceivedEffectPane.setLayout(new JideBoxLayout(hitReceivedEffectPane, JideBoxLayout.PAGE_AXIS));
hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener); hitReceivedHPMin = addIntegerField(hitReceivedEffectPane, "Player HP bonus min: ", hitReceivedEffect.hp_boost_min, true, item.writable, listener);
hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener); hitReceivedHPMax = addIntegerField(hitReceivedEffectPane, "Player HP bonus max: ", hitReceivedEffect.hp_boost_max, true, item.writable, listener);
hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener); hitReceivedAPMin = addIntegerField(hitReceivedEffectPane, "Player AP bonus min: ", hitReceivedEffect.ap_boost_min, true, item.writable, listener);
@@ -514,116 +369,48 @@ public class ItemEditor extends JSONElementEditor {
hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener); hitReceivedHPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker HP bonus max: ", hitReceivedEffect.hp_boost_max_target, true, item.writable, listener);
hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener); hitReceivedAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, item.writable, listener);
hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener); hitReceivedAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, item.writable, listener);
final CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the player: "); String hitReceivedSourceTitle = "Actor Conditions applied to the player: ";
hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedSourceCellRenderer = new TimedConditionsCellRenderer();
hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect); hitReceivedSourceConditionsModel = new SourceTimedConditionsListModel(hitReceivedEffect);
hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsModel); final boolean hitReceivedSourceMoveUpDownEnabled = false;
hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> listPanel1 = CommonEditor.createListPanel(
hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); hitReceivedSourceTitle,
final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); hitReceivedSourceCellRenderer,
final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedSourceConditionsModel,
final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedSourceMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectSourceCondition,
selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); this::updateHitReceivedSourceTimedConditionEditorPane,
updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); listener,
if (selectedHitReceivedEffectSourceCondition == null) { Common.TimedConditionEffect::new);
deleteHitReceivedSourceCondition.setEnabled(false); final CollapsiblePanel hitReceivedSourceConditionsPane = listPanel1.panel;
} else { hitReceivedSourceConditionsList = listPanel1.list;
deleteHitReceivedSourceCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitReceivedSourceConditionsModel.addItem(condition);
hitReceivedSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectSourceCondition != null) {
hitReceivedSourceConditionsModel.removeItem(selectedHitReceivedEffectSourceCondition);
selectedHitReceivedEffectSourceCondition = null;
hitReceivedSourceConditionsList.clearSelection();
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) { if (item.hit_received_effect == null || item.hit_received_effect.conditions_source == null || item.hit_received_effect.conditions_source.isEmpty()) {
hitReceivedSourceConditionsPane.collapse(); hitReceivedSourceConditionsPane.collapse();
} }
hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); String hitReceivedTargetTitle = "Actor Conditions applied to the attacker: ";
hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedTargetCellRenderer = new TimedConditionsCellRenderer();
hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect); hitReceivedTargetConditionsModel = new TargetTimedConditionsListModel(hitReceivedEffect);
hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsModel); final boolean hitReceivedTargetMoveUpDownEnabled = false;
hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedTargetResult = CommonEditor.createListPanel(
hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); hitReceivedTargetTitle,
final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); hitReceivedTargetCellRenderer,
final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedTargetConditionsModel,
final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); item.writable,
hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedTargetMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectTargetCondition,
selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); this::updateHitReceivedTargetTimedConditionEditorPane,
updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); listener,
if (selectedHitReceivedEffectTargetCondition == null) { Common.TimedConditionEffect::new);
deleteHitReceivedTargetCondition.setEnabled(false); final CollapsiblePanel hitReceivedTargetConditionsPane = hitReceivedTargetResult.panel;
} else { hitReceivedTargetConditionsList = hitReceivedTargetResult.list;
deleteHitReceivedTargetCondition.setEnabled(true);
}
}
});
if (item.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitReceivedTargetConditionsModel.addItem(condition);
hitReceivedTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectTargetCondition != null) {
hitReceivedTargetConditionsModel.removeItem(selectedHitReceivedEffectTargetCondition);
selectedHitReceivedEffectTargetCondition = null;
hitReceivedTargetConditionsList.clearSelection();
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) { if (item.hit_received_effect == null || item.hit_received_effect.conditions_target == null || item.hit_received_effect.conditions_target.isEmpty()) {
hitReceivedTargetConditionsPane.collapse(); hitReceivedTargetConditionsPane.collapse();
} }
@@ -667,8 +454,8 @@ public class ItemEditor extends JSONElementEditor {
return; return;
} }
boolean writable = ((Item)target).writable; boolean writable = target.writable;
Project proj = ((Item)target).getProject(); Project proj = target.getProject();
hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); hitSourceConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitSourceConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -763,8 +550,8 @@ public class ItemEditor extends JSONElementEditor {
return; return;
} }
boolean writable = ((Item)target).writable; boolean writable = target.writable;
Project proj = ((Item)target).getProject(); Project proj = target.getProject();
hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener); hitTargetConditionBox = addActorConditionBox(pane, proj, "Actor Condition: ", condition.condition, writable, listener);
hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener); hitTargetConditionChance = addDoubleField(pane, "Chance: ", condition.chance, writable, listener);
@@ -1185,129 +972,41 @@ public class ItemEditor extends JSONElementEditor {
} }
public static class SourceTimedConditionsListModel implements ListModel<Common.TimedConditionEffect> { public static class SourceTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.DeathEffect> {
Common.DeathEffect source;
public SourceTimedConditionsListModel(Common.DeathEffect effect) { public SourceTimedConditionsListModel(Common.DeathEffect effect) {
this.source = effect;; super(effect);
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_source == null) return 0; return source.conditions_source;
return source.conditions_source.size();
} }
@Override @Override
public Common.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_source == null) return null; source.conditions_source = value;
return source.conditions_source.get(index);
} }
public void addItem(Common.TimedConditionEffect item) { }
if (source.conditions_source == null) {
source.conditions_source = new ArrayList<Common.TimedConditionEffect>();
}
source.conditions_source.add(item);
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Common.TimedConditionEffect item) { public static class TargetTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.HitEffect> {
int index = source.conditions_source.indexOf(item);
source.conditions_source.remove(item);
if (source.conditions_source.isEmpty()) {
source.conditions_source = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Common.TimedConditionEffect item) {
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class TargetTimedConditionsListModel implements ListModel<Common.TimedConditionEffect> {
Common.HitEffect source;
public TargetTimedConditionsListModel(Common.HitEffect effect) { public TargetTimedConditionsListModel(Common.HitEffect effect) {
this.source = effect;; super(effect);
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_target == null) return 0; return source.conditions_target;
return source.conditions_target.size();
} }
@Override @Override
public Common.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_target == null) return null; source.conditions_target = value;
return source.conditions_target.get(index);
} }
public void addItem(Common.TimedConditionEffect item) { }
if (source.conditions_target == null) {
source.conditions_target = new ArrayList<Common.TimedConditionEffect>();
}
source.conditions_target.add(item);
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Common.TimedConditionEffect item) {
int index = source.conditions_target.indexOf(item);
source.conditions_target.remove(item);
if (source.conditions_target.isEmpty()) {
source.conditions_target = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Common.TimedConditionEffect item) {
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { public static class TimedConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;
@@ -1343,67 +1042,22 @@ public class ItemEditor extends JSONElementEditor {
} }
} }
public static class ConditionsListModel implements ListModel<Common.ConditionEffect> { public static class ConditionsListModel extends CommonEditor.AtListModel<Common.ConditionEffect, Item.EquipEffect> {
Item.EquipEffect source;
public ConditionsListModel(Item.EquipEffect equipEffect) { public ConditionsListModel(Item.EquipEffect equipEffect) {
this.source = equipEffect; super(equipEffect);
} }
@Override @Override
public int getSize() { protected List<Common.ConditionEffect> getInner() {
if (source.conditions == null) return 0; return source.conditions;
return source.conditions.size();
} }
@Override @Override
public Common.ConditionEffect getElementAt(int index) { protected void setInner(List<Common.ConditionEffect> value) {
if (source.conditions == null) return null; source.conditions = value;
return source.conditions.get(index);
} }
}
public void addItem(Common.ConditionEffect item) {
if (source.conditions == null) {
source.conditions = new ArrayList<Common.ConditionEffect>();
}
source.conditions.add(item);
int index = source.conditions.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Common.ConditionEffect item) {
int index = source.conditions.indexOf(item);
source.conditions.remove(item);
if (source.conditions.isEmpty()) {
source.conditions = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Common.ConditionEffect item) {
int index = source.conditions.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class ConditionsCellRenderer extends DefaultListCellRenderer { public static class ConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;

View File

@@ -6,7 +6,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
@@ -18,15 +17,8 @@ import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -40,6 +32,7 @@ import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon; import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView; import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class NPCEditor extends JSONElementEditor { public class NPCEditor extends JSONElementEditor {
@@ -276,106 +269,48 @@ public class NPCEditor extends JSONElementEditor {
hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener); hitEffectAPMin = addIntegerField(hitEffectPane, "AP bonus min: ", hitEffect.ap_boost_min, true, npc.writable, listener);
hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener); hitEffectAPMax = addIntegerField(hitEffectPane, "AP bonus max: ", hitEffect.ap_boost_max, true, npc.writable, listener);
CollapsiblePanel hitSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the source: "); String hitSourceTitle = "Actor Conditions applied to the source: ";
hitSourceConditionsPane.setLayout(new JideBoxLayout(hitSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitSourceCellRenderer = new TimedConditionsCellRenderer();
hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect); hitSourceConditionsListModel = new SourceTimedConditionsListModel(hitEffect);
hitSourceConditionsList = new JList(hitSourceConditionsListModel); final boolean hitSourceMoveUpDownEnabled = false;
hitSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitSourceResult = CommonEditor.createListPanel(
hitSourceConditionsPane.add(new JScrollPane(hitSourceConditionsList), JideBoxLayout.FIX); hitSourceTitle,
final JPanel hitSourceTimedConditionsEditorPane = new JPanel(); hitSourceCellRenderer,
final JButton createHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitSourceConditionsListModel,
final JButton deleteHitSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitSourceMoveUpDownEnabled,
@Override (e) -> selectedHitEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectSourceCondition,
selectedHitEffectSourceCondition = (Common.TimedConditionEffect) hitSourceConditionsList.getSelectedValue(); this::updateHitSourceTimedConditionEditorPane,
updateHitSourceTimedConditionEditorPane(hitSourceTimedConditionsEditorPane, selectedHitEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitSourceConditionsPane = hitSourceResult.panel;
if (npc.writable) { hitSourceConditionsList = hitSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitSourceConditionsListModel.addItem(condition);
hitSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectSourceCondition != null) {
hitSourceConditionsListModel.removeItem(selectedHitEffectSourceCondition);
selectedHitEffectSourceCondition = null;
hitSourceConditionsList.clearSelection();
listener.valueChanged(hitSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitSourceConditionsPane.add(hitSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) { if (npc.hit_effect == null || npc.hit_effect.conditions_source == null || npc.hit_effect.conditions_source.isEmpty()) {
hitSourceConditionsPane.collapse(); hitSourceConditionsPane.collapse();
} }
hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the target: "); String hitTargetTitle = "Actor Conditions applied to the target: ";
hitTargetConditionsPane.setLayout(new JideBoxLayout(hitTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitTargetCellRenderer = new TimedConditionsCellRenderer();
hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect); hitTargetConditionsListModel = new TargetTimedConditionsListModel(hitEffect);
hitTargetConditionsList = new JList(hitTargetConditionsListModel); final boolean hitTargetMoveUpDownEnabled = false;
hitTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitTargetResult = CommonEditor.createListPanel(
hitTargetConditionsPane.add(new JScrollPane(hitTargetConditionsList), JideBoxLayout.FIX); hitTargetTitle,
final JPanel hitTargetTimedConditionsEditorPane = new JPanel(); hitTargetCellRenderer,
final JButton createHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitTargetConditionsListModel,
final JButton deleteHitTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitTargetMoveUpDownEnabled,
@Override (e) -> selectedHitEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitEffectTargetCondition,
selectedHitEffectTargetCondition = (Common.TimedConditionEffect) hitTargetConditionsList.getSelectedValue(); this::updateHitTargetTimedConditionEditorPane,
updateHitTargetTimedConditionEditorPane(hitTargetTimedConditionsEditorPane, selectedHitEffectTargetCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitTargetConditionsPane = hitTargetResult.panel;
if (npc.writable) { hitTargetConditionsList = hitTargetResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitTargetConditionsListModel.addItem(condition);
hitTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitEffectTargetCondition != null) {
hitTargetConditionsListModel.removeItem(selectedHitEffectTargetCondition);
selectedHitEffectTargetCondition = null;
hitTargetConditionsList.clearSelection();
listener.valueChanged(hitTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitTargetConditionsPane.add(hitTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX); hitEffectPane.add(hitTargetConditionsPane, JideBoxLayout.FIX);
if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) { if (npc.hit_effect == null || npc.hit_effect.conditions_target == null || npc.hit_effect.conditions_target.isEmpty()) {
hitTargetConditionsPane.collapse(); hitTargetConditionsPane.collapse();
@@ -398,106 +333,48 @@ public class NPCEditor extends JSONElementEditor {
hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener); hitReceivedEffectAPMinTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus min: ", hitReceivedEffect.ap_boost_min_target, true, npc.writable, listener);
hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener); hitReceivedEffectAPMaxTarget = addIntegerField(hitReceivedEffectPane, "Attacker AP bonus max: ", hitReceivedEffect.ap_boost_max_target, true, npc.writable, listener);
CollapsiblePanel hitReceivedSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to this NPC: "); String hitReceivedSourceTitle = "Actor Conditions applied to this NPC: ";
hitReceivedSourceConditionsPane.setLayout(new JideBoxLayout(hitReceivedSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedSourceCellRenderer = new TimedConditionsCellRenderer();
hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect); hitReceivedSourceConditionsListModel = new SourceTimedConditionsListModel(hitReceivedEffect);
hitReceivedSourceConditionsList = new JList(hitReceivedSourceConditionsListModel); final boolean hitReceivedSourceMoveUpDownEnabled = false;
hitReceivedSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedSourceResult = CommonEditor.createListPanel(
hitReceivedSourceConditionsPane.add(new JScrollPane(hitReceivedSourceConditionsList), JideBoxLayout.FIX); hitReceivedSourceTitle,
final JPanel hitReceivedSourceTimedConditionsEditorPane = new JPanel(); hitReceivedSourceCellRenderer,
final JButton createHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedSourceConditionsListModel,
final JButton deleteHitReceivedSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitReceivedSourceConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedSourceMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectSourceCondition,
selectedHitReceivedEffectSourceCondition = (Common.TimedConditionEffect) hitReceivedSourceConditionsList.getSelectedValue(); this::updateHitReceivedSourceTimedConditionEditorPane,
updateHitReceivedSourceTimedConditionEditorPane(hitReceivedSourceTimedConditionsEditorPane, selectedHitReceivedEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel hitReceivedSourceConditionsPane = hitReceivedSourceResult.panel;
if (npc.writable) { hitReceivedSourceConditionsList = hitReceivedSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitReceivedSourceConditionsListModel.addItem(condition);
hitReceivedSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectSourceCondition != null) {
hitReceivedSourceConditionsListModel.removeItem(selectedHitReceivedEffectSourceCondition);
selectedHitReceivedEffectSourceCondition = null;
hitReceivedSourceConditionsList.clearSelection();
listener.valueChanged(hitReceivedSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedSourceConditionsPane.add(hitReceivedSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) { if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_source == null || npc.hit_received_effect.conditions_source.isEmpty()) {
hitReceivedSourceConditionsPane.collapse(); hitReceivedSourceConditionsPane.collapse();
} }
hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedSourceConditionsPane, JideBoxLayout.FIX);
final CollapsiblePanel hitReceivedTargetConditionsPane = new CollapsiblePanel("Actor Conditions applied to the attacker: "); String hitReceivedTargetTitle = "Actor Conditions applied to the attacker: ";
hitReceivedTargetConditionsPane.setLayout(new JideBoxLayout(hitReceivedTargetConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer hitReceivedTargetCellRenderer = new TimedConditionsCellRenderer();
hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect); hitReceivedTargetConditionsListModel = new TargetTimedConditionsListModel(hitReceivedEffect);
hitReceivedTargetConditionsList = new JList(hitReceivedTargetConditionsListModel); final boolean hitReceivedTargetMoveUpDownEnabled = false;
hitReceivedTargetConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
hitReceivedTargetConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> hitReceivedTargetResult = CommonEditor.createListPanel(
hitReceivedTargetConditionsPane.add(new JScrollPane(hitReceivedTargetConditionsList), JideBoxLayout.FIX); hitReceivedTargetTitle,
final JPanel hitReceivedTargetTimedConditionsEditorPane = new JPanel(); hitReceivedTargetCellRenderer,
final JButton createHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); hitReceivedTargetConditionsListModel,
final JButton deleteHitReceivedTargetCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
hitReceivedTargetConditionsList.addListSelectionListener(new ListSelectionListener() { hitReceivedTargetMoveUpDownEnabled,
@Override (e) -> selectedHitReceivedEffectTargetCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedHitReceivedEffectTargetCondition,
selectedHitReceivedEffectTargetCondition = (Common.TimedConditionEffect) hitReceivedTargetConditionsList.getSelectedValue(); this::updateHitReceivedTargetTimedConditionEditorPane,
updateHitReceivedTargetTimedConditionEditorPane(hitReceivedTargetTimedConditionsEditorPane, selectedHitReceivedEffectTargetCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); final CollapsiblePanel hitReceivedTargetConditionsPane = hitReceivedTargetResult.panel;
if (npc.writable) { hitReceivedTargetConditionsList = hitReceivedTargetResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
hitReceivedTargetConditionsListModel.addItem(condition);
hitReceivedTargetConditionsList.setSelectedValue(condition, true);
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteHitReceivedTargetCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedHitReceivedEffectTargetCondition != null) {
hitReceivedTargetConditionsListModel.removeItem(selectedHitReceivedEffectTargetCondition);
selectedHitReceivedEffectTargetCondition = null;
hitReceivedTargetConditionsList.clearSelection();
listener.valueChanged(hitReceivedTargetConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteHitReceivedTargetCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
hitReceivedTargetConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
hitReceivedTargetTimedConditionsEditorPane.setLayout(new JideBoxLayout(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
hitReceivedTargetConditionsPane.add(hitReceivedTargetTimedConditionsEditorPane, JideBoxLayout.FIX);
hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX); hitReceivedEffectPane.add(hitReceivedTargetConditionsPane, JideBoxLayout.FIX);
if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) { if (npc.hit_received_effect == null || npc.hit_received_effect.conditions_target == null || npc.hit_received_effect.conditions_target.isEmpty()) {
hitReceivedTargetConditionsPane.collapse(); hitReceivedTargetConditionsPane.collapse();
@@ -516,54 +393,25 @@ public class NPCEditor extends JSONElementEditor {
deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener); deathEffectAPMin = addIntegerField(deathEffectPane, "Killer AP bonus min: ", deathEffect.ap_boost_min, true, npc.writable, listener);
deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener); deathEffectAPMax = addIntegerField(deathEffectPane, "Killer AP bonus max: ", deathEffect.ap_boost_max, true, npc.writable, listener);
CollapsiblePanel deathSourceConditionsPane = new CollapsiblePanel("Actor Conditions applied to the killer: "); String deathSourceTitle = "Actor Conditions applied to the killer: ";
deathSourceConditionsPane.setLayout(new JideBoxLayout(deathSourceConditionsPane, JideBoxLayout.PAGE_AXIS)); TimedConditionsCellRenderer deathSourceCellRenderer = new TimedConditionsCellRenderer();
deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect); deathSourceConditionsListModel = new SourceTimedConditionsListModel(deathEffect);
deathSourceConditionsList = new JList(deathSourceConditionsListModel); final boolean deathSourceMoveUpDownEnabled = false;
deathSourceConditionsList.setCellRenderer(new TimedConditionsCellRenderer());
deathSourceConditionsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); CommonEditor.PanelCreateResult<Common.TimedConditionEffect> deathSourceResult = CommonEditor.createListPanel(
deathSourceConditionsPane.add(new JScrollPane(deathSourceConditionsList), JideBoxLayout.FIX); deathSourceTitle,
final JPanel deathSourceTimedConditionsEditorPane = new JPanel(); deathSourceCellRenderer,
final JButton createDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getCreateIcon())); deathSourceConditionsListModel,
final JButton deleteDeathSourceCondition = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); npc.writable,
deathSourceConditionsList.addListSelectionListener(new ListSelectionListener() { deathSourceMoveUpDownEnabled,
@Override (e) -> selectedDeathEffectSourceCondition = e,
public void valueChanged(ListSelectionEvent e) { () -> selectedDeathEffectSourceCondition,
selectedDeathEffectSourceCondition = (Common.TimedConditionEffect) deathSourceConditionsList.getSelectedValue(); this::updateDeathSourceTimedConditionEditorPane,
updateDeathSourceTimedConditionEditorPane(deathSourceTimedConditionsEditorPane, selectedDeathEffectSourceCondition, listener); listener,
} Common.TimedConditionEffect::new);
}); CollapsiblePanel deathSourceConditionsPane = deathSourceResult.panel;
if (npc.writable) { deathSourceConditionsList = deathSourceResult.list;
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createDeathSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Common.TimedConditionEffect condition = new Common.TimedConditionEffect();
deathSourceConditionsListModel.addItem(condition);
deathSourceConditionsList.setSelectedValue(condition, true);
listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteDeathSourceCondition.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedDeathEffectSourceCondition != null) {
deathSourceConditionsListModel.removeItem(selectedDeathEffectSourceCondition);
selectedDeathEffectSourceCondition = null;
deathSourceConditionsList.clearSelection();
listener.valueChanged(deathSourceConditionsList, null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createDeathSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(deleteDeathSourceCondition, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
deathSourceConditionsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
deathSourceTimedConditionsEditorPane.setLayout(new JideBoxLayout(deathSourceTimedConditionsEditorPane, JideBoxLayout.PAGE_AXIS));
deathSourceConditionsPane.add(deathSourceTimedConditionsEditorPane, JideBoxLayout.FIX);
if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) { if (npc.death_effect == null || npc.death_effect.conditions_source == null || npc.death_effect.conditions_source.isEmpty()) {
deathSourceConditionsPane.collapse(); deathSourceConditionsPane.collapse();
} }
@@ -1025,129 +873,41 @@ public class NPCEditor extends JSONElementEditor {
deathSourceConditionForever.setEnabled(!clear); deathSourceConditionForever.setEnabled(!clear);
} }
public static class TargetTimedConditionsListModel implements ListModel<Common.TimedConditionEffect> { public static class TargetTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.HitEffect> {
Common.HitEffect source;
public TargetTimedConditionsListModel(Common.HitEffect effect) { public TargetTimedConditionsListModel(Common.HitEffect effect) {
this.source = effect; super(effect);
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_target == null) return 0; return source.conditions_target;
return source.conditions_target.size();
} }
@Override @Override
public Common.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_target == null) return null; source.conditions_target = value;
return source.conditions_target.get(index);
} }
public void addItem(Common.TimedConditionEffect item) { }
if (source.conditions_target == null) {
source.conditions_target = new ArrayList<Common.TimedConditionEffect>();
}
source.conditions_target.add(item);
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Common.TimedConditionEffect item) { public static class SourceTimedConditionsListModel extends CommonEditor.AtListModel<Common.TimedConditionEffect, Common.DeathEffect> {
int index = source.conditions_target.indexOf(item);
source.conditions_target.remove(item);
if (source.conditions_target.isEmpty()) {
source.conditions_target = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Common.TimedConditionEffect item) {
int index = source.conditions_target.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class SourceTimedConditionsListModel implements ListModel<Common.TimedConditionEffect> {
Common.DeathEffect source;
public SourceTimedConditionsListModel(Common.DeathEffect effect) { public SourceTimedConditionsListModel(Common.DeathEffect effect) {
this.source = effect; super(effect);
} }
@Override @Override
public int getSize() { protected List<Common.TimedConditionEffect> getInner() {
if (source.conditions_source == null) return 0; return source.conditions_source;
return source.conditions_source.size();
} }
@Override @Override
public Common.TimedConditionEffect getElementAt(int index) { protected void setInner(List<Common.TimedConditionEffect> value) {
if (source.conditions_source == null) return null; source.conditions_source = value;
return source.conditions_source.get(index);
} }
public void addItem(Common.TimedConditionEffect item) { }
if (source.conditions_source == null) {
source.conditions_source = new ArrayList<Common.TimedConditionEffect>();
}
source.conditions_source.add(item);
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(Common.TimedConditionEffect item) {
int index = source.conditions_source.indexOf(item);
source.conditions_source.remove(item);
if (source.conditions_source.isEmpty()) {
source.conditions_source = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(Common.TimedConditionEffect item) {
int index = source.conditions_source.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
public static class TimedConditionsCellRenderer extends DefaultListCellRenderer { public static class TimedConditionsCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 7987880146189575234L; private static final long serialVersionUID = 7987880146189575234L;

View File

@@ -1,29 +1,18 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.Component; import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -31,9 +20,9 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage; import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel; import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener; import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox; import com.gpl.rpg.atcontentstudio.ui.IntegerBasedCheckBox;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideBoxLayout;
public class QuestEditor extends JSONElementEditor { public class QuestEditor extends JSONElementEditor {
@@ -77,94 +66,26 @@ public class QuestEditor extends JSONElementEditor {
nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener); nameField = addTranslatableTextField(pane, "Quest Name: ", quest.name, quest.writable, listener);
visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener); visibleBox = addIntegerBasedCheckBox(pane, "Visible in quest log", quest.visible_in_log, quest.writable, listener);
CollapsiblePanel stagesPane = new CollapsiblePanel("Quest stages: "); String title = "Quest stages: ";
stagesPane.setLayout(new JideBoxLayout(stagesPane, JideBoxLayout.PAGE_AXIS)); StagesCellRenderer cellRenderer = new StagesCellRenderer();
stagesListModel = new StagesListModel(quest); stagesListModel = new StagesListModel(quest);
stagesList = new JList<QuestStage>(stagesListModel); final boolean moveUpDownEnabled = true;
stagesList.setCellRenderer(new StagesCellRenderer());
stagesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
stagesPane.add(new JScrollPane(stagesList), JideBoxLayout.FIX);
final JPanel stagesEditorPane = new JPanel();
final JButton createStage = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteStage = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
final JButton moveStageUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon()));
final JButton moveStageDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteStage.setEnabled(false);
moveStageUp.setEnabled(false);
moveStageDown.setEnabled(false);
stagesList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedStage = (QuestStage) stagesList.getSelectedValue();
if (selectedStage != null) {
deleteStage.setEnabled(true);
moveStageUp.setEnabled(stagesList.getSelectedIndex() > 0);
moveStageDown.setEnabled(stagesList.getSelectedIndex() < (stagesListModel.getSize() - 1));
} else {
deleteStage.setEnabled(false);
moveStageUp.setEnabled(false);
moveStageDown.setEnabled(false);
}
updateStageEditorPane(stagesEditorPane, selectedStage, listener);
}
});
if (quest.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createStage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
QuestStage stage = new QuestStage(quest);
stagesListModel.addItem(stage);
stagesList.setSelectedValue(stage, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
deleteStage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedStage != null) {
stagesListModel.removeItem(selectedStage);
selectedStage = null;
stagesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
moveStageUp.addActionListener(new ActionListener() {
@Override CollapsiblePanel stagesPane = CommonEditor.createListPanel(
public void actionPerformed(ActionEvent e) { title,
if (selectedStage != null) { cellRenderer,
stagesListModel.moveUp(selectedStage); stagesListModel,
stagesList.setSelectedValue(selectedStage, true); quest.writable,
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff. moveUpDownEnabled,
} (e)->selectedStage=e,
} ()->selectedStage,
}); this::updateStageEditorPane,
moveStageDown.addActionListener(new ActionListener() { listener,
()->new QuestStage(quest)).panel;
@Override
public void actionPerformed(ActionEvent e) {
if (selectedStage != null) {
stagesListModel.moveDown(selectedStage);
stagesList.setSelectedValue(selectedStage, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
}
});
listButtonsPane.add(createStage, JideBoxLayout.FIX);
listButtonsPane.add(deleteStage, JideBoxLayout.FIX);
listButtonsPane.add(moveStageUp, JideBoxLayout.FIX);
listButtonsPane.add(moveStageDown, JideBoxLayout.FIX);
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
stagesPane.add(listButtonsPane, JideBoxLayout.FIX);
}
if (quest.stages == null || quest.stages.isEmpty()) { if (quest.stages == null || quest.stages.isEmpty()) {
stagesPane.collapse(); stagesPane.collapse();
} }
stagesEditorPane.setLayout(new JideBoxLayout(stagesEditorPane, JideBoxLayout.PAGE_AXIS));
stagesPane.add(stagesEditorPane, JideBoxLayout.FIX);
pane.add(stagesPane, JideBoxLayout.FIX); pane.add(stagesPane, JideBoxLayout.FIX);
} }
@@ -184,88 +105,21 @@ public class QuestEditor extends JSONElementEditor {
pane.repaint(); pane.repaint();
} }
public static class StagesListModel implements ListModel<QuestStage> { public static class StagesListModel extends CommonEditor.AtListModel<QuestStage,Quest> {
Quest source;
public StagesListModel(Quest quest) { public StagesListModel(Quest quest) {
this.source = quest; super(quest);
}
@Override
public int getSize() {
if (source.stages == null) return 0;
return source.stages.size();
} }
@Override @Override
public QuestStage getElementAt(int index) { protected List<QuestStage> getInner() {
if (source.stages == null) return null; return source.stages;
return source.stages.get(index);
}
public void addItem(QuestStage item) {
if (source.stages == null) {
source.stages = new ArrayList<QuestStage>();
}
source.stages.add(item);
int index = source.stages.indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(QuestStage item) {
int index = source.stages.indexOf(item);
source.stages.remove(item);
if (source.stages.isEmpty()) {
source.stages = null;
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(QuestStage item) {
int index = source.stages.indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(QuestStage item) {
int index = source.stages.indexOf(item);
QuestStage exchanged = source.stages.get(index - 1);
source.stages.set(index, exchanged);
source.stages.set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(QuestStage item) {
int index = source.stages.indexOf(item);
QuestStage exchanged = source.stages.get(index + 1);
source.stages.set(index, exchanged);
source.stages.set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
} }
@Override @Override
public void removeListDataListener(ListDataListener l) { protected void setInner(List<QuestStage> value) {
listeners.remove(l); source.stages = value;
} }
} }

View File

@@ -18,6 +18,7 @@ import javax.swing.JToolTip;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.ToolTipManager; import javax.swing.ToolTipManager;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import prefuse.Display; import prefuse.Display;
import prefuse.Visualization; import prefuse.Visualization;
import prefuse.action.ActionList; import prefuse.action.ActionList;
@@ -321,23 +322,7 @@ public class DialogueGraphView extends Display {
@Override @Override
protected String getText(VisualItem item) { protected String getText(VisualItem item) {
return wordWrap(super.getText(item), 40); return CommonEditor.wordWrap(super.getText(item), 40);
}
public String wordWrap(String in, int length) {
final String newline = "\n";
//:: Trim
while(in.length() > 0 && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if(in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if(in.substring(0, length).contains(newline)) return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max( in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if(spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
} }
} }

View File

@@ -62,6 +62,7 @@ import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel; import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
@@ -378,7 +379,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addMapchange.addActionListener(new ActionListener() { addMapchange.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newMapchange(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newMapchange(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -391,7 +392,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addSpawn.addActionListener(new ActionListener() { addSpawn.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newSpawnArea(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newSpawnArea(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -404,7 +405,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addRest.addActionListener(new ActionListener() { addRest.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newRest(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newRest(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -417,7 +418,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addKey.addActionListener(new ActionListener() { addKey.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newKey(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newKey(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -430,7 +431,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addReplace.addActionListener(new ActionListener() { addReplace.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newReplace(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newReplace(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -443,7 +444,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addScript.addActionListener(new ActionListener() { addScript.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newScript(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newScript(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -456,7 +457,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addContainer.addActionListener(new ActionListener() { addContainer.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newContainer(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newContainer(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -469,7 +470,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addSign.addActionListener(new ActionListener() { addSign.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.addObject(MapObject.newSign(new tiled.core.MapObject(0, 0, 32, 32), map)); groupObjectsListModel.addItem(MapObject.newSign(new tiled.core.MapObject(0, 0, 32, 32), map));
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -482,7 +483,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
deleteObject.addActionListener(new ActionListener() { deleteObject.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
groupObjectsListModel.removeObject(selectedMapObject); groupObjectsListModel.removeItem(selectedMapObject);
map.state = GameDataElement.State.modified; map.state = GameDataElement.State.modified;
map.childrenChanged(new ArrayList<ProjectTreeNode>()); map.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(TMXMapEditor.this); ATContentStudio.frame.editorChanged(TMXMapEditor.this);
@@ -587,7 +588,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
addReplacement.addActionListener(new ActionListener() { addReplacement.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
replacementsListModel.addObject(null, null); replacementsListModel.addReplacement(null, null);
} }
}); });
deleteReplacement = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); deleteReplacement = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
@@ -596,7 +597,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
deleteReplacement.addActionListener(new ActionListener() { deleteReplacement.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
replacementsListModel.removeObject(selectedReplacement); replacementsListModel.removeItem(selectedReplacement);
} }
}); });
replacementListButtonsPane.add(new JPanel(), JideBoxLayout.VARY); replacementListButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
@@ -1153,61 +1154,22 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class ReplacementsListModel implements ListModel<ReplaceArea.Replacement> { public class ReplacementsListModel extends CommonEditor.AtListModel<ReplaceArea.Replacement, ReplaceArea> {
public ReplaceArea area;
public ReplacementsListModel(ReplaceArea area) { public ReplacementsListModel(ReplaceArea area) {
this.area = area; super(area);
}
@Override
protected List<ReplaceArea.Replacement> getInner() {
return source.replacements;
} }
@Override @Override
public int getSize() { protected void setInner(List<ReplaceArea.Replacement> value) {
if (area.replacements == null) return 0; source.replacements = value;
return area.replacements.size();
} }
@Override public void addReplacement(String source, String target) {
public ReplaceArea.Replacement getElementAt(int index) { addItem(this.source.createReplacement(source, target));
if (index < 0 || index > getSize()) return null;
if (area.replacements == null) return null;
return area.replacements.get(index);
}
public void objectChanged(ReplaceArea.Replacement repl) {
int index = area.replacements.indexOf(repl);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void addObject(String source, String target) {
ReplaceArea.Replacement repl = area.addReplacement(source, target);
int index = area.replacements.indexOf(repl);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeObject(ReplaceArea.Replacement repl) {
int index = area.replacements.indexOf(repl);
area.removeReplacement(repl);
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
} }
} }
@@ -1286,58 +1248,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class MapObjectsListModel implements ListModel<MapObject> { public class MapObjectsListModel extends CommonEditor.AtListModel<MapObject, MapObjectGroup> {
public MapObjectGroup group;
public MapObjectsListModel(MapObjectGroup group) { public MapObjectsListModel(MapObjectGroup group) {
this.group = group; super(group);
} }
@Override @Override
public int getSize() { protected List<MapObject> getInner() {
return group.mapObjects.size(); return source.mapObjects;
} }
@Override @Override
public MapObject getElementAt(int index) { protected void setInner(List<MapObject> value) {
return group.mapObjects.get(index); source.mapObjects = value;
} }
public void objectChanged(MapObject area) {
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(groupObjectsList, ListDataEvent.CONTENTS_CHANGED, group.mapObjects.indexOf(area), group.mapObjects.indexOf(area)));
}
}
public void addObject(MapObject area) {
group.mapObjects.add(area);
int index = group.mapObjects.indexOf(area);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(groupObjectsList, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeObject(MapObject area) {
int index = group.mapObjects.indexOf(area);
group.mapObjects.remove(area);
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(groupObjectsList, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
} }
public class GroupObjectsRenderer extends DefaultListCellRenderer { public class GroupObjectsRenderer extends DefaultListCellRenderer {
@@ -1353,36 +1277,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} }
public class SpawnGroupNpcListModel implements ListModel<NPC> { public class SpawnGroupNpcListModel extends CommonEditor.AtListModel<NPC, SpawnArea> {
public SpawnArea area;
public SpawnGroupNpcListModel(SpawnArea area) { public SpawnGroupNpcListModel(SpawnArea area) {
this.area = area; super(area);
} }
@Override @Override
public int getSize() { protected List<NPC> getInner() {
return area.spawnGroup.size(); return source.spawnGroup;
} }
@Override @Override
public NPC getElementAt(int index) { protected void setInner(List<NPC> value) {
return area.spawnGroup.get(index); source.spawnGroup = value;
} }
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
} }
@@ -1956,7 +1864,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
area.oldSchoolRequirement = false; area.oldSchoolRequirement = false;
} }
} }
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} }
} else if (source == spawngroupField) { } else if (source == spawngroupField) {
if (selectedMapObject instanceof SpawnArea) { if (selectedMapObject instanceof SpawnArea) {
@@ -1969,7 +1877,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
area.spawngroup_id = (String) value; area.spawngroup_id = (String) value;
selectedMapObject.link(); selectedMapObject.link();
npcList.setModel(new SpawnGroupNpcListModel(area)); npcList.setModel(new SpawnGroupNpcListModel(area));
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
npcList.revalidate(); npcList.revalidate();
npcList.repaint(); npcList.repaint();
tmxViewer.revalidate(); tmxViewer.revalidate();
@@ -1998,7 +1906,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} }
@@ -2027,7 +1935,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} else if (selectedMapObject instanceof SignArea) { } else if (selectedMapObject instanceof SignArea) {
@@ -2041,7 +1949,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} else { } else {
area.name = null; area.name = null;
} }
groupObjectsListModel.objectChanged(area); groupObjectsListModel.itemChanged(area);
tmxViewer.revalidate(); tmxViewer.revalidate();
tmxViewer.repaint(); tmxViewer.repaint();
} }
@@ -2226,12 +2134,12 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
} else if (source == sourceLayer) { } else if (source == sourceLayer) {
selectedReplacement.sourceLayer = (String)value; selectedReplacement.sourceLayer = (String)value;
replacementsListModel.objectChanged(selectedReplacement); replacementsListModel.itemChanged(selectedReplacement);
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} else if (source == targetLayer) { } else if (source == targetLayer) {
selectedReplacement.targetLayer = (String)value; selectedReplacement.targetLayer = (String)value;
replacementsListModel.objectChanged(selectedReplacement); replacementsListModel.itemChanged(selectedReplacement);
groupObjectsListModel.objectChanged(selectedMapObject); groupObjectsListModel.itemChanged(selectedMapObject);
} }
if (modified) { if (modified) {
if (map.state != GameDataElement.State.modified) { if (map.state != GameDataElement.State.modified) {

View File

@@ -0,0 +1,282 @@
package com.gpl.rpg.atcontentstudio.ui.tools;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.gamedata.Common;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.Editor;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithReturn;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithSingleArg;
import com.gpl.rpg.atcontentstudio.utils.lambda.CallWithThreeArgs;
import com.jidesoft.swing.JideBoxLayout;
import javax.swing.*;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public final class CommonEditor {
public static class PanelCreateResult<E>{
public CollapsiblePanel panel;
public JList<E> list;
}
public static <E, S> PanelCreateResult<E> createListPanel(String title,
ListCellRenderer<? super E> cellRenderer,
AtListModel<E, S> listModel,
boolean writable,
boolean moveUpDownEnabled,
CallWithSingleArg<E> selectedValueSetter,
CallWithReturn<E> selectedValueGetter,
CallWithThreeArgs<JPanel, E, FieldUpdateListener> updateRepliesEditorPane,
FieldUpdateListener listener,
CallWithReturn<E> createNew) {
CollapsiblePanel replies = new CollapsiblePanel(title);
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS));
JList<E> repliesList = new JList<>(listModel);
repliesList.setCellRenderer(cellRenderer);
repliesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
replies.add(new JScrollPane(repliesList), JideBoxLayout.FIX);
final JPanel repliesEditorPane = new JPanel();
final JButton createReply = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteReply = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
final JButton moveReplyUp = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon()));
final JButton moveReplyDown = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteReply.setEnabled(false);
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
repliesList.addListSelectionListener(e -> {
E selectedReply = repliesList.getSelectedValue();
selectedValueSetter.call(selectedReply);
if (selectedReply != null) {
deleteReply.setEnabled(true);
if (moveUpDownEnabled) {
moveReplyUp.setEnabled(repliesList.getSelectedIndex() > 0);
moveReplyDown.setEnabled(repliesList.getSelectedIndex() < (listModel.getSize() - 1));
}
} else {
deleteReply.setEnabled(false);
if (moveUpDownEnabled) {
moveReplyUp.setEnabled(false);
moveReplyDown.setEnabled(false);
}
}
updateRepliesEditorPane.call(repliesEditorPane, selectedReply, listener);
});
repliesList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
GameDataElement navObj = listModel.getNavigationElement( repliesList.getSelectedValue());
if (navObj != null) {
ATContentStudio.frame.openEditor(navObj);
ATContentStudio.frame.selectInTree(navObj);
}
}
}
});
repliesList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
GameDataElement navObj = listModel.getNavigationElement( repliesList.getSelectedValue());
ATContentStudio.frame.openEditor(navObj);
ATContentStudio.frame.selectInTree(navObj);
}
}
});
if (writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReply.addActionListener(e -> {
E created = createNew.call();
listModel.addItem(created);
repliesList.setSelectedValue(created, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
});
deleteReply.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.removeItem(selected);
selected = null;
selectedValueSetter.call(selected);
repliesList.clearSelection();
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
if (moveUpDownEnabled) {
moveReplyUp.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.moveUp(selected);
repliesList.setSelectedValue(selected, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
moveReplyDown.addActionListener(e -> {
E selected = selectedValueGetter.call();
if (selected != null) {
listModel.moveDown(selected);
repliesList.setSelectedValue(selected, true);
listener.valueChanged(new JLabel(), null); //Item changed, but we took care of it, just do the usual notification and JSON update stuff.
}
});
}
listButtonsPane.add(createReply, JideBoxLayout.FIX);
listButtonsPane.add(deleteReply, JideBoxLayout.FIX);
if (moveUpDownEnabled) {
listButtonsPane.add(moveReplyUp, JideBoxLayout.FIX);
listButtonsPane.add(moveReplyDown, JideBoxLayout.FIX);
}
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
replies.add(listButtonsPane, JideBoxLayout.FIX);
}
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
PanelCreateResult<E> ePanelCreateResult = new PanelCreateResult<>();
ePanelCreateResult.panel =replies;
ePanelCreateResult.list = repliesList;
return ePanelCreateResult;
}
public static class CreateDeathEffectPanelResult {
public CollapsiblePanel panel;
public JSpinner HPMin;
public JSpinner HPMax;
public JSpinner APMin;
public JSpinner APMax;
}
public static CreateDeathEffectPanelResult createDeathEffectPanel(Common.DeathEffect hitEffect, boolean writable, FieldUpdateListener listener, String title){
CreateDeathEffectPanelResult result = new CreateDeathEffectPanelResult();
result.panel = new CollapsiblePanel(title);
result.panel.setLayout(new JideBoxLayout(result.panel, JideBoxLayout.PAGE_AXIS));
result.HPMin = Editor.addIntegerField(result.panel, "HP bonus min: ", hitEffect.hp_boost_min, true, writable, listener);
result.HPMax = Editor.addIntegerField(result.panel, "HP bonus max: ", hitEffect.hp_boost_max, true, writable, listener);
result.APMin = Editor.addIntegerField(result.panel, "AP bonus min: ", hitEffect.ap_boost_min, true, writable, listener);
result.APMax = Editor.addIntegerField(result.panel, "AP bonus max: ", hitEffect.ap_boost_max, true, writable, listener);
return result;
}
public static String wordWrap(String in, int length) {
if (in == null) return null;
final String newline = "\n";
//:: Trim
while (!in.isEmpty() && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if (in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if (in.substring(0, length).contains(newline))
return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max(in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if (spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
}
public abstract static class AtListModel<E, S> implements ListModel<E> {
protected S source;
protected abstract List<E> getInner();
protected abstract void setInner(List<E> value);
protected GameDataElement getNavigationElement(E element){
return null;
}
public AtListModel(S source) {
this.source = source;
}
@Override
public int getSize() {
if (getInner() == null) return 0;
return getInner().size();
}
@Override
public E getElementAt(int index) {
if (index < 0 || index >= getSize()) return null;
return getInner().get(index);
}
public void addItem(E item) {
if (getInner() == null) {
setInner(new ArrayList<>());
}
getInner().add(item);
int index = getInner().indexOf(item);
for (ListDataListener l : listeners) {
l.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index));
}
}
public void removeItem(E item) {
int index = getInner().indexOf(item);
getInner().remove(item);
if (getInner().isEmpty()) {
setInner(null);
}
for (ListDataListener l : listeners) {
l.intervalRemoved(new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index));
}
}
public void itemChanged(E item) {
int index = getInner().indexOf(item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
}
}
public void moveUp(E item) {
int index = getInner().indexOf(item);
E exchanged = getInner().get(index - 1);
getInner().set(index, exchanged);
getInner().set(index - 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index - 1, index));
}
}
public void moveDown(E item) {
int index = getInner().indexOf(item);
E exchanged = getInner().get(index + 1);
getInner().set(index, exchanged);
getInner().set(index + 1, item);
for (ListDataListener l : listeners) {
l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index + 1));
}
}
List<ListDataListener> listeners = new CopyOnWriteArrayList<>();
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
}
}

View File

@@ -27,6 +27,7 @@ import javax.swing.JTextArea;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.plaf.basic.BasicInternalFrameUI; import javax.swing.plaf.basic.BasicInternalFrameUI;
import com.gpl.rpg.atcontentstudio.ui.tools.CommonEditor;
import prefuse.Display; import prefuse.Display;
import prefuse.Visualization; import prefuse.Visualization;
import prefuse.action.Action; import prefuse.action.Action;
@@ -415,25 +416,9 @@ public class WriterModeEditor extends Editor {
@Override @Override
protected String getText(VisualItem item) { protected String getText(VisualItem item) {
if (!item.getBoolean(IS_REPLY) && super.getText(item) == null) return "[Selector]"; if (!item.getBoolean(IS_REPLY) && super.getText(item) == null) return "[Selector]";
return wordWrap(super.getText(item), 40); return CommonEditor.wordWrap(super.getText(item), 40);
} }
public String wordWrap(String in, int length) {
if (in == null) return null;
final String newline = "\n";
//:: Trim
while(in.length() > 0 && (in.charAt(0) == '\t' || in.charAt(0) == ' ')) in = in.substring(1);
//:: If Small Enough Already, Return Original
if(in.length() < length) return in;
//:: If Next length Contains Newline, Split There
if(in.substring(0, length).contains(newline)) return in.substring(0, in.indexOf(newline)).trim() + newline + wordWrap(in.substring(in.indexOf("\n") + 1), length);
//:: Otherwise, Split Along Nearest Previous Space/Tab/Dash
int spaceIndex = Math.max(Math.max( in.lastIndexOf(" ", length), in.lastIndexOf("\t", length)), in.lastIndexOf("-", length));
//:: If No Nearest Space, Split At length
if(spaceIndex == -1) spaceIndex = length;
//:: Split
return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length);
}
} }
class NodeStrokeColorAction extends ColorAction { class NodeStrokeColorAction extends ColorAction {

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithReturn<T> {
T call();
}

View File

@@ -0,0 +1,7 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithSingleArg<T> {
void call(T arg);
}

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithThreeArgs<T1, T2, T3> {
void call(T1 arg1, T2 arg2, T3 arg3);
}

View File

@@ -0,0 +1,6 @@
package com.gpl.rpg.atcontentstudio.utils.lambda;
public interface CallWithTwoArgs<T1, T2> {
void call(T1 arg1, T2 arg2);
}