/* * org.openmicroscopy.shoola.agents.metadata.rnd.GraphicsPaneUI * *------------------------------------------------------------------------------ * 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.metadata.rnd; //Java imports import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.ImageIcon; import javax.swing.JPanel; //Third-party libraries //Application-internal dependencies import org.openmicroscopy.shoola.agents.metadata.IconManager; /** * Component displaying the plane histogram. * * @author Jean-Marie Burel      <a * href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Andrea Falconi      <a * href="mailto:a.falconi@dundee.ac.uk">a.falconi@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> * (<b>Internal version:</b> $Revision: $Date: $) * </small> * @since 3.0-Beta4 */ class GraphicsPaneUI extends JPanel { /** Color used to draw a line to indicate the selected value. */ private final static Color LINECOLOUR = Color.BLACK; /** The color used to grey out the non selected area. */ private final static Color GREYCOLOUR = new Color(196, 196, 196, 128); /** The color of the filled background area. */ private final static Color FILLCOLOUR = new Color(255, 255, 255); /** The color of the border of the histogram. */ private final static Color BORDERCOLOUR = new Color(224, 209, 207); /** The curve's stroke. */ private final static BasicStroke STROKE1_5 = new BasicStroke(1.5f); /** The border stroke. */ private final static BasicStroke STROKE2 = new BasicStroke(2.0f); /** A temporary image of a histogram */ private ImageIcon histogramImage; /** A reference to the model. */ private RendererModel model; /** A reference to the model. */ private GraphicsPane view; /** * Creates a new instance. * * @param view Reference to the view. * @param model Reference to the model. Mustn't be <code>null</code>. */ GraphicsPaneUI(GraphicsPane view, RendererModel model) { if (view == null) throw new IllegalArgumentException("No view."); if (model == null) throw new IllegalArgumentException("No model."); this.model = model; this.view = view; IconManager icons = IconManager.getInstance(); histogramImage = icons.getImageIcon(IconManager.TEMPORARY_HISTOGRAM); } /** * Overridden to paint the histogram image. * @see JPanel#paintComponent(Graphics) */ public void paintComponent(Graphics og) { super.paintComponent(og); Graphics2D g = (Graphics2D) og; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); double width = getWidth(); double height = getHeight(); g.setColor(FILLCOLOUR); g.fillRect(1, 1, (int) width-1, (int) height-1); g.setColor(BORDERCOLOUR); g.setStroke(STROKE2); g.drawRect(0, 0, (int) width-1, (int) height-1); if (histogramImage != null) g.drawImage(histogramImage.getImage(), 0, 0, (int) width-1, (int) height-1, null); double codomainMin = model.getCodomainStart(); double codomainMax = model.getCodomainEnd(); //double domainGlobalMin = model.getGlobalMin(); //double domainGlobalMax = model.getGlobalMax(); double domainGlobalMin = view.getPartialMinimum(); double domainGlobalMax = view.getPartialMaximum(); double domainMin = model.getWindowStart(); double domainMax = model.getWindowEnd(); //Added jmarie 03/10/07 if (domainMin < domainGlobalMin) domainMin = domainGlobalMin; if (domainMax > domainGlobalMax) domainMax = domainGlobalMax; double domainMinScreenX = ((domainMin-domainGlobalMin)/ (domainGlobalMax-domainGlobalMin))*width; double domainMaxScreenX = ((domainMax-domainGlobalMin)/ (domainGlobalMax-domainGlobalMin))*width; double codomainMinScreenY = ((255-codomainMin)/255.0f)*height; double codomainMaxScreenY = ((255-codomainMax)/255.0f)*height; double domainRangeScreen = domainMaxScreenX-domainMinScreenX; double codomainRangeScreen = codomainMinScreenY-codomainMaxScreenY; g.setColor(GREYCOLOUR); g.fillRect(0, 0, (int) domainMinScreenX+1, (int) height); g.fillRect((int) domainMaxScreenX-1, 0, (int) width, (int) height); g.fillRect(0, 0, (int) domainMinScreenX, (int) height); g.fillRect((int) domainMaxScreenX, 0, (int) width, (int) height); g.fillRect(0, 0, (int) width, (int) codomainMaxScreenY); g.fillRect(0, (int) codomainMinScreenY, (int) width, (int) height); String family = model.getFamily(); double k = model.getCurveCoefficient(); double a = 0; if (family.equals(RendererModel.LINEAR)) a = codomainRangeScreen/domainRangeScreen; else if (family.equals(RendererModel.POLYNOMIAL)) a = codomainRangeScreen/Math.pow(domainRangeScreen, k); else if (family.equals(RendererModel.EXPONENTIAL)) a = codomainRangeScreen/Math.exp(Math.pow(domainRangeScreen, k)); else if (family.equals(RendererModel.LOGARITHMIC)) { if (domainRangeScreen <= 1) domainRangeScreen = 1; a = codomainRangeScreen/Math.log(domainRangeScreen); } double b = codomainMinScreenY; double currentX = domainMinScreenX-1; double currentY = b; double oldX, oldY; g.setColor(model.getChannelColor(model.getSelectedChannel())); g.setStroke(STROKE1_5); for (double x = 1; x < domainRangeScreen; x += 1) { oldX = currentX; oldY = currentY; currentX = x+domainMinScreenX-1; if (family.equals(RendererModel.LINEAR)) currentY = b-a*x; else if (family.equals(RendererModel.EXPONENTIAL)) currentY = b-a*Math.exp(Math.pow(x, k)); else if (family.equals(RendererModel.POLYNOMIAL)) currentY = b-a*Math.pow(x, k); else if (family.equals(RendererModel.LOGARITHMIC)) currentY = b-a*Math.log(x); g.drawLine((int) oldX, (int) oldY, (int) currentX, (int) currentY); } if (view.isPaintLine()) { int vertical = view.getVerticalLine(); g.setColor(LINECOLOUR); double v; if (view.paintVertical()) { v = ((vertical-domainGlobalMin)/ (domainGlobalMax-domainGlobalMin))*width; g.drawLine((int) v, 0, (int) v, (int) height); } int horizontal = view.getHorizontalLine(); if (view.paintHorizontal()) { v = ((255-horizontal)/255.0f)*height; g.drawLine(0, (int) v, (int) width, (int) v); } } } }