package net.thesocialos.client.presenter;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.thesocialos.client.CacheLayer;
import net.thesocialos.client.TheSocialOS;
import net.thesocialos.client.app.AppConstants;
import net.thesocialos.client.chat.ChatManager;
import net.thesocialos.client.desktop.DesktopEventOnOpen;
import net.thesocialos.client.desktop.DesktopManager;
import net.thesocialos.client.desktop.DesktopUnit;
import net.thesocialos.client.desktop.DesktopUnit.TypeUnit;
import net.thesocialos.client.desktop.window.FrameWindow;
import net.thesocialos.client.event.AvatarUpdateEvent;
import net.thesocialos.client.event.AvatarUpdateEventHandler;
import net.thesocialos.client.event.ContactsPetitionChangeEvent;
import net.thesocialos.client.event.LogoutEvent;
import net.thesocialos.client.helper.AppIconHelper;
import net.thesocialos.client.helper.Node;
import net.thesocialos.client.resources.Resources;
import net.thesocialos.client.view.AplicationManagerView;
import net.thesocialos.client.view.ContactsView;
import net.thesocialos.client.view.DesktopBar;
import net.thesocialos.client.view.NotificationsBoxView;
import net.thesocialos.client.view.SearchBoxView;
import net.thesocialos.client.view.SharedView;
import net.thesocialos.client.view.StartMenu;
import net.thesocialos.client.view.StartMenuItem;
import net.thesocialos.client.view.deck.SocialDeck;
import net.thesocialos.shared.model.User;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasBlurHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasWidgets;
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.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.SimpleEventBus;
public class DesktopPresenter implements Presenter {
public interface Display {
Widget asWidget();
Image getAvatar();
HasText getClock();
AbsolutePanel getDesktop();
DesktopBar getDesktopBar();
HasText getEditProfile();
HasClickHandlers getEditProfilePanel();
HasText getEmail();
HasText getLogout();
FocusPanel getLogoutPanel();
HasText getNameLabel();
AbsolutePanel getScreen();
HasClickHandlers getSocialOSButton();
HasClickHandlers getStartButton();
Widget getStartMenu();
HasBlurHandlers getStartMenuPanel();
HasText getTitleLabel();
HasClickHandlers getUserButton();
Widget getUserMenu();
HasBlurHandlers getUserMenuPanel();
HasText getUserName();
}
private SimpleEventBus eventBus;
/*
* All declarations of the desktop
*/
ContactsPresenter contacsPresenter;
SearchBoxPresenter searchBoxPresenter;
NotificationsBoxPresenter notificationBoxPresenter;
ApplicationManagerPresenter aplicationManagerPresenter = new ApplicationManagerPresenter(AppConstants.APPMANAGER,
new AplicationManagerView(), TypeUnit.INFO, false);
ResourceUploadPresenter resourceUploadPresenter;
SharedUnit sharedUnit;
private AbsolutePanel desktop;
private boolean startMenuFocused = false;
private boolean userMenuFocused = false;
DesktopManager desktopManager;
Resources imageResources = GWT.create(Resources.class);
PopupPanel programPanel = new PopupPanel(true, true); // List of run programs
private final Display display;
protected boolean initialized = false;
public DesktopPresenter(SimpleEventBus[] eventBus, Display display) {
this.eventBus = eventBus[0];
this.display = display;
}
/**
* Binds this presenter to its view loading it with information and adding all the necessary handlers.
*/
public void bind() {
desktop = display.getDesktop();
desktop.getElement().getStyle().setPosition(Position.ABSOLUTE);
// desktop.getElement().getStyle().clearPosition();
TheSocialOS.get().setDesktop(desktop);
// Run the desktopManager
desktopManager = new DesktopManager(eventBus, display.getScreen(), display.getDesktop());
User user = CacheLayer.UserCalls.getUser();
ChatManager chatmanager = new ChatManager();
bindDesktopBar(user);
bindUserMenu(user);
bindContacts();
bindSearchBox();
bindPetitionsBox();
bindSocialOS();
bindProgramMenu();
bindAppManager();
bindUploadMenu();
bindSharedManager();
refreshData();
// Populate the Star Menu
ArrayList<DesktopUnit> appsData = new ArrayList<DesktopUnit>();
appsData.add(new FrameWindow("Bitlet", "http://imagenes.es.sftcdn.net/es/scrn/251000/251956/bitlet-13.png",
"http://www.bitlet.org/", AppConstants.OTHER, true));
appsData.add(new FrameWindow("Grooveshark Player",
"http://img696.imageshack.us/img696/1622/11groovesharkicon256x25.png", "http://www.grooveshark.com",
AppConstants.OTHER, true));
appsData.add(new FrameWindow("Sketchpad",
"http://profile.ak.fbcdn.net/hprofile-ak-snc4/23295_128946130463344_2641_n.jpg",
"http://mugtug.com/sketchpad", AppConstants.OTHER, true));
FrameWindow futbol = new FrameWindow("Supercampeones",
"http://4.bp.blogspot.com/-b803Ej85MZI/Tx7rRPF2KlI/AAAAAAAAAEE/oeyr6RE00Bc/s1600/suoercampeones.png",
"./WebPlayer/WebPlayer.html", AppConstants.OTHER, true);
futbol.setSize(800, 640);
appsData.add(futbol);
// appsData.add(new ChatApp("Xmpp","http://www.bitrix.es/upload/iblock/e03/xmpp.gif",chatEventBus, new
// ChatPanel(),
// "450px", "300px"));
bindStartMenu(appsData);
AppIconHelper.populateDesktopWithIcons(desktop);
}
private void bindContacts() {
display.getDesktopBar().getFocusContact().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (contacsPresenter == null) contacsPresenter = new ContactsPresenter(new ContactsView());
eventBus.fireEvent(new DesktopEventOnOpen(contacsPresenter));
}
});
}
/**
* Binds the DesktopBar elements and adds its handlers.
*
* @param user
* The data transfer object of the user that is logged in the system.
*/
private void bindDesktopBar(User user) {
// Create and initialize a timer for the clock refreshing
new Timer() {
@SuppressWarnings("deprecation")
@Override
public void run() {
int min = new Date().getMinutes();
display.getClock().setText(new Date().getHours() + ":" + (min < 10 ? "0" + min : min));
}
}.scheduleRepeating(1000);
// Populate the desktopBar and the userMenu with the user data.
display.getUserName().setText(user.getEmail());
display.getUserButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
display.getUserMenu().setVisible(true);
((FocusPanel) display.getUserButton()).addStyleName("userbar-focused");
((FocusPanel) display.getUserButton()).removeStyleName("userbar");
// ((FocusPanel)display.getUserButton()).setStylePrimaryName("userbar-focused");
((FocusPanel) display.getUserMenuPanel()).setFocus(true);
}
});
display.getStartButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
display.getStartMenu().setVisible(true);
((FocusPanel) display.getStartButton()).addStyleName("startbutton-focused");
((FocusPanel) display.getStartButton()).removeStyleName("startbutton");
((FocusPanel) display.getStartMenuPanel()).setFocus(true);
}
});
}
private void bindPetitionsBox() {
display.getDesktopBar().getPetitionsButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (notificationBoxPresenter == null)
notificationBoxPresenter = new NotificationsBoxPresenter(new NotificationsBoxView());
int x = display.getDesktopBar().getPetitionsButton().getAbsoluteLeft();
notificationBoxPresenter.setPosition(x, 0);
eventBus.fireEvent(new DesktopEventOnOpen(notificationBoxPresenter));
}
});
}
private void bindAppManager() {
display.getDesktopBar().getAppManagerButton().addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int x = display.getDesktopBar().getAppManagerButton().getAbsoluteLeft();
aplicationManagerPresenter.setPosition(x, 0);
eventBus.fireEvent(new DesktopEventOnOpen(aplicationManagerPresenter));
}
}, ClickEvent.getType());
}
private void bindProgramMenu() {
/*
* display.getDesktopBar().getProgramsButton().addClickHandler(new ClickHandler() {
* @Override public void onClick(ClickEvent event) { MenuBar menuBar = new MenuBar(true);
* menuBar.addItem(createMenuItem("Program1", AbstractImagePrototype.create(imageResources.logo()), null));
* menuBar.addItem(createMenuItem("Program2", AbstractImagePrototype.create(imageResources.logo()), null));
* MenuItem menuItem; // createMenuItem("Program3", AbstractImagePrototype.create(imageResources.logo()));
* MenuBar menuBar1 = new MenuBar(true); menuBar1.addItem(createMenuItem("Program3.1",
* AbstractImagePrototype.create(imageResources.logo()), null)); menuBar1.addItem(createMenuItem("Program3.2",
* AbstractImagePrototype.create(imageResources.logo()), null)); menuBar1.addItem(createMenuItem("Program3.3",
* AbstractImagePrototype.create(imageResources.logo()), null)); menuBar.addItem(getStringMenuparse("Program3",
* AbstractImagePrototype.create(imageResources.logo())), true, menuBar1);
* menuBar.addItem(createMenuItem("Program4", AbstractImagePrototype.create(imageResources.logo()), null));
* menuBar.addItem(createMenuItem("Program5", AbstractImagePrototype.create(imageResources.logo()), null));
* programPanel.setPopupPosition(event.getClientX(), event.getClientY()); programPanel.add(menuBar);
* programPanel.show(); // MenuItem me } });
*/
}
private void bindSearchBox() {
display.getDesktopBar().getSearchBox().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
if (searchBoxPresenter == null) searchBoxPresenter = new SearchBoxPresenter(new SearchBoxView());
int x = display.getDesktopBar().getSearchBox().getAbsoluteLeft();
searchBoxPresenter.setPosition(x, 0);
eventBus.fireEvent(new DesktopEventOnOpen(searchBoxPresenter));
}
});
}
private void bindSocialOS() {
final SocialDeckPresenter sdPresenter = new SocialDeckPresenter(new SocialDeck());
display.getSocialOSButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (initialized) sdPresenter.switchVisible();
else {
initialized = true;
sdPresenter.go(display.getDesktop());
}
}
});
}
private void bindStartMenu(ArrayList<DesktopUnit> appsData) {
display.getStartMenu().setVisible(false);
VerticalPanel vPanel = ((StartMenu) display.getStartMenu()).getStartVPanel();
for (int i = 0; i < appsData.size(); i++) {
StartMenuItem appItem = new StartMenuItem(appsData.get(i));
vPanel.add(appItem);
appItem.getFocusPanel().addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
startMenuFocused = true;
}
});
appItem.getFocusPanel().addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
startMenuFocused = false;
}
});
appItem.getFocusPanel().addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if (!startMenuFocused) loseStartFocus();
}
});
appItem.getFocusPanel().addMouseUpHandler(new MouseUpHandler() {
@Override
public void onMouseUp(MouseUpEvent event) {
loseStartFocus();
}
});
}
display.getStartMenuPanel().addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if (!startMenuFocused) loseStartFocus();
}
});
}
/**
* Bind the user menu elements and adds its handlers.
*
* @param user
* The data transfer object of the user that is logged on.
*/
private void bindUserMenu(User user) {
TheSocialOS.getEventBus().addHandler(AvatarUpdateEvent.TYPE, new AvatarUpdateEventHandler() {
@Override
public void onAvatarUpdate(AvatarUpdateEvent event) {
if (CacheLayer.UserCalls.getAvatar() == null) display.getAvatar().setUrl(
"./images/anonymous_avatar.png");
else
display.getAvatar().setUrl(CacheLayer.UserCalls.getAvatar());
}
});
if (user.getUrlAvatar() == null) display.getAvatar().setUrl("./images/anonymous_avatar.png");
else
display.getAvatar().setUrl(user.getUrlAvatar());
display.getNameLabel().setText(user.getName() + " " + user.getLastName());
display.getTitleLabel().setText("User");
display.getEmail().setText(""); // TODO the email is already at the top-right corner
display.getUserMenu().setVisible(false);
((FocusPanel) display.getEditProfilePanel()).addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
userMenuFocused = true;
}
});
((FocusPanel) display.getEditProfilePanel()).addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
userMenuFocused = false;
}
});
((FocusPanel) display.getEditProfilePanel()).addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if (!userMenuFocused) loseUserFocus();
}
});
display.getEditProfilePanel().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
loseUserFocus();
History.newItem("profile");
}
});
display.getLogoutPanel().addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
userMenuFocused = true;
}
});
display.getLogoutPanel().addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
userMenuFocused = false;
}
});
display.getLogoutPanel().addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if (!userMenuFocused) loseUserFocus();
}
});
display.getLogoutPanel().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
TheSocialOS.get();
TheSocialOS.getEventBus().fireEvent(new LogoutEvent());
}
});
display.getUserMenuPanel().addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if (!userMenuFocused) loseUserFocus();
}
});
}
/**
* Bind the upload Menu and wait to click Event to activate
*/
private void bindUploadMenu() {
display.getDesktopBar().getUploadButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
if (resourceUploadPresenter == null) resourceUploadPresenter = new ResourceUploadPresenter();
int x = display.getDesktopBar().getUploadButton().getAbsoluteLeft();
resourceUploadPresenter.setPosition(x, 0);
eventBus.fireEvent(new DesktopEventOnOpen(resourceUploadPresenter));
}
});
}
private void bindSharedManager() {
display.getDesktopBar().getSharedButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (sharedUnit == null) sharedUnit = new SharedUnit(new SharedView());
sharedUnit.setPosition(30, 30);
eventBus.fireEvent(new DesktopEventOnOpen(sharedUnit));
}
});
}
private MenuItem createMenuItem(String menuLabel, AbstractImagePrototype menuImage, Command command) {
MenuItem menuItem = new MenuItem(menuImage.getHTML() + " " + menuLabel, true, command);
return menuItem;
}
private String getStringMenuparse(String name, AbstractImagePrototype menuImage) {
return menuImage.getHTML() + " " + name;
}
@Override
public void go(final HasWidgets container) {
container.clear(); // Clear the screen
container.add(display.asWidget()); // Print the desktop screen
bind();
}
protected void loseStartFocus() {
startMenuFocused = false;
display.getStartMenu().setVisible(false);
((FocusPanel) display.getStartButton()).addStyleName("startbutton");
((FocusPanel) display.getStartButton()).removeStyleName("startbutton-focused");
}
/**
* makes the UserMenu invisible and restores the UserButtons default style. To be called when the focus of the
* UserMenu and its elements is lost.
*/
protected void loseUserFocus() {
userMenuFocused = false;
display.getUserMenu().setVisible(false);
((FocusPanel) display.getUserButton()).addStyleName("userbar");
((FocusPanel) display.getUserButton()).removeStyleName("userbar-focused");
}
/**
* Makes the run programs visible in the bar
*
* @param nodes
*/
public void makeProgramsPanel(List<Node> nodes) {
MenuBar menuBar = new MenuBar(true);
Iterator<Node> nodesIterator = nodes.iterator();
while (nodesIterator.hasNext()) {
Node node = nodesIterator.next();
Iterator<Node> nodeIterator = node.getNodeIterator();
MenuBar subMenuBar = new MenuBar(true);
if (nodeIterator.hasNext()) {
while (nodeIterator.hasNext()) {
Node subnode = nodeIterator.next();
subMenuBar.addItem(createMenuItem(subnode.getName(),
AbstractImagePrototype.create(imageResources.logo()), subnode.getCommand()));
}
menuBar.addItem(
getStringMenuparse(node.getName(), AbstractImagePrototype.create(imageResources.logo())), true,
subMenuBar);
} else
menuBar.addItem(createMenuItem(node.getName(), AbstractImagePrototype.create(imageResources.logo()),
node.getCommand()));
}
}
/**
* Refresh all information of the desktop: Group Petitions, User Petitions, Chat...
*/
private void refreshData() {
CacheLayer.ContactCalls.getContactPetitions(false, new AsyncCallback<Map<String, User>>() {
@Override
public void onFailure(Throwable caught) {
TheSocialOS.getEventBus().fireEvent(new ContactsPetitionChangeEvent());
}
@Override
public void onSuccess(Map<String, User> result) {
// TODO Auto-generated method stub
TheSocialOS.getEventBus().fireEvent(new ContactsPetitionChangeEvent());
}
});
}
}