/*
* Author: pascal Created on 03.03.2005 TODO To change the template for this generated file go to Window -
* Preferences - Java - Code Style - Code Templates
*/
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JEditorPane;
import javax.swing.JButton;
//import javax.swing.JTextArea;
import java.awt.TextArea;
import java.awt.Font;
/**
* @author pascal TODO alot
*/
public class Gui extends java.applet.Applet implements ActionListener {
Panel panel = new Panel();
JEditorPane editor = new JEditorPane();
TextArea tArea = new TextArea("", 23, 1, TextArea.SCROLLBARS_BOTH);
String xmlText;
// ACHTUNG: LŠnge MUSS <10 sein !! (wegen farben, momentan provisorisch)
String[] akzent = { "H*", "L*", "L+H*", "H+L*", "H+!H*", "kein Akzent" };
// farben der akzente: grŸn, rot, blau, lila, orange
String[] akzentFarbe = { "33cc00", "ff0000", "3333ff", "cc33cc", "cc9933", "000000" };
// wortliste. wenn durchs GUI selektiert und verŠndert, soll dies farblich
// gekennzeichnet werden
String wort[];
// geht parallel mit wort[]. inhalt sind die html-farbcodes
String wortFarbe[];
// "text" ist wort[] an einem stŸck. benštigt fŸr kalkulation von farbeinsetzen
StringBuffer text = new StringBuffer();
int anz = akzent.length; //anzahl der elemente. also wieviele Buttons=akzente
JButton[] button = new JButton[anz];
StringBuffer htmlText = new StringBuffer("
"); // gutes startTag ;)
String s;
public void init() {
setLayout(new BorderLayout());
editor.setContentType("text/html; charset=EUC-JP");
editor.setEditable(true); // jetzt kann text selektiert werden
int[] rgb;
float[] hsb = new float[3];
for (int i = 0; i < anz; i++) {
button[i] = new JButton(akzent[i]);
panel.add(button[i]);
button[i].addActionListener(this);
rgb = getColor(akzentFarbe[i].toCharArray());
button[i].setForeground(new Color(rgb[0], rgb[1], rgb[2]));
button[i].setBackground(new Color(rgb[0], rgb[1], rgb[2]));
}
this.setSize(800, 500);
panel.setSize(800, 500);
add(panel, BorderLayout.NORTH);
add(editor, BorderLayout.CENTER);
tArea.setFont(new Font("Helvetica", Font.PLAIN, 10));
xmlText = new String(
"\n\n\n\n\n\nGib\n\n\nmir\n\n\n\nden\n\n\nApfel\n\n\n.\n\n\n\n\n
\n");
tArea.setText(xmlText);
add(tArea, BorderLayout.SOUTH);
// s = getParameter("Text"); // html-parameter
// editor.setText(s+"test");
//hilfskonstrukt fŸr anfang s = "Gib mir den Apfel.";
getXmlWortliste(xmlText);
createHtmlText();
editor.setText(htmlText.toString());
}
public void actionPerformed(ActionEvent ae) { // muss implementiert werden
String se;// selektiertes wort
int seStart; // position des selektierten wortes
int spc = 0; //
// je nachdem, welcher knopf gedrŸckt wurde, wird das selektierte wort gefŠrbt
for (int i = 0; i < anz; i++) {
if (ae.getSource() == button[i]) {
// hole den text aus dem xml-output
getXmlWortliste(tArea.getText());
createHtmlText();
seStart = editor.getSelectionStart();
// interessieren tut eigentlich nur der erste selektierte character
// findet das einzufŠrbende wort. anzahl leerzeichen bis seStart
// zŠhlt also die worte -> index fŸr wortFarbe[]
if (seStart < text.length()) // kann ja nie wissen
for (int k = 0; k < seStart; k++) {
if (text.charAt(k) == ' ')
spc++;
}
// aktualisiere die views: 1. den Text View ...
if (spc < wortFarbe.length) { //sischerheit
wortFarbe[spc] = new String(akzentFarbe[i]);// wort bekommt farbe, durch knopf[i]
createHtmlText(); //aktualisiere
editor.setText(htmlText.toString());// den TEXT und gib ihn aus
}
//...2. den XML-Output
setXmlWortliste(new StringBuffer(xmlText));
tArea.setText(xmlText);
}
}
}
// das ist alles blšd gelšst. sehr viel unnštige rechenarbeit...
// erzeugt html aus dem text und der farbe
void createHtmlText() {
htmlText = new StringBuffer("");
for (int i = 0; i < wort.length; i++) {
htmlText.append("" + wort[i]
+ " ");
}
htmlText.append("");
}
//liefert eine wortliste aus dem parameter, der im aufrufenden html steht
public String[] getWortlisteFromParameter(String s) {
String wor[];
StringBuffer sb = new StringBuffer();
int cnt = 0;
// wieviele worte sinds denn (jedes leerzeichen bedeutet wort+1)
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ')
cnt++;
}
wor = new String[cnt + 1];//reservierung. +1 weil text ohne leerzeichen enden kšnnte
cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') { //wortende gefunden
if (sb.length() > 0) {//security: fŠngt mšgliche leerzeichen am anfang ab
wor[cnt] = new String(sb.toString());
cnt++; // index hochsetzen
sb = new StringBuffer();
}
} else
sb.append(s.charAt(i));
}
if (sb.length() > 0) // wenn letztes wort
wor[wor.length - 1] = new String(sb.toString());
if (wor[wor.length - 1] == null)
wor[wor.length - 1] = new String(" ");
return wor;
}
// hier wird auch die defaultfarbe gesetzt
// der xmlText wird neu gesetzt. wort[] wird zurŸckgegeben
// ebenso wortFarbe[] erezugt aus dem xmltext
void getXmlWortliste(String s) {
xmlText=new String(s);
int spc = 0;// "leerzeichen", anzahl der Farbe gefunden
if (s.charAt(i + 3) == 'a' && s.charAt(i + 4) == 'c'
&& s.charAt(i + 5) == 'c') {
i = i + 11; // vorsetzen des lesekopfs
tmp = new StringBuffer();
while (s.charAt(i) != 34) { // 34="
tmp.append(s.charAt(i));
i++;
}
//String tmpString = new String(tmp.toString());
// finde korresponierende farbe zum accent-value
for (int g = 0; g < akzent.length; g++) {
if (akzent[g].equals(tmp.toString())) {
wortFarbe[spc] = new String(akzentFarbe[g]);
break;
}
}
}// ende accent
tmp = new StringBuffer();
while (s.charAt(i) != '>')
i++;
i++;//ein weiter
while (s.charAt(i) < 33)
i++; // anfang des textes finden, zeilenumbruch ...
while ((s.charAt(i) > 32 && s.charAt(i) < 123) // umbruch nicht lesen
&& s.charAt(i) != 60) {//einlesen bis ende
tmp.append(s.charAt(i));
i++;
}
wort[spc] = new String(tmp.toString());
spc++;
}
}
text=new StringBuffer();
// fŸr kalkulation fŸr farbsetzung wichtig
for (int i = 0; i < wort.length; i++) {
text.append(wort[i] + " ");
}
}
// sehr anfŠllig: wehe, es wird die originale xml-struktur an der falschen stelle verŠndert ...
void setXmlWortliste(StringBuffer s) {
StringBuffer tmp = new StringBuffer();
int spc = 0;// "leerzeichen", anzahl der akzentsetzung
for (int k = 0; k < akzent.length; k++) {
if (akzentFarbe[k].equals(wortFarbe[spc])) { // gefunden !
s.delete(merk+1, i ); // lšschen des alten akzents
s.insert(merk+1, akzent[k]); // einsetzen
}
}
} else { // wenn kein accent da steht
for (int k = 0; k < akzent.length; k++) {
if (akzentFarbe[k].equals(wortFarbe[spc])) { // gefunden !
s.insert(i, "accent="+(char) 34+ akzent[k] +(char) 34+" "); // einsetzen
break;
}
}
}
}
spc++;
}
}
xmlText=new String(s);
}
//wandelt die html-farbcodes in Color-fŠhige infos um
int[] getColor(char[] hex) {
int tmp = 0;
int[] rgb = new int[3]; //r=0; int g=0; int b=0;
//6 ist lŠnge des html-farbcodes
for (int i = 3; i > 0; i--) {
//zwei chars definieren ein spektrum
for (int z = 1; z < 3; z++) {
if (hex[(i * 2) - z] > 47 && hex[(i * 2) - z] < 58) {
tmp = hex[(i * 2) - z] - 48;
}
if (hex[(i * 2) - z] > 96 && hex[(i * 2) - z] < 103)
tmp = (hex[(i * 2) - z] - 87) * (int) Math.pow(16, z - 1);
rgb[i - 1] = rgb[i - 1] + tmp;
}
}
return rgb;
}
}