blob: 1afdd23bc55ad9b5c771060c55ad34855174aaec [file] [log] [blame]
/*******************************************************************************
* Copyright 2005, CHISEL Group, University of Victoria, Victoria, BC, Canada.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* The Chisel Group, University of Victoria
*******************************************************************************/
package org.eclipse.mylar.zest.layouts.algorithms.internal;
import java.util.Comparator;
import java.util.TreeSet;
import org.eclipse.mylar.zest.layouts.dataStructures.DisplayIndependentPoint;
import org.eclipse.mylar.zest.layouts.dataStructures.DisplayIndependentRectangle;
import org.eclipse.mylar.zest.layouts.dataStructures.InternalNode;
public class DynamicScreen {
private TreeSet XCoords = null;
private TreeSet YCoords = null;
private DisplayIndependentRectangle screenBounds = null;
double minX = 0.0;
double minY = 0.0;
double maxX = 0.0;
double maxY = 0.0;
public void cleanScreen() {
minX = 0.0;
minY = 0.0;
maxX = 0.0;
maxY = 0.0;
}
class XComparator implements Comparator {
public int compare(Object arg0, Object arg1) {
InternalNode n1 = (InternalNode)arg0;
InternalNode n2 = (InternalNode)arg1;
if ( n1.getInternalX() > n2.getInternalX() ) return +1;
else if ( n1.getInternalX() < n2.getInternalX() ) return -1;
else {
return n1.toString().compareTo( n2.toString() );
}
}
}
class YComparator implements Comparator {
public int compare(Object arg0, Object arg1) {
InternalNode n1 = (InternalNode)arg0;
InternalNode n2 = (InternalNode)arg1;
if ( n1.getInternalY() > n2.getInternalY() ) return +1;
else if ( n1.getInternalY() < n2.getInternalY() ) return -1;
else {
return n1.toString().compareTo( n2.toString() );
}
}
}
public DynamicScreen(int x, int y, int width, int height) {
XCoords = new TreeSet(new XComparator());
YCoords = new TreeSet(new YComparator());
this.screenBounds = new DisplayIndependentRectangle(x,y,width,height);
}
public void removeNode( InternalNode node ) {
XCoords.remove( node );
YCoords.remove( node );
}
public void addNode( InternalNode node ) {
XCoords.add( node );
YCoords.add( node );
}
public DisplayIndependentPoint getScreenLocation( InternalNode node ) {
DisplayIndependentRectangle layoutBounds = calculateBounds();
double x = (layoutBounds.width == 0) ? 0 : (node.getInternalX() - layoutBounds.x) / layoutBounds.width;
double y = (layoutBounds.height == 0) ? 0 : (node.getInternalY() - layoutBounds.y) / layoutBounds.height;
x = screenBounds.x + x * screenBounds.width;
y = screenBounds.y + y * screenBounds.height;
return new DisplayIndependentPoint( x, y );
}
public DisplayIndependentPoint getVirtualLocation( DisplayIndependentPoint point ) {
DisplayIndependentRectangle layoutBounds = calculateBounds();
double x = (point.x/screenBounds.width) * layoutBounds.width + layoutBounds.x;
double y = (point.y/screenBounds.height) * layoutBounds.height + layoutBounds.y;
return new DisplayIndependentPoint( x, y );
}
private DisplayIndependentRectangle calculateBounds() {
InternalNode n1 = (InternalNode) XCoords.first();
InternalNode n2 = (InternalNode) XCoords.last();
InternalNode n3 = (InternalNode) YCoords.first();
InternalNode n4 = (InternalNode) YCoords.last();
double x = n1.getInternalX();
double width = n2.getInternalX();
double y = n3.getInternalY();
double height = n4.getInternalY();
return new DisplayIndependentRectangle(x, y, width - x, height - y);
}
}