/*
* Copyright 2015-2016 Igor Maznitsa.
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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.
*/
package com.igormaznitsa.mindmap.print;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import javax.annotation.Nonnull;
import javax.swing.JPanel;
class Pages extends JPanel {
private static final long serialVersionUID = -6728277837828116266L;
private final MMDPrintPanel parent;
private static final int INTERVAL_X = 25;
private static final int INTERVAL_Y = 25;
private static final int SHADOW_X = 10;
private static final int SHADOW_Y = 10;
public Pages (@Nonnull final MMDPrintPanel parent) {
this.parent = parent;
}
@Override
@Nonnull
public Dimension getPreferredSize () {
final PrintPage[][] pages = this.parent.getPages();
final PageFormat thePageFormat = this.parent.getPageFormat();
final double scale = this.parent.getScale();
int pagesAtHorizontal = 0;
int pagesAtVertical = pages.length;
final double paperWidth = thePageFormat.getWidth();
final double paperHeight = thePageFormat.getHeight();
for (final PrintPage[] row : pages) {
pagesAtHorizontal = Math.max(pagesAtHorizontal, row.length);
}
final int width = (int) Math.round(INTERVAL_X + ((paperWidth + INTERVAL_X) * pagesAtHorizontal));
final int height = (int) Math.round(INTERVAL_Y + ((paperHeight + INTERVAL_Y) * pagesAtVertical));
return new Dimension((int) Math.round(width * scale), (int) Math.round(height * scale));
}
@Override
@Nonnull
public Dimension getMinimumSize () {
return this.getPreferredSize();
}
@Override
@Nonnull
public Dimension getMaximumSize () {
return this.getPreferredSize();
}
@Override
@SuppressWarnings("unchecked")
public void paint (@Nonnull final Graphics g) {
final Graphics2D gfx = (Graphics2D) g;
gfx.setColor(parent.isDarkTheme() ? Color.DARK_GRAY : Color.LIGHT_GRAY);
final Dimension size = getSize();
gfx.fillRect(0, 0, size.width, size.height);
final double scale = this.parent.getScale();
final PageFormat thePageFormat = this.parent.getPageFormat();
final PrintPage[][] allPages = this.parent.getPages();
final double PAGE_WIDTH = thePageFormat.getWidth();
final double PAGE_HEIGHT = thePageFormat.getHeight();
final double AREA_WIDTH = thePageFormat.getImageableWidth();
final double AREA_HEIGHT = thePageFormat.getImageableHeight();
final Rectangle2D pageBack = new Rectangle2D.Double(0.0d, 0.0d, PAGE_WIDTH, PAGE_HEIGHT);
final Rectangle2D pageArea = new Rectangle2D.Double(0.0d, 0.0d, AREA_WIDTH, AREA_HEIGHT);
final Color SHADOW = new Color(0, 0, 0, 0x50);
int y = INTERVAL_Y;
final double AREA_X = thePageFormat.getImageableX();
final double AREA_Y = thePageFormat.getImageableY();
final boolean drawBorder = this.parent.isDrawBorder();
gfx.scale(scale, scale);
for (final PrintPage[] pages : allPages) {
int x = INTERVAL_X;
for (final PrintPage p : pages) {
gfx.translate(x, y);
gfx.setColor(SHADOW);
pageBack.setRect(SHADOW_X, SHADOW_Y, pageBack.getWidth(), pageBack.getHeight());
gfx.fill(pageBack);
gfx.setColor(Color.WHITE);
pageBack.setRect(0.0d, 0.0d, pageBack.getWidth(), pageBack.getHeight());
gfx.fill(pageBack);
gfx.translate(AREA_X, AREA_Y);
final Graphics2D gfxCopy = (Graphics2D) gfx.create();
gfxCopy.clip(pageArea);
p.print(gfxCopy);
gfxCopy.dispose();
if (drawBorder) {
final Stroke oldStroke = gfx.getStroke();
gfx.setColor(MMDPrintPanel.BORDER_COLOR);
gfx.setStroke(MMDPrintPanel.BORDER_STYLE);
gfx.draw(pageArea);
gfx.setStroke(oldStroke);
}
gfx.translate(-AREA_X, -AREA_Y);
gfx.translate(-x, -y);
x += INTERVAL_X + PAGE_WIDTH;
}
y += INTERVAL_Y + PAGE_HEIGHT;
}
gfx.scale(1.0d, 1.0d);
paintBorder(g);
}
}