import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.LineBorder;
import java.util.HashMap;
public class ListShip2 extends JPanel {
private JList listStart, listShip, listDest;
private MyListModel modelStart, modelShip, modelDest;
private JButton sToShip, shipToS, shipToD, dToShip;
private static final String addString = "Add";
private static final String removeString = "Remove";
private static Object[] result;
private static final String prefix = "Status :";
private JLabel message;
private String manOne, manTwo, manThree, womanOne, womanTwo, womanThree;
public ListShip2() {
super(new BorderLayout());
manOne = "man-Sugit";
manTwo = "man-Lee";
manThree = "man-Jagger";
womanOne = "woman-Pink";
womanTwo = "woman-Ann";
womanThree = "woman-Poona";
modelStart = new MyListModel();
modelStart.addElement(manOne);
modelStart.addElement(womanOne);
modelStart.addElement(manTwo);
modelStart.addElement(womanTwo);
modelStart.addElement(manThree);
modelStart.addElement(womanThree);
modelStart.addListDataListener(new MyListDataListener());
modelShip = new MyListModel();
modelShip.addListDataListener(new MyListDataListener());
modelDest = new MyListModel();
modelDest.addListDataListener(new MyListDataListener());
listStart = new JList(modelStart);
listStart
.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
listStart.setSelectedIndex(0);
listStart.addListSelectionListener(new MyListSelectionListener());
listStart.setFixedCellWidth(100);
listStart.setFixedCellHeight(15);
listStart.setCellRenderer(new MyCellRenderer());
JScrollPane listStartScrollPane = new JScrollPane(listStart);
listShip = new JList(modelShip);
listShip
.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
listShip.addListSelectionListener(new MyListSelectionListener());
listShip.setFixedCellWidth(100);
listShip.setFixedCellHeight(15);
listShip.setCellRenderer(new MyCellRenderer());
listShip.setBorder(new LineBorder(Color.BLUE, 1));
JScrollPane listShipScrollPane = new JScrollPane(listShip);
listDest = new JList(modelDest);
listDest
.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
listDest.addListSelectionListener(new MyListSelectionListener());
listDest.setFixedCellWidth(100);
listDest.setFixedCellHeight(15);
listDest.setCellRenderer(new MyCellRenderer());
JScrollPane listDestScrollPane = new JScrollPane(listDest);
sToShip = new JButton("Start to Ship->");
sToShip.setActionCommand(addString);
sToShip.addActionListener(new AddButtonListener());
shipToS = new JButton("<-Ship to Start");
shipToS.setEnabled(false);
shipToS.setActionCommand(removeString);
shipToS.addActionListener(new RemoveButtonListener());
shipToD = new JButton("Ship to Dest->");
shipToD.setEnabled(false);
shipToD.setActionCommand(removeString);
shipToD.addActionListener(new RemoveButtonListener());
dToShip = new JButton("<-Dest to Ship");
dToShip.setEnabled(false);
dToShip.setActionCommand(addString);
dToShip.addActionListener(new AddButtonListener());
message = new JLabel(prefix);
JPanel mPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
mPanel.add(message);
JPanel buttonPane1 = new JPanel(new GridLayout(2, 1));
buttonPane1.add(sToShip);
buttonPane1.add(shipToS);
JPanel buttonPane2 = new JPanel(new GridLayout(2, 1));
buttonPane2.add(dToShip);
buttonPane2.add(shipToD);
JPanel bigPane = new JPanel();
bigPane.add(listStartScrollPane);
bigPane.add(buttonPane1);
bigPane.add(listShipScrollPane);
bigPane.add(buttonPane2);
bigPane.add(listDestScrollPane);
add(bigPane, BorderLayout.CENTER);
add(mPanel, BorderLayout.PAGE_END);
}
class MyCellRenderer extends DefaultListCellRenderer {
public MyCellRenderer() {
setOpaque(true);
}
private HashMap theChosen = new HashMap();
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
if (isSelected) {
theChosen.put(value, "chosen");
} else {
theChosen.remove(value);
}
setBackground(Color.white);
if (theChosen.containsKey(value)) {
setForeground(Color.red);
} else {
setForeground(Color.blue);
}
return this;
}
}
class MyListDataListener implements ListDataListener {
Object[] options = { "Yes again", "No I'm tired" };
public void contentsChanged(ListDataEvent e) {
}
public void intervalAdded(ListDataEvent e) {
MyListModel lm = (MyListModel) e.getSource();
if (lm == modelStart) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkStart()) {
showWarning(listStart);
message.setText(prefix + "Break the rules on Start");
}
}
} else if (lm == modelShip) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkShip()) {
showWarning(listShip);
message.setText(prefix + "Break the rules on Ship");
}
}
if (modelShip.getSize() > 2) {
showWarning(listShip);
message.setText(prefix + "Ship can't load over 2 guys");
}
} else if (lm == modelDest) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkDest()) {
showWarning(listDest);
message.setText(prefix + "Break the rules on Dest");
}
}
if (endsCondition()) {
int way = JOptionPane.showOptionDialog(ListShip2.this,
"Congratulation, You win!", "End of game",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (way == JOptionPane.YES_OPTION) {
modelDest.clear();
modelStart.addElement(manOne);
modelStart.addElement(womanOne);
modelStart.addElement(manTwo);
modelStart.addElement(womanTwo);
modelStart.addElement(manThree);
modelStart.addElement(womanThree);
shipToD.setEnabled(false);
sToShip.setEnabled(true);
dToShip.setEnabled(false);
revalidate();
repaint();
} else if (way == JOptionPane.NO_OPTION) {
System.exit(0);
}
}
}
}
public void intervalRemoved(ListDataEvent e) {
MyListModel lm = (MyListModel) e.getSource();
if (lm == modelStart) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkStart()) {
showWarning(listStart);
message.setText(prefix + "Break the rules on Start");
}
}
} else if (lm == modelShip) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkShip()) {
showWarning(listShip);
message.setText(prefix + "Break the rules on Ship");
}else{
flowWarning(listShip);
}
}
} else if (lm == modelDest) {
if (checkLand()) {
message.setText(prefix + "look good");
showPeaceful();
} else {
if (!checkDest()) {
showWarning(listDest);
message.setText(prefix + "Break the rules on Dest");
}
}
}
}
}
private boolean endsCondition() {
boolean ends = false;
if (modelDest.size() == 6) {
ends = true;
}
return ends;
}
private void flowWarning(JList list) {
list.setBorder(new LineBorder(Color.BLUE, 1));
}
private void showPeaceful() {
listStart.setBorder(new LineBorder(Color.BLUE, 1));
listShip.setBorder(new LineBorder(Color.BLUE, 1));
listDest.setBorder(new LineBorder(Color.BLUE, 1));
}
private void showWarning(JList list) {
Toolkit.getDefaultToolkit().beep();
list.setBorder(new LineBorder(Color.RED, 1));
}
class MyListSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
JComponent comp = (JComponent) e.getSource();
if (comp == listStart) {
if (!getSelectionList(e, listStart))
Toolkit.getDefaultToolkit().beep();
} else if (comp == listShip) {
if (!getSelectionList(e, listShip))
Toolkit.getDefaultToolkit().beep();
} else if (comp == listDest) {
if (!getSelectionList(e, listDest))
Toolkit.getDefaultToolkit().beep();
}
}
}
private boolean getSelectionList(ListSelectionEvent e, JList list) {
ListSelectionModel lsm = list.getSelectionModel();
boolean selectOK = false;
int firstSelected = lsm.getMinSelectionIndex();
int lastSelected = lsm.getMaxSelectionIndex();
if ((lastSelected - firstSelected)<=1) {
message.setText(prefix + "Select at most 2 guys");
selectOK = true;
}else if(((lastSelected - firstSelected) > 1)){
if (((list.isSelectedIndex(firstSelected+1))&&
(lastSelected!=(firstSelected+1))) ||
((list.isSelectedIndex(firstSelected+2))&&
(lastSelected!=(firstSelected+2))) ){
message.setText(prefix + "Cant select over 2 guys");
selectOK = false;
}else if(((list.isSelectedIndex(lastSelected-1))&&
(firstSelected!=(lastSelected-1))) ||
((list.isSelectedIndex(firstSelected-2))&&
(firstSelected!=(lastSelected-2))) ){
message.setText(prefix + "Cant select over 2 guys");
selectOK = false;
} else {
message.setText(prefix + "Select at most 2 guys");
selectOK = true;
}
}
return selectOK;
}
class AddButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JComponent comp = (JComponent) e.getSource();
if (comp == sToShip) {
result = listStart.getSelectedValues();
modelStart.removeArrayElement(result);
modelShip.addArrayElement(result);
if (checkLand()) {
sToShip.setEnabled(false);
shipToD.setEnabled(true);
} else {
shipToS.setEnabled(true);
}
} else if (comp == dToShip) {
result = listDest.getSelectedValues();
modelDest.removeArrayElement(result);
modelShip.addArrayElement(result);
if (checkLand()) {
dToShip.setEnabled(false);
shipToS.setEnabled(true);
} else {
shipToD.setEnabled(true);
}
}
}
}
class RemoveButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JComponent comp = (JComponent) e.getSource();
if (comp == shipToS) {
result = listShip.getSelectedValues();
modelShip.removeArrayElement(result);
modelStart.addArrayElement(result);
shipToD.setEnabled(false);
sToShip.setEnabled(true);
if (modelShip.size() == 0) {
shipToS.setEnabled(false);
}
} else if (comp == shipToD) {
result = listShip.getSelectedValues();
modelShip.removeArrayElement(result);
modelDest.addArrayElement(result);
shipToS.setEnabled(false);
dToShip.setEnabled(true);
if (modelShip.size() == 0) {
shipToD.setEnabled(false);
}
}
}
}
private boolean checkLand() {
return checkStart() && checkDest() && checkShip();
}
private boolean checkStart() {
boolean nbeep = true;
if ((modelStart.contains(womanOne) && (modelStart.contains(manTwo) || (modelStart
.contains(manThree))))
&& (!modelStart.contains(manOne))) {
nbeep = false;
}
if ((modelStart.contains(womanTwo) && (modelStart.contains(manOne) || (modelStart
.contains(manThree))))
&& (!modelStart.contains(manTwo))) {
nbeep = false;
}
if ((modelStart.contains(womanThree) && (modelStart.contains(manOne) || (modelStart
.contains(manTwo))))
&& (!modelStart.contains(manThree))) {
nbeep = false;
}
return nbeep;
}
private boolean checkShip() {
boolean nbeep = true;
if ((modelDest.contains(womanOne) && (modelDest.contains(manTwo) || (modelDest
.contains(manThree))))
&& (!modelDest.contains(manOne))) {
nbeep = false;
}
if ((modelDest.contains(womanTwo) && (modelDest.contains(manOne) || (modelDest
.contains(manThree))))
&& (!modelDest.contains(manTwo))) {
nbeep = false;
}
if ((modelDest.contains(womanThree) && (modelDest.contains(manOne) || (modelDest
.contains(manTwo))))
&& (!modelDest.contains(manThree))) {
nbeep = false;
}
return nbeep;
}
private boolean checkDest() {
boolean nbeep = true;
if ((modelDest.contains(womanOne) && (modelDest.contains(manTwo) || (modelDest
.contains(manThree))))
&& (!modelDest.contains(manOne))) {
nbeep = false;
}
if ((modelDest.contains(womanTwo) && (modelDest.contains(manOne) || (modelDest
.contains(manThree))))
&& (!modelDest.contains(manTwo))) {
nbeep = false;
}
if ((modelDest.contains(womanThree) && (modelDest.contains(manOne) || (modelDest
.contains(manTwo))))
&& (!modelDest.contains(manThree))) {
nbeep = false;
}
return nbeep;
}
class MyListModel extends DefaultListModel {
public void removeArrayElement(Object[] temp) {
for (int i = 0; i < temp.length; i++) {
if (temp[i] != null) {
removeElement(temp[i]);
}
}
}
public void addArrayElement(Object[] temp) {
for (int i = 0; i < temp.length; i++) {
if (temp[i] != null) {
addElement(temp[i]);
}
}
}
}
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("ListShip");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
JComponent newContentPane = new ListShip2();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Don't let the content pane get too small.
// (Works if the Java look and feel provides
// the window decorations.)
newContentPane.setMinimumSize(new Dimension(newContentPane
.getPreferredSize().width, 100));
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}












