From f87b262194c80d4bf687b3b6867a22cfcb8b9a9c Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 18 Jan 2014 19:26:01 +0000 Subject: [PATCH] Fix so selection retained when changing sort Fix so previously played deck restored on Constructed screen --- .../forge/gui/deckchooser/DecksComboBox.java | 1 - .../forge/gui/deckchooser/FDeckChooser.java | 33 ++++----- .../gui/toolbox/itemmanager/ItemManager.java | 73 +++++++------------ .../itemmanager/views/ItemListView.java | 32 +++----- .../toolbox/itemmanager/views/ItemView.java | 62 +++++++++++++++- 5 files changed, 111 insertions(+), 90 deletions(-) diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java b/forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java index d18e22d6d59..08d0d2bd815 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java @@ -94,5 +94,4 @@ public class DecksComboBox extends FComboBoxWrapper { selectedDeckType = valueOf; setSelectedItem(selectedDeckType); } - } diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java index 1306b5c8571..fd007b08ad1 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -8,14 +8,13 @@ import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; + import forge.Command; import forge.Singletons; import forge.deck.Deck; import forge.deck.DeckBase; import forge.game.GameType; import forge.game.player.RegisteredPlayer; -import forge.gui.MouseUtil; -import forge.gui.MouseUtil.MouseCursor; import forge.gui.deckchooser.DecksComboBox.DeckType; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.itemmanager.DeckManager; @@ -32,7 +31,7 @@ import forge.quest.QuestUtil; public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private boolean isUISetup = false; - private DecksComboBox decksComboBox; + private DecksComboBox decksComboBox = new DecksComboBox(); private DeckType selectedDeckType = DeckType.COLOR_DECK; private final DeckManager lstDecks = new DeckManager(GameType.Constructed); @@ -72,10 +71,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { public DeckType getSelectedDeckType() { return selectedDeckType; } public void setSelectedDeckType(DeckType selectedDeckType0) { - if (selectedDeckType != selectedDeckType0) { - selectedDeckType = selectedDeckType0; - decksComboBox.refresh(selectedDeckType0); - } + refreshDecksList(selectedDeckType0, false, null); } public DeckManager getLstDecks() { return lstDecks; } @@ -271,7 +267,6 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } public void populate() { - setupUI(); removeAll(); this.setLayout(new MigLayout("insets 0, gap 0")); decksComboBox.addTo(this, "w 100%, h 30px!, gapbottom 5px, spanx 2, wrap"); @@ -282,6 +277,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { validate(); repaint(); } + setupUI(); } public final boolean isAi() { @@ -297,9 +293,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { */ @Override public void deckTypeSelected(DecksComboBoxEvent ev) { - MouseUtil.setMouseCursor(MouseCursor.WAIT_CURSOR); - refreshDecksList(ev.getDeckType()); - MouseUtil.setMouseCursor(MouseCursor.DEFAULT_CURSOR); + refreshDecksList(ev.getDeckType(), false, ev); } /** @@ -312,18 +306,20 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { if (!isUISetup) { // Only do this once. isUISetup = true; - // core UI components. - decksComboBox = new DecksComboBox(); // monitor events generated by these components. decksComboBox.addListener(this); // now everything is in place, fire initial populate event. restoreSavedState(); - decksComboBox.refresh(selectedDeckType); } } - private void refreshDecksList(DeckType deckType) { + private void refreshDecksList(DeckType deckType, boolean forceRefresh, DecksComboBoxEvent ev) { + if (selectedDeckType == deckType && !forceRefresh) { return; } selectedDeckType = deckType; + + if (ev == null) { + decksComboBox.refresh(deckType); + } lstDecks.setCaption(deckType.toString()); switch (deckType) { @@ -386,14 +382,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private void restoreSavedState() { if (stateSetting == null) { - //if can't restore saved state, just refresh decks combo box - decksComboBox.refresh(selectedDeckType); + //if can't restore saved state, just refresh deck list + refreshDecksList(selectedDeckType, true, null); return; } String savedState = prefs.getPref(stateSetting); - selectedDeckType = getDeckTypeFromSavedState(savedState); - decksComboBox.refresh(selectedDeckType); + refreshDecksList(getDeckTypeFromSavedState(savedState), true, null); lstDecks.setSelectedStrings(getSelectedDecksFromSavedState(savedState)); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java index 9a08adeb2d9..e0b1d27ce71 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java @@ -275,7 +275,7 @@ public abstract class ItemManager extends JPanel { this.initialized = true; //must set flag just before applying filters if (!applyFilters()) { if (this.pool != null) { //ensure view updated even if filter predicate didn't change - this.updateView(true); + this.updateView(true, null, 0); } } } @@ -430,7 +430,7 @@ public abstract class ItemManager extends JPanel { this.pool = pool0; this.model.addItems(this.pool); this.model.setInfinite(infinite); - this.updateView(true); + this.updateView(true, null, 0); } public ItemListView getTable() { @@ -497,8 +497,8 @@ public abstract class ItemManager extends JPanel { * * @param item - Item to select */ - public void setSelectedItem(T item) { - this.table.setSelectedItem(item); + public boolean setSelectedItem(T item) { + return this.table.setSelectedItem(item); } /** @@ -507,8 +507,8 @@ public abstract class ItemManager extends JPanel { * * @param items - Items to select */ - public void setSelectedItems(Iterable items) { - this.table.setSelectedItems(items); + public boolean setSelectedItems(Iterable items) { + return this.table.setSelectedItems(items); } /** @@ -517,7 +517,7 @@ public abstract class ItemManager extends JPanel { * * @param strings - Strings to select */ - public void setSelectedStrings(Iterable strings) { + public boolean setSelectedStrings(Iterable strings) { List items = new ArrayList(); for (String itemName : strings) { for (Entry itemEntry : this.pool) { @@ -527,7 +527,7 @@ public abstract class ItemManager extends JPanel { } } } - this.table.setSelectedItems(items); + return this.setSelectedItems(items); } /** @@ -536,12 +536,12 @@ public abstract class ItemManager extends JPanel { * * @param itemEntrys - Item entrys to select */ - public void selectItemEntrys(Iterable> itemEntrys) { + public boolean selectItemEntrys(Iterable> itemEntrys) { List items = new ArrayList(); for (Entry itemEntry : itemEntrys) { items.add(itemEntry.getKey()); } - this.setSelectedItems(items); + return this.setSelectedItems(items); } /** @@ -595,12 +595,14 @@ public abstract class ItemManager extends JPanel { * @param qty */ public void addItem(final T item, int qty) { + int selectedIndexBefore = this.getSelectedIndex(); this.pool.add(item, qty); if (this.isUnfiltered()) { this.model.addItem(item, qty); } - this.updateView(false); - this.table.setSelectedItem(item); + List items = new ArrayList(); + items.add(item); + this.updateView(false, items, selectedIndexBefore); } /** @@ -610,17 +612,17 @@ public abstract class ItemManager extends JPanel { * @param itemsToAdd */ public void addItems(Iterable> itemsToAdd) { + int selectedIndexBefore = this.getSelectedIndex(); this.pool.addAll(itemsToAdd); if (this.isUnfiltered()) { this.model.addItems(itemsToAdd); } - this.updateView(false); List items = new ArrayList(); for (Map.Entry item : itemsToAdd) { items.add(item.getKey()); } - this.setSelectedItems(items); + this.updateView(false, items, selectedIndexBefore); } /** @@ -638,8 +640,7 @@ public abstract class ItemManager extends JPanel { if (this.isUnfiltered()) { this.model.removeItem(item, qty); } - this.updateView(false); - this.fixSelection(selectedIndexBefore, selectedItemsBefore); + this.updateView(false, selectedItemsBefore, selectedIndexBefore); } /** @@ -658,8 +659,7 @@ public abstract class ItemManager extends JPanel { this.model.removeItem(item.getKey(), item.getValue()); } } - this.updateView(false); - this.fixSelection(selectedIndexBefore, selectedItemsBefore); + this.updateView(false, selectedItemsBefore, selectedIndexBefore); } /** @@ -670,20 +670,7 @@ public abstract class ItemManager extends JPanel { public void removeAllItems() { this.pool.clear(); this.model.clear(); - this.updateView(false); - } - - /** - * - * fixSelection. - * - * @param selectedIndexBefore - * @param selectedItemsBefore - */ - private void fixSelection(int selectedIndexBefore, final Iterable selectedItemsBefore) { - if (!this.table.setSelectedItems(selectedItemsBefore)) { - this.table.setSelectedIndex(selectedIndexBefore); //restore selected index if couldn't restore selected items - } + this.updateView(false, null, 0); } /** @@ -813,7 +800,7 @@ public abstract class ItemManager extends JPanel { this.filterPredicate = newFilterPredicate; if (this.pool != null) { - this.updateView(true); + this.updateView(true, this.getSelectedItems(), 0); } return true; } @@ -892,10 +879,10 @@ public abstract class ItemManager extends JPanel { * * @param bForceFilter */ - public void updateView(final boolean bForceFilter) { - final boolean useFilter = (bForceFilter && (this.filterPredicate != null)) || !isUnfiltered(); + public void updateView(final boolean forceFilter, final Iterable itemsToSelect, final int backupIndexToSelect) { + final boolean useFilter = (forceFilter && (this.filterPredicate != null)) || !isUnfiltered(); - if (useFilter || this.wantUnique || bForceFilter) { + if (useFilter || this.wantUnique || forceFilter) { this.model.clear(); } @@ -912,11 +899,11 @@ public abstract class ItemManager extends JPanel { Iterable> items = Aggregates.uniqueByLast(this.pool, this.pool.FN_GET_NAME); this.model.addItems(items); } - else if (!useFilter && bForceFilter) { + else if (!useFilter && forceFilter) { this.model.addItems(this.pool); } - this.table.getTableModel().refreshSort(); + this.table.refresh(itemsToSelect, backupIndexToSelect, false); for (ItemFilter filter : this.orderedFilters) { filter.afterFiltersApplied(); @@ -938,16 +925,6 @@ public abstract class ItemManager extends JPanel { total = this.pool.countAll(); } this.lblRatio.setText("(" + this.getFilteredItems().countAll() + " / " + total + ")"); - - //select first row if no row already selected - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (table.getCount() > 0 && table.getSelectionCount() == 0) { - table.setSelectedIndex(0); - } - } - }); } /** diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java index 778999be2dd..7a85a02790e 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java @@ -142,6 +142,7 @@ public final class ItemListView extends ItemView { * @param cols   List> of additional columns for this */ public void setup(final Map cols) { + final Iterable selectedItemsBefore = getSelectedItems(); final DefaultTableColumnModel colmodel = new DefaultTableColumnModel(); //ensure columns ordered properly @@ -164,7 +165,7 @@ public final class ItemListView extends ItemView { this.table.setColumnModel(colmodel); this.tableModel.setup(); - this.tableModel.refreshSort(); + this.refresh(selectedItemsBefore, 0, false); this.table.getTableHeader().setBackground(new Color(200, 200, 200)); } @@ -210,25 +211,13 @@ public final class ItemListView extends ItemView { @Override protected void onSetSelectedIndex(int index) { - int count = getCount(); - if (count == 0) { return; } - - if (index >= count) { - index = count - 1; - } this.table.setRowSelectionInterval(index, index); } @Override protected void onSetSelectedIndices(Iterable indices) { - int count = getCount(); - if (count == 0) { return; } - this.table.clearSelection(); for (Integer index : indices) { - if (index >= count) { - index = count - 1; - } this.table.addRowSelectionInterval(index, index); } } @@ -283,6 +272,11 @@ public final class ItemListView extends ItemView { return this.table.rowAtPoint(p); } + @Override + protected void onRefresh() { + this.tableModel.refreshSort(); + } + public final class ItemTable extends SkinnedTable { @Override protected JTableHeader createDefaultTableHeader() { @@ -505,16 +499,14 @@ public final class ItemListView extends ItemView { return; } + //backup selected items to restore + final Iterable selectedItemsBefore = getSelectedItems(); + // This will invert if needed - // 2012/07/21 - Changed from modelIndex to ColumnModelIndex due to a crash - // Crash was: Hide 2 columns, then search by last column. ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false); - ItemTableModel.this.refreshSort(); + refresh(selectedItemsBefore, 0, true); table.tableChanged(new TableModelEvent(ItemTableModel.this)); table.repaint(); - if (getCount() > 0) { - table.setRowSelectionInterval(0, 0); - } SItemManagerIO.savePreferences(getItemManager()); } @@ -544,7 +536,7 @@ public final class ItemListView extends ItemView { /** * Resort. */ - public void refreshSort() { + private void refreshSort() { if (this.model.getOrderedList().size() == 0) { return; } Collections.sort(this.model.getOrderedList(), new MyComparator()); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java index 2feb9dcf9f7..b18cc400923 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java @@ -59,6 +59,33 @@ public abstract class ItemView { return this.isIncrementalSearchActive; } + public void refresh(final Iterable itemsToSelect, final int backupIndexToSelect, final boolean delaySelection) { + onRefresh(); + + if (delaySelection) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + fixSelection(itemsToSelect, backupIndexToSelect); + } + }); + } + else { + fixSelection(itemsToSelect, backupIndexToSelect); + } + } + protected abstract void onRefresh(); + private void fixSelection(final Iterable itemsToSelect, final int backupIndexToSelect) { + if (itemsToSelect == null) { + setSelectedIndex(0); //select first item if no items to select + } + else { + if (!setSelectedItems(itemsToSelect)) { + setSelectedIndex(backupIndexToSelect); + } + } + } + public final T getSelectedItem() { int index = getSelectedIndex(); return index >= 0 ? getItemAtIndex(index) : null; @@ -98,7 +125,10 @@ public abstract class ItemView { } } if (indices.size() > 0) { - setSelectedIndices(indices, scrollIntoView); + onSetSelectedIndices(indices); + if (scrollIntoView) { + scrollSelectionIntoView(); + } return true; } return false; @@ -108,6 +138,16 @@ public abstract class ItemView { setSelectedIndex(index, true); } public void setSelectedIndex(int index, boolean scrollIntoView) { + int count = getCount(); + if (count == 0) { return; } + + if (index < 0) { + index = 0; + } + else if (index >= count) { + index = count - 1; + } + onSetSelectedIndex(index); if (scrollIntoView) { scrollSelectionIntoView(); @@ -118,7 +158,25 @@ public abstract class ItemView { setSelectedIndices(indices, true); } public void setSelectedIndices(Iterable indices, boolean scrollIntoView) { - onSetSelectedIndices(indices); + int count = getCount(); + if (count == 0) { return; } + + List indexList = new ArrayList(); + for (Integer index : indices) { + if (index >= 0 && index < count) { + indexList.add(index); + } + } + + if (indexList.isEmpty()) { //if no index in range, set selected index based on first index + for (Integer index : indices) { + setSelectedIndex(index); + return; + } + return; + } + + onSetSelectedIndices(indexList); if (scrollIntoView) { scrollSelectionIntoView(); }