/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jlab.groot.ui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import org.jlab.groot.base.AttributeType;
import org.jlab.groot.base.Attributes;
import org.jlab.groot.base.ColorPalette;
import org.jlab.groot.base.FontProperties;
import org.jlab.groot.base.PadMargins;
import org.jlab.groot.base.TStyle;
import org.jlab.groot.math.Dimension2D;

/**
 *
 * @author gavalian
 */
public class GraphicsAxisFrame {

    List   graphicsAxis   = new ArrayList();    
    FontProperties       frameTitleFont = new FontProperties();
    LatexText            graphicsFrameTitle = new LatexText("");
    Dimension2D          frameDimensions    = new Dimension2D();
    PadMargins           axisFrameMargins   = new PadMargins();
    ColorPalette         zAxisPalette       = new ColorPalette();
    private Attributes   frameAttributes    = new Attributes();
    
    public GraphicsAxisFrame(){
        setAxis(3);
        initAttributes();
    }
    
    public GraphicsAxisFrame(int naxis){
        setAxis(naxis);
        initAttributes();
    }
    /**
     * sets the dimension of the graphics axis.
     * @param naxis 
     */
    public final void setAxis(int naxis){
        graphicsAxis.clear();
        for(int i = 0; i < naxis; i++){
            graphicsAxis.add(new GraphicsAxis());            
        }
    }
    
    
    public  Attributes getAttributes(){
        return this.frameAttributes;
    }
    
    private void initAttributes(){
        
        frameAttributes.addString(AttributeType.STRING_TITLE, "");
        frameAttributes.addString(AttributeType.STRING_TITLE_X, "");
        frameAttributes.addString(AttributeType.STRING_TITLE_Y, "");
        
        frameAttributes.add(AttributeType.AXIS_LINE_COLOR,  1);
        frameAttributes.add(AttributeType.AXIS_LINE_WIDTH,  1);
        frameAttributes.add(AttributeType.AXIS_LINE_STYLE,  1);
        
        frameAttributes.add(AttributeType.FILL_COLOR, -11);
        
        frameAttributes.add(AttributeType.AXIS_TICKS_SIZE, 15);
        frameAttributes.add(AttributeType.AXIS_TICKS_STYLE, 0);
        frameAttributes.add(AttributeType.AXIS_LABEL_OFFSET, 4);
        frameAttributes.add(AttributeType.AXIS_TITLE_OFFSET, 5);
        frameAttributes.add(AttributeType.AXIS_FRAME_STYLE, 1);
        
        frameAttributes.add(AttributeType.AXIS_GRID_X, 1);
        frameAttributes.add(AttributeType.AXIS_GRID_Y, 1);
        
        frameAttributes.add(AttributeType.AXIS_DRAW_X, 1);
        frameAttributes.add(AttributeType.AXIS_DRAW_Y, 1);
        frameAttributes.add(AttributeType.AXIS_DRAW_Z, 0);
        
        frameAttributes.copyValues(TStyle.getStyle());
    }
    /**
     * returns GraphicsAxis from the array with given index.
     * @param index
     * @return 
     */
    public GraphicsAxis   getAxis(int index){
        return this.graphicsAxis.get(index);
    }
    
    public double getPointX(double value){
        return graphicsAxis.get(0).getAxisPosition(value);
    }
    
    public double getPointY(double value){
        double frac  = graphicsAxis.get(1).getRange().getFraction(value);
        /*int xticks_y = (int) (this.frameDimensions.getDimension(1).getMax()
                graphicsAxis.get(1).getDimension().getMin());
          */
        int xticks_y = (int) (frameDimensions.getDimension(1).getMax() -  
                (graphicsAxis.get(1).getDimension().getMin() - frameDimensions.getDimension(1).getMin()));
        double length = graphicsAxis.get(1).getDimension().getLength();
        /*System.out.println(" X = " + xticks_y + "  data = "  + value + 
                " fraction = " + frac + " length = " + length);
        System.out.println(graphicsAxis.get(1).getRange());*/
        return xticks_y - frac*length;
    }
    
    public Point2D  getPoint(float x, float y){
        return new Point2D.Double(
                graphicsAxis.get(0).getAxisPosition(x),
                graphicsAxis.get(1).getAxisPosition(y)
        );
    }
    
    public Dimension2D getDimension(){
        return this.frameDimensions;
    }
    
    
    public void showAxis(){
        for(int i = 0; i < graphicsAxis.size(); i++){
            System.out.print(String.format("%3d : ", i));
            System.out.println(graphicsAxis.get(i));
        }
    }
    
