org.pentaho.mantle.client.ui.tabs.MantleTab.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.ui.tabs.MantleTab.java

Source

/*!
 * 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;
    }-*/;
}