package pl.net.bluesoft.rnd.processtool.ui.basewidgets;
import com.vaadin.terminal.Sizeable;
import com.vaadin.ui.*;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolVaadinRenderable;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolVaadinWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AperteDoc;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.ChildrenAllowed;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.WidgetGroup;
import pl.net.bluesoft.rnd.processtool.ui.widgets.impl.BaseProcessToolVaadinWidget;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.vaadin.ui.Label.CONTENT_XHTML;
/**
* @author tlipski@bluesoft.net.pl
*/
@AliasName(name = "VerticalLayout")
@AperteDoc(humanNameKey="widget.vertical_layout.name", descriptionKey="widget.vertical_layout.description")
@ChildrenAllowed(true)
@WidgetGroup("base-widgets")
public class VerticalLayoutWidget extends BaseProcessToolVaadinWidget implements ProcessToolVaadinRenderable {
private static final Logger logger = Logger.getLogger(VerticalLayout.class.getName());
VerticalLayout vl = new VerticalLayout();
List<ProcessToolVaadinRenderable> widgets = new ArrayList();
public VerticalLayoutWidget() {
vl.setMargin(true);
vl.setSpacing(true);
vl.setWidth(100, Sizeable.UNITS_PERCENTAGE);
}
@Override
public Component render() {
vl.removeAllComponents();
for (ProcessToolVaadinRenderable vChild : widgets) {
Component component;
try {
component = vChild.render();
} catch (Throwable e) {
logger.log(Level.SEVERE, e.getMessage(), e);
Panel p = new Panel();
VerticalLayout vl = new VerticalLayout();
vl.addComponent(new Label(getMessage("process.data.widget.exception-occurred")));
vl.addComponent(new Label(e.getMessage()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintWriter(baos));
vl.addComponent(new Label("<pre>" + baos.toString() + "</pre>", CONTENT_XHTML));
vl.addStyleName("error");
p.addComponent(vl);
p.setHeight(150, Sizeable.UNITS_PIXELS);
component = p;
}
if (component != null) {
if (vChild instanceof BaseProcessToolVaadinWidget) {
String comment = ((BaseProcessToolVaadinWidget)vChild).getAttributeValue("comment");
if (comment != null) {
VerticalLayout vl = new VerticalLayout();
vl.addComponent(new Label(getMessage(comment), Label.CONTENT_XHTML));
vl.addComponent(component);
component = vl;
}
String caption = ((BaseProcessToolVaadinWidget)vChild).getAttributeValue("caption");
if (caption != null) {
Panel p = new Panel(getMessage(caption));
p.addComponent(component);
vl.addComponent(p);
vl.setExpandRatio(p, 1.0f);
p.setWidth(100, Sizeable.UNITS_PERCENTAGE);
} else
{
vl.addComponent(component);
vl.setExpandRatio(component, 1.0f);
}
}
else
{
vl.addComponent(component);
vl.setExpandRatio(component, 1.0f);
}
}
}
return vl;
}
@Override
public void addChild(ProcessToolWidget child) {
if (!(child instanceof ProcessToolVaadinRenderable)) {
throw new IllegalArgumentException("child is not instance of " + ProcessToolVaadinRenderable.class.getName());
}
ProcessToolVaadinRenderable vChild = (ProcessToolVaadinRenderable) child;
widgets.add(vChild);
}
}