/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.client.ui.campaignproperties;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.jidesoft.grid.TreeTable;
import com.jidesoft.swing.JideScrollPane;
import com.t3.client.swing.AbeillePanel;
import com.t3.model.campaign.Campaign;
import com.t3.model.campaign.CampaignProperties;
import com.t3.model.campaign.TokenProperty;
public class TokenPropertiesManagementPanel extends AbeillePanel<CampaignProperties> {
private Map<String, List<TokenProperty>> tokenTypeMap;
private String editingType;
private TreeTable tokenPropertiesTable;
private PropertyTypesTableModel tokenPropertiesTableModel;
public TokenPropertiesManagementPanel() {
super("com/t3/client/ui/forms/tokenPropertiesManagementPanel.xml");
panelInit();
}
public void copyCampaignToUI(CampaignProperties campaignProperties) {
tokenTypeMap = new HashMap<String, List<TokenProperty>>(campaignProperties.getTokenTypeMap());
updateTypeList();
}
public void copyUIToCampaign(Campaign campaign) {
campaign.getTokenTypeMap().clear();
campaign.getTokenTypeMap().putAll(tokenTypeMap);
}
public JList<String> getTokenTypeList() {
JList<String> list = (JList<String>) getComponent("tokenTypeList");
if (list == null)
{
list = new JList<String>();
}
return list;
}
public JTextField getTokenTypeName() {
return (JTextField) getComponent("tokenTypeName");
}
public JButton getNewButton() {
return (JButton) getComponent("newButton");
}
public JButton getUpdateButton() {
return (JButton) getComponent("updateButton");
}
public JButton getRevertButton() {
return (JButton) getComponent("revertButton");
}
public void initTokenProperties() {
tokenPropertiesTableModel=new PropertyTypesTableModel(null);
tokenPropertiesTable = new TreeTable(tokenPropertiesTableModel);
tokenPropertiesTable.setFillsViewportHeight(true); // XXX This is Java6-only -- need Java5 solution
tokenPropertiesTable.setName("propertiesTable");
tokenPropertiesTable.setColumnResizable(false);
//tokenPropertiesTable.set
//TableScrollPane sp = new TableScrollPane();
//sp.add(tokenPropertiesTable);
replaceComponent("propertiesPanel", "tokenProperties", new JideScrollPane(tokenPropertiesTable));
}
public void initUpdateButton() {
getUpdateButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
update();
}
});
}
public void initNewButton() {
getNewButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// This will force a reset
getTokenTypeList().getSelectionModel().clearSelection();
reset();
}
});
}
});
}
public void initAddRowButton() {
((JButton)getComponent("addRowButton")).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(tokenPropertiesTableModel!=null)
tokenPropertiesTableModel.addRow(new PropertyTypeRow(new TokenProperty()));
}
});
}
public void initRevertButton() {
getRevertButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bind(editingType);
}
});
}
public void initTypeList() {
getTokenTypeList().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
if (getTokenTypeList().getSelectedValue() == null) {
reset();
} else {
bind(getTokenTypeList().getSelectedValue());
}
}
});
getTokenTypeList().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
private void bind(String type) {
editingType = type;
getTokenTypeName().setText(type != null ? type : "");
getTokenTypeName().setEditable(!CampaignProperties.DEFAULT_TOKEN_PROPERTY_TYPE.equals(type));
tokenPropertiesTableModel=new PropertyTypesTableModel(tokenTypeMap.get(type));
tokenPropertiesTable.setModel(tokenPropertiesTableModel);
}
private void update() {
// Pull the old one out and put the new one in (rename)
try {
List<TokenProperty> current=new ArrayList<TokenProperty>();
for(PropertyTypeRow r:tokenPropertiesTableModel.getRows())
if(r.getProperty().getName()!=null && !r.getProperty().getName().isEmpty())
current.add(r.getProperty());
tokenTypeMap.remove(editingType);
tokenTypeMap.put(getTokenTypeName().getText().trim(), current);
reset();
updateTypeList();
} catch (IllegalArgumentException e) {
// Don't need to do anything here...
}
}
private void reset() {
bind((String)null);
}
private void updateTypeList() {
getTokenTypeList().setModel(new TypeListModel());
}
private class TypeListModel extends AbstractListModel<String> {
private ArrayList<String> names;
public TypeListModel() {
names = new ArrayList<String>(tokenTypeMap.keySet());
Collections.sort(names);
}
@Override
public String getElementAt(int index) {
return names.get(index);
}
@Override
public int getSize() {
return tokenTypeMap.size();
}
}
}