/*
* Copyright (c) 2007, 2015 , Oracle. All rights reserved.
*
* This software is the proprietary information of Oracle Corporation.
* Use is subject to license terms.
*/
package org.eclipse.persistence.tools.workbench.uitools.swing;
import java.awt.Component;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxEditor;
import javax.swing.JTextField;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel;
import org.eclipse.persistence.tools.workbench.uitools.cell.CellRendererAdapter;
/**
* This <code>ComboBoxEditor</code> uses <code>TextFieldWithDefault</code> in
* order to push the value to the value holder during editing. Default Swing
* behavior only pushes the value when the focus is lost or if an action command
* is fired. This editor also supports showing a default value if no entry is
* set.
*
* @see TextFieldWithDefault
*
* @version 11.0.0
* @since 11.0.0
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public final class ComboBoxEditorWithDefault implements ComboBoxEditor
{
/**
* The editor created by the active look and feel.
*/
private ComboBoxEditor defaultComboBoxEditor;
/**
* Creates a new <code>ComboBoxEditorWithDefault</code>.
*
* @param defaultComboBoxEditor The <code>ComboBoxEditor</code> set by the
* look and feel
* @param subjectHolder The holder of the subject, which is used to either
* clear the text field or show the default value
* @param valueHolder The <code>PropertyValueModel</code> listening to the
* property
* @param defaultValueHolder The holder of the default value
*/
public ComboBoxEditorWithDefault(ComboBoxEditor defaultComboBoxEditor,
ValueModel subjectHolder,
PropertyValueModel valueHolder,
ValueModel defaultValueHolder)
{
this(defaultComboBoxEditor,
subjectHolder,
valueHolder,
defaultValueHolder,
null);
}
/**
* Creates a new <code>ComboBoxEditorWithDefault</code>.
*
* @param defaultComboBoxEditor The <code>ComboBoxEditor</code> set by the
* look and feel
* @param subjectHolder The holder of the subject, which is used to either
* clear the text field or show the default value
* @param valueHolder The <code>PropertyValueModel</code> listening to the
* property
* @param defaultValueHolder The holder of the default value
* @param cellRendererAdapter
*/
public ComboBoxEditorWithDefault(ComboBoxEditor defaultComboBoxEditor,
ValueModel subjectHolder,
PropertyValueModel valueHolder,
ValueModel defaultValueHolder,
CellRendererAdapter cellRendererAdapter)
{
super();
initialize(defaultComboBoxEditor,
subjectHolder,
valueHolder,
defaultValueHolder,
cellRendererAdapter);
}
/*
* (non-Javadoc)
*/
public void addActionListener(ActionListener actionListener)
{
// No need to add the listener since the value is pushed to the model
// automatically
}
/*
* (non-Javadoc)
*/
public Component getEditorComponent()
{
return defaultComboBoxEditor.getEditorComponent();
}
/*
* (non-Javadoc)
*/
public Object getItem()
{
return getTextField().getText();
}
private JTextField getTextField()
{
return (JTextField) defaultComboBoxEditor.getEditorComponent();
}
/**
* Initializes this <code>ComboBoxEditorWithDefault</code>.
*
* @param defaultComboBoxEditor The <code>ComboBoxEditor</code> set by the
* look and feel
* @param subjectHolder The holder of the subject, which is used to either
* clear the text field or show the default value
* @param valueHolder The <code>PropertyValueModel</code> listening to the
* property
* @param defaultValueHolder The holder of the default value
* @param cellRendererAdapter
*/
private void initialize(ComboBoxEditor defaultComboBoxEditor,
ValueModel subjectHolder,
PropertyValueModel valueHolder,
ValueModel defaultValueHolder,
CellRendererAdapter cellRendererAdapter)
{
this.defaultComboBoxEditor = defaultComboBoxEditor;
new TextFieldWithDefaultHandler
(
getTextField(),
subjectHolder,
valueHolder,
defaultValueHolder,
cellRendererAdapter
);
}
/*
* (non-Javadoc)
*/
public void removeActionListener(ActionListener actionListener)
{
// No need to remove the listener since it never was added
}
/*
* (non-Javadoc)
*/
public void selectAll()
{
defaultComboBoxEditor.selectAll();
}
/*
* (non-Javadoc)
*/
public void setItem(Object value)
{
JTextField textField = getTextField();
// When the text field has the focus, the value is set
// through the value holder
if (textField.hasFocus())
{
return;
}
// JTextField never returns null so use an empty string to test the
// equality of the current text and the value
if (value == null)
{
value = "";
}
// Only update the value if it has changed
if (!textField.getText().equals(value))
{
defaultComboBoxEditor.setItem(value);
}
}
}