Import of Ekit 0.9h
[old-projects.git] / ekit / com / hexidec / ekit / EkitCore_Spell.java
CommitLineData
c2da4d40
JL
1/*
2GNU Lesser General Public License
3
4EkitCore - Base Java Swing HTML Editor & Viewer Class (Spellcheck Version)
5Copyright (C) 2000-2003 Howard Kistler
6
7This library is free software; you can redistribute it and/or
8modify it under the terms of the GNU Lesser General Public
9License as published by the Free Software Foundation; either
10version 2.1 of the License, or (at your option) any later version.
11
12This library is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15Lesser General Public License for more details.
16
17You should have received a copy of the GNU Lesser General Public
18License along with this library; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20*/
21
22package com.hexidec.ekit;
23
24import java.awt.BorderLayout;
25import java.awt.Color;
26import java.awt.Cursor;
27import java.awt.Dimension;
28import java.awt.Frame;
29import java.awt.Graphics;
30import java.awt.Image;
31import java.awt.Insets;
32import java.awt.Toolkit;
33import java.awt.event.ActionEvent;
34import java.awt.event.ActionListener;
35import java.awt.event.KeyEvent;
36import java.awt.event.KeyListener;
37import java.io.BufferedReader;
38import java.io.File;
39import java.io.FileInputStream;
40import java.io.FileOutputStream;
41import java.io.FileReader;
42import java.io.FileWriter;
43import java.io.InputStream;
44import java.io.InputStreamReader;
45import java.io.IOException;
46import java.io.ObjectInputStream;
47import java.io.ObjectOutputStream;
48import java.io.Reader;
49import java.net.URL;
50import java.net.URLConnection;
51import java.net.MalformedURLException;
52import java.util.Enumeration;
53import java.util.Hashtable;
54import java.util.Locale;
55import java.util.MissingResourceException;
56import java.util.ResourceBundle;
57import java.util.Vector;
58import javax.swing.AbstractAction;
59import javax.swing.Action;
60import javax.swing.Icon;
61import javax.swing.ImageIcon;
62import javax.swing.JButton;
63import javax.swing.JCheckBox;
64import javax.swing.JCheckBoxMenuItem;
65import javax.swing.JComboBox;
66import javax.swing.JComponent;
67import javax.swing.JDialog;
68import javax.swing.JEditorPane;
69import javax.swing.JFileChooser;
70import javax.swing.JFrame;
71import javax.swing.JMenu;
72import javax.swing.JMenuBar;
73import javax.swing.JMenuItem;
74import javax.swing.JOptionPane;
75import javax.swing.JPanel;
76import javax.swing.JScrollPane;
77import javax.swing.JSplitPane;
78import javax.swing.JTextField;
79import javax.swing.JTextPane;
80import javax.swing.JToggleButton;
81import javax.swing.JToolBar;
82import javax.swing.KeyStroke;
83import javax.swing.event.CaretEvent;
84import javax.swing.event.CaretListener;
85import javax.swing.event.DocumentEvent;
86import javax.swing.event.DocumentListener;
87import javax.swing.event.UndoableEditEvent;
88import javax.swing.event.UndoableEditListener;
89import javax.swing.filechooser.FileFilter;
90import javax.swing.text.AttributeSet;
91import javax.swing.text.BadLocationException;
92import javax.swing.text.ChangedCharSetException;
93import javax.swing.text.DefaultEditorKit;
94import javax.swing.text.DefaultStyledDocument;
95import javax.swing.text.Document;
96import javax.swing.text.Element;
97import javax.swing.text.PlainDocument;
98import javax.swing.text.Position;
99import javax.swing.text.Style;
100import javax.swing.text.StyleConstants;
101import javax.swing.text.StyledDocument;
102import javax.swing.text.StyledEditorKit;
103import javax.swing.text.StyledEditorKit.FontSizeAction;
104import javax.swing.text.html.HTML;
105import javax.swing.text.html.HTMLDocument;
106import javax.swing.text.html.HTMLEditorKit;
107import javax.swing.text.html.StyleSheet;
108import javax.swing.text.rtf.RTFEditorKit;
109import javax.swing.undo.UndoManager;
110import javax.swing.undo.CannotUndoException;
111
112import com.hexidec.ekit.action.*;
113import com.hexidec.ekit.component.*;
114import com.hexidec.util.Base64Codec;
115import com.hexidec.util.Translatrix;
116
117import com.swabunga.spell.engine.*;
118import com.swabunga.spell.event.*;
119import com.swabunga.spell.swing.*;
120
121/** EkitCore
122 * Main application class for editing and saving HTML in a Java text component
123 *
124 * @author Howard Kistler
125 * @version 0.9g
126 *
127 * REQUIREMENTS
128 * Java 2 (JDK 1.3 or 1.4)
129 * Swing Library
130 */
131
132public class EkitCore extends JPanel implements ActionListener, KeyListener, DocumentListener, SpellCheckListener
133{
134 /* Components */
135 private JSplitPane jspltDisplay;
136 private JTextPane jtpMain;
137 private ExtendedHTMLEditorKit htmlKit;
138 private ExtendedHTMLDocument htmlDoc;
139 private StyleSheet styleSheet;
140 private JTextPane jtpSource;
141 private JScrollPane jspSource;
142 private JToolBar jToolBar;
143
144 private JCheckBoxMenuItem jcbmiViewToolbar;
145 private JCheckBoxMenuItem jcbmiViewSource;
146
147 private JButtonNoFocus jbtnNewHTML;
148 private JButtonNoFocus jbtnOpenHTML;
149 private JButtonNoFocus jbtnSaveHTML;
150 private JButtonNoFocus jbtnCut;
151 private JButtonNoFocus jbtnCopy;
152 private JButtonNoFocus jbtnPaste;
153 private JButtonNoFocus jbtnBold;
154 private JButtonNoFocus jbtnItalic;
155 private JButtonNoFocus jbtnUnderline;
156 private JButtonNoFocus jbtnStrike;
157 private JButtonNoFocus jbtnSuperscript;
158 private JButtonNoFocus jbtnSubscript;
159 private JButtonNoFocus jbtnUList;
160 private JButtonNoFocus jbtnOList;
161 private JButtonNoFocus jbtnClearFormat;
162 private JButtonNoFocus jbtnAnchor;
163 private JToggleButtonNoFocus jtbtnViewSource;
164 private JComboBoxNoFocus jcmbStyleSelector;
165
166 private Frame frameHandler;
167
168 private HTMLUtilities htmlUtilities = new HTMLUtilities(this);
169
170 /* Actions */
171 private StyledEditorKit.BoldAction actionFontBold;
172 private StyledEditorKit.ItalicAction actionFontItalic;
173 private StyledEditorKit.UnderlineAction actionFontUnderline;
174 private FormatAction actionFontStrike;
175 private FormatAction actionFontSuperscript;
176 private FormatAction actionFontSubscript;
177 private ListAutomationAction actionListUnordered;
178 private ListAutomationAction actionListOrdered;
179 private CustomAction actionSelectFont;
180 private CustomAction actionClearFormat;
181 private CustomAction actionInsertAnchor;
182
183 protected UndoManager undoMngr;
184 protected UndoAction undoAction;
185 protected RedoAction redoAction;
186
187 /* Menus */
188 private JMenuBar jMenuBar;
189 private JMenu jMenuFile;
190 private JMenu jMenuEdit;
191 private JMenu jMenuView;
192 private JMenu jMenuFont;
193 private JMenu jMenuFormat;
194 private JMenu jMenuInsert;
195 private JMenu jMenuTable;
196 private JMenu jMenuForms;
197 private JMenu jMenuSearch;
198 private JMenu jMenuTools;
199 private JMenu jMenuHelp;
200 private JMenu jMenuDebug;
201
202 /* Constants */
203 // Menu Keys
204 public static final String KEY_MENU_FILE = "file";
205 public static final String KEY_MENU_EDIT = "edit";
206 public static final String KEY_MENU_VIEW = "view";
207 public static final String KEY_MENU_FONT = "font";
208 public static final String KEY_MENU_FORMAT = "format";
209 public static final String KEY_MENU_INSERT = "insert";
210 public static final String KEY_MENU_TABLE = "table";
211 public static final String KEY_MENU_FORMS = "forms";
212 public static final String KEY_MENU_SEARCH = "search";
213 public static final String KEY_MENU_TOOLS = "tools";
214 public static final String KEY_MENU_HELP = "help";
215 public static final String KEY_MENU_DEBUG = "debug";
216
217 // Tool Keys
218 public static final String KEY_TOOL_SEP = "separator";
219 public static final String KEY_TOOL_NEW = "new";
220 public static final String KEY_TOOL_OPEN = "open";
221 public static final String KEY_TOOL_SAVE = "save";
222 public static final String KEY_TOOL_CUT = "cut";
223 public static final String KEY_TOOL_COPY = "copy";
224 public static final String KEY_TOOL_PASTE = "paste";
225 public static final String KEY_TOOL_BOLD = "bold";
226 public static final String KEY_TOOL_ITALIC = "italic";
227 public static final String KEY_TOOL_UNDERLINE = "underline";
228 public static final String KEY_TOOL_STRIKE = "strike";
229 public static final String KEY_TOOL_SUPER = "superscript";
230 public static final String KEY_TOOL_SUB = "subscript";
231 public static final String KEY_TOOL_ULIST = "ulist";
232 public static final String KEY_TOOL_OLIST = "olist";
233 public static final String KEY_TOOL_CLEAR = "clearformats";
234 public static final String KEY_TOOL_ANCHOR = "anchor";
235 public static final String KEY_TOOL_SOURCE = "viewsource";
236 public static final String KEY_TOOL_STYLES = "styleselect";
237
238 // Menu & Tool Key Arrays
239 private static Hashtable htMenus = new Hashtable();
240 private static Hashtable htTools = new Hashtable();
241
242 private final String appName = "Ekit";
243 private final String menuDialog = "..."; /* text to append to a MenuItem label when menu item opens a dialog */
244
245 private final boolean useFormIndicator = true; /* Creates a highlighted background on a new FORM so that it may be more easily edited */
246 private final String clrFormIndicator = "#cccccc";
247
248 // System Clipboard Settings
249 private java.awt.datatransfer.Clipboard sysClipboard;
250 private SecurityManager secManager;
251
252 /* Variables */
253 private int iSplitPos = 0;
254
255 private boolean exclusiveEdit = true;
256
257 private String lastSearchFindTerm = null;
258 private String lastSearchReplaceTerm = null;
259 private boolean lastSearchCaseSetting = false;
260 private boolean lastSearchTopSetting = false;
261
262 private File currentFile = null;
263
264 private int indent = 0;
265 private final int indentStep = 4;
266
267 // File extensions for MutableFilter
268 private final String[] extsHTML = { "html", "htm", "shtml" };
269 private final String[] extsCSS = { "css" };
270 private final String[] extsIMG = { "gif", "jpg", "jpeg", "png" };
271 private final String[] extsRTF = { "rtf" };
272 private final String[] extsB64 = { "b64" };
273 private final String[] extsSer = { "ser" };
274
275 /* Spell Checker Settings */
276 private static String dictFile;
277 private SpellChecker spellCheck = null;
278 private JSpellDialog spellDialog;
279
280 /* Servlet Settings */
281 private String ServletURL = null;
282 private String TreePilotSystemID = "";
283 private String ImageDir = "";
284 private static ResourceBundle TreePilotProperties;
285
286 /** Master Constructor
287 * @param sDocument [String] A text or HTML document to load in the editor upon startup.
288 * @param sStyleSheet [String] A CSS stylesheet to load in the editor upon startup.
289 * @param sRawDocument [String] A document encoded as a String to load in the editor upon startup.
290 * @param urlStyleSheet [URL] A URL reference to the CSS style sheet.
291 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
292 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
293 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
294 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
295 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
296 * @param base64 [boolean] Specifies whether the raw document is Base64 encoded or not.
297 * @param debugMode [boolean] Specifies whether to show the Debug menu or not.
298 */
299 public EkitCore(String sDocument, String sStyleSheet, String sRawDocument, URL urlStyleSheet, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, String sLanguage, String sCountry, boolean base64, boolean debugMode)
300 {
301 super();
302
303 exclusiveEdit = editModeExclusive;
304
305 frameHandler = new Frame();
306
307 // Determine if system clipboard is available
308 secManager = System.getSecurityManager();
309 if(secManager != null)
310 {
311 try
312 {
313 secManager.checkSystemClipboardAccess();
314 sysClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
315 }
316 catch (SecurityException se)
317 {
318 sysClipboard = null;
319 }
320 }
321
322 /* Localize for language */
323 Translatrix.setBundleName("com.hexidec.ekit.LanguageResources");
324 Locale baseLocale = (Locale)null;
325 if(sLanguage != null && sCountry != null)
326 {
327 baseLocale = new Locale(sLanguage, sCountry);
328 }
329 Translatrix.setLocale(baseLocale);
330
331 /* Load TreePilot properties */
332 try
333 {
334 TreePilotProperties = ResourceBundle.getBundle("com.hexidec.ekit.TreePilot");
335 }
336 catch(MissingResourceException mre)
337 {
338 logException("MissingResourceException while loading treepilot file", mre);
339 }
340
341 /* Create the editor kit, document, and stylesheet */
342 jtpMain = new JTextPane();
343 htmlKit = new ExtendedHTMLEditorKit();
344 htmlDoc = (ExtendedHTMLDocument)(htmlKit.createDefaultDocument());
345 styleSheet = htmlDoc.getStyleSheet();
346 htmlKit.setDefaultCursor(new Cursor(Cursor.TEXT_CURSOR));
347
348 /* Set up the text pane */
349 jtpMain.setEditorKit(htmlKit);
350 jtpMain.setDocument(htmlDoc);
351 jtpMain.setMargin(new Insets(4, 4, 4, 4));
352 jtpMain.addKeyListener(this);
353
354 /* Create the source text area */
355 jtpSource = new JTextPane();
356 jtpSource.setBackground(new Color(212, 212, 212));
357 jtpSource.setSelectionColor(new Color(255, 192, 192));
358 jtpSource.setText(jtpMain.getText());
359 jtpSource.getDocument().addDocumentListener(this);
360
361 /* Add CaretListener for tracking caret location events */
362 jtpMain.addCaretListener(new CaretListener()
363 {
364 public void caretUpdate(CaretEvent ce)
365 {
366 handleCaretPositionChange(ce);
367 }
368 });
369
370 /* Set up the undo features */
371 undoMngr = new UndoManager();
372 undoAction = new UndoAction();
373 redoAction = new RedoAction();
374 jtpMain.getDocument().addUndoableEditListener(new CustomUndoableEditListener());
375
376 /* Insert raw document, if exists */
377 if(sRawDocument != null && sRawDocument.length() > 0)
378 {
379 if(base64)
380 {
381 jtpMain.setText(Base64Codec.decode(sRawDocument));
382 }
383 else
384 {
385 jtpMain.setText(sRawDocument);
386 }
387 }
388 jtpMain.setCaretPosition(0);
389 jtpMain.getDocument().addDocumentListener(this);
390
391 /* Import CSS from reference, if exists */
392 if(urlStyleSheet != null)
393 {
394 try
395 {
396 String currDocText = jtpMain.getText();
397 htmlDoc = (ExtendedHTMLDocument)(htmlKit.createDefaultDocument());
398 styleSheet = htmlDoc.getStyleSheet();
399 BufferedReader br = new BufferedReader(new InputStreamReader(urlStyleSheet.openStream()));
400 styleSheet.loadRules(br, urlStyleSheet);
401 br.close();
402 htmlDoc = new ExtendedHTMLDocument(styleSheet);
403 registerDocument(htmlDoc);
404 jtpMain.setText(currDocText);
405 jtpSource.setText(jtpMain.getText());
406 }
407 catch(Exception e)
408 {
409 e.printStackTrace(System.out);
410 }
411 }
412
413 /* Preload the specified HTML document, if exists */
414 if(sDocument != null)
415 {
416 File defHTML = new File(sDocument);
417 if(defHTML.exists())
418 {
419 try
420 {
421 openDocument(defHTML);
422 }
423 catch(Exception e)
424 {
425 logException("Exception in preloading HTML document", e);
426 }
427 }
428 }
429
430 /* Preload the specified CSS document, if exists */
431 if(sStyleSheet != null)
432 {
433 File defCSS = new File(sStyleSheet);
434 if(defCSS.exists())
435 {
436 try
437 {
438 openStyleSheet(defCSS);
439 }
440 catch(Exception e)
441 {
442 logException("Exception in preloading CSS stylesheet", e);
443 }
444 }
445 }
446
447 /* Collect the actions that the JTextPane is naturally aware of */
448 Hashtable actions = new Hashtable();
449 Action[] actionsArray = jtpMain.getActions();
450 for(int i = 0; i < actionsArray.length; i++)
451 {
452 Action a = actionsArray[i];
453 actions.put(a.getValue(Action.NAME), a);
454 }
455
456 /* Create shared actions */
457 actionFontBold = new StyledEditorKit.BoldAction();
458 actionFontItalic = new StyledEditorKit.ItalicAction();
459 actionFontUnderline = new StyledEditorKit.UnderlineAction();
460 actionFontStrike = new FormatAction(this, Translatrix.getTranslationString("FontStrike"), HTML.Tag.STRIKE);
461 actionFontSuperscript = new FormatAction(this, Translatrix.getTranslationString("FontSuperscript"), HTML.Tag.SUP);
462 actionFontSubscript = new FormatAction(this, Translatrix.getTranslationString("FontSubscript"), HTML.Tag.SUB);
463 actionListUnordered = new ListAutomationAction(this, Translatrix.getTranslationString("ListUnordered"), HTML.Tag.UL);
464 actionListOrdered = new ListAutomationAction(this, Translatrix.getTranslationString("ListOrdered"), HTML.Tag.OL);
465 Hashtable customAttr = new Hashtable();
466 customAttr.put("face","");
467 actionSelectFont = new CustomAction(this, Translatrix.getTranslationString("FontSelect") + menuDialog, HTML.Tag.FONT, customAttr);
468 actionClearFormat = new CustomAction(this, Translatrix.getTranslationString("FormatClear"), new HTML.UnknownTag(""));
469 actionInsertAnchor = new CustomAction(this, Translatrix.getTranslationString("InsertAnchor") + menuDialog, HTML.Tag.A);
470
471 /* Build the menus */
472 /* FILE Menu */
473 jMenuFile = new JMenu(Translatrix.getTranslationString("File"));
474 htMenus.put(KEY_MENU_FILE, jMenuFile);
475 JMenuItem jmiNew = new JMenuItem(Translatrix.getTranslationString("NewDocument")); jmiNew.setActionCommand("newdoc"); jmiNew.addActionListener(this); jmiNew.setAccelerator(KeyStroke.getKeyStroke('N', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiNew.setIcon(getEkitIcon("New")); }; jMenuFile.add(jmiNew);
476 JMenuItem jmiOpenHTML = new JMenuItem(Translatrix.getTranslationString("OpenDocument") + menuDialog); jmiOpenHTML.setActionCommand("openhtml"); jmiOpenHTML.addActionListener(this); jmiOpenHTML.setAccelerator(KeyStroke.getKeyStroke('O', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiOpenHTML.setIcon(getEkitIcon("Open")); }; jMenuFile.add(jmiOpenHTML);
477 JMenuItem jmiOpenCSS = new JMenuItem(Translatrix.getTranslationString("OpenStyle") + menuDialog); jmiOpenCSS.setActionCommand("opencss"); jmiOpenCSS.addActionListener(this); jMenuFile.add(jmiOpenCSS);
478 JMenuItem jmiOpenB64 = new JMenuItem(Translatrix.getTranslationString("OpenBase64Document") + menuDialog); jmiOpenB64.setActionCommand("openb64"); jmiOpenB64.addActionListener(this); jMenuFile.add(jmiOpenB64);
479 jMenuFile.addSeparator();
480 JMenuItem jmiSave = new JMenuItem(Translatrix.getTranslationString("Save")); jmiSave.setActionCommand("save"); jmiSave.addActionListener(this); jmiSave.setAccelerator(KeyStroke.getKeyStroke('S', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiSave.setIcon(getEkitIcon("Save")); }; jMenuFile.add(jmiSave);
481 JMenuItem jmiSaveAs = new JMenuItem(Translatrix.getTranslationString("SaveAs") + menuDialog); jmiSaveAs.setActionCommand("saveas"); jmiSaveAs.addActionListener(this); jMenuFile.add(jmiSaveAs);
482 JMenuItem jmiSaveBody = new JMenuItem(Translatrix.getTranslationString("SaveBody") + menuDialog); jmiSaveBody.setActionCommand("savebody"); jmiSaveBody.addActionListener(this); jMenuFile.add(jmiSaveBody);
483 JMenuItem jmiSaveRTF = new JMenuItem(Translatrix.getTranslationString("SaveRTF") + menuDialog); jmiSaveRTF.setActionCommand("savertf"); jmiSaveRTF.addActionListener(this); jMenuFile.add(jmiSaveRTF);
484 JMenuItem jmiSaveB64 = new JMenuItem(Translatrix.getTranslationString("SaveB64") + menuDialog); jmiSaveB64.setActionCommand("saveb64"); jmiSaveB64.addActionListener(this); jMenuFile.add(jmiSaveB64);
485 jMenuFile.addSeparator();
486 JMenuItem jmiSerialOut = new JMenuItem(Translatrix.getTranslationString("Serialize") + menuDialog); jmiSerialOut.setActionCommand("serialize"); jmiSerialOut.addActionListener(this); jMenuFile.add(jmiSerialOut);
487 JMenuItem jmiSerialIn = new JMenuItem(Translatrix.getTranslationString("ReadFromSer") + menuDialog); jmiSerialIn.setActionCommand("readfromser"); jmiSerialIn.addActionListener(this); jMenuFile.add(jmiSerialIn);
488 jMenuFile.addSeparator();
489 JMenuItem jmiExit = new JMenuItem(Translatrix.getTranslationString("Exit")); jmiExit.setActionCommand("exit"); jmiExit.addActionListener(this); jMenuFile.add(jmiExit);
490
491 /* EDIT Menu */
492 jMenuEdit = new JMenu(Translatrix.getTranslationString("Edit"));
493 htMenus.put(KEY_MENU_EDIT, jMenuEdit);
494 if(sysClipboard != null)
495 {
496 // System Clipboard versions of menu commands
497 JMenuItem jmiCut = new JMenuItem(Translatrix.getTranslationString("Cut")); jmiCut.setActionCommand("textcut"); jmiCut.addActionListener(this); jmiCut.setAccelerator(KeyStroke.getKeyStroke('X', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiCut.setIcon(getEkitIcon("Cut")); } jMenuEdit.add(jmiCut);
498 JMenuItem jmiCopy = new JMenuItem(Translatrix.getTranslationString("Copy")); jmiCopy.setActionCommand("textcopy"); jmiCopy.addActionListener(this); jmiCopy.setAccelerator(KeyStroke.getKeyStroke('C', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiCopy.setIcon(getEkitIcon("Copy")); } jMenuEdit.add(jmiCopy);
499 JMenuItem jmiPaste = new JMenuItem(Translatrix.getTranslationString("Paste")); jmiPaste.setActionCommand("textpaste"); jmiPaste.addActionListener(this); jmiPaste.setAccelerator(KeyStroke.getKeyStroke('V', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiPaste.setIcon(getEkitIcon("Paste")); } jMenuEdit.add(jmiPaste);
500 }
501 else
502 {
503 // DefaultEditorKit versions of menu commands
504 JMenuItem jmiCut = new JMenuItem(new DefaultEditorKit.CutAction()); jmiCut.setText(Translatrix.getTranslationString("Cut")); jmiCut.setAccelerator(KeyStroke.getKeyStroke('X', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiCut.setIcon(getEkitIcon("Cut")); } jMenuEdit.add(jmiCut);
505 JMenuItem jmiCopy = new JMenuItem(new DefaultEditorKit.CopyAction()); jmiCopy.setText(Translatrix.getTranslationString("Copy")); jmiCopy.setAccelerator(KeyStroke.getKeyStroke('C', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiCopy.setIcon(getEkitIcon("Copy")); } jMenuEdit.add(jmiCopy);
506 JMenuItem jmiPaste = new JMenuItem(new DefaultEditorKit.PasteAction()); jmiPaste.setText(Translatrix.getTranslationString("Paste")); jmiPaste.setAccelerator(KeyStroke.getKeyStroke('V', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiPaste.setIcon(getEkitIcon("Paste")); } jMenuEdit.add(jmiPaste);
507 }
508 jMenuEdit.addSeparator();
509 JMenuItem jmiUndo = new JMenuItem(undoAction); jmiUndo.setAccelerator(KeyStroke.getKeyStroke('Z', java.awt.Event.CTRL_MASK, false)); jMenuEdit.add(jmiUndo);
510 JMenuItem jmiRedo = new JMenuItem(redoAction); jmiRedo.setAccelerator(KeyStroke.getKeyStroke('Y', java.awt.Event.CTRL_MASK, false)); jMenuEdit.add(jmiRedo);
511 jMenuEdit.addSeparator();
512 JMenuItem jmiSelAll = new JMenuItem((Action)actions.get(DefaultEditorKit.selectAllAction)); jmiSelAll.setText(Translatrix.getTranslationString("SelectAll")); jmiSelAll.setAccelerator(KeyStroke.getKeyStroke('A', java.awt.Event.CTRL_MASK, false)); jMenuEdit.add(jmiSelAll);
513 JMenuItem jmiSelPara = new JMenuItem((Action)actions.get(DefaultEditorKit.selectParagraphAction)); jmiSelPara.setText(Translatrix.getTranslationString("SelectParagraph")); jMenuEdit.add(jmiSelPara);
514 JMenuItem jmiSelLine = new JMenuItem((Action)actions.get(DefaultEditorKit.selectLineAction)); jmiSelLine.setText(Translatrix.getTranslationString("SelectLine")); jMenuEdit.add(jmiSelLine);
515 JMenuItem jmiSelWord = new JMenuItem((Action)actions.get(DefaultEditorKit.selectWordAction)); jmiSelWord.setText(Translatrix.getTranslationString("SelectWord")); jMenuEdit.add(jmiSelWord);
516
517 /* VIEW Menu */
518 jMenuView = new JMenu(Translatrix.getTranslationString("View"));
519 htMenus.put(KEY_MENU_VIEW, jMenuView);
520 jcbmiViewToolbar = new JCheckBoxMenuItem(Translatrix.getTranslationString("ViewToolbar"), false); jcbmiViewToolbar.setActionCommand("toggletoolbar"); jcbmiViewToolbar.addActionListener(this); jMenuView.add(jcbmiViewToolbar);
521 jcbmiViewSource = new JCheckBoxMenuItem(Translatrix.getTranslationString("ViewSource"), false); jcbmiViewSource.setActionCommand("viewsource"); jcbmiViewSource.addActionListener(this); jMenuView.add(jcbmiViewSource);
522
523 /* FONT Menu */
524 jMenuFont = new JMenu(Translatrix.getTranslationString("Font"));
525 htMenus.put(KEY_MENU_FONT, jMenuFont);
526 JMenuItem jmiBold = new JMenuItem(actionFontBold); jmiBold.setText(Translatrix.getTranslationString("FontBold")); jmiBold.setAccelerator(KeyStroke.getKeyStroke('B', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiBold.setIcon(getEkitIcon("Bold")); } jMenuFont.add(jmiBold);
527 JMenuItem jmiItalic = new JMenuItem(actionFontItalic); jmiItalic.setText(Translatrix.getTranslationString("FontItalic")); jmiItalic.setAccelerator(KeyStroke.getKeyStroke('I', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiItalic.setIcon(getEkitIcon("Italic")); } jMenuFont.add(jmiItalic);
528 JMenuItem jmiUnderline = new JMenuItem(actionFontUnderline); jmiUnderline.setText(Translatrix.getTranslationString("FontUnderline")); jmiUnderline.setAccelerator(KeyStroke.getKeyStroke('U', java.awt.Event.CTRL_MASK, false)); if(showMenuIcons) { jmiUnderline.setIcon(getEkitIcon("Underline")); } jMenuFont.add(jmiUnderline);
529 JMenuItem jmiStrike = new JMenuItem(actionFontStrike); jmiStrike.setText(Translatrix.getTranslationString("FontStrike")); if(showMenuIcons) { jmiStrike.setIcon(getEkitIcon("Strike")); } jMenuFont.add(jmiStrike);
530 jMenuFont.addSeparator();
531 jMenuFont.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatBig"), HTML.Tag.BIG)));
532 jMenuFont.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatSmall"), HTML.Tag.SMALL)));
533 JMenu jMenuFontSize = new JMenu(Translatrix.getTranslationString("FontSize"));
534 String fontSizeKey = "size";
535 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"1");
536 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize1"), HTML.Tag.FONT, customAttr)));
537 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"2");
538 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize2"), HTML.Tag.FONT, customAttr)));
539 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"3");
540 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize3"), HTML.Tag.FONT, customAttr)));
541 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"4");
542 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize4"), HTML.Tag.FONT, customAttr)));
543 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"5");
544 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize5"), HTML.Tag.FONT, customAttr)));
545 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"6");
546 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize6"), HTML.Tag.FONT, customAttr)));
547 customAttr = new Hashtable(); customAttr.put(fontSizeKey,"7");
548 jMenuFontSize.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("FontSize7"), HTML.Tag.FONT, customAttr)));
549 jMenuFont.add(jMenuFontSize);
550 jMenuFont.addSeparator();
551 JMenuItem jmiSupscript = new JMenuItem(actionFontSuperscript); if(showMenuIcons) { jmiSupscript.setIcon(getEkitIcon("Super")); } jMenuFont.add(jmiSupscript);
552 JMenuItem jmiSubscript = new JMenuItem(actionFontSubscript); if(showMenuIcons) { jmiSubscript.setIcon(getEkitIcon("Sub")); } jMenuFont.add(jmiSubscript);
553 jMenuFont.addSeparator();
554 JMenuItem jmiSerif = new JMenuItem((Action)actions.get("font-family-Serif")); jmiSerif.setText(Translatrix.getTranslationString("FontSerif")); jMenuFont.add(jmiSerif);
555 JMenuItem jmiSansSerif = new JMenuItem((Action)actions.get("font-family-SansSerif")); jmiSansSerif.setText(Translatrix.getTranslationString("FontSansserif")); jMenuFont.add(jmiSansSerif);
556 JMenuItem jmiMonospaced = new JMenuItem((Action)actions.get("font-family-Monospaced")); jmiMonospaced.setText(Translatrix.getTranslationString("FontMonospaced")); jMenuFont.add(jmiMonospaced);
557 JMenuItem jmiSelectFont = new JMenuItem(actionSelectFont); jMenuFont.add(jmiSelectFont);
558 jMenuFont.addSeparator();
559 JMenu jMenuFontColor = new JMenu(Translatrix.getTranslationString("Color"));
560 customAttr = new Hashtable(); customAttr.put("color","black");
561 jMenuFontColor.add(new JMenuItem(new CustomAction(this, Translatrix.getTranslationString("CustomColor") + menuDialog, HTML.Tag.FONT, customAttr)));
562 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorAqua"), new Color( 0,255,255))));
563 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorBlack"), new Color( 0, 0, 0))));
564 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorBlue"), new Color( 0, 0,255))));
565 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorFuschia"), new Color(255, 0,255))));
566 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorGray"), new Color(128,128,128))));
567 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorGreen"), new Color( 0,128, 0))));
568 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorLime"), new Color( 0,255, 0))));
569 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorMaroon"), new Color(128, 0, 0))));
570 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorNavy"), new Color( 0, 0,128))));
571 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorOlive"), new Color(128,128, 0))));
572 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorPurple"), new Color(128, 0,128))));
573 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorRed"), new Color(255, 0, 0))));
574 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorSilver"), new Color(192,192,192))));
575 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorTeal"), new Color( 0,128,128))));
576 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorWhite"), new Color(255,255,255))));
577 jMenuFontColor.add(new JMenuItem(new StyledEditorKit.ForegroundAction(Translatrix.getTranslationString("ColorYellow"), new Color(255,255, 0))));
578 jMenuFont.add(jMenuFontColor);
579
580 /* FORMAT Menu */
581 jMenuFormat = new JMenu(Translatrix.getTranslationString("Format"));
582 htMenus.put(KEY_MENU_FORMAT, jMenuFormat);
583 JMenu jMenuFormatAlign = new JMenu(Translatrix.getTranslationString("Align"));
584 jMenuFormatAlign.add(new JMenuItem(new StyledEditorKit.AlignmentAction(Translatrix.getTranslationString("AlignLeft"), StyleConstants.ALIGN_LEFT)));
585 jMenuFormatAlign.add(new JMenuItem(new StyledEditorKit.AlignmentAction(Translatrix.getTranslationString("AlignCenter"), StyleConstants.ALIGN_CENTER)));
586 jMenuFormatAlign.add(new JMenuItem(new StyledEditorKit.AlignmentAction(Translatrix.getTranslationString("AlignRight"), StyleConstants.ALIGN_RIGHT)));
587 jMenuFormatAlign.add(new JMenuItem(new StyledEditorKit.AlignmentAction(Translatrix.getTranslationString("AlignJustified"), StyleConstants.ALIGN_JUSTIFIED)));
588 jMenuFormat.add(jMenuFormatAlign);
589 jMenuFormat.addSeparator();
590 JMenu jMenuFormatHeading = new JMenu(Translatrix.getTranslationString("Heading"));
591 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading1"), HTML.Tag.H1)));
592 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading2"), HTML.Tag.H2)));
593 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading3"), HTML.Tag.H3)));
594 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading4"), HTML.Tag.H4)));
595 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading5"), HTML.Tag.H5)));
596 jMenuFormatHeading.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("Heading6"), HTML.Tag.H6)));
597 jMenuFormat.add(jMenuFormatHeading);
598 jMenuFormat.addSeparator();
599 JMenuItem jmiUList = new JMenuItem(actionListUnordered); if(showMenuIcons) { jmiUList.setIcon(getEkitIcon("UList")); } jMenuFormat.add(jmiUList);
600 JMenuItem jmiOList = new JMenuItem(actionListOrdered); if(showMenuIcons) { jmiOList.setIcon(getEkitIcon("OList")); } jMenuFormat.add(jmiOList);
601 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("ListItem"), HTML.Tag.LI)));
602 jMenuFormat.addSeparator();
603 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatBlockquote"), HTML.Tag.BLOCKQUOTE)));
604 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatPre"), HTML.Tag.PRE)));
605 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatStrong"), HTML.Tag.STRONG)));
606 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatEmphasis"), HTML.Tag.EM)));
607 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatTT"), HTML.Tag.TT)));
608 jMenuFormat.add(new JMenuItem(new FormatAction(this, Translatrix.getTranslationString("FormatSpan"), HTML.Tag.SPAN)));
609 jMenuFormat.addSeparator();
610 JMenuItem jmiClearStyles = new JMenuItem(actionClearFormat); if(showMenuIcons) { jmiClearStyles.setIcon(getEkitIcon("ClearFormat")); }; jMenuFormat.add(jmiClearStyles);
611
612 /* INSERT Menu */
613 jMenuInsert = new JMenu(Translatrix.getTranslationString("Insert"));
614 htMenus.put(KEY_MENU_INSERT, jMenuInsert);
615 jMenuInsert.add(new JMenuItem(actionInsertAnchor));
616 JMenuItem jmiBreak = new JMenuItem(Translatrix.getTranslationString("InsertBreak")); jmiBreak.setActionCommand("insertbreak"); jmiBreak.addActionListener(this); jmiBreak.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, java.awt.Event.SHIFT_MASK, false)); jMenuInsert.add(jmiBreak);
617 JMenuItem jmiNBSP = new JMenuItem(Translatrix.getTranslationString("InsertNBSP")); jmiNBSP.setActionCommand("insertnbsp"); jmiNBSP.addActionListener(this); jMenuInsert.add(jmiNBSP);
618 JMenuItem jmiHRule = new JMenuItem((Action)actions.get("InsertHR")); jmiHRule.setText(Translatrix.getTranslationString("InsertHorizontalRule")); jMenuInsert.add(jmiHRule);
619 jMenuInsert.addSeparator();
620 JMenuItem jmiImageLocal = new JMenuItem(Translatrix.getTranslationString("InsertLocalImage") + menuDialog); jmiImageLocal.setActionCommand("insertlocalimage"); jmiImageLocal.addActionListener(this); jMenuInsert.add(jmiImageLocal);
621 JMenuItem jmiImageServer = new JMenuItem(Translatrix.getTranslationString("InsertServerImage") + menuDialog); jmiImageServer.setActionCommand("insertserverimage"); jmiImageServer.addActionListener(this); jMenuInsert.add(jmiImageServer);
622
623 /* TABLE Menu */
624 jMenuTable = new JMenu(Translatrix.getTranslationString("Table"));
625 htMenus.put(KEY_MENU_TABLE, jMenuTable);
626 JMenuItem jmiTable = new JMenuItem(Translatrix.getTranslationString("InsertTable") + menuDialog); jmiTable.setActionCommand("inserttable"); jmiTable.addActionListener(this); jMenuTable.add(jmiTable);
627 jMenuTable.addSeparator();
628 JMenuItem jmiTableRow = new JMenuItem(Translatrix.getTranslationString("InsertTableRow")); jmiTableRow.setActionCommand("inserttablerow"); jmiTableRow.addActionListener(this); jMenuTable.add(jmiTableRow);
629 JMenuItem jmiTableCol = new JMenuItem(Translatrix.getTranslationString("InsertTableColumn")); jmiTableCol.setActionCommand("inserttablecolumn"); jmiTableCol.addActionListener(this); jMenuTable.add(jmiTableCol);
630 jMenuTable.addSeparator();
631 JMenuItem jmiTableRowDel = new JMenuItem(Translatrix.getTranslationString("DeleteTableRow")); jmiTableRowDel.setActionCommand("deletetablerow"); jmiTableRowDel.addActionListener(this); jMenuTable.add(jmiTableRowDel);
632 JMenuItem jmiTableColDel = new JMenuItem(Translatrix.getTranslationString("DeleteTableColumn")); jmiTableColDel.setActionCommand("deletetablecolumn"); jmiTableColDel.addActionListener(this); jMenuTable.add(jmiTableColDel);
633
634 /* FORMS Menu */
635 jMenuForms = new JMenu(Translatrix.getTranslationString("Forms"));
636 htMenus.put(KEY_MENU_FORMS, jMenuForms);
637 JMenuItem jmiFormInsertForm = new JMenuItem(Translatrix.getTranslationString("FormInsertForm")); jmiFormInsertForm.setActionCommand("insertform"); jmiFormInsertForm.addActionListener(this); jMenuForms.add(jmiFormInsertForm);
638 jMenuForms.addSeparator();
639 JMenuItem jmiFormTextfield = new JMenuItem(Translatrix.getTranslationString("FormTextfield")); jmiFormTextfield.setActionCommand("inserttextfield"); jmiFormTextfield.addActionListener(this); jMenuForms.add(jmiFormTextfield);
640 JMenuItem jmiFormTextarea = new JMenuItem(Translatrix.getTranslationString("FormTextarea")); jmiFormTextarea.setActionCommand("inserttextarea"); jmiFormTextarea.addActionListener(this); jMenuForms.add(jmiFormTextarea);
641 JMenuItem jmiFormCheckbox = new JMenuItem(Translatrix.getTranslationString("FormCheckbox")); jmiFormCheckbox.setActionCommand("insertcheckbox"); jmiFormCheckbox.addActionListener(this); jMenuForms.add(jmiFormCheckbox);
642 JMenuItem jmiFormRadio = new JMenuItem(Translatrix.getTranslationString("FormRadio")); jmiFormRadio.setActionCommand("insertradiobutton"); jmiFormRadio.addActionListener(this); jMenuForms.add(jmiFormRadio);
643 JMenuItem jmiFormPassword = new JMenuItem(Translatrix.getTranslationString("FormPassword")); jmiFormPassword.setActionCommand("insertpassword"); jmiFormPassword.addActionListener(this); jMenuForms.add(jmiFormPassword);
644 jMenuForms.addSeparator();
645 JMenuItem jmiFormButton = new JMenuItem(Translatrix.getTranslationString("FormButton")); jmiFormButton.setActionCommand("insertbutton"); jmiFormButton.addActionListener(this); jMenuForms.add(jmiFormButton);
646 JMenuItem jmiFormButtonSubmit = new JMenuItem(Translatrix.getTranslationString("FormButtonSubmit")); jmiFormButtonSubmit.setActionCommand("insertbuttonsubmit"); jmiFormButtonSubmit.addActionListener(this); jMenuForms.add(jmiFormButtonSubmit);
647 JMenuItem jmiFormButtonReset = new JMenuItem(Translatrix.getTranslationString("FormButtonReset")); jmiFormButtonReset.setActionCommand("insertbuttonreset"); jmiFormButtonReset.addActionListener(this); jMenuForms.add(jmiFormButtonReset);
648
649 /* SEARCH Menu */
650 jMenuSearch = new JMenu(Translatrix.getTranslationString("Search"));
651 htMenus.put(KEY_MENU_SEARCH, jMenuSearch);
652 JMenuItem jmiFind = new JMenuItem(Translatrix.getTranslationString("SearchFind")); jmiFind.setActionCommand("find"); jmiFind.addActionListener(this); jmiFind.setAccelerator(KeyStroke.getKeyStroke('F', java.awt.Event.CTRL_MASK, false)); jMenuSearch.add(jmiFind);
653 JMenuItem jmiFindAgain = new JMenuItem(Translatrix.getTranslationString("SearchFindAgain")); jmiFindAgain.setActionCommand("findagain"); jmiFindAgain.addActionListener(this); jmiFindAgain.setAccelerator(KeyStroke.getKeyStroke('G', java.awt.Event.CTRL_MASK, false)); jMenuSearch.add(jmiFindAgain);
654 JMenuItem jmiReplace = new JMenuItem(Translatrix.getTranslationString("SearchReplace")); jmiReplace.setActionCommand("replace"); jmiReplace.addActionListener(this); jmiReplace.setAccelerator(KeyStroke.getKeyStroke('R', java.awt.Event.CTRL_MASK, false)); jMenuSearch.add(jmiReplace);
655
656 /* TOOLS Menu */
657 jMenuTools = new JMenu(Translatrix.getTranslationString("Tools"));
658 htMenus.put(KEY_MENU_TOOLS, jMenuTools);
659 JMenuItem jmiSpellcheck = new JMenuItem(Translatrix.getTranslationString("ToolSpellcheck")); jmiSpellcheck.setActionCommand("spellcheck"); jmiSpellcheck.addActionListener(this); jMenuTools.add(jmiSpellcheck);
660
661 /* HELP Menu */
662 jMenuHelp = new JMenu(Translatrix.getTranslationString("Help"));
663 htMenus.put(KEY_MENU_HELP, jMenuHelp);
664 JMenuItem jmiAbout = new JMenuItem(Translatrix.getTranslationString("About")); jmiAbout.setActionCommand("helpabout"); jmiAbout.addActionListener(this); jMenuHelp.add(jmiAbout);
665
666 /* DEBUG Menu */
667 jMenuDebug = new JMenu(Translatrix.getTranslationString("Debug"));
668 htMenus.put(KEY_MENU_DEBUG, jMenuDebug);
669 JMenuItem jmiDesc = new JMenuItem(Translatrix.getTranslationString("DescribeDoc")); jmiDesc.setActionCommand("describe"); jmiDesc.addActionListener(this); jMenuDebug.add(jmiDesc);
670 JMenuItem jmiDescCSS = new JMenuItem(Translatrix.getTranslationString("DescribeCSS")); jmiDescCSS.setActionCommand("describecss"); jmiDescCSS.addActionListener(this); jMenuDebug.add(jmiDescCSS);
671 JMenuItem jmiTag = new JMenuItem(Translatrix.getTranslationString("WhatTags")); jmiTag.setActionCommand("whattags"); jmiTag.addActionListener(this); jMenuDebug.add(jmiTag);
672
673 /* Create menubar and add menus */
674 jMenuBar = new JMenuBar();
675 jMenuBar.add(jMenuFile);
676 jMenuBar.add(jMenuEdit);
677 jMenuBar.add(jMenuView);
678 jMenuBar.add(jMenuFont);
679 jMenuBar.add(jMenuFormat);
680 jMenuBar.add(jMenuSearch);
681 jMenuBar.add(jMenuInsert);
682 jMenuBar.add(jMenuTable);
683 jMenuBar.add(jMenuForms);
684 jMenuBar.add(jMenuTools);
685 jMenuBar.add(jMenuHelp);
686 if(debugMode)
687 {
688 jMenuBar.add(jMenuDebug);
689 }
690
691 /* Create the toolbar */
692 jToolBar = new JToolBar(JToolBar.HORIZONTAL);
693 jToolBar.setFloatable(false);
694 jbtnNewHTML = new JButtonNoFocus(getEkitIcon("New")); jbtnNewHTML.setToolTipText(Translatrix.getTranslationString("NewDocument")); jbtnNewHTML.setActionCommand("newdoc"); jbtnNewHTML.addActionListener(this); jToolBar.add(jbtnNewHTML); htTools.put(KEY_TOOL_NEW, jbtnNewHTML);
695 jbtnOpenHTML = new JButtonNoFocus(getEkitIcon("Open")); jbtnOpenHTML.setToolTipText(Translatrix.getTranslationString("OpenDocument")); jbtnOpenHTML.setActionCommand("openhtml"); jbtnOpenHTML.addActionListener(this); jToolBar.add(jbtnOpenHTML); htTools.put(KEY_TOOL_OPEN, jbtnOpenHTML);
696 jbtnSaveHTML = new JButtonNoFocus(getEkitIcon("Save")); jbtnSaveHTML.setToolTipText(Translatrix.getTranslationString("SaveDocument")); jbtnSaveHTML.setActionCommand("saveas"); jbtnSaveHTML.addActionListener(this); jToolBar.add(jbtnSaveHTML); htTools.put(KEY_TOOL_SAVE, jbtnSaveHTML);
697 jToolBar.add(new JToolBar.Separator());
698 jbtnCut = new JButtonNoFocus(new DefaultEditorKit.CutAction()); jbtnCut.setIcon(getEkitIcon("Cut")); jbtnCut.setText(null); jbtnCut.setToolTipText(Translatrix.getTranslationString("Cut")); jToolBar.add(jbtnCut); htTools.put(KEY_TOOL_CUT, jbtnCut);
699 jbtnCopy = new JButtonNoFocus(new DefaultEditorKit.CopyAction()); jbtnCopy.setIcon(getEkitIcon("Copy")); jbtnCopy.setText(null); jbtnCopy.setToolTipText(Translatrix.getTranslationString("Copy")); jToolBar.add(jbtnCopy); htTools.put(KEY_TOOL_COPY, jbtnCopy);
700 jbtnPaste = new JButtonNoFocus(new DefaultEditorKit.PasteAction()); jbtnPaste.setIcon(getEkitIcon("Paste")); jbtnPaste.setText(null); jbtnPaste.setToolTipText(Translatrix.getTranslationString("Paste")); jToolBar.add(jbtnPaste); htTools.put(KEY_TOOL_PASTE, jbtnPaste);
701 jToolBar.add(new JToolBar.Separator());
702 jbtnBold = new JButtonNoFocus(actionFontBold); jbtnBold.setIcon(getEkitIcon("Bold")); jbtnBold.setText(null); jbtnBold.setToolTipText(Translatrix.getTranslationString("FontBold")); jToolBar.add(jbtnBold); htTools.put(KEY_TOOL_BOLD, jbtnBold);
703 jbtnItalic = new JButtonNoFocus(actionFontItalic); jbtnItalic.setIcon(getEkitIcon("Italic")); jbtnItalic.setText(null); jbtnItalic.setToolTipText(Translatrix.getTranslationString("FontItalic")); jToolBar.add(jbtnItalic); htTools.put(KEY_TOOL_ITALIC, jbtnItalic);
704 jbtnUnderline = new JButtonNoFocus(actionFontUnderline); jbtnUnderline.setIcon(getEkitIcon("Underline")); jbtnUnderline.setText(null); jbtnUnderline.setToolTipText(Translatrix.getTranslationString("FontUnderline")); jToolBar.add(jbtnUnderline); htTools.put(KEY_TOOL_UNDERLINE, jbtnUnderline);
705 jbtnStrike = new JButtonNoFocus(actionFontStrike); jbtnStrike.setIcon(getEkitIcon("Strike")); jbtnStrike.setText(null); jbtnStrike.setToolTipText(Translatrix.getTranslationString("FontStrike")); jToolBar.add(jbtnStrike); htTools.put(KEY_TOOL_STRIKE, jbtnStrike);
706 jbtnSuperscript = new JButtonNoFocus(actionFontSuperscript); jbtnSuperscript.setIcon(getEkitIcon("Super")); jbtnSuperscript.setText(null); jbtnSuperscript.setToolTipText(Translatrix.getTranslationString("FontSuperscript")); jToolBar.add(jbtnSuperscript); htTools.put(KEY_TOOL_SUPER, jbtnSuperscript);
707 jbtnSubscript = new JButtonNoFocus(actionFontSubscript); jbtnSubscript.setIcon(getEkitIcon("Sub")); jbtnSubscript.setText(null); jbtnSubscript.setToolTipText(Translatrix.getTranslationString("FontSubscript")); jToolBar.add(jbtnSubscript); htTools.put(KEY_TOOL_SUB, jbtnSubscript);
708 jbtnUList = new JButtonNoFocus(actionListUnordered); jbtnUList.setIcon(getEkitIcon("UList")); jbtnUList.setText(null); jbtnUList.setToolTipText(Translatrix.getTranslationString("ListUnordered")); jToolBar.add(jbtnUList); htTools.put(KEY_TOOL_ULIST, jbtnUList);
709 jbtnOList = new JButtonNoFocus(actionListOrdered); jbtnOList.setIcon(getEkitIcon("OList")); jbtnOList.setText(null); jbtnOList.setToolTipText(Translatrix.getTranslationString("ListOrdered")); jToolBar.add(jbtnOList); htTools.put(KEY_TOOL_OLIST, jbtnOList);
710 jbtnClearFormat = new JButtonNoFocus(actionClearFormat); jbtnClearFormat.setIcon(getEkitIcon("ClearFormat")); jbtnClearFormat.setText(null); jbtnClearFormat.setToolTipText(Translatrix.getTranslationString("FormatClear")); jToolBar.add(jbtnClearFormat); htTools.put(KEY_TOOL_CLEAR, jbtnClearFormat);
711 jToolBar.add(new JToolBar.Separator());
712 jbtnAnchor = new JButtonNoFocus(actionInsertAnchor); jbtnAnchor.setIcon(getEkitIcon("Anchor")); jbtnAnchor.setText(null); jbtnAnchor.setToolTipText(Translatrix.getTranslationString("ToolAnchor")); jToolBar.add(jbtnAnchor); htTools.put(KEY_TOOL_ANCHOR, jbtnAnchor);
713 jToolBar.add(new JToolBar.Separator());
714 jtbtnViewSource = new JToggleButtonNoFocus(getEkitIcon("Source")); jtbtnViewSource.setText(null); jtbtnViewSource.setToolTipText(Translatrix.getTranslationString("ViewSource")); jtbtnViewSource.setActionCommand("viewsource"); jtbtnViewSource.addActionListener(this); jtbtnViewSource.setPreferredSize(jbtnAnchor.getPreferredSize()); jtbtnViewSource.setMinimumSize(jbtnAnchor.getMinimumSize()); jtbtnViewSource.setMaximumSize(jbtnAnchor.getMaximumSize()); jToolBar.add(jtbtnViewSource); htTools.put(KEY_TOOL_SOURCE, jtbtnViewSource);
715 jToolBar.add(new JToolBar.Separator());
716 jcmbStyleSelector = new JComboBoxNoFocus(); jToolBar.add(jcmbStyleSelector); jcmbStyleSelector.setAction(new StylesAction(jcmbStyleSelector)); htTools.put(KEY_TOOL_STYLES, jcmbStyleSelector);
717
718 /* Create the scroll area for the text pane */
719 JScrollPane jspViewport = new JScrollPane(jtpMain);
720 jspViewport.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
721 jspViewport.setPreferredSize(new Dimension(400, 400));
722 jspViewport.setMinimumSize(new Dimension(32, 32));
723
724 /* Create the scroll area for the source viewer */
725 jspSource = new JScrollPane(jtpSource);
726 jspSource.setPreferredSize(new Dimension(400, 100));
727 jspSource.setMinimumSize(new Dimension(32, 32));
728
729 jspltDisplay = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
730 jspltDisplay.setTopComponent(jspViewport);
731 if(showViewSource)
732 {
733 jspltDisplay.setBottomComponent(jspSource);
734 }
735 else
736 {
737 jspltDisplay.setBottomComponent(null);
738 }
739
740 iSplitPos = jspltDisplay.getDividerLocation();
741
742 registerDocumentStyles();
743
744 /* Create spell checker */
745 try
746 {
747 dictFile = Translatrix.getTranslationString("DictionaryFile");
748 SpellDictionary dictionary = new SpellDictionary(dictFile); // uses my custom loader in SpellDictionary
749 spellCheck = new SpellChecker(dictionary);
750 spellCheck.addSpellCheckListener(this);
751 }
752 catch(Exception e)
753 {
754 e.printStackTrace();
755 }
756 spellDialog = new JSpellDialog(this.getFrame(), Translatrix.getTranslationString("ToolSpellcheckDialog"), true);
757
758 /* Add the components to the app */
759 this.setLayout(new BorderLayout());
760 this.add(jspltDisplay, BorderLayout.CENTER);
761 }
762
763 /** Common Constructor
764 * @param sDocument [String] A text or HTML document to load in the editor upon startup.
765 * @param sStyleSheet [String] A CSS stylesheet to load in the editor upon startup.
766 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
767 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
768 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
769 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
770 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
771 */
772 public EkitCore(String sDocument, String sStyleSheet, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, String sLanguage, String sCountry, boolean base64)
773 {
774 this(sDocument, sStyleSheet, null, null, showViewSource, showMenuIcons, editModeExclusive, sLanguage, sCountry, base64, false);
775 }
776
777 /** Default Language Constructor
778 * @param sDocument [String] A text or HTML document to load in the editor upon startup.
779 * @param sStyleSheet [String] A CSS stylesheet to load in the editor upon startup.
780 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
781 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
782 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
783 */
784 public EkitCore(String sDocument, String sStyleSheet, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, boolean base64)
785 {
786 this(sDocument, sStyleSheet, null, null, showViewSource, showMenuIcons, editModeExclusive, null, null, base64, false);
787 }
788
789 /** Raw/Base64 Document & Style Sheet URL Constructor (Ideal for EkitApplet)
790 * @param sRawDocument [String] A document encoded as a String to load in the editor upon startup.
791 * @param sRawDocument [String] A document encoded as a String to load in the editor upon startup.
792 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
793 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
794 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
795 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
796 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
797 */
798 public EkitCore(String sRawDocument, URL urlStyleSheet, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, String sLanguage, String sCountry, boolean base64)
799 {
800 this(null, null, sRawDocument, urlStyleSheet, showViewSource, showMenuIcons, editModeExclusive, sLanguage, sCountry, base64, false);
801 }
802
803 /** Document Constructor
804 * @param sRawDocument [String] A document encoded as a String to load in the editor upon startup.
805 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
806 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
807 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
808 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
809 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
810 */
811 public EkitCore(String sRawDocument, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, String sLanguage, String sCountry, boolean base64)
812 {
813 this(null, null, sRawDocument, null, showViewSource, showMenuIcons, editModeExclusive, sLanguage, sCountry, base64, false);
814 }
815
816 /** Default Language & Document Constructor
817 * @param sRawDocument [String] A document encoded as a String to load in the editor upon startup.
818 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
819 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
820 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
821 */
822 public EkitCore(String sRawDocument, boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, boolean base64)
823 {
824 this(null, null, sRawDocument, null, showViewSource, showMenuIcons, editModeExclusive, null, null, base64, false);
825 }
826
827 /** Flags & Language Constructor
828 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
829 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
830 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
831 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
832 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
833 */
834 public EkitCore(boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive, String sLanguage, String sCountry)
835 {
836 this(null, null, null, null, showViewSource, showMenuIcons, editModeExclusive, sLanguage, sCountry, false, false);
837 }
838
839 /** Flags Constructor
840 * @param showViewSource [boolean] Specifies whether or not to show the View Source window on startup.
841 * @param showMenuIcons [boolean] Specifies whether or not to show icon pictures in menus.
842 * @param editModeExclusive [boolean] Specifies whether or not to use exclusive edit mode (recommended on).
843 */
844 public EkitCore(boolean showViewSource, boolean showMenuIcons, boolean editModeExclusive)
845 {
846 this(null, null, null, null, showViewSource, showMenuIcons, editModeExclusive, null, null, false, false);
847 }
848
849 /** Language & Debug Constructor
850 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
851 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
852 * @param debugMode [boolean] Specifies whether to show the Debug menu or not.
853 */
854 public EkitCore(String sLanguage, String sCountry, boolean debugMode)
855 {
856 this(null, null, null, null, false, true, true, sLanguage, sCountry, false, debugMode);
857 }
858
859 /** Language Constructor
860 * @param sLanguage [String] The language portion of the Internationalization Locale to run Ekit in.
861 * @param sCountry [String] The country portion of the Internationalization Locale to run Ekit in.
862 */
863 public EkitCore(String sLanguage, String sCountry)
864 {
865 this(null, null, null, null, false, true, true, sLanguage, sCountry, false, false);
866 }
867
868 /** Debug Constructor
869 * @param debugMode [boolean] Specifies whether to show the Debug menu or not.
870 */
871 public EkitCore(boolean debugMode)
872 {
873 this(null, null, null, null, false, true, true, null, null, false, debugMode);
874 }
875
876 /** Empty Constructor
877 */
878 public EkitCore()
879 {
880 this(null, null, null, null, false, true, true, null, null, false, false);
881 }
882
883 /* ActionListener method */
884 public void actionPerformed(ActionEvent ae)
885 {
886 try
887 {
888 String command = ae.getActionCommand();
889 if(command.equals("newdoc"))
890 {
891 SimpleInfoDialog sidAsk = new SimpleInfoDialog(this.getFrame(), "", true, Translatrix.getTranslationString("AskNewDocument"), SimpleInfoDialog.QUESTION);
892 String decision = sidAsk.getDecisionValue();
893 if(decision.equals(Translatrix.getTranslationString("DialogAccept")))
894 {
895 if(styleSheet != null)
896 {
897 htmlDoc = new ExtendedHTMLDocument(styleSheet);
898 }
899 else
900 {
901 htmlDoc = (ExtendedHTMLDocument)(htmlKit.createDefaultDocument());
902 }
903 jtpMain.setText("<HTML><BODY></BODY></HTML>");
904 jtpSource.setText(jtpMain.getText());
905 registerDocument(htmlDoc);
906 currentFile = null;
907 updateTitle();
908 }
909 }
910 else if(command.equals("openhtml"))
911 {
912 openDocument(null);
913 }
914 else if(command.equals("opencss"))
915 {
916 openStyleSheet(null);
917 }
918 else if(command.equals("openb64"))
919 {
920 openDocumentBase64(null);
921 }
922 else if(command.equals("save"))
923 {
924 writeOut((HTMLDocument)(jtpMain.getDocument()), currentFile);
925 updateTitle();
926 }
927 else if(command.equals("saveas"))
928 {
929 writeOut((HTMLDocument)(jtpMain.getDocument()), null);
930 }
931 else if(command.equals("savebody"))
932 {
933 writeOutFragment((HTMLDocument)(jtpMain.getDocument()),"body");
934 }
935 else if(command.equals("savertf"))
936 {
937 writeOutRTF((StyledDocument)(jtpMain.getStyledDocument()));
938 }
939 else if(command.equals("saveb64"))
940 {
941 writeOutBase64(jtpSource.getText());
942 }
943 else if(command.equals("textcut"))
944 {
945 if(jspSource.isShowing() && jtpSource.hasFocus())
946 {
947 jtpSource.cut();
948 }
949 else
950 {
951 jtpMain.cut();
952 }
953 }
954 else if(command.equals("textcopy"))
955 {
956 if(jspSource.isShowing() && jtpSource.hasFocus())
957 {
958 jtpSource.copy();
959 }
960 else
961 {
962 jtpMain.copy();
963 }
964 }
965 else if(command.equals("textpaste"))
966 {
967 if(jspSource.isShowing() && jtpSource.hasFocus())
968 {
969 jtpSource.paste();
970 }
971 else
972 {
973 jtpMain.paste();
974 }
975 }
976 else if(command.equals("describe"))
977 {
978 System.out.println("------------DOCUMENT------------");
979 System.out.println("Content Type : " + jtpMain.getContentType());
980 System.out.println("Editor Kit : " + jtpMain.getEditorKit());
981 System.out.println("Doc Tree :");
982 System.out.println("");
983 describeDocument(jtpMain.getStyledDocument());
984 System.out.println("--------------------------------");
985 System.out.println("");
986 }
987 else if(command.equals("describecss"))
988 {
989 System.out.println("-----------STYLESHEET-----------");
990 System.out.println("Stylesheet Rules");
991 Enumeration rules = styleSheet.getStyleNames();
992 while(rules.hasMoreElements())
993 {
994 String ruleName = (String)(rules.nextElement());
995 Style styleRule = styleSheet.getStyle(ruleName);
996 System.out.println(styleRule.toString());
997 }
998 System.out.println("--------------------------------");
999 System.out.println("");
1000 }
1001 else if(command.equals("whattags"))
1002 {
1003 System.out.println("Caret Position : " + jtpMain.getCaretPosition());
1004 AttributeSet attribSet = jtpMain.getCharacterAttributes();
1005 Enumeration attribs = attribSet.getAttributeNames();
1006 System.out.println("Attributes : ");
1007 while(attribs.hasMoreElements())
1008 {
1009 String attribName = attribs.nextElement().toString();
1010 System.out.println(" " + attribName + " | " + attribSet.getAttribute(attribName));
1011 }
1012 }
1013 else if(command.equals("toggletoolbar"))
1014 {
1015 jToolBar.setVisible(jcbmiViewToolbar.isSelected());
1016 }
1017 else if(command.equals("viewsource"))
1018 {
1019 toggleSourceWindow();
1020 }
1021 else if(command.equals("serialize"))
1022 {
1023 serializeOut((HTMLDocument)(jtpMain.getDocument()));
1024 }
1025 else if(command.equals("readfromser"))
1026 {
1027 serializeIn();
1028 }
1029 else if(command.equals("inserttable"))
1030 {
1031 String[] fieldNames = { "rows", "cols", "border", "cellspacing", "cellpadding", "width" };
1032 String[] fieldTypes = { "text", "text", "text", "text", "text", "text" };
1033 insertTable((Hashtable)null, fieldNames, fieldTypes);
1034 }
1035 else if(command.equals("inserttablerow"))
1036 {
1037 insertTableRow();
1038 }
1039 else if(command.equals("inserttablecolumn"))
1040 {
1041 insertTableColumn();
1042 }
1043 else if(command.equals("deletetablerow"))
1044 {
1045 deleteTableRow();
1046 }
1047 else if(command.equals("deletetablecolumn"))
1048 {
1049 deleteTableColumn();
1050 }
1051 else if(command.equals("insertbreak"))
1052 {
1053 insertBreak();
1054 }
1055 else if(command.equals("insertlocalimage"))
1056 {
1057 insertLocalImage(null);
1058 }
1059 else if(command.equals("insertserverimage"))
1060 {
1061 insertServerImage();
1062 }
1063 else if(command.equals("insertnbsp"))
1064 {
1065 insertNonbreakingSpace();
1066 }
1067 else if(command.equals("insertform"))
1068 {
1069 String[] fieldNames = { "name", "method", "enctype" };
1070 String[] fieldTypes = { "text", "combo", "text" };
1071 String[] fieldValues = { "", "POST,GET", "text" };
1072 insertFormElement(HTML.Tag.FORM, "form", (Hashtable)null, fieldNames, fieldTypes, fieldValues, true);
1073 }
1074 else if(command.equals("inserttextfield"))
1075 {
1076 Hashtable htAttribs = new Hashtable();
1077 htAttribs.put("type", "text");
1078 String[] fieldNames = { "name", "value", "size", "maxlength" };
1079 String[] fieldTypes = { "text", "text", "text", "text" };
1080 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1081 }
1082 else if(command.equals("inserttextarea"))
1083 {
1084 String[] fieldNames = { "name", "rows", "cols" };
1085 String[] fieldTypes = { "text", "text", "text" };
1086 insertFormElement(HTML.Tag.TEXTAREA, "textarea", (Hashtable)null, fieldNames, fieldTypes, true);
1087 }
1088 else if(command.equals("insertcheckbox"))
1089 {
1090 Hashtable htAttribs = new Hashtable();
1091 htAttribs.put("type", "checkbox");
1092 String[] fieldNames = { "name", "checked" };
1093 String[] fieldTypes = { "text", "bool" };
1094 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1095 }
1096 else if(command.equals("insertradiobutton"))
1097 {
1098 Hashtable htAttribs = new Hashtable();
1099 htAttribs.put("type", "radio");
1100 String[] fieldNames = { "name", "checked" };
1101 String[] fieldTypes = { "text", "bool" };
1102 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1103 }
1104 else if(command.equals("insertpassword"))
1105 {
1106 Hashtable htAttribs = new Hashtable();
1107 htAttribs.put("type", "password");
1108 String[] fieldNames = { "name", "value", "size", "maxlength" };
1109 String[] fieldTypes = { "text", "text", "text", "text" };
1110 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1111 }
1112 else if(command.equals("insertbutton"))
1113 {
1114 Hashtable htAttribs = new Hashtable();
1115 htAttribs.put("type", "button");
1116 String[] fieldNames = { "name", "value" };
1117 String[] fieldTypes = { "text", "text" };
1118 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1119 }
1120 else if(command.equals("insertbuttonsubmit"))
1121 {
1122 Hashtable htAttribs = new Hashtable();
1123 htAttribs.put("type", "submit");
1124 String[] fieldNames = { "name", "value" };
1125 String[] fieldTypes = { "text", "text" };
1126 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1127 }
1128 else if(command.equals("insertbuttonreset"))
1129 {
1130 Hashtable htAttribs = new Hashtable();
1131 htAttribs.put("type", "reset");
1132 String[] fieldNames = { "name", "value" };
1133 String[] fieldTypes = { "text", "text" };
1134 insertFormElement(HTML.Tag.INPUT, "input", htAttribs, fieldNames, fieldTypes, false);
1135 }
1136 else if(command.equals("find"))
1137 {
1138 doSearch((String)null, (String)null, false, lastSearchCaseSetting, lastSearchTopSetting);
1139 }
1140 else if(command.equals("findagain"))
1141 {
1142 doSearch(lastSearchFindTerm, (String)null, false, lastSearchCaseSetting, false);
1143 }
1144 else if(command.equals("replace"))
1145 {
1146 doSearch((String)null, (String)null, true, lastSearchCaseSetting, lastSearchTopSetting);
1147 }
1148 else if(command.equals("exit"))
1149 {
1150 this.dispose();
1151 }
1152 else if(command.equals("helpabout"))
1153 {
1154 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("About"), true, Translatrix.getTranslationString("AboutMessage"), SimpleInfoDialog.INFO);
1155 }
1156 else if(command.equals("spellcheck"))
1157 {
1158 spellCheck.checkSpelling(new DocumentWordTokenizer(jtpMain.getDocument()));
1159 }
1160 }
1161 catch(IOException ioe)
1162 {
1163 logException("IOException in actionPerformed method", ioe);
1164 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorIOException"), SimpleInfoDialog.ERROR);
1165 }
1166 catch(BadLocationException ble)
1167 {
1168 logException("BadLocationException in actionPerformed method", ble);
1169 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorBadLocationException"), SimpleInfoDialog.ERROR);
1170 }
1171 catch(NumberFormatException nfe)
1172 {
1173 logException("NumberFormatException in actionPerformed method", nfe);
1174 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorNumberFormatException"), SimpleInfoDialog.ERROR);
1175 }
1176 catch(ClassNotFoundException cnfe)
1177 {
1178 logException("ClassNotFound Exception in actionPerformed method", cnfe);
1179 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorClassNotFoundException "), SimpleInfoDialog.ERROR);
1180 }
1181 catch(RuntimeException re)
1182 {
1183 logException("RuntimeException in actionPerformed method", re);
1184 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorRuntimeException"), SimpleInfoDialog.ERROR);
1185 }
1186 }
1187
1188 /* KeyListener methods */
1189 public void keyTyped(KeyEvent ke)
1190 {
1191 Element elem;
1192 String selectedText;
1193 int pos = this.getCaretPosition();
1194 int repos = -1;
1195 if(ke.getKeyChar() == KeyEvent.VK_BACK_SPACE)
1196 {
1197 try
1198 {
1199 if(pos > 0)
1200 {
1201 if((selectedText = jtpMain.getSelectedText()) != null)
1202 {
1203 htmlUtilities.delete();
1204 return;
1205 }
1206 else
1207 {
1208 int sOffset = htmlDoc.getParagraphElement(pos).getStartOffset();
1209 if(sOffset == jtpMain.getSelectionStart())
1210 {
1211 boolean content = true;
1212 if(htmlUtilities.checkParentsTag(HTML.Tag.LI))
1213 {
1214 elem = htmlUtilities.getListItemParent();
1215 content = false;
1216 int so = elem.getStartOffset();
1217 int eo = elem.getEndOffset();
1218 if(so + 1 < eo)
1219 {
1220 char[] temp = jtpMain.getText(so, eo - so).toCharArray();
1221 for(int i=0; i < temp.length; i++)
1222 {
1223 if(!(new Character(temp[i])).isWhitespace(temp[i]))
1224 {
1225 content = true;
1226 }
1227 }
1228 }
1229 if(!content)
1230 {
1231 Element listElement = elem.getParentElement();
1232 htmlUtilities.removeTag(elem, true);
1233 this.setCaretPosition(sOffset - 1);
1234 return;
1235 }
1236 else
1237 {
1238 jtpMain.setCaretPosition(jtpMain.getCaretPosition() - 1);
1239 jtpMain.moveCaretPosition(jtpMain.getCaretPosition() - 2);
1240 jtpMain.replaceSelection("");
1241 return;
1242 }
1243 }
1244 else if(htmlUtilities.checkParentsTag(HTML.Tag.TABLE))
1245 {
1246 jtpMain.setCaretPosition(jtpMain.getCaretPosition() - 1);
1247 ke.consume();
1248 return;
1249 }
1250 }
1251 jtpMain.replaceSelection("");
1252 return;
1253 }
1254 }
1255 }
1256 catch (BadLocationException ble)
1257 {
1258 logException("BadLocationException in keyTyped method", ble);
1259 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorBadLocationException"), SimpleInfoDialog.ERROR);
1260 }
1261 catch (IOException ioe)
1262 {
1263 logException("IOException in keyTyped method", ioe);
1264 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorIOException"), SimpleInfoDialog.ERROR);
1265 }
1266 }
1267 else if(ke.getKeyChar() == KeyEvent.VK_ENTER)
1268 {
1269 try
1270 {
1271 if(htmlUtilities.checkParentsTag(HTML.Tag.UL) == true | htmlUtilities.checkParentsTag(HTML.Tag.OL) == true)
1272 {
1273 elem = htmlUtilities.getListItemParent();
1274 int so = elem.getStartOffset();
1275 int eo = elem.getEndOffset();
1276 char[] temp = this.getTextPane().getText(so,eo-so).toCharArray();
1277 boolean content = false;
1278 for(int i=0;i<temp.length;i++)
1279 {
1280 if(!(new Character(temp[i])).isWhitespace(temp[i]))
1281 {
1282 content = true;
1283 }
1284 }
1285 if(content)
1286 {
1287 int end = -1;
1288 int j = temp.length;
1289 do
1290 {
1291 j--;
1292 if(new Character(temp[j]).isLetterOrDigit(temp[j]))
1293 {
1294 end = j;
1295 }
1296 } while (end == -1 && j >= 0);
1297 j = end;
1298 do
1299 {
1300 j++;
1301 if(!new Character(temp[j]).isSpaceChar(temp[j]))
1302 {
1303 repos = j - end -1;
1304 }
1305 } while (repos == -1 && j < temp.length);
1306 if(repos == -1)
1307 {
1308 repos = 0;
1309 }
1310 }
1311 if(elem.getStartOffset() == elem.getEndOffset() || !content)
1312 {
1313 manageListElement(elem);
1314 }
1315 else
1316 {
1317 if(this.getCaretPosition() + 1 == elem.getEndOffset())
1318 {
1319 insertListStyle(elem);
1320 this.setCaretPosition(pos - repos);
1321 }
1322 else
1323 {
1324 int caret = this.getCaretPosition();
1325 String tempString = this.getTextPane().getText(caret, eo - caret);
1326 this.getTextPane().select(caret, eo - 1);
1327 this.getTextPane().replaceSelection("");
1328 htmlUtilities.insertListElement(tempString);
1329 Element newLi = htmlUtilities.getListItemParent();
1330 this.setCaretPosition(newLi.getEndOffset() - 1);
1331 }
1332 }
1333 }
1334 }
1335 catch (BadLocationException ble)
1336 {
1337 logException("BadLocationException in keyTyped method", ble);
1338 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorBadLocationException"), SimpleInfoDialog.ERROR);
1339 }
1340 catch (IOException ioe)
1341 {
1342 logException("IOException in keyTyped method", ioe);
1343 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorIOException"), SimpleInfoDialog.ERROR);
1344 }
1345 }
1346 }
1347 public void keyPressed(KeyEvent e) {}
1348 public void keyReleased(KeyEvent e) {}
1349
1350 public void insertListStyle(Element element)
1351 throws BadLocationException,IOException
1352 {
1353 if(element.getParentElement().getName() == "ol")
1354 {
1355 actionListOrdered.actionPerformed(new ActionEvent(new Object(), 0, "newListPoint"));
1356 }
1357 else
1358 {
1359 actionListUnordered.actionPerformed(new ActionEvent(new Object(), 0, "newListPoint"));
1360 }
1361 }
1362
1363 /* DocumentListener methods */
1364 public void changedUpdate(DocumentEvent de) { handleDocumentChange(de); }
1365 public void insertUpdate(DocumentEvent de) { handleDocumentChange(de); }
1366 public void removeUpdate(DocumentEvent de) { handleDocumentChange(de); }
1367 public void handleDocumentChange(DocumentEvent de)
1368 {
1369 if(!exclusiveEdit)
1370 {
1371 if(jspSource.isShowing())
1372 {
1373 if(de.getDocument() instanceof HTMLDocument || de.getDocument() instanceof ExtendedHTMLDocument)
1374 {
1375 jtpSource.getDocument().removeDocumentListener(this);
1376 jtpSource.setText(jtpMain.getText());
1377 jtpSource.getDocument().addDocumentListener(this);
1378 }
1379 else if(de.getDocument() instanceof PlainDocument || de.getDocument() instanceof DefaultStyledDocument)
1380 {
1381 jtpMain.getDocument().removeDocumentListener(this);
1382 jtpMain.setText(jtpSource.getText());
1383 jtpMain.getDocument().addDocumentListener(this);
1384 }
1385 }
1386 }
1387 }
1388
1389 /* SpellCheckListener methods */
1390 public void spellingError(SpellCheckEvent event)
1391 {
1392 spellDialog.show(event);
1393 }
1394
1395 /** Method for setting a document as the current document for the text pane
1396 * and re-registering the controls and settings for it
1397 */
1398 public void registerDocument(ExtendedHTMLDocument htmlDoc)
1399 {
1400 jtpMain.setDocument(htmlDoc);
1401 jtpMain.getDocument().addUndoableEditListener(new CustomUndoableEditListener());
1402 jtpMain.getDocument().addDocumentListener(this);
1403 purgeUndos();
1404 registerDocumentStyles();
1405 }
1406
1407 /** Method for locating the available CSS style for the document and adding
1408 * them to the styles selector
1409 */
1410 public void registerDocumentStyles()
1411 {
1412 if(jcmbStyleSelector == null || htmlDoc == null)
1413 {
1414 return;
1415 }
1416 jcmbStyleSelector.setEnabled(false);
1417 jcmbStyleSelector.removeAllItems();
1418 jcmbStyleSelector.addItem(Translatrix.getTranslationString("NoCSSStyle"));
1419 for(Enumeration e = htmlDoc.getStyleNames(); e.hasMoreElements();)
1420 {
1421 String name = (String) e.nextElement();
1422 if(name.length() > 0 && name.charAt(0) == '.')
1423 {
1424 jcmbStyleSelector.addItem(name.substring(1));
1425 }
1426 }
1427 jcmbStyleSelector.setEnabled(true);
1428 }
1429
1430 /** Method for inserting an HTML Table
1431 */
1432 private void insertTable(Hashtable attribs, String[] fieldNames, String[] fieldTypes)
1433 throws IOException, BadLocationException, RuntimeException, NumberFormatException
1434 {
1435 int caretPos = jtpMain.getCaretPosition();
1436 StringBuffer compositeElement = new StringBuffer("<TABLE");
1437 if(attribs != null && attribs.size() > 0)
1438 {
1439 Enumeration attribEntries = attribs.keys();
1440 while(attribEntries.hasMoreElements())
1441 {
1442 Object entryKey = attribEntries.nextElement();
1443 Object entryValue = attribs.get(entryKey);
1444 if(entryValue != null && entryValue != "")
1445 {
1446 compositeElement.append(" " + entryKey + "=" + '"' + entryValue + '"');
1447 }
1448 }
1449 }
1450 int rows = 0;
1451 int cols = 0;
1452 if(fieldNames != null && fieldNames.length > 0)
1453 {
1454 PropertiesDialog propertiesDialog = new PropertiesDialog(this.getFrame(), fieldNames, fieldTypes, Translatrix.getTranslationString("FormDialogTitle"), true);
1455 propertiesDialog.show();
1456 String decision = propertiesDialog.getDecisionValue();
1457 if(decision.equals(Translatrix.getTranslationString("DialogCancel")))
1458 {
1459 propertiesDialog.dispose();
1460 propertiesDialog = null;
1461 return;
1462 }
1463 else
1464 {
1465 for(int iter = 0; iter < fieldNames.length; iter++)
1466 {
1467 String fieldName = fieldNames[iter];
1468 String propValue = propertiesDialog.getFieldValue(fieldName);
1469 if(propValue != null && propValue != "" && propValue.length() > 0)
1470 {
1471 if(fieldName.equals("rows"))
1472 {
1473 rows = Integer.parseInt(propValue);
1474 }
1475 else if(fieldName.equals("cols"))
1476 {
1477 cols = Integer.parseInt(propValue);
1478 }
1479 else
1480 {
1481 compositeElement.append(" " + fieldName + "=" + '"' + propValue + '"');
1482 }
1483 }
1484 }
1485 }
1486 propertiesDialog.dispose();
1487 propertiesDialog = null;
1488 }
1489 compositeElement.append(">");
1490 for(int i = 0; i < rows; i++)
1491 {
1492 compositeElement.append("<TR>");
1493 for(int j = 0; j < cols; j++)
1494 {
1495 compositeElement.append("<TD></TD>");
1496 }
1497 compositeElement.append("</TR>");
1498 }
1499 compositeElement.append("</TABLE><P>&nbsp;<P>");
1500 htmlKit.insertHTML(htmlDoc, caretPos, compositeElement.toString(), 0, 0, HTML.Tag.TABLE);
1501 jtpMain.setCaretPosition(caretPos + 1);
1502 refreshOnUpdate();
1503 }
1504
1505 /** Method for inserting a row into an HTML Table
1506 */
1507 private void insertTableRow()
1508 {
1509 int caretPos = jtpMain.getCaretPosition();
1510 Element element = htmlDoc.getCharacterElement(jtpMain.getCaretPosition());
1511 Element elementParent = element.getParentElement();
1512 int startPoint = -1;
1513 int columnCount = -1;
1514 while(elementParent != null && !elementParent.getName().equals("body"))
1515 {
1516 if(elementParent.getName().equals("tr"))
1517 {
1518 startPoint = elementParent.getStartOffset();
1519 columnCount = elementParent.getElementCount();
1520 break;
1521 }
1522 else
1523 {
1524 elementParent = elementParent.getParentElement();
1525 }
1526 }
1527 if(startPoint > -1 && columnCount > -1)
1528 {
1529 jtpMain.setCaretPosition(startPoint);
1530 StringBuffer sRow = new StringBuffer();
1531 sRow.append("<TR>");
1532 for(int i = 0; i < columnCount; i++)
1533 {
1534 sRow.append("<TD></TD>");
1535 }
1536 sRow.append("</TR>");
1537 ActionEvent actionEvent = new ActionEvent(jtpMain, 0, "insertTableRow");
1538 new HTMLEditorKit.InsertHTMLTextAction("insertTableRow", sRow.toString(), HTML.Tag.TABLE, HTML.Tag.TR).actionPerformed(actionEvent);
1539 refreshOnUpdate();
1540 jtpMain.setCaretPosition(caretPos);
1541 }
1542 }
1543
1544 /** Method for inserting a column into an HTML Table
1545 */
1546 private void insertTableColumn()
1547 {
1548 int caretPos = jtpMain.getCaretPosition();
1549 Element element = htmlDoc.getCharacterElement(jtpMain.getCaretPosition());
1550 Element elementParent = element.getParentElement();
1551 int startPoint = -1;
1552 int rowCount = -1;
1553 int cellOffset = 0;
1554 while(elementParent != null && !elementParent.getName().equals("body"))
1555 {
1556 if(elementParent.getName().equals("table"))
1557 {
1558 startPoint = elementParent.getStartOffset();
1559 rowCount = elementParent.getElementCount();
1560 break;
1561 }
1562 else if(elementParent.getName().equals("tr"))
1563 {
1564 int rowStart = elementParent.getStartOffset();
1565 int rowCells = elementParent.getElementCount();
1566 for(int i = 0; i < rowCells; i++)
1567 {
1568 Element currentCell = elementParent.getElement(i);
1569 if(jtpMain.getCaretPosition() >= currentCell.getStartOffset() && jtpMain.getCaretPosition() <= currentCell.getEndOffset())
1570 {
1571 cellOffset = i;
1572 }
1573 }
1574 elementParent = elementParent.getParentElement();
1575 }
1576 else
1577 {
1578 elementParent = elementParent.getParentElement();
1579 }
1580 }
1581 if(startPoint > -1 && rowCount > -1)
1582 {
1583 jtpMain.setCaretPosition(startPoint);
1584 String sCell = "<TD></TD>";
1585 ActionEvent actionEvent = new ActionEvent(jtpMain, 0, "insertTableCell");
1586 for(int i = 0; i < rowCount; i++)
1587 {
1588 Element row = elementParent.getElement(i);
1589 Element whichCell = row.getElement(cellOffset);
1590 jtpMain.setCaretPosition(whichCell.getStartOffset());
1591 new HTMLEditorKit.InsertHTMLTextAction("insertTableCell", sCell, HTML.Tag.TR, HTML.Tag.TD, HTML.Tag.TH, HTML.Tag.TD).actionPerformed(actionEvent);
1592 }
1593 refreshOnUpdate();
1594 jtpMain.setCaretPosition(caretPos);
1595 }
1596 }
1597
1598 /** Method for inserting a cell into an HTML Table
1599 */
1600 private void insertTableCell()
1601 {
1602 String sCell = "<TD></TD>";
1603 ActionEvent actionEvent = new ActionEvent(jtpMain, 0, "insertTableCell");
1604 new HTMLEditorKit.InsertHTMLTextAction("insertTableCell", sCell, HTML.Tag.TR, HTML.Tag.TD, HTML.Tag.TH, HTML.Tag.TD).actionPerformed(actionEvent);
1605 refreshOnUpdate();
1606 }
1607
1608 /** Method for deleting a row from an HTML Table
1609 */
1610 private void deleteTableRow()
1611 throws BadLocationException
1612 {
1613 int caretPos = jtpMain.getCaretPosition();
1614 Element element = htmlDoc.getCharacterElement(jtpMain.getCaretPosition());
1615 Element elementParent = element.getParentElement();
1616 int startPoint = -1;
1617 int endPoint = -1;
1618 while(elementParent != null && !elementParent.getName().equals("body"))
1619 {
1620 if(elementParent.getName().equals("tr"))
1621 {
1622 startPoint = elementParent.getStartOffset();
1623 endPoint = elementParent.getEndOffset();
1624 break;
1625 }
1626 else
1627 {
1628 elementParent = elementParent.getParentElement();
1629 }
1630 }
1631 if(startPoint > -1 && endPoint > startPoint)
1632 {
1633 htmlDoc.remove(startPoint, endPoint - startPoint);
1634 jtpMain.setDocument(htmlDoc);
1635 registerDocument(htmlDoc);
1636 refreshOnUpdate();
1637 if(caretPos >= htmlDoc.getLength())
1638 {
1639 caretPos = htmlDoc.getLength() - 1;
1640 }
1641 jtpMain.setCaretPosition(caretPos);
1642 }
1643 }
1644
1645 /** Method for deleting a column from an HTML Table
1646 */
1647 private void deleteTableColumn()
1648 throws BadLocationException
1649 {
1650 int caretPos = jtpMain.getCaretPosition();
1651 Element element = htmlDoc.getCharacterElement(jtpMain.getCaretPosition());
1652 Element elementParent = element.getParentElement();
1653 Element elementCell = (Element)null;
1654 Element elementRow = (Element)null;
1655 Element elementTable = (Element)null;
1656 // Locate the table, row, and cell location of the cursor
1657 while(elementParent != null && !elementParent.getName().equals("body"))
1658 {
1659 if(elementParent.getName().equals("td"))
1660 {
1661 elementCell = elementParent;
1662 }
1663 else if(elementParent.getName().equals("tr"))
1664 {
1665 elementRow = elementParent;
1666 }
1667 else if(elementParent.getName().equals("table"))
1668 {
1669 elementTable = elementParent;
1670 }
1671 elementParent = elementParent.getParentElement();
1672 }
1673 int whichColumn = -1;
1674 if(elementCell != null && elementRow != null && elementTable != null)
1675 {
1676 // Find the column the cursor is in
1677 for(int i = 0; i < elementRow.getElementCount(); i++)
1678 {
1679 if(elementCell == elementRow.getElement(i))
1680 {
1681 whichColumn = i;
1682 }
1683 }
1684 if(whichColumn > -1)
1685 {
1686 // Iterate through the table rows, deleting cells from the indicated column
1687 for(int i = 0; i < elementTable.getElementCount(); i++)
1688 {
1689 elementRow = elementTable.getElement(i);
1690 elementCell = (elementRow.getElementCount() > whichColumn ? elementRow.getElement(whichColumn) : elementRow.getElement(elementRow.getElementCount() - 1));
1691 int columnCellStart = elementCell.getStartOffset();
1692 int columnCellEnd = elementCell.getEndOffset();
1693 htmlDoc.remove(columnCellStart, columnCellEnd - columnCellStart);
1694 }
1695 jtpMain.setDocument(htmlDoc);
1696 registerDocument(htmlDoc);
1697 refreshOnUpdate();
1698 if(caretPos >= htmlDoc.getLength())
1699 {
1700 caretPos = htmlDoc.getLength() - 1;
1701 }
1702 jtpMain.setCaretPosition(caretPos);
1703 }
1704 }
1705 }
1706
1707 /** Method for inserting a break (BR) element
1708 */
1709 private void insertBreak()
1710 throws IOException, BadLocationException, RuntimeException
1711 {
1712 int caretPos = jtpMain.getCaretPosition();
1713 htmlKit.insertHTML(htmlDoc, caretPos, "<BR>", 0, 0, HTML.Tag.BR);
1714 jtpMain.setCaretPosition(caretPos + 1);
1715 }
1716
1717 /** Method for inserting a non-breaking space (&nbsp;)
1718 */
1719 private void insertNonbreakingSpace()
1720 throws IOException, BadLocationException, RuntimeException
1721 {
1722 int caretPos = jtpMain.getCaretPosition();
1723 htmlDoc.insertString(caretPos, "\240", jtpMain.getInputAttributes());
1724 jtpMain.setCaretPosition(caretPos + 1);
1725 }
1726
1727 /** Method for inserting a form element
1728 */
1729 private void insertFormElement(HTML.Tag baseTag, String baseElement, Hashtable attribs, String[] fieldNames, String[] fieldTypes, String[] fieldValues, boolean hasClosingTag)
1730 throws IOException, BadLocationException, RuntimeException
1731 {
1732 int caretPos = jtpMain.getCaretPosition();
1733 StringBuffer compositeElement = new StringBuffer("<" + baseElement);
1734 if(attribs != null && attribs.size() > 0)
1735 {
1736 Enumeration attribEntries = attribs.keys();
1737 while(attribEntries.hasMoreElements())
1738 {
1739 Object entryKey = attribEntries.nextElement();
1740 Object entryValue = attribs.get(entryKey);
1741 if(entryValue != null && entryValue != "")
1742 {
1743 compositeElement.append(" " + entryKey + "=" + '"' + entryValue + '"');
1744 }
1745 }
1746 }
1747 if(fieldNames != null && fieldNames.length > 0)
1748 {
1749 PropertiesDialog propertiesDialog = new PropertiesDialog(this.getFrame(), fieldNames, fieldTypes, fieldValues, Translatrix.getTranslationString("FormDialogTitle"), true);
1750 propertiesDialog.show();
1751 String decision = propertiesDialog.getDecisionValue();
1752 if(decision.equals(Translatrix.getTranslationString("DialogCancel")))
1753 {
1754 propertiesDialog.dispose();
1755 propertiesDialog = null;
1756 return;
1757 }
1758 else
1759 {
1760 for(int iter = 0; iter < fieldNames.length; iter++)
1761 {
1762 String fieldName = fieldNames[iter];
1763 String propValue = propertiesDialog.getFieldValue(fieldName);
1764 if(propValue != null && propValue.length() > 0)
1765 {
1766 if(fieldName.equals("checked"))
1767 {
1768 if(propValue.equals("true"))
1769 {
1770 compositeElement.append(" " + fieldName + "=" + '"' + propValue + '"');
1771 }
1772 }
1773 else
1774 {
1775 compositeElement.append(" " + fieldName + "=" + '"' + propValue + '"');
1776 }
1777 }
1778 }
1779 }
1780 propertiesDialog.dispose();
1781 propertiesDialog = null;
1782 }
1783 // --- Convenience for editing, this makes the FORM visible
1784 if(useFormIndicator && baseElement.equals("form"))
1785 {
1786 compositeElement.append(" bgcolor=" + '"' + clrFormIndicator + '"');
1787 }
1788 // --- END
1789 compositeElement.append(">");
1790 if(hasClosingTag)
1791 {
1792 compositeElement.append("</" + baseElement + ">");
1793 }
1794 if(baseTag == HTML.Tag.FORM)
1795 {
1796 compositeElement.append("<P>&nbsp;</P>");
1797 }
1798 htmlKit.insertHTML(htmlDoc, caretPos, compositeElement.toString(), 0, 0, baseTag);
1799 // jtpMain.setCaretPosition(caretPos + 1);
1800 refreshOnUpdate();
1801 }
1802
1803 /** Alternate method call for inserting a form element
1804 */
1805 private void insertFormElement(HTML.Tag baseTag, String baseElement, Hashtable attribs, String[] fieldNames, String[] fieldTypes, boolean hasClosingTag)
1806 throws IOException, BadLocationException, RuntimeException
1807 {
1808 insertFormElement(baseTag, baseElement, attribs, fieldNames, fieldTypes, new String[fieldNames.length], hasClosingTag);
1809 }
1810
1811 /** Method that handles initial list insertion and deletion
1812 */
1813 public void manageListElement(Element element)
1814 {
1815 Element h = htmlUtilities.getListItemParent();
1816 Element listElement = h.getParentElement();
1817 if(h != null)
1818 {
1819 htmlUtilities.removeTag(h, true);
1820 }
1821 }
1822
1823 /** Method to initiate a find/replace operation
1824 */
1825 private void doSearch(String searchFindTerm, String searchReplaceTerm, boolean bIsFindReplace, boolean bCaseSensitive, boolean bStartAtTop)
1826 {
1827 boolean bReplaceAll = false;
1828 JTextPane searchPane = jtpMain;
1829 if(jspSource.isShowing() || jtpSource.hasFocus())
1830 {
1831 searchPane = jtpSource;
1832 }
1833 if(searchFindTerm == null || (bIsFindReplace && searchReplaceTerm == null))
1834 {
1835 SearchDialog sdSearchInput = new SearchDialog(this.getFrame(), Translatrix.getTranslationString("SearchDialogTitle"), true, bIsFindReplace, bCaseSensitive, bStartAtTop);
1836 searchFindTerm = sdSearchInput.getFindTerm();
1837 searchReplaceTerm = sdSearchInput.getReplaceTerm();
1838 bCaseSensitive = sdSearchInput.getCaseSensitive();
1839 bStartAtTop = sdSearchInput.getStartAtTop();
1840 bReplaceAll = sdSearchInput.getReplaceAll();
1841 }
1842 if(searchFindTerm != null && (!bIsFindReplace || searchReplaceTerm != null))
1843 {
1844 if(bReplaceAll)
1845 {
1846 int results = findText(searchFindTerm, searchReplaceTerm, bCaseSensitive, 0);
1847 int findOffset = 0;
1848 if(results > -1)
1849 {
1850 while(results > -1)
1851 {
1852 findOffset = findOffset + searchReplaceTerm.length();
1853 results = findText(searchFindTerm, searchReplaceTerm, bCaseSensitive, findOffset);
1854 }
1855 }
1856 else
1857 {
1858 SimpleInfoDialog sidWarn = new SimpleInfoDialog(this.getFrame(), "", true, Translatrix.getTranslationString("ErrorNoOccurencesFound") + ":\n" + searchFindTerm, SimpleInfoDialog.WARNING);
1859 }
1860 }
1861 else
1862 {
1863 int results = findText(searchFindTerm, searchReplaceTerm, bCaseSensitive, (bStartAtTop ? 0 : searchPane.getCaretPosition()));
1864 if(results == -1)
1865 {
1866 SimpleInfoDialog sidWarn = new SimpleInfoDialog(this.getFrame(), "", true, Translatrix.getTranslationString("ErrorNoMatchFound") + ":\n" + searchFindTerm, SimpleInfoDialog.WARNING);
1867 }
1868 }
1869 lastSearchFindTerm = new String(searchFindTerm);
1870 if(searchReplaceTerm != null)
1871 {
1872 lastSearchReplaceTerm = new String(searchReplaceTerm);
1873 }
1874 else
1875 {
1876 lastSearchReplaceTerm = (String)null;
1877 }
1878 lastSearchCaseSetting = bCaseSensitive;
1879 lastSearchTopSetting = bStartAtTop;
1880 }
1881 }
1882
1883 /** Method for finding (and optionally replacing) a string in the text
1884 */
1885 private int findText(String findTerm, String replaceTerm, boolean bCaseSenstive, int iOffset)
1886 {
1887 JTextPane jtpFindSource;
1888 if(jspSource.isShowing() || jtpSource.hasFocus())
1889 {
1890 jtpFindSource = jtpSource;
1891 }
1892 else
1893 {
1894 jtpFindSource = jtpMain;
1895 }
1896 int searchPlace = -1;
1897 try
1898 {
1899 Document baseDocument = jtpFindSource.getDocument();
1900 searchPlace =
1901 (bCaseSenstive ?
1902 baseDocument.getText(0, baseDocument.getLength()).indexOf(findTerm, iOffset) :
1903 baseDocument.getText(0, baseDocument.getLength()).toLowerCase().indexOf(findTerm.toLowerCase(), iOffset)
1904 );
1905 if(searchPlace > -1)
1906 {
1907 if(replaceTerm != null)
1908 {
1909 AttributeSet attribs = null;
1910 if(baseDocument instanceof HTMLDocument)
1911 {
1912 Element element = ((HTMLDocument)baseDocument).getCharacterElement(searchPlace);
1913 attribs = element.getAttributes();
1914 }
1915 baseDocument.remove(searchPlace, findTerm.length());
1916 baseDocument.insertString(searchPlace, replaceTerm, attribs);
1917 jtpFindSource.setCaretPosition(searchPlace + replaceTerm.length());
1918 jtpFindSource.requestFocus();
1919 jtpFindSource.select(searchPlace, searchPlace + replaceTerm.length());
1920 }
1921 else
1922 {
1923 jtpFindSource.setCaretPosition(searchPlace + findTerm.length());
1924 jtpFindSource.requestFocus();
1925 jtpFindSource.select(searchPlace, searchPlace + findTerm.length());
1926 }
1927 }
1928 }
1929 catch(BadLocationException ble)
1930 {
1931 logException("BadLocationException in actionPerformed method", ble);
1932 SimpleInfoDialog sidAbout = new SimpleInfoDialog(this.getFrame(), Translatrix.getTranslationString("Error"), true, Translatrix.getTranslationString("ErrorBadLocationException"), SimpleInfoDialog.ERROR);
1933 }
1934 return searchPlace;
1935 }
1936
1937 /** Method for inserting an image from a file
1938 */
1939 private void insertLocalImage(File whatImage)
1940 throws IOException, BadLocationException, RuntimeException
1941 {
1942 if(whatImage == null)
1943 {
1944 whatImage = getImageFromChooser(".", extsIMG, Translatrix.getTranslationString("FiletypeIMG"));
1945 }
1946 if(whatImage != null)
1947 {
1948 int caretPos = jtpMain.getCaretPosition();
1949 htmlKit.insertHTML(htmlDoc, caretPos, "<IMG SRC=\"" + whatImage + "\">", 0, 0, HTML.Tag.IMG);
1950 jtpMain.setCaretPosition(caretPos + 1);
1951 refreshOnUpdate();
1952 }
1953 }
1954
1955 /** Method for inserting an image from a server
1956 */
1957 private void insertServerImage()
1958 throws BadLocationException
1959 {
1960 if(ServletURL != null)
1961 {
1962 try
1963 {
1964 URL theServlet = new URL(ServletURL + "?GetImages=" + TreePilotSystemID + "&ImageExtensions=" + TreePilotProperties.getString("ValidImageExtensions"));
1965 URLConnection conn = theServlet.openConnection();
1966 ObjectInputStream in = new ObjectInputStream(conn.getInputStream());
1967 String[] imageList = (String[]) in.readObject();
1968 int caretPos = jtpMain.getCaretPosition();
1969 ImageDialog imageDialog = new ImageDialog(this, ImageDir + TreePilotSystemID, imageList, "Image Chooser", true);
1970 String selectedImage = imageDialog.getSelectedImage();
1971 imageDialog.dispose();
1972 if(selectedImage != null && !selectedImage.equals(""))
1973 {
1974 htmlKit.insertHTML(htmlDoc, caretPos, selectedImage, 0, 0, HTML.Tag.IMG);
1975 jtpMain.setCaretPosition(caretPos + 1);
1976 }
1977 jtpMain.requestFocus();
1978 in.close();
1979 }
1980 catch (MalformedURLException mue)
1981 {
1982 System.err.println("MalFormedURLException during insertImage " + mue);
1983 }
1984 catch (IOException ie)
1985 {
1986 System.err.println("IOException during insertImage " + ie);
1987 }
1988 catch (ClassNotFoundException cnfe)
1989 {
1990 System.err.println("ClassNotFoundException during insertImage" + cnfe);
1991 }
1992 }
1993 }
1994
1995 /** Method for inserting an image
1996 */
1997 public String insertFile()
1998 {
1999 String selectedFile = null;
2000 if(ServletURL != null)
2001 {
2002 try
2003 {
2004 URL theServlet = new URL(ServletURL + "?GetFiles=" + TreePilotSystemID + "&FileExtensions=" + TreePilotProperties.getString("ValidFileExtensions"));
2005 URLConnection conn = theServlet.openConnection();
2006 ObjectInputStream in = new ObjectInputStream(conn.getInputStream());
2007 String[] fileList = (String[]) in.readObject();
2008 FileDialog fileDialog = new FileDialog(this, ImageDir + TreePilotSystemID, fileList, "File Chooser", true);
2009 selectedFile = fileDialog.getSelectedFile();
2010 fileDialog.dispose();
2011 in.close();
2012 }
2013 catch (MalformedURLException mue)
2014 {
2015 System.err.println("MalFormedURLException during insertFile " + mue);
2016 }
2017 catch (IOException ie)
2018 {
2019 System.err.println("IOException during insertFile " + ie);
2020 }
2021 catch (ClassNotFoundException cnfe)
2022 {
2023 System.err.println("ClassNotFoundException during insertFile" + cnfe);
2024 }
2025 }
2026 return selectedFile;
2027 }
2028
2029 /** Method for saving text as a complete HTML document
2030 */
2031 private void writeOut(HTMLDocument doc, File whatFile)
2032 throws IOException, BadLocationException
2033 {
2034 if(whatFile == null)
2035 {
2036 whatFile = getFileFromChooser(".", JFileChooser.SAVE_DIALOG, extsHTML, Translatrix.getTranslationString("FiletypeHTML"));
2037 }
2038 if(whatFile != null)
2039 {
2040 FileWriter fw = new FileWriter(whatFile);
2041 htmlKit.write(fw, doc, 0, doc.getLength());
2042 fw.flush();
2043 fw.close();
2044 currentFile = whatFile;
2045 updateTitle();
2046 }
2047 refreshOnUpdate();
2048 }
2049
2050 /** Method for saving text as an HTML fragment
2051 */
2052 private void writeOutFragment(HTMLDocument doc, String containingTag)
2053 throws IOException, BadLocationException
2054 {
2055 File whatFile = getFileFromChooser(".", JFileChooser.SAVE_DIALOG, extsHTML, Translatrix.getTranslationString("FiletypeHTML"));
2056 if(whatFile != null)
2057 {
2058 FileWriter fw = new FileWriter(whatFile);
2059// Element eleBody = locateElementInDocument((StyledDocument)doc, containingTag);
2060// htmlKit.write(fw, doc, eleBody.getStartOffset(), eleBody.getEndOffset());
2061 String docTextCase = jtpSource.getText().toLowerCase();
2062 int tagStart = docTextCase.indexOf("<" + containingTag.toLowerCase());
2063 int tagStartClose = docTextCase.indexOf(">", tagStart) + 1;
2064 String closeTag = "</" + containingTag.toLowerCase() + ">";
2065 int tagEndOpen = docTextCase.indexOf(closeTag);
2066 if(tagStartClose < 0) { tagStartClose = 0; }
2067 if(tagEndOpen < 0 || tagEndOpen > docTextCase.length()) { tagEndOpen = docTextCase.length(); }
2068 String bodyText = jtpSource.getText().substring(tagStartClose, tagEndOpen);
2069 fw.write(bodyText, 0, bodyText.length());
2070 fw.flush();
2071 fw.close();
2072 }
2073 refreshOnUpdate();
2074 }
2075
2076 /** Method for saving text as an RTF document
2077 */
2078 private void writeOutRTF(StyledDocument doc)
2079 throws IOException, BadLocationException
2080 {
2081 File whatFile = getFileFromChooser(".", JFileChooser.SAVE_DIALOG, extsRTF, Translatrix.getTranslationString("FiletypeRTF"));
2082 if(whatFile != null)
2083 {
2084 FileOutputStream fos = new FileOutputStream(whatFile);
2085 RTFEditorKit rtfKit = new RTFEditorKit();
2086 rtfKit.write(fos, doc, 0, doc.getLength());
2087 fos.flush();
2088 fos.close();
2089 }
2090 refreshOnUpdate();
2091 }
2092
2093 /** Method for saving text as a Base64 encoded document
2094 */
2095 private void writeOutBase64(String text)
2096 throws IOException, BadLocationException
2097 {
2098 File whatFile = getFileFromChooser(".", JFileChooser.SAVE_DIALOG, extsB64, Translatrix.getTranslationString("FiletypeB64"));
2099 if(whatFile != null)
2100 {
2101 String base64text = Base64Codec.encode(text);
2102 FileWriter fw = new FileWriter(whatFile);
2103 fw.write(base64text, 0, base64text.length());
2104 fw.flush();
2105 fw.close();
2106 }
2107 refreshOnUpdate();
2108 }
2109
2110 /** Method to invoke loading HTML into the app
2111 */
2112 private void openDocument(File whatFile)
2113 throws IOException, BadLocationException
2114 {
2115 if(whatFile == null)
2116 {
2117 whatFile = getFileFromChooser(".", JFileChooser.OPEN_DIALOG, extsHTML, Translatrix.getTranslationString("FiletypeHTML"));
2118 }
2119 if(whatFile != null)
2120 {
2121 try
2122 {
2123 loadDocument(whatFile, null);
2124 }
2125 catch(ChangedCharSetException ccse)
2126 {
2127 String charsetType = ccse.getCharSetSpec().toLowerCase();
2128 int pos = charsetType.indexOf("charset");
2129 if(pos == -1)
2130 {
2131 throw ccse;
2132 }
2133 while(pos < charsetType.length() && charsetType.charAt(pos) != '=')
2134 {
2135 pos++;
2136 }
2137 pos++; // Places file cursor past the equals sign (=)
2138 String whatEncoding = charsetType.substring(pos).trim();
2139 loadDocument(whatFile, whatEncoding);
2140 }
2141 }
2142 refreshOnUpdate();
2143 }
2144
2145 /** Method for loading HTML document into the app, including document encoding setting
2146 */
2147 private void loadDocument(File whatFile, String whatEncoding)
2148 throws IOException, BadLocationException
2149 {
2150 Reader r = null;
2151 htmlDoc = (ExtendedHTMLDocument)(htmlKit.createDefaultDocument());
2152 try
2153 {
2154 if(whatEncoding == null)
2155 {
2156 r = new InputStreamReader(new FileInputStream(whatFile));
2157 }
2158 else
2159 {
2160 r = new InputStreamReader(new FileInputStream(whatFile), whatEncoding);
2161 htmlDoc.putProperty("IgnoreCharsetDirective", new Boolean(true));
2162 }
2163 htmlKit.read(r, htmlDoc, 0);
2164 r.close();
2165 registerDocument(htmlDoc);
2166 jtpSource.setText(jtpMain.getText());
2167 currentFile = whatFile;
2168 updateTitle();
2169 }
2170 finally
2171 {
2172 if(r != null)
2173 {
2174 r.close();
2175 }
2176 }
2177 }
2178
2179 /** Method for loading a Base64 encoded document
2180 */
2181 private void openDocumentBase64(File whatFile)
2182 throws IOException, BadLocationException
2183 {
2184 if(whatFile == null)
2185 {
2186 whatFile = getFileFromChooser(".", JFileChooser.OPEN_DIALOG, extsB64, Translatrix.getTranslationString("FiletypeB64"));
2187 }
2188 if(whatFile != null)
2189 {
2190 FileReader fr = new FileReader(whatFile);
2191 int nextChar = 0;
2192 StringBuffer encodedText = new StringBuffer();
2193 try
2194 {
2195 while((nextChar = fr.read()) != -1)
2196 {
2197 encodedText.append((char)nextChar);
2198 }
2199 fr.close();
2200 jtpSource.setText(Base64Codec.decode(encodedText.toString()));
2201 jtpMain.setText(jtpSource.getText());
2202 registerDocument((ExtendedHTMLDocument)(jtpMain.getDocument()));
2203 }
2204 finally
2205 {
2206 if(fr != null)
2207 {
2208 fr.close();
2209 }
2210 }
2211 }
2212 }
2213
2214 /** Method for loading a Stylesheet into the app
2215 */
2216 private void openStyleSheet(File fileCSS)
2217 throws IOException
2218 {
2219 if(fileCSS == null)
2220 {
2221 fileCSS = getFileFromChooser(".", JFileChooser.OPEN_DIALOG, extsCSS, Translatrix.getTranslationString("FiletypeCSS"));
2222 }
2223 if(fileCSS != null)
2224 {
2225 String currDocText = jtpMain.getText();
2226 htmlDoc = (ExtendedHTMLDocument)(htmlKit.createDefaultDocument());
2227 styleSheet = htmlDoc.getStyleSheet();
2228 URL cssUrl = fileCSS.toURL();
2229 InputStream is = cssUrl.openStream();
2230 BufferedReader br = new BufferedReader(new InputStreamReader(is));
2231 styleSheet.loadRules(br, cssUrl);
2232 br.close();
2233 htmlDoc = new ExtendedHTMLDocument(styleSheet);
2234 registerDocument(htmlDoc);
2235 jtpMain.setText(currDocText);
2236 jtpSource.setText(jtpMain.getText());
2237 }
2238 refreshOnUpdate();
2239 }
2240
2241 /** Method for serializing the document out to a file
2242 */
2243 public void serializeOut(HTMLDocument doc)
2244 throws IOException
2245 {
2246 File whatFile = getFileFromChooser(".", JFileChooser.SAVE_DIALOG, extsSer, Translatrix.getTranslationString("FiletypeSer"));
2247 if(whatFile != null)
2248 {
2249 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(whatFile));
2250 oos.writeObject(doc);
2251 oos.flush();
2252 oos.close();
2253 }
2254 refreshOnUpdate();
2255 }
2256
2257 /** Method for reading in a serialized document from a file
2258 */
2259 public void serializeIn()
2260 throws IOException, ClassNotFoundException
2261 {
2262 File whatFile = getFileFromChooser(".", JFileChooser.OPEN_DIALOG, extsSer, Translatrix.getTranslationString("FiletypeSer"));
2263 if(whatFile != null)
2264 {
2265 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(whatFile));
2266 htmlDoc = (ExtendedHTMLDocument)(ois.readObject());
2267 ois.close();
2268 registerDocument(htmlDoc);
2269 validate();
2270 }
2271 refreshOnUpdate();
2272 }
2273
2274 /** Method for obtaining a File for input/output using a JFileChooser dialog
2275 */
2276 private File getFileFromChooser(String startDir, int dialogType, String[] exts, String desc)
2277 {
2278 JFileChooser jfileDialog = new JFileChooser(startDir);
2279 jfileDialog.setDialogType(dialogType);
2280 jfileDialog.setFileFilter(new MutableFilter(exts, desc));
2281 int optionSelected = JFileChooser.CANCEL_OPTION;
2282 if(dialogType == JFileChooser.OPEN_DIALOG)
2283 {
2284 optionSelected = jfileDialog.showOpenDialog(this);
2285 }
2286 else if(dialogType == JFileChooser.SAVE_DIALOG)
2287 {
2288 optionSelected = jfileDialog.showSaveDialog(this);
2289 }
2290 else // default to an OPEN_DIALOG
2291 {
2292 optionSelected = jfileDialog.showOpenDialog(this);
2293 }
2294 if(optionSelected == JFileChooser.APPROVE_OPTION)
2295 {
2296 return jfileDialog.getSelectedFile();
2297 }
2298 return (File)null;
2299 }
2300
2301 /** Method for obtaining an Image for input using a custom JFileChooser dialog
2302 */
2303 private File getImageFromChooser(String startDir, String[] exts, String desc)
2304 {
2305 ImageFileChooser jImageDialog = new ImageFileChooser(startDir);
2306 jImageDialog.setDialogType(JFileChooser.CUSTOM_DIALOG);
2307 jImageDialog.setFileFilter(new MutableFilter(exts, desc));
2308 jImageDialog.setDialogTitle(Translatrix.getTranslationString("ImageDialogTitle"));
2309 int optionSelected = JFileChooser.CANCEL_OPTION;
2310 optionSelected = jImageDialog.showDialog(this, Translatrix.getTranslationString("Insert"));
2311 if(optionSelected == JFileChooser.APPROVE_OPTION)
2312 {
2313 return jImageDialog.getSelectedFile();
2314 }
2315 return (File)null;
2316 }
2317
2318 /** Method for describing the node hierarchy of the document
2319 */
2320 private void describeDocument(StyledDocument doc)
2321 {
2322 Element[] elements = doc.getRootElements();
2323 for(int i = 0; i < elements.length; i++)
2324 {
2325 indent = indentStep;
2326 for(int j = 0; j < indent; j++) { System.out.print(" "); }
2327 System.out.print(elements[i]);
2328 traverseElement(elements[i]);
2329 System.out.println("");
2330 }
2331 }
2332
2333 /** Traverses nodes for the describing method
2334 */
2335 private void traverseElement(Element element)
2336 {
2337 indent += indentStep;
2338 for(int i = 0; i < element.getElementCount(); i++)
2339 {
2340 for(int j = 0; j < indent; j++) { System.out.print(" "); }
2341 System.out.print(element.getElement(i));
2342 traverseElement(element.getElement(i));
2343 }
2344 indent -= indentStep;
2345 }
2346
2347 /** Method to locate a node element by name
2348 */
2349 private Element locateElementInDocument(StyledDocument doc, String elementName)
2350 {
2351 Element[] elements = doc.getRootElements();
2352 for(int i = 0; i < elements.length; i++)
2353 {
2354 if(elements[i].getName().equalsIgnoreCase(elementName))
2355 {
2356 return elements[i];
2357 }
2358 else
2359 {
2360 Element rtnElement = locateChildElementInDocument(elements[i], elementName);
2361 if(rtnElement != null)
2362 {
2363 return rtnElement;
2364 }
2365 }
2366 }
2367 return (Element)null;
2368 }
2369
2370 /** Traverses nodes for the locating method
2371 */
2372 private Element locateChildElementInDocument(Element element, String elementName)
2373 {
2374 for(int i = 0; i < element.getElementCount(); i++)
2375 {
2376 if(element.getElement(i).getName().equalsIgnoreCase(elementName))
2377 {
2378 return element.getElement(i);
2379 }
2380 }
2381 return (Element)null;
2382 }
2383
2384 /** Convenience method for obtaining the WYSIWYG JTextPane
2385 */
2386 public JTextPane getTextPane()
2387 {
2388 return jtpMain;
2389 }
2390
2391 /** Convenience method for obtaining the Source JTextPane
2392 */
2393 public JTextPane getSourcePane()
2394 {
2395 return jtpSource;
2396 }
2397
2398 /** Convenience method for obtaining the application as a Frame
2399 */
2400 public Frame getFrame()
2401 {
2402 return frameHandler;
2403 }
2404
2405 /** Convenience method for setting the parent Frame
2406 */
2407 public void setFrame(Frame parentFrame)
2408 {
2409 frameHandler = parentFrame;
2410 }
2411
2412 /** Convenience method for obtaining the pre-generated menu bar
2413 */
2414 public JMenuBar getMenuBar()
2415 {
2416 return jMenuBar;
2417 }
2418
2419 /** Convenience method for obtaining a custom menu bar
2420 */
2421 public JMenuBar getCustomMenuBar(Vector vcMenus)
2422 {
2423 jMenuBar = new JMenuBar();
2424 for(int i = 0; i < vcMenus.size(); i++)
2425 {
2426 String menuToAdd = ((String)(vcMenus.elementAt(i))).toLowerCase();
2427 if(htMenus.containsKey(menuToAdd))
2428 {
2429 jMenuBar.add((JMenu)(htMenus.get(menuToAdd)));
2430 }
2431 }
2432 return jMenuBar;
2433 }
2434
2435 /** Convenience method for obtaining the pre-generated toolbar
2436 */
2437 public JToolBar getToolBar(boolean isShowing)
2438 {
2439 jcbmiViewToolbar.setState(isShowing);
2440 return jToolBar;
2441 }
2442
2443 /** Convenience method for obtaining the pre-generated toolbar
2444 */
2445 public JToolBar getCustomToolBar(Vector vcTools, boolean isShowing)
2446 {
2447 jcbmiViewToolbar.setState(isShowing);
2448 jToolBar = new JToolBar(JToolBar.HORIZONTAL);
2449 jToolBar.setFloatable(false);
2450 for(int i = 0; i < vcTools.size(); i++)
2451 {
2452 String toolToAdd = ((String)(vcTools.elementAt(i))).toLowerCase();
2453 if(toolToAdd.equals(KEY_TOOL_SEP))
2454 {
2455 jToolBar.add(new JToolBar.Separator());
2456 }
2457 else if(htTools.containsKey(toolToAdd))
2458 {
2459 if(htTools.get(toolToAdd) instanceof JButtonNoFocus)
2460 {
2461 jToolBar.add((JButtonNoFocus)(htTools.get(toolToAdd)));
2462 }
2463 else if(htTools.get(toolToAdd) instanceof JToggleButtonNoFocus)
2464 {
2465 jToolBar.add((JToggleButtonNoFocus)(htTools.get(toolToAdd)));
2466 }
2467 else if(htTools.get(toolToAdd) instanceof JComboBoxNoFocus)
2468 {
2469 jToolBar.add((JComboBoxNoFocus)(htTools.get(toolToAdd)));
2470 }
2471 else
2472 {
2473 jToolBar.add((JComponent)(htTools.get(toolToAdd)));
2474 }
2475 }
2476 }
2477 return jToolBar;
2478 }
2479
2480 /** Convenience method for obtaining the current file handle
2481 */
2482 public File getCurrentFile()
2483 {
2484 return currentFile;
2485 }
2486
2487 /** Convenience method for obtaining the application name
2488 */
2489 public String getAppName()
2490 {
2491 return appName;
2492 }
2493
2494 /** Convenience method for obtaining the document text
2495 */
2496 public String getDocumentText()
2497 {
2498 return jtpMain.getText();
2499 }
2500
2501 /** Convenience method for obtaining the document text
2502 * contained within a tag pair
2503 */
2504 public String getDocumentSubText(String tagBlock)
2505 {
2506 return getSubText(tagBlock);
2507 }
2508
2509 /** Method for extracting the text within a tag
2510 */
2511 private String getSubText(String containingTag)
2512 {
2513 jtpSource.setText(jtpMain.getText());
2514 String docTextCase = jtpSource.getText().toLowerCase();
2515 int tagStart = docTextCase.indexOf("<" + containingTag.toLowerCase());
2516 int tagStartClose = docTextCase.indexOf(">", tagStart) + 1;
2517 String closeTag = "</" + containingTag.toLowerCase() + ">";
2518 int tagEndOpen = docTextCase.indexOf(closeTag);
2519 if(tagStartClose < 0) { tagStartClose = 0; }
2520 if(tagEndOpen < 0 || tagEndOpen > docTextCase.length()) { tagEndOpen = docTextCase.length(); }
2521 return jtpSource.getText().substring(tagStartClose, tagEndOpen);
2522 }
2523
2524 /** Convenience method for obtaining the document text
2525 * contained within the BODY tags (a common request)
2526 */
2527 public String getDocumentBody()
2528 {
2529 return getSubText("body");
2530 }
2531
2532 /** Convenience method for setting the document text
2533 */
2534 public void setDocumentText(String sText)
2535 {
2536 jtpMain.setText(sText);
2537 ((HTMLEditorKit)(jtpMain.getEditorKit())).setDefaultCursor(new Cursor(Cursor.TEXT_CURSOR));
2538 jtpSource.setText(jtpMain.getText());
2539 ((HTMLEditorKit)(jtpSource.getEditorKit())).setDefaultCursor(new Cursor(Cursor.TEXT_CURSOR));
2540 }
2541
2542 /** Convenience method for obtaining the document text
2543 */
2544 private void updateTitle()
2545 {
2546 frameHandler.setTitle(appName + (currentFile == null ? "" : " - " + currentFile.getName()));
2547 }
2548
2549 /** Convenience method for clearing out the UndoManager
2550 */
2551 public void purgeUndos()
2552 {
2553 if(undoMngr != null)
2554 {
2555 undoMngr.discardAllEdits();
2556 undoAction.updateUndoState();
2557 redoAction.updateRedoState();
2558 }
2559 }
2560
2561 /** Convenience method for refreshing and displaying changes
2562 */
2563 public void refreshOnUpdate()
2564 {
2565 jtpMain.setText(jtpMain.getText());
2566 jtpSource.setText(jtpMain.getText());
2567 purgeUndos();
2568 this.repaint();
2569 }
2570
2571 /** Convenience method for deallocating the app resources
2572 */
2573 public void dispose()
2574 {
2575 frameHandler.dispose();
2576 spellCheck.dispose();
2577 spellCheck = null;
2578 spellDialog = null;
2579 System.exit(0);
2580 }
2581
2582 /** Convenience method for fetching icon images from jar file
2583 */
2584 private ImageIcon getEkitIcon(String iconName)
2585 {
2586 return new ImageIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icons/" + iconName + "HK.gif")));
2587 }
2588
2589 /** Convenience method for outputting exceptions
2590 */
2591 private void logException(String internalMessage, Exception e)
2592 {
2593 System.err.println(internalMessage);
2594 e.printStackTrace(System.err);
2595 }
2596
2597 /** Convenience method for toggling source window visibility
2598 */
2599 private void toggleSourceWindow()
2600 {
2601 if(!(jspSource.isShowing()))
2602 {
2603 jtpSource.setText(jtpMain.getText());
2604 jspltDisplay.setRightComponent(jspSource);
2605 if(exclusiveEdit)
2606 {
2607 jspltDisplay.setDividerLocation(0);
2608 jspltDisplay.setEnabled(false);
2609 }
2610 else
2611 {
2612 jspltDisplay.setDividerLocation(iSplitPos);
2613 jspltDisplay.setEnabled(true);
2614 }
2615 }
2616 else
2617 {
2618 jtpMain.setText(jtpSource.getText());
2619 iSplitPos = jspltDisplay.getDividerLocation();
2620 jspltDisplay.remove(jspSource);
2621 jtpMain.requestFocus();
2622 }
2623 this.validate();
2624 jcbmiViewSource.setSelected(jspSource.isShowing());
2625 jtbtnViewSource.setSelected(jspSource.isShowing());
2626 }
2627
2628 /** Searches the specified element for CLASS attribute setting
2629 */
2630 private String findStyle(Element element)
2631 {
2632 AttributeSet as = element.getAttributes();
2633 if(as == null)
2634 {
2635 return null;
2636 }
2637 Object val = as.getAttribute(HTML.Attribute.CLASS);
2638 if(val != null && (val instanceof String))
2639 {
2640 return (String)val;
2641 }
2642 for(Enumeration e = as.getAttributeNames(); e.hasMoreElements();)
2643 {
2644 Object key = e.nextElement();
2645 if(key instanceof HTML.Tag)
2646 {
2647 AttributeSet eas = (AttributeSet)(as.getAttribute(key));
2648 if(eas != null)
2649 {
2650 val = eas.getAttribute(HTML.Attribute.CLASS);
2651 if(val != null)
2652 {
2653 return (String)val;
2654 }
2655 }
2656 }
2657
2658 }
2659 return null;
2660 }
2661
2662 /** Handles caret tracking and related events, such as displaying the current style
2663 * of the text under the caret
2664 */
2665 private void handleCaretPositionChange(CaretEvent ce)
2666 {
2667 int caretPos = ce.getDot();
2668 Element element = htmlDoc.getCharacterElement(caretPos);
2669/*
2670---- TAG EXPLICATOR CODE -------------------------------------------
2671 javax.swing.text.ElementIterator ei = new javax.swing.text.ElementIterator(htmlDoc);
2672 Element ele;
2673 while((ele = ei.next()) != null)
2674 {
2675 System.out.println("ELEMENT : " + ele.getName());
2676 }
2677 System.out.println("ELEMENT:" + element.getName());
2678 Element elementParent = element.getParentElement();
2679 System.out.println("ATTRS:");
2680 AttributeSet attribs = elementParent.getAttributes();
2681 for(Enumeration eAttrs = attribs.getAttributeNames(); eAttrs.hasMoreElements();)
2682 {
2683 System.out.println(" " + eAttrs.nextElement().toString());
2684 }
2685 while(elementParent != null && !elementParent.getName().equals("body"))
2686 {
2687 String parentName = elementParent.getName();
2688 System.out.println("PARENT:" + parentName);
2689 System.out.println("ATTRS:");
2690 attribs = elementParent.getAttributes();
2691 for(Enumeration eAttr = attribs.getAttributeNames(); eAttr.hasMoreElements();)
2692 {
2693 System.out.println(" " + eAttr.nextElement().toString());
2694 }
2695 elementParent = elementParent.getParentElement();
2696 }
2697---- END -------------------------------------------
2698*/
2699 if(element == null)
2700 {
2701 return;
2702 }
2703 String style = null;
2704 Vector vcStyles = new Vector();
2705 while(element != null)
2706 {
2707 if(style == null)
2708 {
2709 style = findStyle(element);
2710 }
2711 vcStyles.add(element);
2712 element = element.getParentElement();
2713 }
2714 int stylefound = -1;
2715 if(style != null)
2716 {
2717 for(int i = 0; i < jcmbStyleSelector.getItemCount(); i++)
2718 {
2719 String in = (String)(jcmbStyleSelector.getItemAt(i));
2720 if(in.equalsIgnoreCase(style))
2721 {
2722 stylefound = i;
2723 break;
2724 }
2725 }
2726 }
2727 if(stylefound > -1)
2728 {
2729 Action ac = jcmbStyleSelector.getAction();
2730 ac.setEnabled(false);
2731 jcmbStyleSelector.setSelectedIndex(stylefound);
2732 ac.setEnabled(true);
2733 }
2734 else
2735 {
2736 jcmbStyleSelector.setSelectedIndex(0);
2737 }
2738 }
2739
2740 /** Server-side image handling methods
2741 */
2742 protected void setServletURL(String url)
2743 {
2744 ServletURL = url;
2745 }
2746
2747 protected void setImageDir(String sysDir)
2748 {
2749 ImageDir = sysDir;
2750 }
2751
2752 public void setTreePilotSystemID(String theSystem)
2753 {
2754 TreePilotSystemID = theSystem;
2755 }
2756
2757 /** Utility methods
2758 */
2759 public ExtendedHTMLDocument getExtendedHtmlDoc()
2760 {
2761 return (ExtendedHTMLDocument)htmlDoc;
2762 }
2763
2764 public int getCaretPosition()
2765 {
2766 return jtpMain.getCaretPosition();
2767 }
2768
2769 public void setCaretPosition(int newPositon)
2770 {
2771 boolean end = true;
2772 do
2773 {
2774 end = true;
2775 try
2776 {
2777 jtpMain.setCaretPosition(newPositon);
2778 }
2779 catch (IllegalArgumentException iae)
2780 {
2781 end = false;
2782 newPositon--;
2783 }
2784 } while(!end && newPositon >= 0);
2785 }
2786
2787/* Inner Classes --------------------------------------------- */
2788
2789 /** Class for implementing Undo as an autonomous action
2790 */
2791 class UndoAction extends AbstractAction
2792 {
2793 public UndoAction()
2794 {
2795 super(Translatrix.getTranslationString("Undo"));
2796 setEnabled(false);
2797 }
2798
2799 public void actionPerformed(ActionEvent e)
2800 {
2801 try
2802 {
2803 undoMngr.undo();
2804 }
2805 catch(CannotUndoException ex)
2806 {
2807 ex.printStackTrace();
2808 }
2809 updateUndoState();
2810 redoAction.updateRedoState();
2811 }
2812
2813 protected void updateUndoState()
2814 {
2815 if(undoMngr.canUndo())
2816 {
2817 setEnabled(true);
2818 putValue(Action.NAME, undoMngr.getUndoPresentationName());
2819 }
2820 else
2821 {
2822 setEnabled(false);
2823 putValue(Action.NAME, Translatrix.getTranslationString("Undo"));
2824 }
2825 }
2826 }
2827
2828 /** Class for implementing Redo as an autonomous action
2829 */
2830 class RedoAction extends AbstractAction
2831 {
2832 public RedoAction()
2833 {
2834 super(Translatrix.getTranslationString("Redo"));
2835 setEnabled(false);
2836 }
2837
2838 public void actionPerformed(ActionEvent e)
2839 {
2840 try
2841 {
2842 undoMngr.redo();
2843 }
2844 catch(CannotUndoException ex)
2845 {
2846 ex.printStackTrace();
2847 }
2848 updateRedoState();
2849 undoAction.updateUndoState();
2850 }
2851
2852 protected void updateRedoState()
2853 {
2854 if(undoMngr.canRedo())
2855 {
2856 setEnabled(true);
2857 putValue(Action.NAME, undoMngr.getRedoPresentationName());
2858 }
2859 else
2860 {
2861 setEnabled(false);
2862 putValue(Action.NAME, Translatrix.getTranslationString("Redo"));
2863 }
2864 }
2865 }
2866
2867 /** Class for implementing the Undo listener to handle the Undo and Redo actions
2868 */
2869 class CustomUndoableEditListener implements UndoableEditListener
2870 {
2871 public void undoableEditHappened(UndoableEditEvent uee)
2872 {
2873 undoMngr.addEdit(uee.getEdit());
2874 undoAction.updateUndoState();
2875 redoAction.updateRedoState();
2876 }
2877 }
2878
2879}