KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > zirc > msg > AbstractMessage


1 package zirc.msg ;
2
3 import java.util.* ;
4
5 import zirc.base.* ;
6 import zirc.gui.* ;
7
8 /**
9  * <p>Title: vIrc</p>
10  * <p>Description: irc client</p>
11  * <p>Copyright: Copyright (c) 2004</p>
12  * <p>Company: AJSA</p>
13  * @author AJSA
14  * @version 1.0
15  */

16
17 //
18
//Classe contenant un message standard destiné à etre affiché et/ou envoyé.
19
//
20

21 /**
22  * <p>AbstractMessage est une classe non instanciable qui contient les méthodes de
23  * bases utilisées par les messages.<br>
24  * Les messages ne sont pas seulement ce qui se dit sur le chat mais également
25  * tous les ordres et commandes reçus ou envoyés.</p>
26  *
27  * <p>Toutes les classes Message héritent de cette classe.</p>
28  *
29  * <p>Les <b>SEULES</b> méthodes destinées à être appelées depuis l'extérieur sont<br>
30  *<code>affiche()</code> qui affiche le texte dans la fenetre<br>
31  *<code>reagit()</code> qui définit une réaction au message</p>
32  *
33  * Les classes messages ont besoin de redéfinir les méthodes suivantes si nécessaire:
34  * <p>
35  * <code>parseMessagePourAffichage</code> dont la valeur renvoyée est le texte affiché dans la fen.<br>
36  * <code>toHtml</code> essentiellement pour ajouter une couleur selon le type de message<br>
37  * <code>reagit</code> si le message demande une réaction
38  * </p>
39  */

