+#include "lineararrangement.h"
+
+namespace Msp {
+namespace GLtk {
+
+LinearArrangement::LinearArrangement(Layout &l, Side p):
+ Arrangement(l),
+ primary(p),
+ opposite(static_cast<Side>((primary+2)%4)),
+ first(true),
+ split_here(false),
+ gravity(opposite)
+{ }
+
+void LinearArrangement::split()
+{
+ if(gravity==primary)
+ throw arrangement_error("already split");
+
+ split_here = true;
+ gravity = primary;
+}
+
+void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
+{
+ if(side==opposite)
+ {
+ bool snug = (edges[primary].aligned && aligned && !split_here);
+ add_constraint(wdg, get_order_constraint(primary, !snug), primary);
+ if(first)
+ edges[side].add(wdg, aligned);
+ }
+ else if(side==primary)
+ next.add(wdg, (aligned && gravity==primary));
+ else
+ {
+ if(edges[side].aligned && aligned)
+ add_constraint(wdg, get_align_constraint(side), side);
+ edges[side].add(wdg, aligned);
+ }
+}
+
+void LinearArrangement::finish_slot()
+{
+ edges[primary] = next;
+ next.clear();
+ split_here = false;
+ first = false;
+}
+
+
+LinearArrangement::Loader::Loader(LinearArrangement &c):
+ DataFile::ObjectLoader<LinearArrangement>(c)
+{
+ add("split", &Loader::split);
+}
+
+void LinearArrangement::Loader::split()
+{
+ obj.split();
+}
+
+} // namespace GLtk
+} // namespace Msp