package org.freeplane.view.swing.map;
import java.awt.Graphics2D;
import java.awt.Point;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.view.swing.map.edge.EdgeView;
import org.freeplane.view.swing.map.edge.SummaryEdgeView;
class SummaryEdgePainter {
SummaryEdgePainter(NodeView parent, boolean isLeft){
this.isLeft = isLeft;
int maxSize = parent.getComponentCount();
xs = new int[maxSize];
yMins = new int[maxSize];
yMaxs = new int[maxSize];
level = 0;
maxLevel = 0;
resetLevelValues(0);
saveCurrentValues();
}
private void resetLevelValues(int level) {
if(this.isLeft)
xs[level] = Integer.MAX_VALUE;
else
xs[level] = Integer.MIN_VALUE;
yMins[level] = Integer.MAX_VALUE;
yMaxs[level] = Integer.MIN_VALUE;
}
private void saveCurrentValues() {
currentX = xs[level];
currentY1 = yMins[level];
currentY2 = yMaxs[level];
}
final private int yMins[];
final private int yMaxs[];
final private int xs[];
private int currentX;
private int currentY1;
private int currentY2;
final private boolean isLeft;
private int level;
private int maxLevel;
void addChild(NodeView child){
if(child.isLeft() != isLeft)
return;
setCurrentLevel(child);
updateLevelValues(child);
}
private void updateLevelValues(NodeView child) {
resetLevelValuesForStart(child);
int spaceAround = child.getSpaceAround();
if(child.getHeight() == 2 * spaceAround)
return;
int yMin = child.getY() + spaceAround;
int yMax = child.getY() + child.getHeight() - child.getSpaceAround();
int x;
if (isLeft) {
x = child.getX() + spaceAround;
}
else {
x = child.getX() + child.getWidth() - spaceAround;
}
yMins[level] = Math.min(yMin, yMins[level]);
yMaxs[level] = Math.max(yMax, yMaxs[level]);
if (isLeft) {
xs[level] = Math.min(x, xs[level]);
}
else {
xs[level] = Math.max(x, xs[level]);
}
}
private void resetLevelValuesForStart(NodeView child) {
if(child.isFirstGroupNode())
resetLevelValues(level);
if(level > maxLevel){
maxLevel = level;
resetLevelValues(level);
}
}
private void setCurrentLevel(NodeView child) {
if(child.isSummary()){
saveCurrentValues();
resetLevelValues(level);
level++;
}
else{
level = 0;
}
}
private boolean hasSummaryEdge(){
return level > 0 && currentY1 != Integer.MAX_VALUE;
}
boolean paintSummaryEdge(Graphics2D g, NodeView source, NodeView target) {
if(! hasSummaryEdge())
return false;
final Point start1 = new Point(currentX, currentY1);
final Point start2 = new Point(currentX, currentY2);
final NodeView parentView = target.getParentView();
UITools.convertPointToAncestor(parentView, start1, source);
UITools.convertPointToAncestor(parentView, start2, source);
final EdgeView edgeView = new SummaryEdgeView(source, target, source);
edgeView.setStart(start1);
edgeView.paint(g);
edgeView.setStart(start2);
edgeView.paint(g);
return true;
}
int getY1(){
return currentY1;
}
int getY2(){
return currentY2;
}
int getX(){
return currentX;
}
}