1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#ifndef __DW_OOFPOSITIONEDMGR_HH__
#define __DW_OOFPOSITIONEDMGR_HH__
#include "outofflowmgr.hh"
#include "oofawarewidget.hh"
namespace dw {
namespace oof {
class OOFPositionedMgr: public OutOfFlowMgr
{
protected:
class Child: public lout::object::Object
{
public:
core::Widget *widget;
OOFAwareWidget *generator;
int externalIndex, x, y;
bool consideredForSize, consideredForExtremes;
Child (core::Widget *widget, OOFAwareWidget *generator,
int externalIndex);
};
OOFAwareWidget *container;
core::Allocation containerAllocation;
enum { NOT_ALLOCATED, IN_ALLOCATION, WAS_ALLOCATED }
containerAllocationState;
lout::container::typed::Vector<Child> *children;
lout::container::typed::HashTable<lout::object::TypedPointer
<dw::core::Widget>,
Child> *childrenByWidget;
inline bool getPosLeft (core::Widget *child, int availWidth, int *result)
{ return getPosBorder (child->getStyle()->left, availWidth, result); }
inline bool getPosRight (core::Widget *child, int availWidth, int *result)
{ return getPosBorder (child->getStyle()->right, availWidth, result); }
inline bool getPosTop (core::Widget *child, int availHeight, int *result)
{ return getPosBorder (child->getStyle()->top, availHeight, result); }
inline bool getPosBottom (core::Widget *child, int availHeight, int *result)
{ return getPosBorder (child->getStyle()->bottom, availHeight, result); }
bool getPosBorder (core::style::Length cssValue, int refLength, int *result);
bool allChildrenConsideredForSize ();
bool allChildrenConsideredForExtremes ();
bool doChildrenExceedContainer ();
virtual void sizeAllocateChildren () = 0;
virtual bool posXAbsolute (Child *child) = 0;
virtual bool posYAbsolute (Child *child) = 0;
inline bool generatorPosDefined (Child *child) {
return child->generator == container ||
(containerAllocationState != NOT_ALLOCATED
&& child->generator->wasAllocated ());
}
inline int generatorPosX (Child *child) {
assert (generatorPosDefined (child));
return child->generator == container ? 0 :
child->generator->getAllocation()->x - containerAllocation.x;
}
inline int generatorPosY (Child *child) {
assert (generatorPosDefined (child));
return child->generator == container ? 0 :
child->generator->getAllocation()->y - containerAllocation.y;
}
inline bool posXDefined (Child *child)
{ return posXAbsolute (child) || generatorPosDefined (child); }
inline bool posYDefined (Child *child)
{ return posYAbsolute (child) || generatorPosDefined (child); }
public:
OOFPositionedMgr (OOFAwareWidget *container);
~OOFPositionedMgr ();
void sizeAllocateStart (OOFAwareWidget *caller,
core::Allocation *allocation);
void sizeAllocateEnd (OOFAwareWidget *caller);
void containerSizeChangedForChildren ();
void draw (core::View *view, core::Rectangle *area,
core::DrawingContext *context);
void markSizeChange (int ref);
void markExtremesChange (int ref);
core::Widget *getWidgetAtPoint (int x, int y,
core::GettingWidgetAtPointContext *context);
void addWidgetInFlow (OOFAwareWidget *widget, OOFAwareWidget *parent,
int externalIndex);
int addWidgetOOF (core::Widget *widget, OOFAwareWidget *generator,
int externalIndex);
void moveExternalIndices (OOFAwareWidget *generator, int oldStartIndex,
int diff);
void tellPosition1 (core::Widget *widget, int x, int y);
void tellPosition2 (core::Widget *widget, int x, int y);
bool containerMustAdjustExtraSpace ();
int getLeftBorder (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
int getRightBorder (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
bool hasFloatLeft (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
bool hasFloatRight (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
int getLeftFloatHeight (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
int getRightFloatHeight (OOFAwareWidget *widget, int y, int h,
OOFAwareWidget *lastGen, int lastExtIndex);
int getClearPosition (OOFAwareWidget *widget);
bool affectsLeftBorder (core::Widget *widget);
bool affectsRightBorder (core::Widget *widget);
bool mayAffectBordersAtAll ();
bool dealingWithSizeOfChild (core::Widget *child);
int getNumWidgets ();
core::Widget *getWidget (int i);
};
} // namespace oof
} // namespace dw
#endif // __DW_OOFPOSITIONEDMGR_HH__
|