/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.print.multipage;
import org.eclipse.draw2d.AbstractLayout;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.SWTGraphics;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.util.Util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Widget;
import org.xmind.gef.draw2d.ITextFigure;
import org.xmind.gef.draw2d.RotatableWrapLabel;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.internal.print.PrintConstants;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
import org.xmind.ui.resources.FontUtils;
public class MultipageImagePreviewViewer {
private static final int PREF_WIDTH = 300;
private static final int PREF_HEIGHT = 180;
private static final int BORDER_WIDTH = 1;
private static final int TEXT_MARGIN = 3;
private static final double Show_Font_Multiple = 4.0;
private static final String ENABLED = "enabled"; //$NON-NLS-1$
private class PreviewTextLayout extends AbstractLayout {
protected Dimension calculatePreferredSize(IFigure container, int wHint,
int hHint) {
return container.getSize();
}
public void layout(IFigure container) {
org.eclipse.draw2d.geometry.Rectangle area = container
.getClientArea();
org.eclipse.draw2d.geometry.Rectangle borderBounds = borderFigure
.getBounds();
int textMargin = Util.isMac() ? 5 : 0;
int bottomDownValue = 4;
if (pageNumberLayer != null) {
Dimension size = pageNumberLayer.getPreferredSize(-1, -1);
int y = area.y + area.height - size.height
- Math.max((area.y + area.height
- (borderBounds.y + borderBounds.height)
- size.height) / 2, textMargin)
+ bottomDownValue;
int x = area.x + (area.width - size.width) / 2;
//todo set x position for pageNumberFigure when footer's horizontal position changed
pageNumberLayer
.setBounds(new org.eclipse.draw2d.geometry.Rectangle(x,
y, area.width, size.height));
}
if (headerFigure != null) {
Dimension size = headerFigure.getPreferredSize(area.width, -1);
int y = area.y
+ Math.max((borderBounds.y - area.y - size.height) / 2,
textMargin);
headerFigure.setBounds(
new org.eclipse.draw2d.geometry.Rectangle(area.x, y,
area.width, size.height));
}
if (footerFigure != null) {
Dimension size = footerFigure.getPreferredSize(area.width, -1);
int y = area.y + area.height - size.height
- Math.max((area.y + area.height
- (borderBounds.y + borderBounds.height)
- size.height) / 2, textMargin)
+ bottomDownValue;
footerFigure.setBounds(
new org.eclipse.draw2d.geometry.Rectangle(area.x, y,
area.width, size.height));
}
}
}
private int prefWidth = PREF_WIDTH;
private int prefHeight = PREF_HEIGHT;
private double x = 0;
private double y = 0;
private double ratio = 1.0d;
private Composite composite;
private Composite backgroundImageComposite;
private Image backgroundImage;
private FigureCanvas canvas;
private String title = null;
private int titlePlacement = 0;
private Label pageNumberLabel;
private Label totalPagesLabel;
private Label firstButton;
private Label previousButton;
private Label nextButton;
private Label lastButton;
private Image image;
private Image wholeImage;
public Image[] singleImages;
private int imageIndex;
private Layer feedbackLayer;
private IFigure borderFigure;
private ITextFigure headerFigure;
private ITextFigure footerFigure;
private IFigure textLayer;
private IFigure pageNumberLayer;
private ITextFigure pageNumberFigure;
private Rectangle imageBorderBounds;
private Font headerFont;
private Font footerFont;
private ResourceManager resources;
private Listener eventHandler = new Listener() {
public void handleEvent(Event event) {
handleWidgetEvent(event);
}
};
public MultipageImagePreviewViewer(boolean fill) {
}
public void createControl(Composite parent) {
composite = new Composite(parent, SWT.NONE);
resources = new LocalResourceManager(JFaceResources.getResources(),
composite);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
composite.setLayout(layout);
Composite composite2 = new Composite(composite, SWT.NONE);
GridLayout layout2 = new GridLayout();
layout2.marginHeight = 0;
layout2.marginWidth = 0;
layout2.horizontalSpacing = 0;
layout2.verticalSpacing = 10;
composite2.setLayout(layout2);
// composite2.setLayoutData(
// new GridData(fill ? GridData.FILL : GridData.CENTER,
// fill ? GridData.FILL : GridData.CENTER, true, true));
composite2.setLayoutData(
new GridData(GridData.CENTER, GridData.CENTER, false, false));
createCanvas(composite2);
createBarControls(composite2);
}
private void createCanvas(Composite parent) {
//create background image composite
backgroundImageComposite = new Composite(parent, SWT.NONE);
backgroundImageComposite.setBackground(parent.getBackground());
backgroundImageComposite.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.marginLeft = 2;
layout.marginTop = 1;
layout.marginRight = 6;
layout.marginBottom = 7;
backgroundImageComposite.setLayout(layout);
//create canvas
LightweightSystem lws = new LightweightSystem();
canvas = new FigureCanvas(backgroundImageComposite, SWT.DOUBLE_BUFFERED,
lws);
canvas.setScrollBarVisibility(FigureCanvas.NEVER);
GridData layoutData = new GridData();
layoutData.horizontalAlignment = GridData.FILL;
layoutData.verticalAlignment = GridData.FILL;
layoutData.grabExcessHorizontalSpace = true;
layoutData.grabExcessVerticalSpace = true;
layoutData.widthHint = getPrefWidth() + BORDER_WIDTH + BORDER_WIDTH;
layoutData.heightHint = getPrefHeight() + BORDER_WIDTH + BORDER_WIDTH;
canvas.setLayoutData(layoutData);
hookCanvas(canvas, new Listener() {
public void handleEvent(Event event) {
handleCanvasEvent(event);
}
});
updateCanvas();
createFeedbackFigure(canvas);
}
private void createFeedbackFigure(FigureCanvas canvas) {
canvas.setViewport(new Viewport(true));
feedbackLayer = new Layer();
canvas.getViewport().setContents(feedbackLayer);
borderFigure = new Layer();
borderFigure.setBorder(new LineBorder(
new LocalResourceManager(JFaceResources.getResources(), canvas)
.createColor(ColorUtils.toRGB("#959595")), //$NON-NLS-1$
1));
feedbackLayer.add(borderFigure);
textLayer = new Layer();
textLayer.setLayoutManager(new PreviewTextLayout());
feedbackLayer.add(textLayer);
headerFigure = new RotatableWrapLabel(RotatableWrapLabel.NORMAL);
headerFigure.setForegroundColor(
canvas.getDisplay().getSystemColor(SWT.COLOR_BLACK));
textLayer.add(headerFigure);
footerFigure = new RotatableWrapLabel(RotatableWrapLabel.NORMAL);
footerFigure.setForegroundColor(
canvas.getDisplay().getSystemColor(SWT.COLOR_BLACK));
textLayer.add(footerFigure);
pageNumberLayer = new Layer();
textLayer.add(pageNumberLayer);
org.eclipse.draw2d.GridLayout gridLayout = new org.eclipse.draw2d.GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
pageNumberLayer.setLayoutManager(gridLayout);
pageNumberFigure = new RotatableWrapLabel(RotatableWrapLabel.NORMAL);
pageNumberFigure.setForegroundColor(
canvas.getDisplay().getSystemColor(SWT.COLOR_BLACK));
org.eclipse.draw2d.GridData gridData = new org.eclipse.draw2d.GridData(
SWT.FILL, SWT.FILL, true, true);
pageNumberLayer.add(pageNumberFigure, gridData);
}
private void createBarControls(Composite parent) {
Composite bar = new Composite(parent, SWT.NONE);
GridData layoutData = new GridData(SWT.CENTER, SWT.CENTER, false,
false);
bar.setLayoutData(layoutData);
GridLayout layout = new GridLayout(5, false);
layout.marginWidth = 30;
layout.horizontalSpacing = 0;
layout.marginHeight = 0;
bar.setLayout(layout);
firstButton = new Label(bar, SWT.NONE);
firstButton.setImage(getIcon("nav_first.png", true)); //$NON-NLS-1$
GridData firstButtonData = new GridData(SWT.CENTER, SWT.CENTER, false,
false);
firstButtonData.widthHint = firstButton.getImage().getBounds().width;
firstButtonData.heightHint = firstButton.getImage().getBounds().height;
firstButton.setLayoutData(firstButtonData);
previousButton = new Label(bar, SWT.NONE);
previousButton.setImage(getIcon("nav_previous.png", true)); //$NON-NLS-1$
GridData previousButtonData = new GridData(SWT.CENTER, SWT.CENTER,
false, false);
previousButtonData.widthHint = previousButton.getImage()
.getBounds().width;
previousButtonData.heightHint = previousButton.getImage()
.getBounds().height;
previousButton.setLayoutData(previousButtonData);
Composite labelComposite = new Composite(bar, SWT.NONE);
labelComposite.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
GridLayout layout2 = new GridLayout(3, false);
layout2.marginWidth = 20;
layout2.marginHeight = 0;
layout2.horizontalSpacing = 10;
layout2.verticalSpacing = 0;
labelComposite.setLayout(layout2);
pageNumberLabel = new Label(labelComposite, SWT.NONE);
pageNumberLabel.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
pageNumberLabel.setText("0"); //$NON-NLS-1$
Label label1 = new Label(labelComposite, SWT.NONE);
label1.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
label1.setText("of"); //$NON-NLS-1$
totalPagesLabel = new Label(labelComposite, SWT.NONE);
totalPagesLabel.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
totalPagesLabel.setText("0"); //$NON-NLS-1$
nextButton = new Label(bar, SWT.NONE);
nextButton.setImage(getIcon("nav_next.png", true)); //$NON-NLS-1$
GridData nextButtonData = new GridData(SWT.CENTER, SWT.CENTER, false,
false);
nextButtonData.widthHint = nextButton.getImage().getBounds().width;
nextButtonData.heightHint = nextButton.getImage().getBounds().height;
nextButton.setLayoutData(nextButtonData);
lastButton = new Label(bar, SWT.NONE);
lastButton.setImage(getIcon("nav_last.png", true)); //$NON-NLS-1$
GridData lastButtonData = new GridData(SWT.CENTER, SWT.CENTER, false,
false);
lastButtonData.widthHint = lastButton.getImage().getBounds().width;
lastButtonData.heightHint = lastButton.getImage().getBounds().height;
lastButton.setLayoutData(lastButtonData);
hookWidget(firstButton, SWT.MouseDown);
hookWidget(previousButton, SWT.MouseDown);
hookWidget(nextButton, SWT.MouseDown);
hookWidget(lastButton, SWT.MouseDown);
updateImageButtons();
}
private void hookWidget(Widget widget, int eventType) {
widget.addListener(eventType, eventHandler);
}
private void handleWidgetEvent(Event event) {
if (!Boolean.TRUE.equals(event.widget.getData(ENABLED))) {
return;
}
if (event.widget == firstButton) {
setImageIndex(0);
} else if (event.widget == previousButton) {
setImageIndex(imageIndex == 0 ? 0 : imageIndex - 1);
} else if (event.widget == nextButton) {
setImageIndex(imageIndex == singleImages.length
? singleImages.length : imageIndex + 1);
} else if (event.widget == lastButton) {
setImageIndex(singleImages.length);
}
updateImageButtons();
initPreviewImageRatio();
}
private void updateImageButtons() {
firstButton.setData(ENABLED, singleImages != null && imageIndex != 0);
previousButton.setData(ENABLED,
singleImages != null && imageIndex != 0);
nextButton.setData(ENABLED,
singleImages != null && imageIndex != singleImages.length);
lastButton.setData(ENABLED,
singleImages != null && imageIndex != singleImages.length);
updateButtonImages();
}
public void disableImageButtons() {
firstButton.setData(ENABLED, false);
previousButton.setData(ENABLED, false);
nextButton.setData(ENABLED, false);
lastButton.setData(ENABLED, false);
updateButtonImages();
}
private void updateButtonImages() {
firstButton.setImage(getIcon("nav_first.png", //$NON-NLS-1$
Boolean.TRUE.equals(firstButton.getData(ENABLED))));
previousButton.setImage(getIcon("nav_previous.png", //$NON-NLS-1$
Boolean.TRUE.equals(previousButton.getData(ENABLED))));
nextButton.setImage(getIcon("nav_next.png", //$NON-NLS-1$
Boolean.TRUE.equals(nextButton.getData(ENABLED))));
lastButton.setImage(getIcon("nav_last.png", //$NON-NLS-1$
Boolean.TRUE.equals(lastButton.getData(ENABLED))));
}
public void setPrefSize(Point prefSize) {
if (prefSize == null || (prefSize.x == getPrefWidth()
&& prefSize.y == getPrefHeight())) {
return;
}
int oldPrefWidth = this.prefWidth;
int oldPrefHeight = this.prefHeight;
this.prefWidth = prefSize.x;
this.prefHeight = prefSize.y;
GridData gridData = (GridData) canvas.getLayoutData();
gridData.widthHint = getPrefWidth() + BORDER_WIDTH + BORDER_WIDTH;
gridData.heightHint = getPrefHeight() + BORDER_WIDTH + BORDER_WIDTH;
updatePrefSize(oldPrefWidth, oldPrefHeight);
}
public void updateBackgroundImageComposite(boolean showDetails,
boolean landscape) {
String backgroundImageName = showDetails
? (landscape ? "paper-details-landscape.png" //$NON-NLS-1$
: "paper-details-portrait.png") //$NON-NLS-1$
: (landscape ? "paper-simple-landscape.png" //$NON-NLS-1$
: "paper-simple-portrait.png"); //$NON-NLS-1$
backgroundImage = MindMapUI.getImages()
.get("icons/pages/" + backgroundImageName).createImage(); //$NON-NLS-1$
}
public void updateBackgroundImage() {
if (imageIndex != 0) {
if (backgroundImageComposite
.getBackgroundImage() == backgroundImage) {
return;
}
backgroundImageComposite.setBackgroundImage(backgroundImage);
GridData layoutData = (GridData) backgroundImageComposite
.getLayoutData();
layoutData.widthHint = backgroundImageComposite.getBackgroundImage()
.getBounds().width;
layoutData.heightHint = backgroundImageComposite
.getBackgroundImage().getBounds().height;
} else {
backgroundImageComposite.setBackgroundImage(null);
GridData layoutData = (GridData) backgroundImageComposite
.getLayoutData();
layoutData.widthHint = SWT.DEFAULT;
layoutData.heightHint = SWT.DEFAULT;
}
backgroundImageComposite.getShell().pack();
backgroundImageComposite.getShell().layout(true, true);
}
private void updateCanvas() {
if (canvas != null && !canvas.isDisposed()) {
canvas.setEnabled(getImage() != null);
}
}
private void hookCanvas(Canvas canvas, Listener listener) {
canvas.addListener(SWT.Paint, listener);
canvas.addListener(SWT.Dispose, listener);
}
private void handleCanvasEvent(Event event) {
switch (event.type) {
case SWT.Paint:
paintCanvas(event);
break;
case SWT.Dispose:
handleWidgetDisposed();
break;
}
}
private void handleWidgetDisposed() {
if (wholeImage != null && !wholeImage.isDisposed()) {
wholeImage.dispose();
}
if (singleImages != null) {
for (Image image : singleImages) {
if (image != null && !image.isDisposed()) {
image.dispose();
}
}
}
if (image != null && !image.isDisposed()) {
image.dispose();
}
}
private void paintCanvas(Event event) {
GC gc = event.gc;
Rectangle area = canvas.getClientArea();
gc.setClipping(area);
drawImage(gc, area);
drawTitle(gc, area);
gc.setClipping(area);
gc.setForeground(event.display.getSystemColor(SWT.COLOR_GRAY));
// gc.drawRectangle(area.x, area.y, area.width - 1, area.height - 1);
canvas.getViewport().paint(new SWTGraphics(gc));
}
private void drawTitle(GC gc, Rectangle area) {
if (title == null)
return;
gc.setFont(composite.getFont());
gc.setForeground(composite.getForeground());
Point size = gc.stringExtent(title);
int x, y;
if ((titlePlacement & SWT.LEFT) != 0) {
x = area.x + TEXT_MARGIN;
} else if ((titlePlacement & SWT.RIGHT) != 0) {
x = area.x + area.width - size.x - TEXT_MARGIN;
} else {
x = area.x + (area.width - size.x) / 2;
}
if ((titlePlacement & SWT.TOP) != 0) {
y = area.y + TEXT_MARGIN;
} else if ((titlePlacement & SWT.BOTTOM) != 0) {
y = area.y + area.height - size.y - TEXT_MARGIN;
} else {
y = area.y + (area.height - size.y) / 2;
}
gc.drawString(title, x, y, true);
}
private void drawImage(GC gc, Rectangle area) {
if (image != null && !image.isDisposed()) {
drawImage(gc, area, image, image.getBounds());
}
}
private void drawImage(GC gc, Rectangle area, Image image,
Rectangle imgSize) {
double srcWidth = Math.min(imgSize.width, area.width / ratio);
double srcHeight = Math.min(imgSize.height, area.height / ratio);
double srcX = Math.max(0, Math.min(imgSize.width - srcWidth, x));
double srcY = Math.max(0, Math.min(imgSize.height - srcHeight, y));
double destWidth = srcWidth * ratio;
double destHeight = srcHeight * ratio;
double destX = area.x + BORDER_WIDTH
+ (area.width - BORDER_WIDTH - BORDER_WIDTH - destWidth) / 2;
double destY = area.y + BORDER_WIDTH
+ (area.height - BORDER_WIDTH - BORDER_WIDTH - destHeight) / 2;
gc.setAntialias(SWT.ON);
gc.drawImage(image, (int) srcX, (int) srcY, (int) srcWidth,
(int) srcHeight, (int) destX, (int) destY, (int) destWidth,
(int) destHeight);
}
public void setPrefWidth(int prefWidth) {
if (prefWidth == this.prefWidth)
return;
int oldPrefWidth = this.prefWidth;
this.prefWidth = prefWidth;
updatePrefSize(oldPrefWidth, getPrefHeight());
}
public int getPrefWidth() {
return prefWidth;
}
public void setPrefHeight(int prefHeight) {
if (prefHeight == this.prefHeight)
return;
int oldPrefHeight = this.prefHeight;
this.prefHeight = prefHeight;
updatePrefSize(getPrefWidth(), oldPrefHeight);
}
public int getPrefHeight() {
return prefHeight;
}
private void updatePrefSize(int oldPrefWidth, int oldPrefHeight) {
if (calculatePrefRatio() != 0) {
changeRatio(calculatePrefRatio(), oldPrefWidth, oldPrefHeight);
}
}
private double calculatePrefRatio() {
if (image != null && !image.isDisposed()) {
Rectangle imgSize = image.getBounds();
double horizontalRatio = ((double) getPrefWidth()) / imgSize.width;
double verticalRatio = ((double) getPrefHeight()) / imgSize.height;
return Math.min(horizontalRatio, verticalRatio);
}
return 0;
}
private void setRatio(double ratio) {
this.ratio = ratio;
calculateFigureBorder();
}
private double getRatio() {
return ratio;
}
private void setX(double x) {
this.x = x;
}
private void setY(double y) {
this.y = y;
}
public Control getControl() {
return composite;
}
public Canvas getCanvas() {
return canvas;
}
public void setFocus() {
if (canvas != null && !canvas.isDisposed()) {
canvas.setFocus();
}
}
public void changeRatio(double ratio) {
changeRatio(ratio, getPrefWidth(), getPrefHeight());
}
private void changeRatio(double ratio, int oldPrefWidth,
int oldPrefHeight) {
double oldRatio = this.ratio;
setRatio(ratio);
double newRatio = this.ratio;
if (image != null) {
Rectangle imgSize = image.getBounds();
double oldWidth = Math.min(imgSize.width, oldPrefWidth / oldRatio);
double oldHeight = Math.min(imgSize.height,
oldPrefHeight / oldRatio);
double oldCenterX = x + oldWidth / 2;
double oldCenterY = y + oldHeight / 2;
double newWidth = Math.min(imgSize.width,
getPrefWidth() / newRatio);
double newHeight = Math.min(imgSize.height,
getPrefHeight() / newRatio);
setX(Math.min(imgSize.width - newWidth,
Math.max(0, oldCenterX - newWidth / 2)));
setY(Math.min(imgSize.height - newHeight,
Math.max(0, oldCenterY - newHeight / 2)));
}
updateFontHeight();
if (canvas != null && !canvas.isDisposed()) {
canvas.redraw();
}
}
public void setImage(Image image) {
if (image != null && !image.isDisposed()) {
Rectangle imgSize = image.getBounds();
setImage(image, imgSize.x + imgSize.width / 2,
imgSize.y + imgSize.height / 2);
} else {
setImage(null, 0, 0);
}
}
public void setImage(Image image, double centerX, double centerY) {
this.image = image;
if (image != null) {
Rectangle imgSize = image.getBounds();
double horizontalRatio = ((double) getPrefWidth()) / imgSize.width;
double verticalRatio = ((double) getPrefHeight()) / imgSize.height;
setRatio(Math.min(horizontalRatio, verticalRatio));
double width = Math.min(imgSize.width, getPrefWidth() / getRatio());
double height = Math.min(imgSize.height,
getPrefHeight() / getRatio());
setX(Math.max(0,
Math.min(imgSize.width - width, centerX - width / 2)));
setY(Math.max(0,
Math.min(imgSize.height - height, centerY - height / 2)));
}
if (canvas != null && !canvas.isDisposed()) {
canvas.redraw();
}
updateCanvas();
}
public Image getImage() {
return image;
}
public void setTitle(String title) {
if (title == this.title || (title != null && title.equals(this.title)))
return;
this.title = title;
if (canvas != null && !canvas.isDisposed()) {
canvas.redraw();
}
}
public String getTitle() {
return title;
}
public void setTitlePlacement(int titlePlacement) {
if (titlePlacement == this.titlePlacement)
return;
this.titlePlacement = titlePlacement;
if (canvas != null && !canvas.isDisposed()) {
canvas.redraw();
}
}
public int getTitlePlacement() {
return titlePlacement;
}
public void setWholeImage(Image wholeImage) {
if (this.wholeImage != null) {
this.wholeImage.dispose();
}
this.wholeImage = wholeImage;
}
public void setSingleImages(Image[] singleImages) {
if (this.singleImages != null) {
for (Image image : this.singleImages) {
if (image != null) {
image.dispose();
}
}
}
this.singleImages = singleImages;
totalPagesLabel.setText("" + singleImages.length); //$NON-NLS-1$
totalPagesLabel.getParent().getParent().layout();
}
private void calculateFigureBorder() {
if (singleImages == null || singleImages.length == 0
|| singleImages[0] == null || singleImages[0].isDisposed()) {
return;
}
Rectangle area = canvas.getClientArea();
if (imageBorderBounds != null) {
borderFigure.setBounds(new org.eclipse.draw2d.geometry.Rectangle(
(int) (imageBorderBounds.x * ratio),
(int) (imageBorderBounds.y * ratio),
(int) (imageBorderBounds.width * ratio + 2),
(int) (imageBorderBounds.height * ratio + 1)));
}
textLayer.setBounds(new org.eclipse.draw2d.geometry.Rectangle(0, 0,
area.width, area.height));
((IFigure) (textLayer.getChildren().get(0))).revalidate();
}
//make preview image just right full preview control
public void initPreviewImageRatio() {
if (getImage() != null && !getImage().isDisposed()) {
double widthRatio = (double) getPrefWidth()
/ getImage().getBounds().width;
double heightRatio = (double) getPrefHeight()
/ getImage().getBounds().height;
double ratio = widthRatio < heightRatio ? widthRatio : heightRatio;
changeRatio(ratio);
}
}
public void setImageIndex(int imageIndex) {
feedbackLayer.setVisible(imageIndex != 0);
this.imageIndex = imageIndex;
pageNumberLabel.setText("" + imageIndex); //$NON-NLS-1$
pageNumberLabel.getParent().getParent().layout();
String pageNumber = (imageIndex == 0 ? "" : "- " + imageIndex + " -"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
updatePageNumber(pageNumber);
updateImageButtons();
updateBackgroundImage();
Image image = (imageIndex == 0 ? wholeImage
: singleImages[imageIndex - 1]);
setImage(image);
}
private void updatePageNumber(String text) {
if (pageNumberFigure != null) {
pageNumberFigure.setText(text);
Font font = Display.getCurrent().getSystemFont();
int height = (font.getFontData())[0].getHeight();
font = FontUtils.getNewHeight(font,
(int) (height * getFontRatio() * Show_Font_Multiple));
pageNumberFigure.setFont(font);
pageNumberFigure.setVisible(!"".equals(text)); //$NON-NLS-1$
pageNumberFigure.revalidate();
canvas.layout();
}
}
private double getFontRatio() {
if (image == null) {
return ratio;
} else {
Rectangle bounds = image.getBounds();
int pageWidth = PrintConstants.PAGE_LENGTH;
int pageHeight = PrintConstants.PAGE_SHORT;
if (bounds.width < bounds.height) {
pageWidth = PrintConstants.PAGE_SHORT;
pageHeight = PrintConstants.PAGE_LENGTH;
}
double widthRatio = (double) getPrefWidth() / pageWidth;
double heightRatio = (double) getPrefHeight() / pageHeight;
return widthRatio < heightRatio ? widthRatio : heightRatio;
}
}
public void setImageBorderBounds(Rectangle bounds) {
this.imageBorderBounds = new Rectangle(bounds.x, bounds.y, bounds.width,
bounds.height);
}
public void updateHeaderPreview(String text, String alignValue,
int defaultDraw2DAlign, String fontValue) {
updateHFPreview(text, alignValue, defaultDraw2DAlign, fontValue,
headerFigure);
}
public void updateFooterPreview(String text, String alignValue,
int defaultDraw2DAlign, String fontValue) {
updateHFPreview(text, alignValue, defaultDraw2DAlign, fontValue,
footerFigure);
}
private void updateHFPreview(String text, String alignValue,
int defaultDraw2DAlign, String fontValue, ITextFigure textFigure) {
if (textFigure != null) {
textFigure.setText(text);
textFigure.setTextAlignment(PrintConstants
.toDraw2DAlignment(alignValue, defaultDraw2DAlign));
Font font = null;
if (fontValue != null) {
font = FontUtils.getFont(fontValue);
}
if (font == null) {
font = Display.getCurrent().getSystemFont();
}
if (textFigure == headerFigure) {
headerFont = font;
} else {
footerFont = font;
}
int height = (font.getFontData())[0].getHeight();
font = FontUtils.getNewHeight(font,
(int) (height * getFontRatio() * Show_Font_Multiple));
textFigure.setFont(font);
textFigure.setVisible(!"".equals(text)); //$NON-NLS-1$
textFigure.revalidate();
canvas.layout();
}
}
public void setFeedbackVisible(boolean visible) {
if (feedbackLayer != null) {
feedbackLayer.setVisible(visible);
}
}
public void setBorderVisible(boolean visible) {
if (borderFigure != null) {
borderFigure.setVisible(visible);
canvas.layout();
}
}
public void setPageNumberVisible(boolean visible) {
if (pageNumberLayer != null) {
pageNumberLayer.setVisible(visible);
canvas.layout();
}
}
private void updateFontHeight() {
setFontHeightToPreview(headerFigure);
setFontHeightToPreview(footerFigure);
setFontHeightToPreview(pageNumberFigure);
}
private void setFontHeightToPreview(IFigure target) {
if (target == null) {
return;
}
Font font = target == pageNumberFigure
? Display.getCurrent().getSystemFont()
: (target == headerFigure ? headerFont : footerFont);
if (font == null) {
return;
}
int height = (font.getFontData())[0].getHeight();
font = FontUtils.getNewHeight(font,
(int) (height * getFontRatio() * Show_Font_Multiple));
target.setFont(font);
}
private Image getIcon(String path, boolean enabled) {
return (Image) resources.get(
MindMapUIPlugin.imageDescriptorFromPlugin(MindMapUI.PLUGIN_ID,
"icons/nav/" + (enabled ? "e/" : "d/") + path)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}