package org.statcato;

import org.statcato.file.FileChooserUtils;
import org.statcato.file.ExtensionFileFilter;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;
import org.statcato.utils.*;
import org.statcato.Statcato.*;

/**
 * A log text pane containing HTML-formatted text.  
 * 
 * @author Margaret Yau
 * @version %I%, %G%
 * @since 1.0
 */
public class LogWindow extends JTextPane implements Serializable {
    File savedFile = null;
    boolean changed = false; // whether there is any unsaved changes
    transient Statcato app = null;
    
    /**
     * Constructor, given the parent application object.
     * 
     * @param mTab parent application object
     */
    public LogWindow(Statcato mTab) {
        super();
        app = mTab;
        initialize();
        
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == '\n') {
                    // insert line break
                    HTMLDocument doc = (HTMLDocument)getDocument();
                    HTMLEditorKit editorKit = (HTMLEditorKit) getEditorKit();

                    try {
                        // insert html line break                        
                        editorKit.insertHTML(doc, getCaretPosition(), "
", 0, 0, null); int pos = getCaretPosition(); setChangedStatus(); String txt = getText(); // refresh the text setText(""); setText(txt); setCaretPosition(pos-2); } catch (BadLocationException ex) { System.out.println(ex); } catch (IOException ex) { System.out.println(ex); } } if (!e.isControlDown()) setChangedStatus(); } @Override public void keyPressed(KeyEvent e) { if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_V) { // paste setChangedStatus(); } } @Override public void keyReleased(KeyEvent e) { } }); } /** * Initializes this object. Sets the content type to HTML, * adds the default message, and sets the status to unchanged. */ private void initialize() { // initialize log window setContentType("text/html"); setText(""); String WelcomeText = "Welcome to Statcato!
"; WelcomeText += HelperFunctions.getDateTime() + "
"; setText(WelcomeText); int pos = getCaretPosition(); addUnformattedText(""); setCaretPosition(pos); setUnchangedStatus(); setEditable(true); // change the font face to san-serif StyleSheet sheet = new HTMLEditorKit().getStyleSheet(); sheet.addRule("body { font-family: san-serif;}"); } /** * Adds the given heading and text message to this object. * The heading followed by the message are appended to the end of the * HTML document in this object. * * @param heading heading string * @param message message string */ public void addParagraph(String heading, String message) { message = "
" + heading + "
" + message.replace("\n", "") + "
"; HTMLDocument doc = (HTMLDocument)getDocument(); HTMLEditorKit editorKit = (HTMLEditorKit) getEditorKit(); try { editorKit.insertHTML(doc, doc.getLength(), message, 0, 0, null); setChangedStatus(); } catch (BadLocationException e) { } catch (IOException e) { } } /** * Adds the given message to this object. The message is appended * to the end of the HTML document in this object. * * @param message a string to be added to this object */ public void addText(String message) { message = message.replace("\n", "") + "
"; HTMLDocument doc = (HTMLDocument)getDocument(); HTMLEditorKit editorKit = (HTMLEditorKit) getEditorKit(); try { editorKit.insertHTML(doc, doc.getLength(), message, 0, 0, null); setChangedStatus(); } catch (BadLocationException e) { } catch (IOException e) { } } /** * Adds the given message (as is) to this object. The message is appended * to the end of the HTML document in this object. * * @param message a string to be added to this object */ public void addUnformattedText(String message) { HTMLDocument doc = (HTMLDocument)getDocument(); HTMLEditorKit editorKit = (HTMLEditorKit) getEditorKit(); try { editorKit.insertHTML(doc, doc.getLength(), message.replace("\n", ""), 0, 0, null); setChangedStatus(); } catch (BadLocationException e) { } catch (IOException e) { } } /** * Adds the given message as a heading to this object. The message * is appended to the end of the HTML document in this object in bold font. * * @param message a string to be added to this object */ public void addHeading(String message) { message = "
" + message + "
"; HTMLDocument doc = (HTMLDocument)getDocument(); HTMLEditorKit editorKit = (HTMLEditorKit) getEditorKit(); try { editorKit.insertHTML(doc, doc.getLength(), message, 0, 0, null); setChangedStatus(); } catch (BadLocationException e) { } catch (IOException e) { } } /** * Sets the status of this object to changed. Adds an asterisk to the * log window title to indicate a change to the log window has * occured. */ public void setChangedStatus() { if (!changed) { changed = true; app.setLogTitle(app.getLogTitle() + "*"); } } /** * Sets the status of this object to unchanged. Removes the asterisk in the * log window title to indicate the log window has no * unsaved contents. */ public void setUnchangedStatus() { changed = false; String title = app.getLogTitle(); if (title.endsWith("*")) app.setLogTitle(app.getLogTitle().substring(0, title.length()-1)); } /** * Returns the changed status. * * @return changed status */ public boolean getChangedStatus() { return changed; } /** * Writes the HTML source of this log window object to a file. * Prompts the user to select a file location if this object has * not previously been saved or if forced to save in a new file. * * @param frame the parent frame * @param saveAs a boolean value indicating whether to save as a new file * @return the file containing the saved contents, or null if * the save action fails */ public File writeToFile(JFrame frame, boolean saveAs) { String path = ""; String extension = ""; if (savedFile != null && !saveAs) { // previously saved in a file path = savedFile.getPath(); extension = FileChooserUtils.getExtension(savedFile); writeFileHelper(frame, path); return savedFile; } else { // create a file chooser JFileChooser fc = new JFileChooser(); ExtensionFileFilter HTMLFilter = new ExtensionFileFilter("HTML (*.html)", "html"); fc.addChoosableFileFilter(HTMLFilter); fc.setAcceptAllFileFilterUsed(false); int returnValue = fc.showSaveDialog(frame); if (returnValue == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); path = file.getPath(); extension = ""; // see what file type is selected javax.swing.filechooser.FileFilter filter = fc.getFileFilter(); if (filter.equals(HTMLFilter)) { extension = "html"; } if (!path.toLowerCase().endsWith("." + extension)) { path += "." + extension; file = new File(path); } if (file.exists()) { // file exists already System.out.println("file exists already"); Object[] options = {"Overwrite file", "Cancel"}; int choice = JOptionPane.showOptionDialog(frame, "The specified file already exists. Overwrite existing file?", "Overwrite file?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]); if (choice != 0) // don't overwrite return null; } writeFileHelper(frame, path); savedFile = file; return file; } return null; } } /** * Gets the HTML source in this log pane and actually writes * to the file at the given path. * * @param frame parent frame * @param path a string indicating the file path */ private void writeFileHelper(JFrame frame, String path) { // write to file try { String htmlSource = getText(); BufferedWriter Writer = new BufferedWriter(new FileWriter(path)); String [] lines = htmlSource.split("\n"); for (int i = 0; i < lines.length; ++i) { Writer.write(lines[i]); Writer.newLine(); } Writer.close(); setUnchangedStatus(); } catch (IOException e) { HelperFunctions.showErrorDialog(frame, "Write file failed!"); } } /** * Clears the text in this log window and reintializes. */ public void clear() { app.compoundEdit = new DialogEdit("clear log"); initialize(); setChangedStatus(); app.compoundEdit.end(); app.addCompoundEdit(app.compoundEdit); } /** * Replaces the contents of this log window with the given string. */ public void overwrite(String txt) { app.compoundEdit = new DialogEdit("load log"); setText(""); addText(txt); setChangedStatus(); app.compoundEdit.end(); app.addCompoundEdit(app.compoundEdit); } public void appendLog(String log) { app.compoundEdit = new DialogEdit("Append log"); addUnformattedText(log); setUnchangedStatus(); app.compoundEdit.end(); app.addCompoundEdit(app.compoundEdit); } }

Ads help maintain this website.