package org.ninjadev.multivim.client.net;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import org.ninjadev.multivim.Buffer;
import org.ninjadev.multivim.Cursor;
import org.ninjadev.multivim.CursorData;
import org.ninjadev.multivim.IServer;
import org.ninjadev.multivim.Message;
import org.ninjadev.multivim.Position;
import org.ninjadev.multivim.User;
import org.ninjadev.multivim.UserData;
import org.ninjadev.multivim.ViewPort;
import org.ninjadev.multivim.client.Client;
import org.ninjadev.multivim.net.IMessageHandler;
import com.googlecode.lanterna.input.Key;
@SuppressWarnings("unchecked")
public class MessageHandler implements IMessageHandler{
Client client;
IServer server;
public MessageHandler(Client client){
this.client = client;
}
public void processMessage(Message message) throws Exception{
System.out.println("Message: " + message.command);
switch(message.command){
case "setCursor": setCursor(message.payload); break;
case "allBuffers": allBuffers(message.payload); break;
case "allUsers": allUsers(message.payload); break;
case "addUser": addUser(message.payload); break;
case "removeUser": removeUser(message.payload); break;
case "identity": identity(message.payload); break;
case "sendCommand": sendCommand(message.payload); break;
case "render" : render(message.payload); break;
case "addViewPort" : addViewPort(message.payload); break;
case "setActiveViewPort" : setActiveViewPort(message.payload); break;
default:break;
}
}
private void render(Object payload) {
client.render();
}
private void sendCommand(Object payload) throws IOException {
Object[] o = (Object[]) payload;
int userId = (int) o[0];
Key command = (Key) o[1];
client.users.get(userId).processCommand(command);
client.render();
}
private void addViewPort(Object payload){
Object[]o = (Object[]) payload;
int userId = (int) o[0];
int bufferId = (int) o[1];
ViewPort viewPort = new ViewPort();
viewPort.buffer = client.buffers.get(bufferId);
client.users.get(userId).viewPorts.add(viewPort);
}
private void setActiveViewPort(Object payload){
Object[]o = (Object[]) payload;
int userId = (int) o[0];
int viewPortId = (int) o[1];
User user = client.users.get(userId);
user.setActiveBuffer(user.viewPorts.get(viewPortId));
}
private void addUser(Object payload){
Object[]o = (Object[]) payload;
UserData userData = (UserData)o[0];
if(userData.userId == client.selfUser.getUserId()) return;
User user = new User();
user.data = (UserData)o[0];
for(Buffer buffer : client.buffers){
if(!user.cursors.containsKey(buffer.bufferId)){
user.cursors.put(buffer.bufferId, new Cursor(buffer, user));
}
}
client.users.put(user.getUserId(), user);
user.activeViewPort.setBuffer(client.buffers.getFirst());
client.osd.displayMessage("User " + user + " has joined");
client.render();
}
private void removeUser(Object payload){
UserData userData = (UserData) payload;
User user = client.users.get(userData.userId);
client.users.remove(user.getUserId());
client.osd.displayMessage("User " + user + " has disconnected");
client.render();
}
private void identity(Object payload){
UserData userData = (UserData)((Object[])payload)[0];
client.selfUser = client.createUser(userData);
client.users.put(client.selfUser.getUserId(), client.selfUser);
client.osd.displayMessage("Connected!");
}
private void allBuffers(Object payload) throws ClassNotFoundException, IOException {
client.buffers = (LinkedList<Buffer>) payload;
client.selfUser.activeViewPort.setBuffer(client.buffers.getFirst());
for(Integer userId : client.users.keySet()){
User user = client.users.get(userId);
for(Buffer buffer : client.buffers){
if(!user.cursors.containsKey(buffer.bufferId)){
user.cursors.put(buffer.bufferId, new Cursor(buffer, user));
}
}
user.activeViewPort.setBuffer(client.buffers.getFirst());
}
}
private void allUsers(Object payload) throws ClassNotFoundException, IOException {
ArrayList<UserData> allUsers = (ArrayList<UserData>)payload;
System.out.println("Allusers! " + allUsers);
for(UserData ud : allUsers){
if(!client.users.containsKey(ud.userId)){
User user = client.createUser(ud);
client.users.put(user.getUserId(), user);
}
}
for(Integer userId : client.users.keySet()){
User user = client.users.get(userId);
for(Buffer buffer : client.buffers){
if(!user.cursors.containsKey(buffer.bufferId)){
user.cursors.put(buffer.bufferId, new Cursor(buffer, user));
}
}
}
}
private void setCursor(Object payload) throws IOException {
Object[] o = (Object[])payload;
int userId = (int) o[0];
int bufferId = (int) o[1];
Position position = (Position) o[2];
int desiredColumn = (int) o[3];
Cursor cursor = client.users.get(userId).getCursor(bufferId);
cursor.data.position = new Position(position);
cursor.desiredColumn = desiredColumn;
if(userId == client.selfUser.getUserId()){
client.selfUser.activeViewPort.scroll(position);
}
client.render();
}
}