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@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 ---
rhq-commits@lists.fedorahosted.org