alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 * StyleTable.java - Color/style option pane
 * Copyright (C) 2001 Matt Benson
 * Portions copyright (C) 1999 Slava Pestov
 * Portions copyright (C) 1999 mike dillon
 * Portions copyright (C) 1999-2001 Romain Guy
 *
 * 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 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.
 */

package org.jext.options;

import java.awt.Color;
import java.awt.Component;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.Map;
import java.util.Iterator;
import java.util.ArrayList;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JDialog;
import javax.swing.JButton;
import javax.swing.UIManager;
import javax.swing.JOptionPane;
import javax.swing.JColorChooser;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.border.EmptyBorder;

import org.jext.Jext;
import org.jext.Utilities;
import org.jext.GUIUtilities;
import org.jext.gui.JextCheckBox;
import org.jext.gui.JextHighlightButton;
import org.jext.gui.DisabledCellRenderer;
import org.gjt.sp.jedit.syntax.SyntaxStyle;

/**
 * This has been extracted from StylesOptions for universal use.
 * @author Slava Pestov, Mike Dillon, Romain Guy, Matt Benson
 */
public class StyleTable
 extends JTable
{
	
	public StyleTable()
	{
		this(new StyleTableModel());
	}//end default constructor
	
	public StyleTable(StyleTableModel model)
	{
		super(model);
    getTableHeader().setReorderingAllowed(false);
    getSelectionModel().addListSelectionListener(new ListHandler());
    getColumnModel().getColumn(1).setCellRenderer(new StyleTableModel.StyleRenderer());
    getColumnModel().getColumn(0).setCellRenderer(new DisabledCellRenderer());
	}//end constructor(StyleTableModel)
	
  private class ListHandler
	 implements ListSelectionListener
  {
    public void valueChanged(ListSelectionEvent evt)
    {
      if (evt.getValueIsAdjusting())
        return;
			SyntaxStyle style = new StyleEditor(StyleTable.this,
			 (SyntaxStyle) dataModel.getValueAt(getSelectedRow(), 1)).getStyle();
			if (style != null)
				dataModel.setValueAt(style, getSelectedRow(), 1);
    }//end valueChanged
  }//end class ListHandler

/**
 * TableModel for the StyleTable.
 */
	public static class StyleTableModel
	 extends AbstractTableModel
	{
		private ArrayList styleChoices;
	
		public StyleTableModel()
		{
			styleChoices = new ArrayList(10);
		}//end default constructor
		
/**
 * Construct a StyleTableModel and initialize it with the contents
 * of the specified Map.
 * @param choices   the Map containing the initial choices for this
 *                  StyleTableModel.  This should be a map of
 *                  String to String, so it would be
 *                  sensible to use a Properties object, but this
 *                  is not enforced beyond that the String forms of
 *                  the keys and values in the Map will be used.
 *                  Each map entry will be added to the
 *                  StyleTableModel as if by
 *                  addStyleChoice(String, String).
 * @see addStyleChoice(String, String)
 */
		public StyleTableModel(Map choices)
		{
			this();
			Iterator it = choices.entrySet().iterator();
			Map.Entry entry = null;
			while (it.hasNext())
			{
				entry = (Map.Entry)(it.next());
				addStyleChoice(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
			}//end while more keys
		}//end constructor(Map)
	
/**
 * @see TableModel#getColumnCount()
 */
		public int getColumnCount()
		{
			return 2;
		}//end getColumnCount
	
/**
 * @see TableModel#getRowCount()
 */
		public int getRowCount()
		{
			return styleChoices.size();
		}//end getRowCount
	
/**
 * @see TableModel#getValueAt(int, int)
 */
		public Object getValueAt(int row, int col)
		{
			StyleChoice ch = (StyleChoice) styleChoices.get(row);
			switch (col)
			{
				case 0:
					return ch.label;
				case 1:
					return ch.style;
				default:
					return null;
			}//end switch on column number
		}//end getValueAt
	
/**
 * @see TableModel#setValueAt(Object, int, int)
 */
		public void setValueAt(Object value, int row, int col)
		{
			StyleChoice ch = (StyleChoice) styleChoices.get(row);
			if (col == 1)
				ch.style = (SyntaxStyle) value;
			fireTableRowsUpdated(row, row);
		}//end setValueAt
	
/**
 * @see TableModel#getColumnName(int)
 */
		public String getColumnName(int index)
		{
			switch (index)
			{
				case 0:
					return Jext.getProperty("options.styles.object");
				case 1:
					return Jext.getProperty("options.styles.style");
				default:
					return null;
			}//end switch on index
		}//end getColumnName
	
/**
 * Save the contents of this StyleTableModel to Jext properties.
 */
		public void save()
		{
			for (int i = 0; i < styleChoices.size(); i++)
			{
				StyleChoice ch = (StyleChoice) styleChoices.get(i);
				Jext.setProperty(ch.property, GUIUtilities.getStyleString(ch.style));
			}//end for through style choices
		}//end save
    
    public void load()
    {
			for (int i = 0; i < styleChoices.size(); i++)
        ( (StyleChoice) styleChoices.get(i) ).resetStyle();
      fireTableRowsUpdated(0, styleChoices.size() - 1);
    }
	
/**
 * Add the specified style choice to this StyleTableModel.
 * @param label      String property name for the description.
 * @param property   String property name for the style.
 */
		public void addStyleChoice(String label, String property)
		{
			styleChoices.add(new StyleChoice(Jext.getProperty(label), property));
		}//end addStyleChoice
	
		private static class StyleChoice
		{
			String label;
			String property;
			SyntaxStyle style;
	
			StyleChoice(String label, String property/*, SyntaxStyle style*/)
			{
				this.label = label;
				this.property = property;
				this.style = GUIUtilities.parseStyle(Jext.getProperty(property));
			}//end constructor

      public void resetStyle()
      {
        this.style = GUIUtilities.parseStyle(Jext.getProperty(property));
      }
		}//end class StyleChoice
	
		private static class StyleRenderer
		 extends JLabel
		 implements TableCellRenderer
		{
			public StyleRenderer()
			{
				setOpaque(true);
				setBorder(StylesOptions.noFocusBorder);
				setText("Hello World");
			}//end constructor
	
			// TableCellRenderer implementation
			public Component getTableCellRendererComponent(JTable table,
							Object value, boolean isSelected, boolean cellHasFocus,
							int row, int col)
			{
				if (isSelected)
				{
					setBackground(table.getSelectionBackground());
					setForeground(table.getSelectionForeground());
				} else {
					setBackground(table.getBackground());
					setForeground(table.getForeground());
				}//end else, not selected
	
				if (value != null)
				{
					SyntaxStyle style = (SyntaxStyle) value;
					setForeground(style.getColor());
					setFont(style.getStyledFont(getFont()));
				}//end if value not null
	
				setBorder((cellHasFocus) ?
								UIManager.getBorder("Table.focusCellHighlightBorder") :
								StylesOptions.noFocusBorder);
				return this;
			}//end getTableCellRendererComponent
		}//end class StyleRenderer
	}//end class StyleTableModel
	
	private static class StyleEditor
	 extends JDialog
	 implements ActionListener, KeyListener
	{
		// private members
		private boolean okClicked;
		private JextCheckBox bold, italics;
		private JextHighlightButton ok, cancel;
		private JButton color;
	
		StyleEditor(Component comp, SyntaxStyle style)
		{
			super(JOptionPane.getFrameForComponent(comp),
						Jext.getProperty("styleEditor.title"), true);
	
			getContentPane().setLayout(new BorderLayout());
	
			JPanel panel = new JPanel();
			panel.add(italics = new JextCheckBox(Jext.getProperty("styleEditor.italics")));
			italics.getModel().setSelected(style.isItalic());
			panel.add(bold = new JextCheckBox(Jext.getProperty("styleEditor.bold")));
			bold.getModel().setSelected(style.isBold());
			panel.add(new JLabel(Jext.getProperty("styleEditor.color")));
			panel.add(color = new JButton("    "));
			color.setBackground(style.getColor());
			color.setRequestFocusEnabled(false);
			color.addActionListener(this);
	
			getContentPane().add(BorderLayout.CENTER, panel);
	
			panel = new JPanel();
			panel.add(ok = new JextHighlightButton(Jext.getProperty("general.ok.button")));
			getRootPane().setDefaultButton(ok);
			ok.addActionListener(this);
			panel.add(cancel = new JextHighlightButton(Jext.getProperty("general.cancel.button")));
			cancel.addActionListener(this);
	
			getContentPane().add(BorderLayout.SOUTH, panel);
	
			addKeyListener(this);
	
//			setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	
//			Dimension screen = getToolkit().getScreenSize();
			pack();
//			setLocation((screen.width - getSize().width) / 2,
//							(screen.height - getSize().height) / 2);
			setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
			Utilities.centerComponent(this);
			show();
		}//end constructor
	
		public void actionPerformed(ActionEvent evt)
		{
			Object source = evt.getSource();
			if (source == ok)
			{
				okClicked = true;
				dispose();
			}//end if source is the ok button
			else if (source == cancel)
				dispose();
			else if (source == color)
			{
				Color c =
								JColorChooser.showDialog(this, Jext.getProperty("colorChooser.title"),
								color.getBackground());
				if (c != null)
					color.setBackground(c);
			}//end if source is the color button
		}//end actionPerformed
	
		public void keyPressed(KeyEvent evt)
		{
			switch (evt.getKeyCode())
			{
				case KeyEvent.VK_ENTER:
					okClicked = true;
					dispose();
					evt.consume();
					break;
				case KeyEvent.VK_ESCAPE:
					dispose();
					evt.consume();
					break;
			}//end switch on key code
		}//end keyPressed
	
		public void keyReleased(KeyEvent evt)
		{
		}//end keyReleased
		public void keyTyped(KeyEvent evt)
		{
		}//end keyTyped
	
		public SyntaxStyle getStyle()
		{
			if (!okClicked)
				return null;
			return new SyntaxStyle(color.getBackground(),
						 italics.getModel().isSelected(), bold.getModel().isSelected());
		}//end getStyle
	}//end class StyleEditor
}//end class StyleTable
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.