/*******************************************************************************
* Copyright (c) 2002, 2009 Innoopract Informationssysteme GmbH.
* 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.custom.ctabitemkit;
import java.io.IOException;
import org.eclipse.rwt.internal.lifecycle.JSConst;
import org.eclipse.rwt.lifecycle.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.internal.custom.ICTabFolderAdapter;
import org.eclipse.swt.internal.widgets.IWidgetFontAdapter;
import org.eclipse.swt.internal.widgets.Props;
import org.eclipse.swt.widgets.Widget;
public final class CTabItemLCA extends AbstractWidgetLCA {
public static final String EVENT_ITEM_CLOSED
= "org.eclipse.swt.events.ctabItemClosed";
private static final String PROP_TEXT = "text";
private static final String PROP_IMAGE = "image";
private static final String PROP_BOUNDS = "bounds";
private static final String PROP_SELECTED = "selected";
private static final String PROP_SHOWING = "showing";
private static final String PROP_SHOW_CLOSE = "showClose";
private static final String PROP_UNSELECTED_CLOSE_VISIBLE
= "unselectedCloseVisible";
private static final String PROP_FIRST_ITEM = "firstItem";
public void preserveValues( final Widget widget ) {
CTabItem item = ( CTabItem )widget;
CTabFolder parent = item.getParent();
IWidgetAdapter adapter = WidgetUtil.getAdapter( item );
adapter.preserve( PROP_TEXT, getShortenedText( item ) );
adapter.preserve( PROP_IMAGE, getImage( item ) );
WidgetLCAUtil.preserveToolTipText( item, item.getToolTipText() );
adapter.preserve( PROP_BOUNDS, item.getBounds() );
adapter.preserve( PROP_SELECTED, isItemSelected( item ) );
boolean closeVisible = parent.getUnselectedCloseVisible();
adapter.preserve( PROP_UNSELECTED_CLOSE_VISIBLE,
Boolean.valueOf( closeVisible ) );
adapter.preserve( PROP_SHOWING,
Boolean.valueOf( item.isShowing() ) );
adapter.preserve( PROP_SHOW_CLOSE,
Boolean.valueOf( item.getShowClose() ) );
adapter.preserve( PROP_FIRST_ITEM,
Boolean.valueOf( item == item.getParent().getItem( 0 ) ) );
preserveFont( item );
WidgetLCAUtil.preserveCustomVariant( item );
}
public void readData( final Widget widget ) {
final CTabItem item = ( CTabItem )widget;
if( WidgetLCAUtil.wasEventSent( item, EVENT_ITEM_CLOSED ) ) {
ProcessActionRunner.add( new Runnable() {
public void run() {
CTabFolderEvent event = createCloseEvent( item );
event.processEvent();
if( event.doit ) {
item.dispose();
}
}
} );
}
}
public void renderInitialization( final Widget widget ) throws IOException {
CTabItem item = ( CTabItem )widget;
CTabFolder parent = item.getParent();
JSWriter writer = JSWriter.getWriterFor( item );
Object[] args = new Object[] {
parent,
Boolean.valueOf( showClose( item ) )
};
writer.newWidget( "org.eclipse.swt.custom.CTabItem", args );
writer.call( parent, "add", new Object[] { item } );
}
public void renderChanges( final Widget widget ) throws IOException {
CTabItem item = ( CTabItem )widget;
WidgetLCAUtil.writeBounds( item, item.getParent(), item.getBounds() );
writeText( item );
writeImage( item );
writeFont( item );
WidgetLCAUtil.writeToolTip( item, item.getToolTipText() );
writeShowing( item );
writeShowClose( item );
writeUnselectedCloseVisible( item );
writeSelection( item );
writeFirstItem( item );
WidgetLCAUtil.writeCustomVariant( item );
}
public void renderDispose( final Widget widget ) throws IOException {
JSWriter writer = JSWriter.getWriterFor( widget );
writer.dispose();
}
////////////////////////////////////////////
// Helping methods to render JavaScript code
private static void writeText( final CTabItem item ) throws IOException {
String text = getShortenedText( item );
if( WidgetLCAUtil.hasChanged( item, Props.TEXT, text ) ) {
text = WidgetLCAUtil.escapeText( text, true );
JSWriter writer = JSWriter.getWriterFor( item );
writer.set( JSConst.QX_FIELD_LABEL, text );
}
}
private static void writeImage( final CTabItem item ) throws IOException {
Image newValue = getImage( item );
if( WidgetLCAUtil.hasChanged( item, PROP_IMAGE, newValue, null ) ) {
WidgetLCAUtil.writeImage( item, JSConst.QX_FIELD_ICON, newValue );
}
}
private static void writeFont( final CTabItem item ) throws IOException {
Object adapter = item.getAdapter( IWidgetFontAdapter.class );
IWidgetFontAdapter fontAdapter = ( IWidgetFontAdapter )adapter;
Font font = fontAdapter.getUserFont();
WidgetLCAUtil.writeFont( item, font );
}
private static void writeSelection( final CTabItem item ) throws IOException {
JSWriter writer = JSWriter.getWriterFor( item );
Boolean newValue = isItemSelected( item );
Boolean defValue = Boolean.FALSE;
if( WidgetLCAUtil.hasChanged( item, PROP_SELECTED, newValue, defValue ) ) {
writer.set( "selected", newValue );
}
}
private static void writeFirstItem( final CTabItem item ) throws IOException {
JSWriter writer = JSWriter.getWriterFor( item );
boolean isFirst = item == item.getParent().getItem( 0 );
Boolean newValue = Boolean.valueOf( isFirst );
Boolean defValue = Boolean.FALSE;
if( WidgetLCAUtil.hasChanged( item, PROP_FIRST_ITEM, newValue, defValue ) )
{
if( isFirst ) {
writer.call( "addState", new Object[] { "firstItem" } );
} else {
writer.call( "removeState", new Object[] { "firstItem" } );
}
}
}
private static void writeShowing( final CTabItem item ) throws IOException {
Boolean newValue = Boolean.valueOf( item.isShowing() );
if( WidgetLCAUtil.hasChanged( item, PROP_SHOWING, newValue, Boolean.TRUE ) )
{
JSWriter writer = JSWriter.getWriterFor( item );
writer.set( JSConst.QX_FIELD_VISIBLE, newValue );
}
}
private static void writeShowClose( final CTabItem item ) throws IOException {
Boolean newValue = Boolean.valueOf( item.getShowClose() );
String prop = PROP_SHOW_CLOSE;
if( WidgetLCAUtil.hasChanged( item, prop, newValue, Boolean.FALSE ) ) {
JSWriter writer = JSWriter.getWriterFor( item );
writer.set( "showClose", newValue );
}
}
private static void writeUnselectedCloseVisible( final CTabItem item )
throws IOException
{
CTabFolder parent = item.getParent();
Boolean newValue = Boolean.valueOf( parent.getUnselectedCloseVisible() );
String prop = PROP_UNSELECTED_CLOSE_VISIBLE;
if( WidgetLCAUtil.hasChanged( item, prop, newValue, Boolean.TRUE ) ) {
JSWriter writer = JSWriter.getWriterFor( item );
writer.set( "unselectedCloseVisible", newValue );
}
}
////////////////////////////////////////////
// Helping methods to obtain item properties
private static Image getImage( final CTabItem item ) {
Image result = item.getImage();
if( result != null ) {
Object adapter = item.getParent().getAdapter( ICTabFolderAdapter.class );
ICTabFolderAdapter folderAdapter = ( ICTabFolderAdapter )adapter;
if( !folderAdapter.showItemImage( item ) ) {
result = null;
}
}
return result;
}
private static String getShortenedText( final CTabItem item ) {
CTabFolder folder = item.getParent();
Object adapter = folder.getAdapter( ICTabFolderAdapter.class );
ICTabFolderAdapter folderAdapter = ( ( ICTabFolderAdapter )adapter );
return folderAdapter.getShortenedItemText( item );
}
private static boolean showClose( final CTabItem item ) {
CTabFolder parent = item.getParent();
ICTabFolderAdapter adapter
= ( ICTabFolderAdapter )parent.getAdapter( ICTabFolderAdapter.class );
boolean canClose = adapter.showItemClose( item );
return canClose;
}
///////////////
// Event helper
private static CTabFolderEvent createCloseEvent( final CTabItem item ) {
CTabFolderEvent result
= new CTabFolderEvent( item.getParent(), CTabFolderEvent.CLOSE );
result.item = item;
result.doit = true;
return result;
}
//////////////////
// Preserve helper
private static void preserveFont( final CTabItem item ) {
Object adapter = item.getAdapter( IWidgetFontAdapter.class );
IWidgetFontAdapter fontAdapter = ( IWidgetFontAdapter )adapter;
Font font = fontAdapter.getUserFont();
WidgetLCAUtil.preserveFont( item, font );
}
private static Boolean isItemSelected( final CTabItem item ) {
CTabFolder folder = item.getParent();
Object adapter = folder.getAdapter( ICTabFolderAdapter.class );
ICTabFolderAdapter folderAdapter = ( ( ICTabFolderAdapter )adapter );
CTabItem selectedItem = folderAdapter.getInternalSelectedItem();
return Boolean.valueOf( item == selectedItem );
}
}