/*******************************************************************************
* Copyright (c) 2013 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.demos.ui;
import static com.eclipsesource.tabris.demos.ui.BookDetailsPage.BOOK_ITEM;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOKS;
import static com.eclipsesource.tabris.demos.ui.Constants.RELATED_BOOKS_FONT;
import static com.eclipsesource.tabris.demos.ui.Constants.TITLE_FONT;
import static com.eclipsesource.tabris.widgets.enhancement.Widgets.*;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.template.ImageCell;
import org.eclipse.rap.rwt.template.Template;
import org.eclipse.rap.rwt.template.TextCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import com.eclipsesource.tabris.ui.AbstractPage;
import com.eclipsesource.tabris.ui.PageData;
import com.eclipsesource.tabris.ui.UI;
public class BooksListPage extends AbstractPage {
private BookFilter bookFilter;
private Composite container;
private TreeViewer viewer;
private static UI ui;
public void setBookFilter( BookFilter bookFilter ) {
this.bookFilter = bookFilter;
}
@Override
public void createContent( Composite parent, PageData data ) {
ui = getUI();
registerResources();
createBooks();
container = new Composite( parent, SWT.NONE );
GridLayoutFactory.fillDefaults().spacing( 0, 0 ).applyTo( container );
viewer = createTreeViewer( this, container );
createViewerInput( viewer );
}
private void registerResources() {
FontRegistry fontRegistry = JFaceResources.getFontRegistry();
fontRegistry.put( TITLE_FONT, createFontData( 16, SWT.BOLD ) );
fontRegistry.put( RELATED_BOOKS_FONT, createFontData( 16, SWT.BOLD ) );
}
private FontData[] createFontData( int height, int style ) {
return new FontData[]{ new FontData( "Verdana", height, style ) };
}
private void createBooks() {
Object books = RWT.getUISession().getAttribute( BOOKS );
if( books == null ) {
books = BookProvider.getBooks( getUI().getDisplay() );
RWT.getUISession().setAttribute( BOOKS, books );
}
}
public Composite getContainer() {
return container;
}
public static TreeViewer createTreeViewer( AbstractPage page, Composite container ) {
TreeViewer viewer = new TreeViewer( container, SWT.V_SCROLL );
viewer.setContentProvider( new BooksContentProvider() );
addBookSelectionListener( page, viewer );
Tree tree = viewer.getTree();
tree.setLinesVisible( true );
tree.setData( RWT.MARKUP_ENABLED, Boolean.TRUE );
onTree( tree ).setTemplate( createRowTemplate() );
onTree( tree ).setItemHeight( 68 );
GridDataFactory.fillDefaults().align( SWT.FILL, SWT.FILL ).grab( true, true ).applyTo( tree );
viewer.setLabelProvider( new BooksLabelProvider() );
new TreeColumn( tree, SWT.LEFT );
new TreeColumn( tree, SWT.LEFT );
new TreeColumn( tree, SWT.LEFT );
return viewer;
}
private static Template createRowTemplate() {
Template template = new Template();
addImageCell( template );
addTitleCell( template );
addAuthorCell( template );
return template;
}
private static void addAuthorCell( Template template ) {
TextCell authorCell = new TextCell( template );
authorCell.setBindingIndex( 2 );
authorCell.setLeft( 52 ).setRight( 10 ).setTop( 36 ).setBottom( 0 );
authorCell.setForeground( new Color( ui.getDisplay(), new RGB( 123, 123, 123 ) ) );
authorCell.setFont( new Font( ui.getDisplay(), new FontData( "Verdana", 14, SWT.NONE ) ) );
}
private static void addTitleCell( Template template ) {
TextCell titleCell = new TextCell( template );
titleCell.setBindingIndex( 1 );
titleCell.setLeft( 52 ).setRight( 10 ).setTop( 12 ).setBottom( 0 );
titleCell.setFont( new Font( ui.getDisplay(), new FontData( "Verdana", 18, SWT.NONE ) ) );
titleCell.setForeground( new Color( ui.getDisplay(), new RGB( 74, 74, 74 ) ) );
}
private static void addImageCell( Template template ) {
ImageCell imageCell = new ImageCell( template );
imageCell.setBindingIndex( 0 );
imageCell.setLeft( 10 ).setWidth( 32 ).setTop( 10 ).setHeight( 48 );
}
@SuppressWarnings( "unchecked" )
private void createViewerInput( TreeViewer viewer ) {
List books = ( List )RWT.getUISession().getAttribute( BOOKS );
List<Book> filteredBooks = bookFilter.filter( books );
viewer.setInput( filteredBooks );
}
private static void addBookSelectionListener( final AbstractPage page, TreeViewer viewer ) {
viewer.addSelectionChangedListener( new ISelectionChangedListener() {
@Override
public void selectionChanged( SelectionChangedEvent event ) {
Object book = ( ( IStructuredSelection )event.getSelection() ).getFirstElement();
if( book != null ) {
PageData data = new PageData();
data.set( BOOK_ITEM, book );
page.openPage( BookDetailsPage.class.getName(), data );
}
}
} );
}
@Override
public void activate() {
super.activate();
viewer.setSelection( null );
}
}