Java tutorial
/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.ui; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MenuBar; 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 org.pentaho.gwt.widgets.client.dialogs.GlassPane; import org.pentaho.gwt.widgets.client.utils.ElementUtils; import org.pentaho.gwt.widgets.client.utils.FrameUtils; public class CustomDropDown extends HorizontalPanel implements HasText { private static final String STYLE = "custom-dropdown"; private final PopupPanel popup = new PopupPanel(true, true) { private FocusPanel pageBackground = null; public void show() { // show glass pane super.show(); if (pageBackground == null) { pageBackground = new FocusPanel() { public void onBrowserEvent(Event event) { int type = event.getTypeInt(); switch (type) { case Event.ONKEYDOWN: { if ((char) event.getKeyCode() == KeyCodes.KEY_ESCAPE) { event.stopPropagation(); popup.hide(); } return; } } super.onBrowserEvent(event); }; }; pageBackground.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { popup.hide(); pageBackground.setVisible(false); pageBackground.getElement().getStyle().setDisplay(Display.NONE); } }); RootPanel.get().add(pageBackground, 0, 0); } super.center(); pageBackground.setSize("100%", Window.getClientHeight() + Window.getScrollTop() + "px"); //$NON-NLS-1$ //$NON-NLS-2$ pageBackground.setVisible(true); pageBackground.getElement().getStyle().setDisplay(Display.BLOCK); // hide <embeds> // TODO: migrate to GlassPane Listener FrameUtils.toggleEmbedVisibility(false); // Notify listeners that we're showing a dialog (hide PDFs, flash). GlassPane.getInstance().show(); } public void hide(boolean autoClosed) { super.hide(autoClosed); pageBackground.setVisible(false); GlassPane.getInstance().hide(); } protected void onPreviewNativeEvent(final NativePreviewEvent event) { // Switch on the event type int type = event.getTypeInt(); switch (type) { case Event.ONKEYDOWN: { Event nativeEvent = Event.as(event.getNativeEvent()); if ((char) nativeEvent.getKeyCode() == KeyCodes.KEY_ESCAPE) { event.cancel(); hide(); } return; } } }; }; private MenuBar menuBar; private Command command; private boolean enabled = true; private boolean pressed = false; private Label label = new Label("", false); public enum MODE { MAJOR, MINOR } public CustomDropDown(String labelText, MenuBar menuBar, MODE mode) { this.menuBar = menuBar; sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.KEYEVENTS); setText(labelText); label.setStyleName("custom-dropdown-label"); // label.addMouseListener(this); add(label); Label dropDownArrow = new Label(); add(dropDownArrow); setCellWidth(dropDownArrow, "100%"); dropDownArrow.getElement().getParentElement().addClassName("custom-dropdown-arrow"); // prevent double-click from selecting text ElementUtils.preventTextSelection(getElement()); ElementUtils.preventTextSelection(label.getElement()); popup.setStyleName("custom-dropdown-popup"); if (MODE.MAJOR.equals(mode)) { popup.getElement().setId("customDropdownPopupMajor"); popup.setStyleDependentName("major", true); dropDownArrow.getElement().getParentElement().addClassName("custom-dropdown-arrow-major"); } else { popup.getElement().setId("customDropdownPopupMinor"); dropDownArrow.getElement().getParentElement().addClassName("custom-dropdown-arrow-minor"); } popup.addCloseHandler(new CloseHandler<PopupPanel>() { public void onClose(CloseEvent<PopupPanel> event) { pressed = false; if (enabled) { removeStyleDependentName("pressed"); removeStyleDependentName("hover"); } } }); setStyleName(STYLE); } public void onBrowserEvent(Event event) { super.onBrowserEvent(event); if ((event.getTypeInt() & Event.ONCLICK) == Event.ONCLICK) { if (enabled && !pressed) { pressed = true; addStyleDependentName("pressed"); removeStyleDependentName("hover"); popup.setWidget(menuBar); popup.setPopupPositionAndShow(new PositionCallback() { public void setPosition(int offsetWidth, int offsetHeight) { popup.setPopupPosition(getAbsoluteLeft(), getAbsoluteTop() + getOffsetHeight() - 1); } }); popup.setWidth((getOffsetWidth() - 2) + "px"); } } else if ((event.getTypeInt() & Event.ONMOUSEOVER) == Event.ONMOUSEOVER) { if (enabled) { addStyleDependentName("hover"); } } else if ((event.getTypeInt() & Event.ONMOUSEOUT) == Event.ONMOUSEOUT) { if (enabled && !pressed) { removeStyleDependentName("pressed"); removeStyleDependentName("hover"); } } else if ((event.getTypeInt() & Event.ONMOUSEUP) == Event.ONMOUSEUP) { if (enabled) { removeStyleDependentName("pressed"); if (command != null) { try { command.execute(); } catch (Exception e) { // don't fail because some idiot you are calling fails } } } } } public String getText() { return label.getText(); } public void setText(String text) { label.setText(text); } protected MenuBar getMenuBar() { return menuBar; } protected void setMenuBar(MenuBar menuBar) { this.menuBar = menuBar; } public void hidePopup() { popup.hide(); } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; if (enabled) { removeStyleDependentName("disabled"); } else { addStyleDependentName("disabled"); } } }