package net.thesocialos.client.desktop.window;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import net.thesocialos.client.TheSocialOS;
import net.thesocialos.client.advanced.AdvClickListener;
import net.thesocialos.client.api.DriveAPI;
import net.thesocialos.client.api.FacebookAPI;
import net.thesocialos.client.api.FlickrAPI;
import net.thesocialos.client.api.Media;
import net.thesocialos.client.api.MediaParent;
import net.thesocialos.client.api.MediaPicture;
import net.thesocialos.client.api.PicasaAPI;
import net.thesocialos.client.api.YoutubeAPI;
import net.thesocialos.client.app.IApplication;
import net.thesocialos.client.desktop.DesktopEventOnClose;
import net.thesocialos.client.desktop.DesktopEventOnMaximize;
import net.thesocialos.client.desktop.DesktopEventOnMinimize;
import net.thesocialos.client.desktop.DesktopEventOnTop;
import net.thesocialos.client.desktop.DesktopEventonEndDrag;
import net.thesocialos.client.desktop.DesktopUnit;
import net.thesocialos.client.desktop.window.events.WindowCloseEvent;
import net.thesocialos.client.desktop.window.events.WindowEndDragEvent;
import net.thesocialos.client.desktop.window.events.WindowEventHandler;
import net.thesocialos.client.desktop.window.events.WindowMaximizeEvent;
import net.thesocialos.client.desktop.window.events.WindowMinimizeEvent;
import net.thesocialos.client.desktop.window.events.WindowOnTopEvent;
import net.thesocialos.client.desktop.window.events.WindowResizeEvent;
import net.thesocialos.client.helper.DblClickHandlerHelper;
import net.thesocialos.client.helper.MediaHelper;
import net.thesocialos.client.view.ShareSend;
import net.thesocialos.client.view.Thumbnail;
import net.thesocialos.client.view.Thumbnail.SERVICE;
import net.thesocialos.client.view.Thumbnail.TYPE;
import net.thesocialos.shared.model.SharedHistory.SHARETYPE;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.WindowPanelLayout;
public class FolderWindow extends DesktopUnit implements IApplication {
private class TypeAndService {
TYPE type;
SERVICE service;
public TypeAndService(TYPE type, SERVICE service) {
this.type = type;
this.service = service;
}
}
public final static String PICTURES = TheSocialOS.getConstants().pictures();
public final static String VIDEOS = TheSocialOS.getConstants().videos();
public final static String MUSIC = TheSocialOS.getConstants().music();
public final static String OTHER = TheSocialOS.getConstants().other();
InfoPanel infoPanel = new InfoPanel();
FlexTable table = new FlexTable();
public String title = "";
public String lastSelectedThumbUrl = "";
private int i = 0;
private int j = 0;
private boolean hasAlbums = false;
private String contentType = null;
private List<Media> parent = new ArrayList<Media>();
private List<Set<Media>> files = new ArrayList<Set<Media>>();
private int arrayPosition = 0;
private boolean isVideo = false;
private final PopupPanel popupPanel = new PopupPanel(true);
/**
* @deprecated Use the constructor that doesn't pass a HashSet and add the folders dynamically using addMedia
* methods
* @param title
* The folder name
* @param mediaSet
* The media to load in the folder
* @param idProgram
* The program id
*/
@Deprecated
public FolderWindow(String title, HashSet<? extends Media> mediaSet, int idProgram) {
this(idProgram, title);
this.title = title;
int width = windowDisplay.getWidth();
int col = width / 152;
Iterator<? extends Media> iterator = mediaSet.iterator();
i = 0;
j = 0;
while (iterator.hasNext()) {
Media media = iterator.next();
printMedia(media, col);
}
}
public FolderWindow(String title, String contentType, int idProgram) {
this(idProgram, title);
this.title = title;
this.contentType = contentType;
}
public FolderWindow(String title, WindowPanelLayout display, int idProgram) {
this(display, idProgram, title);
this.title = title;
}
private FolderWindow(WindowPanelLayout display, int idProgram, String name) {
super(idProgram, name, display, TypeUnit.WINDOW, false);
title = "Prueba";
}
private FolderWindow(int idProgram, String name) {
super(idProgram, name, new WindowPanelLayout(false, false, new MyCaption(), new Footer()), TypeUnit.WINDOW,
false);
files.add(new HashSet<Media>());
MenuBar popupMenuBar = new MenuBar(true);
MenuItem shareItem = new MenuItem("Share", true, shareCommand);
popupMenuBar.addItem(shareItem);
popupMenuBar.setVisible(true);
popupPanel.add(popupMenuBar);
// popupMenuBar.getElement().getStyle().setZIndex(1000);
popupMenuBar.getParent().getElement().getStyle().setZIndex(1000);
x = 1;
y = 30;
windowDisplay.addWindowEvents(new WindowEventHandler() {
@Override
public void onClose(WindowCloseEvent event) {
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnClose(FolderWindow.this));
}
@Override
public void onEndDrag(WindowEndDragEvent event) {
TheSocialOS.getEventBus().fireEvent(new DesktopEventonEndDrag(FolderWindow.this));
}
@Override
public void onMaximize(WindowMaximizeEvent windowMaximizeEvent) {
if (isMaximizable()) {
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnMaximize(FolderWindow.this));
clearMedia();
addMedia((HashSet<? extends Media>) files.get(arrayPosition));
}
}
@Override
public void onMinimize(WindowMinimizeEvent windowMinimizeEvent) {
if (isMinimizable())
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnMinimize(FolderWindow.this, false));
}
@Override
public void onTop(WindowOnTopEvent event) {
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnTop(FolderWindow.this));
}
@Override
public void onResize(WindowResizeEvent event) {
clearMedia();
addMedia((HashSet<? extends Media>) files.get(arrayPosition));
}
});
}
private void printMedia(final Media media, int col) {
TypeAndService typeAndService = getTypeAndService(media);
// If it a picture prefetch it, so the popup loads in the correct position (and the image loads faster ;) )
Thumbnail thumb = new Thumbnail(media.getThumbnailURL(), media.getName(), typeAndService.type,
typeAndService.service);
if (typeAndService.type == TYPE.PICTURE) {
Image.prefetch(((MediaPicture) media).getUrl());
thumb.addAdvClickListener(new AdvClickListener() {
@Override
public void onClick(Widget sender) {
// TODO Auto-generated method stub
}
@Override
public void onRightClick(Widget sender, Event event) {
isVideo = false;
lastSelectedThumbUrl = ((MediaPicture) media).getUrl();
int x = DOM.eventGetClientX(event);
int y = DOM.eventGetClientY(event);
if (Window.getClientHeight() - y < popupPanel.getElement().getClientHeight())
y = y - popupPanel.getOffsetHeight();
if (Window.getClientHeight() - x < popupPanel.getElement().getClientWidth())
x = x - popupPanel.getOffsetWidth();
popupPanel.setPopupPosition(x, y);
new Timer() {
@Override
public void run() {
popupPanel.show();
}
}.schedule(10);
}
@Override
public void onClick(Widget sender, Event event) {
// TODO Auto-generated method stub
}
});
}
if (typeAndService.type == TYPE.VIDEO) thumb.addAdvClickListener(new AdvClickListener() {
@Override
public void onClick(Widget sender) {
// TODO Auto-generated method stub
}
@Override
public void onRightClick(Widget sender, Event event) {
isVideo = true;
lastSelectedThumbUrl = ((MediaPicture) media).getUrl();
int x = DOM.eventGetClientX(event);
int y = DOM.eventGetClientY(event);
if (Window.getClientHeight() - y < popupPanel.getElement().getClientHeight())
y = y - popupPanel.getOffsetHeight();
if (Window.getClientHeight() - x < popupPanel.getElement().getClientWidth())
x = x - popupPanel.getOffsetWidth();
popupPanel.setPopupPosition(x, y);
new Timer() {
@Override
public void run() {
popupPanel.show();
}
}.schedule(10);
}
@Override
public void onClick(Widget sender, Event event) {
// TODO Auto-generated method stub
}
});
thumb.addDoubleClickHandler(new DblClickHandlerHelper(this, media).getDoubleClickHandler());
thumb.setTitle(media.getDescription());
table.setWidget(j, i, thumb);
table.getFlexCellFormatter().setVerticalAlignment(j, i, HasVerticalAlignment.ALIGN_TOP);
i++;
try {
if (i % col == 0) {
j++;
i = 0;
}
} catch (ArithmeticException e) {
// TODO: handle exception
}
}
public void addMedia(HashSet<? extends Media> mediaSet) {
if (!hasAlbums) {
hasAlbums = true;
infoPanel.removeFromParent();
}
int width = windowDisplay.getWidth();
int col = width / 152;
Iterator<? extends Media> iterator = mediaSet.iterator();
while (iterator.hasNext()) {
Media media = iterator.next();
files.get(arrayPosition).add(media);
printMedia(media, col);
}
}
public void addMedia(Media media) {
if (!hasAlbums) {
hasAlbums = true;
infoPanel.removeFromParent();
}
int width = windowDisplay.getWidth();
int col = width / 152;
files.get(arrayPosition).add(media);
printMedia(media, col);
}
public void clearMedia() {
table.clear();
i = 0;
j = 0;
}
@Override
public void close(AbsolutePanel absolutePanel) {
absolutePanel.remove(windowDisplay.getWindow());
}
@Override
public String getImage() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
private TypeAndService getTypeAndService(Media media) {
TypeAndService typeAndService = null;
if (media instanceof PicasaAPI.Album) typeAndService = new TypeAndService(TYPE.ALBUM, SERVICE.PICASA);
else if (media instanceof PicasaAPI.Picture) typeAndService = new TypeAndService(TYPE.PICTURE, SERVICE.PICASA);
else if (media instanceof FacebookAPI.Album) typeAndService = new TypeAndService(TYPE.ALBUM, SERVICE.FACEBOOK);
else if (media instanceof FacebookAPI.Picture) typeAndService = new TypeAndService(TYPE.PICTURE,
SERVICE.FACEBOOK);
else if (media instanceof FlickrAPI.Album) typeAndService = new TypeAndService(TYPE.ALBUM, SERVICE.FLICKR);
else if (media instanceof FlickrAPI.Picture) typeAndService = new TypeAndService(TYPE.PICTURE, SERVICE.FLICKR);
else if (media instanceof YoutubeAPI.Album) typeAndService = new TypeAndService(TYPE.ALBUM, SERVICE.YOUTUBE);
else if (media instanceof YoutubeAPI.Video) typeAndService = new TypeAndService(TYPE.VIDEO, SERVICE.YOUTUBE);
else if (media instanceof YoutubeAPI.Folder) typeAndService = new TypeAndService(TYPE.FOLDER, SERVICE.YOUTUBE);
else if (media instanceof DriveAPI.File) typeAndService = new TypeAndService(TYPE.OTHER, SERVICE.DRIVE);
return typeAndService;
}
@Override
public int getZposition() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void open(AbsolutePanel absolutePanel) {
show();
absolutePanel.add(windowDisplay.getWindow(), x, y);
windowDisplay.setSize(800, 480);
windowDisplay.getWindow().setVisible(true);
}
@Override
public void setImage(String image) {
// TODO Auto-generated method stub
}
@Override
public void setName(String name) {
// TODO Auto-generated method stub
}
private void show() {
windowDisplay.setWindowTitle(title);
VerticalPanel vPanel = new VerticalPanel();
vPanel.getElement().getStyle().setPosition(Position.RELATIVE);
vPanel.setSize("100%", "100%");
bindToolbar(vPanel);
windowDisplay.getWindow().add(vPanel);
if (!hasAlbums && null != contentType) {
infoPanel.setText(TheSocialOS.getMessages().folder_NoContent(contentType));
infoPanel.getElement().getStyle().setPosition(Position.RELATIVE);
vPanel.add(infoPanel);
}
ScrollPanel panel = new ScrollPanel();
panel.add(table);
vPanel.add(panel);
// setSize(800, 480);
panel.setSize("100%", "100%");
}
public void setTitle(String title) {
windowDisplay.setWindowTitle(title);
}
private void bindToolbar(VerticalPanel vPanel) {
Toolbar toolbar = new Toolbar();
vPanel.add(toolbar);
toolbar.setHeight("30px");
vPanel.setCellHeight(toolbar, "30px");
// toolbar.setBackImage("./themes/default/backward.png");
// toolbar.setForwardImage("./themes/default/forward.png");
// toolbar.setRefreshImage("./themes/default/refresh.png");
FocusPanel backButton = toolbar.getBackButton();
FocusPanel forwardButton = toolbar.getForwardButton();
FocusPanel refreshButton = toolbar.getRefreshButton();
backButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (arrayPosition > 0) {
clearMedia();
arrayPosition--;
addMedia((HashSet<Media>) files.get(arrayPosition));
setTitle(parent.get(arrayPosition).getName());
}
}
});
forwardButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (arrayPosition < files.size() - 1) {
clearMedia();
arrayPosition++;
addMedia((HashSet<Media>) files.get(arrayPosition));
setTitle(parent.get(arrayPosition).getName());
}
}
});
refreshButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Media mediaP = parent.get(arrayPosition);
clearMedia();
if (mediaP instanceof MediaParent) {
if (mediaP.getID().equalsIgnoreCase(MediaParent.PICTURES)) MediaHelper
.reloadPictureAlbums(FolderWindow.this);
else if (mediaP.getID().equalsIgnoreCase(MediaParent.VIDEOS)) MediaHelper
.reloadVideoFolders(FolderWindow.this);
else if (mediaP.getID().equalsIgnoreCase(MediaParent.MUSIC)) {
} else if (mediaP.getID().equalsIgnoreCase(MediaParent.OTHER))
MediaHelper.reloadOtherFolders(FolderWindow.this);
} else
new DblClickHandlerHelper(FolderWindow.this, mediaP).simulateDblClick();
}
});
}
@Override
public void toZPosition(int position) {
// TODO Auto-generated method stub
}
/**
* @param parent
* the parent to set
*/
public void setParent(Media parent) {
try {
if (null == this.parent.get(arrayPosition)) this.parent.add(parent);
else
this.parent.set(arrayPosition, parent);
} catch (IndexOutOfBoundsException ex) {
this.parent.add(parent);
}
}
public void next() {
while (arrayPosition < files.size() - 1) {
files.remove(files.size() - 1);
parent.remove(parent.size() - 1);
}
arrayPosition++;
files.add(new HashSet<Media>());
}
Command shareCommand = new Command() {
@Override
public void execute() {
// Window.alert(lastSelectedThumbUrl);
ShareSend share = new ShareSend();
if (isVideo) share = new ShareSend(SHARETYPE.VIDEO, lastSelectedThumbUrl);
else
share = new ShareSend(SHARETYPE.IMAGE, lastSelectedThumbUrl);
share.setVisible(true);
PopupPanel popup = new PopupPanel(true);
popup.setGlassEnabled(true);
popup.add(share);
popupPanel.hide();
popup.getElement().getStyle().setZIndex(960);
popup.center();
}
};
}