/*******************************************************************************
* Copyright (c) 2014 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
******************************************************************************/
package com.eclipsesource.tabris.internal;
import static com.eclipsesource.tabris.internal.Constants.GRID_ITEM_HEIGHT_SETTER;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_ITEM_HEIGHT;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_TARGET;
import static com.eclipsesource.tabris.internal.Constants.SET_ITEM_HEIGHT;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.ClientService;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil;
import org.eclipse.rap.rwt.internal.remote.ConnectionImpl;
import org.eclipse.rap.rwt.remote.AbstractOperationHandler;
import org.eclipse.rap.rwt.remote.RemoteObject;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Widget;
@SuppressWarnings("restriction")
public class TableItemHeightService extends AbstractOperationHandler implements ClientService {
private final RemoteObject remoteObject;
public TableItemHeightService() {
remoteObject = ( ( ConnectionImpl )RWT.getUISession().getConnection() ).createServiceObject( GRID_ITEM_HEIGHT_SETTER );
remoteObject.setHandler( this );
}
@Override
public void handleCall( String method, JsonObject parameters ) {
if( ( SET_ITEM_HEIGHT ).equals( method ) ) {
setCustomItemHeight( parameters );
}
}
private void setCustomItemHeight( JsonObject parameters ) {
String widgetID = parameters.get( PROPERTY_TARGET ).asString();
int itemHeight = parameters.get( PROPERTY_ITEM_HEIGHT ).asInt();
Widget widget = findWidget( widgetID );
setRowHeight( itemHeight, widget );
}
private void setRowHeight( int itemHeight, Widget widget ) {
if( wigetExists( widget ) && ( widget instanceof Table || widget instanceof Tree ) ) {
widget.setData( RWT.CUSTOM_ITEM_HEIGHT, new Integer( itemHeight ) );
}
}
private boolean wigetExists( Widget widget ) {
return widget != null && !widget.isDisposed();
}
Widget findWidget( String widgetID ) {
Display display = Display.getCurrent();
Shell[] shells = display.getShells();
for( Shell shell : shells ) {
Widget widget = findWidget( widgetID, shell );
if( widget != null ) {
return widget;
}
}
return null;
}
private Widget findWidget( String widgetID, Shell shell ) {
return WidgetUtil.find( shell, widgetID );
}
}