package org.vaadin.mideaas.frontend;
import java.util.List;
import org.vaadin.aceeditor.SuggestionExtension;
import org.vaadin.chatbox.ChatBox;
import org.vaadin.chatbox.client.ChatUser;
import org.vaadin.mideaas.editor.MultiUserEditor;
import org.vaadin.mideaas.frontend.ProjectItemList.Listener;
import org.vaadin.mideaas.java.JavaErrorChecker;
import org.vaadin.mideaas.java.JavaSuggester;
import org.vaadin.mideaas.model.ProjectFile;
import org.vaadin.mideaas.model.ProjectItem;
import org.vaadin.mideaas.model.SharedProject;
import org.vaadin.mideaas.model.SharedView;
import org.vaadin.mideaas.model.User;
import org.vaadin.mideaas.model.UserSettings;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class MideaasEditor extends CustomComponent implements Listener {
public interface CloseHandler {
public void closeRequested(SharedProject project);
}
private final SharedProject project;
private final User user;
private final UserSettings settings;
private final VerticalLayout layout = new VerticalLayout();
private com.vaadin.ui.MenuBar menu;
private HorizontalSplitPanel split;
private VerticalLayout sideBar;
private BuildComponent buildComponent;
private String activeComponentName;
private Component activeEditor;
private ProjectItemList componentTree;
private final Builder builder;
private List<MideaasEditorPlugin> plugins;
private CloseHandler closeHandler;
private boolean testingEnabled;
public MideaasEditor(User user, SharedProject project, UserSettings settings, List<MideaasEditorPlugin> plugins) {
super();
this.project = project;
this.user = user;
this.settings = settings;
this.plugins = plugins;
builder = new Builder(project,settings);
componentTree = new ProjectItemList(project, user);
layout.setSizeFull();
setCompositionRoot(layout);
}
public void setCloseHandler(CloseHandler ha) {
if (menu!=null && closeHandler==null) {
addCloseMenu();
}
this.closeHandler = ha;
}
@Override
public void attach() {
super.attach();
createLayout();
componentTree.addComponentListener(this);
}
@Override
public void detach() {
project.removeUser(user);
super.detach();
}
private void createLayout() {
setSizeFull();
buildComponent = new BuildComponent(builder, user, settings);
initMenuBar();
layout.addComponent(menu);
menu.setWidth("100%");
split = new HorizontalSplitPanel();
split.setSizeFull();
layout.addComponent(split);
layout.setExpandRatio(split, 1);
sideBar = new VerticalLayout();
sideBar.setMargin(true);
split.setFirstComponent(sideBar);
sideBar.addComponent(componentTree);
sideBar.addComponent(buildComponent);
//adds delpoy component to view
if (settings.paasDeployTurnedOn){
sideBar.addComponent(new DeployComponent(project, settings,user));
}
sideBar.addComponent(new JettyComponent(project, user));
ChatBox cb = new ChatBox(project.getChat());
cb.setUser(new ChatUser(user.getUserId(), user.getName(), "user1"));
cb.setWidth("100%");
cb.setShowSendButton(false);
sideBar.addComponent(new Panel("Chat", cb));
split.setSplitPosition(20.0f);
setActiveFile((ProjectFile) project.getProjectItem("App.java"));
//adds new menuitem (that does not do anything)
/*if (settings.easiCloudsFeaturesTurnedOn){
MenuItem root = this.menu.addItem("Deploy to...",null);
MenuItem item = root.addItem("Jetty", null);
item.setCheckable(true);
item.setChecked(true);
item = root.addItem("Gae", null);
item.setCheckable(true);
item.setChecked(false);
}*/
}
private void initMenuBar() {
menu = new MenuBar();
String buildDir = MavenUtil.targetDirFor(user);
// MenuBarUtil.addBuildMenu(menu, builder, buildDir);
MenuBarUtil.addAddonMenu(menu, project);
MenuBarUtil.addPanicMenu(menu, project, builder, buildDir);
for (MideaasEditorPlugin plugin : plugins) {
plugin.extendMenu(menu, this.project);
}
if (closeHandler!=null) {
addCloseMenu();
}
}
private void addCloseMenu() {
menu.addItemBefore("Close", null, new Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
closeHandler.closeRequested(project);
}}, menu.getItems().get(0) /* assuming at least one item */);
}
private void setActiveComponent(SharedView component) {
activeEditor = new MideaasComponentEditor(user, component, project);
((MideaasComponentEditor) activeEditor).setTestingEnabled(testingEnabled);
split.setSecondComponent(activeEditor);
activeComponentName = component.getName();
}
@Override
public void projectItemSelected(String name) {
ProjectItem item = project.getProjectItem(name);
if (item==null) {
System.err.println("WARNING: " + name + " doesn't exist!");
return;
}
if (item.getName().equals(activeComponentName)) {
return;
}
if (item instanceof SharedView) {
setActiveComponent((SharedView) item);
}
else if (item instanceof ProjectFile) {
setActiveFile((ProjectFile) item);
}
}
private void setActiveFile(ProjectFile f) {
MultiUserEditor ed = f.createEditor(user);
if (f.getName().endsWith(".java")) {
String cls = f.getName().substring(0, f.getName().length()-5);
String fullCls = project.getPackageName() + "." + cls;
JavaErrorChecker checker = new JavaErrorChecker(fullCls, project.getCompiler());
ed.setErrorChecker(checker);
JavaSuggester sugger = new JavaSuggester(project.getCompiler().getInMemoryCompiler(), fullCls, f.getMud());
ed.setSuggestionExtension(new SuggestionExtension(sugger));
}
ed.setSizeFull();
activeEditor = ed;
split.setSecondComponent(activeEditor);
activeComponentName = f.getName();
}
public void setTestingEnabled(boolean enabled) {
testingEnabled = enabled;
}
}