/*******************************************************************************
* Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.swt.internal.widgets.tableitemkit;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.preserveProperty;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderProperty;
import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.createRemoteObject;
import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.getRemoteObject;
import java.io.IOException;
import org.eclipse.rap.rwt.internal.lifecycle.RemoteAdapter;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil;
import org.eclipse.rap.rwt.remote.RemoteObject;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.internal.widgets.ITableAdapter;
import org.eclipse.swt.internal.widgets.ITableItemAdapter;
import org.eclipse.swt.internal.widgets.IWidgetColorAdapter;
import org.eclipse.swt.internal.widgets.IWidgetFontAdapter;
import org.eclipse.swt.internal.widgets.WidgetRemoteAdapter;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
public final class TableItemLCA extends WidgetLCA<TableItem> {
public static final TableItemLCA INSTANCE = new TableItemLCA();
private static interface IRenderRunnable {
void run() throws IOException;
}
private static final String TYPE = "rwt.widgets.GridItem";
static final String PROP_INDEX = "index";
static final String PROP_TEXTS = "texts";
static final String PROP_IMAGES = "images";
static final String PROP_CELL_BACKGROUNDS = "cellBackgrounds";
static final String PROP_CELL_FOREGROUNDS = "cellForegrounds";
static final String PROP_CELL_FONTS = "cellFonts";
static final String PROP_CHECKED = "checked";
static final String PROP_GRAYED = "grayed";
static final String PROP_CACHED = "cached";
@Override
public void preserveValues( TableItem item ) {
preserveProperty( item, PROP_INDEX, getIndex( item ) );
preserveProperty( item, PROP_CACHED, isCached( item ) );
if( isCached( item ) ) {
preserveProperty( item, PROP_TEXTS, getTexts( item ) );
preserveProperty( item, PROP_IMAGES, getImages( item ) );
WidgetLCAUtil.preserveBackground( item, getUserBackground( item ) );
WidgetLCAUtil.preserveForeground( item, getUserForeground( item ) );
WidgetLCAUtil.preserveFont( item, getUserFont( item ) );
preserveProperty( item, PROP_CELL_BACKGROUNDS, getCellBackgrounds( item ) );
preserveProperty( item, PROP_CELL_FOREGROUNDS, getCellForegrounds( item ) );
preserveProperty( item, PROP_CELL_FONTS, getCellFonts( item ) );
preserveProperty( item, PROP_CHECKED, item.getChecked() );
preserveProperty( item, PROP_GRAYED, item.getGrayed() );
}
}
@Override
public void renderInitialization( TableItem item ) throws IOException {
Table parent = item.getParent();
RemoteObject remoteObject = createRemoteObject( item, TYPE );
remoteObject.setHandler( new TableItemOperationHandler( item ) );
remoteObject.set( "parent", WidgetUtil.getId( parent ) );
}
@Override
public void renderChanges( final TableItem item ) throws IOException {
renderProperty( item, PROP_INDEX, getIndex( item ), -1 );
if( wasCleared( item ) ) {
renderClear( item );
} else {
if( isCached( item ) ) {
preservingInitialized( item, new IRenderRunnable() {
@Override
public void run() throws IOException {
// items that were uncached and are now cached (materialized) are
// handled as if they were just created (initialized = false)
if( !wasCached( item ) ) {
setInitialized( item, false );
}
renderProperties( item );
}
} );
}
}
}
private static void renderProperties( TableItem item ) {
renderProperty( item, PROP_TEXTS, getTexts( item ), null );
renderProperty( item, PROP_IMAGES, getImages( item ), null );
WidgetLCAUtil.renderBackground( item, getUserBackground( item ) );
WidgetLCAUtil.renderForeground( item, getUserForeground( item ) );
WidgetLCAUtil.renderFont( item, getUserFont( item ) );
WidgetLCAUtil.renderCustomVariant( item );
WidgetLCAUtil.renderData( item );
renderProperty( item, PROP_CELL_BACKGROUNDS, getCellBackgrounds( item ), null );
renderProperty( item, PROP_CELL_FOREGROUNDS, getCellForegrounds( item ), null );
renderProperty( item, PROP_CELL_FONTS, getCellFonts( item ), null );
renderProperty( item, PROP_CHECKED, item.getChecked(), false );
renderProperty( item, PROP_GRAYED, item.getGrayed(), false );
}
private static void renderClear( TableItem item ) {
getRemoteObject( item ).call( "clear", null );
}
private static int getIndex( TableItem item ) {
return item.getParent().indexOf( item );
}
private static boolean isCached( TableItem item ) {
Table table = item.getParent();
ITableAdapter adapter = table.getAdapter( ITableAdapter.class );
return !adapter.isItemVirtual( table.indexOf( item ) );
}
static String[] getTexts( TableItem item ) {
return getTableItemAdapter( item ).getTexts();
}
static Image[] getImages( TableItem item ) {
return getTableItemAdapter( item ).getImages();
}
private static Color getUserBackground( TableItem item ) {
return item.getAdapter( IWidgetColorAdapter.class ).getUserBackground();
}
private static Color getUserForeground( TableItem item ) {
return item.getAdapter( IWidgetColorAdapter.class ).getUserForeground();
}
private static Font getUserFont( TableItem item ) {
return item.getAdapter( IWidgetFontAdapter.class ).getUserFont();
}
private static Color[] getCellBackgrounds( TableItem item ) {
return getTableItemAdapter( item ).getCellBackgrounds();
}
private static Color[] getCellForegrounds( TableItem item ) {
return getTableItemAdapter( item ).getCellForegrounds();
}
private static Font[] getCellFonts( TableItem item ) {
return getTableItemAdapter( item ).getCellFonts();
}
private static boolean wasCleared( TableItem item ) {
boolean cached = isCached( item );
boolean wasCached = wasCached( item );
return !cached && wasCached;
}
private static boolean wasCached( TableItem item ) {
boolean wasCached;
RemoteAdapter adapter = WidgetUtil.getAdapter( item );
if( adapter.isInitialized() ) {
Boolean preserved = ( Boolean )adapter.getPreserved( PROP_CACHED );
wasCached = Boolean.TRUE.equals( preserved );
} else {
wasCached = true;
}
return wasCached;
}
private static ITableItemAdapter getTableItemAdapter( TableItem item ) {
return item.getAdapter( ITableItemAdapter.class );
}
private static void preservingInitialized( TableItem item, IRenderRunnable runnable )
throws IOException
{
boolean initialized = WidgetUtil.getAdapter( item ).isInitialized();
runnable.run();
setInitialized( item, initialized );
}
private static void setInitialized( TableItem item, boolean initialized ) {
WidgetRemoteAdapter adapter = ( WidgetRemoteAdapter )WidgetUtil.getAdapter( item );
adapter.setInitialized( initialized );
}
private TableItemLCA() {
// prevent instantiation
}
}