Newer
Older
/* 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.
*
* $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FileViewer.java,v 1.19 2008-11-12 16:50:37 tjc Exp $
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.IOException;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import org.apache.log4j.Level;
/**
* This class implements a simple file viewer. In fact any Reader object can
* be viewed.
*
* @author Kim Rutherford
* @version $Id: FileViewer.java,v 1.19 2008-11-12 16:50:37 tjc Exp $
/** A JPanel to hold the close button. */
private JPanel button_panel;
/** The main component we use for displaying the file. */
private Hashtable<Level, MutableAttributeSet> fontAttributes;
private static Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
/**
* 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;
private boolean isHideOnClose = false;
/**
* Create a new FileViewer component and make it visible.
* @param label The name to attach to the new JFrame.
**/
public FileViewer(final String label)
{
/**
* 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.
**/
final boolean showClearButton,
final boolean showSaveButton)
{
super(label);
getContentPane().setLayout(new BorderLayout());
final Font font = Options.getOptions().getFont();
setFont(font);
// ensure wrapping is turned off
textPane = new JTextPane()
{
/** */
private static final long serialVersionUID = 1L;
public boolean getScrollableTracksViewportWidth()
{
return false;
}
};
Dimension d = new Dimension((int)screen.getWidth()/2,
(int)screen.getHeight()/2);
scroller.setPreferredSize(d);
textPane.setEditable(false);
textPane.setFont(font);
textPane.setBackground(Color.white);
close_button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(isHideOnClose())
setVisible(false);
else
dispose();
final JButton clearbutton = new JButton("Clear");
clearbutton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
{
clear();
}
});
button_panel.add(clearbutton);
}
if(showSaveButton)
{
final JButton saveToFile = new JButton("Save");
saveToFile.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
writeToFile();
}
});
button_panel.add(saveToFile);
}
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent event)
{
if(isHideOnClose())
setVisible(false);
else
dispose();
}
});
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)
{
}
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);
}
}
/**
* 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.
**/
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.
**/
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');
}
/**
* 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.
**/
}
/**
* 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.
**/
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;
public void appendString(final String read_string, final Level level)
{
final Document doc = textPane.getStyledDocument();
try
{
doc.insertString(doc.getLength(), read_string,
(MutableAttributeSet)fontAttributes.get(level));
textPane.setCaretPosition(doc.getLength());
}
catch(BadLocationException e)
{
e.printStackTrace();
}
private void createDefaultFontAttributes()
{
Level[] prio = { Level.FATAL, Level.ERROR,
Level.WARN, Level.INFO, Level.DEBUG };
fontAttributes = new Hashtable<Level, MutableAttributeSet>();
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);
setTextColor(Level.DEBUG, Color.blue);
}
void setTextColor(Level p, Color c)
{
StyleConstants.setForeground(
(MutableAttributeSet)fontAttributes.get(p),c);
}
/**
* Return a String containing the text that this component is displaying.
**/
}
/**
* Return the JPanel containing the close button of this FileViewer.
**/
protected JPanel getButtonPanel()
{
return button_panel;
}
/**
*
* @return
*/
protected int getLineCount()
{
int caretPosition = textPane.getCaretPosition();
Element root = textPane.getDocument().getDefaultRootElement();
return root.getElementIndex( caretPosition ) + 1;
/*try
int offset = textPane.getDocument().getLength();
Rectangle r = textPane.modelToView( offset );
return (int) r.y/lineHeight;
public JTextPane getTextPane()
{
return textPane;
}
public boolean isHideOnClose()
{
return isHideOnClose;
}
public void setHideOnClose(boolean isHideOnClose)
{
this.isHideOnClose = isHideOnClose;
}
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
private void writeToFile()
{
StickyFileChooser fc = new StickyFileChooser();
fc.showSaveDialog(FileViewer.this);
File f = fc.getSelectedFile();
if(f.exists() && f.canWrite())
{
int status = JOptionPane.showConfirmDialog(FileViewer.this,
f.getName()+" exists overwrite?",
"Overwrite", JOptionPane.OK_CANCEL_OPTION);
if(status == JOptionPane.CANCEL_OPTION)
return;
}
try
{
FileWriter writer = new FileWriter(f);
writer.write(getText());
writer.close();
}
catch (IOException e1)
{
JOptionPane.showMessageDialog(FileViewer.this,
e1.getMessage(), "Problem Writing", JOptionPane.WARNING_MESSAGE);
}
}