/******************************************************************************* * 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.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.jboss.tools.jsf.ui.editor.figures.GroupFigure; public class PagesView extends Composite implements MouseListener,PaintListener{ double viewScale = 0.25; int pageCount = 0; boolean selectionEnabled = false; Dimension containerSize; Pages pages; int pW = 0; int pH = 0; int zeroX = 100; int zeroY = 0; GraphicalViewer viewer; boolean recount = true; List<IFigure> figures = new Vector<IFigure>(); public PagesView(Pages p, Dimension viewSize, Composite parent, int style) { super(parent, style); if (p.isTextPrint()) { this.containerSize = viewSize; this.pages = p; } else { this.containerSize = viewSize; this.pages = p; this.viewer = p.getViewer(); this.addMouseListener(this); this.viewScale = calculateScale(containerSize, pages.getDimension()); PropertyChangeListener pcl = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("scale")) { //$NON-NLS-1$ setViewScale(calculateScale(containerSize, pages .getDimension())); if (pageCount != pages.getSourcePagesCount()) { recount = true; pageCount = pages.getSourcePagesCount(); } else { recount = false; } redraw(); } } }; pages.addPropertyChangeListener(pcl); this.addPaintListener(this); this.pageCount = pages.getSourcePagesCount(); } } public double calculateScale(Dimension panelSize, Dimension componentSize) { double sX = 1; double sY = 1; double s = 1; if (panelSize.width > componentSize.width) { sX = (double) 1; } else { sX = (double) panelSize.width / componentSize.width; } if (panelSize.height > componentSize.height) { sY = (double) 1; } else { sY = (double) panelSize.height / componentSize.height; } if (sX < sY) { s = sX; } else { s = sY; } return s; } public void getChilds(IFigure f) { for (Iterator i = f.getChildren().iterator(); i.hasNext();) { IFigure o = (IFigure) i.next(); figures.add(o); getChilds(o); } } public int getTrueHeight(Label label, double vScale) { String s = label.getText(); Font ff = label.getFont(); FontData fd = ff.getFontData()[0]; int h = fd.getHeight(); int nh = (int) (h * vScale); if (nh > 0) { fd.setHeight(nh); Font f2 = new Font(null, fd); int dmm = FigureUtilities.getTextWidth(s, f2); int labW = (int) (label.getBounds().width * vScale); while (labW > dmm) { nh++; fd.setHeight(nh); Font f3 = new Font(null, fd); dmm = FigureUtilities.getTextWidth(s, f3); f3.dispose(); } f2.dispose(); return nh; } return 0; } public void paintControl(PaintEvent pe) { GC g2 = pe.gc; Color white = new Color(pe.display, 0xff, 0xff, 0xff); Color black = new Color(pe.display, 0x00, 0x00, 0x00); Color gray = pe.display.getSystemColor(SWT.COLOR_GRAY); Color yellowColor = new Color(null, 0xff, 0xf6, 0xcb); Color lightGrayColor = new Color(null, 0xf1, 0xf1, 0xf1); Color lightBlueColor = new Color(null, 0xcb, 0xeb, 0xff); int xmax = 0; int ymax = 0; int cx = 0; int cy = 0; for (int i = 0; i < pages.getSourcePagesCount(); i++) { Rectangle nrz = new Rectangle((int) Math.round(pages.getSourcePage( i).getRectangle().x * viewScale), (int) Math.round(pages.getSourcePage(i) .getRectangle().y * viewScale), (int) Math.round(pages.getSourcePage(i) .getRectangle().width * viewScale), (int) Math.round(pages.getSourcePage(i) .getRectangle().height * viewScale)); if ((nrz.y + nrz.height) > ymax) { ymax = nrz.y + nrz.height; if (recount) pH = nrz.height; cy++; } if ((nrz.x + nrz.width) > xmax) { xmax = nrz.x + nrz.width; if (recount) pW = nrz.width; cx++; } } recount = false; ymax = cy * pH; xmax = cx * pW; zeroX = (int) (this.containerSize.width - xmax) / 2; zeroY = (int) (this.containerSize.height - ymax) / 2; // --->paint viewer!!!! LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get( LayerManager.ID); IFigure f = lm.getLayer(LayerConstants.PRINTABLE_LAYERS); if (figures.isEmpty()) getChilds(f); int ix = 0; int iy = 0; for (int i = 0; i < figures.size(); i++) { IFigure f1 = (IFigure) figures.get(i); if (f1.getBounds().x < 0) { if (f1.getBounds().x < ix) ix = f1.getBounds().x; } if (f1.getBounds().y < 0) { if (f1.getBounds().y < iy) iy = f1.getBounds().y; } } for (int i = 0; i < figures.size(); i++) { IFigure f1 = (IFigure) figures.get(i); Rectangle r = new Rectangle(f1.getBounds().x + Math.abs(ix), f1 .getBounds().y + Math.abs(iy), f1.getBounds().width, f1.getBounds().height); Rectangle rs = new Rectangle((int) (r.x * viewScale) + zeroX, (int) (r.y * viewScale) + zeroY, (int) (r.width * viewScale), (int) (r.height * viewScale)); if (f1 instanceof PolylineConnection) { PolylineConnection plc = (PolylineConnection) f1; PointList pl = plc.getPoints(); for (int j = 0; j < pl.size() - 1; j++) { Point p = new Point(pl.getPoint(j).x + Math.abs(ix), pl .getPoint(j).y + Math.abs(iy)); Point p1 = new Point(pl.getPoint(j + 1).x + Math.abs(ix), pl.getPoint(j + 1).y + Math.abs(iy)); g2.setBackground(white); g2.setForeground(gray); g2.setLineStyle(SWT.LINE_SOLID); g2.drawLine((int) (p.x * viewScale) + zeroX, (int) (p.y * viewScale) + zeroY, (int) (p1.x * viewScale) + zeroX, (int) (p1.y * viewScale) + zeroY); } } else { if (f1 instanceof GroupFigure) { GroupFigure group = (GroupFigure) f1; g2.setForeground(black); if (group.group.isPattern()) { g2.setBackground(lightBlueColor); } else if (group.group.isConfirmed()) { g2.setBackground(yellowColor); } else { g2.setBackground(lightGrayColor); } g2.fillRectangle(rs.x, rs.y, rs.width, rs.height); g2.drawRectangle(rs.x, rs.y, rs.width, rs.height); } else { if (f1 instanceof Label) { String s = ((Label) f1).getText(); Font ff = f1.getFont(); FontData fd = ff.getFontData()[0]; int nn = this.getTrueHeight((Label) f1, viewScale); if (nn > 0) { fd.setHeight(nn); Font f2 = new Font(pe.display, fd); g2.setFont(f2); g2.setBackground(white); g2.drawString(s, rs.x, rs.y); f2.dispose(); } } } } } g2.setBackground(black); g2.setForeground(black); g2.setLineStyle(SWT.LINE_DOT); g2.drawLine(xmax + zeroX, zeroY, xmax + zeroX, ymax + zeroY); g2.drawLine(zeroX, ymax + zeroY, xmax + zeroX, ymax + zeroY); int tmp = ymax; List<Integer> xx = new ArrayList<Integer>(); List<Integer> yy = new ArrayList<Integer>(); while (tmp > 0) { g2 .drawLine(zeroX, tmp - pH + zeroY, xmax + zeroX, tmp - pH + zeroY); tmp = tmp - pH; yy.add(Integer.valueOf(tmp)); } tmp = xmax; while (tmp > 0) { g2 .drawLine(tmp - pW + zeroX, zeroY, tmp - pW + zeroX, ymax + zeroY); tmp = tmp - pW; xx.add(Integer.valueOf(tmp)); } List<Rectangle> rec = new ArrayList<Rectangle>(); for (int i = 0; i < yy.size(); i++) { for (int j = 0; j < xx.size(); j++) { rec.add(new Rectangle(((Integer) xx.get(j)).intValue() + zeroX, ((Integer) yy.get(i)).intValue() + zeroY, pW, pH)); } } Object[] rn = rec.toArray(); for (int i = 0; i < pages.getSourcePagesCount(); i++) { if (!pages.getSourcePage(i).isSelected()) { Rectangle sr = pages.getSourcePage(i).getRectangle(); Point p = new Point((int) Math.round(sr.x * viewScale + pW / 2 + zeroX), (int) Math.round(sr.y * viewScale + pH / 2 + zeroY)); for (int j = 0; j < rn.length; j++) { Rectangle rnt = (Rectangle) rn[j]; if (rnt.contains(p)) { g2.setXORMode(true); g2.setBackground(pe.display .getSystemColor(SWT.COLOR_DARK_GRAY)); Rectangle nr = new Rectangle(rnt.x, rnt.y, pW + 1, pH + 1); g2.fillRectangle(nr); g2.setXORMode(false); } } } } g2.dispose(); pe.gc.dispose(); } public void setViewScale(double viewScale) { this.viewScale = viewScale; } public double getViewScale() { return this.viewScale; } public Dimension getMinimumSize() { return getPreferredSize(); } public Dimension getMaximumSize() { return getPreferredSize(); } public Dimension getPreferredSize() { return new Dimension((int) (pages.getDimension().width * viewScale), (int) (pages.getDimension().height * viewScale)); } public Point getSize() { return new Point(this.getPreferredSize().width, this.getPreferredSize().height); } public int getWidth() { return this.getPreferredSize().width; } public int getHeight() { return this.getPreferredSize().height; } public Rectangle getBounds() { return new Rectangle(this.getLocation().x, this.getLocation().y, this .getPreferredSize().width, this.getPreferredSize().height); } public void setSelectionEnabled(boolean value) { this.selectionEnabled = value; } public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { if (selectionEnabled) { Point p = new Point(e.x, e.y); for (int i = 0; i < this.pages.getSourcePagesCount(); i++) { Rectangle nr = new Rectangle( (int) (pages.getSourcePage(i).getRectangle().x * viewScale) + zeroX, (int) (pages.getSourcePage(i).getRectangle().y * viewScale) + zeroY, (int) (pages.getSourcePage(i).getRectangle().width * viewScale), (int) (pages.getSourcePage(i).getRectangle().height * viewScale)); if (nr.contains(p)) { pages.getSourcePage(i).setSelected( !pages.getSourcePage(i).isSelected()); this.redraw(); } } } } public void mouseUp(MouseEvent e) { } }