1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "wrapper.hxx"
25 
26 #include <com/sun/star/awt/XLayoutRoot.hpp>
27 #include <com/sun/star/awt/XLayoutContainer.hpp>
28 #include <comphelper/processfactory.hxx>
29 #include <layout/core/helper.hxx>
30 #include <tools/debug.hxx>
31 
32 using namespace ::com::sun::star;
33 
34 namespace layout
35 {
36 
37 Container::Container( Context const* context, char const* pId )
38     : mxContainer( context->GetPeerHandle( pId ), uno::UNO_QUERY )
39 {
40     if ( !mxContainer.is() )
41     {
42         DBG_ERROR1( "Error: failed to associate container with '%s'", pId );
43     }
44 }
45 
46 Container::Container( rtl::OUString const& rName, sal_Int32 nBorder )
47 {
48     mxContainer = layoutimpl::WidgetFactory::createContainer( rName );
49 
50     uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW );
51     xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Border" ) ),
52                               uno::Any( nBorder ) );
53 }
54 
55 void Container::Add( Window *pChild )
56 {
57     if ( pChild )
58     {
59         uno::Reference< awt::XLayoutConstrains > xChild( pChild->GetPeer(), uno::UNO_QUERY );
60         mxContainer->addChild( xChild );
61     }
62 }
63 
64 void Container::Add( Container *pChild )
65 {
66     if ( pChild )
67     {
68         uno::Reference< awt::XLayoutConstrains > xChild( pChild->getImpl(), uno::UNO_QUERY );
69         mxContainer->addChild( xChild );
70     }
71 }
72 
73 void Container::Remove( Window *pChild )
74 {
75     if ( pChild )
76     {
77         uno::Reference< awt::XLayoutConstrains > xChild( pChild->GetPeer(), uno::UNO_QUERY );
78         mxContainer->removeChild( xChild );
79     }
80 }
81 
82 void Container::Remove( Container *pChild )
83 {
84     if ( pChild )
85     {
86         uno::Reference< awt::XLayoutConstrains > xChild( pChild->getImpl(), uno::UNO_QUERY );
87         mxContainer->removeChild( xChild );
88     }
89 }
90 
91 void Container::Clear()
92 {
93     css::uno::Sequence< css::uno::Reference < css::awt::XLayoutConstrains > > children;
94     children = mxContainer->getChildren();
95     for (int i = 0; i < children.getLength(); i++)
96         mxContainer->removeChild( children[i] );
97 }
98 
99 void Container::ShowAll( bool bShow )
100 {
101     struct inner
102     {
103         static void setChildrenVisible( uno::Reference < awt::XLayoutContainer > xCont,
104                                         bool bVisible )  /* auxiliary */
105         {
106             if ( xCont.is() )
107             {
108                 uno::Sequence< uno::Reference < awt::XLayoutConstrains > > aChildren;
109                 aChildren = xCont->getChildren();
110                 for (int i = 0; i < aChildren.getLength(); i++)
111                 {
112                     uno::Reference < awt::XLayoutConstrains > xChild( aChildren[ i ] );
113 
114                     uno::Reference< awt::XWindow > xWin( xChild, uno::UNO_QUERY);
115                     if ( xWin.is() )
116                         xWin->setVisible( bVisible );
117 
118                     uno::Reference < awt::XLayoutContainer > xChildCont(
119                         xChild, uno::UNO_QUERY );
120                     setChildrenVisible( xChildCont, bVisible );
121                 }
122             }
123         }
124     };
125 
126     inner::setChildrenVisible( mxContainer, bShow );
127 }
128 
129 void Container::Show()
130 {
131     ShowAll( true );
132 }
133 
134 void Container::Hide()
135 {
136     ShowAll( false );
137 }
138 
139 Table::Table( sal_Int32 nBorder, sal_Int32 nColumns )
140     : Container( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "table" ) ), nBorder )
141 {
142     uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW );
143     xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Columns" ) ),
144                               uno::Any( nColumns ) );
145 }
146 
147 void Table::Add( Window *window, bool bXExpand, bool bYExpand,
148                  sal_Int32 nXSpan, sal_Int32 nYSpan )
149 {
150     if ( !window )
151         return;
152     WindowImpl &rImpl = window->getImpl();
153     uno::Reference< awt::XLayoutConstrains > xChild( rImpl.mxWindow,
154                                                      uno::UNO_QUERY );
155     mxContainer->addChild( xChild );
156     setProps( xChild, bXExpand, bYExpand, nXSpan, nYSpan );
157 }
158 
159 void Table::Add( Container *pContainer, bool bXExpand, bool bYExpand,
160                  sal_Int32 nXSpan, sal_Int32 nYSpan )
161 {
162     if ( !pContainer )
163         return;
164     uno::Reference< awt::XLayoutConstrains > xChild( pContainer->getImpl(),
165                                                      uno::UNO_QUERY );
166     mxContainer->addChild( xChild );
167     setProps( xChild, bXExpand, bYExpand, nXSpan, nYSpan );
168 }
169 
170 void Table::setProps( uno::Reference< awt::XLayoutConstrains > xChild,
171                       bool bXExpand, bool bYExpand, sal_Int32 nXSpan, sal_Int32 nYSpan )
172 {
173     uno::Reference< beans::XPropertySet > xProps
174         ( mxContainer->getChildProperties( xChild ), uno::UNO_QUERY_THROW );
175     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "XExpand" ) ),
176                               uno::Any( bXExpand ) );
177     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "YExpand" ) ),
178                               uno::Any( bYExpand ) );
179     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "ColSpan" ) ),
180                               uno::Any( nXSpan ) );
181     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "RowSpan" ) ),
182                               uno::Any( nYSpan ) );
183 }
184 
185 Box::Box( rtl::OUString const& rName, sal_Int32 nBorder, bool bHomogeneous )
186     : Container( rName, nBorder )
187 {
188     uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW );
189     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "Homogeneous" ) ),
190                               uno::Any( bHomogeneous ) );
191 }
192 
193 void Box::Add( Window *window, bool bExpand, bool bFill, sal_Int32 nPadding)
194 {
195     if ( !window )
196         return;
197     WindowImpl &rImpl = window->getImpl();
198     uno::Reference< awt::XLayoutConstrains > xChild( rImpl.mxWindow,
199                                                      uno::UNO_QUERY );
200 
201     mxContainer->addChild( xChild );
202     setProps( xChild, bExpand, bFill, nPadding );
203 }
204 
205 void Box::Add( Container *pContainer, bool bExpand, bool bFill, sal_Int32 nPadding)
206 {
207     if ( !pContainer )
208         return;
209 
210     uno::Reference< awt::XLayoutConstrains > xChild( pContainer->getImpl(),
211                                                      uno::UNO_QUERY );
212     mxContainer->addChild( xChild );
213     setProps( xChild, bExpand, bFill, nPadding );
214 }
215 
216 void Box::setProps( uno::Reference< awt::XLayoutConstrains > xChild,
217                     bool bExpand, bool bFill, sal_Int32 nPadding )
218 {
219     uno::Reference< beans::XPropertySet > xProps
220         ( mxContainer->getChildProperties( xChild ), uno::UNO_QUERY_THROW );
221 
222     xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "Expand" ) ),
223                               uno::Any( bExpand ) );
224     xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Fill" ) ),
225                               uno::Any( bFill ) );
226     xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Padding" ) ),
227                               uno::Any( nPadding ) );
228 }
229 
230 Table::Table( Context const* context, char const* pId )
231     : Container( context, pId )
232 {
233 }
234 
235 Box::Box( Context const* context, char const* pId )
236     : Container( context, pId )
237 {
238 }
239 
240 HBox::HBox( sal_Int32 nBorder, bool bHomogeneous )
241     : Box( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "hbox" ) ),
242            nBorder, bHomogeneous )
243 {
244 }
245 
246 HBox::HBox( Context const* context, char const* pId )
247     : Box( context, pId )
248 {
249 }
250 
251 VBox::VBox( sal_Int32 nBorder, bool bHomogeneous )
252     : Box( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "vbox" ) ),
253            nBorder, bHomogeneous )
254 {
255 }
256 
257 VBox::VBox( Context const* context, char const* pId )
258     : Box( context, pId )
259 {
260 }
261 
262 } // namespace layout
263