Fix so DeckManagers list decks in nested folders

Update FDeckChooser to use DeckManager
This commit is contained in:
drdev
2014-01-16 15:57:43 +00:00
parent 2ec3c08e72
commit a52a88e0cb
10 changed files with 341 additions and 327 deletions

View File

@@ -19,7 +19,6 @@ package forge.util.storage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
@@ -39,9 +38,7 @@ import forge.util.IItemReader;
*/ */
public class StorageBase<T> implements IStorage<T> { public class StorageBase<T> implements IStorage<T> {
protected final Map<String, T> map; protected final Map<String, T> map;
private final String name;
public final static StorageBase<?> emptyMap = new StorageBase<Object>("Empty", new HashMap<String, Object>());
public final String name;
public StorageBase(final String name, final IItemReader<T> io) { public StorageBase(final String name, final IItemReader<T> io) {
this.name = name; this.name = name;
@@ -64,8 +61,20 @@ public class StorageBase<T> implements IStorage<T> {
} }
@Override @Override
public Iterator<T> iterator() { public final Iterator<T> iterator() {
return this.map.values().iterator(); final IStorage<IStorage<T>> folders = getFolders();
if (folders == null) { //if no folders, just return map iterator
return this.map.values().iterator();
}
//otherwise return iterator for list containing folder items followed by map's items
ArrayList<T> items = new ArrayList<T>();
for (IStorage<T> folder : folders) {
for (T item : folder) {
items.add(item);
}
}
items.addAll(this.map.values());
return items.iterator();
} }
@Override @Override
@@ -75,12 +84,16 @@ public class StorageBase<T> implements IStorage<T> {
@Override @Override
public int size() { public int size() {
return this.map.size(); int size = this.map.size();
if (this.getFolders() != null) {
size += this.getFolders().size();
}
return size;
} }
@Override @Override
public T find(Predicate<T> condition) { public T find(Predicate<T> condition) {
return Iterables.tryFind(map.values(), condition).orNull(); return Iterables.tryFind(this, condition).orNull();
} }
@Override @Override
@@ -93,11 +106,9 @@ public class StorageBase<T> implements IStorage<T> {
throw new UnsupportedOperationException("This is a read-only storage"); throw new UnsupportedOperationException("This is a read-only storage");
} }
// we don't have nested folders unless that's overridden in a derived class
@SuppressWarnings("unchecked")
@Override @Override
public IStorage<IStorage<T>> getFolders() { public IStorage<IStorage<T>> getFolders() {
return (IStorage<IStorage<T>>) emptyMap; return null; //no nested folders unless getFolders() overridden in a derived class
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -105,7 +116,6 @@ public class StorageBase<T> implements IStorage<T> {
*/ */
@Override @Override
public String getName() { public String getName() {
// TODO Auto-generated method stub
return name; return name;
} }
} }

View File

@@ -87,6 +87,6 @@ public class StorageImmediatelySerialized<T> extends StorageBase<T> {
*/ */
@Override @Override
public IStorage<IStorage<T>> getFolders() { public IStorage<IStorage<T>> getFolders() {
return subfolders == null ? super.getFolders() : subfolders; return subfolders;
} }
} }

View File

@@ -6,9 +6,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Random;
import javax.swing.JList;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@@ -23,6 +20,7 @@ import forge.deck.generation.DeckGenerator5Color;
import forge.deck.generation.DeckGeneratorBase; import forge.deck.generation.DeckGeneratorBase;
import forge.deck.generation.DeckGeneratorMonoColor; import forge.deck.generation.DeckGeneratorMonoColor;
import forge.gui.toolbox.FOptionPane; import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.itemmanager.DeckManager;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController; import forge.quest.QuestController;
@@ -105,32 +103,6 @@ public class DeckgenUtil {
return deck; return deck;
} }
/**
* Gets a user deck.
*
* @param selection {java.lang.String}
* @return {@link forge.deck.Deck}
*/
public static Deck getConstructedDeck(final String selection) {
IStorage<Deck> path = Singletons.getModel().getDecks().getConstructed();
String name = selection;
int idxSlash = name.indexOf('/');
while (idxSlash > 0 && path != null) {
String sf = name.substring(0, idxSlash).trim();
path = path.getFolders().get(sf);
name = name.substring(idxSlash+1).trim();
idxSlash = name.indexOf('/');
};
if (path == null) {
throw new IllegalArgumentException("Path not found - " + selection);
}
return path.get(name);
}
public static Deck getPreconDeck(String selection) {
return QuestController.getPrecons().get(selection).getDeck();
}
public static QuestEvent getQuestEvent(final String name) { public static QuestEvent getQuestEvent(final String name) {
QuestController qCtrl = Singletons.getModel().getQuest(); QuestController qCtrl = Singletons.getModel().getQuest();
for (QuestEventChallenge challenge : qCtrl.getChallenges()) { for (QuestEventChallenge challenge : qCtrl.getChallenges()) {
@@ -190,40 +162,37 @@ public class DeckgenUtil {
return allQuestDecks.get(rand); return allQuestDecks.get(rand);
} }
public static int[] randomSelectColors(int maxColors) { public static void randomSelectColors(final DeckManager deckManager) {
final int size = deckManager.getItemCount();
if (size == 0) { return; }
int nColors = MyRandom.getRandom().nextInt(3) + 1; int nColors = MyRandom.getRandom().nextInt(3) + 1;
int[] result = new int[nColors]; Integer[] indices = new Integer[nColors];
for (int i = 0; i < nColors; i++) { for (int i = 0; i < nColors; i++) {
int next = MyRandom.getRandom().nextInt(maxColors); int next = MyRandom.getRandom().nextInt(size);
boolean isUnique = true; boolean isUnique = true;
for (int j = 0; j < i; j++) { for (int j = 0; j < i; j++) {
if (result[j] == next) { if (indices[j] == next) {
isUnique = false; isUnique = false;
break; break;
} }
} }
if (isUnique) { if (isUnique) {
result[i] = next; indices[i] = next;
} }
else { else {
i--; // try over with this number i--; // try over with this number
} }
} }
return result; deckManager.setSelectedIndices(indices);
} }
/** @param lst0 {@link javax.swing.JList} */ public static void randomSelect(final DeckManager deckManager) {
public static void randomSelect(final JList<String> lst0) { final int size = deckManager.getItemCount();
final int size = lst0.getModel().getSize(); if (size == 0) { return; }
if (size > 0) { deckManager.setSelectedIndex(MyRandom.getRandom().nextInt(size));
final Random r = new Random();
final int i = r.nextInt(size);
lst0.setSelectedIndex(i);
lst0.ensureIndexIsVisible(lst0.getSelectedIndex());
}
} }
/** Shows decklist dialog for a given deck. /** Shows decklist dialog for a given deck.

View File

@@ -1,298 +1,286 @@
package forge.gui.deckchooser; package forge.gui.deckchooser;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.base.Function;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckBase;
import forge.game.GameType;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gui.MouseUtil; import forge.gui.MouseUtil;
import forge.gui.MouseUtil.MouseCursor; import forge.gui.MouseUtil.MouseCursor;
import forge.gui.deckchooser.DecksComboBox.DeckType; import forge.gui.deckchooser.DecksComboBox.DeckType;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList; import forge.gui.toolbox.itemmanager.DeckManager;
import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.itemmanager.ItemManagerContainer;
import forge.gui.toolbox.FSkin; import forge.item.PreconDeck;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestEvent; import forge.quest.QuestEvent;
import forge.quest.QuestEventChallenge; import forge.quest.QuestEventChallenge;
import forge.quest.QuestUtil; import forge.quest.QuestUtil;
import forge.util.IHasName;
import forge.util.storage.IStorage;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class FDeckChooser extends JPanel implements IDecksComboBoxListener { public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private final Color BORDER_COLOR = FSkin.getColor(FSkin.Colors.CLR_TEXT).getColor().darker();
private boolean isUISetup = false; private boolean isUISetup = false;
private DecksComboBox decksComboBox; private DecksComboBox decksComboBox;
private DeckType selectedDeckType = DeckType.COLOR_DECK; private DeckType selectedDeckType = DeckType.COLOR_DECK;
private List<String> selectedDecks = new ArrayList<String>();
private final JList<String> lstDecks = new FList<String>(); private final DeckManager lstDecks = new DeckManager(GameType.Constructed);
private final FLabel btnRandom = new FLabel.ButtonBuilder().text("Random").fontSize(16).build(); private final FLabel btnRandom = new FLabel.ButtonBuilder().text("Random").fontSize(16).build();
private final JScrollPane scrDecks =
new FScrollPane(lstDecks, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
private final FLabel lblDecklist = new FLabel.Builder().text("Double click deck for its decklist.").fontSize(12).build(); private final FLabel lblDecklist = new FLabel.Builder().text("Double click deck for its decklist.").fontSize(12).build();
private boolean isAi; private boolean isAi;
private final ForgePreferences prefs = Singletons.getModel().getPreferences(); private final ForgePreferences prefs = Singletons.getModel().getPreferences();
private FPref stateSetting = null; private FPref stateSetting = null;
private Function<ImmutablePair<DeckType, List<String>>, Void> onDeckSelected;
public void setChangeListener(Function<ImmutablePair<DeckType, List<String>>, Void> fn) {
onDeckSelected = fn;
}
private final MouseAdapter madDecklist = new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (MouseEvent.BUTTON1 == e.getButton() && e.getClickCount() == 2) {
if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) {
DeckgenUtil.showDecklist(getDeck());
}
}
}
};
private final ListSelectionListener selChangeListener = new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent e) {
if( null != onDeckSelected )
onDeckSelected.apply(ImmutablePair.of(selectedDeckType, getLstDecks().getSelectedValuesList()));
}
};
public FDeckChooser(final String titleText, boolean forAi, boolean canSwitchType) { public FDeckChooser(final String titleText, boolean forAi, boolean canSwitchType) {
setOpaque(false); setOpaque(false);
isAi = forAi; isAi = forAi;
lstDecks.setItemActivateCommand(new Command() {
@Override
public void run() {
if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) {
DeckgenUtil.showDecklist(getDeck());
}
}
});
} }
public FDeckChooser(String titleText, boolean forAi) { public FDeckChooser(String titleText, boolean forAi) {
this(titleText, forAi, false); this(titleText, forAi, false);
} }
public void initialize(FPref savedStateSetting, DeckType defaultDeckType) { public void initialize() {
stateSetting = savedStateSetting; initialize(DeckType.COLOR_DECK);
selectedDeckType = defaultDeckType;
} }
public void initialize(DeckType defaultDeckType) { public void initialize(DeckType defaultDeckType) {
initialize(null, defaultDeckType); initialize(null, defaultDeckType);
} }
public void initialize() { public void initialize(FPref savedStateSetting, DeckType defaultDeckType) {
initialize(DeckType.COLOR_DECK); stateSetting = savedStateSetting;
selectedDeckType = defaultDeckType;
} }
private JList<String> getLstDecks() { return lstDecks; } public DeckType getSelectedDeckType() { return selectedDeckType; }
private FLabel getBtnRandom() { return btnRandom; } public void setSelectedDeckType(DeckType selectedDeckType0) {
if (selectedDeckType != selectedDeckType0) {
selectedDeckType = selectedDeckType0;
decksComboBox.refresh(selectedDeckType0);
}
}
public DeckManager getLstDecks() { return lstDecks; }
private FLabel getBtnRandom() { return btnRandom; }
private void updateCustom() {
lblDecklist.setVisible(true);
lstDecks.setAllowMultipleSelections(false);
lstDecks.setPool(Singletons.getModel().getDecks().getConstructed());
lstDecks.update();
getBtnRandom().setText("Random deck");
getBtnRandom().setCommand(new Command() {
@Override
public void run() {
DeckgenUtil.randomSelect(lstDecks);
}
});
lstDecks.setSelectedIndex(0);
}
//Deck that generates its card pool via some algorithm
private abstract class DeckGenerator extends Deck {
public DeckGenerator(final String name0) {
super(name0);
}
@Override
protected DeckBase newInstance(final String name0) {
final DeckGenerator deckGen = this;
return new DeckGenerator(name0) {
@Override
public Deck generateDeck() {
return deckGen.generateDeck();
}
};
}
public abstract Deck generateDeck();
}
private class ColorDeckGenerator extends DeckGenerator {
public ColorDeckGenerator(String name0) {
super(name0);
}
@Override
public Deck generateDeck() {
List<String> selection = new ArrayList<String>();
for (Deck deck : lstDecks.getSelectedItems()) {
selection.add(deck.getName());
}
if (DeckgenUtil.colorCheck(selection)) {
return DeckgenUtil.buildColorDeck(selection, isAi);
}
return null;
}
}
private void updateColors() { private void updateColors() {
final JList<String> lst = getLstDecks(); lblDecklist.setVisible(false);
lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); lstDecks.setAllowMultipleSelections(true);
final String[] listData = new String[] {"Random 1", "Random 2", "Random 3", "Black", "Blue", "Green", "Red", "White"}; ArrayList<Deck> decks = new ArrayList<Deck>();
lst.setListData(listData); decks.add(new ColorDeckGenerator("Random 1"));
lst.setName(DeckgenUtil.DeckTypes.COLORS.toString()); decks.add(new ColorDeckGenerator("Random 2"));
decks.add(new ColorDeckGenerator("Random 3"));
decks.add(new ColorDeckGenerator("White"));
decks.add(new ColorDeckGenerator("Blue"));
decks.add(new ColorDeckGenerator("Black"));
decks.add(new ColorDeckGenerator("Red"));
decks.add(new ColorDeckGenerator("Green"));
lst.removeListSelectionListener(selChangeListener); lstDecks.setPool(decks);
lst.addListSelectionListener(selChangeListener); lstDecks.update(true);
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
getBtnRandom().setText("Random colors"); getBtnRandom().setText("Random colors");
getBtnRandom().setCommand(new Command() { getBtnRandom().setCommand(new Command() {
@Override public void run() { lst.setSelectedIndices(DeckgenUtil.randomSelectColors(8)); } }); @Override
public void run() {
DeckgenUtil.randomSelectColors(lstDecks);
}
});
if (listData.length > 0) { // default selection = basic two color deck
// default selection = basic two color deck lstDecks.setSelectedIndices(new Integer[]{0, 1});
lst.setSelectedIndices(getSelectedDeckIndices(Arrays.asList(listData), new int[]{0, 1})); }
lst.ensureIndexIsVisible(lst.getSelectedIndices()[0]);
private class ThemeDeckGenerator extends DeckGenerator {
public ThemeDeckGenerator(String name0) {
super(name0);
}
@Override
public Deck generateDeck() {
return DeckgenUtil.buildThemeDeck(this.getName());
} }
} }
private void updateThemes() { private void updateThemes() {
final JList<String> lst = getLstDecks(); lblDecklist.setVisible(false);
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lstDecks.setAllowMultipleSelections(false);
lst.removeListSelectionListener(selChangeListener); ArrayList<Deck> decks = new ArrayList<Deck>();
lst.addListSelectionListener(selChangeListener); for (final String s : GenerateThemeDeck.getThemeNames()) {
decks.add(new ThemeDeckGenerator(s));
lst.removeMouseListener(madDecklist); }
lst.addMouseListener(madDecklist);
final List<String> listData = new ArrayList<String>(); lstDecks.setPool(decks);
for (final String s : GenerateThemeDeck.getThemeNames()) { listData.add(s); } lstDecks.update(true);
lst.setListData(listData.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(DeckgenUtil.DeckTypes.THEMES.toString());
lst.removeMouseListener(madDecklist);
getBtnRandom().setText("Random deck"); getBtnRandom().setText("Random deck");
getBtnRandom().setCommand(new Command() { getBtnRandom().setCommand(new Command() {
@Override public void run() { DeckgenUtil.randomSelect(lst); } }); @Override
public void run() {
DeckgenUtil.randomSelect(lstDecks);
}
});
if (listData.size() > 0) { lstDecks.setSelectedIndex(0);
lst.setSelectedIndices(getSelectedDeckIndices(listData, new int[]{0}));
lst.ensureIndexIsVisible(lst.getSelectedIndices()[0]);
}
}
private void updateCustom() {
final JList<String> lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> listData = new ArrayList<String>();
addDecksRecursive(Singletons.getModel().getDecks().getConstructed(), listData, null);
lst.setListData(listData.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(DeckgenUtil.DeckTypes.CUSTOM.toString());
lst.removeListSelectionListener(selChangeListener);
lst.addListSelectionListener(selChangeListener);
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
getBtnRandom().setText("Random deck");
getBtnRandom().setCommand(new Command() {
@Override public void run() { DeckgenUtil.randomSelect(lst); } });
if (listData.size() > 0) {
lst.setSelectedIndices(getSelectedDeckIndices(listData, new int[]{0}));
lst.ensureIndexIsVisible(lst.getSelectedIndices()[0]);
}
}
private <T extends IHasName> void addDecksRecursive(IStorage<T> node, List<String> customNames, String namePrefix ) {
String path = namePrefix == null ? "" : namePrefix + " / ";
for (final String fn : node.getFolders().getItemNames() )
{
IStorage<T> f = node.getFolders().get(fn);
addDecksRecursive(f, customNames, path + fn);
}
for (final T d : node) { customNames.add(path + d.getName()); }
} }
private void updatePrecons() { private void updatePrecons() {
final JList<String> lst = getLstDecks(); lblDecklist.setVisible(true);
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lstDecks.setAllowMultipleSelections(false);
final List<String> listData = new ArrayList<String>(); ArrayList<Deck> decks = new ArrayList<Deck>();
addDecksRecursive(QuestController.getPrecons(), listData, null); for (final PreconDeck preconDeck : QuestController.getPrecons()) {
decks.add(preconDeck.getDeck());
}
lst.setListData(listData.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); lstDecks.setPool(decks);
lst.setName(DeckgenUtil.DeckTypes.PRECON.toString()); lstDecks.update(false, true);
lst.removeListSelectionListener(selChangeListener);
lst.addListSelectionListener(selChangeListener);
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
getBtnRandom().setText("Random deck"); getBtnRandom().setText("Random deck");
getBtnRandom().setCommand(new Command() { getBtnRandom().setCommand(new Command() {
@Override public void run() { DeckgenUtil.randomSelect(lst); } }); @Override
public void run() {
DeckgenUtil.randomSelect(lstDecks);
}
});
if (listData.size() > 0) { lstDecks.setSelectedIndex(0);
lst.setSelectedIndices(getSelectedDeckIndices(listData, new int[]{0})); }
lst.ensureIndexIsVisible(lst.getSelectedIndices()[0]);
private class QuestEventDeckGenerator extends DeckGenerator {
public QuestEventDeckGenerator(String name0) {
super(name0);
}
@Override
public Deck generateDeck() {
return DeckgenUtil.getQuestEvent(this.getName()).getEventDeck();
} }
} }
private void updateQuestEvents() { private void updateQuestEvents() {
final JList<String> lst = getLstDecks(); lblDecklist.setVisible(true);
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lstDecks.setAllowMultipleSelections(false);
final List<String> listData = new ArrayList<String>();
ArrayList<Deck> decks = new ArrayList<Deck>();
QuestController quest = Singletons.getModel().getQuest(); QuestController quest = Singletons.getModel().getQuest();
for (QuestEvent e : quest.getDuelsManager().getAllDuels()) { for (QuestEvent e : quest.getDuelsManager().getAllDuels()) {
listData.add(e.getName()); decks.add(new QuestEventDeckGenerator(e.getName()));
} }
for (QuestEvent e : quest.getChallenges()) { for (QuestEvent e : quest.getChallenges()) {
listData.add(e.getTitle()); decks.add(new QuestEventDeckGenerator(e.getTitle()));
} }
lst.setListData(listData.toArray(ArrayUtils.EMPTY_STRING_ARRAY)); lstDecks.setPool(decks);
lst.setName(DeckgenUtil.DeckTypes.QUESTEVENTS.toString()); lstDecks.update(true);
lst.removeListSelectionListener(selChangeListener);
lst.addListSelectionListener(selChangeListener);
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
getBtnRandom().setText("Random event"); getBtnRandom().setText("Random event");
getBtnRandom().setCommand(new Command() { getBtnRandom().setCommand(new Command() {
@Override public void run() { DeckgenUtil.randomSelect(lst); } }); @Override
public void run() {
DeckgenUtil.randomSelect(lstDecks);
}
});
if (listData.size() > 0) { lstDecks.setSelectedIndex(0);
lst.setSelectedIndices(getSelectedDeckIndices(listData, new int[]{0}));
lst.ensureIndexIsVisible(lst.getSelectedIndices()[0]);
}
} }
public Deck getDeck() { public Deck getDeck() {
JList<String> lst0 = getLstDecks(); Deck deck = lstDecks.getSelectedItem();
final List<String> selection = lst0.getSelectedValuesList(); if (deck instanceof DeckGenerator) {
return ((DeckGenerator)deck).generateDeck();
if (selection.isEmpty()) { return null; }
// Special branch for quest events
if (lst0.getName().equals(DeckgenUtil.DeckTypes.QUESTEVENTS.toString())) {
return DeckgenUtil.getQuestEvent(selection.get(0)).getEventDeck();
} }
if (lst0.getName().equals(DeckgenUtil.DeckTypes.COLORS.toString()) && DeckgenUtil.colorCheck(selection)) { return deck;
return DeckgenUtil.buildColorDeck(selection, isAi);
}
if (lst0.getName().equals(DeckgenUtil.DeckTypes.THEMES.toString())) {
return DeckgenUtil.buildThemeDeck(selection.get(0));
}
if (lst0.getName().equals(DeckgenUtil.DeckTypes.CUSTOM.toString())) {
return DeckgenUtil.getConstructedDeck(selection.get(0));
}
if (lst0.getName().equals(DeckgenUtil.DeckTypes.PRECON.toString())) {
return DeckgenUtil.getPreconDeck(selection.get(0));
}
return null;
} }
/** Generates deck from current list selection(s). */ /** Generates deck from current list selection(s). */
public RegisteredPlayer getPlayer() { public RegisteredPlayer getPlayer() {
if (getLstDecks().getSelectedValuesList().isEmpty()) { return null; } if (lstDecks.getSelectedIndex() < 0) { return null; }
// Special branch for quest events // Special branch for quest events
if (getLstDecks().getName().equals(DeckgenUtil.DeckTypes.QUESTEVENTS.toString())) { if (selectedDeckType == DeckType.QUEST_OPPONENT_DECK) {
QuestEvent event = DeckgenUtil.getQuestEvent(getLstDecks().getSelectedValuesList().get(0)); QuestEvent event = DeckgenUtil.getQuestEvent(lstDecks.getSelectedItem().getName());
RegisteredPlayer result = new RegisteredPlayer(event.getEventDeck()); RegisteredPlayer result = new RegisteredPlayer(event.getEventDeck());
if( event instanceof QuestEventChallenge ) { if (event instanceof QuestEventChallenge) {
result.setStartingLife(((QuestEventChallenge) event).getAiLife()); result.setStartingLife(((QuestEventChallenge) event).getAiLife());
} }
result.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event)); result.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event));
@@ -310,10 +298,10 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
setupUI(); setupUI();
removeAll(); removeAll();
this.setLayout(new MigLayout("insets 0, gap 0, flowy")); this.setLayout(new MigLayout("insets 0, gap 0, flowy"));
this.add(decksComboBox.getComponent(), "w 10:100%, h 30px!"); this.add(decksComboBox.getComponent(), "w 10:100%, h 30px!, gapbottom 3px");
this.add(scrDecks, "w 10:100%, growy, pushy"); this.add(new ItemManagerContainer(lstDecks), "w 10:100%, growy, pushy");
this.add(btnRandom, "w 10:100%, h 26px!, gap 0 0 2px 0"); this.add(btnRandom, "w 10:100%, h 26px!, gaptop 3px");
this.add(lblDecklist, "w 10:100%, h 20px!, , gap 0 0 5px 0"); this.add(lblDecklist, "w 10:100%, h 20px!, gaptop 5px");
if (isShowing()) { if (isShowing()) {
validate(); validate();
repaint(); repaint();
@@ -346,9 +334,6 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
isUISetup = true; isUISetup = true;
// core UI components. // core UI components.
decksComboBox = new DecksComboBox(); decksComboBox = new DecksComboBox();
// set component styles.
lstDecks.setOpaque(false);
scrDecks.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, BORDER_COLOR));
// monitor events generated by these components. // monitor events generated by these components.
decksComboBox.addListener(this); decksComboBox.addListener(this);
// now everything is in place, fire initial populate event. // now everything is in place, fire initial populate event.
@@ -358,29 +343,26 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
} }
private void refreshDecksList(DeckType deckType) { private void refreshDecksList(DeckType deckType) {
selectedDeckType = deckType;
lstDecks.setCaption(deckType.toString());
switch (deckType) { switch (deckType) {
case CUSTOM_DECK: case CUSTOM_DECK:
updateCustom(); updateCustom();
lblDecklist.setVisible(true);
break; break;
case COLOR_DECK: case COLOR_DECK:
updateColors(); updateColors();
lblDecklist.setVisible(false);
break; break;
case THEME_DECK: case THEME_DECK:
updateThemes(); updateThemes();
lblDecklist.setVisible(false);
break; break;
case QUEST_OPPONENT_DECK: case QUEST_OPPONENT_DECK:
updateQuestEvents(); updateQuestEvents();
lblDecklist.setVisible(true);
break; break;
case PRECONSTRUCTED_DECK: case PRECONSTRUCTED_DECK:
updatePrecons(); updatePrecons();
lblDecklist.setVisible(true);
break; break;
} }
selectedDeckType = deckType;
} }
private final String SELECTED_DECK_DELIMITER = "::"; private final String SELECTED_DECK_DELIMITER = "::";
@@ -396,12 +378,14 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private String getState() { private String getState() {
String deckType = decksComboBox.getDeckType().name(); String deckType = decksComboBox.getDeckType().name();
String state = deckType; String state = deckType;
final JList<String> lst = getLstDecks();
state += ";"; state += ";";
for (String value : lst.getSelectedValuesList()) { Iterable<Deck> selectedDecks = lstDecks.getSelectedItems();
state += value + SELECTED_DECK_DELIMITER; if (selectedDecks != null) {
for (Deck deck : selectedDecks) {
state += deck + SELECTED_DECK_DELIMITER;
}
state = state.substring(0, state.length() - SELECTED_DECK_DELIMITER.length());
} }
state = state.substring(0, state.length()-SELECTED_DECK_DELIMITER.length());
return state; return state;
} }
@@ -409,31 +393,40 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
public final String getStateForLabel() { public final String getStateForLabel() {
String deckType = decksComboBox.getDeckType().toString(); String deckType = decksComboBox.getDeckType().toString();
String state = deckType; String state = deckType;
final JList<String> lst = getLstDecks();
state += ": "; state += ": ";
for (String value : lst.getSelectedValuesList()) { Iterable<Deck> selectedDecks = lstDecks.getSelectedItems();
state += value + ", "; if (selectedDecks != null) {
for (Deck deck : selectedDecks) {
state += deck + ", ";
}
state = state.substring(0, state.length() - 2);
} }
state = state.substring(0, state.length() - 2);
return state; return state;
} }
private void restoreSavedState() { private void restoreSavedState() {
if (stateSetting != null) { if (stateSetting == null) {
String savedState = prefs.getPref(stateSetting); //if can't restore saved state, just refresh decks combo box
selectedDeckType = getDeckTypeFromSavedState(savedState); decksComboBox.refresh(selectedDeckType);
selectedDecks = getSelectedDecksFromSavedState(savedState); return;
} }
String savedState = prefs.getPref(stateSetting);
selectedDeckType = getDeckTypeFromSavedState(savedState);
decksComboBox.refresh(selectedDeckType);
lstDecks.setSelectedStrings(getSelectedDecksFromSavedState(savedState));
} }
private DeckType getDeckTypeFromSavedState(String savedState) { private DeckType getDeckTypeFromSavedState(String savedState) {
try { try {
if (StringUtils.isBlank(savedState)) { if (StringUtils.isBlank(savedState)) {
return selectedDeckType; return selectedDeckType;
} else { }
else {
return DeckType.valueOf(savedState.split(";")[0]); return DeckType.valueOf(savedState.split(";")[0]);
} }
} catch (IllegalArgumentException ex) { }
catch (IllegalArgumentException ex) {
System.err.println(ex.getMessage() + ". Using default : " + selectedDeckType); System.err.println(ex.getMessage() + ". Using default : " + selectedDeckType);
return selectedDeckType; return selectedDeckType;
} }
@@ -443,31 +436,14 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
try { try {
if (StringUtils.isBlank(savedState)) { if (StringUtils.isBlank(savedState)) {
return new ArrayList<String>(); return new ArrayList<String>();
} else { }
else {
return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER)); return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER));
} }
} catch (Exception ex) { }
catch (Exception ex) {
System.err.println(ex + " [savedState=" + savedState + "]"); System.err.println(ex + " [savedState=" + savedState + "]");
return new ArrayList<String>(); return new ArrayList<String>();
} }
} }
private int[] getSelectedDeckIndices(List<String> listData, int[] defaultSelection) {
if (selectedDecks != null && selectedDecks.size() > 0) {
List<Integer> selectedIndices = new ArrayList<Integer>();
for (String deck : selectedDecks) {
int index = listData.indexOf(deck);
if (index >= 0) {
selectedIndices.add(index);
}
}
int[] indices = ArrayUtils.toPrimitive(selectedIndices.toArray(new Integer[selectedIndices.size()]));
if (indices.length == 0) { indices = defaultSelection; }
// only do this once at startup.
selectedDecks = null;
return indices;
} else {
return defaultSelection;
}
}
} }