    public void draw(Graphics2D g2d, Dimension2D frame){
        //System.out.println("FRAME DRAW " + frame);
        update(g2d);
        //System.out.println("GF : Axis X " + this.getAxis(0).getDimension());
        //System.out.println("GF : Axis Y " + this.getAxis(1).getDimension());
        /*
        graphicsAxis.get(0).setDimension(
                (int) (frame.getDimension(0).getMin() + this.axisFrameMargins.getLeftMargin()),
                (int) (frame.getDimension(0).getMax()-axisFrameMargins.getRightMargin()));
        */
        /*
        graphicsAxis.get(1).setDimension(
                (int) ( axisFrameMargins.getBottomMargin()),
                (int) (frame.getDimension(1).getMax()-axisFrameMargins.getTopMargin()));
        */
        /*
        graphicsAxis.get(0).setDimension(
                (int) frame.getDimension(0).getMin(),
                (int) frame.getDimension(0).getMax());
        graphicsAxis.get(1).setDimension(
                (int) frame.getDimension(1).getMin(),
                (int) frame.getDimension(1).getMax());
        */
        //System.out.println(" FRAME SET " + this.frameDimensions);
        int tickSize = frameAttributes.get(AttributeType.AXIS_TICKS_SIZE);
        int axisLabelOffset = frameAttributes.get(AttributeType.AXIS_LABEL_OFFSET);
        int axisColor       = frameAttributes.get(AttributeType.AXIS_LINE_COLOR);
        g2d.setColor(this.zAxisPalette.getColor3D(axisColor));
        g2d.setStroke(new BasicStroke(frameAttributes.get(AttributeType.AXIS_LINE_WIDTH)));
        /**
         * Drawing X axis Line and Ticks and Labels
         */
        
        /*int xticks_y = (int) (frame.getDimension(1).getLength()-
                graphicsAxis.get(1).getDimension().getMin());
        */
        int xticks_y = (int) (frameDimensions.getDimension(1).getMax() -  
                (graphicsAxis.get(1).getDimension().getMin() - frameDimensions.getDimension(1).getMin()));
        //System.out.println(" Y AXIS = " + graphicsAxis.get(1).getDimension());
        //System.out.println("DRAING AXIS X at Y = " + xticks_y);
        
        g2d.drawLine(
                (int) graphicsAxis.get(0).getDimension().getMin(),
                xticks_y,
                (int) graphicsAxis.get(0).getDimension().getMax(),
                xticks_y
                );        
        List    xTicks = graphicsAxis.get(0).getAxisTicks();
        List xTexts = graphicsAxis.get(0).getAxisLabels();
        
        for(int ix = 0; ix < xTicks.size(); ix++){
            
            int xtick = (int) graphicsAxis.get(0).getAxisPosition(xTicks.get(ix));
            /*System.out.println("drawing xtick  " + xTicks.get(ix)
            + "  X = " + xtick + "  Y = " + xticks_y);
            */
            g2d.drawLine(xtick,xticks_y,xtick,xticks_y-tickSize);
            
            xTexts.get(ix).drawString(g2d, xtick, xticks_y + axisLabelOffset, 1,0);
            /*
            Rectangle2D rect = xTexts.get(ix).getBounds(g2d);
            g2d.drawString(xTexts.get(ix).getText().getIterator(),
                    (int) (xtick - 0.5*rect.getWidth()),
                    (int) (xticks_y + 5 + rect.getHeight()));
            */
        }
        List  xMinorTicks = graphicsAxis.get(0).getAxisMinorTicks();
        for(int ix = 0; ix < xMinorTicks.size(); ix++){
            int xtick = (int) graphicsAxis.get(0).getAxisPosition(xMinorTicks.get(ix));
            g2d.drawLine(xtick,xticks_y,xtick,xticks_y-(int) (0.5* tickSize));
        }
        /**
         * Draw the Y-axis 
         */
        int yticks_x = (int) graphicsAxis.get(0).getDimension().getMin();
        
        g2d.drawLine( yticks_x,
                (int) (frame.getDimension(1).getLength() - graphicsAxis.get(1).getDimension().getMin()),
                yticks_x,
                (int) (frame.getDimension(1).getLength() - graphicsAxis.get(1).getDimension().getMax())
                );
        
        List    yTicks = graphicsAxis.get(1).getAxisTicks();
        List yTexts = graphicsAxis.get(1).getAxisLabels();
        for(int iy = 0; iy < yTicks.size(); iy++){
            int ytick = (int) getPointY(yTicks.get(iy));
            //System.out.println(" Draing axis Y "
            //+ " tick = " + yTicks.get(iy) +  "  position = " + ytick);
            /*(int) (
                    frame.getDimension(1).getLength()-
                    graphicsAxis.get(1).getAxisPosition(yTicks.get(iy))
                    );*/
            g2d.drawLine(yticks_x,ytick,yticks_x+tickSize,ytick);
            yTexts.get(iy).drawString(g2d, yticks_x-axisLabelOffset, ytick, 2,1);
            //xTexts.get(ix).drawString(g2d, xtick, xticks_y, 1,0);            
        }
        
        List  yMinorTicks = graphicsAxis.get(1).getAxisMinorTicks();
        for(int iy = 0; iy < yMinorTicks.size(); iy++){
            int ytick = (int) getPointY(yMinorTicks.get(iy));
            g2d.drawLine(yticks_x,ytick, yticks_x+ (int) (0.5*tickSize),ytick);
        }
        if(this.frameAttributes.get(AttributeType.AXIS_FRAME_STYLE)>0){
            
            g2d.drawRect(yticks_x, 
                    (int) ( xticks_y-this.graphicsAxis.get(1).getDimension().getLength()),
                    (int) this.graphicsAxis.get(0).getDimension().getLength(),
                    (int) this.graphicsAxis.get(1).getDimension().getLength()
                    );
        }
        /**
         * if needed the Z-axis will be drawn
         */
        
        //System.out.println("Drawing Z axis " + this.getAxis(2).getLog());
        if(this.frameAttributes.get(AttributeType.AXIS_DRAW_Z)>0){
            int x = (int) this.graphicsAxis.get(0).getDimension().getMax();
            int y = (int) ( this.frameDimensions.getDimension(1).getMin()
                    + this.axisFrameMargins.getTopMargin());
            int height = (int) this.graphicsAxis.get(1).getDimension().getLength();
            zAxisPalette.draw(g2d, x+4, y, 15, 
                    height,
                    0.0,400.0, this.getAxis(2).getLog());
        }
    }
    
