/*
* TabularLayout.java
*
* Created on October 8, 2008, 2:32 PM
*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community 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.osedu.org/licenses/ECL-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.
*/
/**
*
* @author akumar03
*/
package edu.tufts.vue.layout;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import tufts.vue.*;
import edu.tufts.vue.metadata.MetadataList;
import edu.tufts.vue.metadata.VueMetadataElement;
import edu.tufts.vue.dataset.*;
/*
* This layout puts nodes in a grid. By default it will make or try to make
* a square grid. Eventually it may be possible to define the number of rows,
* columns and cell spacing.
*/
public class ScrollingTabularLayout extends Layout {
public static int DEFAULT_ROWS =6;
private static boolean IM_LAYOUT=false;
private static int LIMIT_ROWS=6;
private static boolean STRICT_ROW_COUNT=true;
/** Creates a new instance of TabularLayout */
public ScrollingTabularLayout() {
}
public LWMap createMap(Dataset ds, String mapName) throws Exception {
LWMap map = new LWMap(mapName);
return map;
}
public static void useStrictRowCount(boolean count)
{
STRICT_ROW_COUNT=count;
}
public static void overrideDefaultRowCount(int rows)
{
LIMIT_ROWS=rows;
}
public static void setIMLayout(boolean im)
{
IM_LAYOUT=im;
}
public void layout(LWSelection selection) throws Exception {
double minX = Double.POSITIVE_INFINITY;
double minY = Double.POSITIVE_INFINITY;
int mod = DEFAULT_ROWS;
if (STRICT_ROW_COUNT)
mod = LIMIT_ROWS;
double xAdd = X_COL_SIZE; // default horizontal distance between the nodes
double yAdd = Y_COL_SIZE; //default vertical distance between nodes
int count = 0;
int total = 0;
final java.util.List<LWComponent> toLayout = new ArrayList(selection.size());
for (LWComponent c : selection) {
// TODO: this should be done in the caller for all layout actions?
if (c.isManagedLocation())
continue;
if (c instanceof LWNode || c instanceof LWText) {
toLayout.add(c);
} else if (c instanceof LWImage) {
// should already be handled by checking isManagedLocation, but just in case
final LWImage image = (LWImage) c;
if (!image.isNodeIcon())
toLayout.add(c);
}
}
for (LWComponent node : toLayout) {
/*
* If we're using the collaborative IM layout, then we need to be careful about this, in the current layout
* if you're not zoom fitting things can get pulled to the upper left, not sure if this is intended
* so i'm leaving it alone, and just special casing the instant messenging case.
*/
if (IM_LAYOUT)
{
minX = node.getLocation().getX() !=0.0 && node.getLocation().getX() < minX ? node.getLocation().getX() : minX;
minY = node.getLocation().getX() !=0.0 && node.getLocation().getY() < minY ? node.getLocation().getY() : minY;
}
else
{
minX = node.getLocation().getX() < minX ? node.getLocation().getX() : minX;
minY = node.getLocation().getY() < minY ? node.getLocation().getY() : minY;
}
xAdd = xAdd > node.getWidth() ? xAdd : node.getWidth();
yAdd = yAdd > node.getHeight() ? yAdd : node.getHeight();
total++;
// System.out.println(node.getLabel()+"X= "+node.getLocation().getX()+" Y= "+node.getLocation().getY()+" MIN: "+minX+" : "+minY);
}
xAdd += X_SPACING; // spacing between nodes
yAdd += Y_SPACING; // vertical spacing
double x = minX;
double y = minY;
if (!STRICT_ROW_COUNT)
mod = (int) Math.ceil(Math.sqrt((double) total));
for (LWComponent node : toLayout) {
total++;
if (count % mod == 0) {
if (count != 0) {
x += xAdd;
//System.out.println("Y : " +y +"," + " yAdd : " + yAdd);
}
y = minY;
} else {
y += yAdd;
}
count++;
node.setLocation(x, y);
}
}
}