package gve.calc.graph;
import java.awt.*;
import gve.calc.formula.*;
public class GraphMorphismView extends GraphView implements Runnable,View,ActivationListener {
private GraphMorphism model;
private Thread animator;
private boolean stopme = false;
// Invalidate some GraphView methods
public void setSize(int size) {}
public void removeVertex(int idx) {}
public Object getModel() { return model; }
public void updateView(Object with) {}
public GraphMorphismView(GraphMorphism morph) {
super(morph.graph);
model = morph;
int w = VERTEXDIAM*2, h = VERTEXDIAM*2;
for (int i = morph.map.length - 1; i>=0; i--) {
if (morph.xcoord1[i]+VERTEXDIAM >= w) w = morph.xcoord1[i]+VERTEXDIAM;
if (morph.ycoord1[i]+VERTEXDIAM >= h) h = morph.ycoord1[i]+VERTEXDIAM;
if (morph.xcoord2[i]+VERTEXDIAM >= w) w = morph.xcoord2[i]+VERTEXDIAM;
if (morph.ycoord2[i]+VERTEXDIAM >= h) h = morph.ycoord2[i]+VERTEXDIAM;
}
width = w; height = h;
int size = model.getSize();
}
public void activate() {
animator = new Thread(this);
stopme = false;
animator.start();
}
public void deactivate() {
stopme = true;
}
public boolean mousePressed(int flags,int x,int y) { return false; }
public void mouseDown(int flags,int x,int y) {}
public void paint(Graphics g) {
g.drawRect(0,0,width-1,height-1);
FormulaView view = FormulaView.get(this);
if (view.getCursorComp() == this) {
g.drawRect(1,1,width-3,height-3);
} else {
Color col = g.getColor();
g.setColor(Color.gray);
FontMetrics fm = g.getFontMetrics();
g.drawString("Click to play",3,3+height-fm.getHeight()+fm.getAscent());
g.setColor(col);
}
paintGraph(g);
}
public void run() {
final float dfraction = 0.04f;
stopme = false;
boolean direction = true; // ascending fractions
float fraction = 0f; // 0==graph1, 1==graph2
while (!stopme) {
try { Thread.sleep(200); }
catch (InterruptedException exc) {}
if (direction) {
fraction += dfraction;
if (fraction > 1.5) {
fraction = 1;
direction = false;
}
} else {
fraction -= dfraction;
if (fraction < -0.5) {
fraction = 0;
direction = true;
}
}
// calc positions
float fr = fraction;
if (fr < 0) fr = 0;
if (fr > 1) fr = 1;
Graph graph = model.graph;
for (int i = graph.getSize()-1; i>=0; i--) {
graph.setXcoord(i,(int)((1-fr)*model.xcoord1[i] + fr*model.xcoord2[model.map[i]]));
graph.setYcoord(i,(int)((1-fr)*model.ycoord1[i] + fr*model.ycoord2[model.map[i]]));
}
// paint
repaint(100);
}
animator = null;
}
}