package PaintPanel;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import Command.*;
import Shape.*;
public class PanelControler {
private int resize;
private GraphicPanel g;
private LinkedList<Command> cmds;
public int stackLocation=0;
public Point p[] = new Point[100];
public Point c[] = new Point[100];
private boolean isMultiSelected;
private static PanelControler ctrl=new PanelControler();
private PanelControler(){
cmds=new LinkedList<Command>();
g=GraphicPanel.getGraphicPanel();
}
public static PanelControler getControlPanel(){
return ctrl;
}
//设置是否已经选中几个图形
public void setIsMultiSelected(boolean b){
isMultiSelected=b;
}
//得到是否选中几个图形
public boolean getIsMultiSelected(){
return isMultiSelected;
}
public LinkedList<Command> getCommands(){
return cmds;
}
//计算鼠标点和图形最左边最上边的距离
public void distance(Point d,MyBound m){
for (int i=0;i < g.getShapes().size();i++) {
//list.get(i).setSelected(false);
PanelControler.getControlPanel().p[i] = new Point(g.getShapes().get(i).getX() - d.x,
g.getShapes().get(i).getY() - d.y);
g.getShapes().get(i).contains(d);
}
for(int i=0;i<g.getShapeContainer().size();i++){
//com.get(i).setChoosed(false);
PanelControler.getControlPanel().c[i] = new Point(g.getShapeContainer().get(i).getX() - d.x,
g.getShapeContainer().get(i).getY() - d.y);
g.getShapeContainer().get(i).contains(d);
}
g.repaint();
}
//设置鼠标形状并且得到鼠标所在选中框的位置,1为左上角,2为右上角,3为左下角,4为右下角,0为中间,-1为外面
public int getResize(Point p){
switch(g.getSelectBound().contains(p)){
case 1:g.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));return 1;
case 2:g.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR));return 2;
case 3:g.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR));return 3;
case 4:g.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));return 4;
case 0:g.setCursor(new Cursor(Cursor.MOVE_CURSOR));return 0;
//case -1:setCursor(new Cursor(Cursor.DEFAULT_CURSOR));return -1;
}
g.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
return -1;
}
//判断是否选中了一个图形或者一个组合
public boolean singleSelect(Point start){//选中一个图形或者一个组合的时候,鼠标画的框
boolean b=false;
for (int i=0;i < g.getShapeContainer().size();i++) {
g.getShapeContainer().get(i).setChoosed(false);
g.getShapeContainer().get(i).contains(start);
if(g.getShapeContainer().get(i).getChoosed()){
//com.get(i).contains(start);
//com.get(i).setChoosed(true);
g.setSelectBound(g.getShapeContainer().get(i).getBound());
//bounds.add(b);
b=true;
}
}
for (int i=0;i < g.getShapes().size();i++) {
g.getShapes().get(i).setSelected(false);
g.getShapes().get(i).contains(start);
if(g.getShapes().get(i).getSelected()){
//list.get(i).contains(start);
//list.get(i).setSelected(true);
g.setSelectBound(g.getShapes().get(i).getBound());
//bounds.add(b);
b=true;
}
}
if(!b) g.setSelectBound(null);
return b;
}
//判断是否选中了多个图形
public boolean multiSelect(Point start){//选中多个图形时候,鼠标画的框
int bool=0;
//mb=new MyBound(start.getX(),start.getY(),end.getX()-start.getX(),end.getY()-start.getY());
/*for (int i=0;i != com.size();i++) {
com.get(i).setChoosed((0<=mb.contains(com.get(i).getX()+com.get(i).getWidth()/2, com.get(i).getY()+com.get(i).getHeight()/2)));
if(com.get(i).getChoosed()){
System.out.print("multi中的组合选中时");
MyBound b=new MyBound(com.get(i).getX(),com.get(i).getY(),com.get(i).getWidth(),com.get(i).getHeight());
//bounds.add(b);
return true;
}
}*/
if(g.getSelectBound()==null) return false;
else
for (int i=0;i != g.getShapes().size();i++) {
g.getShapes().get(i).setSelected((0<=g.getSelectBound().contains(new Point(g.getShapes().get(i).getX()+g.getShapes().get(i).getWidth()/2, g.getShapes().get(i).getY()+g.getShapes().get(i).getHeight()/2))));
if(g.getShapes().get(i).getSelected()){
bool++;
//mb=new MyBound(list.get(i).getX(),list.get(i).getY(),list.get(i).getWidth(),list.get(i).getHeight());
}
}
if(bool>=2){setIsMultiSelected(true);}
return (bool>=2);
}
//改变形状大小
void resizeShape(Point p,int direction){
//g.setSelectBound(null);
for (int i=0,j=0;i != g.getShapes().size();i++,j++) {
if (g.getShapes().get(i).getSelected()){
//Command cmd=new ResizeCommand(g.getShapes(),i,p,direction);
MyShape s=g.getShapes().get(i);
s.resize(p,direction);
resize=getResize(p);
((ResizeCommand)cmds.getLast()).setEnd(p);
g.setSelectBound(s.getBound());
//g.getShapeContainer().get(j).resize(p,direction);
}
}
}
void setLocation(Point end){
LinkedList<MyShape>list=g.getShapes();
LinkedList<MyShapeContainer> com=g.getShapeContainer();
for (int i=0;i != list.size();i++) {
if (list.get(i).getSelected()){
((MoveCommand)cmds.getLast()).setEnd(end);
list.get(i).move(p[i].x + end.x, p[i].y + end.y);
g.setSelectBound(list.get(i).getBound());
break;
}
}
for (int j=0;j != com.size();j++) {
if (com.get(j).getChoosed()){
((MoveCommand)cmds.getLast()).setEnd(end);
com.get(j).move(end.x+c[j].x,end.y+c[j].y);
g.setSelectBound(com.get(j).getBound());
break;
}
}
//repaint();
}
public void changeColor(Color co){
g.changeColor(co);
}
int controlMove(Point start,GraphicPanel g){
if(g.getSelectBound()!=null)//如果有框,那么要么移动要么改变大小
resize=getResize(start);
else //如果有框,鼠标不在框内,或者没有框,就是取消选中,重新画框
resize=-1;
System.out.println(resize);
return resize;
}
public void controlCompose(LinkedList<MyShape> list){
MyShapeContainer container=null;
for (int i=0;i < g.getShapeContainer().size();i++) {//如果选中的框中间有组合的话,那么就把其他的图形加进去
if(g.getShapeContainer().get(i).getChoosed()){
container=g.getShapeContainer().get(i);
break;
}
}
if(container==null)
container=new MyShapeContainer();
for (int i=0;i < list.size();i++) {
container.addShape(list.get(i));
}
g.getShapeContainer().add(container);
System.out.println("之后container大小"+g.getShapeContainer().size());
container.setChoosed(true);
//g.setSelectBound(container.getBound());
//g.repaint();
}
public void controlSeperate(){
int i=0;
LinkedList<MyShapeContainer> com=g.getShapeContainer();
if(com.size()==0) return;//如果没有组合,就不存在分解,直接返回什么都不做
for(i=0;i!=com.size();i++)
if(com.get(i).getChoosed()) break;
if(i==com.size()) i--;
for (int j=0;j != com.get(i).size();j++) {
g.getShapes().add(com.get(i).get(j));
}
g.setSelectBound(g.getShapes().getLast().getBound());
com.remove(i);
}
}
评论0