/* GNU GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either verion 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ package org.lobobrowser.primary.ext; import java.awt.Container; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; import javax.swing.SwingUtilities; import org.lobobrowser.gui.DefaultWindowFactory; import org.lobobrowser.ua.UserAgentContext; import org.lobobrowser.util.gui.WrapperLayout; public class TextViewerWindow extends JFrame { private static final long serialVersionUID = -7762248535000880129L; private final JTextArea textArea; private boolean scrollsOnAppends; public TextViewerWindow() { super("Lobo Text Viewer"); final UserAgentContext uaContext = null; // TODO this.setIconImage(DefaultWindowFactory.getInstance().getDefaultImageIcon(uaContext).getImage()); final JMenuBar menuBar = this.createMenuBar(); this.setJMenuBar(menuBar); final Container contentPane = this.getContentPane(); final JTextArea textArea = createTextArea(); this.textArea = textArea; contentPane.setLayout(WrapperLayout.getInstance()); contentPane.add(new JScrollPane(textArea)); this.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosed(final WindowEvent e) { final DocumentListener cl = cachedListener; if (cl != null) { final Document prevDocument = textArea.getDocument(); if (prevDocument != null) { prevDocument.removeDocumentListener(cl); } } } }); } public void setText(final String text) { this.textArea.setText(text); } public void setScrollsOnAppends(final boolean flag) { this.scrollsOnAppends = flag; } private DocumentListener cachedListener; private DocumentListener getDocumentListener() { // Expected in GUI thread. DocumentListener cl = this.cachedListener; if (cl == null) { cl = new LocalDocumentListener(); this.cachedListener = cl; } return cl; } public void setSwingDocument(final javax.swing.text.Document document) { final Document prevDocument = this.textArea.getDocument(); final javax.swing.event.DocumentListener listener = this.getDocumentListener(); if (prevDocument != null) { prevDocument.removeDocumentListener(listener); } document.addDocumentListener(listener); this.textArea.setDocument(document); } private static JTextArea createTextArea() { final JTextArea textArea = new JTextArea(); textArea.setEditable(false); return textArea; } private JMenuBar createMenuBar() { final JMenuBar menuBar = new JMenuBar(); menuBar.add(this.createFileMenu()); menuBar.add(this.createEditMenu()); return menuBar; } private JMenu createFileMenu() { final JMenu fileMenu = new JMenu("File"); fileMenu.setMnemonic('F'); fileMenu.add(ComponentSource.menuItem("Close", 'C', new CloseAction())); return fileMenu; } private JMenu createEditMenu() { final JMenu fileMenu = new JMenu("Edit"); fileMenu.setMnemonic('E'); fileMenu.add(ComponentSource.menuItem("Copy", 'C', KeyStroke.getKeyStroke(KeyEvent.VK_C, ComponentSource.CMD_CTRL_KEY_MASK), new CopyAction())); fileMenu.add(ComponentSource.menuItem("Select All", 'A', KeyStroke.getKeyStroke(KeyEvent.VK_A, ComponentSource.CMD_CTRL_KEY_MASK), new SelectAllAction())); return fileMenu; } private class CloseAction extends javax.swing.AbstractAction { private static final long serialVersionUID = -6888783455425269396L; public void actionPerformed(final ActionEvent e) { TextViewerWindow.this.dispose(); } } private class CopyAction extends javax.swing.AbstractAction { private static final long serialVersionUID = -5105000513871920161L; public void actionPerformed(final ActionEvent e) { textArea.copy(); } } private class SelectAllAction extends javax.swing.AbstractAction { private static final long serialVersionUID = -18517295931751577L; public void actionPerformed(final ActionEvent e) { textArea.selectAll(); } } private class LocalDocumentListener implements DocumentListener { public void changedUpdate(final DocumentEvent e) { // nop } public void insertUpdate(final DocumentEvent e) { SwingUtilities.invokeLater(() -> { if (scrollsOnAppends) { textArea.scrollRectToVisible(new Rectangle(0, Short.MAX_VALUE, 1, Short.MAX_VALUE)); } }); } public void removeUpdate(final DocumentEvent e) { // nop } } }