package org.ovirt.engine.ui.webadmin.widget.table.refresh;
import java.util.Set;
import org.ovirt.engine.ui.webadmin.widget.renderer.MilisecondRenderer;
import org.ovirt.engine.ui.webadmin.widget.table.RefreshPanelCSS;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.BorderStyle;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
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.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
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.FocusPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.MenuItemSeparator;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.ToggleButton;
/**
* A Panel that shows a refresh button, with popup menu to select the refresh rate<BR>
* Works with a {@link RefreshManager}
*/
public class RefreshPanel extends FocusPanel implements HasClickHandlers {
/**
* A ClientBundle that provides images for this widget.
*/
public interface Resources extends ClientBundle {
@Source("org/ovirt/engine/ui/webadmin/images/check_icon.png")
ImageResource check_icon();
@Source("org/ovirt/engine/ui/webadmin/images/refresh_button.png")
ImageResource refresh_button();
@Source("org/ovirt/engine/ui/webadmin/css/RefreshPanel.css")
RefreshPanelCSS refreshRate();
@Source("org/ovirt/engine/ui/webadmin/images/separator.gif")
@ImageOptions(width = 1, height = 9)
ImageResource separator();
@Source("org/ovirt/engine/ui/webadmin/images/triangle_down.gif")
@ImageOptions(width = 7, height = 5)
ImageResource triangle_down();
}
private class RefreshRateOptionCommand implements Command {
private RefreshRateOptionMenuItem menuItem;
public RefreshRateOptionCommand() {
super();
}
@Override
public void execute() {
menuPopup.hide();
refreshMenuButton.setDown(false);
refreshManager.setCurrentRefreshRate(menuItem.getRefreshRate());
}
public RefreshRateOptionMenuItem getMenuItem() {
return menuItem;
}
public void setMenuItem(RefreshRateOptionMenuItem menuItem) {
this.menuItem = menuItem;
}
}
/**
* A custom menu bar with check icon
*/
private class RefreshRateOptionMenuItem extends MenuItem {
private final Image checkItem;
private final int refreshRate;
public RefreshRateOptionMenuItem(int refreshRate, Command cmd) {
super("", true, cmd);
this.refreshRate = refreshRate;
checkItem = new Image(RESOURCES.check_icon());
checkItem.setStylePrimaryName(style.checkitem());
checkItem.setVisible(false);
getElement().appendChild(checkItem.getElement());
Anchor textItem = new Anchor();
textItem.setText(MilisecondRenderer.getInstance().render(refreshRate));
textItem.setStylePrimaryName(style.textItem());
getElement().appendChild(textItem.getElement());
}
public int getRefreshRate() {
return refreshRate;
}
public void select() {
checkItem.setVisible(true);
}
@Override
public void setSelectionStyle(boolean selected) {
super.setSelectionStyle(selected);
}
public void unselect() {
checkItem.setVisible(false);
}
}
/**
* A custom menu bar for 'RefreshRateOptionMenuItem' items.
*/
private class RefreshRateOptionsMenu extends MenuBar {
public RefreshRateOptionsMenu(boolean vertical) {
super(vertical);
}
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;
}
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();
}
}
private static final Resources RESOURCES = GWT.create(Resources.class);
private final DecoratedPopupPanel menuPopup;
private PushButton refreshButton;
private final RefreshManager refreshManager;
private ToggleButton refreshMenuButton;
private final RefreshRateOptionsMenu refreshOptionsMenu;
private final Label statusLabel;
private final RefreshPanelCSS style;
/**
* Create a Panel managed by the specified {@link RefreshManager}<BR>
* used only by the Refresh Manager
*
*/
RefreshPanel(RefreshManager refreshManager) {
this.refreshManager = refreshManager;
style = RESOURCES.refreshRate();
style.ensureInjected();
// Set panel's attributes
// setWidth("32px");
// setHeight("18px");
// Create menu popup
menuPopup = new DecoratedPopupPanel(true, false);
menuPopup.setStylePrimaryName(style.refreshRateMenuPopup());
// Add mouse hover events
addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
// border: 1px solid #96B7D6;
Style border = getElement().getStyle();
border.setBorderWidth(1, Unit.PX);
border.setBorderStyle(BorderStyle.SOLID);
border.setBorderColor("#96B7D6");
}
});
addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
// border: 1px solid transparent;
Style border = getElement().getStyle();
border.setBorderWidth(1, Unit.PX);
border.setBorderStyle(BorderStyle.SOLID);
border.setBorderColor("transparent");
}
});
// 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() {
@Override
public void onResize(ResizeEvent event)
{
menuPopup.hide();
}
});
// Create panel separator
ImageResource separatorImg = RESOURCES.separator();
// Add refresh button and refresh options menu button
HorizontalPanel panel = new HorizontalPanel();
statusLabel = new Label();
panel.add(statusLabel);
panel.add(refreshButton);
panel.add(new Image(separatorImg));
panel.add(refreshMenuButton);
setWidget(panel);
}
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return addHandler(handler, ClickEvent.getType());
}
public void showStatus(String status) {
// for debugging
// statusLabel.setText(status);
setTitle(status);
}
private void createRefreshButton() {
Image refreshIcon = new Image(RESOURCES.refresh_button());
refreshIcon.setPixelSize(11, 11);
refreshIcon.setStylePrimaryName(style.refreshIcon());
refreshButton = new PushButton(refreshIcon);
refreshButton.setStylePrimaryName(style.refreshButton());
refreshButton.setPixelSize(17, 17);
refreshButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
fireEvent(event);
}
});
}
private void createRefreshMenuButton() {
Image refreshMenuIcon = new Image(RESOURCES.triangle_down());
refreshMenuButton = new ToggleButton(refreshMenuIcon);
refreshMenuButton.setStylePrimaryName(style.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 = refreshManager.getCurrentRefreshRate();
refreshOptionsMenu.selectItem(refreshOptionsMenu.getItemByRefreshRate(globalRefreshRate));
menuPopup.showRelativeTo(refreshButton);
}
else {
menuPopup.hide();
}
}
});
}
private RefreshRateOptionsMenu getRefreshOptionsMenu() {
// Create refresh rate options menu bar
RefreshRateOptionsMenu refreshOptionsMenu = new RefreshRateOptionsMenu(true);
refreshOptionsMenu.setStylePrimaryName(style.refreshRateMenu());
// Create menu's title and add it as the first item
MenuItem title = new MenuItem("Refresh Rate", new Command() {
@Override
public void execute() {
}
});
title.setEnabled(false);
title.setStylePrimaryName(style.refreshMenuTitle());
refreshOptionsMenu.addItem(title);
Set<Integer> refreshRates = RefreshManager.getRefreshRates();
int itemIndex = 0;
for (Integer refreshRate : refreshRates) {
// Create command and menu item
RefreshRateOptionCommand command = new RefreshRateOptionCommand();
RefreshRateOptionMenuItem refreshRateOption = new RefreshRateOptionMenuItem(refreshRate, command);
refreshRateOption.setStylePrimaryName(style.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 != refreshRates.size() - 1) {
MenuItemSeparator separator = refreshOptionsMenu.addSeparator();
separator.getElement().getStyle().setBackgroundColor("#E0E9F2");
}
itemIndex++;
}
return refreshOptionsMenu;
}
}