/*******************************************************************************
* 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.Constants.BOOK_BROOK;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_GAIGE;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_HAINY;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_KOCH;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_RUSSEL;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_SHIELDS;
import static com.eclipsesource.tabris.demos.ui.Constants.BOOK_SLOSS;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_AFTER_VISITING;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_AUTOBIOGRAFY;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_HISTORY;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_HOW_LITERATUR;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_SCHRODER;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_THE_DINNER;
import static com.eclipsesource.tabris.demos.ui.Constants.IMAGE_VAMPIRES;
import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.compile;
import static java.util.regex.Pattern.quote;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import com.eclipsesource.tabris.ui.action.Proposal;
public class BookProvider {
private static class BookData {
private final String title;
private final String author;
private final String imagePath;
public BookData( String title, String author, String imagePath ) {
this.title = title;
this.author = author;
this.imagePath = imagePath;
}
}
private static Map<String, BookData> bookData = createBookData();
private static Map<String, BookData> createBookData() {
Map<String, BookData> data = new HashMap<String, BookData>();
data.put( BOOK_GAIGE, new BookData( "Schroder: A Novel", "Amity Gaige", IMAGE_SCHRODER ) );
data.put( BOOK_HAINY, new BookData( "After Visiting Friends: A Son's Story",
"Michael Hainey",
IMAGE_AFTER_VISITING ) );
data.put( BOOK_RUSSEL, new BookData( "Vampires in the Lemon Grove: Stories",
"Karen Russell",
IMAGE_VAMPIRES ) );
data.put( BOOK_BROOK,
new BookData( "A History of Future Cities", "Daniel Brook", IMAGE_HISTORY ) );
data.put( BOOK_SLOSS, new BookData( "Autobiography of Us: A Novel",
"Aria Beth Sloss",
IMAGE_AUTOBIOGRAFY ) );
data.put( BOOK_SHIELDS, new BookData( "How Literature Saved My Life",
"David Shields",
IMAGE_HOW_LITERATUR ) );
data.put( BOOK_KOCH, new BookData( "The Dinner", "Herman Koch", IMAGE_THE_DINNER ) );
return data;
}
public static List<Book> getBooks( Display display ) {
List<Book> books = new ArrayList<Book>();
Book bookSchroder = createBook( display, bookData.get( BOOK_GAIGE ) );
Book bookAfterVisiting = createBook( display, bookData.get( BOOK_HAINY ) ).setFavorite( true );
Book bookVampires = createBook( display, bookData.get( BOOK_RUSSEL ) ).setFavorite( true );
Book bookHistory = createBook( display, bookData.get( BOOK_BROOK ) ).setFavorite( true )
.setPopular( true );
Book bookAutobiography = createBook( display, bookData.get( BOOK_SLOSS ) ).setPopular( true );
Book bookLiteratur = createBook( display, bookData.get( BOOK_SHIELDS ) ).setPopular( true );
Book bookDinner = createBook( display, bookData.get( BOOK_KOCH ) ).setPopular( true );
relate( bookVampires, bookAfterVisiting );
relate( bookVampires, bookAutobiography );
relate( bookSchroder, bookAfterVisiting );
relate( bookHistory, bookLiteratur );
relate( bookHistory, bookAutobiography );
relate( bookHistory, bookAfterVisiting );
books.add( bookSchroder );
books.add( bookAfterVisiting );
books.add( bookVampires );
books.add( bookHistory );
books.add( bookAutobiography );
books.add( bookLiteratur );
books.add( bookDinner );
return books;
}
private static Book createBook( Display display, BookData data ) {
Image image = new Image( display, BookProvider.class.getResourceAsStream( data.imagePath ) );
return new Book( data.title, data.author, image );
}
private static void relate( Book book1, Book book2 ) {
book1.getRelated().add( book2 );
book2.getRelated().add( book1 );
}
public static List<Proposal> findBookTitles( Display display, final String query ) {
List<Book> books = BookProvider.getBooks( display );
final List<Proposal> matches = new ArrayList<Proposal>();
for( Book book : books ) {
if( contains( book.getTitle(), query ) ) {
matches.add( new Proposal( book.getTitle() ) );
}
}
return matches;
}
public static List<Book> findBooks( Display display, final String query ) {
List<Book> books = BookProvider.getBooks( display );
final List<Book> matches = new ArrayList<Book>();
for( Book book : books ) {
if( contains( book.getTitle(), query ) ) {
matches.add( book );
}
}
return matches;
}
private static boolean contains( String title, String query ) {
return compile( quote( query ), CASE_INSENSITIVE ).matcher( title ).find();
}
private BookProvider() {
// prevent instantiation
}
}