blob: b72997cb3cbabbb97e6a20beb198910e00f4b0c7 [file] [log] [blame]
/* TextAreaDemo.java -- An example showing various textareas in Swing.
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath examples.
GNU Classpath 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, or (at your option)
any later version.
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
package gnu.classpath.examples.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultCaret;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.View;
import javax.swing.text.LayeredHighlighter.LayerPainter;
/**
* A simple textare demo showing various textareas in different states.
*/
public class TextAreaDemo
extends JPanel
implements ActionListener
{
/**
* A custom caret for demonstration purposes. This class is inspired by the
* CornerCaret from the OReilly Swing book.
*
* @author Roman Kennke (kennke@aicas.com)
*/
static class CornerCaret
extends DefaultCaret
{
public CornerCaret()
{
super();
setBlinkRate(500);
}
protected synchronized void damage(Rectangle r)
{
if (r == null)
return;
x = r.x;
y = r.y + (r.height * 4 / 5 - 3);
width = 5;
height = 5;
repaint();
}
public void paint(Graphics g)
{
JTextComponent comp = getComponent();
if (comp == null)
return;
int dot = getDot();
Rectangle r = null;
try
{
r = comp.modelToView(dot);
}
catch (BadLocationException e)
{
return;
}
if (r == null)
return;
int dist = r.height * 4 / 5 - 3;
if ((x != r.x) || (y != r.y + dist))
{
repaint();
x = r.x;
y = r.y + dist;
width = 5;
height = 5;
}
if (isVisible())
{
g.drawLine(r.x, r.y + dist, r.x, r.y + dist + 4);
g.drawLine(r.x, r.y + dist + 4, r.x + 4, r.y + dist + 4);
}
}
}
static class DemoHighlightPainter
extends LayerPainter
{
static DemoHighlightPainter INSTANCE = new DemoHighlightPainter();
static Color[] colors = { Color.BLUE, Color.CYAN, Color.GRAY, Color.GREEN,
Color.MAGENTA, Color.ORANGE, Color.PINK,
Color.ORANGE, Color.RED, Color.BLUE, Color.YELLOW };
public DemoHighlightPainter()
{
super();
}
private void paintHighlight(Graphics g, Rectangle rect)
{
g.fillRect(rect.x, rect.y, rect.width, rect.height);
}
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent t)
{
try
{
for (int i = p0; i < p1; i++)
{
Rectangle r = t.modelToView(i);
Point l1 = t.modelToView(i + 1).getLocation();
g.setColor(colors[(int) (Math.random() * colors.length)]);
g.fillOval(r.x, r.y, l1.x - r.x, r.height);
}
}
catch (BadLocationException ble)
{
}
}
public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds,
JTextComponent c, View view)
{
paint(g, p0, p1, bounds, c);
return bounds;
}
}
/**
* The non wrapping text areas and state buttons.
*/
JTextArea textarea1;
JTextArea textarea2;
JTextArea textarea3;
JCheckBox enabled1;
JCheckBox editable1;
JPanel panel1;
/**
* The char wrapping textareas and state buttons.
*/
JTextArea textarea4;
JTextArea textarea5;
JTextArea textarea6;
JCheckBox enabled2;
JCheckBox editable2;
/**
* The word wrapping textareas and state buttons.
*/
JTextArea textarea7;
JTextArea textarea8;
JTextArea textarea9;
JCheckBox enabled3;
JCheckBox editable3;
/**
* The custom colored textareas and state buttons.
*/
JTextArea textarea10;
JTextArea textarea11;
JTextArea textarea12;
JTextArea textarea13;
JTextArea textarea14;
JTextArea textarea14b;
JCheckBox enabled4;
JCheckBox editable4;
/**
* Some miscellaneous textarea demos.
*/
JTextArea textarea15;
JTextArea textarea16;
JTextArea textarea17;
JCheckBox enabled5;
JCheckBox editable5;
/**
* Creates a new demo instance.
*/
public TextAreaDemo()
{
super();
createContent();
}
/**
* When the demo is run independently, the frame is displayed, so we should
* initialise the content panel (including the demo content and a close
* button). But when the demo is run as part of the Swing activity board, only
* the demo content panel is used, the frame itself is never displayed, so we
* can avoid this step.
*/
void initFrameContent()
{
JPanel closePanel = new JPanel();
JButton closeButton = new JButton("Close");
closeButton.setActionCommand("CLOSE");
closeButton.addActionListener(this);
closePanel.add(closeButton);
add(closePanel, BorderLayout.SOUTH);
}
/**
* Returns a panel with the demo content. The panel uses a BorderLayout(), and
* the BorderLayout.SOUTH area is empty, to allow callers to add controls to
* the bottom of the panel if they want to (a close button is added if this
* demo is being run as a standalone demo).
*/
private void createContent()
{
setLayout(new BorderLayout());
JTabbedPane tabPane = new JTabbedPane();
tabPane.addTab("Non-wrap", createNonWrapPanel());
tabPane.addTab("Char-wrap", createCharWrapPanel());
tabPane.addTab("Word-wrap", createWordWrapPanel());
tabPane.addTab("Custom colors", createCustomColoredPanel());
tabPane.addTab("Misc", createMiscPanel());
add(tabPane);
}
private JPanel createNonWrapPanel()
{
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder("Not wrapping"));
panel1 = new JPanel(new GridLayout(2, 2));
textarea1 = new JTextArea("Hello World!");
textarea1.setFont(new Font("Dialog", Font.PLAIN, 8));
panel1.add(new JScrollPane(textarea1));
textarea2 = new JTextArea("Hello World!");
textarea2.setFont(new Font("Dialog", Font.ITALIC, 12));
panel1.add(new JScrollPane(textarea2));
textarea3 = new JTextArea("Hello World!");
textarea3.setFont(new Font("Dialog", Font.BOLD, 14));
panel1.add(new JScrollPane(textarea3));
panel.add(panel1);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
enabled1 = new JCheckBox("enabled");
enabled1.setSelected(true);
enabled1.addActionListener(this);
enabled1.setActionCommand("ENABLED1");
statePanel.add(enabled1);
editable1 = new JCheckBox("editable");
editable1.setSelected(true);
editable1.addActionListener(this);
editable1.setActionCommand("EDITABLE1");
statePanel.add(editable1);
statePanel.add(Box.createVerticalGlue());
panel.add(statePanel, BorderLayout.EAST);
return panel;
}
private JPanel createCharWrapPanel()
{
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder("Wrap at char bounds"));
JPanel innerPanel = new JPanel(new GridLayout(2, 2));
textarea4 = new JTextArea("Hello World!");
textarea4.setLineWrap(true);
textarea4.setFont(new Font("Dialog", Font.PLAIN, 8));
innerPanel.add(new JScrollPane(textarea4));
textarea5 = new JTextArea("Hello World!");
textarea5.setLineWrap(true);
textarea5.setFont(new Font("Dialog", Font.ITALIC, 12));
innerPanel.add(new JScrollPane(textarea5));
textarea6 = new JTextArea("Hello World!");
textarea6.setLineWrap(true);
textarea6.setFont(new Font("Dialog", Font.BOLD, 14));
innerPanel.add(new JScrollPane(textarea6));
panel.add(innerPanel);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
enabled2 = new JCheckBox("enabled");
enabled2.setSelected(true);
enabled2.addActionListener(this);
enabled2.setActionCommand("ENABLED2");
statePanel.add(enabled2);
editable2 = new JCheckBox("editable");
editable2.setSelected(true);
editable2.addActionListener(this);
editable2.setActionCommand("EDITABLE2");
statePanel.add(editable2);
statePanel.add(Box.createVerticalGlue());
panel.add(statePanel, BorderLayout.EAST);
return panel;
}
private JPanel createWordWrapPanel()
{
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder("Wrap at word bounds"));
JPanel innerPanel = new JPanel(new GridLayout(2, 2));
textarea7 = new JTextArea("Hello World!");
textarea7.setWrapStyleWord(true);
textarea7.setLineWrap(true);
textarea7.setFont(new Font("Dialog", Font.PLAIN, 8));
innerPanel.add(new JScrollPane(textarea7));
textarea8 = new JTextArea("Hello World!");
textarea8.setWrapStyleWord(true);
textarea8.setLineWrap(true);
textarea8.setFont(new Font("Dialog", Font.ITALIC, 12));
innerPanel.add(new JScrollPane(textarea8));
textarea9 = new JTextArea("Hello World!");
textarea9.setWrapStyleWord(true);
textarea9.setLineWrap(true);
textarea9.setFont(new Font("Dialog", Font.BOLD, 14));
innerPanel.add(new JScrollPane(textarea9));
panel.add(innerPanel);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
enabled3 = new JCheckBox("enabled");
enabled3.setSelected(true);
enabled3.addActionListener(this);
enabled3.setActionCommand("ENABLED3");
statePanel.add(enabled3);
editable3 = new JCheckBox("editable");
editable3.setSelected(true);
editable3.addActionListener(this);
editable3.setActionCommand("EDITABLE3");
statePanel.add(editable3);
statePanel.add(Box.createVerticalGlue());
panel.add(statePanel, BorderLayout.EAST);
return panel;
}
private JPanel createCustomColoredPanel()
{
JPanel panel = new JPanel(new BorderLayout());
JPanel innerPanel = new JPanel(new GridLayout(3, 2));
panel.setBorder(BorderFactory.createTitledBorder("Custom colors"));
textarea10 = new JTextArea("custom foreground", 10, 15);
textarea10.setForeground(Color.GREEN);
innerPanel.add(new JScrollPane(textarea10));
textarea11 = new JTextArea("custom background", 10, 15);
textarea11.setBackground(Color.YELLOW);
innerPanel.add(new JScrollPane(textarea11));
textarea12 = new JTextArea("custom disabled textcolor", 10, 15);
textarea12.setDisabledTextColor(Color.BLUE);
innerPanel.add(new JScrollPane(textarea12));
textarea13 = new JTextArea("custom selected text color", 10, 15);
textarea13.setSelectedTextColor(Color.RED);
innerPanel.add(new JScrollPane(textarea13));
textarea14 = new JTextArea("custom selection color", 10, 15);
textarea14.setSelectionColor(Color.RED);
innerPanel.add(new JScrollPane(textarea14));
textarea14b = new JTextArea("custom selection and selected text color", 10, 15);
textarea14b.setSelectedTextColor(Color.WHITE);
textarea14b.setSelectionColor(Color.BLACK);
innerPanel.add(new JScrollPane(textarea14b));
panel.add(innerPanel);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
enabled4 = new JCheckBox("enabled");
enabled4.setSelected(true);
enabled4.addActionListener(this);
enabled4.setActionCommand("ENABLED4");
statePanel.add(enabled4);
editable4 = new JCheckBox("editable");
editable4.setSelected(true);
editable4.addActionListener(this);
editable4.setActionCommand("EDITABLE4");
statePanel.add(editable4);
statePanel.add(Box.createVerticalGlue());
panel.add(statePanel, BorderLayout.EAST);
return panel;
}
private JPanel createMiscPanel()
{
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder("Miscellaneous"));
JPanel innerPanel = new JPanel(new GridLayout(2, 2));
textarea15 = new JTextArea("Custom Caret");
textarea15.setCaret(new CornerCaret());
innerPanel.add(new JScrollPane(textarea15));
textarea16 = new JTextArea("Custom Caret color");
textarea16.setCaretColor(Color.MAGENTA);
innerPanel.add(new JScrollPane(textarea16));
textarea16 = new JTextArea("Custom Selection painter");
textarea16.setFont(new Font("Dialog", Font.PLAIN, 24));
textarea16.setCaret(new DefaultCaret()
{
public Highlighter.HighlightPainter getSelectionPainter()
{
return DemoHighlightPainter.INSTANCE;
}
});
innerPanel.add(new JScrollPane(textarea16));
panel.add(innerPanel);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
enabled5 = new JCheckBox("enabled");
enabled5.setSelected(true);
enabled5.addActionListener(this);
enabled5.setActionCommand("ENABLED5");
statePanel.add(enabled5);
editable5 = new JCheckBox("editable");
editable5.setSelected(true);
editable5.addActionListener(this);
editable5.setActionCommand("EDITABLE5");
statePanel.add(editable5);
statePanel.add(Box.createVerticalGlue());
panel.add(statePanel, BorderLayout.EAST);
return panel;
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("CLOSE"))
{
System.exit(0);
}
else if (e.getActionCommand().equals("ENABLED1"))
{
boolean enabled = enabled1.isSelected();
textarea1.setEnabled(enabled);
textarea2.setEnabled(enabled);
textarea3.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE1"))
{
boolean editable = editable1.isSelected();
textarea1.setEditable(editable);
textarea2.setEditable(editable);
textarea3.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED2"))
{
boolean enabled = enabled2.isSelected();
textarea4.setEnabled(enabled);
textarea5.setEnabled(enabled);
textarea6.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE2"))
{
boolean editable = editable2.isSelected();
textarea4.setEditable(editable);
textarea5.setEditable(editable);
textarea6.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED3"))
{
boolean enabled = enabled3.isSelected();
textarea7.setEnabled(enabled);
textarea8.setEnabled(enabled);
textarea9.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE3"))
{
boolean editable = editable3.isSelected();
textarea7.setEditable(editable);
textarea8.setEditable(editable);
textarea9.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED4"))
{
boolean enabled = enabled4.isSelected();
textarea10.setEnabled(enabled);
textarea11.setEnabled(enabled);
textarea12.setEnabled(enabled);
textarea13.setEnabled(enabled);
textarea14.setEnabled(enabled);
textarea14b.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE4"))
{
boolean editable = editable4.isSelected();
textarea10.setEditable(editable);
textarea11.setEditable(editable);
textarea12.setEditable(editable);
textarea13.setEditable(editable);
textarea14.setEditable(editable);
textarea14b.setEditable(editable);
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater
(new Runnable()
{
public void run()
{
TextAreaDemo app = new TextAreaDemo();
app.initFrameContent();
JFrame frame = new JFrame();
frame.getContentPane().add(app);
frame.pack();
frame.setVisible(true);
}
});
}
/**
* Returns a DemoFactory that creates a TextAreaDemo.
*
* @return a DemoFactory that creates a TextAreaDemo
*/
public static DemoFactory createDemoFactory()
{
return new DemoFactory()
{
public JComponent createDemo()
{
return new TextAreaDemo();
}
};
}
}