/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* 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 3 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 at <http://www.gnu.org/licenses/>
* for more details.
*
* ColorManager.java
*
* Created on 3. August 2003, 11:16
*/
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import boardgraphics.GraphicsContext;
/**
* Window for changing the colors of board objects.
*
* @author Alfons Wirtz
*/
public class ColorManager extends BoardSavableSubWindow
{
/** Creates a new instance of ColorManager */
public ColorManager(BoardFrame p_board_frame)
{
GraphicsContext graphics_context = p_board_frame.board_panel.board_handling.graphics_context;
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("gui.resources.Default", p_board_frame.get_locale());
this.setTitle(resources.getString("color_manager"));
final JPanel panel = new JPanel();
final int textfield_height = 17;
final int table_width = 1100;
final int item_color_table_height = graphics_context.item_color_table.getRowCount() * textfield_height;
panel.setPreferredSize(new Dimension(10 + table_width, 70 + item_color_table_height));
this.item_color_table = new JTable(graphics_context.item_color_table);
item_color_table.setPreferredScrollableViewportSize(new Dimension(table_width, item_color_table_height));
JScrollPane item_scroll_pane = init_color_table(item_color_table, p_board_frame.get_locale());
panel.add(item_scroll_pane, BorderLayout.NORTH);
this.other_color_table = new JTable(graphics_context.other_color_table);
this.other_color_table.setPreferredScrollableViewportSize(new Dimension(table_width, textfield_height));
JScrollPane other_scroll_pane = init_color_table(other_color_table, p_board_frame.get_locale());
panel.add(other_scroll_pane, BorderLayout.SOUTH);
getContentPane().add(panel, BorderLayout.CENTER);
p_board_frame.set_context_sensitive_help(this, "WindowDisplay_Colors");
this.pack();
this.setResizable(false);
}
/**
* Reassigns the table model variables because they may have changed in p_graphics_context.
*/
public void set_table_models(GraphicsContext p_graphics_context)
{
this.item_color_table.setModel(p_graphics_context.item_color_table);
this.other_color_table.setModel(p_graphics_context.other_color_table);
}
/**
* Initializes p_color_table and return the created scroll_pane of the color table.
*/
private static JScrollPane init_color_table(JTable p_color_table, java.util.Locale p_locale)
{
//Create the scroll pane and add the table to it.
JScrollPane scroll_pane = new JScrollPane(p_color_table);
//Set up renderer and editor for the Color columns.
p_color_table.setDefaultRenderer(Color.class, new ColorRenderer(true));
setUpColorEditor(p_color_table, p_locale);
return scroll_pane;
}
//Set up the editor for the Color cells.
private static void setUpColorEditor(JTable p_table, java.util.Locale p_locale)
{
//First, set up the button that brings up the dialog.
final JButton button = new JButton("")
{
public void setText(String s)
{
//Button never shows text -- only color.
}
};
button.setBackground(Color.white);
button.setBorderPainted(false);
button.setMargin(new Insets(0,0,0,0));
//Now create an editor to encapsulate the button, and
//set it up as the editor for all Color cells.
final ColorEditor colorEditor = new ColorEditor(button);
p_table.setDefaultEditor(Color.class, colorEditor);
//Set up the dialog that the button brings up.
final JColorChooser colorChooser = new JColorChooser();
ActionListener okListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
colorEditor.currentColor = colorChooser.getColor();
}
};
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("gui.resources.Default", p_locale);
final JDialog dialog = JColorChooser.createDialog(button,
resources.getString("pick_a_color"), true, colorChooser, okListener, null);
//Here's the code that brings up the dialog.
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
button.setBackground(colorEditor.currentColor);
colorChooser.setColor(colorEditor.currentColor);
//Without the following line, the dialog comes up
//in the middle of the screen.
//dialog.setLocationRelativeTo(button);
dialog.setVisible(true);
}
});
}
private final JTable item_color_table;
private final JTable other_color_table;
private static class ColorRenderer extends JLabel implements TableCellRenderer
{
Border unselectedBorder = null;
Border selectedBorder = null;
boolean isBordered = true;
public ColorRenderer(boolean p_is_bordered)
{
super();
this.isBordered = p_is_bordered;
setOpaque(true); //MUST do this for background to show up.
}
public Component getTableCellRendererComponent(
JTable p_table, Object p_color,
boolean p_is_selected, boolean p_has_focus,
int p_row, int p_column)
{
setBackground((Color)p_color);
if (isBordered)
{
if (p_is_selected)
{
if (selectedBorder == null)
{
selectedBorder =
BorderFactory.createMatteBorder(2,5,2,5,
p_table.getSelectionBackground());
}
setBorder(selectedBorder);
}
else
{
if (unselectedBorder == null)
{
unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
p_table.getBackground());
}
setBorder(unselectedBorder);
}
}
return this;
}
}
/**
* The editor button that brings up the dialog.
* We extend DefaultCellEditor for convenience,
* even though it mean we have to create a dummy
* check box. Another approach would be to copy
* the implementation of TableCellEditor methods
* from the source code for DefaultCellEditor.
*/
private static class ColorEditor extends DefaultCellEditor
{
Color currentColor = null;
public ColorEditor(JButton b)
{
super(new JCheckBox()); //Unfortunately, the constructor
//expects a check box, combo box,
//or text field.
editorComponent = b;
setClickCountToStart(1); //This is usually 1 or 2.
//Must do this so that editing stops when appropriate.
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
fireEditingStopped();
}
});
}
protected void fireEditingStopped()
{
super.fireEditingStopped();
}
public Object getCellEditorValue()
{
return currentColor;
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column)
{
((JButton)editorComponent).setText(value.toString());
currentColor = (Color)value;
return editorComponent;
}
}
}