diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 6fd50c4..df317db 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -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(); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java index 1c69553..d70f744 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DroplistEditor.java @@ -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(); diff --git a/src/com/gpl/rpg/atcontentstudio/utils/BasicLambda.java b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambda.java new file mode 100644 index 0000000..14a2141 --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambda.java @@ -0,0 +1,6 @@ +package com.gpl.rpg.atcontentstudio.utils; + +public interface BasicLambda { + public void doIt(); +} + diff --git a/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithArg.java b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithArg.java new file mode 100644 index 0000000..66229db --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithArg.java @@ -0,0 +1,5 @@ +package com.gpl.rpg.atcontentstudio.utils; + +public interface BasicLambdaWithArg { + public void doIt(T arg); +} diff --git a/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithReturn.java b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithReturn.java new file mode 100644 index 0000000..124941b --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/utils/BasicLambdaWithReturn.java @@ -0,0 +1,5 @@ +package com.gpl.rpg.atcontentstudio.utils; + +public interface BasicLambdaWithReturn { + public R doIt(); +} diff --git a/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java b/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java new file mode 100644 index 0000000..0ce7573 --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/utils/UiUtils.java @@ -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 { + public CollapsiblePanel collapsiblePanel; + public JList list; + } + + public static > CollapsibleItemListCreation getCollapsibleItemList(FieldUpdateListener listener, + M itemsListModel, + BasicLambda selectedItemReset, + BasicLambdaWithArg setSelectedItem, + BasicLambdaWithReturn selectedItem, + BasicLambdaWithArg valueChanged, + BasicLambdaWithArg updateEditorPane, + boolean writable, + Supplier tempSupplier, + DefaultListCellRenderer cellRenderer, + String title, + boolean withMoveButtons) { + CollapsiblePanel itemsPane = new CollapsiblePanel(title); + itemsPane.setLayout(new JideBoxLayout(itemsPane, JideBoxLayout.PAGE_AXIS)); + final JList 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() { + { + collapsiblePanel = itemsPane; + list = itemsList;} + }; + } + +} \ No newline at end of file