Skip to content
Snippets Groups Projects
FileViewer.java 10.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
    /* FileViewer.java
     *
     * created: Thu Nov 19 1998
     *
     * This file is part of Artemis
     *
     * Copyright(C) 1998,1999,2000,2001  Genome Research Limited
     *
     * 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 version 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 program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     *
    
    tjc's avatar
    tjc committed
     * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FileViewer.java,v 1.19 2008-11-12 16:50:37 tjc Exp $
    
    tjc's avatar
    tjc committed
     */
    
    package uk.ac.sanger.artemis.components;
    
    
    tjc's avatar
    tjc committed
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    
    tjc's avatar
    tjc committed
    import java.awt.FlowLayout;
    
    tjc's avatar
    tjc committed
    import java.awt.Font;
    import java.awt.Point;
    import java.awt.Toolkit;
    
    tjc's avatar
    tjc committed
    import java.awt.event.*;
    import java.io.Reader;
    import java.io.BufferedReader;
    import java.io.IOException;
    
    tjc's avatar
    tjc committed
    import java.util.Hashtable;
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    
    tjc's avatar
    tjc committed
    import javax.swing.JTextPane;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Document;
    
    import javax.swing.text.Element;
    
    tjc's avatar
    tjc committed
    import javax.swing.text.MutableAttributeSet;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    
    import org.apache.log4j.Level;
    
    tjc's avatar
    tjc committed
    
    import uk.ac.sanger.artemis.Options;
    
    
    tjc's avatar
    tjc committed
    
    /**
     *  This class implements a simple file viewer.  In fact any Reader object can
     *  be viewed.
     *
     *  @author Kim Rutherford
    
    tjc's avatar
    tjc committed
     *  @version $Id: FileViewer.java,v 1.19 2008-11-12 16:50:37 tjc Exp $
    
    tjc's avatar
    tjc committed
     *
     **/
    
    
    tjc's avatar
    tjc committed
    public class FileViewer extends JFrame
    
    tjc's avatar
    tjc committed
    {
    
    tjc's avatar
    tjc committed
      /** */
      private static final long serialVersionUID = 1L;
    
    
    tjc's avatar
    tjc committed
      /** A JPanel to hold the close button. */
      private JPanel button_panel;
    
      /** The main component we use for displaying the file. */
    
    tjc's avatar
    tjc committed
      private JTextPane textPane = null;
    
      private Hashtable fontAttributes;
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
      private static Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
      
    
    tjc's avatar
    tjc committed
      /**
       *  The size of the last FileViewer JFrame to be resized.  When a new
       *  FileViewer component is created it is given the current value of this
       *  variable.  This is updated when any FileViewer frame is resized.
       **/
      private static Dimension saved_size = null;
    
      /**
       *  The position of the last FileViewer JFrame to be moved.  When a new
       *  FileViewer component is created it is given the current value of this
       *  variable.  This is updated when any FileViewer frame is moved.
       **/
      private static Point saved_position = null;
    
    tjc's avatar
    tjc committed
      
    
      private boolean isHideOnClose = false;
      
    
    tjc's avatar
    tjc committed
      /**
       *  Create a new FileViewer component and make it visible.
       *  @param label The name to attach to the new JFrame.
       **/
      public FileViewer(final String label) 
      {
    
    tjc's avatar
    tjc committed
        this(label, true, true);
    
    tjc's avatar
    tjc committed
      }
    
    
    tjc's avatar
    tjc committed
      public FileViewer(final String label, final boolean visible)
      {
        this(label, visible, true);  
      }
      
    
    tjc's avatar
    tjc committed
      /**
       *  Create a new FileViewer component.
       *  @param label The name to attach to the new JFrame.
       *  @param visible The new FileViewer will be made visible if and only if
       *    this argument is true.
       **/
    
    tjc's avatar
    tjc committed
      public FileViewer(final String label, final boolean visible, 
                        final boolean showClearButton) 
    
    tjc's avatar
    tjc committed
      {
        super(label);
    
        getContentPane().setLayout(new BorderLayout());
        final Font font = Options.getOptions().getFont();
        setFont(font);
    
    
    tjc's avatar
    tjc committed
        // ensure wrapping is turned off
        textPane = new JTextPane()
        {
          /** */
          private static final long serialVersionUID = 1L;
    
          public boolean getScrollableTracksViewportWidth()
          {
            return false;
          }
        };
    
    tjc's avatar
    tjc committed
        final JScrollPane scroller = new JScrollPane(textPane);
    
        Dimension d = new Dimension((int)screen.getWidth()/2,
            (int)screen.getHeight()/2);
        scroller.setPreferredSize(d);
    
    tjc's avatar
    tjc committed
        scroller.getViewport().setBackground(Color.white);
    
    
    tjc's avatar
    tjc committed
        textPane.setEditable(false);
        textPane.setFont(font);
        textPane.setBackground(Color.white);
    
    tjc's avatar
    tjc committed
        textPane.setMinimumSize(d);
    
    tjc's avatar
    tjc committed
        
    
    tjc's avatar
    tjc committed
        getContentPane().add(scroller, "Center");
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        button_panel = new JPanel(new FlowLayout());
    
    tjc's avatar
    tjc committed
        getContentPane().add(button_panel, "South");
    
    
    tjc's avatar
    tjc committed
        final JButton close_button = new JButton("Close");
    
    tjc's avatar
    tjc committed
        close_button.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent e) 
          {
    
            if(isHideOnClose())
              setVisible(false);
            else
              dispose();
    
    tjc's avatar
    tjc committed
          }
        });
        button_panel.add(close_button);
    
    tjc's avatar
    tjc committed
        
    
    tjc's avatar
    tjc committed
        if(showClearButton)
    
    tjc's avatar
    tjc committed
        {
    
    tjc's avatar
    tjc committed
          final JButton clearbutton = new JButton("Clear");
          clearbutton.addActionListener(new ActionListener()
    
    tjc's avatar
    tjc committed
          {
    
    tjc's avatar
    tjc committed
            public void actionPerformed(ActionEvent e)
            {
              clear();
            }
          });
          button_panel.add(clearbutton);
        }
        
    
    tjc's avatar
    tjc committed
        addWindowListener(new WindowAdapter() 
        {
          public void windowClosing(WindowEvent event) 
          {
    
            if(isHideOnClose())
              setVisible(false);
            else
              dispose();
    
    tjc's avatar
    tjc committed
          }
        });
    
        addComponentListener(new ComponentAdapter() 
        {
          public void componentResized(ComponentEvent e) 
          {
            saved_size = FileViewer.this.getSize();
            saved_position = FileViewer.this.getLocation();
          }
          public void componentMoved(ComponentEvent e) 
          {
            saved_size = FileViewer.this.getSize();
            saved_position = FileViewer.this.getLocation();
          }
        });
    
        pack();
    
    
        if(saved_position == null) 
        {
    
    tjc's avatar
    tjc committed
          Utilities.centreFrame(this);
    
    tjc's avatar
    tjc committed
        } 
        else
        {
          if(saved_position.x < 0 || saved_position.x + 20 > screen.width) 
            saved_position.x = 20;
    
          if(saved_position.y < 0 || saved_position.y + 20 > screen.height) 
            saved_position.y = 20;
    
          if(saved_size.width < 50) 
            saved_size.width = 50;
    
          if(saved_size.height < 50) 
            saved_size.height = 50;
          
          setLocation(saved_position);
          setSize(saved_size);
        }
        
    
    tjc's avatar
    tjc committed
        if(visible)
          setVisible(true);
    
    tjc's avatar
    tjc committed
        createDefaultFontAttributes();
    
    tjc's avatar
    tjc committed
      }
    
    
    tjc's avatar
    tjc committed
      
    
    tjc's avatar
    tjc committed
      /**
       *  Clear the viewer window.
       **/
    
    tjc's avatar
    tjc committed
      protected void clear()  
    
    tjc's avatar
    tjc committed
      {
    
    tjc's avatar
    tjc committed
        textPane.setText("");
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Read from the given Reader and append the text to this FileViewer.
       *  @param read_stream The stream to read the contents of the viewer from.
       **/
    
    tjc's avatar
    tjc committed
      protected void appendFile(Reader read_stream)
    
    tjc's avatar
    tjc committed
          throws IOException 
      {
        final BufferedReader buffered_reader = new BufferedReader(read_stream);
        String line;
    
        while((line = buffered_reader.readLine()) != null) 
        {
          appendString(line + "\n");
          Thread.yield();
        }
    
        buffered_reader.close();
      }
    
      /**
       *  Clear the viewer window and display the lines from the given Reader.
       *  @param read_stream The stream to read the contents of the viewer from.
       **/
    
    tjc's avatar
    tjc committed
      protected void readFile(Reader read_stream)
    
    tjc's avatar
    tjc committed
          throws IOException 
      {
        final BufferedReader buffered_reader = new BufferedReader(read_stream);
    
        String line;
    
        final StringBuffer line_buffer = new StringBuffer();
    
        while((line = buffered_reader.readLine()) != null) 
          line_buffer.append(line).append('\n');
    
        buffered_reader.close();
    
        final String new_text = line_buffer.toString();
    
    tjc's avatar
    tjc committed
        textPane.setText(new_text);
        textPane.setCaretPosition(0);
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Clear the viewer window and display the lines from the given String.
       *  @param read_string The string to read the contents of the viewer from.
       **/
    
    tjc's avatar
    tjc committed
      protected void setText(String read_string) 
    
    tjc's avatar
    tjc committed
      {
    
        textPane.setText(read_string);
    
    tjc's avatar
    tjc committed
      }
    
    
      /**
       *  Clear the viewer window and display the lines from the given String.
       *  @param read_string The string to read the contents of the viewer from.
       **/
    
    tjc's avatar
    tjc committed
      protected void appendString(String read_string) 
    
    tjc's avatar
    tjc committed
      { 
    
    tjc's avatar
    tjc committed
        final Level level;
        if(read_string.indexOf("FATAL") > -1)
          level = Level.FATAL;
        else if(read_string.indexOf("ERROR") > -1)
          level = Level.ERROR;
        else if(read_string.indexOf("WARN") > -1)
          level = Level.WARN;
        else if(read_string.indexOf("INFO") > -1)
          level = Level.INFO;
        else
          level = Level.DEBUG;
    
    tjc's avatar
    tjc committed
        appendString(read_string, level);
      }
      
      protected void appendString(final String read_string, final Level level) 
      {
        final Document doc = textPane.getStyledDocument();
    
    tjc's avatar
    tjc committed
        try
        {
          doc.insertString(doc.getLength(), read_string, 
              (MutableAttributeSet)fontAttributes.get(level));
          textPane.setCaretPosition(doc.getLength());
        }
        catch(BadLocationException e)
        {
          e.printStackTrace();
        }
    
    tjc's avatar
    tjc committed
      }
    
    
    tjc's avatar
    tjc committed
      private void createDefaultFontAttributes() 
      {
        Level[] prio = { Level.FATAL, Level.ERROR, 
               Level.WARN, Level.INFO, Level.DEBUG };
    
        fontAttributes = new Hashtable();
        for (int i=0; i<prio.length;i++) 
        {
          MutableAttributeSet att = new SimpleAttributeSet();
          fontAttributes.put(prio[i], att);
        }
    
        setTextColor(Level.FATAL, Color.red);
        setTextColor(Level.ERROR, Color.magenta);
        setTextColor(Level.WARN, Color.orange);
    
    tjc's avatar
    tjc committed
        setTextColor(Level.INFO, Color.black);
    
    tjc's avatar
    tjc committed
        setTextColor(Level.DEBUG, Color.blue);
      }
      
      void setTextColor(Level p, Color c) 
      {
        StyleConstants.setForeground(
              (MutableAttributeSet)fontAttributes.get(p),c);
      }
      
    
    tjc's avatar
    tjc committed
      /**
       *  Return a String containing the text that this component is displaying.
       **/
    
    tjc's avatar
    tjc committed
      protected String getText() 
    
    tjc's avatar
    tjc committed
      {
    
    tjc's avatar
    tjc committed
        return textPane.getText();
    
    tjc's avatar
    tjc committed
      }
    
    
      /**
       *  Return the JPanel containing the close button of this FileViewer.
       **/
      protected JPanel getButtonPanel() 
      {
        return button_panel;
      }
    
    
    tjc's avatar
    tjc committed
      /**
       * 
       * @return
       */
      protected int getLineCount()
      {
    
        int caretPosition = textPane.getCaretPosition();
        Element root = textPane.getDocument().getDefaultRootElement();
     
        return root.getElementIndex( caretPosition ) + 1;
        
        /*try
    
    tjc's avatar
    tjc committed
        {
    
    tjc's avatar
    tjc committed
          int offset     = textPane.getDocument().getLength();
          Rectangle r    = textPane.modelToView( offset );
          
          return (int) r.y/lineHeight;
    
    tjc's avatar
    tjc committed
        }
        catch(Exception e)
        {
          return 0;
    
    tjc's avatar
    tjc committed
    
      }
    
    tjc's avatar
    tjc committed
    
      public JTextPane getTextPane()
      {
        return textPane;
      }
    
    
      public boolean isHideOnClose()
      {
        return isHideOnClose;
      }
    
      public void setHideOnClose(boolean isHideOnClose)
      {
        this.isHideOnClose = isHideOnClose;
      }
    
    tjc's avatar
    tjc committed
    }