package com.idega.graphics.generator; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import com.idega.graphics.encoder.gif.Gif89Encoder; import com.idega.util.FileUtil; import com.idega.util.IWColor; import com.idega.util.text.TextSoap; /** * Title: * Description: * Copyright: Copyright (c) 2001 * Company: idega software * @author Eirikur S. Hrafnsson eiki@idega.is * @version 1.0 */ public class Button { private static Color defaultBorderColor = new Color(85,87,92); private static int defaultBorderSize = 1; private static Color defaultUnderColor = new Color(148,151,156); private static Color defaultOverColor = Color.white; private static Color defaultFillColor = new Color(201,203,206); private static Color defaultFontColor = Color.black; private static Color defaultHightlightColor = new Color(221,223,226); public static String BUTTON_UP = "_BUTTON_UP"; public static String BUTTON_OVER = "_BUTTON_OVER"; public static String BUTTON_DOWN = "_BUTTON_DOWN"; protected Color underColor = defaultUnderColor; protected Color fillColor = defaultFillColor; protected Color overColor = defaultOverColor; protected Color borderColor = defaultBorderColor; protected Color fontColor = defaultFontColor; protected Color highlightColor = defaultHightlightColor; //Used for the transparancy protected Color backgroundColor=Color.cyan; protected int borderSize = defaultBorderSize; protected boolean drawBorder = true; protected int width = 54; protected int height = 15; int tWidth = 0; int tHeight = 0; protected int doubleBorder = (2*this.borderSize); protected int textXPos = 5; protected int textYPos = 10; protected int verticalPadding = 5; public String buttonUpName; public String buttonDownName; public String buttonOverName; private String text; private String name = null; private Font font; private BufferedImage image; private Graphics2D g; private boolean resize = false; private boolean onlyCreateUpState = false; public Button() { this(""); } public Button(String text) { this.text = text; } public Button(String text, Font font) { this(text); this.font = font; } public Button(String text, int width, int height) { this(text); this.width = width; this.height = height; } public Button(String text, int width, int height, Color fillColor) { this(text,width,height); this.fillColor = fillColor; this.highlightColor = fillColor.brighter(); } public Button(String text, Color fillColor) { this(text); this.fillColor = fillColor; this.highlightColor = fillColor.brighter(); } /** * This method allows direct generating of buttons through a command line or cgi script<br/> * the allowed parameters in correct order are<br/> * 1:inputfile 2:fillcolor 3:highlightcolor 4:width 5:height 6:pathtofontfile 7:fontsize */ public static void main(String[] args) { try{ List tokenizers = FileUtil.getCommaSeperatedTokensFromLinesFromFile(args[0],"="); Button button = new Button(); button.fillColor = IWColor.getAWTColorFromHex(args[1]); button.highlightColor = IWColor.getAWTColorFromHex(args[2]); File file = new File(args[5]); FileInputStream fis = new FileInputStream(file); Font font = Font.createFont(Font.TRUETYPE_FONT, fis); button.setFont(font.deriveFont(Float.parseFloat(args[6]))); //button.setFont(font.deriveFont(10f)); button.onlyCreateUpState(true); Iterator iter = tokenizers.iterator(); while (iter.hasNext()) { StringTokenizer tokens = (StringTokenizer)iter.next(); while(tokens.hasMoreTokens()){ button.name = tokens.nextToken(); button.text = tokens.nextToken().toUpperCase(); } button.width = Integer.parseInt(args[3]); button.height = Integer.parseInt(args[4]); button.resize = false; button.generate(); } } catch(Exception e){ e.printStackTrace(System.err); } System.exit(0); } /** * * @uml.property name="fontColor" */ public void setFontColor(Color color) { this.fontColor = color; } /** * * @uml.property name="font" */ public void setFont(Font theFont) { this.font = theFont; } /** * * @uml.property name="fillColor" */ public void setFillColor(Color color) { this.fillColor = color; } /** * * @uml.property name="highlightColor" */ public void setHighlightColor(Color color) { this.highlightColor = color; } /** * * @uml.property name="borderColor" */ public void setBorderColor(Color color) { this.borderColor = color; } /** * * @uml.property name="overColor" */ public void setOverColor(Color color) { this.overColor = color; } /** * * @uml.property name="underColor" */ public void setUnderColor(Color color) { this.underColor = color; } public void onlyCreateUpState(boolean onlyCreateUpState){ this.onlyCreateUpState = onlyCreateUpState; } public String getUpName(){ return this.buttonUpName; } public String getOverName(){ return this.buttonOverName; } public String getDownName(){ return this.buttonDownName; } public String getStaticButtonDownString(){ return BUTTON_DOWN; } public String getStaticButtonUpString(){ return BUTTON_UP; } public String getStaticButtonOverString(){ return BUTTON_OVER; } /** * * @uml.property name="width" */ public int getWidth() { return this.width; } /** * * @uml.property name="height" */ public int getHeight() { return this.height; } /* public Color getHighlightColor(){ highlightColor = color; new Color(fillColor.getRed()+20,fillColor.getGreen()+20,fillColor.getBlue()+20); }*/ public void generate() { generate(""); } public void generate(String folderPath) { this.image = new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB); this.g = this.image.createGraphics(); this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if( this.font!= null ){ this.g.setFont(this.font); } else { System.out.println("FONT IS NULL"); } fitText(this.g); if( this.resize ){ this.image = new BufferedImage(this.width,this.height,BufferedImage.TYPE_INT_RGB); this.g = this.image.createGraphics(); this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if( this.font!= null ) { this.g.setFont(this.font); } } makeButton(this.g,this.text,this.image,folderPath,getStaticButtonUpString()); if( !this.onlyCreateUpState ){ makeButton(this.g,this.text,this.image,folderPath,getStaticButtonOverString()); makeButton(this.g,this.text,this.image,folderPath,getStaticButtonDownString()); } } public void fitText(Graphics2D g){ FontMetrics fm = g.getFontMetrics(g.getFont()); //System.out.println("Leading : "+fm.getLeading()); /*System.out.println("string width : "+fm.stringWidth(text)); System.out.println("string height : "+fm.getHeight()); System.out.println("string ascend : "+fm.getAscent());*/ this.tWidth = fm.stringWidth(this.text); this.tHeight = fm.getAscent(); if( this.tWidth >= this.width ){ this.width = this.tWidth+(2*this.verticalPadding); this.resize = true; } this.textXPos = (this.width-this.tWidth)/2; this.textYPos = ((this.height+this.tHeight)/2)-1; } public void makeButton(Graphics2D g, String text, Image image, String filename, String effect){ // g.setStroke(new BasicStroke(0.5f)); if( this.drawBorder){ g.setColor(this.borderColor); g.fillRect(0,0,this.width,this.height); } if(effect==BUTTON_DOWN) { g.setColor(this.underColor); } else { g.setColor(this.overColor); } g.fillRect(this.borderSize,this.borderSize,this.width-this.borderSize-2,this.height-this.doubleBorder-1); if(effect==BUTTON_OVER) { g.setColor(this.highlightColor); } else { g.setColor(this.fillColor); } g.fillRect(this.doubleBorder,this.doubleBorder,this.width-this.doubleBorder-2,this.height-this.doubleBorder-2); if(effect==BUTTON_DOWN) { g.setColor(this.overColor); } else { g.setColor(this.underColor); } //g.setStroke(new BasicStroke(1f)); g.drawLine(this.borderSize,this.height-this.doubleBorder,this.width-this.borderSize-1,this.height-this.doubleBorder); g.drawLine(this.width-this.borderSize-1,this.height-this.doubleBorder,this.width-this.borderSize-1,this.doubleBorder-1); //g.setStroke(new BasicStroke(2f)); //g.drawLine(0,height,width,0); if( effect==BUTTON_DOWN ) { this.textYPos++; } g.setColor(this.fontColor); g.drawString(text,this.textXPos,this.textYPos); encode(image,filename,effect); } public void encode(Image image, String path, String effect){ try { //GIFEncoder encode = new GIFEncoder(image); //net.jmge.gif.Gif89Encoder gif89aEncoder = new net.jmge.gif.Gif89Encoder(image); Gif89Encoder gif89aEncoder = new Gif89Encoder(image); //gif89aEncoder.setTransparentIndex(0); gif89aEncoder.setTransparentColor(this.backgroundColor); String sName = null; if( this.name==null ){ StringBuffer name = new StringBuffer(); name.append(TextSoap.findAndReplace(this.text," ","")); name.append(this.width); name.append("x"); name.append(this.height); name.append(effect); name.append(".gif"); sName = name.toString(); } else {//only used for multiple button generation from localized.strings file. sName = this.name; if( effect != getStaticButtonUpString() ){ sName+=effect; } sName+=".gif"; } sName= sName.toLowerCase(); path+=sName; // System.out.print("BUTTON NAME : "+sName); if( effect == getStaticButtonUpString() ){ this.buttonUpName = URLEncoder.encode(sName); } else if( effect == getStaticButtonDownString() ){ this.buttonDownName = URLEncoder.encode(sName); } else{ this.buttonOverName = URLEncoder.encode(sName); } //FileUtil.delete(path); why??? OutputStream output = new BufferedOutputStream(new FileOutputStream(path)); //encode.Write(output); gif89aEncoder.encode(output); output.close(); } catch (Exception e) { e.printStackTrace(System.out); } } /** * @return * * @uml.property name="font" */ public Font getFont() { return this.font; } }