/*
* ImageChoiceDialog.java
*
* Created on October 1, 2009, 3:10 PM
*/
package mekhq.gui.dialog;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.ResourceBundle;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import megamek.common.Crew;
import megamek.common.util.DirectoryItems;
import megamek.common.util.EncodeControl;
import mekhq.IconPackage;
import mekhq.campaign.force.Force;
/**
*
* @author Jay Lawson <jaylawson39 at yahoo.com>
*/
public class ImageChoiceDialog extends JDialog {
private static final String PANEL_IMAGES = "panel_images";
private static final String PANEL_LAYERED = "panel_layered";
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* The categorized image patterns.
*/
private DirectoryItems imageItems;
private ImageTableModel imageTableModel = new ImageTableModel();
private String category;
private String filename;
private LinkedHashMap<String, Vector<String>> iconMap; // Key = Image Category, Value = Vector of Image Filenames
private ImageTableMouseAdapter imagesMouseAdapter;
private boolean force = false;
private JButton btnCancel;
private JButton btnSelect;
private JComboBox<String> comboCategories;
private JScrollPane scrImages;
private JTable tableImages;
private boolean changed = false;
// BEGIN: Layered Images Support
private ImageIcon imageIcon = null;
private JLabel preview = new JLabel();
private JTabbedPane tabbedPane = new JTabbedPane();
private JTabbedPane layerTabs = new JTabbedPane();
private JPanel layerPanel = new JPanel();
// Types
private JScrollPane scrTypes = new JScrollPane();
private JTable tableTypes = new JTable();
private JPanel panelTypes = new JPanel();
private ImageTableModel typesModel = new ImageTableModel();
// Formations
private JScrollPane scrFormations = new JScrollPane();
private JTable tableFormations = new JTable();
private JPanel panelFormations = new JPanel();
private ImageTableModel formationsModel = new ImageTableModel();
// Adjustments
private JScrollPane scrAdjustments = new JScrollPane();
private JTable tableAdjustments = new JTable();
private JPanel panelAdjustments = new JPanel();
private ImageTableModel adjustmentsModel = new ImageTableModel();
// Alphanumerics
private JScrollPane scrAlphanumerics = new JScrollPane();
private JTable tableAlphanumerics = new JTable();
private JPanel panelAlphanumerics = new JPanel();
private ImageTableModel alphanumericsModel = new ImageTableModel();
// Special Modifiers
private JScrollPane scrSpecialModifiers = new JScrollPane();
private JTable tableSpecialModifiers = new JTable();
private JPanel panelSpecialModifiers = new JPanel();
private ImageTableModel specialModel = new ImageTableModel();
// Backgrounds
private JScrollPane scrBackgrounds = new JScrollPane();
private JTable tableBackgrounds = new JTable();
private JPanel panelBackgrounds = new JPanel();
private ImageTableModel backgroundsModel = new ImageTableModel();
// Logos
private JScrollPane scrLogos = new JScrollPane();
private JTable tableLogos = new JTable();
private JPanel panelLogos = new JPanel();
private ImageTableModel logosModel = new ImageTableModel();
// END: Layered Images Support
/** Creates new form ImageChoiceDialog */
public ImageChoiceDialog(Frame parent, boolean modal, String category, String file, DirectoryItems items) {
this(parent, modal, category, file, items, false);
}
/** Creates new form ImageChoiceDialog */
public ImageChoiceDialog(Frame parent, boolean modal, String category, String file, DirectoryItems items, boolean force) {
super(parent, modal);
this.category = category;
filename = file;
imagesMouseAdapter = new ImageTableMouseAdapter();
this.imageItems = items;
this.force = force;
// If we're doing forces, initialize the hashmap for use
if (force) {
iconMap = new LinkedHashMap<String, Vector<String>>();
}
initComponents();
fillTable((String) comboCategories.getSelectedItem());
int rowIndex = 0;
for(int i = 0; i < imageTableModel.getRowCount(); i++) {
if(((String) imageTableModel.getValueAt(i, 0)).equals(filename)) {
rowIndex = i;
break;
}
}
tableImages.setRowSelectionInterval(rowIndex, rowIndex);
setLocationRelativeTo(parent);
}
private void initComponents() {
GridBagConstraints gbc;
scrImages = new JScrollPane();
tableImages = new JTable();
comboCategories = new JComboBox<String>();
btnSelect = new JButton();
btnCancel = new JButton();
JPanel imagesPanel = new JPanel();
getContentPane().setLayout(new GridBagLayout());
ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.ImageChoiceDialog", new EncodeControl()); //$NON-NLS-1$
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setName("Form"); // NOI18N
setTitle(force ? resourceMap.getString("Force.title") : resourceMap.getString("Portrait.title"));
imagesPanel.setLayout(new GridBagLayout());
imagesPanel.setName(PANEL_IMAGES);
scrImages.setName("scrImages"); // NOI18N
tableImages.setModel(imageTableModel);
tableImages.setName("tableImages"); // NOI18N
tableImages.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableImages.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
// Clear selections on the layered tables
tableAdjustments.clearSelection();
tableAlphanumerics.clearSelection();
tableFormations.clearSelection();
tableSpecialModifiers.clearSelection();
tableBackgrounds.clearSelection();
tableLogos.clearSelection();
tableTypes.clearSelection();
}
});
tableImages.setRowHeight(76);
tableImages.getColumnModel().getColumn(0).setCellRenderer(imageTableModel.getRenderer());
tableImages.addMouseListener(imagesMouseAdapter);
scrImages.setViewportView(tableImages);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
imagesPanel.add(scrImages, gbc);
DefaultComboBoxModel<String> categoryModel = new DefaultComboBoxModel<String>();
String match = null;
categoryModel.addElement(Crew.ROOT_PORTRAIT);
if (imageItems != null) {
Iterator<String> names = imageItems.getCategoryNames();
while (names.hasNext()) {
String name = names.next();
if (!"".equals(name)) { //$NON-NLS-1$
categoryModel.addElement(name);
if(category.equals(name)) {
match = name;
}
}
}
}
if(null != match) {
categoryModel.setSelectedItem(match);
} else {
categoryModel.setSelectedItem(Crew.ROOT_PORTRAIT);
}
comboCategories.setModel(categoryModel);
comboCategories.setName("comboCategories"); // NOI18N
comboCategories.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent evt) {
comboCategoriesItemStateChanged(evt);
}
});
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weightx = 1.0;
imagesPanel.add(comboCategories, gbc);
if (force) {
// Background setup for the layered options
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
// Panel for Types
tableTypes.setModel(typesModel);
tableTypes.setName("tableTypes"); // NOI18N
tableTypes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableTypes.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableTypes.setRowHeight(76);
tableTypes.getColumnModel().getColumn(0).setCellRenderer(typesModel.getRenderer());
tableTypes.addMouseListener(new ImageTableMouseAdapter());
scrTypes.setViewportView(tableTypes);
panelTypes.add(scrTypes, gbc);
typesModel.reset();
typesModel.setCategory(IconPackage.FORCE_TYPE);
Iterator<String> imageNames = imageItems.getItemNames(IconPackage.FORCE_TYPE);
while (imageNames.hasNext()) {
typesModel.addImage(imageNames.next());
}
layerTabs.addTab(resourceMap.getString("Force.types"), panelTypes);
// Panel for Formations
tableFormations.setModel(formationsModel);
tableFormations.setName("tableFormations"); // NOI18N
tableFormations.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableFormations.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableFormations.setRowHeight(76);
tableFormations.getColumnModel().getColumn(0).setCellRenderer(formationsModel.getRenderer());
tableFormations.addMouseListener(new ImageTableMouseAdapter());
scrFormations.setViewportView(tableFormations);
panelFormations.add(scrFormations, gbc);
formationsModel.reset();
formationsModel.setCategory(IconPackage.FORCE_FORMATIONS);
Iterator<String> imageNamesTypes = imageItems.getItemNames(IconPackage.FORCE_FORMATIONS);
while (imageNamesTypes.hasNext()) {
formationsModel.addImage(imageNamesTypes.next());
}
layerTabs.addTab(resourceMap.getString("Force.formations"), panelFormations);
// Panel for Adjustments
tableAdjustments.setModel(adjustmentsModel);
tableAdjustments.setName("tableAdjustments"); // NOI18N
tableAdjustments.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
tableAdjustments.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableAdjustments.setRowHeight(76);
tableAdjustments.getColumnModel().getColumn(0).setCellRenderer(adjustmentsModel.getRenderer());
tableAdjustments.addMouseListener(new ImageTableMouseAdapter());
scrAdjustments.setViewportView(tableAdjustments);
panelAdjustments.add(scrAdjustments, gbc);
adjustmentsModel.reset();
adjustmentsModel.setCategory(IconPackage.FORCE_ADJUSTMENTS);
Iterator<String> imageNamesAdjustments = imageItems.getItemNames(IconPackage.FORCE_ADJUSTMENTS);
while (imageNamesAdjustments.hasNext()) {
adjustmentsModel.addImage(imageNamesAdjustments.next());
}
layerTabs.addTab(resourceMap.getString("Force.adjustments"), panelAdjustments);
// Panel for Alphanumerics
tableAlphanumerics.setModel(alphanumericsModel);
tableAlphanumerics.setName("tableAalphanumerics"); // NOI18N
tableAlphanumerics.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableAlphanumerics.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableAlphanumerics.setRowHeight(76);
tableAlphanumerics.getColumnModel().getColumn(0).setCellRenderer(alphanumericsModel.getRenderer());
tableAlphanumerics.addMouseListener(new ImageTableMouseAdapter());
scrAlphanumerics.setViewportView(tableAlphanumerics);
panelAlphanumerics.add(scrAlphanumerics, gbc);
alphanumericsModel.reset();
alphanumericsModel.setCategory(IconPackage.FORCE_ALPHANUMERICS);
Iterator<String> imageNamesAlphanumerics = imageItems.getItemNames(IconPackage.FORCE_ALPHANUMERICS);
while (imageNamesAlphanumerics.hasNext()) {
alphanumericsModel.addImage(imageNamesAlphanumerics.next());
}
layerTabs.addTab(resourceMap.getString("Force.alphanumerics"), panelAlphanumerics);
// Panel for SpecialModifiers
tableSpecialModifiers.setModel(specialModel);
tableSpecialModifiers.setName("tableSpecialModifiers"); // NOI18N
tableSpecialModifiers.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
tableSpecialModifiers.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableSpecialModifiers.setRowHeight(76);
tableSpecialModifiers.getColumnModel().getColumn(0).setCellRenderer(specialModel.getRenderer());
tableSpecialModifiers.addMouseListener(new ImageTableMouseAdapter());
scrSpecialModifiers.setViewportView(tableSpecialModifiers);
panelSpecialModifiers.add(scrSpecialModifiers, gbc);
specialModel.reset();
specialModel.setCategory(IconPackage.FORCE_SPECIAL_MODIFIERS);
Iterator<String> imageNamesSpecial = imageItems.getItemNames(IconPackage.FORCE_SPECIAL_MODIFIERS);
while (imageNamesSpecial.hasNext()) {
specialModel.addImage(imageNamesSpecial.next());
}
layerTabs.addTab(resourceMap.getString("Force.special"), panelSpecialModifiers);
// Panel for Backgrounds
tableBackgrounds.setModel(backgroundsModel);
tableBackgrounds.setName("tableBackgrounds"); // NOI18N
tableBackgrounds.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
tableBackgrounds.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableBackgrounds.setRowHeight(76);
tableBackgrounds.getColumnModel().getColumn(0).setCellRenderer(backgroundsModel.getRenderer());
tableBackgrounds.addMouseListener(new ImageTableMouseAdapter());
scrBackgrounds.setViewportView(tableBackgrounds);
panelBackgrounds.add(scrBackgrounds, gbc);
backgroundsModel.reset();
backgroundsModel.setCategory(IconPackage.FORCE_BACKGROUNDS);
Iterator<String> imageNamesBackgrounds = imageItems.getItemNames(IconPackage.FORCE_BACKGROUNDS);
while (imageNamesBackgrounds.hasNext()) {
backgroundsModel.addImage(imageNamesBackgrounds.next());
}
layerTabs.addTab(resourceMap.getString("Force.backgrounds"), panelBackgrounds);
// Panel for Logos
tableLogos.setModel(logosModel);
tableLogos.setName("tableLogos"); // NOI18N
tableLogos.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
tableLogos.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
refreshLayeredPreview();
}
});
tableLogos.setRowHeight(76);
tableLogos.getColumnModel().getColumn(0).setCellRenderer(logosModel.getRenderer());
tableLogos.addMouseListener(new ImageTableMouseAdapter());
scrLogos.setViewportView(tableLogos);
panelLogos.add(scrLogos, gbc);
logosModel.reset();
logosModel.setCategory(IconPackage.FORCE_LOGOS);
Iterator<String> imageNamesLogos = imageItems.getItemNames(IconPackage.FORCE_LOGOS);
while (imageNamesLogos.hasNext()) {
logosModel.addImage(imageNamesLogos.next());
}
layerTabs.addTab(resourceMap.getString("Force.logos"), panelLogos);
// Put it all together nice and pretty on the layerPanel
layerPanel.setLayout(new GridBagLayout());
layerPanel.add(layerTabs, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.SOUTH;
gbc.weighty = 0.0;
preview.setMaximumSize(new Dimension(Integer.MAX_VALUE, 225));
preview.setMinimumSize(new Dimension(300, 225));
layerPanel.add(preview, gbc);
layerPanel.setName(PANEL_LAYERED);
refreshLayeredPreview();
// Add single and layered options to the dialog
tabbedPane.addTab(resourceMap.getString("Force.single"), imagesPanel);
tabbedPane.addTab(resourceMap.getString("Force.layered"), layerPanel);
// Add the tabbed pane to the content pane
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
getContentPane().add(tabbedPane, gbc);
} else {
// Add the image panel to the content pane
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
getContentPane().add(imagesPanel, gbc);
}
btnSelect.setText(resourceMap.getString("btnSelect.text")); // NOI18N
btnSelect.setName("btnSelect"); // NOI18N
btnSelect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
btnSelectActionPerformed(evt);
}
});
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.weightx = 0.5;
getContentPane().add(btnSelect, gbc);
btnCancel.setText(resourceMap.getString("btnCancel.text")); // NOI18N
btnCancel.setName("btnCancel"); // NOI18N
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
btnCancelActionPerformed(evt);
}
});
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2;
gbc.weightx = 0.5;
getContentPane().add(btnCancel, gbc);
pack();
}
private void btnCancelActionPerformed(ActionEvent evt) {
setVisible(false);
}
private void btnSelectActionPerformed(ActionEvent evt) {
category = (null != tabbedPane.getSelectedComponent()) && PANEL_LAYERED.equals(tabbedPane.getSelectedComponent().getName())
? Force.ROOT_LAYERED : imageTableModel.getCategory();
if(tableImages.getSelectedRow() != -1) {
filename = (String) imageTableModel.getValueAt(tableImages.getSelectedRow(), 0);
} else {
filename = Crew.PORTRAIT_NONE;
}
changed = true;
setVisible(false);
}
/**
* @return the changed
*/
public boolean isChanged() {
return changed;
}
private void comboCategoriesItemStateChanged(ItemEvent evt) {
if (evt.getStateChange() == ItemEvent.SELECTED) {
fillTable((String) evt.getItem());
}
}//GEN-LAST:event_comboCategoriesItemStateChanged
public String getCategory() {
return category;
}
public String getFileName() {
return filename;
}
/**
* @return the iconMap
*/
public LinkedHashMap<String, Vector<String>> getIconMap() {
return iconMap;
}
/**
* @param iconMap the iconMap to set
*/
public void setIconMap(LinkedHashMap<String, Vector<String>> iconMap) {
this.iconMap = iconMap;
}
private void refreshLayeredPreview() {
// Add the image frame
iconMap.clear();
Vector<String> frameVector = new Vector<String>();
frameVector.add("Frame.png");
iconMap.put(IconPackage.FORCE_FRAME, frameVector);
// Check each table for what is, or is not, selected
Vector<String> tmp;
if (tableTypes.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_TYPE, iconMap.get(IconPackage.FORCE_TYPE));
} else {
tmp = new Vector<String>();
for (int index : tableTypes.getSelectedRows()) {
tmp.add((String) tableTypes.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_TYPE, tmp);
}
}
if (tableFormations.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_FORMATIONS, iconMap.get(IconPackage.FORCE_FORMATIONS));
} else {
tmp = new Vector<String>();
for (int index : tableFormations.getSelectedRows()) {
tmp.add((String) tableFormations.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_FORMATIONS, tmp);
}
}
if (tableAdjustments.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_ADJUSTMENTS, iconMap.get(IconPackage.FORCE_ADJUSTMENTS));
} else {
tmp = new Vector<String>();
for (int index : tableAdjustments.getSelectedRows()) {
tmp.add((String) tableAdjustments.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_ADJUSTMENTS, tmp);
}
}
if (tableAlphanumerics.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_ALPHANUMERICS, iconMap.get(IconPackage.FORCE_ALPHANUMERICS));
} else {
tmp = new Vector<String>();
for (int index : tableAlphanumerics.getSelectedRows()) {
tmp.add((String) tableAlphanumerics.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_ALPHANUMERICS, tmp);
}
}
if (tableSpecialModifiers.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_SPECIAL_MODIFIERS, iconMap.get(IconPackage.FORCE_SPECIAL_MODIFIERS));
} else {
tmp = new Vector<String>();
for (int index : tableSpecialModifiers.getSelectedRows()) {
tmp.add((String) tableSpecialModifiers.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_SPECIAL_MODIFIERS, tmp);
}
}
if (tableBackgrounds.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_BACKGROUNDS, iconMap.get(IconPackage.FORCE_BACKGROUNDS));
} else {
tmp = new Vector<String>();
for (int index : tableBackgrounds.getSelectedRows()) {
tmp.add((String) tableBackgrounds.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_BACKGROUNDS, tmp);
}
}
if (tableLogos.getSelectedRow() == -1) {
iconMap.remove(IconPackage.FORCE_LOGOS, iconMap.get(IconPackage.FORCE_LOGOS));
} else {
tmp = new Vector<String>();
for (int index : tableLogos.getSelectedRows()) {
tmp.add((String) tableLogos.getValueAt(index, 0));
iconMap.put(IconPackage.FORCE_LOGOS, tmp);
}
}
// Set the category to layered
category = Force.ROOT_LAYERED;
filename = Force.ICON_NONE;
// Build the layered image
Image forceImage = IconPackage.buildForceIcon(category, filename, imageItems, iconMap);
imageIcon = new ImageIcon(forceImage);
// Disable selection of a static icon
tableImages.clearSelection();
// Update the preview
if (null == imageIcon) {
preview.setText("");
}
preview.setIcon(imageIcon);
preview.validate();
}
private void fillTable(String category) {
imageTableModel.reset();
imageTableModel.setCategory(category);
// Translate the "root image" category name.
Iterator<String> imageNames;
if (Crew.ROOT_PORTRAIT.equals(category)) {
imageTableModel.addImage(Crew.PORTRAIT_NONE);
imageNames = imageItems.getItemNames(""); //$NON-NLS-1$
} else {
imageNames = imageItems.getItemNames(category);
}
// Get the image names for this category.
while (imageNames.hasNext()) {
imageTableModel.addImage(imageNames.next());
}
if(imageTableModel.getRowCount() > 0) {
tableImages.setRowSelectionInterval(0, 0);
}
}
/**
* A table model for displaying images
*/
public class ImageTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private String[] columnNames;
private String category;
private ArrayList<String> names;
private ArrayList<Image> images;
public ImageTableModel() {
columnNames = new String[] {"Images"};
category = Crew.ROOT_PORTRAIT;
names = new ArrayList<String>();
images = new ArrayList<Image>();
}
@Override
public int getRowCount() {
return names.size();
}
@Override
public int getColumnCount() {
return 1;
}
public void reset() {
category = Crew.ROOT_PORTRAIT;
names = new ArrayList<String>();
images = new ArrayList<Image>();
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Object getValueAt(int row, int col) {
return names.get(row);
}
public Object getImageAt(int row) {
return images.get(row);
}
public void setCategory(String c) {
category = c;
}
public String getCategory() {
return category;
}
public void addImage(String name) {
names.add(name);
fireTableDataChanged();
}
@Override
public Class<? extends Object> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
public ImageTableModel.Renderer getRenderer() {
return new ImageTableModel.Renderer(imageItems);
}
public class Renderer extends ImagePanel implements TableCellRenderer {
public Renderer(DirectoryItems images) {
super(images);
}
private static final long serialVersionUID = -6025788865509594987L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = this;
setOpaque(true);
String name = getValueAt(row, column).toString();
setText(getValueAt(row, column).toString());
setImage(category, name);
if(isSelected) {
setBackground(new Color(220,220,220));
} else {
setBackground(Color.WHITE);
}
return c;
}
}
}
public class ImageTableMouseAdapter extends MouseInputAdapter {
@Override
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
if (tableImages.equals(evt.getSource())) {
int row = tableImages.rowAtPoint(evt.getPoint());
if(row < imageTableModel.getRowCount()) {
category = imageTableModel.getCategory();
filename = (String) imageTableModel.getValueAt(row, 0);
setVisible(false);
}
}
}
}
}
public class ImagePanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = -3724175393116586310L;
private DirectoryItems items;
/** Creates new form ImagePanel */
public ImagePanel(DirectoryItems items) {
this.items = items;
initComponents();
}
private void initComponents() {
GridBagConstraints gbc;
lblImage = new JLabel();
setName("Form"); // NOI18N
setLayout(new GridBagLayout());
lblImage.setText(""); // NOI18N
lblImage.setName("lblImage"); // NOI18N
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
add(lblImage, gbc);
}// </editor-fold>//GEN-END:initComponents
public void setText(String text) {
lblImage.setText(text);
}
public void setImage(String category, String name) {
if (null == category
|| name.equals(Crew.PORTRAIT_NONE)) {
return;
}
// Try to get the image file.
try {
// Translate the root image directory name.
if (Crew.ROOT_PORTRAIT.equals(category))
category = ""; //$NON-NLS-1$
Image image = (Image) items.getItem(category, name);
if(null != image) {
if((null != category) && category.startsWith("Pieces/")) {
image = image.getScaledInstance(110, -1, Image.SCALE_SMOOTH);
} else {
image = image.getScaledInstance(-1, 76, Image.SCALE_SMOOTH);
}
}
lblImage.setIcon(new ImageIcon(image));
} catch (Exception err) {
err.printStackTrace();
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private JLabel lblImage;
// End of variables declaration//GEN-END:variables
}
}