/*
 * 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.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;

import org.jlab.groot.base.FontProperties;
import org.jlab.groot.math.Dimension2D;

/**
 *
 * @author gavalian
 */
public class PaveText {
    
    private int N_COLUMNS = 1;
    List< List >  paveTexts = new ArrayList< List >();
    private Dimension2D      paveDimension = new Dimension2D();
    private FontProperties   paveFont      = new FontProperties();
    private int              yPadding      = 5;
    private int              xPadding      = 5;
    private int              ySpacing      = 2;
    private int              xSpacing      = 10;
    
    private Color            backgroundColor = Color.WHITE;
    
    public PaveText(int cols){
        this.N_COLUMNS = cols;
        this.paveDimension.set(100, 120, 100, 120);
        this.paveFont.setFontName("Avenir");
        this.paveFont.setFontSize(10);
    }
    
    public void addText(String... texts){
        if(texts.length!=this.N_COLUMNS){
            System.out.println(" ERROR : number of columns = " + this.N_COLUMNS);
            return;
        }
        List lt = new ArrayList();
        for(String item : texts){
            LatexText latex = new LatexText(item);
            latex.setFont(paveFont.getFontName());
            latex.setFontSize(paveFont.getFontSize());
            lt.add(latex);
        }
        this.paveTexts.add(lt);
    }
    
    public void setBackground(int r, int g, int b){
        this.backgroundColor = new Color(r,g,b);
    }
    
    public void setBackground(int r, int g, int b, int alpha){
        this.backgroundColor = new Color(r,g,b,alpha);
    }
    
    public void drawPave(Graphics2D g2d, int x , int y){
        
        if(this.paveTexts.isEmpty()==true) return;
        
        this.updateDimensions(g2d);
        g2d.setColor(this.backgroundColor);
        g2d.fillRect(
                (int) this.paveDimension.getDimension(0).getMin() - xPadding,
                (int) this.paveDimension.getDimension(1).getMin() - yPadding,
                (int) this.paveDimension.getDimension(0).getLength() + 2*xPadding,
                (int) this.paveDimension.getDimension(1).getLength() + 2*yPadding
        );
        
        g2d.setColor(Color.BLACK);
        g2d.drawRect(  
                (int) this.paveDimension.getDimension(0).getMin() - xPadding,
                (int) this.paveDimension.getDimension(1).getMin() - yPadding,
                (int) this.paveDimension.getDimension(0).getLength() + 2*xPadding,
                (int) this.paveDimension.getDimension(1).getLength() + 2*yPadding
                );
        /*g2d.drawRoundRect(
                (int) this.paveDimension.getDimension(0).getMin() - xPadding,
                (int) this.paveDimension.getDimension(1).getMin() - yPadding,
                (int) this.paveDimension.getDimension(0).getLength() + 2*xPadding,
                (int) this.paveDimension.getDimension(1).getLength() + 2*yPadding,
                20,20
        );*/
        int ystart = (int) this.paveDimension.getDimension(1).getMin();
        int xstart = (int) this.paveDimension.getDimension(0).getMin();
        //System.out.println("drawing....");
        for(List list : this.paveTexts){

            if(list.size()==2){
                list.get(0).drawString(g2d, xstart, ystart,0,0);
                list.get(1).drawString(g2d, 
                        (int) (xstart+paveDimension.getDimension(0).getLength()), ystart,2,0);
            }
            ystart += ySpacing;
        }
    }
    
    public void setPosition(int x, int y){
        this.paveDimension.getDimension(0).setMinMax(x,x + paveDimension.getDimension(0).getLength());
        this.paveDimension.getDimension(1).setMinMax(y,y + paveDimension.getDimension(1).getLength());
    }
    
    public Dimension2D  getBounds(){
        return this.paveDimension;
    }
    
    public void updateDimensions(Graphics2D g2d){
        FontMetrics fmg = g2d.getFontMetrics(new Font(paveFont.getFontName(),
                Font.PLAIN,paveFont.getFontSize()));
        double[] widths = new double[this.N_COLUMNS];
        double   height = 0; 
        for(List list : this.paveTexts){
            for(int i = 0; i < this.N_COLUMNS; i++){
                Rectangle2D rect = fmg.getStringBounds(list.get(i).getText().getIterator(), 0,
                        list.get(i).getText().getIterator().getEndIndex(),g2d);
                if(rect.getWidth()>widths[i]) widths[i] = rect.getWidth();
                height += rect.getHeight()/this.N_COLUMNS;
            }
        }
        
        double width = 0.0;
        for(int i = 0; i < widths.length; i++) width+= widths[i];
        ySpacing = (int) (1.1*height/this.paveTexts.size());
        
        this.paveDimension.getDimension(0).setMinMax(
                paveDimension.getDimension(0).getMin(), 
                paveDimension.getDimension(0).getMin() + width + xSpacing
                );
        this.paveDimension.getDimension(1).setMinMax(
                paveDimension.getDimension(1).getMin(), 
                paveDimension.getDimension(1).getMin() + ySpacing*this.paveTexts.size()
        );
        //ySpacing = (int) (1.2*height/this.paveTexts.size());
        /*System.out.println("HEIGHT = " + height + "  spacing = " + ySpacing);
        for(int i = 0; i < widths.length; i++)
            System.out.println("WIDTHS = " + widths[i]);
        */
    }
    
    public void setFont(String name){
        this.paveFont.setFontName(name);
        for(List texts : this.paveTexts){
            for(LatexText text : texts){
                text.setFont(name);
            }
        }
    }
    
    public void setFontSize(int size){
        this.paveFont.setFontSize(size);
        for(List texts : this.paveTexts){
            for(LatexText text : texts){
                text.setFontSize(size);
            }
        }
    }
    
    public List> getPaveTexts(){
        return this.paveTexts;
    }
    
    public void  setPaveTexts(List> paveTexts){
        this.paveTexts = paveTexts;
    }
    
    public void copy(PaveText pave){
        this.paveTexts.clear();
        for(List  texts : pave.getPaveTexts()){
            
        }
    }

	public void addRow(List element) {
		paveTexts.add(element);
	}
}

 

Ads help maintain this website.