/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.ui.editor.print; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Layer; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.jboss.tools.jsf.ui.editor.figures.DiagramFigure; public class Pages { public Image printImage = null; GraphicalViewer viewer = null; double scale = 1; int width = 0; int height = 0; PageFormat pageFormat = null; List<Page> mPages; List<Page> sPages = null; PropertyChangeSupport pcs = new PropertyChangeSupport(this); PropertyChangeListener pcl; int countX = 1; int countY = 1; boolean isText = false; String[] text; List<IFigure> figures = new Vector<IFigure>(); public int ix = 0; public int iy = 0; public Pages(GraphicalViewer c, PageFormat pageFormat) { this(c, PageFormat.printScale, pageFormat, true); } public int computeStringWidth(Font f, String str) { /* METHOD NOT USED */ /* * FontData.data is platform dependent * (org.eclipse.swt.internal.win32.LOGFONT) */ return 0; } public void setPrintImage(Image printImage) { this.printImage = printImage; } public Image getPrintImage() { return this.printImage; } public int calculateMaxWidth(String str, Font f, int width) { int w = computeStringWidth(f, str); while (w > width) { str = str.substring(0, str.length() - 1); w = computeStringWidth(f, str); } return str.length(); } public int calculateMaxStringCount(int height, Font f, int spacing) { int hs = spacing + f.getFontData()[0].getHeight(); int count = (int) Math.floor(height / hs); if (count > 1) { count--; } return count; } public void getChilds(IFigure f) { for (Iterator i = f.getChildren().iterator(); i.hasNext();) { IFigure o = (IFigure) i.next(); if (!(o instanceof DiagramFigure) && !(o instanceof Layer)) { figures.add(o); } getChilds(o); } } public Dimension getTrueSize() { List v = figures; Dimension d = new Dimension(0, 0); for (int i = 0; i < v.size(); i++) { IFigure c = (IFigure) v.get(i); if (c.getBounds().x + c.getBounds().width > d.width) { d.setSize(c.getBounds().x + c.getBounds().width, d.height); } if (c.getBounds().y + c.getBounds().height > d.height) { d.setSize(d.width, c.getBounds().y + c.getBounds().height); } if (c.getBounds().x < ix) ix = c.getBounds().x; if (c.getBounds().y < iy) iy = c.getBounds().y; } d.width = d.width + Math.abs(ix); d.height = d.height + Math.abs(iy); return d; } public Pages(GraphicalViewer viewer, double scale, PageFormat pageFormat, boolean trueSize) { super(); this.viewer = viewer; this.scale = scale; this.pageFormat = pageFormat; LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get( LayerManager.ID); IFigure f = lm.getLayer(LayerConstants.PRINTABLE_LAYERS); getChilds(f); this.width = this.getTrueSize().width; this.height = this.getTrueSize().height; pcl = createSelectionListener(); this.createPages(); } public boolean isTextPrint() { return this.isText; } public PropertyChangeListener createSelectionListener() { return new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("select")) { //$NON-NLS-1$ if (((Boolean) evt.getNewValue()).booleanValue()) { if (!mPages.contains(evt.getSource())) mPages.add((Page) evt.getSource()); pcs.firePropertyChange("PageSelection", false, true); //$NON-NLS-1$ if (mPages.size() == sPages.size()) { pcs.firePropertyChange("selectAll", false, true); //$NON-NLS-1$ } } else { mPages.remove((Page)evt.getSource()); pcs.firePropertyChange("PageSelection", false, true); //$NON-NLS-1$ if (mPages.size() == 0) { pcs.firePropertyChange("unSelectAll", false, true); //$NON-NLS-1$ } } } } }; } void createPages() { List<Page> oldPages = null; if (sPages != null) { oldPages = new ArrayList<Page>(); oldPages.addAll(sPages); } this.mPages = new Vector<Page>(); this.sPages = new Vector<Page>(); int pWidth = (int) getPageFormat().getImageableWidth(); int pHeight = (int) getPageFormat().getImageableHeight(); int sWidth = (int) (this.getScale() * width); int sHeight = (int) (this.getScale() * height); int oldCountX = countX; int oldCountY = countY; countX = 1; countY = 1; if (sWidth > pWidth) { countX = (int) Math.round((sWidth / pWidth) + 0.5); } if (sHeight > pHeight) { countY = (int) Math.round((sHeight / pHeight) + 0.5); } for (int i = 0; i < countY; i++) { for (int j = 0; j < countX; j++) { Page newPage = new Page(this, new Rectangle((int) ((this .getPageFormat().getImageableWidth() * j) / this .getScale()), (int) ((this.getPageFormat() .getImageableHeight() * i) / this.getScale()), (int) (this.getPageFormat().getImageableWidth() / this .getScale()), (int) (this.getPageFormat() .getImageableHeight() / this.getScale())), this.viewer, this.getPageFormat(), this.getScale(), (int) (this.getPageFormat().getImageableWidth() * j), (int) (this.getPageFormat().getImageableHeight() * i), this.getSourcePagesCount() + 1); newPage.addPropertyChangeListener(pcl); sPages.add(newPage); } } if (oldCountX != countX || oldCountY != countY) { selectAll(); } else { if (oldPages != null) { for (int i = 0; i < oldPages.size(); i++) { sPages.get(i).setSelected(oldPages.get(i).isSelected()); } } else { selectAll(); } } } public Page getSourcePage(int index) { return sPages.get(index); } public int getSourcePagesCount() { return sPages.size(); } public PageFormat getPageFormat() { return this.pageFormat; } public double getScale() { return this.scale; } public void setScale(double scale) { double oldScale = this.scale; this.scale = scale; if (this.isTextPrint()) { } else { this.createPages(); } pcs.firePropertyChange("scale", new Double(oldScale), new Double( //$NON-NLS-1$ scale)); } public void selectAll() { for (int i = 0; i < sPages.size(); i++) { sPages.get(i).setSelected(true); } pcs.firePropertyChange("selectAll", false, true); //$NON-NLS-1$ } public void unSelectAll() { for (int i = 0; i < sPages.size(); i++) { sPages.get(i).setSelected(false); } pcs.firePropertyChange("unSelectAll", false, true); //$NON-NLS-1$ } public void addPropertyChangeListener(PropertyChangeListener pcl) { pcs.addPropertyChangeListener(pcl); } public void removePropertyChangeListener(PropertyChangeListener pcl) { pcs.removePropertyChangeListener(pcl); } public GraphicalViewer getViewer() { return this.viewer; } public int getNumberOfPages() { return mPages.size(); } public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException { return mPages.get(pageIndex).getPageFormat(); } public Page getPrintable(int pageIndex) throws IndexOutOfBoundsException { return mPages.get(pageIndex); } public Dimension getDimension() { return new Dimension( (int) (countX * pageFormat.getImageableWidth() / this .getScale()), (int) (countY * pageFormat.getImageableHeight() / this.getScale())); } }