package org.ovirt.engine.ui.userportal.client.util.messages; import java.util.LinkedList; import com.google.gwt.user.client.Timer; import org.ovirt.engine.ui.userportal.client.UserPortal; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.AnimationEffect; import com.smartgwt.client.types.Overflow; import com.smartgwt.client.types.TitleOrientation; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.AnimationCallback; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.Window; 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.ButtonItem; import com.smartgwt.client.widgets.form.fields.FormItemIcon; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.LayoutSpacer; import com.smartgwt.client.widgets.layout.VLayout; 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.MenuItemClickEvent; public class MessageCenterView extends HLayout implements MessageCenter.MessageListener { public MessageCenterView() { setHeight100(); setAlign(Alignment.LEFT); // setAlign(VerticalAlignment.CENTER); setOverflow(Overflow.HIDDEN); } @Override protected void onDraw() { super.onDraw(); UserPortal.getMessageCenter().addMessageListener(this); final Menu recentEventsMenu = new Menu(); IMenuButton recentEventsButton = new IMenuButton("messages", recentEventsMenu); recentEventsButton.setTop(5); recentEventsButton.setShowMenuBelow(false); recentEventsButton.setAutoFit(true); recentEventsButton.setValign(VerticalAlignment.CENTER); recentEventsButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent clickEvent) { LinkedList<Message> messages = UserPortal.getMessageCenter() .getMessages(); if (messages.isEmpty()) { recentEventsMenu .setItems(new MenuItem("No recent messages")); } else { MenuItem[] items = new MenuItem[messages.size()]; int i = 0; for (final Message message : messages) { MenuItem messageItem = new MenuItem(message.title, getSeverityIcon(message.severity)); items[i++] = messageItem; messageItem .addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() { public void onClick(MenuItemClickEvent event) { showDetails(message); } }); } recentEventsMenu.setItems(items); } } }); VLayout vl = new VLayout(); vl.setAutoWidth(); vl.setAlign(Alignment.LEFT); vl.setAlign(VerticalAlignment.CENTER); vl.addMember(recentEventsButton); addMember(vl); addMember(new LayoutSpacer()); } private void showDetails(Message message) { DynamicForm form = new DynamicForm(); form.setWrapItemTitles(false); StaticTextItem title = new StaticTextItem("title", "Title"); title.setValue(message.title); StaticTextItem severity = new StaticTextItem("severity", "Severity"); FormItemIcon severityIcon = new FormItemIcon(); severityIcon.setSrc(getSeverityIcon(message.severity)); severity.setIcons(severityIcon); severity.setValue(message.severity.name()); StaticTextItem date = new StaticTextItem("time", "Time"); date.setValue(message.createdAt); StaticTextItem detail = new StaticTextItem("detail", "Detail"); detail.setTitleOrientation(TitleOrientation.TOP); detail.setValue(message.createdAt); detail.setColSpan(2); ButtonItem okButton = new ButtonItem("Ok", "Ok"); okButton.setColSpan(2); okButton.setAlign(Alignment.CENTER); form.setItems(title, severity, date, detail, okButton); final Window window = new Window(); window.setTitle(message.title); window.setWidth(600); window.setHeight(400); window.setIsModal(true); window.setShowModalMask(true); window.setCanDragResize(true); window.centerInPage(); window.addItem(form); window.show(); okButton.focusInItem(); okButton.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() { public void onClick( com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) { window.destroy(); } }); } public void onMessage(final Message message) { final Label label = new Label(message.title); label.setMargin(5); label.setAutoFit(true); label.setHeight(25); label.setWrap(false); String iconSrc = getSeverityIcon(message.severity); label.setIcon(iconSrc); label.setTooltip(message.detailed); label.addClickHandler(new ClickHandler() { public void onClick(ClickEvent clickEvent) { showDetails(message); } }); addMember(label, 1); redraw(); Timer hideTimer = new Timer() { @Override public void run() { label.animateHide(AnimationEffect.FADE, new AnimationCallback() { public void execute(boolean b) { label.destroy(); } }); } }; hideTimer.schedule(10000); } private String getSeverityIcon(Message.Severity severity) { String iconSrc = null; switch (severity) { case Info: iconSrc = "msg/msg_info.png"; break; case Warning: iconSrc = "msg/msg_warn.png"; break; case Error: iconSrc = "msg/msg_error.png"; break; } return iconSrc; } }