package org.vaadin.teemu.clara.demo; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import org.vaadin.teemu.clara.Clara; import org.vaadin.teemu.clara.binder.BinderException; import org.vaadin.teemu.clara.binder.annotation.UiDataSource; import org.vaadin.teemu.clara.binder.annotation.UiField; import org.vaadin.teemu.clara.binder.annotation.UiHandler; import org.vaadin.teemu.clara.inflater.LayoutInflaterException; import com.vaadin.annotations.Theme; import com.vaadin.data.Property; import com.vaadin.data.util.ObjectProperty; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.server.VaadinRequest; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; import com.vaadin.ui.TextArea; import com.vaadin.ui.UI; @SuppressWarnings("serial") @Theme("clara") public class DemoUI extends UI { private DemoController controller; @UiField("xmlArea") private TextArea xmlArea; private HorizontalSplitPanel split; @UiField("statusLabel") private Label statusLabel; @UiField("resultPanel") private Panel resultPanel; @Override public void init(VaadinRequest request) { // Create the content from xml. split = (HorizontalSplitPanel) Clara .create("DemoApplication.xml", this); setContent(split); // Initial update controller = new DemoController(); updateResultPanel((String) xmlArea.getValue()); } /** * Returns the content of {@code demo-layout.xml} as a {@link String}. */ @UiDataSource("xmlArea") public Property<String> readStartingPoint() { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(getClass() .getClassLoader().getResourceAsStream("demo-layout.xml"))); StringBuilder xml = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { xml.append(line); xml.append("\n"); } return new ObjectProperty<String>(xml.toString()); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } private void setErrorStatus(String message) { statusLabel.setValue(message); statusLabel.addStyleName("error"); } private void setOkStatus(String message) { statusLabel.setValue(message); statusLabel.removeStyleName("error"); } @UiHandler("xmlArea") public void updateLayout(TextChangeEvent event) { try { long startTime = System.currentTimeMillis(); updateResultPanel(event.getText()); long endTime = System.currentTimeMillis(); setOkStatus("Layout updated in " + (endTime - startTime) + "ms."); } catch (LayoutInflaterException e) { setErrorStatus(e.getMessage()); } } private void updateResultPanel(String xml) { try { Component c = Clara.create( new ByteArrayInputStream(xml.getBytes()), controller); resultPanel.setContent(c); } catch (BinderException e) { Notification.show(e.getMessage(), Notification.Type.ERROR_MESSAGE); } } }