+#include "arrangement.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GLtk {
+
+Arrangement::Arrangement(Layout &l):
+ layout(l),
+ parent(layout.get_arrangement())
+{
+ layout.push_arrangement(*this);
+}
+
+Arrangement::~Arrangement()
+{
+ layout.pop_arrangement(*this);
+}
+
+void Arrangement::arrange(Widget &wdg)
+{
+ for(unsigned i=0; i<4; ++i)
+ process_widget(wdg, static_cast<Side>(i), true);
+ finish_widget(wdg);
+ finish_slot();
+}
+
+void Arrangement::arrange(Arrangement &arr)
+{
+ for(unsigned i=0; i<4; ++i)
+ {
+ Side side = static_cast<Side>(i);
+ const Edge &edge = arr.get_edge(side);
+ for(list<Widget *>::const_iterator j=edge.widgets.begin(); j!=edge.widgets.end(); ++j)
+ process_widget(**j, side, edge.aligned);
+ }
+ finish_slot();
+}
+
+void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, Side side)
+{
+ add_constraint(wdg, type, edges[side]);
+}
+
+void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, const Edge &edge)
+{
+ for(list<Widget *>::const_iterator i=edge.widgets.begin(); i!=edge.widgets.end(); ++i)
+ layout.add_constraint(wdg, type, **i);
+}
+
+
+Arrangement::Edge::Edge():
+ aligned(false)
+{ }
+
+void Arrangement::Edge::clear()
+{
+ widgets.clear();
+ aligned = false;
+}
+
+void Arrangement::Edge::add(Widget &wdg, bool algn)
+{
+ if(aligned)
+ return;
+
+ if(algn)
+ widgets.clear();
+
+ widgets.push_back(&wdg);
+ aligned = algn;
+}
+
+} // namespace GLtk
+} // namespace Msp