/*
* RHQ Management Platform
* Copyright (C) 2010-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.coregui.client.inventory.common;
import java.util.LinkedHashMap;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import com.smartgwt.client.widgets.grid.ListGrid;
import org.rhq.coregui.client.components.table.TableWidget;
import org.rhq.coregui.client.util.enhanced.EnhancedHLayout;
/**
* Widget for updating the collection intervals for the selected metrics. It displays two form fields for
* entering the interval and the interval's units (seconds, minutes, or hours), as well as a Set button
* for submitting the update.
*
* @author Ian Springer
*/
public class UpdateCollectionIntervalWidget extends EnhancedHLayout implements TableWidget {
private static final String ITEM_INTERVAL = "interval";
private static final String ITEM_UNITS = "units";
private static final String UNITS_SECONDS = "s";
private static final String UNITS_MINUTES = "m";
private static final String UNITS_HOURS = "h";
// Maps values to labels for the units select list.
private static final LinkedHashMap<String, String> VALUE_MAP = new LinkedHashMap<String, String>();
static {
VALUE_MAP.put(UNITS_SECONDS, MSG.common_unit_seconds());
VALUE_MAP.put(UNITS_MINUTES, MSG.common_unit_minutes());
VALUE_MAP.put(UNITS_HOURS, MSG.common_unit_hours());
}
private AbstractSchedulesView schedulesView;
private DynamicForm form;
private Button setButton;
public UpdateCollectionIntervalWidget(AbstractSchedulesView schedulesView) {
super();
this.schedulesView = schedulesView;
}
@Override
protected void onDraw() {
super.onDraw();
this.form = new DynamicForm();
this.form.setNumCols(3);
final IntegerItem intervalItem = new IntegerItem();
intervalItem.setWrapTitle(false);
intervalItem.setWidth(75);
intervalItem.setName(ITEM_INTERVAL);
intervalItem.setTitle(MSG.view_inventory_collectionInterval());
final IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
integerRangeValidator.setMin(1);
integerRangeValidator.setMax(10000000); // avoids exceptions if someone enters really large nums; no one needs to go higher anyway
intervalItem.setValidators(integerRangeValidator);
intervalItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent changedEvent) {
refresh(UpdateCollectionIntervalWidget.this.schedulesView.getListGrid());
}
});
// Specify a null title so no label is rendered to the left of the combo box.
SelectItem unitsItem = new SelectItem(ITEM_UNITS, null);
unitsItem.setValueMap(VALUE_MAP);
unitsItem.setDefaultValue(UNITS_MINUTES);
unitsItem.setShowTitle(false);
unitsItem.setWidth(125);
unitsItem.addChangedHandler(new ChangedHandler() {
@Override
public void onChanged(ChangedEvent event) {
String value = (String) event.getValue();
if (value.equals(UNITS_SECONDS)) {
integerRangeValidator.setMin(30);
} else {
integerRangeValidator.setMin(1);
}
refresh(UpdateCollectionIntervalWidget.this.schedulesView.getListGrid());
}
});
if (!schedulesView.hasWriteAccess()) {
intervalItem.setDisabled(true);
unitsItem.setDisabled(true);
}
this.form.setFields(intervalItem, unitsItem);
addMember(this.form);
this.setButton = new Button(MSG.common_button_set());
this.setButton.setDisabled(true);
this.setButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
if (form.validate()) {
UpdateCollectionIntervalWidget.this.schedulesView.disableAllFooterControls();
UpdateCollectionIntervalWidget.this.schedulesView.updateSchedules(getInterval());
}
}
});
this.setButton.setOverflow(Overflow.VISIBLE);
this.setButton.setMargin(3);
addMember(this.setButton);
}
@Override
public void refresh(ListGrid listGrid) {
if (isDrawn()) {
boolean isValid = this.form.validate();
int count = listGrid.getSelectedRecords().length;
Long interval = getInterval();
this.setButton.setDisabled(!isValid || count == 0 || interval == null);
} else {
markForRedraw();
}
}
private Long getInterval() {
IntegerItem item = (IntegerItem) this.form.getItem(ITEM_INTERVAL);
if (item.getValue() == null || !item.validate()) {
return null;
}
String stringValue = this.form.getValueAsString(ITEM_INTERVAL);
long longValue = Long.valueOf(stringValue);
String units = this.form.getValueAsString(ITEM_UNITS);
longValue *= 1000;
if (units.equals(UNITS_MINUTES)) {
longValue *= 60;
} else if (units.equals(UNITS_HOURS)) {
longValue *= 60 * 60;
}
return longValue;
}
}