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

rwt.widgets.util.GridSynchronizer.js Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2014, 2020 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:
 *    EclipseSource - initial API and implementation
 ******************************************************************************/

namespace( "rwt.widgets.util" );

rwt.widgets.util.GridSynchronizer = function( grid ) {
  this._grid = grid;
  this._grid.addEventListener( "selectionChanged", this._onSelectionChanged, this );
  this._grid.addEventListener( "focusItemChanged", this._onFocusItemChanged, this );
  this._grid.addEventListener( "focusCellChanged", this._onFocusCellChanged, this );
  this._grid.addEventListener( "topItemChanged", this._onTopItemChanged, this );
  this._grid.addEventListener( "scrollLeftChanged", this._onScrollLeftChanged, this );
  this._grid.getRootItem().addEventListener( "update", this._onItemUpdate, this );
};

rwt.widgets.util.GridSynchronizer.prototype = {

  _onSelectionChanged : function( event ) {
    if( !rwt.remote.EventUtil.getSuspended() ) {
      var item = event.item;
      var type = event.type;
      var connection = rwt.remote.Connection.getInstance();
      if( type === "selection" ) {
        connection.getRemoteObject( this._grid ).set( "selection", this._getSelectionList() );
        if( this._grid.getRenderConfig().cellSelection ) {
          connection.getRemoteObject( this._grid ).set( "cellSelection", this._getCellSelectionList() );
        }
      } else if( type === "check" ) {
        connection.getRemoteObject( item ).set( "checked", item.isChecked() );
      } else if( type === "cellCheck" ) {
        connection.getRemoteObject( item ).set( "cellChecked", this._getCellChecked( item ) );
      }
      this._notifySelectionChanged( event );
    }
  },

  _notifySelectionChanged : function( event ) {
    var detail;
    var type = event.type;
    if( type === "check" || type === "cellCheck") {
      detail = "check";
    } else if( type === "cell" ) {
      detail = "cell";
    } else if( type === "hyperlink" ) {
      detail = "hyperlink";
    }
    var properties = {
      "item" : this._getItemId( event.item ),
      "detail" : detail,
      "index" : event.index,
      "text" : event.text
    };
    if( type === "defaultSelection" ) {
      rwt.remote.EventUtil.notifyDefaultSelected( this._grid, properties );
    } else {
      rwt.remote.EventUtil.notifySelected( this._grid, properties );
    }
  },

  _onFocusItemChanged : function() {
    if( !rwt.remote.EventUtil.getSuspended() ) {
      var connection = rwt.remote.Connection.getInstance();
      var itemId = this._getItemId( this._grid.getFocusItem() );
      connection.getRemoteObject( this._grid ).set( "focusItem", itemId );
    }
  },

  _onFocusCellChanged : function() {
    if( !rwt.remote.EventUtil.getSuspended() ) {
      var connection = rwt.remote.Connection.getInstance();
      var focusCell = this._grid.getRenderConfig().cellOrder[ this._grid.getFocusCell() ];
      connection.getRemoteObject( this._grid ).set( "focusCell", focusCell );
    }
  },

  _onTopItemChanged : function() {
    if( !rwt.remote.EventUtil.getSuspended() ) {
      var vScroll = this._grid.getVerticalBar();
      var connection = rwt.remote.Connection.getInstance();
      var remoteObject = connection.getRemoteObject( this._grid );
      remoteObject.set( "topItemIndex", this._grid.getTopItemIndex() );
      if( vScroll.getHasSelectionListener() ) {
        connection.onNextSend( function() {
          connection.getRemoteObject( vScroll ).notify( "Selection" );
        }, this );
      }
      if( remoteObject.isListening( "SetData" ) ) {
        connection.onNextSend( function() {
          remoteObject.notify( "SetData" );
        }, this );
      }
      if( vScroll.getHasSelectionListener() || remoteObject.isListening( "SetData" ) ) {
        connection.sendDelayed( 400 );
      }
    }
  },

  _onScrollLeftChanged : function() {
    // TODO [tb] : There should be a check for suspended,
    // but currently this is needed to sync the value with the
    // server when the scrollbars are hidden by the server.
    var hScroll = this._grid.getHorizontalBar();
    var connection = rwt.remote.Connection.getInstance();
    var remoteObject = connection.getRemoteObject( this._grid );
    remoteObject.set( "scrollLeft", hScroll.getValue() );
    if( hScroll.getHasSelectionListener() ) {
      connection.onNextSend( function() {
        connection.getRemoteObject( hScroll ).notify( "Selection" );
      }, this );
      connection.sendDelayed( 400 );
    }
  },

  _onItemUpdate : function( event ) {
    if( !rwt.remote.EventUtil.getSuspended() || event.rendering ) {
      var connection = rwt.remote.Connection.getInstance();
      if( event.msg === "height" ) {
        connection.getRemoteObject( event.target ).set( "height", event.target.getOwnHeight() );
      } else if( event.msg === "expanded" || event.msg === "collapsed" ) {
        var expanded = event.msg === "expanded";
        connection.getRemoteObject( event.target ).set( "expanded", expanded );
        connection.getRemoteObject( this._grid ).notify( expanded ? "Expand" : "Collapse", {
          "item" : this._getItemId( event.target )
        } );
      }
    }
  },

  _getSelectionList : function() {
    var result = [];
    var selection = this._grid.getSelection();
    for( var i = 0; i < selection.length; i++ ) {
      result.push( this._getItemId( selection[ i ] ) );
    }
    return result;
  },

  _getCellSelectionList : function() {
    var result = [];
    var selection = this._grid.getSelection();
    for( var i = 0; i < selection.length; i++ ) {
      var itemId = this._getItemId( selection[ i ] );
      var cellSelection = selection[ i ].getCellSelection();
      for( var j = 0; j < cellSelection.length; j++ ) {
        result.push( [ itemId, cellSelection[ j ] ] );
      }
    }
    return result;
  },

  _getCellChecked : function( item ) {
    var cellChecked = item.getCellChecked();
    var result = [];
    for( var i = 0; i < this._grid.getRenderConfig().columnCount; i++ ) {
      result[ i ] = cellChecked[ i ] === true;
    }
    return result;
  },

  _getItemId : function( item ) {
    var ObjectRegistry = rwt.remote.ObjectRegistry;
    var result;
    if( item.isCached() ) {
      result = ObjectRegistry.getId( item );
    } else {
      var parent = item.getParent();
      if( parent.isRootItem() ) {
        result = ObjectRegistry.getId( this._grid );
      } else {
        result = ObjectRegistry.getId( parent );
      }
      result += "#" + parent.indexOf( item );
    }
    return result;
  }

};




© 2015 - 2025 Weber Informatics LLC | Privacy Policy