package org.vaadin.mideaas.app;
import java.util.TreeSet;
import org.vaadin.chatbox.ChatBox;
import org.vaadin.chatbox.SharedChat;
import org.vaadin.chatbox.client.ChatUser;
import org.vaadin.mideaas.frontend.HorizontalUserList;
import org.vaadin.mideaas.frontend.Icons;
import org.vaadin.mideaas.model.LobbyBroadcastListener;
import org.vaadin.mideaas.model.LobbyBroadcaster;
import org.vaadin.mideaas.model.User;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
import com.vaadin.ui.themes.Runo;
@SuppressWarnings("serial")
public class LobbyView extends VerticalLayout implements View, LobbyBroadcastListener {
// XXX Is this the right place to store this?
private static SharedChat chat = new SharedChat();
public static SharedChat getLobbyChat() {
return chat;
}
final private MideaasUI ui;
private User user;
private SelectProjectPanel selectProjectPanel;
private HorizontalUserList userList;
private ChatBox box = null;
public LobbyView(MideaasUI ui) {
this.ui = ui;
setSizeFull();
}
@Override
public void enter(ViewChangeEvent event) {
user = ui.getUser();
if (user!=null) {
//System.out.println("loby view entered");
setMargin(true);
//setSizeUndefined();
setSpacing(true);
setSizeFull();
initLobbyPanel();
LobbyBroadcaster.register(this);
}
else {
setMargin(false);
addComponent(new LoginView(ui, "lobby"));
}
}
@Override
public void detach() {
super.detach();
//System.out.println("lobby viw detached");
unregisetrFromLobbyBroadcaster();
//LobbyBroadcaster.unregister(this);
}
@Override
public void attach() {
super.attach();
//System.out.println("Lobby View attached");
}
public void unregisetrFromLobbyBroadcaster() {
LobbyBroadcaster.unregister(this);
}
private void initLobbyPanel() {
removeAllComponents();
addComponent(initLogoutButton(user));
TabSheet tabSheet = new TabSheet();
tabSheet.addStyleName(Runo.TABSHEET_SMALL);
addComponent(tabSheet);
tabSheet.setSizeFull();
tabSheet.addTab(getSelectProjectPanel(),"Open Project", Icons.BOX_ARROW);
tabSheet.addTab(initCreateProjectPanel(), "Create New Project");
if (MideaasConfig.easiCloudsFeaturesTurnedOn()) {
tabSheet.addTab(initUploadPanel(), "Upload Project", Icons.BOX_LABEL);
}
tabSheet.addTab(initGitProjectPanel(), "Clone Project From Git URL");
setExpandRatio(tabSheet, 2);
/*
HorizontalLayout horizLayout = new HorizontalLayout();
horizLayout.setWidth("100%");
addComponent(initLogoutButton(user));
addComponent(horizLayout);
setExpandRatio(horizLayout, 1);
VerticalLayout leftLayout = new VerticalLayout();
VerticalLayout rightLayout = new VerticalLayout();
leftLayout.setMargin(true);
rightLayout.setMargin(true);
rightLayout.setSpacing(true);
horizLayout.addComponent(leftLayout);
horizLayout.addComponent(rightLayout);
leftLayout.addComponent(getSelectProjectPanel());
rightLayout.addComponent(initCreateProjectPanel());
if (MideaasConfig.easiCloudsFeaturesTurnedOn()) {
rightLayout.addComponent(initUploadPanel());
}
rightLayout.addComponent(initGitProjectPanel());
*/
userList = new HorizontalUserList(MideaasUI.getLoggedInUsers());
addComponent(userList);
Panel chatPanel = new Panel();
//chatPanel.setHeight("200px");
VerticalLayout chatPanelLayout = new VerticalLayout();
//chatPanelLayout.setHeight("150px");
chatPanel.setContent(chatPanelLayout);
MenuBar chatPanelMenubar = new MenuBar();
chatPanelLayout.addComponent(chatPanelMenubar);
chatPanelMenubar.setWidth("100%");
MenuBar.Command hideChatBox = new MenuBar.Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
// TODO Auto-generated method stub
if ( box.isVisible()) {
box.setVisible(false);
selectedItem.setIcon(new ThemeResource("icons/arrow-up.png"));
selectedItem.setDescription("Show Chat Box");
}
else {
box.setVisible(true);
selectedItem.setIcon(new ThemeResource("icons/arrow-down.png"));
selectedItem.setDescription("Hide Chat Box");
}
}
};
MenuItem hideChatMeuItem = chatPanelMenubar.addItem("Hide/Show", new ThemeResource("icons/arrow-down.png"), hideChatBox);
hideChatMeuItem.setDescription("Hide Chat Box");
MenuBar.Command hideLoggedinUsers = new MenuBar.Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
// TODO Auto-generated method stub
if (userList.isVisible()) {
userList.setVisible(false);
selectedItem.setDescription("Show Users");
}
else {
userList.setVisible(true);
selectedItem.setDescription("Hide Users");
}
}
};
MenuItem showLogedinUsersMenuItem = chatPanelMenubar.addItem("Show/Hide Users", new ThemeResource("icons/users.png"), hideLoggedinUsers);
showLogedinUsersMenuItem.setDescription("Hide Users");
box = new ChatBox(chat);
box.setSizeFull();
box.setWidth("100%");
box.setHeight("150px");
box.setUser(new ChatUser(user.getUserId(), user.getName(), "user1"));
box.setShowSendButton(false);
chatPanelLayout.addComponent(box);
//chatPanelLayout.setExpandRatio(box, 1);
//Panel chatPanel = new Panel("Lobby Chat", box);
//chatPanel.addStyleName("f-v-panel");
//addComponent(new Panel("Lobby Chat", box));
//addComponent(chatPanel);
addComponent(chatPanel);
}
private Panel initGitProjectPanel() {
Panel panel = new Panel("Or clone project from Git URL:");
VerticalLayout layout = new VerticalLayout();
final TextField field = new TextField();
field.setWidth("100%");
final Button button = new Button("Project from Git");
button.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
ui.createGitProject(field.getValue());
}
});
layout.addComponent(field);
layout.addComponent(button);
panel.setContent(layout);
return panel;
}
private Button initLogoutButton(User user) {
Button button = new Button("Log Out " + user.getName());
//button.setStyleName(BaseTheme.BUTTON_LINK);
button.setStyleName(Reindeer.BUTTON_LINK);
button.addClickListener(new ClickListener() {
public void buttonClick(ClickEvent event) {
unregisetrFromLobbyBroadcaster();
ui.logout();
}
});
return button;
}
private SelectProjectPanel getSelectProjectPanel() {
if (selectProjectPanel==null) {
selectProjectPanel = new SelectProjectPanel(ui);
}
return selectProjectPanel;
}
private Panel initCreateProjectPanel() {
return new CreateProjectPanel(ui);
}
private Panel initUploadPanel() {
return new UploadProjectPanel(ui);
}
@Override
public void projectsChanged() {
getUI().access(new Runnable() {
@Override
public void run() {
selectProjectPanel.update();
}
});
}
/*
@Override
public void loggedInUsersChanged(final Set<User> users) {
getUI().access(new Runnable() {
@Override
public void run() {
userList.setUsers(users);
//Notification.show(users., "logged in", Type.TRAY_NOTIFICATION);
}
});
}
*/
@Override
public void loggedInUsersChanged(final TreeSet<User> users, final User user1, final boolean loggedin) {
getUI().access(new Runnable() {
@Override
public void run() {
userList.setUsers(users);
Notification notif = new Notification( user1.getName(), Type.TRAY_NOTIFICATION);
// Customize it
notif.setDelayMsec(1000);
// Show it in the page
if (loggedin) {
notif.setDescription("logged in");
//notif.show(ui.getPage());
}
else {
//if (user.getUserId() != this.)
notif.setDescription("logged out");
}
notif.show(ui.getPage());
}
});
}
}