/*
* RHQ Management Platform
* Copyright (C) 2005-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.resource.detail;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.AutoFitWidthApproach;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.HTMLPane;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.DoubleClickEvent;
import com.smartgwt.client.widgets.events.DoubleClickHandler;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.components.table.AbstractTableAction;
import org.rhq.coregui.client.components.table.Table;
import org.rhq.coregui.client.components.table.TableActionEnablement;
import org.rhq.coregui.client.components.table.TimestampCellFormatter;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.inventory.resource.detail.ResourceErrorsDataSource.Field;
import org.rhq.coregui.client.util.enhanced.EnhancedIButton.ButtonColor;
import org.rhq.coregui.client.util.message.Message;
import org.rhq.coregui.client.util.message.Message.Severity;
public class ResourceErrorsView extends Table<ResourceErrorsDataSource> {
private static final String ERROR_ICON = "[SKIN]/Dialog/warn.png";
private ResourceTitleBar titleBar;
public ResourceErrorsView(Criteria criteria, ResourceTitleBar titleBar) {
super(MSG.common_title_componentErrors(), criteria);
this.titleBar = titleBar;
setWidth100();
setHeight100();
setShowHeader(false);
}
@Override
protected SelectionStyle getDefaultSelectionStyle() {
return SelectionStyle.MULTIPLE;
}
@Override
protected void configureTable() {
ListGridField errorTypeField = new ListGridField(Field.ERROR_TYPE,
MSG.dataSource_resourceErrors_field_errorType());
errorTypeField.setAlign(Alignment.CENTER);
errorTypeField.setAutoFitWidth(true);
errorTypeField.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
ListGridField timeField = new ListGridField(Field.TIME_OCCURED,
MSG.dataSource_resourceErrors_field_timeOccured());
timeField.setType(ListGridFieldType.DATE);
timeField.setAlign(Alignment.CENTER);
timeField.setWidth("20%");
TimestampCellFormatter.prepareDateField(timeField);
ListGridField summaryField = new ListGridField(Field.SUMMARY, MSG.dataSource_resourceErrors_field_summary());
summaryField.setAlign(Alignment.CENTER);
summaryField.setCellAlign(Alignment.LEFT);
summaryField.setWidth("*");
ListGridField iconField = new ListGridField("icon");
iconField.setType(ListGridFieldType.ICON);
iconField.setAlign(Alignment.CENTER);
iconField.setIcon(ERROR_ICON);
iconField.setCellIcon(ERROR_ICON);
iconField.setWidth("50");
iconField.setCanSort(false);
iconField.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
String details = event.getRecord().getAttribute(Field.DETAIL);
popupDetails(details);
}
});
iconField.setShowHover(true);
iconField.setHoverCustomizer(new HoverCustomizer() {
@Override
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
String html = record.getAttribute(Field.DETAIL);
if (html.length() > 80) {
// this was probably an error stack trace, snip it so the tooltip isn't too big
html = "<pre>" + html.substring(0, 80) + "...</pre><p>"
+ MSG.dataSource_resourceErrors_clickStatusIcon() + "</p>";
}
return html;
}
});
setListGridDoubleClickHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
ListGrid listGrid = (ListGrid) event.getSource();
ListGridRecord[] selectedRows = listGrid.getSelectedRecords();
if (selectedRows != null && selectedRows.length > 0) {
String details = selectedRows[0].getAttribute(Field.DETAIL);
popupDetails(details);
}
}
});
setListGridFields(errorTypeField, timeField, summaryField, iconField);
ResourceComposite resourceComposite = titleBar.getResource();
Set<Permission> resourcePermissions = resourceComposite.getResourcePermission().getPermissions();
final boolean canModifyResource = resourcePermissions.contains(Permission.MODIFY_RESOURCE);
addTableAction(MSG.common_button_delete(), MSG.common_msg_areYouSure(), ButtonColor.RED,
new AbstractTableAction(canModifyResource ? TableActionEnablement.ANY : TableActionEnablement.NEVER) {
public void executeAction(final ListGridRecord[] selection, Object actionValue) {
if (selection == null || selection.length == 0) {
return;
}
int[] resourceErrorIds = new int[selection.length];
int i = 0;
for (ListGridRecord record : selection) {
resourceErrorIds[i++] = record.getAttributeAsInt(Field.ID);
}
GWTServiceLookup.getResourceService().deleteResourceErrors(resourceErrorIds, new AsyncCallback<Void>() {
public void onSuccess(Void result) {
Message msg = new Message(MSG.dataSource_resourceErrors_deleteSuccess(String
.valueOf(selection.length)), Severity.Info);
CoreGUI.getMessageCenter().notify(msg);
refresh();
}
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.dataSource_resourceErrors_deleteFailure(), caught);
}
});
}
});
}
@Override
public void refresh() {
super.refresh();
this.titleBar.refreshResourceErrors();
}
private void popupDetails(String details) {
final Window winModal = new Window();
winModal.setTitle(MSG.common_title_componentErrors());
winModal.setOverflow(Overflow.VISIBLE);
winModal.setShowMinimizeButton(false);
winModal.setShowMaximizeButton(true);
winModal.setIsModal(true);
winModal.setShowModalMask(true);
winModal.setAutoSize(true);
winModal.setAutoCenter(true);
winModal.setShowResizer(true);
winModal.setCanDragResize(true);
winModal.centerInPage();
winModal.addCloseClickHandler(new CloseClickHandler() {
public void onCloseClick(CloseClickEvent event) {
winModal.markForDestroy();
titleBar.refreshResourceErrors();
}
});
HTMLPane htmlPane = new HTMLPane();
htmlPane.setMargin(10);
htmlPane.setDefaultWidth(700);
htmlPane.setDefaultHeight(500);
htmlPane.setContents("<pre>" + details + "</pre>");
winModal.addItem(htmlPane);
winModal.show();
}
}