/*
* org.openmicroscopy.shoola.agents.imviewer.browser.GridBICanvas
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2009 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.imviewer.browser;
//Java imports
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.Iterator;
import java.util.List;
//Third-party libraries
//Application-internal dependencies
import org.openmicroscopy.shoola.agents.imviewer.util.ImagePaintingFactory;
/**
* Paints the split view.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* </small>
* @since 3.0-Beta4
*/
class GridBICanvas
extends ImageCanvas
{
/**
* Paints the image.
*
* @param g2D The graphics context.
* @param w The width of an image composing the grid.
* @param h The height of an image composing the grid.
* @param bar Pass <code>true</code> to paint the scale bar,
* <code>false</code> otherwise.
*/
private void paintImage(Graphics2D g2D, int w, int h, boolean bar)
{
List images = model.getSplitImages();
if (images == null) return;
SplitImage combined = null;
g2D.setColor(model.getBackgroundColor());
Dimension d = getSize();
g2D.fillRect(0, 0, d.width, d.height);
int row = model.getGridRow();
int colum = model.getGridColumn();
int n = model.getMaxC();
if (n == 1) row = 1;
else if (n == 3 || n == 2) row = 2;
else if (n >= 4) {
combined = (SplitImage) images.get(images.size()-1);
images.remove(images.size()-1);
}
Iterator channels = images.iterator();
BufferedImage image;
SplitImage channel;
String v = model.getUnitBarValue();
int s = (int) (model.getGridBarSize());
Color c = model.getUnitBarColor();
Font font = getFont();;
FontMetrics fm = getFontMetrics(font);
int textWidth;
boolean text = model.isTextVisible();
String name;
g2D.setColor(BACKGROUND);
int widthGrid = w*colum;
int heightGrid = h*row;
int x = 0, y = 0;
for (int i = 0; i <= row; ++i) {
g2D.drawLine(x, y, x+widthGrid, y);
y = (i+1)*(h)-1;
}
x = 0;
y = 0;
for (int i = 0; i <= colum; ++i) {
g2D.drawLine(x, y, x, y+heightGrid);
x = (i+1)*(w)-1;
}
x = 0;
y = 0;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < colum; ++j) {
if (channels.hasNext()) {
channel = (SplitImage) channels.next();
image = channel.getImage();
x = j*(w+BrowserModel.GAP);
if (image != null) {
g2D.drawImage(image, null, x, y);
//draw string.
if (text) {
name = channel.getName();
textWidth = fm.stringWidth(name)+4;
if (textWidth < w) {
//g2D.setColor(BACKGROUND);
//g2D.fillRect(x, y, textWidth, 3*height/2);
g2D.setColor(getBackground());
g2D.drawString(name, x+2, y+height);
}
}
if (bar && v != null) {
textWidth = fm.stringWidth(v)+4;
if (textWidth < w/2)
ImagePaintingFactory.paintScaleBar(g2D, x+w-s-5,
y+h-5, s, v, c);
}
} else { //just paint rectangle.
//if (text) {
name = channel.getName();
//g2D.setColor(BACKGROUND);
//g2D.drawRect(x, y, w-1, h-1);
textWidth = fm.stringWidth(name)+4;
if (textWidth < w && text)
g2D.drawString(name, x+2, y+height);
//}
}
}
}
x = 0;
y = (i+1)*(h+BrowserModel.GAP);
}
if (combined != null) {
image = combined.getImage();
y = 0;
x = colum*(w+BrowserModel.GAP);
if (image != null) {
g2D.drawImage(image, null, x, y);
//g2D.drawImage(image, null, x, y);
//draw string.
if (text) {
name = combined.getName();
textWidth = fm.stringWidth(name)+4;
if (textWidth < w) {
//g2D.setColor(BACKGROUND);
//g2D.fillRect(x, y, textWidth, 3*height/2);
g2D.setColor(getBackground());
g2D.drawString(name, x+2, y+height);
}
}
if (bar && v != null) {
textWidth = fm.stringWidth(v)+4;
if (textWidth < w/2)
ImagePaintingFactory.paintScaleBar(g2D, x+w-s-5,
y+h-5, s, v, c);
}
} else {
name = combined.getName();
//g2D.setColor(BACKGROUND);
//g2D.drawRect(x, y, w-1, h-1);
textWidth = fm.stringWidth(name)+4;
if (textWidth < w && text)
g2D.drawString(name, x+2, y+height);
}
}
}
/**
* Creates a new instance.
*
* @param model Reference to the Model. Mustn't be <code>null</code>.
* @param view Reference to the View. Mustn't be <code>null</code>.
*/
GridBICanvas(BrowserModel model, BrowserUI view)
{
super(model, view);
}
/**
* Returns the location of the point of the top-left corner of the
* the rectangle with respect to the image coordinate system if the
* passed rectangle is contained in an image composing the grid.
* Returns <code>null</code> otherwise.
*
* @param r The rectangle to handle.
* @return See above.
*/
Point isOnImageInGrid(Rectangle r)
{
List images = model.getSplitImages();
if (images == null) return null;
SplitImage combined = null;
int n = images.size();
if (n <= 3) n = 4;
if (n > 4 && n%2 != 0) {
combined = (SplitImage) images.get(images.size()-1);
images.remove(images.size()-1);
}
n = (int) Math.floor(Math.sqrt(n));
Iterator channels = images.iterator();
BufferedImage image;
int x = 0, y = 0;
SplitImage channel;
BufferedImage original = model.getCombinedImage();
int w = original.getWidth(), h = original.getHeight();
Rectangle imageRectangle;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (!channels.hasNext()) break; //Done
channel = (SplitImage) channels.next();
image = channel.getImage();
x = j*(w+BrowserModel.GAP);
if (image != null) {
imageRectangle = new Rectangle (x, y, w, h);
if (imageRectangle.contains(r)) {
return new Point(r.x-imageRectangle.x,
r.y-imageRectangle.y);
}
}
}
x = 0;
y = (i+1)*(h+BrowserModel.GAP);
}
if (combined != null) {
image = combined.getImage();
y = 0;
x = n*(w+BrowserModel.GAP);
if (image != null) {
imageRectangle = new Rectangle (x, y, w, h);
if (imageRectangle.contains(r)) {
return new Point(r.x-imageRectangle.x,
r.y-imageRectangle.y);
}
} return null;
}
return null;
}
/**
* Creates and returns an image representing the grid.
*
* @return See above.
*/
BufferedImage getGridImage()
{
BufferedImage gridImage;
BufferedImage original = model.getCombinedImage();
if (original == null) return null;
int w = original.getWidth();
int h = original.getHeight();
Dimension d = getSize();
if (d.width == 0 || d.height == 0) return null;
gridImage = new BufferedImage(d.width, d.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2D = (Graphics2D) gridImage.getGraphics();
ImagePaintingFactory.setGraphicRenderingSettings(g2D);
paintImage(g2D, w, h, model.isUnitBar());
return gridImage;
}
/**
* Overridden to paint the image.
* @see javax.swing.JComponent#paintComponent(Graphics)
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
ImagePaintingFactory.setGraphicRenderingSettings(g2D);
BufferedImage original = model.getCombinedImage();
if (original == null) return;
paintImage(g2D, original.getWidth(), original.getHeight(),
model.isUnitBar());
}
}