/******************************************************************************* * 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.treeitemkit; 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.internal.remote.RemoteObjectImpl; 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.ITreeAdapter; import org.eclipse.swt.internal.widgets.ITreeItemAdapter; 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.TreeItem; import org.eclipse.swt.widgets.Widget; public final class TreeItemLCA extends WidgetLCA<TreeItem> { public static final TreeItemLCA INSTANCE = new TreeItemLCA(); private static final String TYPE = "rwt.widgets.GridItem"; static final String PROP_INDEX = "index"; static final String PROP_ITEM_COUNT = "itemCount"; 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_EXPANDED = "expanded"; static final String PROP_CHECKED = "checked"; static final String PROP_GRAYED = "grayed"; private static final String PROP_CACHED = "cached"; private static final int DEFAULT_ITEM_COUNT = 0; @Override public void preserveValues( TreeItem item ) { preserveProperty( item, PROP_INDEX, getIndex( item ) ); preserveProperty( item, PROP_CACHED, isCached( item ) ); if( isCached( item ) ) { preserveProperty( item, PROP_ITEM_COUNT, item.getItemCount() ); 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_EXPANDED, item.getExpanded() ); preserveProperty( item, PROP_CHECKED, item.getChecked() ); preserveProperty( item, PROP_GRAYED, item.getGrayed() ); } } @Override public void renderInitialization( TreeItem item ) throws IOException { RemoteObject remoteObject = createRemoteObject( item, TYPE ); remoteObject.setHandler( new TreeItemOperationHandler( item ) ); Widget parent = item.getParentItem() == null ? item.getParent() : item.getParentItem(); remoteObject.set( "parent", WidgetUtil.getId( parent ) ); } @Override public void renderChanges( final TreeItem item ) throws IOException { renderProperty( item, PROP_INDEX, getIndex( item ), -1 ); if( wasCleared( item ) ) { renderClear( item ); } else if( isCached( item ) ) { preservingInitialized( item, new Runnable() { @Override public void run() { // 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 renderClear( TreeItem item ) { getRemoteObject( item ).call( "clear", null ); } private static void renderProperties( TreeItem item ) { renderProperty( item, PROP_ITEM_COUNT, item.getItemCount(), DEFAULT_ITEM_COUNT ); 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_EXPANDED, item.getExpanded(), false ); renderProperty( item, PROP_CHECKED, item.getChecked(), false ); renderProperty( item, PROP_GRAYED, item.getGrayed(), false ); } @Override public void renderDispose( TreeItem item ) throws IOException { RemoteObject remoteObject = getRemoteObject( item ); // The parent by the clients logic is the parent-item, not the tree (except for root layer) if( !getTreeItemAdapter( item ).isParentDisposed() ) { remoteObject.destroy(); } else { ( ( RemoteObjectImpl )remoteObject ).markDestroyed(); } } private static int getIndex( TreeItem item ) { int result; if( item.getParentItem() == null ) { result = item.getParent().indexOf( item ); } else { result = item.getParentItem().indexOf( item ); } return result; } private static boolean wasCleared( TreeItem item ) { return !isCached( item ) && wasCached( item ); } private static boolean isCached( TreeItem item ) { return item.getParent().getAdapter( ITreeAdapter.class ).isCached( item ); } private static boolean wasCached( TreeItem item ) { RemoteAdapter adapter = WidgetUtil.getAdapter( item ); if( adapter.isInitialized() ) { return Boolean.TRUE.equals( adapter.getPreserved( PROP_CACHED ) ); } return false; } private static String[] getTexts( TreeItem item ) { return getTreeItemAdapter( item ).getTexts(); } private static Image[] getImages( TreeItem item ) { return getTreeItemAdapter( item ).getImages(); } private static Color getUserBackground( TreeItem item ) { return item.getAdapter( IWidgetColorAdapter.class ).getUserBackground(); } private static Color getUserForeground( TreeItem item ) { return item.getAdapter( IWidgetColorAdapter.class ).getUserForeground(); } private static Font getUserFont( TreeItem item ) { return item.getAdapter( IWidgetFontAdapter.class ).getUserFont(); } private static Color[] getCellBackgrounds( TreeItem item ) { return getTreeItemAdapter( item ).getCellBackgrounds(); } private static Color[] getCellForegrounds( TreeItem item ) { return getTreeItemAdapter( item ).getCellForegrounds(); } private static Font[] getCellFonts( TreeItem item ) { return getTreeItemAdapter( item ).getCellFonts(); } private static ITreeItemAdapter getTreeItemAdapter( TreeItem item ) { return item.getAdapter( ITreeItemAdapter.class ); } private static void preservingInitialized( TreeItem item, Runnable runnable ) { boolean initialized = WidgetUtil.getAdapter( item ).isInitialized(); runnable.run(); setInitialized( item, initialized ); } private static void setInitialized( TreeItem item, boolean initialized ) { WidgetRemoteAdapter adapter = ( WidgetRemoteAdapter )WidgetUtil.getAdapter( item ); adapter.setInitialized( initialized ); } private TreeItemLCA() { // prevent instantiation } }