/*
 Component SmileyTextArea,
   which is intended to be part of Eteria IRC Client from Javier Kohen
 2001 written by Frank Bartels for Splendid Internet GmbH, Kiel, Germany
 */
 
 package com.splendid.awtchat;
 
 import java.io.*;
 import java.awt.*;
 import java.awt.image.ImageObserver;
 
 import java.awt.event.*;
 import java.util.*;
 
 import ar.com.jkohen.awt.NickInfoPopup;
 import ar.com.jkohen.awt.event.NewMouseWheelEvent;
 import ar.com.jkohen.util.Resources;
 
 
 
 public class SmileyTextArea extends Panel implements ImageObserver
 {
   public static Font DEFAULT_FONT = new Font("SansSerif", Font.PLAIN, 12);
   
   private static Resources res;
 
   public static int SMOOTH = 0;
   public static int FAST = 1;
   public static int SAFE = 2;  // mode's possible values

 
   private SmileyTextAreaArea smileyText; // the text area

   private Scrollbar scrollbar;		   // the scrollbar

   private NickInfoPopup nick_pop;
 
   // stuff for saving the smileys (prepared on init())

   static Hashtable smileys = null;
   static int maxCodeLength = 1;
   static int maxSmileyHeight = 0;
   static boolean staticinitialized = false;
 
   // ====== Constructor, init() ======

 
   /** Constructor. supply HyperlinkReceiver for getting the clicked URLs
 	*/
 	
 	public SmileyTextArea(HyperlinkReceiver hr, CopyText cp)
 	{
 		super();
 		setLayout(new BorderLayout());
 		nick_pop = new NickInfoPopup();
 		scrollbar = new Scrollbar(Scrollbar.VERTICAL, 5, 5, 0, 10); //val,vis,min,max 0,5,0,10->0..5

 		//scrollbar.setBackground(SystemColor.text);

 		smileyText = new SmileyTextAreaArea(this, scrollbar, hr, cp, nick_pop);
 		add(smileyText, "Center");
 		add(scrollbar, "East");
 		add(nick_pop, "West");
 		init();
 
 		enableWheelEvt(true);
 		enableEvents(WindowEvent.WINDOW_EVENT_MASK);
 		
 		// Determine the maximum height of smileys

 		if (smileys != null)
 		{
 			for (Enumeration e = smileys.elements(); e.hasMoreElements(); )
 			{
 			
 				Image i = (Image)e.nextElement();
 				if (i != null)
 				{
 					int h = i.getHeight(this);
 					if (maxSmileyHeight < h)
 					maxSmileyHeight = h;
 				}
 			}
 		}
 	}
 
   // Is called above

 	public static void init()
 	{
 //		this.sp = sp;

 		if (staticinitialized)
 			return;
 
 		smileys = new Hashtable();
 
 //		Read smileys from resource file

 //		EIRC WORKAROUND #35.

 //	  Resource res=Resource.getBundle("com.splendid.awtchat.Smileys");

 
 		maxCodeLength = 1;
 		for (Enumeration e = res.img_resource.propertyNames(); e.hasMoreElements() ;)
 		{
 			String key = (String)e.nextElement();
 		
 //			this version needs entries like (you could use 123 or thisnthat instead of sad):

 //			smiley.sad.emoticons=:-( :( :-<

 //			smiley.sad.image=smileys/sm_sad.gif

 	  
 			int imagepos = key.indexOf(".image");
 			if ((key.indexOf("smiley.") == 0 || key.indexOf("symbol.") == 0) && imagepos >= 8)
 			{
 				try
 				{
 					String filename = res.getLabel(key);
 					String smiley = res.getLabel(key.substring(0, imagepos) + ".emoticons");
 					StringTokenizer st = new StringTokenizer(smiley);
 					while (st.hasMoreTokens())
 					{
 						String code = (String)st.nextToken();	// the other are the ascii codes

 						Image image = res.getImage(key);
 						smileys.put(code, image);
 						if (code.length() > maxCodeLength)
 							maxCodeLength = code.length();
 					}
 				}
 				catch (MissingResourceException mre) {}			// ignore errors

 		  	}
 
 //		this version commented out: smiley.sad=smileys/sm_sad.gif :-( :( :-<

 //			if (key.indexOf("smiley.") == 0)

 //			{

 //				String smiley = res.getString(key);

 //				StringTokenizer st = new StringTokenizer(smiley);

 //				String filename = (String)st.nextToken();		// first token is filename

 //				while (st.hasMoreTokens())

 //				{

 //					String code = (String)st.nextToken();		// the other are the ascii codes

 //					addSmiley(filename, code, sp);

 //					if (code.length()>maxCodeLength)

 //						maxCodeLength = code.length();

 //				}

 //			}

 		}
 		staticinitialized = true;
 	}
 	
 	public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
 	{
 		return(true);
 	}
 
 //	public synchronized void addTextListener(TextListener l)

 //	{

 //	}

 
   // ====== SubsequentIndent ======

 
   /** set the indent of subsequent lines (>=0) if a line must be split (default is 12)
 	*/
 	
   public void setSubsequentIndent(int indent) // allowed values: 0 and greater

   { if (indent<0) indent=0;
 	smileyText.setSubsequentIndent(indent);
   }
   
   /** get the indent of subsequent lines if a line must be split (default is 12)
 	*/
 	
   public int getSubsequentIndent()
   { return(smileyText.getSubsequentIndent());
   }
 
   // ====== Colors ======

 
   public void setBackground(Color c)
   {
   	smileyText.setBackground(c);
   }
 
   public Color getBackground()
   {
   	return(smileyText.getBackground());
   }
   
   public void setForeground(Color c)
   {
   	smileyText.setForeground(c);
   }
   
   public Color getForeground()
   {
   	return(smileyText.getForeground());
   }
 
   public void setSelectedBackground(Color c)
   {
   	smileyText.setSelectedBackground(c);
   }
   
   public Color getSelectedBackground()
   {
   	return(smileyText.getSelectedBackground());
   }
   
   /** change one of the color paette entries (n may be a number from 0 to 15,
 	* it corresponds to the number associated with MircMessage.COLOR IRC attribute)
 	*/
   public void setColorPaletteEntry(int n, Color c)
   {
   	smileyText.setColorPaletteEntry(n, c);
   }
 
   /** get one of the color palette entries (n may be a number from 0 to 15,
 	* it corresponds to the number associated with MircMessage.COLOR IRC attribute)
 	*/
 	
   public Color getColorPaletteEntry(int n)
   {
   	return(smileyText.getColorPaletteEntry(n));
   }
 
   /** get the static color palette.
 	*/
 	
   public static Color [] getColorPalette()
   {
   	return(SmileyTextAreaArea.fixedColors);
   }
   
   public static void setColors(Color palette[])
   {
 	SmileyTextAreaArea.setColorPalette(palette);
   }
 
   // ====== Font ======

 
   /** change the font (only name and size are used)
 	*/
 	
   public void setFont(Font f)
   {
   	smileyText.changeFont(f.getName(), f.getSize());
   }
 
   /** change the font
 	*/
 	
   public void setFont(String name, int size)
   {
   	smileyText.changeFont(name, size);
   }
 
   /** get the actual base font (not bold and not italic)
 	*/
 	
   public Font getFont()
   {
   	return(smileyText.getFont());
   }
 	
   // ====== Append ======

 
   /** set the length of the text buffer (number of appends after which old text is deleted)
 	  (set -1 for infinite buffer)
 	*/
 	
   public void setBufferlen(int bufferlen)
   {
   	smileyText.setBufferlen(bufferlen);
   }
 
   /** get the length of the text buffer (number of appends after which old text is deleted)
 	  (-1 means infinite buffer)
 	*/
 	
   public int getBufferlen()
   {
   	return(smileyText.getBufferlen());
   }
 
   // ====== Append ======

 
   /** insert a line of text (smileys, URLs and IRC attributes interpreted)
 	* (URLs == http://* | https://* | ftp://* | www.* | #*  (case is ignored))
 	* (IRC attributes are (from MircMessage) BELL, BOLD, ITALIC,
 	*  UNDERLINE, COLOR, REVERSE, RESET)
 	*/
 	
   public void append(String s)
   {
   	if (s == null || s.length() == 0)
 		s = "\n";
  	smileyText.append(s, true);
   }
 
   /** same as append, except, URL interpretation is suppressed (channels, email, web-adresses)
 	*/
 	
   public void appendNoUrls(String s)
   {
   	smileyText.append(s, false);
   }
   
   /** same as append, but add a NickInfoPopup
 	*/
 	
   public void appendNickInfo(String s, boolean b, String n)
   {
  	smileyText.append(s, b, n);
   }
 	// ====== Scroll ======

 
   public void home()
   {
   	smileyText.setSbTop();
   }
   
   /** Scrolling display mode, may be SMOOTH, FAST, SAFE (initially it is SMOOTH)
 	* Set mode to FAST if problems arise with smooth scrolling
 	* Set mode to SAFE if problems arise with any scrolling (always pains the whole)
 	*/
 	
   public void setMode(int mode)
   {
   	smileyText.setMode(mode);
   }
   
   //** Define if each line can be broken into multiples lines
 
   public void setBreaks(boolean canBreak)
   {
   	smileyText.setBreaks(canBreak);
   }
   
   //** Define tabulations
 
   public void setTabs(int tabs[])
   {
   	for (int i = 0; i < tabs.length; i++)
   		smileyText.addTab(tabs[i]);
   }
   
 
   //** Erase everything
   
   public void clear()
   {
   	smileyText.clean();
   }
   
   public void setSelectable(boolean b)
   {
   	smileyText.isSelectable = b;
   }
   
   /* Mouse Wheel support */
   
 	public void enableWheelEvt(boolean b)
 	{
 		if (b && NewMouseWheelEvent.EventMask > 0)
 			enableEvents(NewMouseWheelEvent.EventMask);
 		else
 			disableEvents(NewMouseWheelEvent.EventMask);
 	}
 
 	public void mouseWheelMoved(NewMouseWheelEvent ev)
 	{
 		if (ev != null)
 			smileyText.setRawSbValue(scrollbar.getValue() + ev.getUnitsToScroll());
 	}
 
 	public void processEvent(AWTEvent ev)
 	{
 		if (ev.getClass() == NewMouseWheelEvent.EventClass)
 			mouseWheelMoved(new NewMouseWheelEvent((MouseEvent)ev));
 		
 		super.processEvent(ev);
 	}  
 }