package com.timvisee.minecraftrunner.profile;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.timvisee.minecraftrunner.MinecraftRunner;
import com.timvisee.minecraftrunner.util.ListUtils;
public class ProfilesFrame extends JDialog {
private static final long serialVersionUID = -4911040003703939979L;
public static final String DIALOG_TITLE = "Manage Profiles";
private ProfileManager pm;
private JTable table;
private JButton createBtn;
private JButton editBtn;
private JButton moveUpBtn;
private JButton moveDownBtn;
private JButton delBtn;
/**
* Constructor
*/
public ProfilesFrame(JFrame owner, ProfileManager pm) {
// Construct super class
super(owner, DIALOG_TITLE, true);
// Store the profile manager instance
this.pm = pm;
// Buidl the UI
buildUI();
// Make the frame's location relative to the owner frame
setLocationRelativeTo(owner);
}
/**
* Build the frame UI
*/
public void buildUI() {
// Set the layout
setLayout(new BorderLayout(0, 0));
// Set some frame stuff
setResizable(false);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
// Set the icon of the frame
try {
InputStream in = MinecraftRunner.class.getResourceAsStream("/res/icon.png");
if(in != null)
setIconImage(ImageIO.read(in));
} catch (IOException e) { }
table = new JTable(new ProfileManagerTableModel(this.pm));
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.getTableHeader().setReorderingAllowed(false);
table.setShowGrid(false);
JScrollPane tablePane = new JScrollPane(table);
tablePane.setBackground(Color.WHITE);
tablePane.getViewport().setBackground(Color.WHITE);
tablePane.setPreferredSize(new Dimension(300, 400));
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
updateButtons();
}
});
/*DefaultListModel model = new DefaultListModel();
JList list = new JList(model);
model.addElement("test123");*/
// Create the main panel
JPanel mainPnl = new JPanel();
//mainPnl.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
//mainPnl.setLayout(new BoxLayout(mainPnl, BoxLayout.Y_AXIS));
mainPnl.setLayout(new FlowLayout(FlowLayout.LEFT, 8, 8));
mainPnl.add(tablePane);
mainPnl.add(getButtonsPanel());
//mainPnl.setPreferredSize(new Dimension(getWidth(), mainPnl.getPreferredSize().height));
add(mainPnl);
// Add some menu bar options on systems with a menu bar available
/*if(Platform.getPlatform().equals(Platform.MAC_OS_X)) {
MenuBar menuBar = new MenuBar();
Menu fileMenu = new Menu("File");
MenuItem prefsItem = new MenuItem("Preferences");
fileMenu.add(prefsItem);
Menu helpMenu = new Menu("Help");
MenuItem aboutItem = new MenuItem("About");
helpMenu.add(aboutItem);
menuBar.add(fileMenu);
menuBar.add(helpMenu);
setMenuBar(menuBar);
}*/
pack();
}
public JPanel getButtonsPanel() {
JPanel pnl = new JPanel();
pnl.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
JPanel btnsPanel = new JPanel();
btnsPanel.setLayout(new GridLayout(5, 1, 8, 8));
createBtn = new JButton("Create");
editBtn = new JButton("Edit");
moveUpBtn = new JButton("Move Up");
moveDownBtn = new JButton("Move Down");
delBtn = new JButton("Delete");
btnsPanel.add(createBtn);
btnsPanel.add(editBtn);
btnsPanel.add(moveUpBtn);
btnsPanel.add(moveDownBtn);
btnsPanel.add(delBtn);
// Update the buttons
updateButtons();
final ProfilesFrame instance = this;
createBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Show the profile creation window
JDialog createProfDialog = new CreateProfileFrame(instance, instance.pm);
createProfDialog.setVisible(true);
// Update the table
table.updateUI();
// Save the data
instance.pm.save();
}
});
editBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Make sure any row is selected
if(table.getSelectedRowCount() == 0)
return;
// Get the index of the selected row
int rowIndex = table.getSelectedRow();
// Make sure the default profile is not going to be edited
if(instance.pm.getProfileByIndex(rowIndex) instanceof DefaultProfile)
return;
// Get the selected player
Profile p = instance.pm.getProfileByIndex(rowIndex);
// Show the profile creation window
JDialog editProfDialog = new EditProfileFrame(instance, instance.pm, p);
editProfDialog.setVisible(true);
// Update the table
table.updateUI();
// Save the data
instance.pm.save();
}
});
moveUpBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Get the selected item and check if any item is selected
if(table.getSelectedRows().length <= 0)
return;
// Make sure the first selected item is not the first item in the list
if(table.getSelectedRow() <= 0)
return;
// Move each item one up
for(int i : table.getSelectedRows()) {
instance.pm.setProfiles(ListUtils.moveItemUp(instance.pm.getProfiles(), i));
}
// Set the selected rows
if(table.getSelectedRows()[0] != 0)
table.setRowSelectionInterval(table.getSelectedRows()[0] - 1, table.getSelectedRows()[table.getSelectedRows().length-1] - 1);
// Update the table
table.updateUI();
// Save the data
instance.pm.save();
}
});
moveDownBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Get the selected item and check if any item is selected
if(table.getSelectedRows().length <= 0)
return;
// Make sure the last selected item is not the last item in the list
if(table.getSelectedRows()[table.getSelectedRowCount() - 1] >= table.getRowCount() - 1)
return;
// Move each item one up
for(int i = table.getSelectedRows().length - 1; i >= 0; i--) {
instance.pm.setProfiles(ListUtils.moveItemDown(instance.pm.getProfiles(), table.getSelectedRows()[i]));
}
// Set the selected rows
if(table.getSelectedRows()[table.getSelectedRowCount() - 1] < table.getRowCount() - 1)
table.setRowSelectionInterval(table.getSelectedRows()[0] + 1, table.getSelectedRows()[table.getSelectedRowCount() - 1] + 1);
// Update the table
table.updateUI();
// Save the data
instance.pm.save();
}
});
delBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Get the selected item and check if any item is selected
int rowsIndex[] = table.getSelectedRows();
if(rowsIndex.length == 0)
return;
// Remove all selected rows
for(int i = rowsIndex.length - 1; i >= 0; i--) {
// Make sure the default profile is not going to be deleted
if(instance.pm.getProfileByIndex(rowsIndex[i]) instanceof DefaultProfile)
continue;
// Remove the row
instance.pm.removeProfileByIndex(rowsIndex[i]);
}
// Update the table and the buttons
table.updateUI();
updateButtons();
// Save the data
instance.pm.save();
}
});
pnl.add(btnsPanel);
pnl.setPreferredSize(new Dimension(btnsPanel.getPreferredSize().width, 400));
return pnl;
}
public void updateButtons() {
int rows[] = this.table.getSelectedRows();
if(rows.length == 0) {
editBtn.setEnabled(false);
delBtn.setEnabled(false);
moveUpBtn.setEnabled(false);
moveDownBtn.setEnabled(false);
} else if(rows.length == 1) {
final boolean defSelected = (this.pm.getProfileByIndex(rows[0]) instanceof DefaultProfile);
editBtn.setEnabled(!defSelected);
delBtn.setEnabled(!defSelected);
moveUpBtn.setEnabled(!(rows[0] <= 0));
moveDownBtn.setEnabled(!(rows[rows.length - 1] >= (this.table.getRowCount() - 1)));
} else {
boolean onlyDefSelected = true;
for(int i = 0; i < rows.length; i++) {
if(!(this.pm.getProfileByIndex(rows[i]) instanceof DefaultProfile)) {
onlyDefSelected = false;
break;
}
}
editBtn.setEnabled(false);
delBtn.setEnabled(!onlyDefSelected);
moveUpBtn.setEnabled(!(rows[0] <= 0));
moveDownBtn.setEnabled(!(rows[rows.length - 1] >= (this.table.getRowCount() - 1)));
}
}
}