View File

@@ -26,11 +26,9 @@ import javax.swing.JRadioButton;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair; import forge.Command;
import com.google.common.base.Function;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.deckchooser.DecksComboBox.DeckType; import forge.gui.deckchooser.DecksComboBox.DeckType;
import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckchooser.FDeckChooser;
@@ -347,6 +345,7 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
/** Builds the actual deck panel layouts for each player. /** Builds the actual deck panel layouts for each player.
* These are added to a list which can be referenced to populate the deck panel appropriately. */ * These are added to a list which can be referenced to populate the deck panel appropriately. */
@SuppressWarnings("serial")
private void buildDeckPanel(final int playerIndex) { private void buildDeckPanel(final int playerIndex) {
String sectionConstraints = "insets 8"; String sectionConstraints = "insets 8";
@@ -354,12 +353,12 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
FPanel mainDeckPanel = new FPanel(); FPanel mainDeckPanel = new FPanel();
mainDeckPanel.setLayout(new MigLayout(sectionConstraints)); mainDeckPanel.setLayout(new MigLayout(sectionConstraints));
FDeckChooser mainChooser = new FDeckChooser("Main deck:", isPlayerAI(playerIndex)); final FDeckChooser mainChooser = new FDeckChooser("Main deck:", isPlayerAI(playerIndex));
mainChooser.initialize(); mainChooser.initialize();
mainChooser.setChangeListener(new Function<ImmutablePair<DeckType, List<String>>, Void>(){ mainChooser.getLstDecks().setSelectCommand(new Command() {
@Override public Void apply(ImmutablePair<DeckType, List<String>> selection) { @Override
VSubmenuConstructed.this.onDeckClicked(playerIndex, selection.left, selection.right); public void run() {
return null; VSubmenuConstructed.this.onDeckClicked(playerIndex, mainChooser.getSelectedDeckType(), mainChooser.getLstDecks().getSelectedItems());
} }
}); });
deckChoosers.add(mainChooser); deckChoosers.add(mainChooser);
@@ -367,8 +366,8 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
deckPanelListMain.add(mainDeckPanel); deckPanelListMain.add(mainDeckPanel);
} }
protected void onDeckClicked(int iPlayer, DeckType type, List<String> selectedLines) { protected void onDeckClicked(int iPlayer, DeckType type, Iterable<Deck> selectedDecks) {
String text = type.toString() + ": " + Lang.joinHomogenous(selectedLines); String text = type.toString() + ": " + Lang.joinHomogenous(selectedDecks);
deckSelectorBtns.get(iPlayer).setText(text); deckSelectorBtns.get(iPlayer).setText(text);
} }

