/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.coregui.client.alert.definitions;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.events.VisibilityChangedEvent;
import com.smartgwt.client.widgets.events.VisibilityChangedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.tab.events.TabDeselectedEvent;
import com.smartgwt.client.widgets.tab.events.TabDeselectedHandler;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
/**
* @author John Mazzitelli
* @author Jirka Kremser
*/
public class SingleAlertDefinitionView extends EnhancedVLayout {
private AlertDefinition alertDefinition;
private AbstractAlertDefinitionsView alertDefView;
private GeneralPropertiesAlertDefinitionForm generalProperties;
private ConditionsAlertDefinitionForm conditions;
private NotificationsAlertDefinitionForm notifications;
private RecoveryAlertDefinitionForm recovery;
private DampeningAlertDefinitionForm dampening;
private Button editButton;
private Button saveButton;
private Button cancelButton;
private TabSet tabSet;
private Tab generalPropertiesTab;
private HandlerRegistration handlerRegistration;
private boolean needsCleanup = false;
private boolean isAuthorizedToModifyAlertDefinitions;
public SingleAlertDefinitionView(AbstractAlertDefinitionsView alertDefView) {
this(alertDefView, null);
}
@Override
public void destroy() {
if (handlerRegistration == null) { // the leaving dialog has been answered
super.destroy();
needsCleanup = false;
} else {
needsCleanup = true;
}
}
public SingleAlertDefinitionView(final AbstractAlertDefinitionsView alertDefView, AlertDefinition alertDefinition) {
super();
this.alertDefinition = alertDefinition;
this.isAuthorizedToModifyAlertDefinitions = alertDefView.isAuthorizedToModifyAlertDefinitions();
this.alertDefView = alertDefView;
tabSet = new TabSet();
tabSet.setHeight100();
generalPropertiesTab = new Tab(MSG.common_title_generalProp());
generalProperties = new GeneralPropertiesAlertDefinitionForm(alertDefinition);
generalPropertiesTab.setPane(generalProperties);
generalPropertiesTab.addTabDeselectedHandler(new TabDeselectedHandler() {
@Override
public void onTabDeselected(TabDeselectedEvent event) {
if (!generalProperties.validate()) {
event.cancel();
}
}
});
Tab conditionsTab = new Tab(MSG.view_alert_common_tab_conditions());
conditions = new ConditionsAlertDefinitionForm(alertDefView.getResourceType(), alertDefinition);
conditionsTab.setPane(conditions);
Tab notificationsTab = new Tab(MSG.view_alert_common_tab_notifications());
notifications = new NotificationsAlertDefinitionForm(alertDefinition);
notificationsTab.setPane(notifications);
Tab recoveryTab = new Tab(MSG.view_alert_common_tab_recovery());
recovery = new RecoveryAlertDefinitionForm(alertDefView.getAlertDefinitionDataSource(), alertDefinition);
recoveryTab.setPane(recovery);
Tab dampeningTab = new Tab(MSG.view_alert_common_tab_dampening());
dampening = new DampeningAlertDefinitionForm(alertDefinition);
dampeningTab.setPane(dampening);
tabSet.setTabs(generalPropertiesTab, conditionsTab, notificationsTab, recoveryTab, dampeningTab);
final HLayout buttons = new HLayout();
buttons.setMembersMargin(20);
editButton = new Button(MSG.common_button_edit());
saveButton = new Button(MSG.common_button_save());
cancelButton = new Button(MSG.common_button_cancel());
editButton.show();
saveButton.hide();
cancelButton.hide();
buttons.addMember(editButton);
buttons.addMember(saveButton);
buttons.addMember(cancelButton);
editButton.setDisabled(!isAuthorizedToModifyAlertDefinitions);
editButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
makeEditable();
}
});
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
save();
}
});
cancelButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
unregisterHandler();
setAlertDefinition(getAlertDefinition()); // reverts data back to original
makeViewOnly();
}
});
setMembersMargin(10);
addMember(tabSet);
addMember(buttons);
}
@Override
protected void onDraw() {
super.onDraw();
if (alertDefinition == null || alertDefinition.getId() == 0) {
// disable the back button when creating new definition
setBackButtonDisabled(true);
}
}
public AlertDefinition getAlertDefinition() {
return alertDefinition;
}
public boolean isResetMatching() {
return conditions.isResetMatching() || dampening.isResetMatching();
}
public void setAlertDefinition(AlertDefinition alertDef) {
alertDefinition = alertDef;
generalProperties.setAlertDefinition(alertDef);
conditions.setAlertDefinition(alertDef);
notifications.setAlertDefinition(alertDef);
recovery.setAlertDefinition(alertDef);
dampening.setAlertDefinition(alertDef);
makeViewOnly();
}
public void makeEditable() {
// if (!this.allowedToModifyAlertDefinitions) {
// this is just a safety measure - we should never get here if we don't have perms, but just in case,
// don't do anything to allow the def to be editable. Should we notify the message center?
// return;
// }
saveButton.show();
cancelButton.show();
editButton.hide();
generalProperties.makeEditable();
conditions.makeEditable();
notifications.makeEditable();
recovery.makeEditable();
dampening.makeEditable();
unregisterHandler();
handlerRegistration = addVisibilityChangedHandler(new VisibilityChangedHandler() {
public void onVisibilityChanged(VisibilityChangedEvent event) {
if (!event.getIsVisible()) {
SC.ask(MSG.view_alert_definitions_leaveUnsaved(), new BooleanCallback() {
public void execute(Boolean value) {
if (value) {
save();
} else {
unregisterHandler();
}
}
});
}
}
});
// disable the back button
setBackButtonDisabled(true);
}
public void makeViewOnly() {
saveButton.hide();
cancelButton.hide();
editButton.show();
generalProperties.makeViewOnly();
conditions.makeViewOnly();
notifications.makeViewOnly();
recovery.makeViewOnly();
dampening.makeViewOnly();
setBackButtonDisabled(false);
}
public void saveAlertDefinition() {
generalProperties.saveAlertDefinition();
conditions.saveAlertDefinition();
notifications.saveAlertDefinition();
recovery.saveAlertDefinition();
dampening.saveAlertDefinition();
}
private void save() {
if (generalProperties.validate()) {
boolean resetMatching = isResetMatching();
saveAlertDefinition();
setAlertDefinition(getAlertDefinition()); // loads data into static fields
editButton.disable();
makeViewOnly();
alertDefView.commitAlertDefinition(getAlertDefinition(), resetMatching,
new AsyncCallback<AlertDefinition>() {
@Override
public void onSuccess(final AlertDefinition alertDef) {
setAlertDefinition(alertDef);
unregisterHandler();
editButton.enable();
}
@Override
public void onFailure(Throwable caught) {
unregisterHandler();
// no error handling, the notification is done in the subclasses of AbstractAlertDefinitionsView
editButton.enable();
}
});
} else {
tabSet.selectTab(generalPropertiesTab);
}
}
private void setBackButtonDisabled(boolean enabled) {
Canvas layoutCandidate = getParentElement();
if (layoutCandidate instanceof EnhancedVLayout) {
EnhancedVLayout parentLayout = (EnhancedVLayout) getParentElement();
Canvas backButton = parentLayout.getMember("backButton");
if (backButton != null) {
backButton.setDisabled(enabled);
}
}
}
private void unregisterHandler() {
if (handlerRegistration != null) {
handlerRegistration.removeHandler();
handlerRegistration = null;
if (needsCleanup)
destroy();
}
}
}