package org.ovirt.engine.ui.userportal.client.components; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.DecoratedPopupPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.PushButton; import com.google.gwt.user.client.ui.ToggleButton; import com.smartgwt.client.types.ImageStyle; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.Img; import com.smartgwt.client.widgets.layout.HLayout; public class RefreshPanel extends HLayout { private GridController<?> gridController; private DecoratedPopupPanel menuPopup; private RefreshRateOptionsMenu refreshOptionsMenu; private ToggleButton refreshMenuButton; private PushButton refreshButton; public RefreshPanel(GridController<?> gridController) { this.gridController = gridController; // Set panel's attributes setStyleName("refreshPanel"); setAlign(VerticalAlignment.CENTER); setWidth(32); setHeight(18); // Create menu popup menuPopup = new DecoratedPopupPanel(true, false); menuPopup.setStyleName("refreshRateMenuPopup"); // Create refresh and refresh menu buttons createRefreshButton(); createRefreshMenuButton(); // Create refresh options menu refreshOptionsMenu = getRefreshOptionsMenu(); // Add menu to the popup menuPopup.add(refreshOptionsMenu); menuPopup.addAutoHidePartner(refreshMenuButton.getElement()); menuPopup.addCloseHandler(new CloseHandler<PopupPanel>(){ @Override public void onClose(CloseEvent<PopupPanel> event) { refreshMenuButton.setDown(false); }}); // Hide popup on window resize Window.addResizeHandler(new ResizeHandler() { public void onResize(ResizeEvent event) { menuPopup.hide(); } }); // Add mouse hover events addMouseOverHandler(new com.smartgwt.client.widgets.events.MouseOverHandler(){ public void onMouseOver(com.smartgwt.client.widgets.events.MouseOverEvent event) { setStyleName("refreshPanel-over"); } }); addMouseOutHandler(new com.smartgwt.client.widgets.events.MouseOutHandler(){ public void onMouseOut(com.smartgwt.client.widgets.events.MouseOutEvent event) { setStyleName("refreshPanel"); } }); // Create panel separator Img separatorImg = new Img("general/separator.gif", 3, 16); separatorImg.setImageWidth(1); separatorImg.setImageHeight(9); separatorImg.setImageType(ImageStyle.CENTER); // Add refresh button and refresh options menu button addMember(refreshButton); addMember(separatorImg); addMember(refreshMenuButton); } private void createRefreshButton() { Image refreshIcon = new Image("images/general/refresh_button.png"); refreshIcon.setPixelSize(11, 11); refreshIcon.setStyleName("refreshIcon"); refreshButton = new PushButton(refreshIcon); refreshButton.setStyleName("refreshButton"); refreshButton.setPixelSize(17, 17); refreshButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { gridController.search(); } }); } private void createRefreshMenuButton() { Image refreshMenuIcon = new Image("images/general/triangle_down.gif"); refreshMenuIcon.setPixelSize(7, 4); refreshMenuIcon.setStyleName("refreshMenuIcon"); refreshMenuButton = new ToggleButton(refreshMenuIcon); refreshMenuButton.setStyleName("refreshMenuButton"); refreshMenuButton.setPixelSize(13, 17); refreshMenuButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { // Show/Hide popup if (refreshMenuButton.isDown()) { // Check selected item int globalRefreshRate = GridRefreshManager.getInstance().getGlobalRefreshRate(); refreshOptionsMenu.selectItem(refreshOptionsMenu.getItemByRefreshRate(globalRefreshRate)); menuPopup.showRelativeTo(refreshMenuButton); } else { menuPopup.hide(); } } }); } private RefreshRateOptionsMenu getRefreshOptionsMenu() { // Create refresh rate options menu bar RefreshRateOptionsMenu refreshOptionsMenu = new RefreshRateOptionsMenu(true); refreshOptionsMenu.setStyleName("refreshRateMenu"); // Create menu's title and add it as the first item MenuItem title = new MenuItem("Refresh Rate", new Command() { public void execute() {} }); title.setEnabled(false); title.setStylePrimaryName("refreshMenuTitle"); refreshOptionsMenu.addItem(title); for (int itemIndex = 0; itemIndex < GridRefreshManager.REFRESH_RATES.length; itemIndex++) { // Create command and menu item RefreshRateOptionCommand command = new RefreshRateOptionCommand(); RefreshRateOptionMenuItem refreshRateOption = new RefreshRateOptionMenuItem(GridRefreshManager.REFRESH_RATES[itemIndex], command); refreshRateOption.setStyleName("refreshRateOption"); // Set command with the item it's associated with command.setMenuItem(refreshRateOption); // Add item (and a separator if needed) refreshOptionsMenu.addItem(refreshRateOption); if (itemIndex != GridRefreshManager.REFRESH_RATES.length-1) refreshOptionsMenu.addSeparator(); } return refreshOptionsMenu; } // A custom menu bar for 'RefreshRateOptionMenuItem' items. public class RefreshRateOptionsMenu extends MenuBar { public RefreshRateOptionsMenu(boolean vertical) { super(vertical); } public void selectItem(RefreshRateOptionMenuItem menuItem) { if (menuItem == null) return; // Select the specified item after unselecting the others for (MenuItem item : this.getItems()) { if (item instanceof RefreshRateOptionMenuItem) { RefreshRateOptionMenuItem refreshRateOptionMenuItem = (RefreshRateOptionMenuItem)item; refreshRateOptionMenuItem.unselect(); refreshRateOptionMenuItem.setSelectionStyle(false); } } menuItem.select(); } public RefreshRateOptionMenuItem getItemByRefreshRate(int refreshRate) { // Find the menu item that is associated with the specified refresh rate value for (MenuItem item : this.getItems()) { if (item instanceof RefreshRateOptionMenuItem) { RefreshRateOptionMenuItem refreshRateOptionMenuItem = (RefreshRateOptionMenuItem)item; if (refreshRateOptionMenuItem.getRefreshRate() == refreshRate) return refreshRateOptionMenuItem; } } return null; } } // A custom menu bar with check icon public class RefreshRateOptionMenuItem extends MenuItem { private Image checkItem; private int refreshRate; public RefreshRateOptionMenuItem(int refreshRate, Command cmd) { super("", true, cmd); this.refreshRate = refreshRate; checkItem = new Image("images/general/check_icon.png"); checkItem.setStyleName("checkItem"); checkItem.setVisible(false); getElement().appendChild(checkItem.getElement()); Anchor textItem = new Anchor(); textItem.setText(String.valueOf(refreshRate) + " sec"); textItem.setStyleName("textItem"); getElement().appendChild(textItem.getElement()); } public void select() { checkItem.setVisible(true); } public void unselect() { checkItem.setVisible(false); } public int getRefreshRate() { return refreshRate; } public void setSelectionStyle(boolean selected) { super.setSelectionStyle(selected); } } public class RefreshRateOptionCommand implements Command { private RefreshRateOptionMenuItem menuItem; public RefreshRateOptionCommand() { super(); } public RefreshRateOptionMenuItem getMenuItem() { return menuItem; } public void setMenuItem(RefreshRateOptionMenuItem menuItem) { this.menuItem = menuItem; } @Override public void execute() { menuPopup.hide(); refreshMenuButton.setDown(false); GridRefreshManager.getInstance().setGlobalRefreshRate(menuItem.getRefreshRate()); } } }