extract collapsibleItemList with buttons into method

this is currently done for
- items in a droplist
- replies
- rewards

others should follow
This commit is contained in:
OMGeeky
2025-06-01 22:12:31 +02:00
parent e1e85d7a90
commit 355bb2bc54
6 changed files with 330 additions and 159 deletions

View File

@@ -23,13 +23,9 @@ import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -51,6 +47,7 @@ import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.gpl.rpg.atcontentstudio.ui.CustomListModel;
import com.gpl.rpg.atcontentstudio.ui.OverlayIcon;
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.dialoguetree.DialogueGraphView;
import com.gpl.rpg.atcontentstudio.utils.UiUtils;
import com.jidesoft.swing.JideBoxLayout;
public class DialogueEditor extends JSONElementEditor {
@@ -174,12 +171,12 @@ public class DialogueEditor extends JSONElementEditor {
idField = addTextField(pane, "Internal ID: ", dialogue.id, 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);
CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: ");
/*
CollapsiblePanel rewards = new CollapsiblePanel(titleRewards);
rewards.setLayout(new JideBoxLayout(rewards, JideBoxLayout.PAGE_AXIS));
rewardsListModel = new RewardsListModel(dialogue);
rewardsList = new JList(rewardsListModel);
rewardsList.setCellRenderer(new RewardsCellRenderer());
rewardsList.setCellRenderer(cellRendererRewards);
rewardsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
rewards.add(new JScrollPane(rewardsList), JideBoxLayout.FIX);
final JPanel rewardsEditorPane = new JPanel();
@@ -227,38 +224,51 @@ public class DialogueEditor extends JSONElementEditor {
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
rewards.add(listButtonsPane, JideBoxLayout.FIX);
}
rewardsEditorPane.setLayout(new JideBoxLayout(rewardsEditorPane, JideBoxLayout.PAGE_AXIS));
rewards.add(rewardsEditorPane, JideBoxLayout.FIX);
*/
RewardsCellRenderer cellRendererRewards = new RewardsCellRenderer();
String titleRewards = "Reaching this phrase gives the following rewards: ";
rewardsListModel = new RewardsListModel(dialogue);
CollapsiblePanel rewards = UiUtils.getCollapsibleItemList(
listener,
rewardsListModel,
() -> selectedReward = null,
( selectedItem) -> this.selectedReward = selectedItem,
() -> this.selectedReward,
(reward)->{},
(editorPane) -> updateRewardsEditorPane(editorPane, this.selectedReward, listener),
dialogue.writable,
Dialogue.Reward::new,
cellRendererRewards,
titleRewards,
false
).collapsiblePanel;
if (dialogue.rewards == null || dialogue.rewards.isEmpty()) {
rewards.collapse();
}
rewardsEditorPane.setLayout(new JideBoxLayout(rewardsEditorPane, JideBoxLayout.PAGE_AXIS));
rewards.add(rewardsEditorPane, JideBoxLayout.FIX);
pane.add(rewards, JideBoxLayout.FIX);
CollapsiblePanel replies = new CollapsiblePanel("Replies / Next Phrase: ");
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS));
repliesListModel = new RepliesListModel(dialogue);
repliesList = new JList(repliesListModel);
repliesList.setCellRenderer(new RepliesCellRenderer());
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(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
/*{
CollapsiblePanel replies = new CollapsiblePanel(title);
replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS));
repliesListModel = new RepliesListModel(dialogue);
repliesList = new JList(repliesListModel);
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 -> {
selectedReply = (Dialogue.Reply) repliesList.getSelectedValue();
if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
replyTextCache = selectedReply.text;
} else {
replyTextCache = null;
}
replyValueChanged(selectedReply);
if (selectedReply != null) {
deleteReply.setEnabled(true);
moveReplyUp.setEnabled(repliesList.getSelectedIndex() > 0);
@@ -269,65 +279,88 @@ public class DialogueEditor extends JSONElementEditor {
moveReplyDown.setEnabled(false);
}
updateRepliesEditorPane(repliesEditorPane, selectedReply, listener);
});
if (dialogue.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Dialogue.Reply reply = new Dialogue.Reply();
repliesListModel.addItem(reply);
repliesList.setSelectedValue(reply, 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(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
public void actionPerformed(ActionEvent e) {
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.writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createReply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Dialogue.Reply reply = new Dialogue.Reply();
repliesListModel.addItem(reply);
repliesList.setSelectedValue(reply, 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(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.
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
}*/
RepliesCellRenderer cellRendererReplies = new RepliesCellRenderer();
String titleReplies = "Replies / Next Phrase: ";
repliesListModel = new RepliesListModel(dialogue);
CollapsiblePanel replies = UiUtils.getCollapsibleItemList(
listener,
repliesListModel,
() -> selectedReply = null,
( selectedItem) -> this.selectedReply = selectedItem,
() -> this.selectedReply,
(selectedReply)-> {
if (selectedReply != null && !Dialogue.Reply.GO_NEXT_TEXT.equals(selectedReply.text)) {
replyTextCache = selectedReply.text;
} else {
replyTextCache = null;
}
}
});
moveReplyUp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
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);
}
},
(editorPane) -> updateRepliesEditorPane(editorPane, this.selectedReply, listener),
dialogue.writable,
Dialogue.Reply::new,
cellRendererReplies,
titleReplies
, true
).collapsiblePanel;
if (dialogue.replies == null || dialogue.replies.isEmpty()) {
replies.collapse();
}
repliesEditorPane.setLayout(new JideBoxLayout(repliesEditorPane, JideBoxLayout.PAGE_AXIS));
replies.add(repliesEditorPane, JideBoxLayout.FIX);
pane.add(replies, JideBoxLayout.FIX);
@@ -582,12 +615,15 @@ public class DialogueEditor extends JSONElementEditor {
pane.add(comboPane, JideBoxLayout.FIX);
updateRepliesParamsEditorPane(repliesParamsPane, reply, listener);
pane.add(repliesParamsPane, JideBoxLayout.FIX);
CollapsiblePanel requirementsPane = new CollapsiblePanel("Requirements the player must fulfill to select this reply: ");
requirementsPane.setLayout(new JideBoxLayout(requirementsPane, JideBoxLayout.PAGE_AXIS));
String titleRequirements = "Requirements the player must fulfill to select this reply: ";
requirementsListModel = new ReplyRequirementsListModel(reply);
ReplyRequirementsCellRenderer cellRendererRequirements = new ReplyRequirementsCellRenderer();
/*
CollapsiblePanel requirementsPane = new CollapsiblePanel(titleRequirements);
requirementsPane.setLayout(new JideBoxLayout(requirementsPane, JideBoxLayout.PAGE_AXIS));
requirementsList = new JList(requirementsListModel);
requirementsList.setCellRenderer(new ReplyRequirementsCellRenderer());
requirementsList.setCellRenderer(cellRendererRequirements);
requirementsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
requirementsPane.add(new JScrollPane(requirementsList), JideBoxLayout.FIX);
final JPanel requirementsEditorPane = new JPanel();
@@ -656,12 +692,31 @@ public class DialogueEditor extends JSONElementEditor {
requirementsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
requirementsEditorPane.setLayout(new JideBoxLayout(requirementsEditorPane, JideBoxLayout.PAGE_AXIS));
requirementsPane.add(requirementsEditorPane, JideBoxLayout.FIX);
requirementsPane.add(requirementsEditorPane, JideBoxLayout.FIX);*/
UiUtils.CollapsibleItemListCreation itemsPane = UiUtils.getCollapsibleItemList(
listener,
requirementsListModel,
() -> selectedRequirement = null,
(selectedItem) -> this.selectedRequirement = selectedItem,
() -> this.selectedRequirement,
(selectedItem)->{},
(droppedItemsEditorPane) -> updateRequirementsEditorPane(droppedItemsEditorPane, this.selectedRequirement, listener),
target.writable,
Requirement::new,
cellRendererRequirements,
titleRequirements,
false
);
CollapsiblePanel requirementsPane = itemsPane.collapsiblePanel;
requirementsList = itemsPane.list;
if (reply.requirements == null || reply.requirements.isEmpty()) {
requirementsPane.collapse();
}
pane.add(requirementsPane, JideBoxLayout.FIX);
pane.revalidate();
pane.repaint();
}

