]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/demos/src/com/ibm/icu/dev/demo/charsetdet/DetectingViewer.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / demos / src / com / ibm / icu / dev / demo / charsetdet / DetectingViewer.java
1 /*\r
2  **************************************************************************\r
3  * Copyright (C) 2005-2010, International Business Machines Corporation   *\r
4  * and others. All Rights Reserved.                                       *\r
5  **************************************************************************\r
6  *\r
7  */\r
8 \r
9 package com.ibm.icu.dev.demo.charsetdet;\r
10 \r
11 import java.awt.Font;\r
12 import java.awt.event.ActionEvent;\r
13 import java.awt.event.ActionListener;\r
14 import java.awt.event.KeyEvent;\r
15 import java.awt.event.WindowAdapter;\r
16 import java.awt.event.WindowEvent;\r
17 import java.io.BufferedInputStream;\r
18 import java.io.File;\r
19 import java.io.FileInputStream;\r
20 import java.io.IOException;\r
21 import java.io.InputStream;\r
22 import java.io.InputStreamReader;\r
23 import java.net.URL;\r
24 import java.nio.ByteBuffer;\r
25 import java.nio.charset.Charset;\r
26 import java.security.AccessControlException;\r
27 \r
28 import javax.swing.JFileChooser;\r
29 import javax.swing.JFrame;\r
30 import javax.swing.JMenu;\r
31 import javax.swing.JMenuBar;\r
32 import javax.swing.JMenuItem;\r
33 import javax.swing.JOptionPane;\r
34 import javax.swing.JScrollPane;\r
35 import javax.swing.JTextPane;\r
36 import javax.swing.KeyStroke;\r
37 \r
38 import com.ibm.icu.charset.CharsetICU;\r
39 import com.ibm.icu.dev.demo.impl.DemoApplet;\r
40 import com.ibm.icu.text.CharsetDetector;\r
41 import com.ibm.icu.text.CharsetMatch;\r
42 \r
43 /**\r
44  * This simple application demonstrates how to use the CharsetDetector API. It\r
45  * opens a file or web page, detects the encoding, and then displays it using that\r
46  * encoding.\r
47  */\r
48 public class DetectingViewer extends JFrame implements ActionListener\r
49 {\r
50     \r
51     /**\r
52      * For serialization\r
53      */\r
54     private static final long serialVersionUID = -2307065724464747775L;\r
55     private JTextPane text;\r
56     private JFileChooser fileChooser;\r
57     \r
58     /**\r
59      * @throws java.awt.HeadlessException\r
60      */\r
61     public DetectingViewer()\r
62     {\r
63         super();\r
64         DemoApplet.demoFrameOpened();\r
65         \r
66         try {\r
67             fileChooser = new JFileChooser();\r
68         } catch (AccessControlException ace) {\r
69             System.err.println("no file chooser - access control exception. Continuing without file browsing. "+ace.toString());\r
70             fileChooser = null; //\r
71         }\r
72         \r
73 //        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
74         setSize(800, 800);\r
75 \r
76         setJMenuBar(makeMenus());\r
77         text = new JTextPane();\r
78         text.setContentType("text/plain");\r
79         text.setText("");\r
80         text.setSize(800, 800);\r
81         \r
82         Font font = new Font("Arial Unicode MS", Font.PLAIN, 24);\r
83         text.setFont(font);\r
84         \r
85         JScrollPane scrollPane = new JScrollPane(text);\r
86         \r
87         getContentPane().add(scrollPane);\r
88         setVisible(true);\r
89 \r
90         addWindowListener(\r
91                 new WindowAdapter() {\r
92                     public void windowClosing(WindowEvent e) {\r
93 //                        setVisible(false);\r
94 //                        dispose();\r
95 \r
96                           doQuit();\r
97                     }\r
98                 } );\r
99 \r
100     \r
101     }\r
102 \r
103     public void actionPerformed(ActionEvent event)\r
104     {\r
105         String cmd = event.getActionCommand();\r
106         \r
107         if (cmd.equals("New...")) {\r
108            doNew();\r
109         } else if (cmd.equals("Open File...")) {\r
110            doOpenFile();\r
111         } else if (cmd.equals("Open URL...")) {\r
112             doOpenURL();\r
113         } else if (cmd.equals("Quit")) {\r
114            doQuit();\r
115         }\r
116     }\r
117 \r
118     public static void main(String[] args)\r
119     {\r
120         new DetectingViewer();\r
121     }\r
122     \r
123     private void errorDialog(String title, String msg)\r
124     {\r
125         JOptionPane.showMessageDialog(this, msg, title, JOptionPane.ERROR_MESSAGE);\r
126     }\r
127     \r
128     private BufferedInputStream openFile(File file)\r
129     {\r
130         FileInputStream fileStream = null;\r
131         \r
132         try {\r
133             fileStream = new FileInputStream(file);\r
134         } catch (Exception e) {\r
135             errorDialog("Error Opening File", e.getMessage());\r
136             return null;\r
137         }\r
138         \r
139         return new BufferedInputStream(fileStream);\r
140     }\r
141     \r
142 //    private void openFile(String directory, String filename)\r
143 //    {\r
144 //        openFile(new File(directory, filename));\r
145 //    }\r
146     \r
147     \r
148     private BufferedInputStream openURL(String url)\r
149     {\r
150         InputStream s = null;\r
151 \r
152         try {\r
153             URL aURL = new URL(url);\r
154             s = aURL.openStream();\r
155         } catch (Exception e) {\r
156             errorDialog("Error Opening URL", e.getMessage());\r
157             return null;\r
158         }\r
159         \r
160         return new BufferedInputStream(s);\r
161     }\r
162     \r
163     private String encodingName(CharsetMatch match)\r
164     {\r
165         return match.getName() + " (" + match.getLanguage() + ")";\r
166     }\r
167     \r
168     private void setMatchMenu(CharsetMatch[] matches)\r
169     {\r
170         JMenu menu = getJMenuBar().getMenu(1);\r
171         JMenuItem menuItem;\r
172         \r
173         menu.removeAll();\r
174         \r
175         for (int i = 0; i < matches.length; i += 1) {\r
176             CharsetMatch match = matches[i];\r
177             \r
178             menuItem = new JMenuItem(encodingName(match) + " " + match.getConfidence());\r
179             \r
180             menu.add(menuItem);\r
181         }\r
182     }\r
183     \r
184     private byte[] scriptTag = {(byte) 's', (byte) 'c', (byte) 'r', (byte) 'i', (byte) 'p', (byte) 't'};\r
185     private byte[] styleTag  = {(byte) 's', (byte) 't', (byte) 'y', (byte) 'l', (byte) 'e'};\r
186     private static int BUFFER_SIZE = 100000;\r
187     \r
188     private boolean openTag(byte[] buffer, int offset, int length, byte[] tag)\r
189     {\r
190         int tagLen = tag.length;\r
191         int bufRem = length - offset;\r
192         int b;\r
193         \r
194         for (b = 0; b < tagLen && b < bufRem; b += 1) {\r
195             if (buffer[b + offset] != tag[b]) {\r
196                 return false;\r
197             }\r
198         }\r
199         \r
200         return b == tagLen;\r
201     }\r
202     \r
203     private boolean closedTag(byte[] buffer, int offset, int length, byte[] tag)\r
204     {\r
205         if (buffer[offset] != (byte) '/') {\r
206             return false;\r
207         }\r
208         \r
209         return openTag(buffer, offset + 1, length, tag);\r
210     }\r
211     \r
212     private byte[] filter(InputStream in)\r
213     {\r
214         byte[] buffer = new byte[BUFFER_SIZE];\r
215         int bytesRemaining = BUFFER_SIZE;\r
216         int bufLen = 0;\r
217         \r
218         in.mark(BUFFER_SIZE);\r
219         \r
220         try {\r
221             while (bytesRemaining > 0) {\r
222                 int bytesRead = in.read(buffer, bufLen, bytesRemaining);\r
223                 \r
224                 if (bytesRead <= 0) {\r
225                     break;\r
226                 }\r
227                 \r
228                 bufLen += bytesRead;\r
229                 bytesRemaining -= bytesRead;\r
230             }\r
231         } catch (Exception e) {\r
232             // TODO: error handling?\r
233             return null;\r
234         }\r
235         \r
236         boolean inTag = false;\r
237         boolean skip  = false;\r
238         int out = 0;\r
239         \r
240         for (int i = 0; i < bufLen; i += 1) {\r
241             byte b = buffer[i];\r
242             \r
243             if (b == (byte) '<') {\r
244                 inTag = true;\r
245                 \r
246                 if (openTag(buffer, i + 1, bufLen, scriptTag) ||\r
247                     openTag(buffer, i + 1, bufLen, styleTag)) {\r
248                     skip = true;\r
249                 } else if (closedTag(buffer, i + 1, bufLen, scriptTag) ||\r
250                            closedTag(buffer, i + 1, bufLen, styleTag)) {\r
251                     skip = false;\r
252                 }\r
253             } else if (b == (byte) '>') {\r
254                 inTag = false;\r
255             } else if (! (inTag || skip)) {\r
256                 buffer[out++] = b;\r
257             }\r
258         }\r
259 \r
260         byte[] filtered = new byte[out];\r
261         \r
262         System.arraycopy(buffer, 0, filtered, 0, out);\r
263         return filtered;\r
264     }\r
265     \r
266     private CharsetMatch[] detect(byte[] bytes)\r
267     {\r
268         CharsetDetector det = new CharsetDetector();\r
269         \r
270         det.setText(bytes);\r
271         \r
272         return det.detectAll();\r
273     }\r
274     \r
275     private CharsetMatch[] detect(BufferedInputStream inputStream)\r
276     {\r
277         CharsetDetector det    = new CharsetDetector();\r
278         \r
279         try {\r
280             det.setText(inputStream);\r
281             \r
282             return det.detectAll();\r
283         } catch (Exception e) {\r
284             // TODO: error message?\r
285             return null;\r
286         }\r
287     }\r
288     \r
289     private void show(InputStream inputStream, CharsetMatch[] matches, String title)\r
290     {\r
291         InputStreamReader isr;\r
292         char[] buffer = new char[1024];\r
293         int bytesRead = 0;\r
294         \r
295         if (matches == null || matches.length == 0) {\r
296             errorDialog("Match Error", "No matches!");\r
297             return;\r
298         }\r
299         \r
300         try {\r
301             StringBuffer sb = new StringBuffer();\r
302             String encoding = matches[0].getName();\r
303             \r
304             inputStream.reset();\r
305             \r
306             if (encoding.startsWith("UTF-32")) {\r
307                 byte[] bytes = new byte[1024];\r
308                 int offset = 0;\r
309                 int chBytes = 0;\r
310                 Charset utf32 = CharsetICU.forNameICU(encoding);\r
311                 \r
312                 while ((bytesRead = inputStream.read(bytes, offset, 1024)) >= 0) {\r
313                     offset  = bytesRead % 4;\r
314                     chBytes = bytesRead - offset;\r
315                     \r
316                     sb.append(utf32.decode(ByteBuffer.wrap(bytes)).toString());\r
317                     \r
318                     if (offset != 0) {\r
319                         for (int i = 0; i < offset; i += 1) {\r
320                             bytes[i] = bytes[chBytes + i];\r
321                         }\r
322                     }\r
323                 }\r
324             } else {\r
325                 isr = new InputStreamReader(inputStream, encoding);\r
326                 \r
327                 while ((bytesRead = isr.read(buffer, 0, 1024)) >= 0) {\r
328                     sb.append(buffer, 0, bytesRead);\r
329                 }\r
330                 \r
331                 isr.close();\r
332             }\r
333             \r
334             this.setTitle(title + " - " + encodingName(matches[0]));\r
335             \r
336             setMatchMenu(matches);\r
337             text.setText(sb.toString());\r
338         } catch (IOException e) {\r
339             errorDialog("IO Error", e.getMessage());\r
340         } catch (Exception e) {\r
341             errorDialog("Internal Error", e.getMessage());\r
342         }\r
343     }\r
344     \r
345     private void doNew()\r
346     {\r
347         // open a new window...\r
348     }\r
349     \r
350     private void doOpenFile()\r
351     {\r
352         int retVal = fileChooser.showOpenDialog(this);\r
353         \r
354         if (retVal == JFileChooser.APPROVE_OPTION) {\r
355             File file = fileChooser.getSelectedFile();\r
356             BufferedInputStream inputStream = openFile(file);\r
357             \r
358             if (inputStream != null) {\r
359                 CharsetMatch[] matches = detect(inputStream);\r
360                 \r
361                 show(inputStream, matches, file.getName());                \r
362             }\r
363         }\r
364     }\r
365     \r
366     private void doOpenURL()\r
367     {\r
368         String url = (String) JOptionPane.showInputDialog(this, "URL to open:", "Open URL", JOptionPane.PLAIN_MESSAGE,\r
369                 null, null, null);\r
370         \r
371         if (url != null && url.length() > 0) {\r
372             BufferedInputStream inputStream = openURL(url);\r
373             \r
374             if (inputStream != null) {\r
375                 byte[] filtered = filter(inputStream);\r
376                 CharsetMatch[] matches = detect(filtered);\r
377                 \r
378                 show(inputStream, matches, url);                \r
379             }\r
380         }\r
381 }\r
382     \r
383     private void doQuit()\r
384     {\r
385         DemoApplet.demoFrameClosed();\r
386         this.setVisible(false);\r
387         this.dispose();\r
388     }\r
389     \r
390     private JMenuBar makeMenus()\r
391     {\r
392         JMenu menu = new JMenu("File");\r
393         JMenuItem mi;\r
394         \r
395         mi = new JMenuItem("Open File...");\r
396         mi.setAccelerator((KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK)));\r
397         mi.addActionListener(this);\r
398         menu.add(mi);\r
399         if(fileChooser == null) {\r
400             mi.setEnabled(false); // no file chooser.\r
401         }\r
402         \r
403         mi = new JMenuItem("Open URL...");\r
404         mi.setAccelerator((KeyStroke.getKeyStroke(KeyEvent.VK_U, ActionEvent.CTRL_MASK)));\r
405         mi.addActionListener(this);\r
406         menu.add(mi);\r
407         \r
408         mi = new JMenuItem("Quit");\r
409         mi.setAccelerator((KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK)));\r
410         mi.addActionListener(this);\r
411         menu.add(mi);\r
412         \r
413         JMenuBar mbar = new JMenuBar();\r
414         mbar.add(menu);\r
415         \r
416         menu = new JMenu("Detected Encodings");\r
417         mbar.add(menu);\r
418         \r
419         return mbar;\r
420     }\r
421 }\r