/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.applets.schema2.gui.canvas; import hr.fer.zemris.vhdllab.applets.editor.schema2.constants.Constants; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ICommand; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ICommandResponse; import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaController; import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.Caseless; import hr.fer.zemris.vhdllab.applets.editor.schema2.model.commands.AddWireCommand; import hr.fer.zemris.vhdllab.applets.editor.schema2.model.commands.BindWireCommand; import hr.fer.zemris.vhdllab.applets.editor.schema2.model.commands.ExpandWireCommand; import hr.fer.zemris.vhdllab.applets.editor.schema2.model.commands.PlugWireCommand; import java.awt.Graphics2D; public class WirePreLocator implements IWirePreLocator { public static int HORIZ_FIRST = 0; public static int VERT_FIRST = 1; private int x1; private int y1; private int x2; private int y2; private int orientation; private int devition1; private int deviation2; private boolean wireInstantiable = true; public WirePreLocator(int x1, int y1, int x2, int y2, int orientation, int odm1, int odm2) { this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; this.devition1 = odm1; this.deviation2 = odm2; this.orientation = orientation; } public WirePreLocator() { this(0,0,0,0,0,0,0); } public WirePreLocator(int x1, int y1, int x2, int y2){ this(x1,y1,x2,y2,0,0,0); } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getOdmak1() */ public int getOdmak1() { return devition1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setOdmak1(int) */ public void setOdmak1(int odmak1) { this.devition1 = odmak1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getOdmak2() */ public int getOdmak2() { return deviation2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setOdmak2(int) */ public void setOdmak2(int odmak2) { this.deviation2 = odmak2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getOrientation() */ public int getOrientation() { return orientation; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setOrientation(int) */ public void setOrientation(int orientation) { this.orientation = orientation; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getX1() */ public int getX1() { return x1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setX1(int) */ public void setX1(int x1) { this.x1 = x1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getX2() */ public int getX2() { return x2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setX2(int) */ public void setX2(int x2) { this.x2 = x2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getY1() */ public int getY1() { return y1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setY1(int) */ public void setY1(int y1) { this.y1 = y1; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#getY2() */ public int getY2() { return y2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setY2(int) */ public void setY2(int y2) { this.y2 = y2; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#instantiateWire(hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaController, hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.CriticalPoint, hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.CriticalPoint) */ public void instantiateWire(ISchemaController controller, CriticalPoint wireBeginning, CriticalPoint wireEnding) { //TODO srediti za razlicit orientation i odmak ako ce to uopce postojati if((wireBeginning == null || wireBeginning.getType()==CriticalPoint.ON_COMPONENT_PLUG) && (wireEnding == null || wireEnding.getType() == CriticalPoint.ON_COMPONENT_PLUG)){ addWire(controller, wireBeginning, wireEnding); }else{ if(wireBeginning == null || wireBeginning.getType() == CriticalPoint.ON_COMPONENT_PLUG) expandWire(controller, wireEnding, wireBeginning); else expandWire(controller, wireBeginning, wireEnding); } } private void expandWire(ISchemaController controller, CriticalPoint wireBeginning, CriticalPoint wireEnding) { Caseless wireName = wireBeginning.getName(); if(orientation == VERT_FIRST){ if (x1 != x2 && y1 != y2) { ICommand instantiate = new ExpandWireCommand(wireName,x1,y1,x1,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); instantiate = new ExpandWireCommand(wireName,x1,y2,x2,y2); response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } else{ ICommand instantiate = new ExpandWireCommand(wireName,x1,y1,x2,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } }else{ if (x1 != x2 && y1 != y2) { ICommand instantiate = new ExpandWireCommand(wireName,x1,y1,x2,y1); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); instantiate = new ExpandWireCommand(wireName,x2,y1,x2,y2); response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } else{ ICommand instantiate = new ExpandWireCommand(wireName,x1,y1,x2,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } } plugToPoint(wireBeginning,controller,wireName); plugToPoint(wireEnding,controller,wireName); } private void addWire(ISchemaController controller, CriticalPoint wireBeginning, CriticalPoint wireEnding) { Caseless wireName = null; if(orientation == VERT_FIRST){ if (x1 != x2 && y1 != y2) { wireName = createName(x1,y1,x1,y2); ICommand instantiate = new AddWireCommand(wireName,x1,y1,x1,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); instantiate = new ExpandWireCommand(wireName,x1,y2,x2,y2); response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } else{ wireName = createName(x1,y1,x1,y2); ICommand instantiate = new AddWireCommand(createName(x1, y1, x2, y2),x1,y1,x2,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } }else{ if (x1 != x2 && y1 != y2) { wireName = createName(x1,y1,x1,y2); ICommand instantiate = new AddWireCommand(wireName,x1,y1,x2,y1); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); instantiate = new ExpandWireCommand(wireName,x2,y1,x2,y2); response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } else{ wireName = createName(x1, y1, x2, y2); ICommand instantiate = new AddWireCommand(wireName,x1,y1,x2,y2); ICommandResponse response = controller.send(instantiate); System.out.println ("canvas report| wire instantiate succesful: "+response.isSuccessful()); } } plugToPoint(wireBeginning,controller,wireName); plugToPoint(wireEnding,controller,wireName); } private void plugToPoint(CriticalPoint point, ISchemaController controller, Caseless wireName) { //TODO napraviti plug wire!!! if (point!=null){ if(point.getType()==CriticalPoint.ON_COMPONENT_PLUG){ Caseless componentName = point.getName(); ICommand plug = new PlugWireCommand(componentName, wireName, point.getPortName()); ICommandResponse response = controller.send(plug); String message = ""; try{ message = response.getError().getMessage(); }catch (NullPointerException e) {} System.out.println ("canvas report| wire instantiate & plug succesful: "+response.isSuccessful()+" "+message); }else{ if(point.getType() == CriticalPoint.ON_WIRE_PLUG && !point.getName().equals(wireName)){ Caseless wireToBindName = point.getName(); ICommand plug = new BindWireCommand(wireToBindName, wireName); ICommandResponse response = controller.send(plug); String message = ""; try{ message = response.getError().getMessage(); }catch (NullPointerException e) {} System.out.println ("canvas report| wire instantiate & plug succesful: "+response.isSuccessful()+" "+message); }else{ System.out.println("canvas report| wire instantiate & plug expand wire"); } } } } private Caseless createName(int x1, int y1, int x2, int y2) { StringBuilder build = new StringBuilder("WIRE_"); build.append(normalize(x1)).append("_").append(normalize(y1)).append("_") .append(normalize(x2)).append("_").append(normalize(y2)); return new Caseless(build.toString()); } private String normalize(int x) { return x<0?"M"+String.valueOf(Math.abs(x)):String.valueOf(x); } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#draw(java.awt.Graphics2D) */ public void draw(Graphics2D g) { if(orientation == VERT_FIRST){ g.drawLine(x1, y1, x1, y2); g.drawLine(x1, y2, x2, y2); }else{ g.drawLine(x1, y1, x2, y1); g.drawLine(x2, y1, x2, y2); } } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#isWireInstance() */ public boolean isWireInstance() { return (Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))>10) && wireInstantiable; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#isWireInstantiable() */ public boolean isWireInstantiable() { return wireInstantiable; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setWireInstantiable(boolean) */ public void setWireInstantiable(boolean wireInstantiable) { this.wireInstantiable = wireInstantiable; } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setWireInstantiable(hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.CriticalPoint, hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.CriticalPoint) */ public void setWireInstantiable(CriticalPoint wireBeginning, CriticalPoint wireEnding) { if(wireBeginning != null && wireEnding != null){ if(wireBeginning.getType()==CriticalPoint.ON_WIRE_PLUG && wireEnding.getType()==CriticalPoint.ON_WIRE_PLUG){ if(wireBeginning.getName().equals(wireEnding.getName())){ wireInstantiable = false; }else{ wireInstantiable = true; } }else{ wireInstantiable = true; } }else{ wireInstantiable = true; } } /* (non-Javadoc) * @see hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.IWirePreLocator#setWireOrientation() */ public void revalidateWire() { double d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); if(d>Constants.GRID_SIZE-1&&d<Constants.GRID_SIZE+1){ if(Math.abs(x1-x2)>Math.abs(y1-y2)) orientation = WirePreLocator.HORIZ_FIRST; else orientation = WirePreLocator.VERT_FIRST; } } }