package net.thesocialos.client.presenter;
import java.util.ArrayList;
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.desktop.DesktopUnit;
import net.thesocialos.client.desktop.IsTypeInfo;
import net.thesocialos.client.event.ContactsPetitionChangeEvent;
import net.thesocialos.client.view.LabelText;
import net.thesocialos.client.view.PopAsker;
import net.thesocialos.client.view.PopUpInfoContact;
import net.thesocialos.client.view.PopUpMenu;
import net.thesocialos.shared.model.User;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.Command;
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.StackLayoutPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
public class NotificationsBoxPresenter extends DesktopUnit implements IsTypeInfo {
public interface Display {
Widget asWidget();
CellList<User> getContactsCellList();
LabelText getContactsLabelText();
LabelText getGroupsLabelText();
StackLayoutPanel getStackLayoutPanel();
VerticalPanel getPanel();
}
Display display;
SingleSelectionModel<User> selectionModel;
ListDataProvider<User> dataProvider;
PopUpMenu UserPopUpMenu;
/*
* Los modelos de la cajas de seleccion de los usuarios
*/
ProvidesKey<User> KEY_USERS_PROVIDER;
List<User> usersList = new ArrayList<User>();
public NotificationsBoxPresenter(Display display) {
super(AppConstants.NOTIFICATIONS, "Notifications", null, TypeUnit.INFO, false);
this.display = display;
KEY_USERS_PROVIDER = new ProvidesKey<User>() {
@Override
public Object getKey(User item) {
return item == null ? null : item.getEmail();
}
};
/*
* Inicializado el adaptador de la cellList de usuario
*/
selectionModel = new SingleSelectionModel<User>(KEY_USERS_PROVIDER);
display.getContactsCellList().setSelectionModel(selectionModel);
dataProvider = new ListDataProvider<User>(usersList);
dataProvider.addDataDisplay(display.getContactsCellList());
display.getContactsLabelText().setText("0");
// display.getGroupsLabelText().setText("0");
handlers();
getContactPetitions(true);
}
@Override
public void close(final AbsolutePanel absolutePanel) {
Timer timer = new Timer() {
@Override
public void run() {
absolutePanel.remove(display.asWidget());
display.asWidget().setVisible(false);
}
};
display.getPanel().setStyleName("contactsBoxes_close", true);
display.getPanel().setStyleName("contactsBoxes_open", false);
timer.schedule(500);
}
@Override
public int getWidth() {
return display.asWidget().getOffsetWidth();
}
@Override
public int getHeight() {
return display.asWidget().getOffsetHeight();
}
@Override
public int getAbsoluteLeft() {
return display.asWidget().getAbsoluteLeft();
}
@Override
public int getAbsoluteTop() {
return display.asWidget().getAbsoluteTop();
}
private void getContactPetitions(Boolean cached) {
usersList.clear();
dataProvider.flush();
dataProvider.refresh();
CacheLayer.ContactCalls.getContactPetitions(cached, new AsyncCallback<Map<String, User>>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(Map<String, User> result) {
// TODO Auto-generated method stub
display.getStackLayoutPanel().setHeaderText(0, "Contact: " + result.size());
display.getContactsLabelText().setText(Integer.toString(result.size()));
usersList.addAll(result.values());
dataProvider.flush();
dataProvider.refresh();
TheSocialOS.getEventBus().fireEvent(new ContactsPetitionChangeEvent());
}
});
}
@Override
public int getZposition() {
// TODO Auto-generated method stub
return 0;
}
private void handlers() {
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
}
});
display.getContactsCellList().addCellPreviewHandler(new CellPreviewEvent.Handler<User>() {
@Override
public void onCellPreview(CellPreviewEvent<User> event) {
System.out.println(event.getNativeEvent().getClientX());
if (event.getNativeEvent().getClientX() != 0) {
UserPopUpMenu = new PopUpMenu();
popupHandlers(event.getValue());
UserPopUpMenu.show(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY());
selectionModel.setSelected(event.getValue(), true);
}
}
});
}
@Override
public void open(AbsolutePanel absolutePanel) {
absolutePanel.add(display.asWidget(), x, y);
display.asWidget().setVisible(true);
display.getPanel().setStyleName("contactsBoxes_open", true);
display.getPanel().setStyleName("contactsBoxes_close", false);
}
private void popupHandlers(final User user) {
UserPopUpMenu.getMenuIAccept().setCommand(new Command() {
@Override
public void execute() {
CacheLayer.ContactCalls.acceptAContact(user, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(Boolean result) {
// TODO Auto-generated method stub
getContactPetitions(false);
CacheLayer.ContactCalls.updateContacts(null);
}
});
UserPopUpMenu.hide();
}
});
UserPopUpMenu.getMenuIDeny().setCommand(new Command() {
@Override
public void execute() {
CacheLayer.ContactCalls.denyAContact(user, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(Boolean result) {
getContactPetitions(false);
}
});
UserPopUpMenu.hide();
}
});
UserPopUpMenu.getMenuISendPriv().setCommand(new Command() {
@Override
public void execute() {
new PopAsker("Not implemented yet");
UserPopUpMenu.hide();
}
});
UserPopUpMenu.getMenuIViewPerfil().setCommand(new Command() {
@Override
public void execute() {
PopUpInfoContact contactInfoPopup = new PopUpInfoContact(user.getEmail(), user.getName(), user
.getLastName(), user.getUrlAvatar());
contactInfoPopup.setGlassEnabled(true);
contactInfoPopup.center();
contactInfoPopup.show();
UserPopUpMenu.hide();
}
});
}
@Override
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void setSize(int height, int width) {
// TODO Auto-generated method stub
}
@Override
public void toBack() {
}
@Override
public void toFront() {
}
@Override
public void toZPosition(int position) {
// TODO Auto-generated method stub
}
}