org.apache.cayenne.swing.ComboSelectionBinding Maven / Gradle / Ivy
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
****************************************************************/
package org.apache.cayenne.swing;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
import org.apache.cayenne.validation.ValidationException;
/**
*/
public class ComboSelectionBinding extends BindingBase {
protected JComboBox comboBox;
protected Color defaultBGColor;
protected Color errorColor;
protected String defaultToolTip;
protected String noSelectionValue;
/**
* Binds to update model for a combo box selection events. For editable combo boxes
* model is updated whenever a new value is entered.
*/
public ComboSelectionBinding(JComboBox comboBox, String expression,
String noSelectionValue) {
super(expression);
this.comboBox = comboBox;
this.noSelectionValue = noSelectionValue;
// insert no selection value as first item in the combobox if it is not there
if (noSelectionValue != null
&& (comboBox.getItemCount() == 0 || comboBox.getItemAt(0) != noSelectionValue)) {
comboBox.insertItemAt(noSelectionValue, 0);
}
comboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!modelUpdateDisabled) {
updateModel();
}
}
});
// init error colors
initComponentDefaults();
}
protected void initComponentDefaults() {
this.errorColor = ValidatorDialog.WARNING_COLOR;
if (comboBox.getEditor() != null) {
Component editor = comboBox.getEditor().getEditorComponent();
if (editor instanceof JComponent) {
JComponent jEditor = (JComponent) editor;
this.defaultBGColor = jEditor.getBackground();
this.defaultToolTip = jEditor.getToolTipText();
}
}
}
public void updateView() {
Object value = getValue();
modelUpdateDisabled = true;
try {
clear();
ItemListener[] listeners = comboBox.getItemListeners();
for (ItemListener itemListener : listeners) {
if (itemListener instanceof JComboBoxUndoListener) {
//in order not to add event to undo list
((JComboBoxUndoListener) itemListener).setIsUserAction(false);
}
}
if (value != null) {
this.comboBox.setSelectedItem(value.toString());
}
else if (noSelectionValue != null) {
this.comboBox.setSelectedItem(noSelectionValue);
}
else {
this.comboBox.setSelectedIndex(-1);
}
}
finally {
modelUpdateDisabled = false;
}
}
protected void updateModel() {
try {
Object value = comboBox.getSelectedItem();
if (noSelectionValue != null && noSelectionValue.equals(value)) {
value = null;
}
setValue(value);
clear();
}
catch (ValidationException vex) {
initWarning(vex.getLocalizedMessage());
}
}
public Component getView() {
return comboBox;
}
protected void clear() {
if (comboBox.getEditor() != null) {
Component editor = comboBox.getEditor().getEditorComponent();
if (editor instanceof JComponent) {
JComponent jEditor = (JComponent) editor;
jEditor.setBackground(defaultBGColor);
jEditor.setToolTipText(defaultToolTip);
}
}
}
protected void initWarning(String message) {
if (comboBox.getEditor() != null) {
Component editor = comboBox.getEditor().getEditorComponent();
if (editor instanceof JComponent) {
JComponent jEditor = (JComponent) editor;
jEditor.setBackground(errorColor);
jEditor.setToolTipText(message);
}
}
}
}