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
139
140
141
|
#ifndef __DW_OOFPOSITIONEDMGR_HH__
#define __DW_OOFPOSITIONEDMGR_HH__
#include "outofflowmgr.hh"
namespace dw {
namespace oof {
class OOFPositionedMgr: public OutOfFlowMgr
{
protected:
class Child: public lout::object::Object
{
public:
core::Widget *widget;
OOFAwareWidget *generator;
int x, y;
inline Child (core::Widget *widget, OOFAwareWidget *generator)
{ this->widget = widget; this->generator = generator; x = y = 0; }
};
virtual int containerBoxOffsetX () = 0;
virtual int containerBoxOffsetY () = 0;
virtual int containerBoxRestWidth () = 0;
virtual int containerBoxRestHeight () = 0;
inline int containerBoxDiffWidth ()
{ return containerBoxOffsetX () + containerBoxRestWidth (); }
inline int containerBoxDiffHeight ()
{ return containerBoxOffsetY () + containerBoxRestHeight (); }
OOFAwareWidget *container;
enum { NOT_ALLOCATED, IN_ALLOCATION, WAS_ALLOCATED }
containerAllocationState;
core::Allocation containerAllocation;
lout::container::typed::Vector<Child> *children;
lout::container::typed::HashTable<lout::object::TypedPointer
<dw::core::Widget>,
Child> *childrenByWidget;
bool doChildrenExceedContainer ();
bool haveExtremesChanged ();
void sizeAllocateChildren ();
inline int getPosLeft (core::Widget *child, int availWidth)
{ return getPosBorder (child->getStyle()->left, availWidth); }
inline int getPosRight (core::Widget *child, int availWidth)
{ return getPosBorder (child->getStyle()->right, availWidth); }
inline int getPosTop (core::Widget *child, int availHeight)
{ return getPosBorder (child->getStyle()->top, availHeight); }
inline int getPosBottom (core::Widget *child, int availHeight)
{ return getPosBorder (child->getStyle()->bottom, availHeight); }
int getPosBorder (core::style::Length cssValue, int refLength);
bool isHPosComplete (core::Widget *child);
bool isVPosComplete (core::Widget *child);
bool isPosComplete (core::Widget *child);
void calcPosAndSizeChildOfChild (Child *child, int refWidth, int refHeight,
int *xPtr, int *yPtr, int *widthPtr,
int *ascentPtr, int *descentPtr);
void calcHPosAndSizeChildOfChild (Child *child, int refWidth,
int origChildWidth, int *xPtr,
int *widthPtr);
void calcVPosAndSizeChildOfChild (Child *child, int refHeight,
int origChildAscent, int origChildDescent,
int *yPtr, int *ascentPtr,
int *descentPtr);
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::StackingIteratorStack *iteratorStack,
core::Widget **interruptedWidget, int *index);
void markSizeChange (int ref);
void markExtremesChange (int ref);
core::Widget *getWidgetAtPoint (int x, int y,
core::StackingIteratorStack *iteratorStack,
core::Widget **interruptedWidget,
int *index);
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 tellPosition (core::Widget *widget, int x, int y);
void getSize (core::Requisition *containerReq, int *oofWidth,
int *oofHeight);
bool containerMustAdjustExtraSpace ();
void getExtremes (core::Extremes *containerExtr,
int *oofMinWidth, int *oofMaxWidth);
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 getAvailWidthOfChild (core::Widget *child, bool forceValue);
int getAvailHeightOfChild (core::Widget *child, bool forceValue);
int getNumWidgets ();
core::Widget *getWidget (int i);
};
} // namespace oof
} // namespace dw
#endif // __DW_OOFPOSITIONEDMGR_HH__
|