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-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.ui.tabs; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Frame; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox; import org.pentaho.gwt.widgets.client.utils.FrameUtils; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.solutionbrowser.MantlePopupPanel; import org.pentaho.mantle.client.solutionbrowser.tabs.IFrameTabPanel; 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.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.http.client.UrlBuilder; import com.google.gwt.user.client.Command; 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.Window; 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.PopupPanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class MantleTab extends org.pentaho.gwt.widgets.client.tabs.PentahoTab { private PopupPanel popupMenu = new MantlePopupPanel(true); private boolean solutionBrowserShowing; private static enum TABCOMMANDTYPE { BACK, RELOAD, RELOAD_ALL, CLOSE, CLOSE_ALL, CLOSE_OTHERS, NEW_WINDOW, CREATE_DEEP_LINK } private class TabCommand implements Command { TABCOMMANDTYPE mode = TABCOMMANDTYPE.RELOAD; PopupPanel popupMenu; public TabCommand(TABCOMMANDTYPE inMode, PopupPanel popupMenu) { this.mode = inMode; this.popupMenu = popupMenu; } public void execute() { popupMenu.hide(); if (mode == TABCOMMANDTYPE.RELOAD) { reloadTab(); } else if (mode == TABCOMMANDTYPE.RELOAD_ALL) { reloadAllTabs(); } else if (mode == TABCOMMANDTYPE.CLOSE) { closeTab(); } else if (mode == TABCOMMANDTYPE.CLOSE_OTHERS) { getTabPanel().closeOtherTabs(MantleTab.this); } else if (mode == TABCOMMANDTYPE.CLOSE_ALL) { getTabPanel().closeAllTabs(); } else if (mode == TABCOMMANDTYPE.NEW_WINDOW) { openTabInNewWindow(); } else if (mode == TABCOMMANDTYPE.CREATE_DEEP_LINK) { createDeepLink(); } else if (mode == TABCOMMANDTYPE.BACK) { back(); } } } public void createDeepLink() { if (getContent() instanceof IFrameTabPanel) { PromptDialogBox dialogBox = new PromptDialogBox(Messages.getString("deepLink"), //$NON-NLS-1$ Messages.getString("ok"), Messages.getString("cancel"), false, //$NON-NLS-1$ //$NON-NLS-2$ true); String startup = ((IFrameTabPanel) getContent()).getUrl(); if (!StringUtils.isEmpty(((IFrameTabPanel) getContent()).getDeepLinkUrl())) { startup = ((IFrameTabPanel) getContent()).getDeepLinkUrl(); } UrlBuilder builder = new UrlBuilder(); builder.setProtocol(Window.Location.getProtocol()); builder.setHost(Window.Location.getHostName()); try { builder.setPort(Integer.parseInt(Window.Location.getPort())); } catch (NumberFormatException e) { builder.setPort(UrlBuilder.PORT_UNSPECIFIED); } builder.setPath(Window.Location.getPath()); //UrlBuilder will encode spaces as '+' which is a valid special character so we replace all spaces with '%20' builder.setParameter("name", getLabelText().replaceAll("\\s", "%20")); //the startup string is already encoded with ':' being replaced with '\t' and then encoded again... builder.setParameter("startup-url", startup); final TextArea urlbox = new TextArea(); //encode any space characters urlbox.setText(builder.buildString()); urlbox.setReadOnly(true); urlbox.setVisibleLines(3); dialogBox.setContent(urlbox); urlbox.setHeight("80px"); urlbox.setWidth("600px"); urlbox.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { urlbox.selectAll(); } }); dialogBox.center(); urlbox.selectAll(); } } public void openTabInNewWindow() { if (getContent() instanceof IFrameTabPanel) { VerticalPanel vp = new VerticalPanel(); vp.add(new Label(Messages.getString("openWindowQuestion"))); //$NON-NLS-1$ final PromptDialogBox openNewWindowConfirmDialog = new PromptDialogBox( Messages.getString("openWindowConfirm"), Messages.getString("yes"), Messages.getString("no"), //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ false, true, vp); final IDialogCallback callback = new IDialogCallback() { public void cancelPressed() { openNewWindowConfirmDialog.hide(); } public void okPressed() { ((IFrameTabPanel) getContent()).openTabInNewWindow(); openNewWindowConfirmDialog.hide(); } }; openNewWindowConfirmDialog.setCallback(callback); openNewWindowConfirmDialog.center(); } } public void back() { ((IFrameTabPanel) getContent()).back(); } public void reloadTab() { if (getContent() instanceof IFrameTabPanel) { VerticalPanel vp = new VerticalPanel(); vp.add(new Label(Messages.getString("reloadQuestion"))); //$NON-NLS-1$ final PromptDialogBox reloadConfirmDialog = new PromptDialogBox(Messages.getString("reloadConfirm"), //$NON-NLS-1$ Messages.getString("yes"), Messages.getString("no"), false, true, vp); //$NON-NLS-1$ //$NON-NLS-2$ final IDialogCallback callback = new IDialogCallback() { public void cancelPressed() { reloadConfirmDialog.hide(); } public void okPressed() { ((IFrameTabPanel) getContent()).reload(); reloadConfirmDialog.hide(); } }; reloadConfirmDialog.setCallback(callback); reloadConfirmDialog.center(); } } public void reloadAllTabs() { for (int i = 0; i < getTabPanel().getTabCount(); i++) { if (getTabPanel().getTab(i).getContent() instanceof IFrameTabPanel) { ((IFrameTabPanel) getTabPanel().getTab(i).getContent()).reload(); } } } public MantleTab(String text, String tooltip, MantleTabPanel tabPanel, Widget content, boolean closeable) { super(text, tooltip, tabPanel, content, closeable); popupMenu.addCloseHandler(new CloseHandler<PopupPanel>() { public void onClose(CloseEvent<PopupPanel> event) { FrameUtils.setEmbedVisibility( ((IFrameTabPanel) getTabPanel().getSelectedTab().getContent()).getFrame(), true); new Timer() { public void run() { getContent().getElement().getStyle().setHeight(100, Unit.PCT); } }.schedule(250); } }); } public void onDoubleClick(Event event) { openTabInNewWindow(); } /** * Correct 'left' if necessary to avoid menu be very narrow if it is too close to right edge */ private int adjustLeftIfNecessary(int left) { int WIDHT = 225; //supposed width of popup menu if (left + WIDHT > Window.getClientWidth()) { return Window.getClientWidth() - WIDHT; } return left; } public void onRightClick(Event event) { FrameUtils.setEmbedVisibility(((IFrameTabPanel) getTabPanel().getSelectedTab().getContent()).getFrame(), false); int left = Window.getScrollLeft() + DOM.eventGetClientX(event); int top = Window.getScrollTop() + DOM.eventGetClientY(event); popupMenu.setPopupPosition(adjustLeftIfNecessary(left), top); MenuBar menuBar = new MenuBar(true); menuBar.setAutoOpen(true); if (getContent() instanceof IFrameTabPanel) { MenuItem backMenuItem = new MenuItem(Messages.getString("back"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.BACK, popupMenu)); menuBar.addItem(backMenuItem); backMenuItem.getElement().setId("back"); //$NON-NLS-1$ menuBar.addSeparator(); MenuItem reloadTabMenuItem = new MenuItem(Messages.getString("reloadTab"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.RELOAD, popupMenu)); menuBar.addItem(reloadTabMenuItem); reloadTabMenuItem.getElement().setId("reloadTab"); //$NON-NLS-1$ } if (getTabPanel().getTabCount() > 1) { MenuItem reloadAllTabsMenuItem = new MenuItem(Messages.getString("reloadAllTabs"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.RELOAD_ALL, popupMenu)); menuBar.addItem(reloadAllTabsMenuItem); reloadAllTabsMenuItem.getElement().setId("reloadAllTabs"); //$NON-NLS-1$ } else { MenuItem reloadAllTabsMenuItem = new MenuItem(Messages.getString("reloadAllTabs"), (Command) null); //$NON-NLS-1$ menuBar.addItem(reloadAllTabsMenuItem); reloadAllTabsMenuItem.getElement().setId("reloadAllTabs"); //$NON-NLS-1$ reloadAllTabsMenuItem.setStyleName("disabledMenuItem"); //$NON-NLS-1$ } menuBar.addSeparator(); if (getContent() instanceof IFrameTabPanel) { MenuItem openTabInNewWindowMenuItem = new MenuItem(Messages.getString("openTabInNewWindow"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.NEW_WINDOW, popupMenu)); menuBar.addItem(openTabInNewWindowMenuItem); openTabInNewWindowMenuItem.getElement().setId("openTabInNewWindow"); //$NON-NLS-1$ MenuItem createDeepLinkMenuItem = new MenuItem(Messages.getString("createDeepLink"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.CREATE_DEEP_LINK, popupMenu)); menuBar.addItem(createDeepLinkMenuItem); createDeepLinkMenuItem.getElement().setId("deepLink"); //$NON-NLS-1$ menuBar.addSeparator(); } menuBar.addItem( new MenuItem(Messages.getString("closeTab"), new TabCommand(TABCOMMANDTYPE.CLOSE, popupMenu))); //$NON-NLS-1$ if (getTabPanel().getTabCount() > 1) { MenuItem closeOtherTabsMenuItem = new MenuItem(Messages.getString("closeOtherTabs"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.CLOSE_OTHERS, popupMenu)); menuBar.addItem(closeOtherTabsMenuItem); closeOtherTabsMenuItem.getElement().setId("closeOtherTabs"); //$NON-NLS-1$ MenuItem closeAllTabsMenuItem = new MenuItem(Messages.getString("closeAllTabs"), //$NON-NLS-1$ new TabCommand(TABCOMMANDTYPE.CLOSE_ALL, popupMenu)); menuBar.addItem(closeAllTabsMenuItem); closeAllTabsMenuItem.getElement().setId("closeAllTabs"); //$NON-NLS-1$ } else { MenuItem closeOtherTabsMenuItem = new MenuItem(Messages.getString("closeOtherTabs"), (Command) null); //$NON-NLS-1$ closeOtherTabsMenuItem.setStyleName("disabledMenuItem"); //$NON-NLS-1$ MenuItem closeAllTabsMenuItem = new MenuItem(Messages.getString("closeAllTabs"), (Command) null); //$NON-NLS-1$ closeAllTabsMenuItem.setStyleName("disabledMenuItem"); //$NON-NLS-1$ menuBar.addItem(closeOtherTabsMenuItem); menuBar.addItem(closeAllTabsMenuItem); closeOtherTabsMenuItem.getElement().setId("closeOtherTabs"); //$NON-NLS-1$ closeAllTabsMenuItem.getElement().setId("closeAllTabs"); //$NON-NLS-1$ } popupMenu.setWidget(menuBar); if (isIEBrowser()) { Frame iFrame = new Frame("about:blank"); Style iFrameStyle = iFrame.getElement().getStyle(); iFrameStyle.setWidth(100, Style.Unit.PCT); iFrameStyle.setHeight(100, Style.Unit.PCT); iFrameStyle.setBorderStyle(Style.BorderStyle.NONE); iFrameStyle.setTop(0, Unit.PX); iFrameStyle.setPosition(Style.Position.ABSOLUTE); iFrameStyle.setZIndex(-1); Element element = popupMenu.getElement(); Node firstChild = element.getFirstChild(); if (firstChild != null) { firstChild.appendChild(iFrame.getElement()); } } popupMenu.hide(); popupMenu.show(); } @Override public void setLabelText(String text) { super.setLabelText(text); if (getContent() instanceof IFrameTabPanel) { // this causes saved frames of the same type to all enjoy the same ID, which is // severely problematic for getting the callback hook - it will give you the wrong one // ((IFrameTabPanel) getContent()).setId(text); ((IFrameTabPanel) getContent()).setId(text + System.currentTimeMillis()); } } public boolean isSolutionBrowserShowing() { return solutionBrowserShowing; } public void setSolutionBrowserShowing(boolean solutionBrowserShowing) { this.solutionBrowserShowing = solutionBrowserShowing; } private native boolean isIEBrowser() /*-{ return !!document.documentMode; }-*/; }