blob: e0368b698447886ebc1097afbe615a5fec3a8422 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BestSolution.at 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:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.demo.e4photo.flickr.ui;
import java.rmi.RemoteException;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.demo.e4photo.flickr.service.FlickrPhoto;
import org.eclipse.e4.demo.e4photo.flickr.service.FlickrSearch;
import org.eclipse.e4.demo.e4photo.flickr.service.IFlickrService;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* Search for images on flickr.com
*/
public class Flickr {
@Inject
private IFlickrService flickrService;
private Composite comp;
private PagedTable<FlickrPhoto> table;
@Inject
public Flickr(Composite comp) {
this.comp = comp;
comp.setLayout(new GridLayout(3, false));
final Image OK_IMG = new Image(comp.getDisplay(), getClass().getClassLoader().getResourceAsStream("icons/accept.png"));
final Image NOK_IMG = new Image(comp.getDisplay(), getClass().getClassLoader().getResourceAsStream("icons/exclamation.png"));
comp.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
OK_IMG.dispose();
NOK_IMG.dispose();
}
});
comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
Label l = new Label(comp, SWT.NONE);
l.setText("Flickr API-Key");
l.setLayoutData(new GridData(SWT.DEFAULT,GridData.CENTER,false,false));
final Text apiKey = new Text(comp, SWT.BORDER);
apiKey.setLayoutData(new GridData(GridData.FILL,GridData.CENTER,true,false,2,1));
apiKey.setText("46d3d5269fe6513602b3f0f06d9e2b2e");
l = new Label(comp, SWT.NONE);
l.setText("Search Tags");
l.setLayoutData(new GridData(SWT.DEFAULT,GridData.CENTER,false,false));
final Text tags = new Text(comp, SWT.BORDER);
tags.setLayoutData(new GridData(GridData.FILL,GridData.CENTER,true,false));
tags.setText("eclipsecon");
Button button = new Button(comp, SWT.PUSH);
button.setText("Search");
table = new PagedTable<FlickrPhoto>(comp, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSearch(apiKey.getText(), tags.getText());
}
});
table.addColumn("Id", new PagedTable.PageColumnLabelProvider<FlickrPhoto>() {
@Override
protected String doGetText(FlickrPhoto element) {
return element.getId();
}
},new ColumnPixelData(120));
table.addColumn("Title", new PagedTable.PageColumnLabelProvider<FlickrPhoto>() {
@Override
protected String doGetText(FlickrPhoto element) {
return element.getTitle();
}
@Override
protected String doGetToolTipText(FlickrPhoto element) {
return element.getId() + " - " + element.getTitle();
}
},new ColumnWeightData(1));
table.addColumn("Public", new PagedTable.PageColumnLabelProvider<FlickrPhoto>() {
@Override
protected Image doGetImage(FlickrPhoto element) {
if( element.isPublic() ) {
return OK_IMG;
} else {
return NOK_IMG;
}
}
@Override
protected String doGetText(FlickrPhoto element) {
return "";
}
},new ColumnPixelData(50));
table.addColumn("Friend", new PagedTable.PageColumnLabelProvider<FlickrPhoto>() {
@Override
protected Image doGetImage(FlickrPhoto element) {
if( element.isFriend() ) {
return OK_IMG;
} else {
return NOK_IMG;
}
}
@Override
protected String doGetText(FlickrPhoto element) {
return "";
}
},new ColumnPixelData(50));
table.addColumn("Family", new PagedTable.PageColumnLabelProvider<FlickrPhoto>() {
@Override
protected Image doGetImage(FlickrPhoto element) {
if( element.isFamily() ) {
return OK_IMG;
} else {
return NOK_IMG;
}
}
@Override
protected String doGetText(FlickrPhoto element) {
return "";
}
},new ColumnPixelData(50));
table.setLayoutData(new GridData(GridData.FILL,GridData.FILL,true,true,3,1));
new ToolTipSupport(table.getViewer(), ToolTip.NO_RECREATE, false);
}
private void handleSearch(String apiKey, String tags) {
try {
FlickrSearch search = flickrService.createTagSearch(apiKey, tags);
table.setInput(new SearchInput(search));
} catch (RemoteException e1) {
Status s = new Status(IStatus.ERROR, "org.eclipse.e4.demo.e4photo.flickr", e1.getMessage(), e1);
ErrorDialog.openError(table.getShell(), "Searchfailure", "Failure while executing search", s);
}
}
private class ToolTipSupport extends ColumnViewerToolTipSupport {
protected ToolTipSupport(ColumnViewer viewer, int style,
boolean manualActivation) {
super(viewer, style, manualActivation);
}
@Override
protected Composite createViewerToolTipContentArea(Event event,
ViewerCell cell, final Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
parent.setBackgroundMode(SWT.INHERIT_DEFAULT);
if( cell == null || cell.getElement() == null ) {
return comp;
}
final FlickrPhoto photo = (FlickrPhoto) cell.getElement();
comp.setLayout(new GridLayout());
Label l = new Label(comp, SWT.NONE);
l.setText(getText(event));
l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
l = new Label(comp, SWT.SEPARATOR | SWT.HORIZONTAL);
l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Label img = new Label(comp, SWT.NONE);
Thread t = new Thread() {
public void run() {
if( parent.isDisposed() ) {
return;
}
parent.getDisplay().syncExec(new Runnable() {
public void run() {
if( img.isDisposed() ) {
return;
}
try {
img.setImage(new Image(parent.getDisplay(), flickrService.getPhoto(photo)));
} catch (RemoteException e) {
img.setText("Failed to fetch image from remote server.");
}
parent.getShell().pack(true);
}
});
}
};
t.start();
img.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if( img.getImage() != null ) {
img.getImage().dispose();
}
}
});
return comp;
}
}
private class SearchInput implements IPagedInput<FlickrPhoto> {
private FlickrSearch search;
public SearchInput(FlickrSearch search) {
this.search = search;
}
public int getPages() {
return search.getPages();
}
public int getPageSize() {
return search.getPageSize();
}
public int getTotalItems() {
return search.getTotalItems();
}
public List<FlickrPhoto> getItems(int page) {
try {
return flickrService.getPhotos(search, page);
} catch (RemoteException e) {
Status s = new Status(IStatus.ERROR, "org.eclipse.e4.demo.e4photo.flickr", e.getMessage(), e);
ErrorDialog.openError(comp.getShell(), "Searchfailure", "Failure while fetching photo page", s);
}
return Collections.emptyList();
}
}
}