View File

@@ -1,24 +1,17 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
@@ -28,9 +21,9 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist.DroppedItem;
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
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.CustomListModel;
import com.gpl.rpg.atcontentstudio.utils.UiUtils;
import com.jidesoft.swing.JideBoxLayout;
public class DroplistEditor extends JSONElementEditor {
@@ -65,61 +58,23 @@ public class DroplistEditor extends JSONElementEditor {
createButtonPane(pane, droplist.getProject(), droplist, Droplist.class, Droplist.getImage(), null, listener);
idField = addTextField(pane, "Droplist ID: ", droplist.id, droplist.writable, listener);
CollapsiblePanel itemsPane = new CollapsiblePanel("Items in this droplist: ");
itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS));
droppedItemsListModel = new DroppedItemsListModel(droplist);
final JList itemsList = new JList(droppedItemsListModel);
itemsList.setCellRenderer(new DroppedItemsCellRenderer());
itemsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
itemsPane.add(new JScrollPane(itemsList), JideBoxLayout.FIX);
final JPanel droppedItemsEditorPane = new JPanel();
final JButton createDroppedItem = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteDroppedItem = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
deleteDroppedItem.setEnabled(false);
itemsList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedItem = (Droplist.DroppedItem) itemsList.getSelectedValue();
if (selectedItem == null) {
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);
droppedItemsListModel = new DroplistEditor.DroppedItemsListModel(droplist);
CollapsiblePanel itemsPane = UiUtils.getCollapsibleItemList(
listener,
droppedItemsListModel,
() -> selectedItem = null,
(selectedItem) -> this.selectedItem = selectedItem,
() -> this.selectedItem,
(selectedItem)->{},
(droppedItemsEditorPane) -> updateDroppedItemsEditorPane(droppedItemsEditorPane, this.selectedItem, listener),
droplist.writable,
DroppedItem::new,
new DroppedItemsCellRenderer(),
"Items in this droplist: ",
false
).collapsiblePanel;
if (droplist.dropped_items == null || droplist.dropped_items.isEmpty()) {
itemsPane.collapse();
}
@@ -127,7 +82,7 @@ public class DroplistEditor extends JSONElementEditor {
pane.add(itemsPane, JideBoxLayout.FIX);
}
public void updateDroppedItemsEditorPane(JPanel pane, DroppedItem di, FieldUpdateListener listener) {
boolean writable = ((Droplist)target).writable;
Project proj = ((Droplist)target).getProject();

View File

@@ -0,0 +1,6 @@
package com.gpl.rpg.atcontentstudio.utils;
public interface BasicLambda {
public void doIt();
}

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils;
public interface BasicLambdaWithArg<T> {
public void doIt(T arg);
}

View File

@@ -0,0 +1,5 @@
package com.gpl.rpg.atcontentstudio.utils;
public interface BasicLambdaWithReturn<R> {
public R doIt();
}

View File

@@ -0,0 +1,145 @@
package com.gpl.rpg.atcontentstudio.utils;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
import com.gpl.rpg.atcontentstudio.ui.CollapsiblePanel;
import com.gpl.rpg.atcontentstudio.ui.CustomListModel;
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
import com.gpl.rpg.atcontentstudio.ui.FieldUpdateListener;
import com.jidesoft.swing.JideBoxLayout;
import javax.swing.*;
import java.awt.event.*;
import java.util.function.Supplier;
public class UiUtils {
public static class CollapsibleItemListCreation<E> {
public CollapsiblePanel collapsiblePanel;
public JList<E> list;
}
public static <S, E, M extends CustomListModel<S, E>> CollapsibleItemListCreation<E> getCollapsibleItemList(FieldUpdateListener listener,
M itemsListModel,
BasicLambda selectedItemReset,
BasicLambdaWithArg<E> setSelectedItem,
BasicLambdaWithReturn<E> selectedItem,
BasicLambdaWithArg<E> valueChanged,
BasicLambdaWithArg<JPanel> updateEditorPane,
boolean writable,
Supplier<E> tempSupplier,
DefaultListCellRenderer cellRenderer,
String title,
boolean withMoveButtons) {
CollapsiblePanel itemsPane = new CollapsiblePanel(title);
itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS));
final JList<E> itemsList = new JList<>(itemsListModel);
itemsList.setCellRenderer(cellRenderer);
itemsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
itemsPane.add(new JScrollPane(itemsList), JideBoxLayout.FIX);
final JPanel editorPane = new JPanel();
final JButton createBtn = new JButton(new ImageIcon(DefaultIcons.getCreateIcon()));
final JButton deleteBtn = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
final JButton moveUpBtn = new JButton(new ImageIcon(DefaultIcons.getArrowUpIcon()));
final JButton moveDownBtn = new JButton(new ImageIcon(DefaultIcons.getArrowDownIcon()));
deleteBtn.setEnabled(false);
moveUpBtn.setEnabled(false);
moveDownBtn.setEnabled(false);
itemsList.addListSelectionListener(e -> {
E selectedValue = itemsList.getSelectedValue();
valueChanged.doIt(selectedValue);
setSelectedItem.doIt(selectedValue);
if (selectedValue == null) {
deleteBtn.setEnabled(false);
if (withMoveButtons) {
moveUpBtn.setEnabled(false);
moveDownBtn.setEnabled(false);
}
} else {
deleteBtn.setEnabled(true);
if (withMoveButtons) {
moveUpBtn.setEnabled(itemsList.getSelectedIndex() > 0);
moveDownBtn.setEnabled(itemsList.getSelectedIndex() < (itemsListModel.getSize() - 1));
}
}
updateEditorPane.doIt(editorPane);
});
if (writable) {
JPanel listButtonsPane = new JPanel();
listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6));
createBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
E tempItem = tempSupplier.get();
itemsListModel.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.
}
});
listButtonsPane.add(createBtn, JideBoxLayout.FIX);
deleteBtn.addActionListener(e -> {
if (selectedItem.doIt() != null) {
itemsListModel.removeItem(selectedItem.doIt());
selectedItemReset.doIt();
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(deleteBtn, JideBoxLayout.FIX);
if(withMoveButtons) {
moveUpBtn.addActionListener(e -> {
if (selectedItem.doIt() != null) {
itemsListModel.moveUp(selectedItem.doIt());
itemsList.setSelectedValue(selectedItem.doIt(), 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(moveUpBtn, JideBoxLayout.FIX);
moveDownBtn.addActionListener(e -> {
if (selectedItem.doIt() != null) {
itemsListModel.moveDown(selectedItem.doIt());
itemsList.setSelectedValue(selectedItem.doIt(), 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(moveDownBtn, JideBoxLayout.FIX);
}
listButtonsPane.add(new JPanel(), JideBoxLayout.VARY);
itemsPane.add(listButtonsPane, JideBoxLayout.FIX);
}
//TODO: add double click to navigate to the item in the editor pane.
// TODO: figure out what ID is needed here
// itemsList.addMouseListener(new MouseAdapter() {
// @Override
// public void mouseClicked(MouseEvent e) {
// if (e.getClickCount() == 2) {
// if (itemsList.getSelectedValue() != null && ((E)itemsList.getSelectedValue()).required_obj != null) {
// ATContentStudio.frame.openEditor(((E)itemsList.getSelectedValue()).required_obj);
// ATContentStudio.frame.selectInTree(((E)itemsList.getSelectedValue()).required_obj);
// }
// }
// }
// });
// itemsList.addKeyListener(new KeyAdapter() {
// @Override
// public void keyReleased(KeyEvent e) {
// if (e.getKeyCode() == KeyEvent.VK_ENTER) {
// ATContentStudio.frame.openEditor(((E)itemsList.getSelectedValue()).required_obj);
// ATContentStudio.frame.selectInTree(((E)itemsList.getSelectedValue()).required_obj);
// }
// }
// });
editorPane.setLayout(new JideBoxLayout(editorPane, JideBoxLayout.PAGE_AXIS));
itemsPane.add(editorPane, JideBoxLayout.FIX);
return new CollapsibleItemListCreation<E>() {
{
collapsiblePanel = itemsPane;
list = itemsList;}
};
}
}