/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* 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 org.icepdf.ri.common.views;
import org.icepdf.core.util.ColorUtil;
import org.icepdf.core.util.Defs;
import javax.swing.*;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* <p>The PageViewDecorator class adds a page border and shadow to all of the page
* views defined in the corg.icepdf.core.views.swing package. This class can
* easily be modified for extended for custom page decorations.</p>
* <br>
* <p>By default the this class paints with the following colors:</p>
* <ul>
* <li>paper color - default color is white, can be changed using the system
* property org.icepdf.core.views.page.paper.color
* </li>
* <li>paper border color - default color is black, can be changed using the
* system property org.icepdf.core.views.page.border.color</li>
* <li>paper shadow color - default color is darkGrey, can be changed using the
* system property org.icepdf.core.views.page.shadow.color</li>
* </ul>
* <p>All color values can be set using the hex rgb values.
* eg. black=000000 or white=FFFFFFF. </p>
*
* @since 2.5
*/
@SuppressWarnings("serial")
public class PageViewDecorator extends JComponent {
private static final Logger log =
Logger.getLogger(PageViewDecorator.class.toString());
protected JComponent pageViewComponent;
protected static final int SHADOW_SIZE = 3;
protected Dimension preferredSize = new Dimension();
private static Color pageBorderColor;
private static Color pageShadowColor;
private static Color pageColor;
static {
// sets the shadow colour of the decorator.
try {
String color = Defs.sysProperty(
"org.icepdf.core.views.page.shadow.color", "#333333");
int colorValue = ColorUtil.convertColor(color);
pageShadowColor =
new Color(colorValue >= 0 ? colorValue :
Integer.parseInt("333333", 16));
} catch (NumberFormatException e) {
if (log.isLoggable(Level.WARNING)) {
log.warning("Error reading page shadow colour");
}
}
// background colours for paper, border and shadow.
try {
String color = Defs.sysProperty(
"org.icepdf.core.views.page.paper.color", "#FFFFFF");
int colorValue = ColorUtil.convertColor(color);
pageColor =
new Color(colorValue >= 0 ? colorValue :
Integer.parseInt("FFFFFF", 16));
} catch (NumberFormatException e) {
if (log.isLoggable(Level.WARNING)) {
log.warning("Error reading page paper color.");
}
}
// border colour for the page decoration.
try {
String color = Defs.sysProperty(
"org.icepdf.core.views.page.border.color", "#000000");
int colorValue = ColorUtil.convertColor(color);
pageBorderColor =
new Color(colorValue >= 0 ? colorValue :
Integer.parseInt("000000", 16));
} catch (NumberFormatException e) {
if (log.isLoggable(Level.WARNING)) {
log.warning("Error reading page paper color.");
}
}
}
public PageViewDecorator(JComponent pageViewComponent) {
setLayout(new GridLayout(1, 1, 0, 0));
this.pageViewComponent = pageViewComponent;
Dimension size = pageViewComponent.getPreferredSize();
preferredSize.setSize(size.width + SHADOW_SIZE, size.height + SHADOW_SIZE);
add(pageViewComponent);
}
public Dimension getPreferredSize() {
Dimension size = pageViewComponent.getPreferredSize();
preferredSize.setSize(size.width + SHADOW_SIZE, size.height + SHADOW_SIZE);
return preferredSize;
}
/**
* Paints a default a black border and dark gray shadow for the given page.
*
* @param g java graphic context which is decorated with page graphics.
*/
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Point location = pageViewComponent.getLocation();
Dimension size = pageViewComponent.getPreferredSize();
// paper
g2d.setColor(pageColor);
g2d.fillRect(location.x, location.y, size.width, size.height);
// paper shadow
g2d.setColor(pageShadowColor);
g2d.fillRect(location.x + SHADOW_SIZE, location.y + size.height, size.width - SHADOW_SIZE, SHADOW_SIZE);
g2d.fillRect(location.x + size.width, location.y + SHADOW_SIZE, SHADOW_SIZE, size.height);
super.paint(g);
// paper border
g2d.setColor(pageBorderColor);
g2d.drawRect(location.x, location.y, size.width, size.height);
}
public PageViewComponent getPageViewComponent() {
return (PageViewComponent) pageViewComponent;
}
}