From 64ea5377bf97e2fbc776bbe0544f69a8176b95d8 Mon Sep 17 00:00:00 2001 From: OMGeeky <> Date: Mon, 16 Jun 2025 09:46:14 +0200 Subject: [PATCH] refactor: extract common ListModel implementation to AtListModel and use that for moving elements up and down --- .../ui/gamedataeditors/DialogueEditor.java | 80 +---------- .../ui/tools/CommonEditor.java | 124 +++++++++++++++--- 2 files changed, 115 insertions(+), 89 deletions(-) diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index 40008bc..3b73530 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -911,87 +911,19 @@ public class DialogueEditor extends JSONElementEditor { } - public static class RepliesListModel implements ListModel { - - Dialogue source; - + public static class RepliesListModel extends CommonEditor.AtListModel { public RepliesListModel(Dialogue dialogue) { - this.source = dialogue; - } - - - @Override - public int getSize() { - if (source.replies == null) return 0; - return source.replies.size(); + super(dialogue); } @Override - public Dialogue.Reply getElementAt(int index) { - if (source.replies == null) return null; - return source.replies.get(index); - } - - public void addItem(Dialogue.Reply item) { - if (source.replies == null) { - source.replies = new ArrayList(); - } - 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 listeners = new CopyOnWriteArrayList(); - - @Override - public void addListDataListener(ListDataListener l) { - listeners.add(l); + protected List getInner() { + return source.replies; } @Override - public void removeListDataListener(ListDataListener l) { - listeners.remove(l); + protected void setInner(List value) { + source.replies = value; } } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/tools/CommonEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/tools/CommonEditor.java index d7a1325..01103ed 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/tools/CommonEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/tools/CommonEditor.java @@ -9,20 +9,25 @@ 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.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; public final class CommonEditor { - public static CollapsiblePanel createListPanel(String title, - ListCellRenderer cellRenderer, - ListModel listModel, - boolean isCollapsed, - boolean writable, - CallWithSingleArg selectedValueSetter, - CallWithReturn selectedValueGetter, - CallWithThreeArgs updateRepliesEditorPane, - FieldUpdateListener listener, - CallWithReturn createNew) { + public static CollapsiblePanel createListPanel(String title, + ListCellRenderer cellRenderer, + AtListModel listModel, + boolean isCollapsed, + boolean writable, + CallWithSingleArg selectedValueSetter, + CallWithReturn selectedValueGetter, + CallWithThreeArgs updateRepliesEditorPane, + FieldUpdateListener listener, + CallWithReturn createNew) { CollapsiblePanel replies = new CollapsiblePanel(title); replies.setLayout(new JideBoxLayout(replies, JideBoxLayout.PAGE_AXIS)); JList repliesList = new JList<>(listModel); @@ -38,7 +43,7 @@ public final class CommonEditor { moveReplyUp.setEnabled(false); moveReplyDown.setEnabled(false); repliesList.addListSelectionListener(e -> { - E selectedReply = repliesList.getSelectedValue(); + E selectedReply = repliesList.getSelectedValue(); selectedValueSetter.call(selectedReply); if (selectedReply != null) { deleteReply.setEnabled(true); @@ -56,14 +61,14 @@ public final class CommonEditor { listButtonsPane.setLayout(new JideBoxLayout(listButtonsPane, JideBoxLayout.LINE_AXIS, 6)); createReply.addActionListener(e -> { E created = createNew.call(); -// listModel.addItem(created);//TODO + 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);//TODO + listModel.removeItem(selected); selected = null; selectedValueSetter.call(selected); repliesList.clearSelection(); @@ -73,7 +78,7 @@ public final class CommonEditor { moveReplyUp.addActionListener(e -> { E selected = selectedValueGetter.call(); if (selected != null) { -// listModel.moveUp(selected);//TODO + 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. } @@ -81,7 +86,7 @@ public final class CommonEditor { moveReplyDown.addActionListener(e -> { E selected = selectedValueGetter.call(); if (selected != null) { -// listModel.moveDown(selected);//TODO + 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. } @@ -119,4 +124,93 @@ public final class CommonEditor { //:: Split return in.substring(0, spaceIndex).trim() + newline + wordWrap(in.substring(spaceIndex), length); } + + + public abstract static class AtListModel implements ListModel { + + protected S source; + + protected abstract List getInner(); + + protected abstract void setInner(List value); + + 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 (getInner() == null) 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 listeners = new CopyOnWriteArrayList(); + + @Override + public void addListDataListener(ListDataListener l) { + listeners.add(l); + } + + @Override + public void removeListDataListener(ListDataListener l) { + listeners.remove(l); + } + } }