package org.vaadin.mideaas.frontend; import java.util.LinkedList; import org.vaadin.mideaas.frontend.MavenTask.LogListener; import com.vaadin.shared.ui.label.ContentMode; 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.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; @SuppressWarnings("serial") public class LogView extends CustomComponent implements LogListener { private final Panel logPanel = new Panel(); private final VerticalLayout logLayout = new VerticalLayout(); private LinkedList<String> logBeforeAttach = new LinkedList<String>(); private UI ui; public LogView() { super(); VerticalLayout la = new VerticalLayout(); la.setSizeFull(); Button clearButton = new Button("Clear"); logLayout.addComponent(clearButton); clearButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { clear(); } }); la.addComponent(clearButton); la.addComponent(logPanel); la.setExpandRatio(logPanel, 1); logPanel.setContent(logLayout); logPanel.setSizeFull(); setCompositionRoot(la); } @Override public void attach() { super.attach(); showLog(logBeforeAttach); setUi(UI.getCurrent()); } public void clear() { logBeforeAttach.clear(); logLayout.removeAllComponents(); } private void showLog(LinkedList<String> log) { for (String li : log) { showNewLogLine(li); } } private void showNewLogLine(String li) { Label lab; if (li.startsWith("[ERROR]")) { lab = new Label("<strong>"+li+"</strong>", ContentMode.HTML); } else { lab = new Label(li); } logLayout.addComponent(lab); } private synchronized UI getUi() { return ui; } private synchronized void setUi(UI ui) { this.ui = ui; } @Override public void newLine(final String line) { UI ui = getUi(); if (ui!=null) { // attached ui.access(new Runnable() { @Override public void run() { showNewLogLine(line); logPanel.setScrollTop(999999); // ? } }); } else { logBeforeAttach.add(line); } } }