// // @(#)NGDVariantSelect.java 4/2002 // // Copyright 2002 Zachary DelProposto. All rights reserved. // Use is subject to license terms. // // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Or from http://www.gnu.org/ // package dip.gui.dialog.newgame; import dip.misc.Utils; import dip.world.variant.VariantManager; import dip.world.*; import dip.world.variant.data.MapGraphic; import dip.world.variant.data.Variant; import dip.world.variant.data.SymbolPack; import dip.gui.ClientFrame; import dip.gui.dialog.ErrorDialog; import dip.gui.swing.*; import cz.autel.dmi.HIGConstraints; import cz.autel.dmi.HIGLayout; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.Component; import java.net.URI; import java.net.URL; import javax.swing.*; import java.awt.*; /** * Panel for New Game Dialog that allows selection of a map / variant / map graphic. * <p> * */ public class NGDVariantSelect extends JPanel implements NewGameDialog.NGDTabPane { // i18n constants private static final String TAB_NAME = "NGDvariant.tab.name"; private static final String LOADING_TEXT = "NGDvariant.text.loading"; private static final String INITIAL_TEXT = "NGDvariant.text.initial"; private static final String LABEL_LIST = "NGDvariant.label.list"; private static final String LABEL_DESCRIPTION = "NGDvariant.label.description"; private static final String TEMPLATE_LOCATION = "NGDvariant.location.template"; // misc constants private static final int BORDER = 5; // instance variables private ClientFrame parent; private NewGameDialog ngd; private boolean isLoading = false; private DefaultListModel listModel; private JList variantList; private JEditorPane textPanel; private String description; private Variant defaultVariant = null; /** Create a Variant Selection panel */ protected NGDVariantSelect(ClientFrame parent, NewGameDialog ngd) { this.parent = parent; this.ngd = ngd; // textPanel setup textPanel = Utils.createTextLabel( Utils.getLocalString(LOADING_TEXT), false, true ); textPanel.setContentType("text/html"); // get description template HTML; requires textPanel to be setup first description = Utils.getText( Utils.getLocalString(TEMPLATE_LOCATION) ); if(description == null) { description = "ERROR: missing template resource "+ Utils.getLocalString(TEMPLATE_LOCATION); } // variant list (based on map) listModel = new DefaultListModel(); makeVariantList(); variantList = new JList(listModel); variantList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); variantList.setPrototypeCellValue("MMMMMMMMMMMMMM"); variantList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { doVariantListSelection(); } }); // create layout makeLayout(); // NOTE: to properly scroll to the correctly selected item, // the JList must be in a scrollpane. Thus, makeLayout() must come // prior to this code. if(!listModel.isEmpty()) { // search and find the (last) default // if no default exists, select the first variant. Variant[] variants = VariantManager.getVariants(); defaultVariant = null; for(int i=0; i<variants.length; i++) { if(variants[i].isDefault()) { defaultVariant = variants[i]; } } if(defaultVariant != null) { variantList.setSelectedValue(defaultVariant.getName(), true); } else { variantList.setSelectedIndex(0); } } }// NewGameDialog() /** Gets the initial (default) selected variant. */ Variant getDefaultVariant() { return defaultVariant; }// getDefaultVariant() /** Returns the newly created World, or null, based upon the user's selections */ protected World getWorld() { // check parameters int idx = variantList.getSelectedIndex(); if(isLoading || idx < 0) { return null; } // create world, based on selected variant World world = null; try { WorldFactory wf = WorldFactory.getInstance(); Variant variant = ngd.getStartOptionsPanel().getVariant(); world = wf.createWorld( variant ); // set basic variant parameters World.VariantInfo variantInfo = world.getVariantInfo(); variantInfo.setVariantName( variant.getName() ); variantInfo.setVariantVersion( variant.getVersion() ); // set map/symbols (from Map-Symbol panel) NGDMapAndUnits ngdMAU = ngd.getMAUPanel(); SymbolPack sp = ngdMAU.getSelectedSymbolPack(); variantInfo.setSymbolPackName( sp.getName() ); variantInfo.setSymbolPackVersion( sp.getVersion() ); MapGraphic mg = ngdMAU.getSelectedMap(); variantInfo.setMapName( mg.getName() ); // set RuleOptions RuleOptions ruleOpts = ngd.getRuleOptionsPanel().getRuleOptions(); world.setRuleOptions(ruleOpts); } catch(InvalidWorldException iwe) { world = null; ErrorDialog.displayGeneral(parent, iwe); } return world; }// getWorld() /** Initializes the variant list */ private void makeVariantList() { Variant[] variants = VariantManager.getVariants(); listModel.clear(); for(int i=0; i<variants.length; i++) { listModel.addElement(variants[i].getName()); } }// makeVariantList() void ensureSelectionIsVisible() { variantList.ensureIndexIsVisible(variantList.getSelectedIndex()); }// ensureSelectionIsVisible() /** Handles list selections */ void doVariantListSelection() { // this prevents various layout-manager exceptions if(!isVisible()) { return; } int idx = variantList.getSelectedIndex(); if(idx < 0) { textPanel.setText( Utils.getLocalString(INITIAL_TEXT) ); ngd.getStartOptionsPanel().setEnabled( false ); return; } else { variantList.ensureIndexIsVisible(idx); } Variant selectedVariant = VariantManager.getVariants()[idx]; // set text, depending upon selection // textPanel.setText( Utils.format(description, selectedVariant.getHTMLSummaryArguments()) ); textPanel.setCaretPosition(0); // scroll to top textPanel.repaint(); ngd.setTabsVariant(selectedVariant); ngd.setTabsEnabled(true); }// doVariantListSelection() /** Get the tab name. */ public String getTabName() { return Utils.getLocalString(TAB_NAME); }// getTabName() /** The Variant has Changed. */ public void variantChanged(Variant variant) { // DO NOTHING }// variantChanged() /** The Enabled status has Changed. We do nothing for this tab.*/ public void enablingChanged(boolean enabled) { // DO NOTHING }// enablingChanged() /** Layout the panel */ private void makeLayout() { JScrollPane descSP = new XJScrollPane(textPanel); descSP.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane varSP = new XJScrollPane(variantList); varSP.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); int w1[] = { BORDER, 0, 15, 0, BORDER }; // cols int h1[] = { 2*BORDER, 0,5, 0, BORDER }; // rows HIGLayout l1 = new HIGLayout(w1, h1); l1.setColumnWeight(4, 1); l1.setRowWeight(4, 1); setLayout(l1); HIGConstraints c = new HIGConstraints(); add(new GradientJLabel( Utils.getLocalString(LABEL_LIST) ), c.rcwh(2,2,1,1,"lr")); add(varSP, c.rcwh(4,2,1,1,"lrtb")); add(new GradientJLabel( Utils.getLocalString(LABEL_DESCRIPTION) ), c.rcwh(2,4,1,1,"lr")); add(descSP, c.rcwh(4,4,1,1,"lrtb")); }// makeLayout() }// class NGDVariantSelect