    public void update(Graphics2D g2d){
        
        this.graphicsAxis.get(0).setDimension(
                (int) this.frameDimensions.getDimension(0).getMin(),
                (int) this.frameDimensions.getDimension(0).getMax());
        this.graphicsAxis.get(1).setDimension( 
                (int) this.frameDimensions.getDimension(1).getMin(),
                (int) this.frameDimensions.getDimension(1).getMax()
                );
        
        this.graphicsAxis.get(0).setAxisDivisions(10);
        this.graphicsAxis.get(1).setAxisDivisions(10);
        
        int yStringWidth  = graphicsAxis.get(1).getSize(g2d, true);
        int xStringHeight = graphicsAxis.get(0).getSize(g2d, false);
        /**
         * Adjust N-divisions to ovoid overlaps of numbers on the screen
         */
        double fractionX  = graphicsAxis.get(0).getLabelFraction(g2d, false);
        int    ndivisionsX = graphicsAxis.get(0).getAxisDivisions();
        while(fractionX>0.6&&ndivisionsX>2){
            ndivisionsX = ndivisionsX - 1;
            graphicsAxis.get(0).setAxisDivisions(ndivisionsX);
            fractionX = graphicsAxis.get(0).getLabelFraction(g2d, false);
        }
        
        
        double fractionY   = graphicsAxis.get(1).getLabelFraction(g2d, true);
        int    ndivisionsY = 10;
        
        while(fractionY>0.8&&ndivisionsY>2){
            ndivisionsY = ndivisionsY - 1;
            graphicsAxis.get(1).setAxisDivisions(ndivisionsY);
            fractionY = graphicsAxis.get(1).getLabelFraction(g2d, true);
        }
        
        //System.out.println(" y width = " + yStringWidth + "  x height = " + xStringHeight);
        this.axisFrameMargins.setLeftMargin(yStringWidth+5);
        this.axisFrameMargins.setRightMargin(15);
        this.axisFrameMargins.setBottomMargin(xStringHeight+5);
        this.axisFrameMargins.setTopMargin(10); 
        
        
        if(this.frameAttributes.get(AttributeType.AXIS_DRAW_Z)>0){
            int zAxisWidth = zAxisPalette.getAxisWidth(g2d, 0, 0, 15, 
                   (int) this.frameDimensions.getDimension(1).getLength()
                    , 0.0,400.0,this.getAxis(2).getLog());
            //System.out.println(" MARGINS RIGHT moved by " + zAxisWidth);
            this.axisFrameMargins.setRightMargin(15+zAxisWidth);
        }
        
        this.graphicsAxis.get(1).setDimension(
                (int) frameDimensions.getDimension(1).getMin()+axisFrameMargins.getBottomMargin(),
                (int) frameDimensions.getDimension(1).getMax()-axisFrameMargins.getTopMargin() );
        this.graphicsAxis.get(0).setDimension(
                (int) frameDimensions.getDimension(0).getMin()+axisFrameMargins.getLeftMargin(),
                (int) frameDimensions.getDimension(0).getMax()-axisFrameMargins.getRightMargin()
        );
               
    }
    
    public static void main(String[] args){
        GraphicsAxisFrame  frame = new GraphicsAxisFrame();
        frame.showAxis();
    }
}

 

Ads help maintain this website.