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 <tools/rc.h>
25 //#define RESOURCE_PUBLISH_PROTECTED 1
26 #if RESOURCE_PUBLISH_PROTECTED
27 // ugh, override non-helpful proctection
28 #define protected public
29 #endif /* RESOURCE_PUBLISH_PROTECTED */
30 #include <tools/rc.hxx>
31 #undef protected
32
33
34 #include "wrapper.hxx"
35
36 #include <awt/vclxplugin.hxx>
37 #include <awt/vclxtabcontrol.hxx>
38 #include <com/sun/star/awt/PosSize.hpp>
39 #include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
40 #include <com/sun/star/awt/WindowAttribute.hpp>
41 #include <com/sun/star/awt/XDialog2.hpp>
42 #include <com/sun/star/awt/XProgressBar.hpp>
43 #include <com/sun/star/awt/XSimpleTabController.hpp>
44 #include <com/sun/star/awt/XTabListener.hpp>
45 #include <com/sun/star/graphic/XGraphic.hpp>
46 #include <comphelper/processfactory.hxx>
47 #include <layout/core/factory.hxx>
48 #include <layout/core/localized-string.hxx>
49 #include <layout/core/root.hxx>
50 #include <toolkit/awt/vclxwindow.hxx>
51 #include <vcl/ctrl.hxx>
52 #include <vcl/dialog.hxx>
53 #include <vcl/image.hxx>
54 #include <vcl/tabctrl.hxx>
55 #include <vcl/tabpage.hxx>
56 #include <vcl/window.hxx>
57
58 using namespace ::com::sun::star;
59 using rtl::OUString;
60
61 namespace layout
62 {
63
64 // Context bits ...
65 class ContextImpl
66 {
67 uno::Reference< awt::XLayoutRoot > mxRoot;
68 uno::Reference< container::XNameAccess > mxNameAccess;
69 PeerHandle mxTopLevel;
70
71 public:
ContextImpl(char const * pPath)72 ContextImpl( char const *pPath )
73 {
74 uno::Sequence< uno::Any > aParams( 1 );
75 aParams[0] <<= OUString( pPath, strlen( pPath ), RTL_TEXTENCODING_UTF8 );
76
77 uno::Reference< lang::XSingleServiceFactory > xFactory(
78 comphelper::createProcessComponent(
79 OUString::createFromAscii( "com.sun.star.awt.Layout" ) ),
80 uno::UNO_QUERY );
81 if ( !xFactory.is() )
82 {
83 throw uno::RuntimeException(
84 OUString( RTL_CONSTASCII_USTRINGPARAM( "Layout engine not installed" ) ),
85 uno::Reference< uno::XInterface >() );
86 }
87 mxRoot = uno::Reference< awt::XLayoutRoot >(
88 xFactory->createInstanceWithArguments( aParams ),
89 uno::UNO_QUERY );
90
91 mxNameAccess = uno::Reference< container::XNameAccess >( mxRoot, uno::UNO_QUERY );
92 }
93
~ContextImpl()94 ~ContextImpl()
95 {
96 }
97
getByName(const OUString & rName)98 PeerHandle getByName( const OUString &rName )
99 {
100 uno::Any val = mxNameAccess->getByName( rName );
101 PeerHandle xRet;
102 val >>= xRet;
103 return xRet;
104 }
getTopLevel()105 PeerHandle getTopLevel()
106 {
107 return mxTopLevel;
108 }
setTopLevel(PeerHandle xToplevel)109 void setTopLevel( PeerHandle xToplevel )
110 {
111 mxTopLevel = xToplevel;
112 }
getRoot()113 PeerHandle getRoot()
114 {
115 return mxRoot;
116 }
117 };
118
Context(const char * pPath)119 Context::Context( const char *pPath )
120 : pImpl( new ContextImpl( pPath ) )
121 {
122 }
~Context()123 Context::~Context()
124 {
125 delete pImpl;
126 pImpl = NULL;
127 }
128
setToplevel(PeerHandle xToplevel)129 void Context::setToplevel( PeerHandle xToplevel )
130 {
131 pImpl->setTopLevel( xToplevel );
132 }
133
getToplevel()134 PeerHandle Context::getToplevel()
135 {
136 return pImpl->getTopLevel();
137 }
getRoot()138 PeerHandle Context::getRoot()
139 {
140 return pImpl->getRoot();
141 }
142
GetPeerHandle(const char * id,sal_uInt32 nId) const143 PeerHandle Context::GetPeerHandle( const char *id, sal_uInt32 nId ) const
144 {
145 PeerHandle xHandle;
146 xHandle = pImpl->getByName( OUString( id, strlen( id ), RTL_TEXTENCODING_UTF8 ) );
147 if ( !xHandle.is() )
148 {
149 DBG_ERROR1( "Failed to fetch widget '%s'", id );
150 }
151
152 if ( nId != 0 )
153 {
154 rtl::OString aStr = rtl::OString::valueOf( (sal_Int32) nId );
155 xHandle = GetPeerHandle( aStr.getStr(), 0 );
156 }
157 return xHandle;
158 }
159
WindowImpl(Context * context,const PeerHandle & peer,Window * window)160 WindowImpl::WindowImpl (Context *context, const PeerHandle &peer, Window *window)
161 : mpWindow (window)
162 , mpCtx (context)
163 , mxWindow (peer, uno::UNO_QUERY)
164 , mxVclPeer (peer, uno::UNO_QUERY)
165 , mvclWindow (0)
166 , bFirstTimeVisible (true)
167 {
168 }
169
~WindowImpl()170 WindowImpl::~WindowImpl ()
171 {
172 if (mpWindow)
173 mpWindow->mpImpl = 0;
174 if (mvclWindow)
175 {
176 VCLXWindow *v = mvclWindow->GetWindowPeer ();
177 v->SetWindow (0);
178 mvclWindow->SetComponentInterface (uno::Reference <awt::XWindowPeer> ());
179 mvclWindow->SetWindowPeer (uno::Reference <awt::XWindowPeer> (), 0);
180 delete mvclWindow;
181 mvclWindow = 0;
182 }
183 }
184
wrapperGone()185 void WindowImpl::wrapperGone ()
186 {
187 mvclWindow = 0;
188 mpWindow->mpImpl = 0;
189 mpWindow = 0;
190 mpCtx = 0;
191 if ( mxWindow.is() )
192 {
193 uno::Reference< lang::XComponent > xComp( mxWindow, uno::UNO_QUERY );
194 mxWindow.clear ();
195 if ( xComp.is() )
196 xComp->dispose();
197 }
198 }
199
disposing(lang::EventObject const &)200 void SAL_CALL WindowImpl::disposing (lang::EventObject const&)
201 throw (uno::RuntimeException)
202 {
203 if (mxWindow.is ())
204 mxWindow.clear ();
205 }
206
getProperty(char const * name)207 uno::Any WindowImpl::getProperty (char const* name)
208 {
209 if ( !mxVclPeer.is() )
210 return css::uno::Any();
211 return mxVclPeer->getProperty
212 ( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ) );
213 }
214
setProperty(char const * name,uno::Any any)215 void WindowImpl::setProperty (char const *name, uno::Any any)
216 {
217 if ( !mxVclPeer.is() )
218 return;
219 mxVclPeer->setProperty
220 ( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ), any );
221 }
222
redraw(bool resize)223 void WindowImpl::redraw (bool resize)
224 {
225 uno::Reference <awt::XWindow> ref (mxWindow, uno::UNO_QUERY);
226 ::Window* window = VCLXWindow::GetImplementation (ref)->GetWindow ();
227 ::Window* parent = window->GetParent();
228 ::Rectangle r = Rectangle (parent->GetPosPixel (),
229 parent->GetSizePixel ());
230 parent->Invalidate (r, INVALIDATE_CHILDREN | INVALIDATE_NOCHILDREN );
231 if (resize)
232 parent->SetPosSizePixel (0, 0, 1, 1, awt::PosSize::SIZE);
233 else
234 parent->SetPosSizePixel (0, 0, r.nRight - r.nLeft, r.nBottom - r.nTop,
235 awt::PosSize::SIZE);
236 }
237
Window(WindowImpl * pImpl)238 Window::Window( WindowImpl *pImpl )
239 : mpImpl( pImpl )
240 {
241 mpImpl->mvclWindow = GetVCLXWindow () ? GetWindow () : 0;
242 }
243
~Window()244 Window::~Window()
245 {
246 /* likely to be an UNO object - with floating references */
247 if (mpImpl)
248 mpImpl->wrapperGone ();
249 mpImpl = 0;
250 }
251
252 IMPL_GET_IMPL( Control );
253
~Control()254 Control::~Control ()
255 {
256 SetGetFocusHdl (Link ());
257 SetLoseFocusHdl (Link ());
258 }
259
setRes(ResId const & res)260 void Window::setRes (ResId const& res)
261 {
262 #if RESOURCE_PUBLISH_PROTECTED
263 // Resources are shut-off from use. Is that really necessary?
264 Resource &r = *GetWindow ();
265 r.GetRes (res);
266 #else /* !RESOURCE_PUBLISH_PROTECTED */
267 //We *must* derive. Is this also really necessary?
268 //Resource r (res);
269
270 // ugh, I wonder which solution is cleaner...
271 class Resource_open_up : public Resource
272 {
273 public:
274 Resource_open_up (ResId const& r)
275 : Resource (r)
276 {
277 }
278 static sal_Int32 GetLongRes (void *p)
279 {
280 return Resource::GetLongRes (p);
281 }
282 void* GetClassRes ()
283 {
284 return Resource::GetClassRes ();
285 }
286 sal_Int32 ReadLongRes ()
287 {
288 return Resource::ReadLongRes ();
289 }
290 UniString ReadStringRes ()
291 {
292 return Resource::ReadStringRes ();
293 }
294 rtl::OString ReadByteStringRes()
295 {
296 return Resource::ReadByteStringRes();
297 }
298 };
299
300 Resource_open_up r (res);
301 #endif /* !RESOURCE_PUBLISH_PROTECTED */
302 sal_uInt32 mask = r.ReadLongRes ();
303 if (mask & WINDOW_HELPID)
304 SetHelpId (r.ReadByteStringRes());
305 if ( mask & WINDOW_TEXT )
306 SetText( r.ReadStringRes ());
307 }
308
SetParent(::Window * parent)309 void Window::SetParent( ::Window *parent )
310 {
311 uno::Reference <awt::XWindow> ref( GetPeer(), uno::UNO_QUERY );
312 if (VCLXWindow *vcl = VCLXWindow::GetImplementation( ref ))
313 if (::Window *window = vcl->GetWindow())
314 window->SetParent( parent );
315 }
316
SetParent(Window * parent)317 void Window::SetParent( Window *parent )
318 {
319 /* Let's hear it for C++: poor man's dynamic binding. */
320 parent->ParentSet (this);
321 }
322
ParentSet(Window * window)323 void Window::ParentSet (Window *window)
324 {
325 window->SetParent (GetWindow ());
326 }
327
getContext()328 Context *Window::getContext()
329 {
330 return mpImpl ? mpImpl->mpCtx : NULL;
331 }
332
GetPeer() const333 PeerHandle Window::GetPeer() const
334 {
335 if ( !mpImpl )
336 return PeerHandle();
337 return mpImpl->mxWindow;
338 }
339
GetRef() const340 uno::Reference<awt::XWindow> Window::GetRef() const
341 {
342 return uno::Reference <awt::XWindow> ( GetPeer(), uno::UNO_QUERY );
343 }
344
GetVCLXWindow() const345 VCLXWindow* Window::GetVCLXWindow() const
346 {
347 return VCLXWindow::GetImplementation( GetRef() );
348 }
349
GetWindow() const350 ::Window* Window::GetWindow() const
351 {
352 return GetVCLXWindow()->GetWindow();
353 }
354
GetParent() const355 ::Window* Window::GetParent() const
356 {
357 return GetWindow()->GetParent();
358 }
359
SetHelpId(const rtl::OString & id)360 void Window::SetHelpId( const rtl::OString& id )
361 {
362 GetWindow()->SetHelpId( id );
363 }
364
GetHelpId() const365 const rtl::OString& Window::GetHelpId() const
366 {
367 return GetWindow()->GetHelpId();
368 }
369
EnterWait()370 void Window::EnterWait ()
371 {
372 GetWindow()->EnterWait ();
373 }
LeaveWait()374 void Window::LeaveWait ()
375 {
376 GetWindow()->LeaveWait ();
377 }
IsWait() const378 bool Window::IsWait () const
379 {
380 return GetWindow()->IsWait ();
381 }
382
IsVisible() const383 bool Window::IsVisible () const
384 {
385 if (GetWindow ())
386 return GetWindow()->IsVisible ();
387 return false;
388 }
389
HasChildPathFocus(bool systemWindow) const390 bool Window::HasChildPathFocus (bool systemWindow) const
391 {
392 return GetWindow()->HasChildPathFocus (systemWindow);
393 }
394
SetPosPixel(Point const &)395 void Window::SetPosPixel (Point const&)
396 {
397 }
398
GetPosPixel() const399 Point Window::GetPosPixel () const
400 {
401 return Point ();
402 }
403
SetSizePixel(Size const &)404 void Window::SetSizePixel (Size const&)
405 {
406 }
407
SetPosSizePixel(Point const &,Size const &)408 void Window::SetPosSizePixel (Point const&, Size const&)
409 {
410 }
411
GetSizePixel() const412 Size Window::GetSizePixel () const
413 {
414 return Size ();
415 }
416
417 // void Window::Enable (bool enable, bool child);
418 // {
419 // GetWindow ()->Enable (enable, child);
420 // }
421
422 // void Window::Disable (bool child)
423 // {
424 // GetWindow ()->Disable (child);
425 // }
426
IsEnabled() const427 bool Window::IsEnabled () const
428 {
429 return GetWindow ()->IsEnabled ();
430 // if (getImpl().mxWindow.is ())
431 // return getImpl ().mxWindow->isEnabled ();
432 // return false;
433 }
434
EnableInput(bool enable,bool child)435 void Window::EnableInput (bool enable, bool child)
436 {
437 GetWindow ()->EnableInput (enable, child);
438 }
439
IsInputEnabled() const440 bool Window::IsInputEnabled () const
441 {
442 return GetWindow ()->IsInputEnabled ();
443 }
444
HasFocus() const445 bool Window::HasFocus () const
446 {
447 return GetWindow ()->HasFocus ();
448 }
449
GetFont() const450 Font& Window::GetFont () const
451 {
452 return const_cast <Font&> (GetWindow ()->GetFont ());
453 }
454
SetFont(Font const & font)455 void Window::SetFont (Font const& font)
456 {
457 GetWindow ()->SetFont (font);
458 }
459
Invalidate(sal_uInt8 flags)460 void Window::Invalidate (sal_uInt8 flags)
461 {
462 GetWindow ()->Invalidate (flags);
463 }
464
465 struct ToolkitVclPropsMap
466 {
467 WinBits vclStyle;
468 long initAttr;
469 const char *propName;
470
471 // the value to give the prop to enable/disable it -- not the most brilliant
472 // type declaration and storage, but does the work... properties are
473 // either a boolean or a short since they are either a directly wrappers for
474 // a WinBit, or aggregates related (like Align for WB_LEFT, _RIGHT and _CENTER).
475 bool isBoolean;
476 short enableProp, disableProp;
477 };
478
479 #define TYPE_BOOL true
480 #define TYPE_SHORT false
481 #define NOTYPE 0
482 static const ToolkitVclPropsMap toolkitVclPropsMap[] =
483 {
484 { WB_BORDER, awt::WindowAttribute::BORDER, "Border", TYPE_SHORT, 1, 0 },
485 { WB_NOBORDER, awt::VclWindowPeerAttribute::NOBORDER, "Border", TYPE_SHORT, 0, 1 },
486 { WB_SIZEABLE, awt::WindowAttribute::SIZEABLE, NULL, NOTYPE, 0, 0 },
487 { WB_MOVEABLE, awt::WindowAttribute::MOVEABLE, NULL, NOTYPE, 0, 0 },
488 { WB_CLOSEABLE, awt::WindowAttribute::CLOSEABLE, NULL, NOTYPE, 0, 0 },
489
490 { WB_HSCROLL, awt::VclWindowPeerAttribute::HSCROLL, NULL, NOTYPE, 0, 0 },
491 { WB_VSCROLL, awt::VclWindowPeerAttribute::VSCROLL, NULL, NOTYPE, 0, 0 },
492 { WB_LEFT, awt::VclWindowPeerAttribute::LEFT, "Align", TYPE_SHORT, 0, 0 },
493 { WB_CENTER, awt::VclWindowPeerAttribute::CENTER, "Align", TYPE_SHORT, 1, 0 },
494 { WB_RIGHT, awt::VclWindowPeerAttribute::RIGHT, "Align", TYPE_SHORT, 2, 0 },
495 { WB_SPIN, awt::VclWindowPeerAttribute::SPIN, NULL, NOTYPE, 0, 0 },
496 { WB_SORT, awt::VclWindowPeerAttribute::SORT, NULL, NOTYPE, 0, 0 },
497 { WB_DROPDOWN, awt::VclWindowPeerAttribute::DROPDOWN, "Dropdown", TYPE_BOOL, 1, 0 },
498 { WB_DEFBUTTON, awt::VclWindowPeerAttribute::DEFBUTTON, "DefaultButton", TYPE_BOOL, 1, 0 },
499 { WB_READONLY, awt::VclWindowPeerAttribute::READONLY, NULL, NOTYPE, 0, 0 },
500 { WB_CLIPCHILDREN, awt::VclWindowPeerAttribute::CLIPCHILDREN, NULL, NOTYPE, 0, 0 },
501 { WB_GROUP, awt::VclWindowPeerAttribute::GROUP, NULL, NOTYPE, 0, 0 },
502
503 { WB_OK, awt::VclWindowPeerAttribute::OK, NULL, NOTYPE, 0, 0 },
504 { WB_OK_CANCEL, awt::VclWindowPeerAttribute::OK_CANCEL, NULL, NOTYPE, 0, 0 },
505 { WB_YES_NO, awt::VclWindowPeerAttribute::YES_NO, NULL, NOTYPE, 0, 0 },
506 { WB_YES_NO_CANCEL, awt::VclWindowPeerAttribute::YES_NO_CANCEL, NULL, NOTYPE, 1, 0 },
507 { WB_RETRY_CANCEL, awt::VclWindowPeerAttribute::RETRY_CANCEL, NULL, NOTYPE, 1, 0 },
508 { WB_DEF_OK, awt::VclWindowPeerAttribute::DEF_OK, NULL, NOTYPE, 0, 0 },
509 { WB_DEF_CANCEL, awt::VclWindowPeerAttribute::DEF_CANCEL, NULL, NOTYPE, 1, 0 },
510 { WB_DEF_RETRY, awt::VclWindowPeerAttribute::DEF_RETRY, NULL, NOTYPE, 0, 0 },
511 { WB_DEF_YES, awt::VclWindowPeerAttribute::DEF_YES, NULL, NOTYPE, 0, 0 },
512 { WB_DEF_NO, awt::VclWindowPeerAttribute::DEF_NO, NULL, NOTYPE, 0, 0 },
513
514 { WB_AUTOHSCROLL, awt::VclWindowPeerAttribute::AUTOHSCROLL, "AutoHScroll", TYPE_BOOL, 1, 0 },
515 { WB_AUTOVSCROLL, awt::VclWindowPeerAttribute::AUTOVSCROLL, "AutoVScroll", TYPE_BOOL, 1, 0 },
516
517 { WB_WORDBREAK, 0, "MultiLine", TYPE_BOOL, 1, 0 },
518 { WB_NOPOINTERFOCUS, 0, "FocusOnClick", TYPE_BOOL, 1, 0 },
519 { WB_TOGGLE, 0, "Toggle", TYPE_BOOL, 1, 0 },
520 { WB_REPEAT, 0, "Repeat", TYPE_BOOL, 1, 0 },
521 { WB_NOHIDESELECTION, 0, "HideInactiveSelection", TYPE_BOOL, 1, 0 },
522 };
523 #undef TYPE_BOOL
524 #undef TYPE_SHORT
525 #undef NOTYPE
526
527 static const int toolkitVclPropsMapLen =
528 sizeof( toolkitVclPropsMap ) / sizeof( ToolkitVclPropsMap );
529
SetStyle(WinBits nStyle)530 void Window::SetStyle( WinBits nStyle )
531 {
532 uno::Reference< awt::XVclWindowPeer > xPeer = mpImpl->mxVclPeer;
533 for (int i = 0; i < toolkitVclPropsMapLen; i++)
534 {
535 if ( toolkitVclPropsMap[ i ].propName )
536 {
537 short nValue;
538 if ( nStyle & toolkitVclPropsMap[ i ].vclStyle )
539 nValue = toolkitVclPropsMap[ i ].enableProp;
540 else
541 nValue = toolkitVclPropsMap[ i ].disableProp;
542 uno::Any aValue;
543 if ( toolkitVclPropsMap[ i ].isBoolean )
544 aValue = uno::makeAny( (bool) nValue );
545 else
546 aValue = uno::makeAny( (short) nValue );
547 if ( mpImpl )
548 mpImpl->setProperty( toolkitVclPropsMap[ i ].propName, aValue );
549 }
550 }
551 }
552
GetStyle()553 WinBits Window::GetStyle()
554 {
555 uno::Reference< awt::XVclWindowPeer > xPeer = mpImpl->mxVclPeer;
556 WinBits ret = 0;
557 if ( !mpImpl )
558 return 0;
559 for (int i = 0; i < toolkitVclPropsMapLen; i++)
560 {
561 if ( toolkitVclPropsMap[ i ].propName )
562 {
563 short nValue = 0;
564 if ( toolkitVclPropsMap[ i ].isBoolean )
565 {
566 bool bValue = false;
567 mpImpl->getProperty( toolkitVclPropsMap[ i ].propName ) >>= bValue;
568 nValue = bValue ? 1 : 0;
569 }
570 else
571 mpImpl->getProperty( toolkitVclPropsMap[ i ].propName ) >>= nValue;
572 if ( nValue == toolkitVclPropsMap[ i ].enableProp )
573 ret |= toolkitVclPropsMap[i].vclStyle;
574 }
575 }
576 return ret;
577 }
578
579 /* Unpleasant way to get an xToolkit pointer ... */
getToolkit()580 uno::Reference< awt::XToolkit > getToolkit()
581 {
582 static uno::Reference< awt::XToolkit > xToolkit;
583 if (!xToolkit.is())
584 {
585 // Urgh ...
586 xToolkit = uno::Reference< awt::XToolkit >(
587 ::comphelper::getProcessServiceFactory()->createInstance(
588 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ) ),
589 uno::UNO_QUERY );
590 if ( !xToolkit.is() )
591 throw uno::RuntimeException(
592 OUString( RTL_CONSTASCII_USTRINGPARAM( "failed to create toolkit!") ),
593 uno::Reference< uno::XInterface >() );
594 }
595 return xToolkit;
596 }
597
CreatePeer(Window * parent,WinBits nStyle,const char * pName)598 PeerHandle Window::CreatePeer( Window *parent, WinBits nStyle, const char *pName)
599 {
600 long nWinAttrbs = 0;
601 for (int i = 0; i < toolkitVclPropsMapLen; i++)
602 if ( nStyle & toolkitVclPropsMap[ i ].vclStyle )
603 nWinAttrbs |= toolkitVclPropsMap[ i ].initAttr;
604
605 return layoutimpl::WidgetFactory::createWidget (getToolkit(), parent->GetPeer(), OUString::createFromAscii( pName ), nWinAttrbs);
606 }
607
Enable(bool bEnable)608 void Window::Enable( bool bEnable )
609 {
610 if ( !getImpl()->mxWindow.is() )
611 return;
612 getImpl()->mxWindow->setEnable( bEnable );
613 }
614
Show(bool bVisible)615 void Window::Show( bool bVisible )
616 {
617 if ( !getImpl()->mxWindow.is() )
618 return;
619 getImpl()->mxWindow->setVisible( bVisible );
620 if (!bVisible)
621 getImpl()->bFirstTimeVisible = true;
622 else if (GetParent() && getImpl()->bFirstTimeVisible)
623 {
624 getImpl()->redraw ();
625 getImpl()->bFirstTimeVisible = false;
626 }
627 }
628
GrabFocus()629 void Window::GrabFocus()
630 {
631 if ( !getImpl()->mxWindow.is() )
632 return;
633 getImpl()->mxWindow->setFocus();
634 }
635
SetUpdateMode(bool mode)636 void Window::SetUpdateMode(bool mode)
637 {
638 GetWindow()->SetUpdateMode( mode );
639 }
640
SetPointer(Pointer const & pointer)641 void Window::SetPointer( Pointer const& pointer )
642 {
643 GetWindow()->SetPointer( pointer );
644 }
645
GetPointer() const646 Pointer const& Window::GetPointer() const
647 {
648 return GetWindow()->GetPointer();
649 }
650
SetText(OUString const & str)651 void Window::SetText( OUString const& str )
652 {
653 GetWindow()->SetText( str );
654 }
655
GetText() const656 String Window::GetText() const
657 {
658 return GetWindow()->GetText();
659 }
660
GetCtrlTextWidth(OUString const &) const661 sal_Int32 Window::GetCtrlTextWidth (OUString const&) const
662 {
663 return 0;
664 }
665
GetTextHeight() const666 sal_Int32 Window::GetTextHeight () const
667 {
668 return 0;
669 }
670
LogicToPixel(Size const & size,MapMode const &) const671 Size Window::LogicToPixel( Size const& size, MapMode const&) const
672 {
673 return size;
674 }
675
ControlImpl(Context * context,const PeerHandle & peer,Window * window)676 ControlImpl::ControlImpl (Context *context, const PeerHandle &peer, Window *window)
677 : WindowImpl( context, peer, window )
678 {
679 }
680
~ControlImpl()681 ControlImpl::~ControlImpl ()
682 {
683 if ((!!mGetFocusHdl || !!mLoseFocusHdl) && mxWindow.is ())
684 /* Disposing will be done @ VCLXWindow::dispose () maFocusListeners.disposeAndClear()
685 don't do it twice */
686 mxWindow.clear ();
687 }
688
SetGetFocusHdl(Link const & link)689 void ControlImpl::SetGetFocusHdl (Link const& link)
690 {
691 if (!mLoseFocusHdl || !link)
692 UpdateListening (link);
693 mGetFocusHdl = link;
694 }
695
GetGetFocusHdl()696 Link& ControlImpl::GetGetFocusHdl ()
697 {
698 return mGetFocusHdl;
699 }
700
SetLoseFocusHdl(Link const & link)701 void ControlImpl::SetLoseFocusHdl (Link const& link)
702 {
703 if (!mGetFocusHdl || !link)
704 UpdateListening (link);
705 mLoseFocusHdl = link;
706 }
707
GetLoseFocusHdl()708 Link& ControlImpl::GetLoseFocusHdl ()
709 {
710 return mGetFocusHdl;
711 }
712
UpdateListening(Link const & link)713 void ControlImpl::UpdateListening (Link const& link)
714 {
715 if (!link && (!!mGetFocusHdl || !!mLoseFocusHdl)
716 && (!mGetFocusHdl || !mLoseFocusHdl))
717 mxWindow->removeFocusListener (this);
718 else if (!!link && !mGetFocusHdl && !mLoseFocusHdl)
719 mxWindow->addFocusListener (this);
720 }
721
disposing(lang::EventObject const &)722 void SAL_CALL ControlImpl::disposing (lang::EventObject const&)
723 throw (uno::RuntimeException)
724 {
725 /// mxWindow.clear ();
726 }
727
focusGained(awt::FocusEvent const &)728 void SAL_CALL ControlImpl::focusGained (awt::FocusEvent const&)
729 throw (uno::RuntimeException)
730 {
731 mGetFocusHdl.Call (mpWindow);
732 }
733
focusLost(awt::FocusEvent const &)734 void SAL_CALL ControlImpl::focusLost (awt::FocusEvent const&)
735 throw (uno::RuntimeException)
736 {
737 mLoseFocusHdl.Call (mpWindow);
738 }
739
GetGetFocusHdl()740 Link& Control::GetGetFocusHdl ()
741 {
742 return getImpl()->GetGetFocusHdl ();
743 }
744
SetGetFocusHdl(Link const & link)745 void Control::SetGetFocusHdl (Link const& link)
746 {
747 if (getImpl() && getImpl()->mxWindow.is ())
748 getImpl()->SetGetFocusHdl (link);
749 }
750
GetLoseFocusHdl()751 Link& Control::GetLoseFocusHdl ()
752 {
753 return getImpl()->GetLoseFocusHdl ();
754 }
755
SetLoseFocusHdl(Link const & link)756 void Control::SetLoseFocusHdl (Link const& link)
757 {
758 if (getImpl() && getImpl()->mxWindow.is ())
759 getImpl()->SetLoseFocusHdl (link);
760 }
761
762 class DialogImpl : public WindowImpl
763 {
764 public:
765 uno::Reference< awt::XDialog2 > mxDialog;
766 DialogImpl( Context *context, PeerHandle const &peer, Window *window );
767 };
768
DialogImpl(Context * context,const PeerHandle & peer,Window * window)769 DialogImpl::DialogImpl( Context *context, const PeerHandle &peer, Window *window )
770 : WindowImpl( context, peer, window )
771 , mxDialog( peer, uno::UNO_QUERY )
772 {
773 }
774
Dialog(Window * parent,const char * xml_file,const char * id,sal_uInt32 nId)775 Dialog::Dialog( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId )
776 : Context( xml_file )
777 , Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) )
778 , bConstruct (true)
779 {
780 if ( parent )
781 SetParent( parent );
782 }
783
Dialog(::Window * parent,const char * xml_file,const char * id,sal_uInt32 nId)784 Dialog::Dialog( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId )
785 : Context( xml_file )
786 , Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) )
787 {
788 if ( parent )
789 SetParent( parent );
790 }
791
~Dialog()792 Dialog::~Dialog ()
793 {
794 }
795
796 IMPL_GET_WINDOW (Dialog);
797 IMPL_GET_IMPL (Dialog);
798
799 #define MX_DIALOG if (getImpl()->mxDialog.is ()) getImpl()->mxDialog
800 #define RETURN_MX_DIALOG if (getImpl()->mxDialog.is ()) return getImpl()->mxDialog
801
Execute()802 short Dialog::Execute()
803 {
804 RETURN_MX_DIALOG->execute ();
805 return -1;
806 }
807
EndDialog(long result)808 void Dialog::EndDialog( long result )
809 {
810 MX_DIALOG->endDialog (result);
811 }
812
SetText(OUString const & str)813 void Dialog::SetText( OUString const& str )
814 {
815 SetTitle (str);
816 }
817
SetTitle(OUString const & str)818 void Dialog::SetTitle( OUString const& str )
819 {
820 MX_DIALOG->setTitle (str);
821 }
822
Close()823 bool Dialog::Close ()
824 {
825 EndDialog (false);
826 return true;
827 }
828
Notify(NotifyEvent & event)829 long Dialog::Notify (NotifyEvent& event)
830 {
831 return GetDialog ()->Notify (event);
832 }
833
Initialize(SfxChildWinInfo *)834 void Dialog::Initialize (SfxChildWinInfo*)
835 {
836 }
837
838 #define MESSAGE_BOX_MEMBER_INIT\
839 Dialog (parent, xml_file, id)\
840 , imageError (this, "FI_ERROR")\
841 , imageInfo (this, "FI_INFO")\
842 , imageQuery (this, "FI_QUERY")\
843 , imageWarning (this, "FI_WARNING")\
844 , messageText (this, "FT_MESSAGE")\
845 , cancelButton (this, "BTN_CANCEL")\
846 , helpButton (this, "BTN_HELP")\
847 , ignoreButton (this, "BTN_IGNORE")\
848 , noButton (this, "BTN_NO")\
849 , retryButton (this, "BTN_RETRY")\
850 , yesButton (this, "BTN_YES")
851
MessageBox(::Window * parent,char const * message,char const * yes,char const * no,const rtl::OString & help_id,char const * xml_file,char const * id)852 MessageBox::MessageBox (::Window *parent, char const* message,
853 char const* yes, char const* no, const rtl::OString& help_id,
854 char const* xml_file, char const* id)
855 : MESSAGE_BOX_MEMBER_INIT
856 {
857 ignoreButton.Hide ();
858 retryButton.Hide ();
859 init (message, yes, no, help_id);
860 }
861
862 MessageBox::MessageBox (::Window *parent, OUString const& message,
863 OUString yes, OUString no, const rtl::OString& help_id,
864 char const* xml_file, char const* id)
865 : MESSAGE_BOX_MEMBER_INIT
866 {
867 ignoreButton.Hide ();
868 retryButton.Hide ();
869 init (message, yes, no, help_id);
870 }
871
872 #if !defined (__GNUC__)
873 #define __PRETTY_FUNCTION__ __FUNCTION__
874 #endif /* !__GNUC__ */
875
876 MessageBox::MessageBox (::Window *parent, WinBits bits, char const* message,
877 char const* yes, char const* no, const rtl::OString& help_id,
878 char const* xml_file, char const* id)
879 : MESSAGE_BOX_MEMBER_INIT
880 {
881 // HIG suggests using verbs instead of yes/no/retry etc.
882 // This constructor provides client-code compatibility: Client code should be fixed.
883 #ifndef __SUNPRO_CC
884 OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__);
885 #endif
886 bits_init (bits, OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id);
887 }
888
889 MessageBox::MessageBox (::Window *parent, WinBits bits, OUString const& message,
890 OUString yes, OUString no, const rtl::OString& help_id,
891 char const* xml_file, char const* id)
892 : MESSAGE_BOX_MEMBER_INIT
893 {
894 // HIG suggests using verbs instead of yes/no/retry etc.
895 // This constructor provides client-code compatibility: Client code should be fixed.
896 #ifndef __SUNPRO_CC
897 OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__);
898 #endif
899 bits_init (bits, message, yes, no, help_id);
900 }
901
902 void MessageBox::bits_init (WinBits bits, OUString const& message,
903 OUString yes, OUString no, const rtl::OString& help_id)
904 {
905 if ( bits & ( WB_OK_CANCEL | WB_OK ))
906 yes = Button::GetStandardText ( BUTTON_OK );
907 if ( bits & (WB_YES_NO | WB_YES_NO_CANCEL ))
908 {
909 yes = Button::GetStandardText ( BUTTON_YES );
910 no = Button::GetStandardText ( BUTTON_NO );
911 }
912 if (! (bits & (WB_RETRY_CANCEL | WB_YES_NO_CANCEL | WB_ABORT_RETRY_IGNORE )))
913 cancelButton.Hide ();
914 if (! (bits & (WB_RETRY_CANCEL | WB_ABORT_RETRY_IGNORE)))
915 retryButton.Hide ();
916 if ( bits & WB_ABORT_RETRY_IGNORE )
917 cancelButton.SetText ( Button::GetStandardText (BUTTON_ABORT));
918 else
919 ignoreButton.Hide ();
920 if ( !(bits & ( WB_OK | WB_OK_CANCEL | WB_YES_NO | WB_YES_NO_CANCEL)))
921 yesButton.Hide ();
922 if ( !(bits & ( WB_YES_NO | WB_YES_NO_CANCEL)))
923 noButton.Hide ();
924
925 init (message, yes, no, help_id);
926 }
927
init(char const * message,char const * yes,char const * no,const rtl::OString & help_id)928 void MessageBox::init (char const* message, char const* yes, char const* no, const rtl::OString& help_id)
929 {
930 init ( OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id);
931 }
932
init(OUString const & message,OUString const & yes,OUString const & no,const rtl::OString & help_id)933 void MessageBox::init (OUString const& message, OUString const& yes, OUString const& no, const rtl::OString& help_id)
934 {
935 imageError.Hide ();
936 imageInfo.Hide ();
937 imageQuery.Hide ();
938 imageWarning.Hide ();
939 if (message.getLength ())
940 messageText.SetText (message);
941 if (yes.getLength ())
942 {
943 yesButton.SetText (yes);
944 if (yes != OUString (Button::GetStandardText (BUTTON_OK))
945 && yes != OUString (Button::GetStandardText (BUTTON_YES)))
946 SetTitle (yes);
947 if (no.getLength ())
948 noButton.SetText (no);
949 else
950 noButton.Hide ();
951 }
952 if( !help_id.isEmpty())
953 SetHelpId (help_id);
954 else
955 helpButton.Hide ();
956 }
957
958 #undef MESSAGE_BOX_IMPL
959 #define MESSAGE_BOX_IMPL(Name)\
960 Name##Box::Name##Box (::Window *parent, char const* message,\
961 char const* yes, char const* no, const rtl::OString& help_id,\
962 char const* xml_file, char const* id)\
963 : MessageBox (parent, message, yes, no, help_id, xml_file, id)\
964 {\
965 image##Name.Show ();\
966 }\
967 Name##Box::Name##Box (::Window *parent, OUString const& message,\
968 OUString yes, OUString no, const rtl::OString& help_id,\
969 char const* xml_file, char const* id)\
970 : MessageBox (parent, message, yes, no, help_id, xml_file, id)\
971 {\
972 image##Name.Show ();\
973 }\
974 Name##Box::Name##Box (::Window *parent, WinBits bits, char const* message,\
975 char const* yes, char const* no, const rtl::OString& help_id,\
976 char const* xml_file, char const* id)\
977 : MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\
978 {\
979 image##Name.Show ();\
980 }\
981 Name##Box::Name##Box (::Window *parent, WinBits bits, OUString const& message,\
982 OUString yes, OUString no, const rtl::OString& help_id,\
983 char const* xml_file, char const* id)\
984 : MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\
985 {\
986 image##Name.Show ();\
987 }
988
989 MESSAGE_BOX_IMPL (Error);
990 MESSAGE_BOX_IMPL (Info);
991 MESSAGE_BOX_IMPL (Query);
992 MESSAGE_BOX_IMPL (Warning);
993
994 class TabControlImpl
995 : public ControlImpl
996 , public ::cppu::WeakImplHelper1 <awt::XTabListener>
997 {
998 Link mActivatePageHdl;
999 Link mDeactivatePageHdl;
1000
1001 public:
1002 uno::Reference <awt::XSimpleTabController> mxTabControl;
TabControlImpl(Context * context,const PeerHandle & peer,Window * window)1003 TabControlImpl (Context *context, const PeerHandle &peer, Window *window)
1004 : ControlImpl (context, peer, window)
1005 , mxTabControl (peer, uno::UNO_QUERY)
1006 {
1007 }
1008
disposing(lang::EventObject const & e)1009 virtual void SAL_CALL disposing (lang::EventObject const& e)
1010 throw (uno::RuntimeException)
1011 {
1012 ControlImpl::disposing (e);
1013 mxTabControl.clear ();
1014 }
1015
GetActivatePageHdl()1016 Link& GetActivatePageHdl ()
1017 {
1018 return mActivatePageHdl;
1019 }
1020
SetActivatePageHdl(Link const & link)1021 void SetActivatePageHdl (Link const& link)
1022 {
1023 if (!mDeactivatePageHdl || !link)
1024 UpdateListening (link);
1025 mActivatePageHdl = link;
1026 }
1027
GetDeactivatePageHdl()1028 Link& GetDeactivatePageHdl ()
1029 {
1030 return mDeactivatePageHdl;
1031 }
1032
SetDeactivatePageHdl(Link const & link)1033 void SetDeactivatePageHdl (Link const& link)
1034 {
1035 if (!mActivatePageHdl || !link)
1036 UpdateListening (link);
1037 mDeactivatePageHdl = link;
1038 }
1039
UpdateListening(Link const & link)1040 void UpdateListening (Link const& link)
1041 {
1042 if (!link && (!!mActivatePageHdl || !!mDeactivatePageHdl))
1043 mxTabControl->removeTabListener (this);
1044 else if (!!link && !mActivatePageHdl && !mDeactivatePageHdl)
1045 mxTabControl->addTabListener (this);
1046 }
1047
activated(sal_Int32)1048 void SAL_CALL activated (sal_Int32)
1049 throw (uno::RuntimeException)
1050 {
1051 mActivatePageHdl.Call (mpWindow);
1052 }
1053
deactivated(sal_Int32)1054 void SAL_CALL deactivated (sal_Int32)
1055 throw (uno::RuntimeException)
1056 {
1057 mDeactivatePageHdl.Call (mpWindow);
1058 }
1059
inserted(sal_Int32)1060 void SAL_CALL inserted (sal_Int32)
1061 throw (uno::RuntimeException)
1062 {
1063 }
1064
removed(sal_Int32)1065 void SAL_CALL removed (sal_Int32)
1066 throw (uno::RuntimeException)
1067 {
1068 }
1069
changed(sal_Int32,uno::Sequence<beans::NamedValue> const &)1070 void SAL_CALL changed (sal_Int32, uno::Sequence <beans::NamedValue> const&)
1071 throw (uno::RuntimeException)
1072 {
1073 }
1074 };
1075
1076 IMPL_GET_WINDOW (TabControl);
1077 IMPL_GET_LAYOUT_VCLXWINDOW (TabControl);
1078
1079 #define MX_TABCONTROL if (getImpl()->mxTabControl.is ()) getImpl()->mxTabControl
1080 #define RETURN_MX_TABCONTROL if (getImpl()->mxTabControl.is ()) return getImpl ()->mxTabControl
1081
~TabControl()1082 TabControl::~TabControl ()
1083 {
1084 SetActivatePageHdl (Link ());
1085 SetDeactivatePageHdl (Link ());
1086 }
1087
InsertPage(sal_uInt16 id,OUString const & title,sal_uInt16 pos)1088 void TabControl::InsertPage (sal_uInt16 id, OUString const& title, sal_uInt16 pos)
1089 {
1090 (void) pos;
1091 // GetTabControl ()->InsertPage (id, title, pos);
1092 // GetTabControl ()->SetTabPage (id, new ::TabPage (GetTabControl ()));
1093
1094 MX_TABCONTROL->insertTab ();
1095 SetCurPageId (id);
1096
1097 #if 1 // colour me loc productive -- NOT
1098 #define ADD_PROP( seq, i, name, val )\
1099 { \
1100 beans::NamedValue value; \
1101 value.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( name ) ); \
1102 value.Value = uno::makeAny( val ); \
1103 seq[i] = value; \
1104 }
1105
1106 uno::Sequence< beans::NamedValue > seq (1);
1107 ADD_PROP ( seq, 0, "Title", OUString (title) );
1108 MX_TABCONTROL->setTabProps (id, seq);
1109 #else
1110 GetTabPage (id)->SetText (title);
1111 #endif
1112
1113 #if 0
1114 /// This so seems the right solution, but it makes the buttons of the
1115 /// tabdialog move up
1116
1117 ::TabPage *page = GetTabPage (id);
1118 if (Window *w = dynamic_cast <Window*> (page))
1119 {
1120 w->SetParent (this);
1121 //GetVCLXTabControl ()->Box_Base::addChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1122 //GetVCLXTabControl ()->Box_Base::AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1123 //GetVCLXTabControl ()->AddChild (w);
1124 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1125 //uno::Reference <uno::XInterface> x (page->GetWindowPeer());
1126 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->::Window::GetWindowPeer (), uno::UNO_QUERY));
1127 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetComponentInterface (), uno::UNO_QUERY));
1128 }
1129 getImpl()->redraw ();
1130 #endif
1131 }
RemovePage(sal_uInt16 id)1132 void TabControl::RemovePage (sal_uInt16 id)
1133 {
1134 GetTabControl ()->RemovePage (id);
1135 }
GetPageCount() const1136 sal_uInt16 TabControl::GetPageCount () const
1137 {
1138 return GetTabControl ()->GetPageCount ();
1139 }
GetPageId(sal_uInt16 pos) const1140 sal_uInt16 TabControl::GetPageId (sal_uInt16 pos) const
1141 {
1142 return GetTabControl ()->GetPageId (pos);
1143 }
GetPagePos(sal_uInt16 id) const1144 sal_uInt16 TabControl::GetPagePos (sal_uInt16 id) const
1145 {
1146 getImpl()->redraw ();
1147 return GetTabControl ()->GetPagePos (id);
1148 }
SetCurPageId(sal_uInt16 id)1149 void TabControl::SetCurPageId (sal_uInt16 id)
1150 {
1151 getImpl()->redraw ();
1152 GetTabControl ()->SetCurPageId (id);
1153 }
GetCurPageId() const1154 sal_uInt16 TabControl::GetCurPageId () const
1155 {
1156 return GetTabControl ()->GetCurPageId ();
1157 }
SetTabPage(sal_uInt16 id,::TabPage * page)1158 void TabControl::SetTabPage (sal_uInt16 id, ::TabPage* page)
1159 {
1160 GetTabControl ()->SetTabPage (id, page);
1161
1162 #if 0
1163 /// This so seems the right solution, but it makes the buttons of the
1164 /// tabdialog move up
1165 if (Window *w = dynamic_cast <Window*> (page))
1166 {
1167 w->SetParent (this);
1168 //GetVCLXTabControl ()->Box_Base::addChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1169 //GetVCLXTabControl ()->Box_Base::AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1170 //GetVCLXTabControl ()->AddChild (w);
1171 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY));
1172 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetWindowPeer (), uno::UNO_QUERY));
1173 //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetComponentInterface (), uno::UNO_QUERY));
1174 }
1175 #endif
1176 getImpl()->redraw ();
1177 }
GetTabPage(sal_uInt16 id) const1178 ::TabPage* TabControl::GetTabPage (sal_uInt16 id) const
1179 {
1180 return GetTabControl ()->GetTabPage (id);
1181 }
SetActivatePageHdl(Link const & link)1182 void TabControl::SetActivatePageHdl (Link const& link)
1183 {
1184 if (getImpl() && getImpl()->mxTabControl.is ())
1185 getImpl()->SetActivatePageHdl (link);
1186 }
GetActivatePageHdl() const1187 Link& TabControl::GetActivatePageHdl () const
1188 {
1189 return getImpl()->GetActivatePageHdl ();
1190 }
SetDeactivatePageHdl(Link const & link)1191 void TabControl::SetDeactivatePageHdl (Link const& link)
1192 {
1193 if (getImpl() && getImpl()->mxTabControl.is ())
1194 getImpl()->SetDeactivatePageHdl (link);
1195 }
GetDeactivatePageHdl() const1196 Link& TabControl::GetDeactivatePageHdl () const
1197 {
1198 return getImpl()->GetDeactivatePageHdl ();
1199 }
SetTabPageSizePixel(Size const & size)1200 void TabControl::SetTabPageSizePixel (Size const& size)
1201 {
1202 GetTabControl ()->SetTabPageSizePixel (size);
1203 // GetParent()->SetSizePixel (size);
1204 // GetWindow()->SetSizePixel (size);
1205 //GetVCLXTabControl->SetTabSize (size);
1206 }
GetTabPageSizePixel() const1207 Size TabControl::GetTabPageSizePixel () const
1208 {
1209 #if 0
1210 //return GetTabControl ()->GetTabPageSizePixel ();
1211 static size_t const tab_page_first_index = 1;
1212 for (size_t i = 0; i < GetPageCount (); i++)
1213 {
1214 ::TabPage *p = GetTabPage (i + tab_page_first_index);
1215 //if (dynamic_cast<Windowt*> (p))
1216 if (i) // URG
1217 return p->GetOptimalSize (WINDOWSIZE_MINIMUM);
1218 }
1219 #endif
1220 return GetTabControl ()->GetTabPageSizePixel ();
1221 }
1222
1223 IMPL_CONSTRUCTORS (TabControl, Control, "tabcontrol");
1224 IMPL_GET_IMPL (TabControl);
1225
1226 class TabPageImpl : public WindowImpl
1227 {
1228 public:
1229 uno::Reference< awt::XWindow > mxTabPage;
TabPageImpl(Context * context,const PeerHandle & peer,Window * window)1230 TabPageImpl( Context *context, const PeerHandle &peer, Window *window )
1231 : WindowImpl( context, peer, window )
1232 , mxTabPage( peer, uno::UNO_QUERY )
1233 {
1234 }
1235 };
1236
1237 ::Window* TabPage::global_parent = 0;
1238 TabControl* TabPage::global_tabcontrol = 0;
1239
1240 IMPL_GET_IMPL( TabPage );
1241
TabPage(Window * parent,const char * xml_file,const char * id,sal_uInt32 nId)1242 TabPage::TabPage( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId)
1243 : Context( xml_file )
1244 , Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) )
1245 {
1246 if ( parent )
1247 SetParent( parent );
1248 }
1249
TabPage(::Window * parent,const char * xml_file,const char * id,sal_uInt32 nId)1250 TabPage::TabPage( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId)
1251 : Context( xml_file )
1252 , Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) )
1253 {
1254 if ( parent )
1255 SetParent( parent );
1256 }
1257
~TabPage()1258 TabPage::~TabPage()
1259 {
1260 delete GetTabPage();
1261 }
1262
1263 IMPL_GET_WINDOW( TabPage );
1264
ActivatePage()1265 void TabPage::ActivatePage()
1266 {
1267 }
1268
DeactivatePage()1269 void TabPage::DeactivatePage()
1270 {
1271 }
1272
1273 class FixedLineImpl : public ControlImpl
1274 {
1275 public:
FixedLineImpl(Context * context,const PeerHandle & peer,Window * window)1276 FixedLineImpl( Context *context, const PeerHandle &peer, Window *window )
1277 : ControlImpl( context, peer, window )
1278 {
1279 }
1280 };
1281
1282 IMPL_CONSTRUCTORS( FixedLine, Control, "hfixedline" );
1283 IMPL_GET_IMPL( FixedLine );
1284
IsEnabled() const1285 bool FixedLine::IsEnabled() const
1286 {
1287 //FIXME
1288 return true;
1289 }
1290
1291 class FixedTextImpl : public ControlImpl
1292 {
1293 public:
1294 uno::Reference< awt::XFixedText > mxFixedText;
FixedTextImpl(Context * context,const PeerHandle & peer,Window * window)1295 FixedTextImpl( Context *context, const PeerHandle &peer, Window *window )
1296 : ControlImpl( context, peer, window )
1297 , mxFixedText( peer, uno::UNO_QUERY )
1298 {
1299 }
1300
1301 ~FixedTextImpl ();
1302
1303 virtual void SAL_CALL disposing( lang::EventObject const& e )
1304 throw (uno::RuntimeException);
1305 };
1306
~FixedTextImpl()1307 FixedTextImpl::~FixedTextImpl ()
1308 {
1309 }
1310
disposing(lang::EventObject const & e)1311 void SAL_CALL FixedTextImpl::disposing( lang::EventObject const& e )
1312 throw (uno::RuntimeException)
1313 {
1314 ControlImpl::disposing (e);
1315 mxFixedText.clear ();
1316 }
1317
~FixedText()1318 FixedText::~FixedText ()
1319 {
1320 }
1321
1322 IMPL_CONSTRUCTORS( FixedText, Control, "fixedtext" );
1323 IMPL_GET_IMPL( FixedText );
1324
SetText(OUString const & rStr)1325 void FixedText::SetText( OUString const& rStr )
1326 {
1327 if ( !getImpl()->mxFixedText.is() )
1328 return;
1329 getImpl()->mxFixedText->setText( rStr );
1330 }
1331
1332 class FixedInfoImpl : public FixedTextImpl
1333 {
1334 public:
FixedInfoImpl(Context * context,const PeerHandle & peer,Window * window)1335 FixedInfoImpl( Context *context, const PeerHandle &peer, Window *window )
1336 : FixedTextImpl( context, peer, window )
1337 {
1338 }
1339 };
1340
1341 IMPL_CONSTRUCTORS( FixedInfo, FixedText, "fixedinfo" );
1342 IMPL_GET_IMPL( FixedInfo );
1343
1344 class ProgressBarImpl : public ControlImpl
1345 {
1346 public:
1347 uno::Reference< awt::XProgressBar > mxProgressBar;
ProgressBarImpl(Context * context,const PeerHandle & peer,Window * window)1348 ProgressBarImpl( Context *context, const PeerHandle &peer, Window *window )
1349 : ControlImpl( context, peer, window )
1350 , mxProgressBar( peer, uno::UNO_QUERY )
1351 {
1352 }
1353
disposing(lang::EventObject const & e)1354 virtual void SAL_CALL disposing( lang::EventObject const& e )
1355 throw (uno::RuntimeException)
1356 {
1357 ControlImpl::disposing (e);
1358 mxProgressBar.clear ();
1359 }
1360 };
1361
1362
1363 class FixedImageImpl: public ControlImpl
1364 {
1365 public:
1366 uno::Reference< graphic::XGraphic > mxGraphic;
FixedImageImpl(Context * context,const PeerHandle & peer,Window * window)1367 FixedImageImpl( Context *context, const PeerHandle &peer, Window *window)
1368 // const char *pName )
1369 : ControlImpl( context, peer, window )
1370 //, mxGraphic( layoutimpl::loadGraphic( pName ) )
1371 , mxGraphic( peer, uno::UNO_QUERY )
1372 {
1373 if ( !mxGraphic.is() )
1374 {
1375 DBG_ERROR( "ERROR: failed to load image: `%s'" /*, pName*/ );
1376 }
1377 #if 0
1378 else
1379 getImpl()->mxGraphic->...();
1380 #endif
1381 }
1382 };
1383
1384 IMPL_CONSTRUCTORS( FixedImage, Control, "fixedimage" );
IMPL_GET_IMPL(FixedImage)1385 IMPL_GET_IMPL( FixedImage )
1386
1387 void FixedImage::setImage( ::Image const& i )
1388 {
1389 (void) i;
1390 if ( !getImpl()->mxGraphic.is() )
1391 return;
1392 //FIXME: hack moved to proplist
1393 //getImpl()->mxGraphic =
1394 }
1395
1396 #if 0
1397
1398 FixedImage::FixedImage( const char *pName )
1399 : pImpl( new FixedImageImpl( pName ) )
1400 {
1401 }
1402
1403 FixedImage::~FixedImage()
1404 {
1405 delete pImpl;
1406 }
1407
1408 #endif
1409
1410
1411 IMPL_CONSTRUCTORS( ProgressBar, Control, "ProgressBar" );
1412 IMPL_GET_IMPL( ProgressBar );
1413
SetForegroundColor(util::Color color)1414 void ProgressBar::SetForegroundColor( util::Color color )
1415 {
1416 if ( !getImpl()->mxProgressBar.is() )
1417 return;
1418 getImpl()->mxProgressBar->setForegroundColor( color );
1419 }
1420
SetBackgroundColor(util::Color color)1421 void ProgressBar::SetBackgroundColor( util::Color color )
1422 {
1423 if ( !getImpl()->mxProgressBar.is() )
1424 return;
1425 getImpl()->mxProgressBar->setBackgroundColor( color );
1426 }
1427
SetValue(sal_Int32 i)1428 void ProgressBar::SetValue( sal_Int32 i )
1429 {
1430 if ( !getImpl()->mxProgressBar.is() )
1431 return;
1432 getImpl()->mxProgressBar->setValue( i );
1433 }
1434
SetRange(sal_Int32 min,sal_Int32 max)1435 void ProgressBar::SetRange( sal_Int32 min, sal_Int32 max )
1436 {
1437 if ( !getImpl()->mxProgressBar.is() )
1438 return;
1439 getImpl()->mxProgressBar->setRange( min, max );
1440 }
1441
GetValue()1442 sal_Int32 ProgressBar::GetValue()
1443 {
1444 if ( !getImpl()->mxProgressBar.is() )
1445 return 0;
1446 return getImpl()->mxProgressBar->getValue();
1447 }
1448
1449 class PluginImpl: public ControlImpl
1450 {
1451 public:
1452 ::Control *mpPlugin;
1453
PluginImpl(Context * context,const PeerHandle & peer,Window * window,::Control * plugin)1454 PluginImpl( Context *context, const PeerHandle &peer, Window *window, :: Control *plugin )
1455 : ControlImpl( context, peer, window )
1456 , mpPlugin( plugin )
1457 {
1458 uno::Reference <awt::XWindow> ref( mxWindow, uno::UNO_QUERY );
1459 layoutimpl::VCLXPlugin *vcl
1460 = static_cast<layoutimpl::VCLXPlugin*>( VCLXWindow::GetImplementation( ref ) );
1461 ::Window *parent = vcl->mpWindow->GetParent();
1462 vcl->SetWindow( plugin );
1463 vcl->SetPlugin( mpPlugin );
1464 plugin->SetParent( parent );
1465 plugin->SetStyle( vcl->mStyle );
1466 plugin->SetCreatedWithToolkit( true );
1467 plugin->SetComponentInterface( vcl );
1468 plugin->Show();
1469 }
1470 };
1471
Plugin(Context * context,char const * id,::Control * plugin)1472 Plugin::Plugin( Context *context, char const *id, ::Control *plugin )
1473 : Control( new PluginImpl( context, context->GetPeerHandle( id, 0 ), this, plugin ) )
1474 , mpPlugin( plugin )
1475 {
1476 }
1477
1478 IMPL_GET_IMPL( Plugin );
1479
1480 class LocalizedStringImpl : public WindowImpl
1481 {
1482 public:
1483 layoutimpl::LocalizedString *mpString;
1484 OUString maString;
LocalizedStringImpl(Context * context,const PeerHandle & peer,Window * window)1485 LocalizedStringImpl( Context *context, const PeerHandle &peer, Window *window )
1486 : WindowImpl( context, peer, window )
1487 , mpString( static_cast<layoutimpl::LocalizedString*>( VCLXWindow::GetImplementation( uno::Reference <awt::XWindow> ( mxWindow, uno::UNO_QUERY ) ) ) )
1488 , maString ()
1489 {
1490 }
getText()1491 OUString getText()
1492 {
1493 if (mpString)
1494 maString = mpString->getText ();
1495 return maString;
1496 }
setText(OUString const & s)1497 void setText( OUString const& s )
1498 {
1499 if (mpString)
1500 mpString->setText( s );
1501 }
1502 };
1503
1504 IMPL_GET_IMPL( LocalizedString );
1505
LocalizedString(Context * context,char const * id)1506 LocalizedString::LocalizedString( Context *context, char const* id )
1507 : Window( new LocalizedStringImpl( context, context->GetPeerHandle( id, 0 ), this ) )
1508 {
1509 }
1510
getString()1511 String LocalizedString::getString ()
1512 {
1513 return getImpl()->getText ();
1514 }
1515
getOUString()1516 OUString LocalizedString::getOUString ()
1517 {
1518 return getImpl()->getText ();
1519 }
1520
operator OUString()1521 LocalizedString::operator OUString ()
1522 {
1523 return getOUString ();
1524 }
1525
1526 LocalizedString::operator OUString const& ()
1527 {
1528 getOUString ();
1529 return getImpl()->maString;
1530 }
1531
operator String()1532 LocalizedString::operator String()
1533 {
1534 getOUString ();
1535 return getImpl()->maString;
1536 }
1537
GetToken(sal_uInt16 i,sal_Char c)1538 String LocalizedString::GetToken (sal_uInt16 i, sal_Char c)
1539 {
1540 return getString ().GetToken (i, c);
1541 }
1542
operator =(OUString const & s)1543 OUString LocalizedString::operator= (OUString const& s)
1544 {
1545 getImpl()->setText( s );
1546 return getImpl()->getText();
1547 }
1548
operator +=(OUString const & b)1549 OUString LocalizedString::operator+= (OUString const& b)
1550 {
1551 OUString a = getImpl()->getText ();
1552 a += b;
1553 getImpl()->setText (a);
1554 return getImpl()->getText ();
1555 }
1556
operator +=(sal_Unicode const b)1557 OUString LocalizedString::operator+= (sal_Unicode const b)
1558 {
1559 String a = getImpl()->getText ();
1560 a += b;
1561 getImpl()->setText (a);
1562 return getImpl()->getText ();
1563 }
1564
1565 class InPlugImpl : public WindowImpl
1566 {
1567 public:
InPlugImpl(Context * context,const PeerHandle & peer,Window * window)1568 InPlugImpl (Context *context, const PeerHandle &peer, Window *window)
1569 : WindowImpl (context, peer, window)
1570 {
1571 }
1572 };
1573
1574 IMPL_GET_IMPL (InPlug);
1575
FIXME_set_parent(::Window * parent,char const * xml_file)1576 static char const *FIXME_set_parent (::Window *parent, char const *xml_file)
1577 {
1578 layout::TabPage::global_parent = parent;
1579 return xml_file;
1580 }
1581
InPlug(Window * parent,char const * xml_file,char const * id,sal_uInt32 nId)1582 InPlug::InPlug (Window *parent, char const* xml_file, char const* id, sal_uInt32 nId)
1583 : Context (FIXME_set_parent (parent ? parent->GetWindow () : 0, xml_file))
1584 , layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this))
1585 {
1586 if (parent)
1587 SetParent (parent);
1588 if (::Window *w = dynamic_cast< ::Window* > (this))
1589 w->SetComponentInterface (GetVCLXWindow ());
1590 }
1591
InPlug(::Window * parent,char const * xml_file,char const * id,sal_uInt32 nId)1592 InPlug::InPlug (::Window *parent, char const* xml_file, char const* id, sal_uInt32 nId)
1593 : Context (FIXME_set_parent (parent, xml_file))
1594 , layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this))
1595 {
1596 if (parent)
1597 layout::Window::SetParent (parent);
1598 if (::Window *w = dynamic_cast< ::Window* > (this))
1599 w->SetComponentInterface (GetVCLXWindow ());
1600 }
1601
ParentSet(Window * window)1602 void InPlug::ParentSet (Window *window)
1603 {
1604 window->SetParent (dynamic_cast< ::Window* > (this));
1605
1606 /// FIXME: for standalone run of layout::SfxTabDialog
1607 SetParent (window->GetParent ());
1608 }
1609
1610 } // namespace layout
1611