From 2582fd787e9e860bb9ea8e3d74c314d9502364cd Mon Sep 17 00:00:00 2001 From: myk Date: Sun, 3 Feb 2013 07:34:41 +0000 Subject: [PATCH] autoselect the items that were just added to the other list when choosing order for simultaneous abilities or cards from the sidebar between match rounds. this allows accidental moves to be undone with a single click --- src/main/java/forge/gui/DualListBox.java | 55 ++++++++++++++----- .../java/forge/gui/UnsortedListModel.java | 29 ++++++++-- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/main/java/forge/gui/DualListBox.java b/src/main/java/forge/gui/DualListBox.java index 7dff222d96d..8de4619735d 100644 --- a/src/main/java/forge/gui/DualListBox.java +++ b/src/main/java/forge/gui/DualListBox.java @@ -63,12 +63,23 @@ public class DualListBox extends FPanel { private int remainingObjects = 0; private boolean sideboardingMode = false; + private boolean showCard = true; public DualListBox(int remainingObjects, String label, List sourceElements, List destElements, Card referenceCard) { this.remainingObjects = remainingObjects; initScreen(); orderedLabel.setText(label); + if (destElements != null && !destElements.isEmpty()) { + addDestinationElements(destElements); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + destList.setSelectedIndex(0); + } + }); + } if (sourceElements != null && !sourceElements.isEmpty()) { addSourceElements(sourceElements); @@ -79,12 +90,9 @@ public class DualListBox extends FPanel { } }); } - if (destElements != null) { - addDestinationElements(destElements); - } this.setButtonState(); } - + public DualListBox(int remainingObjects, String label, List sourceElements, List destElements, Card referenceCard, boolean isSideboardDialog) { this(remainingObjects, label, sourceElements, destElements, referenceCard); @@ -123,12 +131,8 @@ public class DualListBox extends FPanel { fillListModel(destListModel, newValue); } - @SuppressWarnings("unchecked") // Java 7 has type parameterized ListModel private void fillListModel(UnsortedListModel model, ListModel newValues) { - int size = newValues.getSize(); - for (int i = 0; i < size; i++) { - model.add((T) newValues.getElementAt(i)); - } + model.addAll(newValues); } public void addSourceElements(List newValue) { @@ -167,7 +171,10 @@ public class DualListBox extends FPanel { return sourceListModel.model; } - private static void showSelectedCard(Object obj) { + private void showSelectedCard(Object obj) { + if (!showCard) { + return; + } Card card = null; if (obj instanceof Card) { card = (Card) obj; @@ -184,7 +191,7 @@ public class DualListBox extends FPanel { } } - private static void addCardViewListener(final FList list) { + private void addCardViewListener(final FList list) { list.getModel().addListDataListener(new ListDataListener() { @Override public void intervalRemoved(ListDataEvent e) { @@ -207,13 +214,35 @@ public class DualListBox extends FPanel { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { + showCard = false; list.setSelectedIndex(cardIdx); + showCard = true; + list.requestFocusInWindow(); } }); } @Override - public void intervalAdded(ListDataEvent e) { + public void intervalAdded(final ListDataEvent e) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // select just-added items so user can undo the add with a single click + int startIdx = Math.min(e.getIndex0(), e.getIndex1()); + int endIdx = Math.max(e.getIndex0(), e.getIndex1()); + int[] addedIndices = new int[endIdx - startIdx + 1]; + for (int idx = startIdx; idx <= endIdx; ++idx) { + addedIndices[idx - startIdx] = idx; + } + // attempt to scroll to just-added item (setSelectedIndices does not scroll) + // this will scroll to the wrong item if there are other identical items previously in the list + showCard = false; + list.setSelectedValue(list.getModel().getElementAt( + Math.min(endIdx, startIdx + list.getVisibleRowCount())), true); + list.setSelectedIndices(addedIndices); + showCard = true; + } + }); } @Override @@ -320,8 +349,8 @@ public class DualListBox extends FPanel { public void actionPerformed(ActionEvent e) { @SuppressWarnings("unchecked") List selected = (List) Arrays.asList(destList.getSelectedValues()); - addSourceElements(selected); clearDestinationSelected(); + addSourceElements(selected); setButtonState(); } } diff --git a/src/main/java/forge/gui/UnsortedListModel.java b/src/main/java/forge/gui/UnsortedListModel.java index 728c7469c75..bb0607d9748 100644 --- a/src/main/java/forge/gui/UnsortedListModel.java +++ b/src/main/java/forge/gui/UnsortedListModel.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.List; import javax.swing.AbstractListModel; +import javax.swing.ListModel; @SuppressWarnings("serial") @@ -27,27 +28,43 @@ public class UnsortedListModel extends AbstractListModel { // Java 7 has a ge } public void add(T element) { - if (model.add(element)) { - fireContentsChanged(this, 0, getSize()); - } + model.add(element); + fireIntervalAdded(this, getSize() - 1, getSize() - 1); + fireContentsChanged(this, 0, getSize() - 1); } public void addAll(T[] elements) { for (T e : elements) { model.add(e); } - fireContentsChanged(this, 0, getSize()); + fireIntervalAdded(this, getSize() - elements.length, getSize() - 1); + fireContentsChanged(this, 0, getSize() - 1); } public void addAll(Collection elements) { + if (elements.isEmpty()) { + return; + } model.addAll(elements); - fireContentsChanged(this, 0, getSize()); + fireIntervalAdded(this, getSize() - elements.size(), getSize() - 1); + fireContentsChanged(this, 0, getSize() - 1); } + @SuppressWarnings("unchecked") // Java 7 has type parameterized ListModel + public void addAll(ListModel otherModel) { + Collection elements = new ArrayList(); + int size = otherModel.getSize(); + for (int i = 0; size > i; ++i) { + elements.add((T)otherModel.getElementAt(i)); + } + addAll(elements); + } public void clear() { + int prevSize = getSize(); model.clear(); - fireContentsChanged(this, 0, getSize()); + fireIntervalRemoved(this, 0, prevSize - 1); + fireContentsChanged(this, 0, prevSize - 1); } public boolean contains(Object element) {