| /******************************************************************************* |
| * 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); |
| } |
| |
| } |