package org.vaadin.mideaas.frontend;
import java.util.Arrays;
import java.util.List;
import org.vaadin.mideaas.frontend.Builder.BuildListener;
import org.vaadin.mideaas.model.User;
import org.vaadin.mideaas.model.UserSettings;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class BuildComponent extends CustomComponent implements BuildListener {
private final Builder builder;
private final User user;
private final VerticalLayout layout = new VerticalLayout();
private final LogView logView = new LogView();
private Button buildButton = new Button("Build");
private Button cancelButton = new Button("Cancel");
private Button showLogButton = new ShowLogButton("Build Log", logView);
private VerticalLayout resultLayout = new VerticalLayout();
private Embedded loadingImg = new Embedded(null, new ThemeResource(
"../base/common/img/loading-indicator.gif"));
private static final List<String> GOALS_PACKAGE = Arrays
.asList(new String[] { "vaadin:update-widgetset", "vaadin:compile", "package" });
// private List<String> goals = GOALS_PACKAGE;
// private boolean firstBuild = true;
private UI ui;
private final UserSettings settings;
public BuildComponent(Builder builder, User user, UserSettings settings) {
this.builder = builder;
this.user = user;
this.settings = settings;
Panel p = new Panel("Build");
p.setContent(layout);
setCompositionRoot(p);
layout.setMargin(true);
layout.addComponent(buildButton);
layout.addComponent(resultLayout);
layout.addComponent(loadingImg);
layout.addComponent(cancelButton);
layout.addComponent(showLogButton);
loadingImg.setVisible(false);
cancelButton.setVisible(false);
layout.setExpandRatio(buildButton, 1);
layout.setComponentAlignment(buildButton, Alignment.MIDDLE_CENTER);
layout.setComponentAlignment(loadingImg, Alignment.MIDDLE_CENTER);
layout.setComponentAlignment(cancelButton, Alignment.MIDDLE_CENTER);
layout.setComponentAlignment(showLogButton, Alignment.MIDDLE_CENTER);
buildButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
logView.clear();
build(GOALS_PACKAGE);
}
});
cancelButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
cancelBuild();
}
});
}
@Override
public void attach() {
super.attach();
setUi(UI.getCurrent());
builder.addBuildListener(this);
}
@Override
public void detach() {
super.detach();
builder.removeBuildListener(this);
}
private synchronized void setUi(UI ui) {
this.ui = ui;
}
private synchronized UI getUi() {
return ui;
}
public void cancelBuild() {
builder.cancel();
}
private void build(List<String> goals) {
builder.build(goals, MavenUtil.targetDirFor(user), settings.userAgent, logView);
}
private void finishBuild() {
loadingImg.setVisible(false);
buildButton.setEnabled(true);
buildButton.setCaption("Build");
cancelButton.setVisible(false);
}
private void buildFail(String s) {
Label lab = new Label(s);
lab.setIcon(Icons.CROSS_CIRCLE);
lab.setSizeUndefined();
resultLayout.addComponent(lab);
resultLayout.setComponentAlignment(lab, Alignment.MIDDLE_CENTER);
}
private void buildSuccess() {
Label lab = new Label("Build successful");
lab.setIcon(Icons.TICK_CIRCLE);
lab.setSizeUndefined();
resultLayout.addComponent(lab);
resultLayout.setComponentAlignment(lab, Alignment.MIDDLE_CENTER);
}
@Override
public void buildFinished(final boolean success) {
getUi().access(new Runnable() {
@Override
public void run() {
finishBuild();
if (success) {
buildSuccess();
} else {
buildFail("Build failed.");
}
}
});
}
@Override
public void buildCancelled() {
getUi().access(new Runnable() {
@Override
public void run() {
finishBuild();
buildFail("Build cancelled");
}
});
}
@Override
public void buildStarted(List<String> goals) {
getUi().access(new Runnable() {
@Override
public void run() {
buildButton.setEnabled(false);
resultLayout.removeAllComponents();
cancelButton.setVisible(true);
loadingImg.setVisible(true);
loadingImg.setCaption("Building...");
}
});
}
}