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
|
#include "container.hxx"
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <tools/debug.hxx>
namespace layoutimpl {
using namespace css;
Container::Container()
: Container_Base()
, PropHelper()
, mnBorderWidth( 0 )
{
addProp( RTL_CONSTASCII_USTRINGPARAM( "Border" ),
::getCppuType( static_cast< const sal_Int32* >( NULL ) ),
&mnBorderWidth );
setChangeListener( this );
}
uno::Any
Container::queryInterface( const uno::Type & rType ) throw (uno::RuntimeException)
{
uno::Any aRet = Container_Base::queryInterface( rType );
return aRet.hasValue() ? aRet : PropHelper::queryInterface( rType );
}
void
Container::allocateChildAt( const uno::Reference< awt::XLayoutConstrains > &xChild,
const awt::Rectangle &rArea )
throw( uno::RuntimeException )
{
uno::Reference< awt::XLayoutContainer > xCont( xChild, uno::UNO_QUERY );
if ( xCont.is() )
xCont->allocateArea( rArea );
else
{
uno::Reference< awt::XWindow > xWindow( xChild, uno::UNO_QUERY );
if ( xWindow.is() )
xWindow->setPosSize( rArea.X, rArea.Y, rArea.Width, rArea.Height,
awt::PosSize::POSSIZE );
else
{
DBG_ERROR( "Error: non-sizeable child" );
}
}
}
uno::Sequence< uno::Reference< awt::XLayoutConstrains > >
Container::getSingleChild ( uno::Reference< awt::XLayoutConstrains >const &xChildOrNil )
{
uno::Sequence< uno::Reference< awt::XLayoutConstrains > > aSeq( ( xChildOrNil.is() ? 1 : 0 ) );
if ( xChildOrNil.is() )
aSeq[0] = xChildOrNil;
return aSeq;
}
void
Container::queueResize()
{
if ( mxLayoutUnit.is() )
mxLayoutUnit->queueResize( uno::Reference< awt::XLayoutContainer >( this ) );
}
void
Container::setChildParent( const uno::Reference< awt::XLayoutConstrains >& xChild )
{
uno::Reference< awt::XLayoutContainer > xContChild( xChild, uno::UNO_QUERY );
if ( xContChild.is() )
{
xContChild->setParent( uno::Reference< awt::XLayoutContainer >( this ) );
#if 0
assert( !mxLayoutUnit.is() );
xContChild->setLayoutUnit( mxLayoutUnit );
#endif
}
}
void
Container::unsetChildParent( const uno::Reference< awt::XLayoutConstrains >& xChild )
{
uno::Reference< awt::XLayoutContainer > xContChild( xChild, uno::UNO_QUERY );
if ( xContChild.is() )
{
xContChild->setParent( uno::Reference< awt::XLayoutContainer >() );
#if 0
xContChild->setLayoutUnit( uno::Reference< awt::XLayoutUnit >() );
#endif
}
}
#if 0
std::string
Container::getLabel() // debug label
{
std::string depth;
uno::Reference< awt::XLayoutContainer > xContainer( this );
while ( xContainer.is() )
{
int node = 0; // child nb
uno::Reference< awt::XLayoutContainer > xParent = xContainer->getContainerParent();
if ( xParent.is() )
{
uno::Sequence< uno::Reference< awt::XLayoutConstrains > > aChildren;
aChildren = xParent->getChildren();
for( node = 0; node < aChildren.getLength(); node++ )
if ( aChildren[ node ] == xContainer )
break;
}
char str[ 8 ];
snprintf( str, 8, "%d", node );
if ( depth.empty() )
depth = std::string( str );
else
depth = std::string( str ) + ":" + depth;
xContainer = xParent;
}
return std::string( getName() ) + " (" + depth + ")";
}
#endif
void Container::propertiesChanged()
{
if ( !mxParent.is() )
{
DBG_ERROR( "Properties listener: error container doesn't have parent" );
}
// ask parent to be re-calculated
// FIXME: thats wrongg actually. We just need to do a "queueResize();"
if ( mxLayoutUnit.is() && mxParent.is() )
mxLayoutUnit->queueResize( mxParent );
}
}
|