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

This commit is contained in:
myk
2013-02-03 07:34:41 +00:00
parent 155bd97dfa
commit 2582fd787e
2 changed files with 65 additions and 19 deletions

View File

@@ -63,12 +63,23 @@ public class DualListBox<T> extends FPanel {
private int remainingObjects = 0; private int remainingObjects = 0;
private boolean sideboardingMode = false; private boolean sideboardingMode = false;
private boolean showCard = true;
public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements, public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements,
Card referenceCard) { Card referenceCard) {
this.remainingObjects = remainingObjects; this.remainingObjects = remainingObjects;
initScreen(); initScreen();
orderedLabel.setText(label); 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()) { if (sourceElements != null && !sourceElements.isEmpty()) {
addSourceElements(sourceElements); addSourceElements(sourceElements);
@@ -79,12 +90,9 @@ public class DualListBox<T> extends FPanel {
} }
}); });
} }
if (destElements != null) {
addDestinationElements(destElements);
}
this.setButtonState(); this.setButtonState();
} }
public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements, Card referenceCard, boolean isSideboardDialog) { public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements, Card referenceCard, boolean isSideboardDialog) {
this(remainingObjects, label, sourceElements, destElements, referenceCard); this(remainingObjects, label, sourceElements, destElements, referenceCard);
@@ -123,12 +131,8 @@ public class DualListBox<T> extends FPanel {
fillListModel(destListModel, newValue); fillListModel(destListModel, newValue);
} }
@SuppressWarnings("unchecked") // Java 7 has type parameterized ListModel
private void fillListModel(UnsortedListModel<T> model, ListModel newValues) { private void fillListModel(UnsortedListModel<T> model, ListModel newValues) {
int size = newValues.getSize(); model.addAll(newValues);
for (int i = 0; i < size; i++) {
model.add((T) newValues.getElementAt(i));
}
} }
public void addSourceElements(List<T> newValue) { public void addSourceElements(List<T> newValue) {
@@ -167,7 +171,10 @@ public class DualListBox<T> extends FPanel {
return sourceListModel.model; return sourceListModel.model;
} }
private static void showSelectedCard(Object obj) { private void showSelectedCard(Object obj) {
if (!showCard) {
return;
}
Card card = null; Card card = null;
if (obj instanceof Card) { if (obj instanceof Card) {
card = (Card) obj; card = (Card) obj;
@@ -184,7 +191,7 @@ public class DualListBox<T> extends FPanel {
} }
} }
private static void addCardViewListener(final FList list) { private void addCardViewListener(final FList list) {
list.getModel().addListDataListener(new ListDataListener() { list.getModel().addListDataListener(new ListDataListener() {
@Override @Override
public void intervalRemoved(ListDataEvent e) { public void intervalRemoved(ListDataEvent e) {
@@ -207,13 +214,35 @@ public class DualListBox<T> extends FPanel {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
showCard = false;
list.setSelectedIndex(cardIdx); list.setSelectedIndex(cardIdx);
showCard = true;
list.requestFocusInWindow();
} }
}); });
} }
@Override @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 @Override
@@ -320,8 +349,8 @@ public class DualListBox<T> extends FPanel {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<T> selected = (List<T>) Arrays.asList(destList.getSelectedValues()); List<T> selected = (List<T>) Arrays.asList(destList.getSelectedValues());
addSourceElements(selected);
clearDestinationSelected(); clearDestinationSelected();
addSourceElements(selected);
setButtonState(); setButtonState();
} }
} }

View File

@@ -6,6 +6,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import javax.swing.AbstractListModel; import javax.swing.AbstractListModel;
import javax.swing.ListModel;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@@ -27,27 +28,43 @@ public class UnsortedListModel<T> extends AbstractListModel { // Java 7 has a ge
} }
public void add(T element) { public void add(T element) {
if (model.add(element)) { model.add(element);
fireContentsChanged(this, 0, getSize()); fireIntervalAdded(this, getSize() - 1, getSize() - 1);
} fireContentsChanged(this, 0, getSize() - 1);
} }
public void addAll(T[] elements) { public void addAll(T[] elements) {
for (T e : elements) { for (T e : elements) {
model.add(e); model.add(e);
} }
fireContentsChanged(this, 0, getSize()); fireIntervalAdded(this, getSize() - elements.length, getSize() - 1);
fireContentsChanged(this, 0, getSize() - 1);
} }
public void addAll(Collection<T> elements) { public void addAll(Collection<T> elements) {
if (elements.isEmpty()) {
return;
}
model.addAll(elements); 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<T> elements = new ArrayList<T>();
int size = otherModel.getSize();
for (int i = 0; size > i; ++i) {
elements.add((T)otherModel.getElementAt(i));
}
addAll(elements);
}
public void clear() { public void clear() {
int prevSize = getSize();
model.clear(); model.clear();
fireContentsChanged(this, 0, getSize()); fireIntervalRemoved(this, 0, prevSize - 1);
fireContentsChanged(this, 0, prevSize - 1);
} }
public boolean contains(Object element) { public boolean contains(Object element) {