View File

@@ -6,6 +6,7 @@ import java.awt.Rectangle;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JTable; import javax.swing.JTable;
@@ -55,6 +56,7 @@ public final class DeckManager extends ItemManager<Deck> {
private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER); private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER);
private final GameType gametype; private final GameType gametype;
private boolean nameOnly, preventEdit;
private Command cmdDelete, cmdSelect; private Command cmdDelete, cmdSelect;
private final Map<ColumnDef, ItemColumn> columns = SColumnUtil.getColumns( private final Map<ColumnDef, ItemColumn> columns = SColumnUtil.getColumns(
ColumnDef.DECK_ACTIONS, ColumnDef.DECK_ACTIONS,
@@ -75,8 +77,7 @@ public final class DeckManager extends ItemManager<Deck> {
this.gametype = gt; this.gametype = gt;
columns.get(ColumnDef.DECK_ACTIONS).setCellRenderer(new DeckActionsRenderer()); columns.get(ColumnDef.DECK_ACTIONS).setCellRenderer(new DeckActionsRenderer());
columns.get(ColumnDef.DECK_ACTIONS).setSortPriority(1); columns.get(ColumnDef.NAME).setSortPriority(1);
columns.get(ColumnDef.NAME).setSortPriority(2);
this.addSelectionListener(new ListSelectionListener() { this.addSelectionListener(new ListSelectionListener() {
@Override @Override
@@ -99,6 +100,29 @@ public final class DeckManager extends ItemManager<Deck> {
* Update table columns * Update table columns
*/ */
public void update() { public void update() {
update(false, false);
}
public void update(boolean nameOnly0) {
update(nameOnly0, nameOnly0);
}
public void update(boolean nameOnly0, boolean preventEdit0) {
if (this.nameOnly != nameOnly0) {
this.nameOnly = nameOnly0;
boolean visible = !nameOnly0;
for (Entry<ColumnDef, ItemColumn> column : columns.entrySet()) {
if (column.getKey() != ColumnDef.NAME) {
column.getValue().setVisible(visible);
}
}
this.restoreDefaultFilters();
}
if (nameOnly0) {
preventEdit0 = true; //if name only, always prevent edit
}
if (this.preventEdit != preventEdit0) {
this.preventEdit = preventEdit0;
columns.get(ColumnDef.DECK_ACTIONS).setVisible(!preventEdit0);
}
this.getTable().setup(columns); this.getTable().setup(columns);
} }
@@ -122,7 +146,9 @@ public final class DeckManager extends ItemManager<Deck> {
@Override @Override
protected void addDefaultFilters() { protected void addDefaultFilters() {
addFilter(new DeckColorFilter(this)); if (!this.nameOnly) {
addFilter(new DeckColorFilter(this));
}
} }
@Override @Override
@@ -132,6 +158,8 @@ public final class DeckManager extends ItemManager<Deck> {
@Override @Override
protected void buildAddFilterMenu(JMenu menu) { protected void buildAddFilterMenu(JMenu menu) {
if (this.nameOnly) { return; }
GuiUtils.addSeparator(menu); //separate from current search item GuiUtils.addSeparator(menu); //separate from current search item
JMenu fmt = GuiUtils.createMenu("Format"); JMenu fmt = GuiUtils.createMenu("Format");
@@ -189,7 +217,7 @@ public final class DeckManager extends ItemManager<Deck> {
} }
private <T extends DeckBase> void editDeck(final Deck deck) { private <T extends DeckBase> void editDeck(final Deck deck) {
if (deck == null) { return; } if (deck == null || this.preventEdit) { return; }
ACEditorBase<? extends InventoryItem, ? extends DeckBase> editorCtrl = null; ACEditorBase<? extends InventoryItem, ? extends DeckBase> editorCtrl = null;
FScreen screen = null; FScreen screen = null;
@@ -228,7 +256,7 @@ public final class DeckManager extends ItemManager<Deck> {
} }
public boolean deleteDeck(Deck deck) { public boolean deleteDeck(Deck deck) {
if (deck == null) { return false; } if (deck == null || this.preventEdit) { return false; }
if (!FOptionPane.showConfirmDialog( if (!FOptionPane.showConfirmDialog(
"Are you sure you want to delete '" + deck.getName() + "'?", "Are you sure you want to delete '" + deck.getName() + "'?",

View File

@@ -25,6 +25,7 @@ import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -499,6 +500,25 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.table.setSelectedItems(items); this.table.setSelectedItems(items);
} }
/**
*
* setSelectedStrings.
*
* @param strings - Strings to select
*/
public void setSelectedStrings(Iterable<String> strings) {
List<T> items = new ArrayList<T>();
for (String itemName : strings) {
for (Entry<T, Integer> itemEntry : this.pool) {
if (itemEntry.getKey().toString().equals(itemName)) {
items.add(itemEntry.getKey());
break;
}
}
}
this.table.setSelectedItems(items);
}
/** /**
* *
* selectItemEntrys. * selectItemEntrys.
@@ -549,6 +569,9 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* *
* @param indices - Indices to select * @param indices - Indices to select
*/ */
public void setSelectedIndices(Integer[] indices) {
this.table.setSelectedIndices(Arrays.asList(indices));
}
public void setSelectedIndices(Iterable<Integer> indices) { public void setSelectedIndices(Iterable<Integer> indices) {
this.table.setSelectedIndices(indices); this.table.setSelectedIndices(indices);
} }
@@ -733,6 +756,19 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
} }
} }
public void restoreDefaultFilters() {
lockFiltering = true;
for (ItemFilter<? extends T> filter : this.orderedFilters) {
this.remove(filter.getPanel());
}
this.filters.clear();
this.orderedFilters.clear();
addDefaultFilters();
lockFiltering = false;
this.revalidate();
this.applyFilters();
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void removeFilter(ItemFilter<? extends T> filter) { public void removeFilter(ItemFilter<? extends T> filter) {
final Class<? extends ItemFilter<? extends T>> filterClass = (Class<? extends ItemFilter<? extends T>>) filter.getClass(); final Class<? extends ItemFilter<? extends T>> filterClass = (Class<? extends ItemFilter<? extends T>>) filter.getClass();
@@ -741,7 +777,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
if (classFilters.size() == 0) { if (classFilters.size() == 0) {
this.filters.remove(filterClass); this.filters.remove(filterClass);
} }
orderedFilters.remove(filter); this.orderedFilters.remove(filter);
this.remove(filter.getPanel()); this.remove(filter.getPanel());
this.revalidate(); this.revalidate();
applyFilters(); applyFilters();

View File

@@ -65,7 +65,7 @@ public class ItemColumn extends TableColumn {
private final ColumnDef def; private final ColumnDef def;
private SortState sortState = SortState.NONE; private SortState sortState = SortState.NONE;
private int sortPriority = 0; private int sortPriority = 0;
private boolean hide = false; private boolean visible = true;
private int index = 0; private int index = 0;
private final Function<Entry<InventoryItem, Integer>, Comparable<?>> fnSort; private final Function<Entry<InventoryItem, Integer>, Comparable<?>> fnSort;
private final Function<Entry<? extends InventoryItem, Integer>, Object> fnDisplay; private final Function<Entry<? extends InventoryItem, Integer>, Object> fnDisplay;
@@ -144,16 +144,12 @@ public class ItemColumn extends TableColumn {
return this.def.sortState; return this.def.sortState;
} }
public boolean isHidden() { public boolean isVisible() {
return this.hide; return this.visible;
} }
public void hide() { public void setVisible(boolean visible0) {
this.hide = true; this.visible = visible0;
}
public void show() {
this.hide = false;
} }
public Function<Entry<InventoryItem, Integer>, Comparable<?>> getFnSort() { public Function<Entry<InventoryItem, Integer>, Comparable<?>> getFnSort() {

View File

@@ -156,7 +156,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
for (Entry<ColumnDef, ItemColumn> entry : list) { for (Entry<ColumnDef, ItemColumn> entry : list) {
ItemColumn col = entry.getValue(); ItemColumn col = entry.getValue();
col.setModelIndex(colmodel.getColumnCount()); col.setModelIndex(colmodel.getColumnCount());
if (!col.isHidden()) { colmodel.addColumn(col); } if (col.isVisible()) { colmodel.addColumn(col); }
} }
this.tableModel.addListeners(); this.tableModel.addListeners();
@@ -424,7 +424,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
// Assemble priority sort. // Assemble priority sort.
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
final ItemColumn col = (ItemColumn) e.nextElement(); final ItemColumn col = (ItemColumn) e.nextElement();
if (col.getSortPriority() > 0) { if (col.getSortPriority() > 0 && col.getSortPriority() < sortcols.length) {
sortcols[col.getSortPriority()] = col; sortcols[col.getSortPriority()] = col;
} }
} }

View File

@@ -63,8 +63,8 @@ public final class SColumnUtil {
ColumnDef.RANKING); ColumnDef.RANKING);
columns.get(ColumnDef.FAVORITE).setSortPriority(1); columns.get(ColumnDef.FAVORITE).setSortPriority(1);
columns.get(ColumnDef.NAME).setSortPriority(2); columns.get(ColumnDef.NAME).setSortPriority(2);
columns.get(ColumnDef.AI).hide(); columns.get(ColumnDef.AI).setVisible(false);
columns.get(ColumnDef.RANKING).hide(); columns.get(ColumnDef.RANKING).setVisible(false);
return columns; return columns;
} }
@@ -85,8 +85,8 @@ public final class SColumnUtil {
columns.get(ColumnDef.CMC).setSortPriority(1); columns.get(ColumnDef.CMC).setSortPriority(1);
columns.get(ColumnDef.TYPE).setSortPriority(2); columns.get(ColumnDef.TYPE).setSortPriority(2);
columns.get(ColumnDef.NAME).setSortPriority(3); columns.get(ColumnDef.NAME).setSortPriority(3);
columns.get(ColumnDef.AI).hide(); columns.get(ColumnDef.AI).setVisible(false);
columns.get(ColumnDef.RANKING).hide(); columns.get(ColumnDef.RANKING).setVisible(false);
return columns; return columns;
} }
@@ -99,12 +99,12 @@ public final class SColumnUtil {
public static void toggleColumn(final JTable table, final ItemColumn col0) { public static void toggleColumn(final JTable table, final ItemColumn col0) {
final TableColumnModel colmodel = table.getColumnModel(); final TableColumnModel colmodel = table.getColumnModel();
if (!col0.isHidden()) { if (col0.isVisible()) {
col0.hide(); col0.setVisible(false);
colmodel.removeColumn(col0); colmodel.removeColumn(col0);
} }
else { else {
col0.show(); col0.setVisible(true);
colmodel.addColumn(col0); colmodel.addColumn(col0);
if (col0.getModelIndex() < colmodel.getColumnCount()) { if (col0.getModelIndex() < colmodel.getColumnCount()) {