00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00029 #ifndef _GG_Layout_h_
00030 #define _GG_Layout_h_
00031
00032 #include <GG/AlignmentFlags.h>
00033 #include <GG/Wnd.h>
00034
00035 #include <boost/serialization/version.hpp>
00036
00037
00038 namespace GG {
00039
00040 struct SetMarginAction;
00041
00084 class GG_API Layout : public Wnd
00085 {
00086 public:
00088
00089 Layout(int x, int y, int w, int h, int rows, int columns, int border_margin = 0, int cell_margin = -1);
00091
00093 virtual Pt MinUsableSize() const;
00094
00095 int Rows() const;
00096 int Columns() const;
00097 Flags<Alignment>
00098 ChildAlignment(Wnd* wnd) const;
00099 int BorderMargin() const;
00100 int CellMargin() const;
00101 double RowStretch(int row) const;
00102 double ColumnStretch(int column) const;
00103 int MinimumRowHeight(int row) const;
00104 int MinimumColumnWidth(int column) const;
00105 std::vector<std::vector<const Wnd*> >
00106 Cells() const;
00107 std::vector<std::vector<Rect> >
00108 CellRects() const;
00109 std::vector<std::vector<Rect> >
00110 RelativeCellRects() const;
00111
00114 bool RenderOutline() const;
00115
00118 Clr OutlineColor() const;
00120
00122 virtual void StartingChildDragDrop(const Wnd* wnd, const Pt& offset);
00123 virtual void CancellingChildDragDrop(const std::list<Wnd*>& wnds);
00124 virtual void ChildrenDraggedAway(const std::list<Wnd*>& wnds, const Wnd* destination);
00125 virtual void SizeMove(const Pt& ul, const Pt& lr);
00126 virtual void Render();
00127 virtual void MouseWheel(const Pt& pt, int move, Flags<ModKey> mod_keys);
00128 virtual void KeyPress(Key key, Flags<ModKey> mod_keys);
00129 virtual void KeyRelease(Key key, Flags<ModKey> mod_keys);
00130
00134 void Add(Wnd* wnd, int row, int column, Flags<Alignment> alignment = ALIGN_NONE);
00135
00141 void Add(Wnd* wnd, int row, int column, int num_rows, int num_columns, Flags<Alignment> alignment = ALIGN_NONE);
00142
00145 void Remove(Wnd* wnd);
00146
00149 void DetachAndResetChildren();
00150
00153 void ResizeLayout(int rows, int columns);
00154
00156 void SetChildAlignment(Wnd* wnd, Flags<Alignment> alignment);
00157
00159 void SetBorderMargin(int margin);
00160
00162 void SetCellMargin(int margin);
00163
00167 void SetRowStretch(int row, double stretch);
00168
00172 void SetColumnStretch(int column, double stretch);
00173
00175 void SetMinimumRowHeight(int row, int height);
00176
00178 void SetMinimumColumnWidth(int column, int width);
00179
00182 void RenderOutline(bool render_outline);
00183
00186 void SetOutlineColor(Clr color);
00187
00188 virtual void DefineAttributes(WndEditor* editor);
00190
00192
00193 GG_ABSTRACT_EXCEPTION(Exception);
00194
00196 GG_CONCRETE_EXCEPTION(InvalidMargin, GG::Layout, Exception);
00197
00199 GG_CONCRETE_EXCEPTION(NoSuchChild, GG::Layout, Exception);
00200
00202 GG_CONCRETE_EXCEPTION(FailedCalculationCheck, GG::Layout, Exception);
00203
00205 GG_CONCRETE_EXCEPTION(AttemptedOverwrite, GG::Layout, Exception);
00207
00208 protected:
00210 Layout();
00211
00212
00213 private:
00214 struct GG_API RowColParams
00215 {
00216 RowColParams();
00217
00218 double stretch;
00219 int min;
00220 int effective_min;
00221 int current_origin;
00222 int current_width;
00223
00224 private:
00225 friend class boost::serialization::access;
00226 template <class Archive>
00227 void serialize(Archive& ar, const unsigned int version);
00228 };
00229
00230 struct GG_API WndPosition
00231 {
00232 WndPosition();
00233 WndPosition(int first_row_, int first_column_, int last_row_, int last_column_, Flags<Alignment> alignment_, const Pt& original_ul_, const Pt& original_size_);
00234
00235 int first_row;
00236 int first_column;
00237 int last_row;
00238 int last_column;
00239 Flags<Alignment> alignment;
00240 Pt original_ul;
00241 Pt original_size;
00242
00243 private:
00244 friend class boost::serialization::access;
00245 template <class Archive>
00246 void serialize(Archive& ar, const unsigned int version);
00247 };
00248
00249 double TotalStretch(const std::vector<RowColParams>& params_vec) const;
00250 int TotalMinWidth() const;
00251 int TotalMinHeight() const;
00252 void ValidateAlignment(Flags<Alignment>& alignment);
00253 void RedoLayout();
00254 void ChildSizeOrMinSizeOrMaxSizeChanged();
00255
00256 std::vector<std::vector<Wnd*> > m_cells;
00257 int m_border_margin;
00258 int m_cell_margin;
00259 std::vector<RowColParams> m_row_params;
00260 std::vector<RowColParams> m_column_params;
00261 std::map<Wnd*, WndPosition> m_wnd_positions;
00262 Pt m_min_usable_size;
00263 bool m_ignore_child_resize;
00264 bool m_ignore_parent_resize;
00265 bool m_render_outline;
00266 Clr m_outline_color;
00267
00268 friend class Wnd;
00269 friend struct SetMarginAction;
00270
00271 friend class boost::serialization::access;
00272 template <class Archive>
00273 void serialize(Archive& ar, const unsigned int version);
00274 };
00275
00276 }
00277
00278 BOOST_CLASS_VERSION(GG::Layout, 1)
00279
00280
00281 template <class Archive>
00282 void GG::Layout::RowColParams::serialize(Archive& ar, const unsigned int version)
00283 {
00284 ar & BOOST_SERIALIZATION_NVP(stretch)
00285 & BOOST_SERIALIZATION_NVP(min)
00286 & BOOST_SERIALIZATION_NVP(effective_min)
00287 & BOOST_SERIALIZATION_NVP(current_origin)
00288 & BOOST_SERIALIZATION_NVP(current_width);
00289 }
00290
00291 template <class Archive>
00292 void GG::Layout::WndPosition::serialize(Archive& ar, const unsigned int version)
00293 {
00294 ar & BOOST_SERIALIZATION_NVP(first_row)
00295 & BOOST_SERIALIZATION_NVP(first_column)
00296 & BOOST_SERIALIZATION_NVP(last_row)
00297 & BOOST_SERIALIZATION_NVP(last_column)
00298 & BOOST_SERIALIZATION_NVP(alignment)
00299 & BOOST_SERIALIZATION_NVP(original_ul)
00300 & BOOST_SERIALIZATION_NVP(original_size);
00301 }
00302
00303 template <class Archive>
00304 void GG::Layout::serialize(Archive& ar, const unsigned int version)
00305 {
00306 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Wnd)
00307 & BOOST_SERIALIZATION_NVP(m_cells)
00308 & BOOST_SERIALIZATION_NVP(m_border_margin)
00309 & BOOST_SERIALIZATION_NVP(m_cell_margin)
00310 & BOOST_SERIALIZATION_NVP(m_row_params)
00311 & BOOST_SERIALIZATION_NVP(m_column_params)
00312 & BOOST_SERIALIZATION_NVP(m_wnd_positions)
00313 & BOOST_SERIALIZATION_NVP(m_ignore_child_resize)
00314 & BOOST_SERIALIZATION_NVP(m_render_outline)
00315 & BOOST_SERIALIZATION_NVP(m_outline_color);
00316
00317 if (1 <= version)
00318 ar & BOOST_SERIALIZATION_NVP(m_min_usable_size);
00319 }
00320
00321 #endif // _GG_Layout_h_