/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.bootstrap.client.actions.ui; import cc.kune.common.client.actions.PropertyChangeEvent; import cc.kune.common.client.actions.PropertyChangeListener; import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip; import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; import cc.kune.common.client.actions.ui.descrip.Position; import cc.kune.common.client.tooltip.Tooltip; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.PopupPanel.PositionCallback; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.UIObject; public class PopupBSMenuGui { private final GuiActionDescrip descriptor; private PopupPanel popup; protected IsWidget popupContent; private final IsWidget relativeTo; public PopupBSMenuGui(final IsWidget content, final IsWidget relativeTo, final GuiActionDescrip descriptor) { this.popupContent = content; this.relativeTo = relativeTo; this.descriptor = descriptor; descriptor.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent event) { if (event.getPropertyName().equals(MenuDescriptor.MENU_HIDE)) { if (popup != null && popup.isShowing()) { popup.hide(); } } else if (event.getPropertyName().equals(MenuDescriptor.MENU_SHOW)) { show(); } } }); } /** * Creates the popup that includes the menu. * * @return the popup panel */ private PopupPanel createPopup() { popup = new PopupPanel(true); popup.setStyleName("oc-menu"); popup.add(popupContent); SmartMenuUtils.init(popup.getElement()); popup.addCloseHandler(new CloseHandler<PopupPanel>() { @Override public void onClose(final CloseEvent<PopupPanel> event) { descriptor.putValue(MenuDescriptor.MENU_ONHIDE, popup); } }); return popup; } private void createPopupIfNecessary() { if (popup == null) { createPopup(); } } public void hide() { createPopupIfNecessary(); popup.hide(); } public boolean isShowing() { return isShowing(); } public void show() { createPopupIfNecessary(); final Object pos = descriptor.getValue(MenuDescriptor.MENU_SHOW_NEAR_TO); if (pos != null) { showRelativeTo(pos); } else { showRelativeTo(relativeTo); } } public void showRelativeTo(final Object relative) { createPopupIfNecessary(); if (relative instanceof String) { popup.showRelativeTo(RootPanel.get((String) relative)); } else if (relative instanceof UIObject) { final Boolean atRight = ((Boolean) descriptor.getValue(MenuDescriptor.MENU_ATRIGHT)); if (atRight) { popup.setPopupPositionAndShow(new PositionCallback() { @Override public void setPosition(final int offsetWidth, final int offsetHeight) { final UIObject obj = (UIObject) relative; popup.setPopupPosition(obj.getAbsoluteLeft() + obj.getOffsetWidth(), obj.getAbsoluteTop() + 30); } }); } else { popup.showRelativeTo((UIObject) relative); } } else if (relative instanceof Position) { popup.setPopupPositionAndShow(new PositionCallback() { @Override public void setPosition(final int offsetWidth, final int offsetHeight) { final Position position = (Position) relative; popup.setPopupPosition(position.getX(), position.getY()); } }); } descriptor.putValue(MenuDescriptor.MENU_ONSHOW, popup); Tooltip.getTip().hide(); } }