/* * 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; } }