/*
* BorderEditorPane.java
*
* Created on 31 ���� 2006 �., 14:01
*
*/
package datechooser.beans.editor.border;
import datechooser.beans.editor.border.types.*;
import datechooser.beans.editor.utils.TextOutput;
import static datechooser.beans.locale.LocaleUtils.getEditorLocaleString;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
/**
* Border editing panel.<br>
* ������ �������������� �������.
* @author Androsov Vadim
* @since 1.0
*/
public class BorderEditorPane
extends JPanel
implements PropertyChangeListener {
// private static final int DEFAULT_EDITOR = 0;
private static final int NO_BORDER_EDITOR = 0;
private static String EMPTY = "";
private BorderPreviewPane preview;
private JPanel control;
private SimpleBorderEditor editor;
private JList selType;
private JLabel typeName;
private AbstractBorderEditor[] typesEditors = null;
private int current;
public BorderEditorPane(SimpleBorderEditor editor) {
setEditor(editor);
typeName = new JLabel();
JPanel top = new JPanel(new BorderLayout());
JPanel content = new JPanel(new GridLayout(2, 1, 1, 10));
setLayout(new BorderLayout());
control = new JPanel(new BorderLayout());
top.add(control, BorderLayout.CENTER);
top.add(typeName, BorderLayout.SOUTH);
preview = new BorderPreviewPane();
preview.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5),
BorderFactory.createEtchedBorder()));
JButton reset = new JButton(getEditorLocaleString("Reset"));
JPanel resetPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
resetPane.add(reset);
reset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getCurrentEditor().reset();
refreshPreview();
}
});
initEditors();
content.add(top);
content.add(preview);
add(content, BorderLayout.CENTER);
add(new JScrollPane(selType), BorderLayout.EAST);
add(resetPane, BorderLayout.NORTH);
revalidate();
}
private void initEditors() {
typesEditors = new AbstractBorderEditor[] {
// new DefaultBorderEditor(),
new NoBorderEditor(),
new BevelBorderEditor(),
new CompoundBorderEditor(),
new EmptyBorderEditor(),
new EtchedBorderEditor(),
new LineBorderEditor(),
new MatteBorderEditor(),
new SoftBevelBorderEditor(),
new TitledBorderEditor() };
setCurrentEditor();
if (getEditor().getValue() != null) {
getCurrentEditor().setCurrentBorder((Border) getEditor().getValue());
}
// getDefaultEditor().setCurrentBorder((Border) getEditor().getValue());
OnBorderChange onSelect = new OnBorderChange();
for (AbstractBorderEditor visualEditor : typesEditors) {
visualEditor.addPropertyChangeListener(onSelect);
}
selType = new JList(new EditorsListModel());
selType.setCellRenderer(new TypesListRenderer());
selType.setSelectedIndex(current);
selType.setVisibleRowCount(typesEditors.length + 1);
selType.setOpaque(false);
selType.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
updateCaption();
selType.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
refreshEditor();
}
});
refreshPreview();
}
private void refreshEditor() {
setCurrentEditor(selType.getSelectedIndex());
updateCaption();
updateProperty();
refreshPreview();
}
private AbstractBorderEditor getDefaultEditor() {
return typesEditors[NO_BORDER_EDITOR];
}
private void updateCaption() {
typeName.setText(" " + getCurrentEditor().getCaption());
}
private void updateProperty() {
getEditor().setValue(getSelectedBorder());
}
private void refreshPreview() {
preview.setSelectedBorder((Border) getEditor().getValue());
preview.repaint();
}
private void showCurrentEditor() {
control.removeAll();
control.add(getCurrentEditor(), BorderLayout.CENTER);
control.revalidate();
control.repaint();
}
private Border getSelectedBorder() {
return getCurrentEditor().getSelectedBorder();
}
private AbstractBorderEditor getCurrentEditor() {
return typesEditors[current];
}
private int getCurrentEditorIndex() {
if (editor.getValue() == null) {
return NO_BORDER_EDITOR;
}
for (int i = 1; i < typesEditors.length; i++) {
if (typesEditors[i].getSelectedBorder() == null) {
continue;
}
Class curr = typesEditors[i].getSelectedBorder().getClass();
if (curr != null) {
if (curr.equals(editor.getValue().getClass())) {
return i;
}
}
}
return NO_BORDER_EDITOR;
}
private void setCurrentEditor() {
setCurrentEditor(getCurrentEditorIndex());
}
private void setCurrentEditor(int index) {
if (typesEditors == null) return;
if ((index < 0) || (index >= typesEditors.length)) {
current = 0;
} else {
current = index;
}
if (selType != null) selType.setSelectedIndex(current);
showCurrentEditor();
}
class EditorsListModel extends AbstractListModel {
public int getSize() {
return typesEditors.length;
}
public Object getElementAt(int index) {
return typesEditors[index];
}
}
public SimpleBorderEditor getEditor() {
return editor;
}
public void setEditor(SimpleBorderEditor editor) {
if (getEditor() != null) {
getEditor().removePropertyChangeListener(this);
}
this.editor = editor;
getEditor().addPropertyChangeListener(this);
}
public void propertyChange(PropertyChangeEvent evt) {
// if (editor.getValue() == null) return;
setCurrentEditor(getCurrentEditorIndex());
getCurrentEditor().setCurrentBorder((Border) editor.getValue());
refreshPreview();
}
private AbstractBorderEditor getTypeEditor(int index) {
if ((index < 0) || (index >= typesEditors.length)) {
return getDefaultEditor();
}
return typesEditors[index];
}
private class BorderPreviewPane extends JPanel {
private Border selectedBorder = null;
public Border getSelectedBorder() {
return selectedBorder;
}
public void setSelectedBorder(Border selectedBorder) {
this.selectedBorder = selectedBorder;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (getSelectedBorder() == null) return;
Rectangle rec = getBounds();
if (getSelectedBorder().getClass().equals(EmptyBorder.class)) {
TextOutput.paintBoxed(g, rec, getEditorLocaleString("Invisible"));
} else {
getSelectedBorder().paintBorder(this, g,
rec.width / 4,
rec.height / 4,
rec.width / 2,
rec.height / 2);
}
}
}
private class OnBorderChange implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
if (!AbstractBorderEditor.BORDER_EVENT_NAME.equals(evt.getPropertyName())) return;
updateProperty();
refreshPreview();
}
}
private class TypesListRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(final JList list, Object value,
int index, final boolean isSelected, boolean cellHasFocus) {
JLabel label = getTypeEditor(index).getPreviewLabel();
// label.setBackground(isSelected ?
// list.getSelectionBackground() : list.getBackground());
label.setForeground(isSelected ?
list.getSelectionForeground() : list.getForeground());
JPanel content = new JPanel(new GridLayout(1, 1));
content.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
content.setBackground(isSelected ?
list.getSelectionBackground() : list.getBackground());
content.add(label);
return content;
}
}
}