package floobits.windows;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import floobits.common.FlooUrl;
import floobits.common.interfaces.IContext;
import floobits.common.protocol.FlooUser;
import floobits.common.protocol.handlers.FlooHandler;
import floobits.impl.ContextImpl;
import java.util.Date;
public class FloobitsWindowManager {
protected IContext context;
protected ToolWindow toolWindow;
protected FloobitsWindowForm chatForm;
public FloobitsWindowManager(ContextImpl context) {
this.context = context;
chatForm = new FloobitsWindowForm(context);
this.createChatWindow(context.project);
}
protected void createChatWindow(Project project) {
ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
toolWindow = toolWindowManager.registerToolWindow("Floobits", true, ToolWindowAnchor.BOTTOM);
toolWindow.setIcon(IconLoader.getIcon("/icons/floo13.png"));
Content content = ContentFactory.SERVICE.getInstance().createContent(chatForm.getChatPanel(), "", true);
toolWindow.getContentManager().addContent(content);
updateTitle();
}
public void openFloobitsWindow() {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
if (toolWindow == null) {
return;
}
toolWindow.show(null);
}
});
}
public void closeFloobitsWindow() {
toolWindow.hide(null);
}
public void toggleFloobitsWindow() {
if (isOpen()) {
closeFloobitsWindow();
} else {
openFloobitsWindow();
}
}
public boolean isOpen() {
try {
return toolWindow.isVisible();
} catch (IllegalStateException e) {
return false;
}
}
public void clearUsers() {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.clearClients();
updateTitle();
}
}, ModalityState.NON_MODAL);
}
public void addUser(final FlooUser user) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.addUser(user);
}
}, ModalityState.NON_MODAL);
}
public void statusMessage(final String message) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.statusMessage(message);
}
}, ModalityState.NON_MODAL);
}
public void errorMessage(final String message) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.errorMessage(message);
}
}, ModalityState.NON_MODAL);
}
public void chatMessage(final String username, final String msg, final Date messageDate) {
if (context.lastChatMessage != null && context.lastChatMessage.compareTo(messageDate) > -1) {
// Don't replay previously shown chat messages.
return;
}
context.lastChatMessage = messageDate;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.chatMessage(username, msg, messageDate);
}
}, ModalityState.NON_MODAL);
}
public void removeUser(final FlooUser user) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
chatForm.removeUser(user);
}
}, ModalityState.NON_MODAL);
}
public void updateUserList() {
Application app = ApplicationManager.getApplication();
if (app == null) {
return;
}
app.invokeLater(new Runnable() {
@Override
public void run() {
FlooHandler flooHandler = context.getFlooHandler();
if (flooHandler == null) {
return;
}
chatForm.updateGravatars();
chatForm.updateFollowing(flooHandler.state.followedUsers);
updateTitle();
}
}, ModalityState.NON_MODAL);
}
protected void updateTitle() {
FlooHandler flooHandler = context.getFlooHandler();
if (flooHandler == null) {
toolWindow.setTitle("- not currently connected.");
return;
}
FlooUrl url = flooHandler.getUrl();
int numClients = flooHandler.state.users.size();
toolWindow.setTitle(String.format(
"- %s as %s. %d client%s connected.",
url.toString(),
flooHandler.state.username,
numClients,
numClients == 1 ? "" : "s"
));
}
}