package elevator;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
import javax.swing.plaf.basic.BasicArrowButton;
public class ElevFrame extends JFrame implements Runnable{
private static int floornum=12;
private static int elevnum=2;
private ElevThread[] elevthread;

Color pressedupdowncolor = Color.RED;
Color unpressedupdowncolor= Color.WHITE;

Container cp;
JPanel elevpanel = new JPanel();
JButton[] floorbtn;
BasicArrowButton[] upbtn;
BasicArrowButton[] downbtn;

JButton dispup;
JButton dispdown;
JButton dispfloor;

int[] upstat;
int[] downstat;

public ElevFrame()
{
cp = this.getContentPane();
cp.setLayout(new GridLayout(1,elevnum+1));

elevpanel.setLayout(new GridLayout(floornum+1,3));
elevpanel.setBorder(new MatteBorder(2,0,2,3,Color.WHITE));
floorbtn=new JButton[floornum];
upbtn=new BasicArrowButton[floornum];
downbtn=new BasicArrowButton[floornum];

dispfloor=new JButton("层");
dispfloor.setEnabled(false);
dispup = new JButton("上");
dispup.setEnabled(false);
dispdown = new JButton("下");
dispdown.setEnabled(false);
elevpanel.add(dispfloor);
elevpanel.add(dispup);
elevpanel.add(dispdown);

MouseListener uplistener = new UpButtonPressed();


for(int i=floorbtn.length-1; i>=0; i-- )
{
floorbtn[i] = new JButton(String.valueOf(i + 1));
//floorbtn[i].setForeground(Color.green);
floorbtn[i].setBackground(Color.GRAY);
floorbtn[i].setFont(new Font("Serif", Font.BOLD, 13));
floorbtn[i].setEnabled(false);
if(i!=floorbtn.length-1){
upbtn[i] = new BasicArrowButton(BasicArrowButton.NORTH);
upbtn[i].addMouseListener(uplistener);
upbtn[i].setBackground(unpressedupdowncolor);

}
else
{
upbtn[i] = new BasicArrowButton(BasicArrowButton.CENTER);
upbtn[i].addMouseListener(uplistener);
upbtn[i].setBackground(unpressedupdowncolor);
upbtn[i].setEnabled(false);
}
if(i!=0)
{
downbtn[i] = new BasicArrowButton(BasicArrowButton.SOUTH);
downbtn[i].addMouseListener(uplistener);
downbtn[i].setBackground(unpressedupdowncolor);

}
else
{
downbtn[i] = new BasicArrowButton(BasicArrowButton.CENTER);
downbtn[i].addMouseListener(uplistener);
downbtn[i].setBackground(unpressedupdowncolor);
downbtn[i].setEnabled(false);
}
elevpanel.add(floorbtn[i]);
elevpanel.add(upbtn[i]);
elevpanel.add(downbtn[i]);
}

cp.add(elevpanel);

elevthread = new ElevThread[elevnum];
for (int i = 0; i < elevnum; i++)
{
ElevThread elev = new ElevThread();
cp.add(elev);
elev.getThread().start();
elevthread[i] = elev;

}
upstat = new int[floornum];
downstat = new int[floornum];
for(int i=0; i<upstat.length; i++)
{
upstat[i]=0;
downstat[i]=0;
}

Thread mainthread=new Thread(this);
mainthread.start();

}
class UpButtonPressed extends MouseAdapter implements MouseListener
{
public void mousePressed(MouseEvent e)
{
for (int i = 0; i < upbtn.length; i++)
{
if (e.getSource() == upbtn[i])
{
if(i!=upbtn.length-1)
{
upbtn[i].setBackground(pressedupdowncolor);
upstat[i] = 1;
}
} if (e.getSource() == downbtn[i])
{
if(i!=0)
{
downbtn[i].setBackground(pressedupdowncolor);
downstat[i] = 1;
}
}
}
}
}



public static int getFloorNum()
{
return floornum;
}
public void run()
{
while (true)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
for (int i = 0; i < upstat.length; i++)
{
if (upstat[i] == 1)
{
upnearest(i);
}
if (upstat[i] >= 5)
{
if (i == elevthread[upstat[i] - 5].getnowpos())
{
upstat[i] = 0;
upbtn[i].setBackground(unpressedupdowncolor);

}
}
}
for (int i = 0; i < downstat.length; i++)
{
if (downstat[i] == 1)
{
downnearest(i);
}
if (downstat[i] >= 5)
{
if (i == elevthread[downstat[i] - 5].getnowpos())
{
downstat[i] = 0;
downbtn[i].setBackground(unpressedupdowncolor);
}
}
}
}
}

private boolean upnearest(int floor)
{
int whichElev = 0;
int distance = floornum; for (int j = 0; j < elevthread.length; j++)
{
if (elevthread[j].isStill()
|| (elevthread[j].isUp() && floor >= elevthread[j].getnowpos()))
{
int temp = Math.abs(floor - elevthread[j].getnowpos());
if (temp < distance)
{
whichElev = j;
distance = Math.abs(floor - elevthread[j].getnowpos());
}
}
}
if (distance != floornum)
{
upstat[floor] = 5 + whichElev;
elevthread[whichElev].setDesPos(floor);
return true;
} else
{
return false;
}
}


private boolean downnearest(int floor)
{
int whichElev = 0;
int distance = floornum; for (int j = 0; j < elevthread.length; j++)
{
if (elevthread[j].isStill()
|| (elevthread[j].isDown() && floor <= elevthread[j].getnowpos()))
{
int temp = Math.abs(floor - elevthread[j].getnowpos());
if (temp < distance)
{
whichElev = j;
distance = Math.abs(floor - elevthread[j].getnowpos());
}
}
} if (distance != floornum)
{
downstat[floor] = 5 + whichElev;
elevthread[whichElev].setDesPos(floor);
return true;
} else
{
return false;
} }
}