package topher;
import f3.ui.*;
import java.lang.System;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.StringBuffer;
public class ExhibitView extends CompositeWidget {
public attribute model: DB;
private attribute updating: Boolean;
}
function ExhibitView.composeWidget() =
BorderPanel {
var extent = bind (CerealCharacter*)model.extent
var selection = bind (CerealCharacter*)model.selection
top: Label {
text:
"
"
}
center: BorderPanel {
left: TabbedPane {
background: white
preferredSize: {height: 300, width: 200}
tabs: foreach (name in ["brand", "decade", "country", "form"])
Tab {
var at = CerealCharacter.class.Attributes[a|a.Name == name]
var allValuesOfThisAttribute = extent[at]
var values = bind (select unique s from s in allValuesOfThisAttribute) order by .
var filter = bind model.filter[f|f.attr == at]
title: bind "{name} {if sizeof filter.values > 0 then "({sizeof filter.values}/{sizeof values})" else "(all)"}"
content:
BorderPanel {
top: SimpleLabel {text: "{name}"}
center:
ScrollPane {
view:
GroupPanel {
var rows = bind foreach (i in [1..sizeof values]) Row {}
var col1 = Column {alignment: LEADING}
var col2 = Column {alignment: LEADING, resizable: true}
rows: bind rows
columns: [col1, col2]
content: bind foreach (value in values)
[SimpleLabel {
row: rows[indexof value]
column: col1
text: bind "{sizeof allValuesOfThisAttribute[. == value]}"
},
CheckBox {
row: rows[indexof value]
column: col2
selected: bind value in filter.values
text: value
onChange: operation(newValue:Boolean) {
updating = true;
if (newValue) {
if (filter <> null) {
insert value into filter.values;
} else {
insert AttributeValueAssertion {
attr: at
values: value
} into model.filter;
}
} else {
delete filter.values[. == value];
}
updating = false;
}
}]
}
}
}
}
}
center: BorderPanel {
operation reset() {
updating = true;
delete model.filter.values;
updating = false;
}
top: Label {
text: bind "{sizeof selection} Characters {if sizeof selection == sizeof extent then "total" else "filtered from {sizeof extent} (reset)"}"}
center: ScrollPane {
view: Label {
var columnCount = 2
var rowCount = bind (sizeof selection / columnCount).intValue() + 1
text:
bind if updating
then
"