/*
* Copyright 2007 Pleso.net
*
* Licensed under the GNU Lesser General Public License, Version 2.1 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.gnu.org/licenses/lgpl.html
*
* 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 net.pleso.framework.client.ui.custom.controls.data;
import net.pleso.framework.client.dal.IDataColumn;
import net.pleso.framework.client.dal.IDataRow;
import net.pleso.framework.client.dal.db.IDBValue;
import net.pleso.framework.client.dal.db.types.DBFloat;
import net.pleso.framework.client.localization.FrameworkLocale;
import net.pleso.framework.client.ui.controls.ValidationErrorControl;
import net.pleso.framework.client.ui.interfaces.IEditableDataControl;
import net.pleso.framework.client.ui.interfaces.IFocusControl;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* Data control with two text boxes for range of float values.
*
* <h3>CSS Style Rules</h3>
* <ul>
* <li>.pf-floatRangeControl { control itself }</li>
* </ul>
*
* @author Scater
*
*/
public class FloatRangeControl extends Composite implements IEditableDataControl, IFocusControl {
protected FloatDataControl floatDataControlStart = new FloatDataControl();
protected FloatDataControl floatDataControlEnd = new FloatDataControl();
private ValidationErrorControl validErr = new ValidationErrorControl();
private VerticalPanel panel = new VerticalPanel();
/**
* Constructor
*/
public FloatRangeControl(){
this.panel.add(floatDataControlStart);
this.panel.setCellWidth(this.floatDataControlStart, "100%");
this.panel.add(floatDataControlEnd);
this.panel.setCellWidth(this.floatDataControlEnd, "100%");
initWidget(this.panel);
this.setStyleName("pf-floatRangeControl");
}
/**
* Bind row and range columns
* @param row row instance
* @param start_column column instance
* @param end_column column instance
*/
public void bind(IDataRow row, IDataColumn start_column, IDataColumn end_column) {
floatDataControlStart.bind(row, start_column);
floatDataControlEnd.bind(row, end_column);
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IBindableDataControl#readData()
*/
public void readData() {
floatDataControlStart.readData();
floatDataControlEnd.readData();
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IEditableDataControl#updateData()
*/
public void updateData() {
floatDataControlStart.updateData();
floatDataControlEnd.updateData();
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IEditableDataControl#isValid()
*/
public boolean isValid() {
return floatDataControlStart.isValid() && floatDataControlEnd.isValid() && internalValid;
}
boolean internalValid = true;
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IEditableDataControl#validate()
*/
public void validate() {
floatDataControlStart.validate();
floatDataControlEnd.validate();
// if validation was successful, must run internal validations also
if (floatDataControlStart.isValid() && floatDataControlEnd.isValid()){
internalValid = true;
hideError();
validateOneNotNull();
validateStartLessEqualEnd();
}
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IEditableDataControl#isRequired()
*/
public boolean isRequired() {
return floatDataControlStart.isRequired() && floatDataControlEnd.isRequired();
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IEditableDataControl#setRequired(boolean)
*/
public void setRequired(boolean required) {
floatDataControlStart.setRequired(required);
floatDataControlEnd.setRequired(required);
}
/**
* Hides validation error
*/
private void hideError(){
if (this.panel.getWidgetIndex(validErr) != -1)
this.panel.remove(validErr);
this.validErr.setText("");
}
/**
* Shows validation error
* @param errorText error text
*/
private void showError(String errorText){
internalValid = false;
this.validErr.setText(errorText);
this.panel.add(validErr);
}
/**
* Validation of rule "all values must be not null or no one"
*/
private void validateOneNotNull(){
if (floatDataControlStart.getValue().isNull() && !floatDataControlEnd.getValue().isNull()){
showError(FrameworkLocale.messages().start_range_field_is_required());
}
if (!floatDataControlStart.getValue().isNull() && floatDataControlEnd.getValue().isNull()){
showError(FrameworkLocale.messages().end_range_field_is_required());
}
}
/**
* Validation of rule "start value must be less than end value"
*/
private void validateStartLessEqualEnd(){
IDBValue startValue = floatDataControlStart.getValue();
IDBValue endValue = floatDataControlEnd.getValue();
if (!startValue.isNull() && !endValue.isNull()){
if (((DBFloat) startValue).getFloat().compareTo(((DBFloat) endValue).getFloat()) > 0){
showError(FrameworkLocale.messages().start_float_less_or_equal_end_float());
}
}
}
/* (non-Javadoc)
* @see net.pleso.framework.client.ui.interfaces.IFocusControl#setFocus(boolean)
*/
public void setFocus(boolean focused) {
this.floatDataControlStart.setFocus(focused);
}
/* (non-Javadoc)
* @see com.google.gwt.user.client.ui.SourcesKeyboardEvents#addKeyboardListener(com.google.gwt.user.client.ui.KeyboardListener)
*/
public void addKeyboardListener(KeyboardListener listener) {
this.floatDataControlStart.addKeyboardListener(listener);
this.floatDataControlEnd.addKeyboardListener(listener);
}
/* (non-Javadoc)
* @see com.google.gwt.user.client.ui.SourcesKeyboardEvents#removeKeyboardListener(com.google.gwt.user.client.ui.KeyboardListener)
*/
public void removeKeyboardListener(KeyboardListener listener) {
this.floatDataControlStart.removeKeyboardListener(listener);
this.floatDataControlEnd.removeKeyboardListener(listener);
}
}