codice:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
import java.util.ArrayList;
public class MiddlePanel extends JPanel implements MouseListener,MouseMotionListener{
int x0,y0,startx0,starty0,x,y,
preferedWidth = getWidth(),
preferedHeight = getHeight();
boolean out, //Indica se il cursore è fuori dalla finestra
drag, //Indica se il cursore è trascinato
butgateact, //Indica se è stato attivato un pulsante porta della toolbar
butlineact, //Indica se è stato attivato il pulsante linea nella toolbar
ok = false; //booleano ausiliare per verificare se sono stati fatti due click per diseganre una LineShape
JGatePanel ctmp;
Image imggatetmp;
MyShape shapetmp;
InputShape inputtmp;
private Point corner1 = new Point(0,0);
private Point corner2 = new Point(0,0);
ArrayList<JGatePanel> gate = new ArrayList();
ArrayList<MyShape> shapes = new ArrayList();
ArrayList<InputShape> inputshape = new ArrayList();
ArrayList<OutputShape> outputshape = new ArrayList();
public MiddlePanel(){
LayoutManager overlay = new OverlayLayout(this) {
@Override
public void layoutContainer(Container target) {
int nChildren = target.getComponentCount();
for (int i = 0; i < nChildren; i++){
Component c = target.getComponent(i);
c.setBounds(c.getLocation().x, c.getLocation().y,
c.getPreferredSize().width, c.getPreferredSize().height);
}
}
};
setMaximumSize(new Dimension(800,600));
setLayout(overlay);
addMouseListener(this);
addMouseMotionListener(this);
setBackground(Color.white);
// setAutoscrolls(true); //Studiare questo metodo per fare l'autoscroll
}
//Un metodo che restituisce se non c'è il rischio di sovrappore i componenti figlio
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
//Metodo che viene chiamato con il repaint();
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.LIGHT_GRAY);
paintGateTmp(g);
paintGrid(g);
refreshShapes((Graphics2D)g);
paintLineTmp(g);
//paintSelection(g);
}
//Serve per disegnare una Shape qualsiasi sul pannello
public void paintShape(Graphics g,MyShape s){
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.draw(s.getShape());
}
//Serve per creare un rettangolo per selezionare i componenti
public void paintSelection(Graphics g){
int x = Math.min(corner1.x,corner2.x);
int y = Math.min(corner1.y,corner2.y);
int width = Math.abs(corner1.x - corner2.x);
int height = Math.abs(corner1.y - corner2.y);
g.setColor(Color.CYAN);
g.drawRect(x, y, width, height);
g.setColor(Color.BLUE);
g.fillRect(x+1, y+1, width-1, height-1);
}
public void paintLineTmp(Graphics g){
if(inputtmp!=null && butlineact){
g.setColor(Color.black);
g.drawLine(inputtmp.end.x,inputtmp.end.y,x0,y0);
}
}
//Disegna la porta
public void paintGateTmp(Graphics g){
if(butgateact){
g.drawImage(imggatetmp,x0-24,y0-24,this);
g.setColor(Color.DARK_GRAY); //Cambia il colore della griglia momentaneamente
}
}
//Disegna la griglia
public void paintGrid(Graphics g){
for(int i=0; i<getWidth() || i<getHeight(); i+=20) {
g.drawLine(i,0,i,getHeight());
g.drawLine(0,i,getWidth(),i);
}
}
//Crea una porta passando l'immagine temporanea utilizzata, la posizione del mouse, è una costante passata dal core (Da sistemare)
public JGatePanel createGate(MouseEvent e){
JGatePanel Jglbl = new JGatePanel(imggatetmp,e,0);
refresh(Jglbl,e);
add(Jglbl);
return Jglbl;
}
//Refrescia quando l'oggetto è una JGateLabel (o un LineShape)
public void refresh(JGatePanel j,MouseEvent e){
refreshGrid(j);
moveScroolBar(e.getPoint(),j);
refreshShapes((Graphics2D)getGraphics());
revalidate();
repaint();
}
//Refreshia tutto il middlepanel chiamandosi in cascata tutti i metodi che permettono il refresh totale del panel
public void refresh(){
refreshShapes((Graphics2D)getGraphics());
revalidate();
repaint();
}
//Si visita tutta lista contenente tutti le Shape
public void refreshShapes(Graphics2D g2){
for(int i=0;i<shapes.size();i++){
g2.setColor(Color.black);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.draw(shapes.get(i).getShape());
}
for(int i=0;i<inputshape.size();i++){
g2.setColor(Color.black);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.fill(inputshape.get(i).getShape());
}
}
//Muove la scroll bar solo se il cursore è fuori dal Frame
public void moveScroolBar(Point p,JGatePanel c){
if(!LCE01.Grafica.Split.onScreen(c) && LCE01.Grafica.Split.MP.out){
LCE01.Grafica.Split.mySetJViewport(this,MouseInfo.getPointerInfo().getLocation(),c);
}
}
//Aggiorna la griglia, estendola (farla ridurre se necessario da sistemare)
public void refreshGrid(JGatePanel j){
if((j.getX()+j.getWidth())>preferedWidth) preferedWidth = j.getX()+j.getWidth();
if((j.getY()+j.getHeight()>preferedHeight)) preferedHeight = j.getY()+j.getHeight();
setPreferredSize(new Dimension(preferedWidth,preferedHeight));
}
//Si potrebbe creare una lista di coordianate x e y di ogni label in ordine decrescente così da evitare di fare una ricerca su tutti i componenti
public Dimension searchSizeGrid(){
int x = getWidth();
int y = getHeight();
for(int i=0;i<gate.size();i++){
if(x<gate.get(i).getX())
x = gate.get(i).getX();
if(y<gate.get(i).getY())
y = gate.get(i).getY();
}
return new Dimension(x,y);
}
//Vede se nel punto cliccato c'è un input e nel caso memorizza il reference
public InputShape searchInput(Point p){
for(int i=0;i<inputshape.size();i++)
if(inputshape.get(i).getShape().contains(p)){
return inputshape.get(i);
}
return null;
}
public void colleague(Point p){
shapes.add(new LineShape(inputtmp.end,p));
shapetmp = shapes.get(shapes.size()-1);
inputtmp = null;
butlineact = false;
ctmp = null;
}
@Override
public void mouseClicked(MouseEvent e) {
if(butlineact)
inputtmp = searchInput(e.getPoint());
if(butgateact){
gate.add(createGate(e));
}
drag = false;
startx0 = 0;
starty0 = 0;
butgateact = false;
imggatetmp = null;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
corner1 = e.getPoint();
corner2 = corner1;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
corner1 = e.getPoint();
corner2 = corner1;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
out = false;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
out = true;
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
corner2 = e.getPoint();
drag = true;
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
x0 = e.getX();
y0 = e.getY();
drag = false;
System.out.println(hasFocus());
repaint();
}
public void setImageGateTmp(Image i){
setCursor(new Cursor(Cursor.MOVE_CURSOR));
imggatetmp = i;
butgateact = true;
}
//Setta il numero di input, il metodo viene chiamato dal ChangeListener degli JSpinner del SouthPanel
public void setInputShape(int n){
if(n>=inputshape.size())
for(int i=inputshape.size();i<n;i++)
inputshape.add(new InputShape(i*40+30));
else
for(int i=inputshape.size()-1;i>=n;i--)
inputshape.remove(i);
refresh();
}
//Sistemare
public void setOutputShape(int n){
}
}