Java tutorial
/* * Copyright 2007-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * only, as published by the Free Software Foundation. * * This code 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 * General Public License version 2 for more details (a copy is * included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 16 Network Circle, Menlo * Park, CA 94025 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.labs.aura.music.wsitm.client.ui.widget; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.MouseListener; import com.google.gwt.user.client.ui.MouseListenerCollection; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.SourcesMouseEvents; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sun.labs.aura.music.wsitm.client.event.HoverListener; import com.sun.labs.aura.music.wsitm.client.ui.SpannedFlowPanel; import java.util.HashSet; /** * * @author mailletf */ //public class RightMenuWidget <T extends Widget> extends AnimatedComposite public class RightMenuWidget<T extends Widget> extends Composite implements SourcesMouseEvents { private Panel mainPanel; // panel containing the main widget and right menu private Panel rightMenu; protected T w; // main widget protected boolean isHovering = false; private double lastRightMenuHeight = -1; private HashSet<Widget> rightMenuWidgets; private MouseListenerCollection mouseListeners; private HoverListenerManager hoverListenerManager; public RightMenuWidget(T w) { init(w, new SpannedFlowPanel()); } public RightMenuWidget(T w, Panel mainPanel) { init(w, mainPanel); } private void init(T w, Panel mainPanel) { this.w = w; this.mainPanel = mainPanel; this.rightMenu = new SpannedFlowPanel(); //this.rightMenu = new SpannedVerticalPanel(); mainPanel.add(w); mainPanel.add(rightMenu); initWidget(mainPanel); rightMenuWidgets = new HashSet<Widget>(); hoverListenerManager = new HoverListenerManager(); addMouseListener(new MouseListener() { public void onMouseEnter(Widget arg0) { isHovering = true; hoverListenerManager.triggerOnMouseHover(); } public void onMouseLeave(Widget arg0) { isHovering = false; hoverListenerManager.triggerOnMouseOut(); Timer t = new Timer() { public void run() { if (!isHovering) { hoverListenerManager.triggerOnOutTimer(); } } }; t.schedule(250); } public void onMouseDown(Widget arg0, int arg1, int arg2) { } public void onMouseMove(Widget arg0, int arg1, int arg2) { } public void onMouseUp(Widget arg0, int arg1, int arg2) { } }); } /** * Set the right menu's bottom spacing * @param px */ public void setRightMenuHeight(double px) { lastRightMenuHeight = px; for (Widget tw : rightMenuWidgets) { if (tw instanceof com.sun.labs.aura.music.wsitm.client.ui.widget.SwapableWidget) { ((SwapableWidget) tw).getWidget1().getElement().getStyle().setPropertyPx("marginBottom", (int) px); ((SwapableWidget) tw).getWidget2().getElement().getStyle().setPropertyPx("marginBottom", (int) px); } else { tw.getElement().getStyle().setPropertyPx("marginBottom", (int) px); } } } /** * Returns the contained widget * @return */ @Override public T getWidget() { return w; } public void addWidgetToRightMenu(Widget wToAdd) { addWidgetToRightMenu(wToAdd, null); } public void addWidgetToRightMenu(Widget wToAdd, HoverListener hL) { rightMenu.add(wToAdd); rightMenuWidgets.add(wToAdd); if (hL != null) { hoverListenerManager.addHoverListener(hL); } // Set height of newly added widget if (lastRightMenuHeight != -1) { setRightMenuHeight(lastRightMenuHeight); } } public void addMouseListener(MouseListener listener) { if (mouseListeners == null) { mouseListeners = new MouseListenerCollection(); sinkEvents(Event.MOUSEEVENTS); } mouseListeners.add(listener); } public void removeMouseListener(MouseListener listener) { if (mouseListeners != null) { mouseListeners.remove(listener); } } @Override public void onBrowserEvent(Event event) { switch (DOM.eventGetType(event)) { case Event.ONMOUSEDOWN: case Event.ONMOUSEUP: case Event.ONMOUSEMOVE: case Event.ONMOUSEOVER: case Event.ONMOUSEOUT: if (mouseListeners != null) { mouseListeners.fireMouseEvent(this, event); } break; } } private class HoverListenerManager { private HashSet<HoverListener> hoverListeners; public void addHoverListener(HoverListener hL) { if (hoverListeners == null) { hoverListeners = new HashSet<HoverListener>(); } hoverListeners.add(hL); } public void removeHoverListener(HoverListener hL) { if (hoverListeners != null) { hoverListeners.remove(hL); } } public void triggerOnMouseHover() { if (hoverListeners != null) { for (HoverListener hL : hoverListeners) { hL.onMouseHover(); } } } public void triggerOnMouseOut() { if (hoverListeners != null) { for (HoverListener hL : hoverListeners) { hL.onMouseOut(); } } } public void triggerOnOutTimer() { if (hoverListeners != null) { for (HoverListener hL : hoverListeners) { hL.onOutTimer(); } } } } public class SpannedVerticalPanel extends VerticalPanel { public SpannedVerticalPanel() { setElement(DOM.createSpan()); } } }