/*
* AppearEditorPane.java
*
* Created on 7 ������ 2006 �., 11:45
*
*/
package datechooser.beans.editor.appear;
import datechooser.beans.editor.backrender.BackRendererEditor;
import datechooser.beans.editor.cell.CellViewEditor;
import datechooser.beans.editor.descriptor.DescriptionManager;
import datechooser.beans.editor.utils.EditorDialog;
import datechooser.beans.locale.LocaleUtils;
import datechooser.controller.EventHandler;
import datechooser.events.CursorMoveEvent;
import datechooser.events.CursorMoveListener;
import datechooser.model.FooModel;
import datechooser.view.BackRenderer;
import datechooser.view.GridPane;
import datechooser.view.appearance.*;
import static datechooser.beans.locale.LocaleUtils.getEditorLocaleString;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.text.MessageFormat;
import java.util.AbstractList;
import javax.swing.*;
import javax.swing.event.ListDataListener;
/**
* Visual panel for appearance customizing.<br>
* ���������� ������ �������������� �������������.
* @author Androsov Vadim
* @since 1.0
*/
public class AppearEditorPane extends JPanel
implements PropertyChangeListener, CursorMoveListener {
private String[] cellTypes = { getEditorLocaleString("disabled"),
getEditorLocaleString("usual"),
getEditorLocaleString("selected"),
getEditorLocaleString("now"),
getEditorLocaleString("scroll"),
getEditorLocaleString("caption")};
private AppearEditor editor;
private FooModel model;
private JComboBox cellViews;
private boolean autoEdit;
private EditorDialog eDialog;
private EditorDialog bDialog;
private GridPane gp;
private boolean tempEdit;
private JComboBox views;
private JButton bEditCellView;
private JButton bDeleteCellView;
private JButton bSetBackPicture;
public AppearEditorPane(AppearEditor editor) {
LocaleUtils.prepareStandartDialogButtonText();
setEditor(editor);
setAutoEdit(false);
model = new FooModel();
model.addCursorMoveListener(this);
cellViews = createCellTypeCombo();
gp = createGridPane();
eDialog = new EditorDialog((Frame)this.getParent(), new CellViewEditor());
bDialog = new EditorDialog((Frame)this.getParent(), new BackRendererEditor());
JPanel control = new JPanel(new GridLayout(2, 4, 5, 5));
bSetBackPicture = createBackRendererButton();
createCellEditorButton();
createDeleteViewButton();
control.add(new JLabel(getEditorLocaleString("View"), JLabel.RIGHT));
control.add(createViewManagerCombo());
control.add(createNewViewButton());
control.add(bDeleteCellView);
control.add(new JLabel(getEditorLocaleString("Cell"), JLabel.RIGHT));
control.add(cellViews);
control.add(bEditCellView);
control.add(bSetBackPicture);
setLayout(new BorderLayout());
add(control, BorderLayout.NORTH);
add(gp, BorderLayout.CENTER);
}
private JPanel getEditorPane() {
return this;
}
private JButton createDeleteViewButton() {
bDeleteCellView = new JButton(getEditorLocaleString("Delete"));
bDeleteCellView.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String selViewName = getAppList().getCurrent().getName();
int ans = JOptionPane.showConfirmDialog(
getEditorPane().getParent(),
MessageFormat.format(getEditorLocaleString("Delete_view_prompt"), selViewName),
getEditorLocaleString("Confirm_delete"), JOptionPane.YES_NO_OPTION);
if (ans == JOptionPane.YES_OPTION) {
if (getAppList().unRegisterAppearance(selViewName)) {
getAppList().setCurrent(AppearancesList.DEFAULT);
updateEditable();
refreshViews();
fireLocalPropertyChange();
} else {
JOptionPane.showMessageDialog(
getEditorPane().getParent(),
MessageFormat.format(getEditorLocaleString("Cant_delete_view"), selViewName),
getEditorLocaleString("Undelitable_view"), JOptionPane.ERROR_MESSAGE);
}
}
}
});
return bDeleteCellView;
}
private JComboBox createViewManagerCombo() {
ViewListModel mm = null;
views = new JComboBox(new ViewListModel());
updateEditable();
views.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getAppList().setCurrent((String) views.getSelectedItem());
updateEditable();
gp.repaint();
}
});
return views;
}
private JButton createBackRendererButton() {
JButton button = new JButton(getEditorLocaleString("BackRenderer"));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ViewAppearance currentAppearance = getAppList().getCurrent();
BackRenderer newValue = (BackRenderer) bDialog.showDialog(
currentAppearance.getRenderer(),
getEditorLocaleString("BackRenderer"));
if (!bDialog.isCanceled()) {
currentAppearance.setRenderer(newValue);
fireLocalPropertyChange();
}
gp.repaint();
}
});
return button;
}
private void updateEditable() {
ViewAppearance currentAppearance = getAppList().getCurrent();
bEditCellView.setEnabled(currentAppearance.isEditable());
bDeleteCellView.setEnabled(currentAppearance.isEditable());
bSetBackPicture.setEnabled(currentAppearance.isSupportsTransparency() &&
currentAppearance.isEditable());
}
private void refreshViews() {
views.revalidate();
views.repaint();
}
private void registerViewAppearance(String newViewName) {
ViewAppearance newApp = (ViewAppearance) getAppList().getCurrent().clone();
newApp.setName(newViewName);
newApp.setEditable(true);
getAppList().registerAppearance(newApp);
getAppList().setCurrent(newViewName);
views.setSelectedItem(newViewName);
fireLocalPropertyChange();
refreshViews();
}
private JButton createNewViewButton() {
JButton bSave = new JButton(getEditorLocaleString("Create_view_clone"));
bSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String newViewName =
JOptionPane.showInputDialog(getEditorLocaleString("View_name_prompt"));
if (newViewName == null) return;
if (getAppList().isRegistered(newViewName)) {
int ans = JOptionPane.showConfirmDialog(
getEditorPane().getParent(),
MessageFormat.format(getEditorLocaleString("View_exist_prompt"), newViewName),
getEditorLocaleString("Existing_view"), JOptionPane.YES_NO_OPTION);
if (ans == JOptionPane.YES_OPTION) {
if (getAppList().getAppearance(newViewName).isEditable()) {
getAppList().unRegisterAppearance(newViewName);
} else {
JOptionPane.showMessageDialog(
getEditorPane().getParent(),
MessageFormat.format(getEditorLocaleString("Cant_replace_view"), newViewName),
getEditorLocaleString("Uneditable_view"), JOptionPane.ERROR_MESSAGE);
return;
}
} else {
return;
}
}
registerViewAppearance(newViewName);
}
});
return bSave;
}
private void generateClonedValue() {
if (isTempEdit()) return;
setTempEdit(true);
getEditor().setInnerValue(getAppList().notDeepClone());
gp.setAppearanceList(getAppList());
setTempEdit(false);
}
private void fireLocalPropertyChange() {
getEditor().firePropertyChange();
}
private CellAppearance getEditing() {
ViewAppearance curApp = getAppList().getCurrent();
switch (cellViews.getSelectedIndex()) {
case 0:
return curApp.getDisabled();
case 1:
return curApp.getUsual();
case 2:
return curApp.getSelected();
case 3:
return curApp.getNow();
case 4:
return curApp.getScroll();
case 5:
return curApp.getCaption();
}
return null;
}
private JButton createCellEditorButton() {
bEditCellView = new JButton(getEditorLocaleString("Edit"));
bEditCellView.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CellAppearance newValue = (CellAppearance) eDialog.showDialog(
getEditing(), MessageFormat.format(getEditorLocaleString("Edit_cell"), cellViews.getSelectedItem()));
if (!eDialog.isCanceled()) {
getEditing().assign(newValue);
fireLocalPropertyChange();
}
gp.repaint();
}
});
return bEditCellView;
}
private JComboBox createCellTypeCombo() {
cellViews = new JComboBox(cellTypes);
cellViews.setSelectedIndex(5);
cellViews.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isAutoEdit()) return;
setAutoEdit(true);
model.setTypeSelected(cellViews.getSelectedIndex());
setAutoEdit(false);
}
});
return cellViews;
}
private GridPane createGridPane() {
GridPane gp = new GridPane(getAppList());
gp.setFocusable(false);
gp.setFocused(true);
gp.setPreferredSize(new Dimension(200, 200));
gp.setModel(model);
gp.setController(new EventHandler());
return gp;
}
public AppearEditor getEditor() {
return editor;
}
public void setEditor(AppearEditor editor) {
if (getEditor() != null) {
getEditor().removePropertyChangeListener(this);
}
this.editor = editor;
setTempEdit(false);
if (getEditor() != null) {
getEditor().addPropertyChangeListener(this);
}
}
public boolean isAutoEdit() {
return autoEdit;
}
public void setAutoEdit(boolean autoEdit) {
this.autoEdit = autoEdit;
}
public boolean isTempEdit() {
return tempEdit;
}
public void setTempEdit(boolean tempEdit) {
this.tempEdit = tempEdit;
}
private AppearancesList getAppList() {
return getEditor().getAppearancesList();
}
public void propertyChange(PropertyChangeEvent evt) {
generateClonedValue();
gp.repaint();
}
public void onCursorMove(CursorMoveEvent evt) {
if (isAutoEdit()) return;
setAutoEdit(true);
if (!model.isSomeSelected()) return;
int index = 0;
switch (model.getSelectedCellState()) {
case NORMAL:
index = 1;
break;
case SELECTED:
index = 2;
break;
case NOW:
index = 3;
break;
case NORMAL_SCROLL:
index = 4;
break;
case UNACCESSIBLE:
index = 0;
break;
}
cellViews.setSelectedIndex(index);
setAutoEdit(false);
}
class ViewListModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener {
public ViewListModel() {
getEditor().addPropertyChangeListener(this);
}
public void setSelectedItem(Object anItem) {
String itemName = (String) anItem;
getAppList().setCurrent(itemName);
}
public Object getSelectedItem() {
return getAppList().getCurrent().getName();
}
public int getSize() {
return getAppList().getRegisteredCount();
}
public Object getElementAt(int index) {
return getAppList().getRegisteredNames()[index];
}
public void propertyChange(PropertyChangeEvent evt) {
this.fireContentsChanged(this, 0, getSize() - 1);
}
}
}