40
41 public abstract class AbstractMessage
42 {
43
44   //frame dans laquelle afficher
45
/**
46    * frm -> fenêtre de chat qui accueille l'affichage du message dans son champ
47    * HTML
48    */

49   protected AbstractChatFrame frm ;
50
51   //un vecteur de couleurs
52
/**
53    * vectColors -> vecteurs de strings à 16 positions, ses indices correspondent
54    * au standard Mirc.
55    */

56   public static String JavaDoc[] vectColors =
57       {
58       "#FFFFFF", //blanc
59
"#000000", //noir
60
"#00007F", //bleu marin
61
"#009300", //vert olive
62
"#FF0000", //rouge
63
"#7F0000", //brun
64
"#7F007F", //violet
65
"#FFA500", //orange
66
"#FFFF00", //jaune
67
"#00FF00", //vert clair
68
"#007F7F", //vert foncé
69
"#00FFFF", //cyan
70
"#0000FF", //bleu
71
"#FF00FF", //magenta
72
"#7F7F7F", //gris
73
"#C0C0C0"} ; //gris clair
74

75   //code des balises Mirc
76
public static char mircColorCode = '\u0003' ;
77   public static char mircBoldCode = '\u0002' ;
78   public static char mircUnderlineCode = '\u001F' ;
79   public static char mircEraseCode = '\u000F' ;
80
81   //connexion propriétaire du message
82
protected IRCconnexion ircChan ;
83
84   //message contenu
85
protected String JavaDoc Message ;
86
87   /**
88    * AbstractMessage constructeur par défaut, il faudra le redéfinir
89    */

90   public AbstractMessage()
91   {
92
93   }
94
95   /**
96    * AbstractMessage est un constructeur par paramètres, contient les objets minimaux
97    * qui constituent un message
98    *
99    * @param _ircChan IRCconnexion L'objet de type Ircconnexion qui a reçu le message
100    * @param _frm AbstractChatFrame Fenêtre dans laquelle le message doit s'afficher
101    * @param _message String Message à l'état Brut (sans parse).
102    */

103   public AbstractMessage(IRCconnexion _ircChan, AbstractChatFrame _frm, String JavaDoc _message)
104   {
105     this.ircChan = _ircChan ;
106     this.frm = _frm ;
107     this.Message = _message ;
108   }
109
110   public AbstractMessage(IRCconnexion _ircChan, String JavaDoc _message)
111   {
112     this.ircChan = _ircChan ;
113     this.frm = _ircChan.GetStatusFrm() ;
114     this.Message = _message ;
115   }
116
117   //affiche dans la iframe
118
/**
119    * affiche s'occupe de l'affichage du message dans la fenêtre
120    * désignée par <code>frm</code>. Elle utilise les méthodes
121    *
122    * <p>
123    * parseMessagePourAffichage pour obtenir le texte tel qu'il doit etre affiché<br>
124    * ToHtml Pour la conversion en HTML<br>
125    * </p>
126    */

127   public void affiche()
128   {
129     if (frm != null)
130     {
131       //enlever la partie inintéressante
132
String JavaDoc txtAffiche = parseMessagePourAffichage(Message) ;
133
134       //enregistrer la longeur approximative du message avant sa modification
135
int longApprox = txtAffiche.length() + 1 ;
136
137       //convertir tout ca en html
138
StringBuffer JavaDoc htmlMsg = toHtml(txtAffiche) ;
139
140       //mettre un séparateur si il y a lieu
141
if (hasSeparator())
142       {
143         htmlMsg.insert(0, "-<BR>") ;
144         longApprox++ ;
145       }
146
147       //afficher
148
try
149       {
150         frm.displayTxt(htmlMsg, longApprox, informeUser()) ;
151       }
152       catch (Exception JavaDoc e)
153       {
154       }
155     }
156   }
157
158 //envoie la commande
159
/**
160    * envoiCommande est une méthode servant à envoyer une commande au serveur IRC.
161    *
162    * @param _com String Commande à envoyer sous forme de chaine de caractère.
163    */

164   protected void envoiCommande(String JavaDoc _com)
165   {
166     ircChan.sendCommand(_com) ;
167   }
168
169 //réagit au message
170
/**
171    * reagit est appelée automatiquement, permet de réagir à un message
172    * reçu, par exemple d'envoyer la réponse à la question du serveur.
173    */

174   public void reagit()
175   {
176
177   }
178
179 //transforme les codes de couleurs en code HTML
180
/**
181    * StringColors sert à remplacer les balises de couleurs Mirc
182    * par des balises HTML.
183    * Elle est appelée implicitement par la méthode toHtml
184    *
185    * @param _message String La chaine de caractère à traiter
186    * @return String La chaine modifiée
187    */

188
189   protected static void StringColors(StringBuffer JavaDoc _message)
190   {
191
192     //Pour savoir comment mirc gère les couleurs allez faire un saut sur
193
//http://voxx.demon.co.uk/mirc/mircdisp.php?filename=00000067.txt
194

195     int ind ; //indice de 'rech' dans msg
196
int backGrnd = 0 ; //couleur de highlight du texte
197
int foreGrnd = 1 ; //couleur de texte
198

199     char digit ; //contient un caractere de test
200
boolean backDefini = false ; //devient vrai si on a du mettre un back autre que blanc
201

202     StringBuffer JavaDoc msg = _message ; //chaine a traiter
203

204     String JavaDoc rech = mircColorCode + "" ; //la balise de couleur mirc a rechercher
205

206     String JavaDoc htmlCode1 ; //les textes de remplacement
207
String JavaDoc htmlCode2 ; //
208

209     int base ; //le nombre de caracteres qui composent la balise mirc (c'est variable)
210

211     //
212
//ICI, traiter toutes les balises mirc de couleur.
213
//
214
ind = msg.indexOf(rech) ;
215     while (ind > -1)
216     {
217       //trouvé un
218
base = 0 ;
219       foreGrnd = 1 ; //par def, couleur de front noire
220

221       try
222       {
223         base = 1 ;
224         digit = msg.charAt(ind + base) ;
225         if (Character.isDigit(digit))
226         {
227           base++ ;
228           foreGrnd = Character.getNumericValue(digit) ;
229
230           //essaie de parser le 2e car
231
digit = msg.charAt(ind + base) ;
232           if (Character.isDigit(digit))
233           {
234             base++ ;
235             foreGrnd = foreGrnd * 10 + Character.getNumericValue(digit) ;
236           }
237
238           //le caractère suivant doit être une virgule
239
digit = msg.charAt(ind + base) ;
240           if (digit == ',')
241           {
242             //on est dans le background a présent
243
backDefini = true ;
244             base++ ;
245             digit = msg.charAt(ind + base) ;
246             if (Character.isDigit(digit))
247             {
248               base++ ;
249               backGrnd = Character.getNumericValue(digit) ;
250
251               //essaie de parser le 2e car
252
digit = msg.charAt(ind + base) ;
253               if (Character.isDigit(digit))
254               {
255                 base++ ;
256                 backGrnd = backGrnd * 10 + Character.getNumericValue(digit) ;
257               }
258             }
259           }
260         }
261       }
262       catch (StringIndexOutOfBoundsException JavaDoc e)
263       {
264         //cela peut arriver si on est en fin de chaine, c'est pas grave du tout.
265
}
266
267       //ok le remplacement peut intervenir
268
//le modulo permet d'etre sur d'avoir une couleur entre 0 et 15 sinon Exception
269
foreGrnd %= 16 ;
270       backGrnd %= 16 ;
271
272       //la couleur du texte....
273
htmlCode1 = "<font color='" + vectColors[foreGrnd] + "' " ;
274
275       //la couleur du fond
276
if (backDefini = true)
277       {
278         //si fond a été défini AU MOINS une fois, on doit TOUJOURS donner l'instruction
279
//de la couleur de fond sans quoi ça affiche n'importe quoi
280
//(un peu space le html en java)
281
htmlCode2 = " style='background:" + vectColors[backGrnd] + ";'>" ;
282       }
283       else
284       {
285         //sinon on se contente de fermer la balise font
286
htmlCode2 = ">" ;
287       }
288
289       msg.replace(ind, ind + base, htmlCode1 + htmlCode2) ;
290
291       //rajoute un FONT final a la fin
292
msg.append("</font>") ;
293
294       //caractere de couleur suivant
295
ind = msg.indexOf(rech, ind - 1) ;
296
297     }
298   }
299
300   /**
301    * StringReplacer sert à remplacer un caractère de mise en forme
302    * Mirc donné en paramètre par des balises HTML elles-aussi données en
303    * parametres. Elle est donc utilisée dans le cadre de l'affichage des
304    * couleurs, du gras, de la mise en forme etc..
305    * Elle est appelée implicitement par la méthode toHtml
306    *
307    * @param _token char le caractère à rechercher
308    * @param _baliseO String la balise HTML d'ouverture
309    * @param _baliseF String la balise HTML de fermeture
310    * @param _message String Le message à traiter
311    * @return String - Le message modifié
312    */

313   protected static void StringReplacer(char _token, String JavaDoc _baliseO, String JavaDoc _baliseF,
314                                        StringBuffer JavaDoc _message)
315   {
316     //nombre de passage
317
int num = 0 ;
318     int ind = 0 ; //index de postion
319

320     String JavaDoc rech = _token + "" ;
321
322     //true: balise fermee, false: balise ouverte
323
boolean complete = true ;
324
325     ind = _message.indexOf(rech) ;
326     while (ind > -1)
327     {
328
329       //remplacer
330
if (num % 2 == 0)
331       {
332         //ouvrir balise
333
_message.replace(ind, ind + 1, _baliseO) ;
334         complete = false ;
335       }
336       else
337       {
338         //fermer balise
339
_message.replace(ind, ind + 1, _baliseO) ;
340         complete = true ;
341       }
342
343       ind = _message.indexOf(rech) ;
344       num++ ;
345     }
346
347     //ajoute la balise de fermeture si la derniere balise etait celle d'ouverture
348
if (!complete)
349     {
350       _message.append(_baliseF) ;
351     }
352
353   }
354
355 //convertir en html pour affichage
356
/**
357    * toHtml gère tout le passage d'un message texte standard au format HTML,
358    * c'est elle qui s'occupe des couleurs, de la mise en forme et du découpage.
359    * Elle est appelée implicitement par la méthode affiche().
360    *
361    * @param _txtAffich String -Texte a convertir en HTML
362    * @return String -Texte au format HTML
363    */

364   protected StringBuffer JavaDoc toHtml(String JavaDoc _txtAffich)
365   {
366
367     StringBuffer JavaDoc HtmlMsg = new StringBuffer JavaDoc() ;
368     String JavaDoc tmp ;
369     StringBuffer JavaDoc temp ;
370
371     //ici, splitter la chaine pour la mise en forme
372
StringTokenizer stk = new StringTokenizer(_txtAffich, mircEraseCode + "") ;
373
374     //ici gérer la mise en forme par des balises ou styles CSS
375
while (stk.hasMoreTokens())
376     {
377
378       tmp = stk.nextToken() ;
379
380       //si il y a au moins 2 blancs consécutifs, écrase tous les blancs avec
381
//des chars html sécables
382
if (tmp.indexOf(" ") > 0)
383       {
384         temp = new StringBuffer JavaDoc(tmp.replaceAll(" ", "&#32;")) ;
385       }
386       else
387       {
388         temp = new StringBuffer JavaDoc(tmp) ;
389       }
390
391       StringReplacer('\u0002', "<b>", "</b>", temp) ; //bold
392
StringReplacer('\u001F', "<u>", "</u>", temp) ; //underline
393
StringReplacer('\u0016',
394                      "<font style='background:#000000;color:white'>", "</font>",
395                      temp) ;
396
397       //ici, les couleurs_txtAffich
398
StringColors(temp) ;
399
400       HtmlMsg.append(temp) ;
401     }
402
403     setColor(HtmlMsg) ;
404
405     return HtmlMsg ;
406   }
407
408   /**
409    * parseMessagePourAffichage doit à partir du message brut reçu, extraire la
410    * partie qui sera affichée à l'utilisateur, Elle sert juste à parser le texte
411    * pour lui donner sa forme présentable. La méthode affiche() y a recours.
412    *
413    * @param _txtAffiche String - Le message brut tel que reçu
414    * @return String - le message parsé qui sera effectivement affiché
415    */

416   protected String JavaDoc parseMessagePourAffichage(String JavaDoc _txtAffiche)
417   {
418     return _txtAffiche ;
419   }
420
421   protected void setColor(StringBuffer JavaDoc _htmlMsg)
422   {
423
424   }
425
426   protected boolean hasSeparator()
427   {
428     if (frm == ircChan.GetStatusFrm())
429     {
430       return true ;
431     }
432
433     return false ;
434   }
435
436   protected boolean informeUser()
437   {
438     return true ;
439   }
440
441 }
442
Popular Tags