All Downloads are FREE. Search and download functionalities are using the official Maven repository.

rwt.widgets.base.Popup.js Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2004, 2014 1&1 Internet AG, Germany, http://www.1und1.de,
 *                          EclipseSource and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    1&1 Internet AG and others - original API and implementation
 *    EclipseSource - adaptation for the Eclipse Remote Application Platform
 ******************************************************************************/

/**
 * @appearance popup
 */
rwt.qx.Class.define("rwt.widgets.base.Popup",
{
  extend : rwt.widgets.base.Parent,




  /*
  *****************************************************************************
     CONSTRUCTOR
  *****************************************************************************
  */

  construct : function()
  {
    this.base(arguments);

    this.setZIndex(this._minZIndex);

    // Init Focus Handler
    if (this._isFocusRoot) {
      this.activateFocusRoot();
    }

    this.initHeight();
    this.initWidth();
  },




  /*
  *****************************************************************************
     PROPERTIES
  *****************************************************************************
  */

  properties :
  {
    appearance :
    {
      refine : true,
      init : "popup"
    },

    width :
    {
      refine : true,
      init : "auto"
    },

    height :
    {
      refine : true,
      init : "auto"
    },


    /**
     * Make element displayed (if switched to true the widget will be created, if needed, too).
     *  Instead of rwt.widgets.base.Widget, the default is false here.
     */
    display :
    {
      refine : true,
      init : false
    },




    /**
     * Whether to let the system decide when to hide the popup. Setting
     *  this to false gives you better control but it also requires you
     *  to handle the closing of the popup.
     */
    autoHide :
    {
      check : "Boolean",
      init : true
    },


    /** Center the popup on open */
    centered :
    {
      check : "Boolean",
      init : false
    },


    /**
     * Whether the popup should be restricted to the visible area of the page when opened.
     */
    restrictToPageOnOpen :
    {
      check : "Boolean",
      init : true
    },


    /**
     * The minimum offset to the left of the page too keep when
     * {@link #restrictToPageOnOpen} is true (in pixels).
     */
    restrictToPageLeft :
    {
      check : "Integer",
      init : 0
    },


    /**
     * The minimum offset to the right of the page too keep when
     * {@link #restrictToPageOnOpen} is true (in pixels).
     */
    restrictToPageRight :
    {
      check : "Integer",
      init : 0
    },


    /**
     * The minimum offset to the top of the page too keep when
     * {@link #restrictToPageOnOpen} is true (in pixels).
     */
    restrictToPageTop :
    {
      check : "Integer",
      init : 0
    },


    /**
     * The minimum offset to the bottom of the page too keep when
     * {@link #restrictToPageOnOpen} is true (in pixels).
     */
    restrictToPageBottom :
    {
      check : "Integer",
      init : 0
    }

  },




  /*
  *****************************************************************************
     MEMBERS
  *****************************************************************************
  */

  members :
  {
    _isFocusRoot : false,

    _showTimeStamp : (new Date(0)).valueOf(),
    _hideTimeStamp : (new Date(0)).valueOf(),

    getFocusRoot : function() {
      return this.isFocusRoot() ? this : null;
    },

    /*
    ---------------------------------------------------------------------------
      APPEAR/DISAPPEAR
    ---------------------------------------------------------------------------
    */

    /**
     * Callback for "beforeAppear" event.
* Moves the popup out of the visible area to ensure the popup widget is * displayed in the boundaries of the document. This mechnism jumps in when * {@link #restrictToPageOnOpen} is set to true (default).
* Additionally the popup widget is registered at the popup manager and the * method {@link #bringToFront} is called. * * @type member * @return {void} */ _beforeAppear : function() { this.base(arguments); if (this.getRestrictToPageOnOpen()) { this._wantedLeft = this.getLeft(); if (this._wantedLeft != null) { // Move the popup out of the view so its size could be calculated before // it is positioned. this.setLeft(10000); if (this.getElement() != null) { // The popup was already visible once before // -> Move it immediately before it gets visible again this.getElement().style.left = 10000; } } } rwt.widgets.util.PopupManager.getInstance().add(this); rwt.widgets.util.PopupManager.getInstance().update(this); this._showTimeStamp = (new Date()).valueOf(); this.bringToFront(); }, /** * Callback method for the "beforeDisappear" event.
* The popup widget gets deregistered from the popup manager. * * @type member * @return {void} */ _beforeDisappear : function() { this.base(arguments); rwt.widgets.util.PopupManager.getInstance().remove(this); this._hideTimeStamp = (new Date()).valueOf(); }, /** * Callback method for the "afterAppear" event.
* If the property {@link #restrictToPageOnOpen} is set to true * the popup gets repositioned to get displayed within the boundaries of the * client document. * * @type member * @return {void} */ _afterAppear : function() { this.base(arguments); if (this.getRestrictToPageOnOpen()) { var doc = rwt.widgets.base.ClientDocument.getInstance(); var docWidth = doc.getClientWidth(); var docHeight = doc.getClientHeight(); var scrollTop = rwt.html.Viewport.getScrollTop(); var scrollLeft = rwt.html.Viewport.getScrollLeft(); var restrictToPageLeft = this.getRestrictToPageLeft() + scrollLeft; var restrictToPageRight = this.getRestrictToPageRight() - scrollLeft; var restrictToPageTop = this.getRestrictToPageTop() + scrollTop; var restrictToPageBottom = this.getRestrictToPageBottom() - scrollTop; var left = (this._wantedLeft == null) ? this.getLeft() : this._wantedLeft; var top = this.getTop(); var width = this.getBoxWidth(); var height = this.getBoxHeight(); var oldLeft = this.getLeft(); var oldTop = top; // NOTE: We check right and bottom first, because top and left should have // priority, when both sides are violated. if (left + width > docWidth - restrictToPageRight) { left = docWidth - restrictToPageRight - width; } if (top + height > docHeight - restrictToPageBottom) { top = docHeight - restrictToPageBottom - height; } if (left < restrictToPageLeft) { left = restrictToPageLeft; } if (top < restrictToPageTop) { top = restrictToPageTop; } if (left != oldLeft || top != oldTop) { var self = this; window.setTimeout(function() { self.setLeft(left); self.setTop(top); }, 0); } } }, /* --------------------------------------------------------------------------- ACTIVE/INACTIVE --------------------------------------------------------------------------- */ /** * Sets the popup widget as active child * * @type member * @return {void} */ _makeActive : function() { this.getFocusRoot().setActiveChild(this); }, /** * Give back the focus control to the focus root. * * @type member * @return {void} */ _makeInactive : function() { var vRoot = this.getFocusRoot(); var vCurrent = vRoot.getActiveChild(); if (vCurrent == this) { vRoot.setActiveChild(vRoot); } }, /* --------------------------------------------------------------------------- ZIndex Positioning --------------------------------------------------------------------------- */ _minZIndex : 1e6, /** * Sets the {@link #zIndex} to Infinity and calls the * method {@link #_sendTo} * * @type member * @return {void} */ bringToFront : function() { this.setZIndex(this._minZIndex+1000000); this._sendTo(); }, /** * Resets the zIndex of all registered popups and menus * (getting the instances via the {@link rwt.widgets.util.PopupManager} and * the {@link qx.ui.menu.Manager}) one higher than the defined minimum zIndex. * * @type member * @return {void} */ _sendTo : function() { var vPopups = rwt.util.Objects.getValues(rwt.widgets.util.PopupManager.getInstance().getAll()); var zIndexCompare = function(a, b) { return a.getZIndex() - b.getZIndex(); }; var manager = rwt.event.EventHandler.getMenuManager(); var vMenus = rwt.util.Objects.getValues(manager.getAll()); var vAll = vPopups.concat(vMenus).sort(zIndexCompare); var vLength = vAll.length; var vIndex = this._minZIndex; for (var i=0; i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy