/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. and others. * * 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.preference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.FreeformLayeredPane; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.LayerConstants; /** * This is a printable layer that draws page outline tiles enclosing all of the * printable child figures. The page outlines represent complete pages as they * would appear if they were printed on dead trees, thus the pageSize set on * this layer should be the currently selected printer's page resolution. * * The reason this needs to be added to the printable layers is so that it will * show up in the content outline viewer. */ /*package*/ class PrintedPageLayer extends FreeformLayer { // our layer name static final String PRINTED_PAGE_LAYER = "Printed Page"; //$NON-NLS-1$ // the size of the page tiles (this should be the printer's resolution) private Dimension pageSize = new Dimension(850, 1100); // the WindowFigure that owns this layer private final WindowFigure host; // flag to lock out multiple calls to setFreeformBounds() when adding // and removing PrintedPageFigures. private boolean busy; // A simple page outline figure. We can get fancy later with turned-up // dogears, page numbers, titles and whatnot... static class PrintedPageFigure extends RectangleFigure { PrintedPageFigure() { super(); setFill(false); setOutline(true); setLineWidth(1); } } /** * @param figure */ public PrintedPageLayer(WindowFigure figure) { super(); this.host = figure; } /** * @param x * @param y * @return the print page figure */ protected PrintedPageFigure createPage(int x, int y) { PrintedPageFigure page = new PrintedPageFigure(); page.setBounds(new Rectangle(x, y, pageSize.width, pageSize.height)); return page; } /** * Sets the page width and height. This should be the currently selected * printer's page size. * * @param d */ public void setPageSize(Dimension d) { pageSize = d.getCopy(); } /** * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(Rectangle) */ public void setFreeformBounds(Rectangle bounds) { if (!busy && getParent() instanceof FreeformLayeredPane && pageSize.width > 0 && pageSize.height > 0) { busy = true; // build the new printing layer extent by looking at only the // contents of the Primary, Connection and Feedback layers Rectangle b; FreeformLayer layer; layer = (FreeformLayer) host.getLayer(LayerConstants.PRIMARY_LAYER); b = layer.getFreeformExtent().getCopy(); layer = (FreeformLayer) host .getLayer(LayerConstants.CONNECTION_LAYER); b = b.union(layer.getFreeformExtent()); layer = (FreeformLayer) host .getLayer(LayerConstants.FEEDBACK_LAYER); b = b.union(layer.getFreeformExtent()); // calculate x and y for the page tiles int x = 0, y = 0; if (b.x < 0) { while (x > b.x) x -= pageSize.width; } else { while (x + pageSize.width < b.x) x += pageSize.width; } if (b.y < 0) { while (y > b.y) y -= pageSize.height; } else { while (y + pageSize.height < b.y) y += pageSize.height; } // get list of pagefigures that intersect the new extent // and a list of those that don't List keepers = new ArrayList(); List trash = new ArrayList(); Iterator iter = getChildren().iterator(); while (iter.hasNext()) { Figure child = (Figure) iter.next(); if (child.getBounds().intersects(b)) keepers.add(child); else trash.add(child); } // calculate width and height int w = 0, h = 0; while (x + w < b.x + b.width) w += pageSize.width; while (y + h < b.y + b.height) h += pageSize.height; // determine the required pagefigures for (int xi = x; xi < x + w; xi += pageSize.width) { for (int yi = y; yi < y + h; yi += pageSize.height) { boolean found = false; iter = keepers.iterator(); while (iter.hasNext()) { Figure child = (Figure) iter.next(); Point p = child.getBounds().getLocation(); if (p.x == xi && p.y == yi) { found = true; break; } } if (!found) { // add the new page add(createPage(xi, yi)); } } } // remove all the old pages iter = trash.iterator(); while (iter.hasNext()) remove((Figure) iter.next()); busy = false; } super.setFreeformBounds(bounds); } }