modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
| 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
| 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
| 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java
| 26
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
| 433 ++++++++--
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
| 7
6 files changed, 398 insertions(+), 87 deletions(-)
New commits:
commit f40a6a433eadce7ba15f5a7213e3d64eb3d84b4c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 18 16:17:24 2011 -0400
BZ 681355 new window message center
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 41af140..3fe259e 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -143,6 +143,15 @@ public class CoreGUI implements EntryPoint,
ValueChangeHandler<String> {
}
});
+ KeyIdentifier messageCenterWindowKey = new KeyIdentifier();
+ messageCenterWindowKey.setCtrlKey(true);
+ messageCenterWindowKey.setKeyName("M");
+ Page.registerKey(messageCenterWindowKey, new KeyCallback() {
+ public void execute(String keyName) {
+ footer.getMessageCenter().showMessageCenterWindow();
+ }
+ });
+
GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
public void onUncaughtException(Throwable e) {
getErrorHandler().handleError(MSG.view_core_uncaught(), e);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
index 1cfdd50..c61ff23 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
@@ -48,6 +48,7 @@ public class Footer extends LocatableHLayout {
private static final String LOCATOR_ID = "CoreFooter";
private MessageBar messageBar;
+ private MessageCenterView messageCenter;
public Footer() {
super(LOCATOR_ID);
@@ -62,7 +63,7 @@ public class Footer extends LocatableHLayout {
protected void onDraw() {
super.onDraw();
- final MessageCenterView messageCenter = new
MessageCenterView(extendLocatorId(MessageCenterView.LOCATOR_ID));
+ messageCenter = new
MessageCenterView(extendLocatorId(MessageCenterView.LOCATOR_ID));
final FavoritesButton favoritesButton = new
FavoritesButton(extendLocatorId("Favorites"));
final AlertsMessage alertsMessage = new
AlertsMessage(extendLocatorId("Alerts"));
messageBar = new MessageBar();
@@ -81,7 +82,7 @@ public class Footer extends LocatableHLayout {
favoritesLayout.addMember(favoritesButton);
addMember(favoritesLayout);
- addMember(messageCenter);
+ addMember(messageCenter.getMessageCenterButton());
addMember(createHSpacer(0));
@@ -171,6 +172,10 @@ public class Footer extends LocatableHLayout {
return messageBar;
}
+ public MessageCenterView getMessageCenter() {
+ return messageCenter;
+ }
+
private HLayout createHSpacer(int width) {
HLayout spacer = new HLayout();
spacer.setWidth(width);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
index 96e1740..91ae345 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
@@ -38,6 +38,7 @@ public class Message {
// TODO: Add Debug severity?
public enum Severity {
+ // keep the order - the ordinals are sorted least severe to highest severe
Blank("InfoBlank", "info/icn_info_blank.png"), //
Info("InfoBlock", "info/icn_info_blue.png"), //
Warning("WarnBlock", "info/icn_info_orange.png"), //
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java
index 1a4845d..d9fba53 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java
@@ -32,14 +32,15 @@ public class MessageCenter {
private LinkedList<Message> messages = new LinkedList<Message>();
private List<MessageListener> listeners = new
ArrayList<MessageListener>();
- private static final int MAX_MESSAGES = 50;
+ private int maxMessages = 50;
public void notify(Message message) {
log(message);
if (!message.isTransient()) {
- this.messages.add(message);
- if (messages.size() > MAX_MESSAGES) {
- messages.removeFirst();
+ // put the newest messages up front; old messages are at the end
+ this.messages.addFirst(message);
+ if (messages.size() > maxMessages) {
+ messages.removeLast(); // we should only have 1 extra, so removeLast
should remove all extras
}
}
for (MessageListener listener : listeners) {
@@ -51,6 +52,18 @@ public class MessageCenter {
this.listeners.add(listener);
}
+ public int getMaxMessages() {
+ return maxMessages;
+ }
+
+ public void setMaxMessages(int max) {
+ // if we are shrinking the list, clip the extra, older, messages
+ if (max < this.maxMessages && messages.size() > max) {
+ messages.subList(max, messages.size()).clear();
+ }
+ this.maxMessages = max;
+ }
+
/**
* Returns a list of recently published non-transient messages.
*
@@ -65,7 +78,8 @@ public class MessageCenter {
}
private void log(Message message) {
- String formattedMessage = "On " + message.getFired() + ",
MessageCenter received " + message.getConciseMessage();
+ String formattedMessage = "At [" + message.getFired() + "]
MessageCenter received: "
+ + message.getConciseMessage();
if (message.severity == Message.Severity.Info) {
Log.info(formattedMessage);
} else if (message.severity == Message.Severity.Warning) {
@@ -78,5 +92,5 @@ public class MessageCenter {
Log.debug(formattedMessage);
}
}
-
+
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
index 1891bd4..cdf116b 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
@@ -18,110 +18,352 @@
*/
package org.rhq.enterprise.gui.coregui.client.util.message;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.Timer;
+import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.types.SortDirection;
+import com.smartgwt.client.types.TimeFormatter;
import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
+import com.smartgwt.client.widgets.events.DoubleClickEvent;
+import com.smartgwt.client.widgets.events.DoubleClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-import com.smartgwt.client.widgets.menu.IMenuButton;
-import com.smartgwt.client.widgets.menu.Menu;
-import com.smartgwt.client.widgets.menu.MenuItem;
-import com.smartgwt.client.widgets.menu.events.ClickHandler;
-import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
+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.SortNormalizer;
+import com.smartgwt.client.widgets.layout.Layout;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIMenuButton;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
/**
- * @author Greg Hinkle
+ * Message Center view that shows the latest messages generated by the app.
+ * This is a Table and can therefore be a member to any layout. However, it can
+ * also be displayed in its own non-modal dialog window. If you want this table
+ * shown in a dialog window, call {@link #showMessageCenterWindow()}.
+ *
+ * This Table also can provide a standalone button that you can add to any layout,
+ * see {@link #getMessageCenterButton()}. The button, when pressed, will popup
+ * the dialog message window as explained above.
+ *
+ * Note: this class has to be very careful about catching any and all exceptions.
+ * Otherwise, an uncaught exception will cause a flooding of global exception
+ * messages (since the unhandled exception handler in CoreGUI will recursively
+ * call into this message center).
+ *
+ * @author John Mazzitelli
*/
-public class MessageCenterView extends LocatableVLayout implements
MessageCenter.MessageListener {
+@SuppressWarnings("unchecked")
+public class MessageCenterView extends Table implements MessageCenter.MessageListener {
public static final String LOCATOR_ID = "MessageCenter";
+ public static final String TABLE_TITLE = MSG.view_messageCenter_messageTitle();
+
+ private static final String FIELD_TIME = "time";
+ private static final String FIELD_SEVERITY = "severity";
+ private static final String FIELD_CONCISEMESSAGE = "conciseMessage";
+ private static final String FIELD_OBJECT = "object";
- private Menu messagesMenu;
- private IMenuButton messageCenterButton;
- private int messageCount;
+ private Layout messageCenterButton;
+ private MessageCenterWindow window;
public MessageCenterView(String locatorId) {
- super(locatorId, 5);
- setHeight100();
- setAlign(Alignment.CENTER);
- setAutoWidth();
+ super(locatorId, MSG.view_messageCenter_messageTitle(), new SortSpecifier[] { new
SortSpecifier(FIELD_TIME,
+ SortDirection.DESCENDING) });
+ CoreGUI.getMessageCenter().addMessageListener(this);
}
- @Override
- protected void onDraw() {
- super.onDraw();
-
- messagesMenu = new LocatableMenu(this.extendLocatorId("Messages"));
+ /**
+ * This will popup a non-modal dialog window with the messages in a list.
+ */
+ public void showMessageCenterWindow() {
+ try {
+ createWindow().show();
+ } catch (Throwable e) {
+ Log.error("Cannot show message center window", e);
+ }
+ }
- messageCenterButton = new
LocatableIMenuButton(extendLocatorId("RecentEvents"), MSG
- .view_messageCenter_messageTitle(), messagesMenu);
- messageCenterButton.setAutoFit(true);
+ /**
+ * Returns a button enclosed in a layout. When the button is pressed, the
+ * Message Center non-modal dialog window will popup.
+ *
+ * To press the button programmatically (i.e. to popup the message center window),
+ * call {@link #showMessageCenterWindow()}.
+ *
+ * @return layout enclosing the button to popup the message center window
+ */
+ public Layout getMessageCenterButton() {
+ if (messageCenterButton == null) {
+ messageCenterButton = new
LocatableVLayout(extendLocatorId("layout"));
+ messageCenterButton.setMembersMargin(5);
+ messageCenterButton.setHeight100();
+ messageCenterButton.setAlign(Alignment.CENTER);
+ messageCenterButton.setAutoWidth();
- emptyMenu();
- addMember(messageCenterButton);
+ IButton button = new LocatableIButton(extendLocatorId("button"),
MSG.view_messageCenter_messageTitle());
+ button.setAlign(Alignment.CENTER);
+ button.setAutoFit(true);
+ button.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler()
{
+ @Override
+ public void onClick(ClickEvent event) {
+ showMessageCenterWindow();
+ }
+ });
- CoreGUI.getMessageCenter().addMessageListener(this);
+ messageCenterButton.addMember(button);
+ }
+ return messageCenterButton;
}
- public void onMessage(final Message message) {
- if (!message.isTransient()) {
- if (messageCount == 0) {
- addClearMenuItem();
- }
- messageCount++;
-
- MenuItem messageItem = new MenuItem(message.conciseMessage,
getSeverityIcon(message.severity));
- messageItem.addClickHandler(new ClickHandler() {
+ private Window createWindow() {
+ if (window == null) {
+ window = new MessageCenterWindow("MessageCenterViewWindow");
+ window.addItem(this);
+ window.addCloseClickHandler(new CloseClickHandler() {
@Override
- public void onClick(MenuItemClickEvent event) {
- showDetails(message);
+ public void onCloseClick(CloseClientEvent event) {
+ try {
+ // try really really hard to make selenium ID generation happy
(TODO: it still doesn't)
+ Canvas[] members = MessageCenterView.this.getMembers();
+ for (Canvas member : members) {
+ member.destroy();
+ }
+ MessageCenterView.this.destroy();
+ window.destroy();
+ } catch (Throwable e) {
+ Log.warn("Cannot destroy message center", e);
+ } finally {
+ window = null;
+ }
}
});
- messagesMenu.addItem(messageItem, 2); // put this just below the "clear
all msgs" item and the separator
-
- // to avoid flooding the message center, clip old messages
- final int maxMessages = 25;
- if (messageCount > maxMessages) {
- MenuItem[] items = messagesMenu.getItems();
- MenuItem[] clippedItems = new MenuItem[maxMessages + 2]; // +2 to take
into account the Clear All Messages item and the separator
- System.arraycopy(items, 0, clippedItems, 0, clippedItems.length);
- messagesMenu.setItems(clippedItems);
+ }
+
+ return window;
+ }
+
+ @Override
+ public void onMessage(final Message message) {
+ try {
+ if (!message.isTransient()) {
+ refresh();
+ if (window != null) {
+ window.blink();
+ }
}
+ } catch (Throwable e) {
+ Log.error("Cannot process message", e);
}
}
- private void addClearMenuItem() {
- MenuItem clearItem = new MenuItem(MSG.view_messageCenter_clearAllMessages());
- clearItem.addClickHandler(new
com.smartgwt.client.widgets.menu.events.ClickHandler() {
+ @Override
+ protected void configureTable() {
+ getListGrid().setEmptyMessage(MSG.view_messageCenter_noRecentMessages());
+
+
setTableTitle(MSG.view_messageCenter_lastNMessages(String.valueOf(CoreGUI.getMessageCenter().getMaxMessages())));
+
+ ListGridField severityField = new ListGridField(FIELD_SEVERITY);
+ severityField.setType(ListGridFieldType.ICON);
+ severityField.setAlign(Alignment.CENTER);
+ severityField.setShowValueIconOnly(true);
+ HashMap<String, String> severityIcons = new HashMap<String,
String>(5);
+ severityIcons.put(Severity.Blank.name(), getSeverityIcon(Severity.Blank));
+ severityIcons.put(Severity.Info.name(), getSeverityIcon(Severity.Info));
+ severityIcons.put(Severity.Warning.name(), getSeverityIcon(Severity.Warning));
+ severityIcons.put(Severity.Error.name(), getSeverityIcon(Severity.Error));
+ severityIcons.put(Severity.Fatal.name(), getSeverityIcon(Severity.Fatal));
+ severityField.setValueIcons(severityIcons);
+ severityField.setShowHover(true);
+ severityField.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int
colNum) {
+ try {
+ Severity severity = ((Message)
record.getAttributeAsObject(FIELD_OBJECT)).getSeverity();
+ switch (severity) {
+ case Info:
+ return MSG.common_severity_info();
+ case Warning:
+ return MSG.common_severity_warn();
+ case Error:
+ return MSG.common_severity_error();
+ case Fatal:
+ return MSG.common_severity_fatal();
+ }
+ } catch (Throwable e) {
+ Log.error("Cannot get severity hover", e);
+ }
+ return null;
+ }
+ });
+ severityField.setSortNormalizer(new SortNormalizer() {
+ @Override
+ public Object normalize(ListGridRecord record, String fieldName) {
+ try {
+ Severity severity = ((Message)
record.getAttributeAsObject(FIELD_OBJECT)).getSeverity();
+ return Integer.valueOf(severity.ordinal());
+ } catch (Throwable e) {
+ Log.error("Cannot get sort nomalizer", e);
+ }
+ return Integer.valueOf(0);
+ }
+ });
+
+ ListGridField timeField = new ListGridField(FIELD_TIME,
MSG.view_messageCenter_messageTime());
+ timeField.setType(ListGridFieldType.TIME);
+ timeField.setAttribute("displayFormat", TimeFormatter.TOPADDEDTIME);
+ timeField.setAlign(Alignment.LEFT);
+
+ ListGridField messageField = new ListGridField(FIELD_CONCISEMESSAGE,
MSG.common_title_message());
+
+ severityField.setWidth(25);
+ timeField.setWidth("15%");
+ messageField.setWidth("*");
+
+ getListGrid().setFields(severityField, timeField, messageField);
+
+ setListGridDoubleClickHandler(new DoubleClickHandler() {
@Override
- public void onClick(MenuItemClickEvent event) {
- emptyMenu();
+ public void onDoubleClick(DoubleClickEvent event) {
+ try {
+ ListGrid listGrid = (ListGrid) event.getSource();
+ ListGridRecord[] selectedRows = listGrid.getSelection();
+ if (selectedRows != null && selectedRows.length > 0) {
+ Message message = (Message)
selectedRows[0].getAttributeAsObject(FIELD_OBJECT); // show the first selected
+ showDetails(message);
+ }
+ } catch (Throwable e) {
+ Log.error("Cannot show details for message", e);
+ }
}
});
- messagesMenu.setItems(clearItem); // setItems making this the only item in the
menu
- MenuItem separator = new MenuItem();
- separator.setIsSeparator(true);
- messagesMenu.addItem(separator);
+ addTableAction(extendLocatorId("delete"), MSG.common_button_delete(),
MSG.common_msg_areYouSure(),
+ new AbstractTableAction(TableActionEnablement.ANY) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+ try {
+ for (ListGridRecord record : selection) {
+ Object doomed = record.getAttributeAsObject(FIELD_OBJECT);
+ CoreGUI.getMessageCenter().getMessages().remove(doomed);
+ }
+ refresh();
+ } catch (Throwable e) {
+ Log.error("Cannot delete messages", e);
+ }
+ }
+ });
+
+ addTableAction(extendLocatorId("deleteAll"),
MSG.common_button_delete_all(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(TableActionEnablement.ALWAYS) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+ try {
+ CoreGUI.getMessageCenter().getMessages().clear();
+ refresh();
+ } catch (Throwable e) {
+ Log.error("Cannot delete all messages", e);
+ }
+ }
+ });
+
+ LinkedHashMap<String, Integer> maxMessagesMap = new
LinkedHashMap<String, Integer>();
+ maxMessagesMap.put("10", Integer.valueOf("10"));
+ maxMessagesMap.put("25", Integer.valueOf("25"));
+ maxMessagesMap.put("50", Integer.valueOf("50"));
+ maxMessagesMap.put("100", Integer.valueOf("100"));
+ maxMessagesMap.put("200", Integer.valueOf("200"));
+ addTableAction(extendLocatorId("maxMessageMeny"),
MSG.view_messageCenter_maxMessages(), null, maxMessagesMap,
+ new AbstractTableAction(TableActionEnablement.ALWAYS) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+ try {
+ Integer maxSize = (Integer) actionValue;
+ CoreGUI.getMessageCenter().setMaxMessages(maxSize.intValue());
+
setTableTitle(MSG.view_messageCenter_lastNMessages(maxSize.toString()));
+ refresh();
+ } catch (Throwable e) {
+ Log.error("Cannot set max messages", e);
+ }
+ }
+ });
+
+ /*
+ // TODO only for testing, remove this when done testing
+ addTableAction(extendLocatorId("test"), "TEST MSG", null,
+ new AbstractTableAction(TableActionEnablement.ALWAYS) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+ for (Severity severity : EnumSet.allOf(Severity.class)) {
+ Message m = new Message(severity.name() + ':' +
System.currentTimeMillis(), severity);
+ CoreGUI.getMessageCenter().notify(m);
+ }
+ }
+ });
+ */
- markForRedraw();
+ // initial population of the list with current messages
+ try {
+ refresh();
+ } catch (Throwable e) {
+ Log.error("Cannot perform initial refresh", e);
+ }
}
- private void emptyMenu() {
- CoreGUI.getMessageCenter().getMessages().clear();
- messageCount = 0;
- messagesMenu.setItems(new MenuItem(MSG.view_messageCenter_noRecentMessages()));
- markForRedraw();
+ @Override
+ protected SelectionStyle getDefaultSelectionStyle() {
+ return SelectionStyle.MULTIPLE;
+ }
+
+ @Override
+ public void refresh() {
+ try {
+ super.refresh();
+
getListGrid().setRecords(transform(CoreGUI.getMessageCenter().getMessages()));
+ refreshTableInfo();
+ } catch (Throwable e) {
+ Log.error("Cannot refresh messages", e);
+ }
+ }
+
+ private ListGridRecord[] transform(List<Message> list) {
+ ListGridRecord[] results = new ListGridRecord[list.size()];
+ for (int i = 0; i < list.size(); i++) {
+ results[i] = transform(list.get(i));
+ }
+ return results;
+ }
+
+ private ListGridRecord transform(Message msg) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute(FIELD_TIME, msg.fired);
+ record.setAttribute(FIELD_SEVERITY, (msg.severity != null) ? msg.severity.name()
: Severity.Info.name());
+ record.setAttribute(FIELD_CONCISEMESSAGE, msg.conciseMessage);
+ record.setAttribute(FIELD_OBJECT, msg);
+ return record;
}
private void showDetails(Message message) {
@@ -148,7 +390,7 @@ public class MessageCenterView extends LocatableVLayout implements
MessageCenter
form.setItems(title, severity, date, detail);
final Window window = new
LocatableWindow(this.extendLocatorId("MessageWindow"));
- window.setTitle(MSG.view_messageCenter_messageTitle());
+ window.setTitle(MSG.common_title_message());
window.setWidth(600);
window.setHeight(400);
window.setIsModal(true);
@@ -168,19 +410,58 @@ public class MessageCenterView extends LocatableVLayout implements
MessageCenter
}
private String getSeverityIcon(Message.Severity severity) {
- String iconSrc = null;
- switch (severity) {
- case Info:
- iconSrc = "info/icn_info_blue.png";
- break;
- case Warning:
- iconSrc = "info/icn_info_orange.png";
- break;
- case Error:
- case Fatal:
- iconSrc = "info/icn_info_red.png";
- break;
+ if (severity == null) {
+ severity = Severity.Blank;
}
- return iconSrc;
+ return severity.getIcon();
}
+
+ static class MessageCenterWindow extends LocatableWindow {
+ private Timer blinkTimer;
+
+ public MessageCenterWindow(String locatorId) {
+ super(locatorId);
+ setTitle(TABLE_TITLE);
+ setShowMinimizeButton(true);
+ setShowMaximizeButton(true);
+ setShowCloseButton(true);
+ setIsModal(false);
+ setShowModalMask(false);
+ setWidth(700);
+ setHeight(300);
+ setShowResizer(true);
+ setCanDragResize(true);
+ centerInPage();
+
+ final String origColor = getBodyColor();
+ blinkTimer = new Timer() {
+ @Override
+ public void run() {
+ try {
+ setBodyColor(origColor);
+ setTitle(TABLE_TITLE);
+ redraw();
+ } catch (Throwable e) {
+ Log.error("Blink timer failed", e);
+ }
+ }
+ };
+ }
+
+ public void blink() {
+ try {
+ // window.flash() isn' t working so do it ourselves
+ if (getMinimized()) {
+ setTitle(TABLE_TITLE + " *");
+ } else {
+ setBodyColor(getHiliteBodyColor());
+ }
+ redraw();
+ blinkTimer.schedule(250);
+ } catch (Throwable e) {
+ Log.error("Cannot blink message center window", e);
+ }
+ }
+ }
+
}
diff --git
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index b7bc5c4..9d9da4f 100644
---
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -2085,11 +2085,12 @@ view_searchGUI_loginStatus = Unable to determine login status,
check server stat
# Message Center
#--------------------------
-view_messageCenter_button_messages = Messages
+view_messageCenter_messageTitle = Message Center
view_messageCenter_noRecentMessages = No Recent Messages
+view_messageCenter_maxMessages = Max Messages
+view_messageCenter_lastNMessages = Last {0} Messages
view_messageCenter_clearAllMessages = Clear All Messages
-view_messageCenter_messageTitle = Message Center
-view_messageCenter_messageSeverity = Severity
view_messageCenter_messageTime = Time
+view_messageCenter_messageSeverity = Severity
view_messageCenter_messageDetail = Detail
view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---