xref: /aoo42x/main/sd/source/ui/view/ViewTabBar.cxx (revision 5b190011)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5b190011SAndrew Rist  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5b190011SAndrew Rist  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19*5b190011SAndrew Rist  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "ViewTabBar.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #define USE_TAB_CONTROL
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "ViewShell.hxx"
32cdf0e10cSrcweir #include "ViewShellBase.hxx"
33cdf0e10cSrcweir #include "DrawViewShell.hxx"
34cdf0e10cSrcweir #include "FrameView.hxx"
35cdf0e10cSrcweir #include "EventMultiplexer.hxx"
36cdf0e10cSrcweir #include "framework/FrameworkHelper.hxx"
37cdf0e10cSrcweir #include "framework/Pane.hxx"
38cdf0e10cSrcweir #include "DrawController.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include "sdresid.hxx"
41cdf0e10cSrcweir #include "strings.hrc"
42cdf0e10cSrcweir #include "helpids.h"
43cdf0e10cSrcweir #include "Client.hxx"
44cdf0e10cSrcweir #include <vcl/svapp.hxx>
45cdf0e10cSrcweir #include <vcl/tabpage.hxx>
46cdf0e10cSrcweir #include <vos/mutex.hxx>
47cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
48cdf0e10cSrcweir #include <com/sun/star/drawing/framework/ResourceId.hpp>
49cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XControllerManager.hpp>
50cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp>
51cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
52cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
53cdf0e10cSrcweir #include <tools/diagnose_ex.h>
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace ::com::sun::star;
56cdf0e10cSrcweir using namespace ::com::sun::star::uno;
57cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
58cdf0e10cSrcweir using ::sd::framework::FrameworkHelper;
59cdf0e10cSrcweir using ::sd::tools::EventMultiplexerEvent;
60cdf0e10cSrcweir using ::rtl::OUString;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir namespace sd {
63cdf0e10cSrcweir 
64cdf0e10cSrcweir namespace {
65cdf0e10cSrcweir bool IsEqual (const TabBarButton& rButton1, const TabBarButton& rButton2)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     return (
68cdf0e10cSrcweir         (rButton1.ResourceId.is()
69cdf0e10cSrcweir             && rButton2.ResourceId.is()
70cdf0e10cSrcweir             && rButton1.ResourceId->compareTo(rButton2.ResourceId)==0)
71cdf0e10cSrcweir         || rButton1.ButtonLabel == rButton2.ButtonLabel);
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir class TabBarControl : public ::TabControl
75cdf0e10cSrcweir {
76cdf0e10cSrcweir public:
77cdf0e10cSrcweir     TabBarControl (
78cdf0e10cSrcweir         ::Window* pParentWindow,
79cdf0e10cSrcweir         const ::rtl::Reference<ViewTabBar>& rpViewTabBar);
80cdf0e10cSrcweir     virtual void Paint (const Rectangle& rRect);
81cdf0e10cSrcweir     virtual void ActivatePage (void);
82cdf0e10cSrcweir private:
83cdf0e10cSrcweir     ::rtl::Reference<ViewTabBar> mpViewTabBar;
84cdf0e10cSrcweir };
85cdf0e10cSrcweir 
86cdf0e10cSrcweir } // end of anonymous namespace
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 
92cdf0e10cSrcweir class ViewTabPage : public TabPage
93cdf0e10cSrcweir {
94cdf0e10cSrcweir public:
95cdf0e10cSrcweir     ViewTabPage (Window* pParent) : TabPage(pParent) {}
96cdf0e10cSrcweir     virtual void Resize (void)
97cdf0e10cSrcweir     { SetPosSizePixel(Point(0,0),GetParent()->GetOutputSizePixel()); }
98cdf0e10cSrcweir };
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 
103cdf0e10cSrcweir //===== ViewTabBar ============================================================
104cdf0e10cSrcweir 
105cdf0e10cSrcweir ViewTabBar::ViewTabBar (
106cdf0e10cSrcweir     const Reference<XResourceId>& rxViewTabBarId,
107cdf0e10cSrcweir     const Reference<frame::XController>& rxController)
108cdf0e10cSrcweir     : ViewTabBarInterfaceBase(maMutex),
109cdf0e10cSrcweir       mpTabControl(new TabBarControl(GetAnchorWindow(rxViewTabBarId,rxController), this)),
110cdf0e10cSrcweir       mxController(rxController),
111cdf0e10cSrcweir       maTabBarButtons(),
112cdf0e10cSrcweir       mpTabPage(NULL),
113cdf0e10cSrcweir       mxViewTabBarId(rxViewTabBarId),
114cdf0e10cSrcweir       mpViewShellBase(NULL)
115cdf0e10cSrcweir {
116cdf0e10cSrcweir     // Set one new tab page for all tab entries.  We need it only to
117cdf0e10cSrcweir     // determine the height of the tab bar.
118cdf0e10cSrcweir     mpTabPage.reset(new TabPage (mpTabControl.get()));
119cdf0e10cSrcweir     mpTabPage->Hide();
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     // add some space before the tabitems
122cdf0e10cSrcweir     mpTabControl->SetItemsOffset(Point(5, 3));
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     // Tunnel through the controller and use the ViewShellBase to obtain the
125cdf0e10cSrcweir     // view frame.
126cdf0e10cSrcweir     try
127cdf0e10cSrcweir     {
128cdf0e10cSrcweir         Reference<lang::XUnoTunnel> xTunnel (mxController, UNO_QUERY_THROW);
129cdf0e10cSrcweir         DrawController* pController = reinterpret_cast<DrawController*>(
130cdf0e10cSrcweir             xTunnel->getSomething(DrawController::getUnoTunnelId()));
131cdf0e10cSrcweir         mpViewShellBase = pController->GetViewShellBase();
132cdf0e10cSrcweir     }
133cdf0e10cSrcweir     catch(RuntimeException&)
134cdf0e10cSrcweir     {}
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     // Register as listener at XConfigurationController.
137cdf0e10cSrcweir     Reference<XControllerManager> xControllerManager (mxController, UNO_QUERY);
138cdf0e10cSrcweir     if (xControllerManager.is())
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         mxConfigurationController = xControllerManager->getConfigurationController();
141cdf0e10cSrcweir         if (mxConfigurationController.is())
142cdf0e10cSrcweir         {
143cdf0e10cSrcweir             mxConfigurationController->addConfigurationChangeListener(
144cdf0e10cSrcweir                 this,
145cdf0e10cSrcweir                     FrameworkHelper::msResourceActivationEvent,
146cdf0e10cSrcweir                 Any());
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir     mpTabControl->Show();
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     if (mpViewShellBase != NULL
153cdf0e10cSrcweir         && rxViewTabBarId->isBoundToURL(
154cdf0e10cSrcweir             FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
155cdf0e10cSrcweir     {
156cdf0e10cSrcweir         mpViewShellBase->SetViewTabBar(this);
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir }
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 
163cdf0e10cSrcweir ViewTabBar::~ViewTabBar (void)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 
170cdf0e10cSrcweir void ViewTabBar::disposing (void)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     if (mpViewShellBase != NULL
173cdf0e10cSrcweir         && mxViewTabBarId->isBoundToURL(
174cdf0e10cSrcweir             FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
175cdf0e10cSrcweir     {
176cdf0e10cSrcweir         mpViewShellBase->SetViewTabBar(NULL);
177cdf0e10cSrcweir     }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir     if (mxConfigurationController.is())
180cdf0e10cSrcweir     {
181cdf0e10cSrcweir         // Unregister listener from XConfigurationController.
182cdf0e10cSrcweir         try
183cdf0e10cSrcweir         {
184cdf0e10cSrcweir             mxConfigurationController->removeConfigurationChangeListener(this);
185cdf0e10cSrcweir         }
186cdf0e10cSrcweir         catch (lang::DisposedException e)
187cdf0e10cSrcweir         {
188cdf0e10cSrcweir             // Receiving a disposed exception is the normal case.  Is there
189cdf0e10cSrcweir             // a way to avoid it?
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir         mxConfigurationController = NULL;
192cdf0e10cSrcweir     }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     {
195cdf0e10cSrcweir         const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
196cdf0e10cSrcweir         // Set all references to the one tab page to NULL and delete the page.
197cdf0e10cSrcweir         for (sal_uInt16 nIndex=0; nIndex<mpTabControl->GetPageCount(); ++nIndex)
198cdf0e10cSrcweir             mpTabControl->SetTabPage(nIndex, NULL);
199cdf0e10cSrcweir         mpTabPage.reset();
200cdf0e10cSrcweir         mpTabControl.reset();
201cdf0e10cSrcweir     }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     mxController = NULL;
204cdf0e10cSrcweir }
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 
209cdf0e10cSrcweir ::boost::shared_ptr< ::TabControl> ViewTabBar::GetTabControl (void) const
210cdf0e10cSrcweir {
211cdf0e10cSrcweir     return mpTabControl;
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 
217cdf0e10cSrcweir ::Window* ViewTabBar::GetAnchorWindow(
218cdf0e10cSrcweir     const Reference<XResourceId>& rxViewTabBarId,
219cdf0e10cSrcweir     const Reference<frame::XController>& rxController)
220cdf0e10cSrcweir {
221cdf0e10cSrcweir     ::Window* pWindow = NULL;
222cdf0e10cSrcweir     ViewShellBase* pBase = NULL;
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     // Tunnel through the controller and use the ViewShellBase to obtain the
225cdf0e10cSrcweir     // view frame.
226cdf0e10cSrcweir     try
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir         Reference<lang::XUnoTunnel> xTunnel (rxController, UNO_QUERY_THROW);
229cdf0e10cSrcweir         DrawController* pController = reinterpret_cast<DrawController*>(
230cdf0e10cSrcweir             xTunnel->getSomething(DrawController::getUnoTunnelId()));
231cdf0e10cSrcweir         pBase = pController->GetViewShellBase();
232cdf0e10cSrcweir     }
233cdf0e10cSrcweir     catch(RuntimeException&)
234cdf0e10cSrcweir     {}
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     // The ViewTabBar supports at the moment only the center pane.
237cdf0e10cSrcweir     if (rxViewTabBarId.is()
238cdf0e10cSrcweir         && rxViewTabBarId->isBoundToURL(
239cdf0e10cSrcweir             FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
240cdf0e10cSrcweir     {
241cdf0e10cSrcweir         if (pBase != NULL && pBase->GetViewFrame() != NULL)
242cdf0e10cSrcweir             pWindow = &pBase->GetViewFrame()->GetWindow();
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir     // The rest is (at the moment) just for the emergency case.
246cdf0e10cSrcweir     if (pWindow == NULL)
247cdf0e10cSrcweir     {
248cdf0e10cSrcweir         Reference<XPane> xPane;
249cdf0e10cSrcweir         try
250cdf0e10cSrcweir         {
251cdf0e10cSrcweir             Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY_THROW);
252cdf0e10cSrcweir             Reference<XConfigurationController> xCC (
253cdf0e10cSrcweir                 xControllerManager->getConfigurationController());
254cdf0e10cSrcweir             if (xCC.is())
255cdf0e10cSrcweir                 xPane = Reference<XPane>(xCC->getResource(rxViewTabBarId->getAnchor()), UNO_QUERY);
256cdf0e10cSrcweir         }
257cdf0e10cSrcweir         catch (RuntimeException&)
258cdf0e10cSrcweir         {}
259cdf0e10cSrcweir 
260cdf0e10cSrcweir         // Tunnel through the XWindow to the VCL side.
261cdf0e10cSrcweir         try
262cdf0e10cSrcweir         {
263cdf0e10cSrcweir             Reference<lang::XUnoTunnel> xTunnel (xPane, UNO_QUERY_THROW);
264cdf0e10cSrcweir             framework::Pane* pPane = reinterpret_cast<framework::Pane*>(
265cdf0e10cSrcweir                 xTunnel->getSomething(framework::Pane::getUnoTunnelId()));
266cdf0e10cSrcweir             if (pPane != NULL)
267cdf0e10cSrcweir                 pWindow = pPane->GetWindow()->GetParent();
268cdf0e10cSrcweir         }
269cdf0e10cSrcweir         catch (RuntimeException&)
270cdf0e10cSrcweir         {}
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     return pWindow;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 
279cdf0e10cSrcweir //----- XConfigurationChangeListener ------------------------------------------
280cdf0e10cSrcweir 
281cdf0e10cSrcweir void SAL_CALL  ViewTabBar::notifyConfigurationChange (
282cdf0e10cSrcweir     const ConfigurationChangeEvent& rEvent)
283cdf0e10cSrcweir     throw (RuntimeException)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir     if (rEvent.Type.equals(FrameworkHelper::msResourceActivationEvent)
286cdf0e10cSrcweir         && rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)
287cdf0e10cSrcweir         && rEvent.ResourceId->isBoundTo(mxViewTabBarId->getAnchor(), AnchorBindingMode_DIRECT))
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         UpdateActiveButton();
290cdf0e10cSrcweir     }
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 
296cdf0e10cSrcweir //----- XEventListener --------------------------------------------------------
297cdf0e10cSrcweir 
298cdf0e10cSrcweir void SAL_CALL ViewTabBar::disposing(
299cdf0e10cSrcweir     const lang::EventObject& rEvent)
300cdf0e10cSrcweir     throw (RuntimeException)
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     if (rEvent.Source == mxConfigurationController)
303cdf0e10cSrcweir     {
304cdf0e10cSrcweir         mxConfigurationController = NULL;
305cdf0e10cSrcweir         mxController = NULL;
306cdf0e10cSrcweir     }
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 
312cdf0e10cSrcweir //----- XTabBar ---------------------------------------------------------------
313cdf0e10cSrcweir 
314cdf0e10cSrcweir void SAL_CALL ViewTabBar::addTabBarButtonAfter (
315cdf0e10cSrcweir     const TabBarButton& rButton,
316cdf0e10cSrcweir     const TabBarButton& rAnchor)
317cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
320cdf0e10cSrcweir     AddTabBarButton(rButton, rAnchor);
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 
326cdf0e10cSrcweir void SAL_CALL ViewTabBar::appendTabBarButton (const TabBarButton& rButton)
327cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir     const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
330cdf0e10cSrcweir     AddTabBarButton(rButton);
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 
335cdf0e10cSrcweir void SAL_CALL ViewTabBar::removeTabBarButton (const TabBarButton& rButton)
336cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
337cdf0e10cSrcweir {
338cdf0e10cSrcweir     const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
339cdf0e10cSrcweir     RemoveTabBarButton(rButton);
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 
345cdf0e10cSrcweir sal_Bool SAL_CALL ViewTabBar::hasTabBarButton (const TabBarButton& rButton)
346cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
347cdf0e10cSrcweir {
348cdf0e10cSrcweir     const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
349cdf0e10cSrcweir     return HasTabBarButton(rButton);
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 
355cdf0e10cSrcweir Sequence<TabBarButton> SAL_CALL ViewTabBar::getTabBarButtons (void)
356cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
357cdf0e10cSrcweir {
358cdf0e10cSrcweir     const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
359cdf0e10cSrcweir     return GetTabBarButtons();
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 
365cdf0e10cSrcweir //----- XResource -------------------------------------------------------------
366cdf0e10cSrcweir 
367cdf0e10cSrcweir Reference<XResourceId> SAL_CALL ViewTabBar::getResourceId (void)
368cdf0e10cSrcweir     throw (RuntimeException)
369cdf0e10cSrcweir {
370cdf0e10cSrcweir     return mxViewTabBarId;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 
376cdf0e10cSrcweir sal_Bool SAL_CALL ViewTabBar::isAnchorOnly (void)
377cdf0e10cSrcweir     throw (RuntimeException)
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     return false;
380cdf0e10cSrcweir }
381cdf0e10cSrcweir 
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 
385cdf0e10cSrcweir //----- XUnoTunnel ------------------------------------------------------------
386cdf0e10cSrcweir 
387cdf0e10cSrcweir const Sequence<sal_Int8>& ViewTabBar::getUnoTunnelId (void)
388cdf0e10cSrcweir {
389cdf0e10cSrcweir 	static Sequence<sal_Int8>* pSequence = NULL;
390cdf0e10cSrcweir 	if (pSequence == NULL)
391cdf0e10cSrcweir 	{
392cdf0e10cSrcweir         const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
393cdf0e10cSrcweir 		if (pSequence == NULL)
394cdf0e10cSrcweir 		{
395cdf0e10cSrcweir 			static ::com::sun::star::uno::Sequence<sal_Int8> aSequence (16);
396cdf0e10cSrcweir 			rtl_createUuid((sal_uInt8*)aSequence.getArray(), 0, sal_True);
397cdf0e10cSrcweir 			pSequence = &aSequence;
398cdf0e10cSrcweir 		}
399cdf0e10cSrcweir 	}
400cdf0e10cSrcweir 	return *pSequence;
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 
406cdf0e10cSrcweir sal_Int64 SAL_CALL ViewTabBar::getSomething (const Sequence<sal_Int8>& rId)
407cdf0e10cSrcweir     throw (RuntimeException)
408cdf0e10cSrcweir {
409cdf0e10cSrcweir     sal_Int64 nResult = 0;
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     if (rId.getLength() == 16
412cdf0e10cSrcweir         && rtl_compareMemory(getUnoTunnelId().getConstArray(), rId.getConstArray(), 16) == 0)
413cdf0e10cSrcweir 	{
414cdf0e10cSrcweir 		nResult = reinterpret_cast<sal_Int64>(this);
415cdf0e10cSrcweir 	}
416cdf0e10cSrcweir 
417cdf0e10cSrcweir     return nResult;
418cdf0e10cSrcweir }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 
423cdf0e10cSrcweir //-----------------------------------------------------------------------------
424cdf0e10cSrcweir 
425cdf0e10cSrcweir bool ViewTabBar::ActivatePage (void)
426cdf0e10cSrcweir {
427cdf0e10cSrcweir     try
428cdf0e10cSrcweir     {
429cdf0e10cSrcweir         Reference<XControllerManager> xControllerManager (mxController,UNO_QUERY_THROW);
430cdf0e10cSrcweir         Reference<XConfigurationController> xConfigurationController (
431cdf0e10cSrcweir             xControllerManager->getConfigurationController());
432cdf0e10cSrcweir         if ( ! xConfigurationController.is())
433cdf0e10cSrcweir             throw RuntimeException();
434cdf0e10cSrcweir         Reference<XView> xView;
435cdf0e10cSrcweir         try
436cdf0e10cSrcweir         {
437cdf0e10cSrcweir             xView = Reference<XView>(xConfigurationController->getResource(
438cdf0e10cSrcweir                 ResourceId::create(
439cdf0e10cSrcweir                     ::comphelper::getProcessComponentContext(),
440cdf0e10cSrcweir                     FrameworkHelper::msCenterPaneURL)),
441cdf0e10cSrcweir                 UNO_QUERY);
442cdf0e10cSrcweir         }
443cdf0e10cSrcweir         catch (DeploymentException)
444cdf0e10cSrcweir         {
445cdf0e10cSrcweir         }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir         Client* pIPClient = NULL;
448cdf0e10cSrcweir         if (mpViewShellBase != NULL)
449cdf0e10cSrcweir             pIPClient = dynamic_cast<Client*>(mpViewShellBase->GetIPClient());
450cdf0e10cSrcweir         if (pIPClient==NULL || ! pIPClient->IsObjectInPlaceActive())
451cdf0e10cSrcweir         {
452cdf0e10cSrcweir             sal_uInt16 nIndex (mpTabControl->GetCurPageId() - 1);
453cdf0e10cSrcweir             if (nIndex < maTabBarButtons.size())
454cdf0e10cSrcweir             {
455cdf0e10cSrcweir                 xConfigurationController->requestResourceActivation(
456cdf0e10cSrcweir                     maTabBarButtons[nIndex].ResourceId,
457cdf0e10cSrcweir                     ResourceActivationMode_REPLACE);
458cdf0e10cSrcweir             }
459cdf0e10cSrcweir 
460cdf0e10cSrcweir             return true;
461cdf0e10cSrcweir         }
462cdf0e10cSrcweir         else
463cdf0e10cSrcweir         {
464cdf0e10cSrcweir             // When we run into this else branch then we have an active OLE
465cdf0e10cSrcweir             // object.  We ignore the request to switch views.  Additionally
466cdf0e10cSrcweir             // we put the active tab back to the one for the current view.
467cdf0e10cSrcweir             UpdateActiveButton();
468cdf0e10cSrcweir         }
469cdf0e10cSrcweir     }
470cdf0e10cSrcweir     catch (RuntimeException&)
471cdf0e10cSrcweir     {
472cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
473cdf0e10cSrcweir     }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir     return false;
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 
481cdf0e10cSrcweir int ViewTabBar::GetHeight (void)
482cdf0e10cSrcweir {
483cdf0e10cSrcweir     int nHeight (0);
484cdf0e10cSrcweir 
485cdf0e10cSrcweir     if (!maTabBarButtons.empty())
486cdf0e10cSrcweir     {
487cdf0e10cSrcweir         TabPage* pActivePage (mpTabControl->GetTabPage(
488cdf0e10cSrcweir             mpTabControl->GetCurPageId()));
489cdf0e10cSrcweir         if (pActivePage!=NULL && mpTabControl->IsReallyVisible())
490cdf0e10cSrcweir             nHeight = pActivePage->GetPosPixel().Y();
491cdf0e10cSrcweir 
492cdf0e10cSrcweir         if (nHeight <= 0)
493cdf0e10cSrcweir             // Using a default when the real height can not be determined.
494cdf0e10cSrcweir             // To get correct height this method should be called when the
495cdf0e10cSrcweir             // control is visible.
496cdf0e10cSrcweir             nHeight = 21;
497cdf0e10cSrcweir     }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     return nHeight;
500cdf0e10cSrcweir }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 
505cdf0e10cSrcweir void ViewTabBar::AddTabBarButton (
506cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rButton,
507cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rAnchor)
508cdf0e10cSrcweir {
509cdf0e10cSrcweir     sal_uInt32 nIndex;
510cdf0e10cSrcweir 
511cdf0e10cSrcweir     if ( ! rAnchor.ResourceId.is()
512cdf0e10cSrcweir         || (rAnchor.ResourceId->getResourceURL().getLength() == 0
513cdf0e10cSrcweir             && rAnchor.ButtonLabel.getLength() == 0))
514cdf0e10cSrcweir     {
515cdf0e10cSrcweir         nIndex = 0;
516cdf0e10cSrcweir     }
517cdf0e10cSrcweir     else
518cdf0e10cSrcweir     {
519cdf0e10cSrcweir         for (nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
520cdf0e10cSrcweir         {
521cdf0e10cSrcweir             if (IsEqual(maTabBarButtons[nIndex], rAnchor))
522cdf0e10cSrcweir             {
523cdf0e10cSrcweir                 ++nIndex;
524cdf0e10cSrcweir                 break;
525cdf0e10cSrcweir             }
526cdf0e10cSrcweir         }
527cdf0e10cSrcweir     }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir     AddTabBarButton(rButton,nIndex);
530cdf0e10cSrcweir }
531cdf0e10cSrcweir 
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 
534cdf0e10cSrcweir 
535cdf0e10cSrcweir void ViewTabBar::AddTabBarButton (
536cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rButton)
537cdf0e10cSrcweir {
538cdf0e10cSrcweir     AddTabBarButton(rButton, maTabBarButtons.size());
539cdf0e10cSrcweir }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 
543cdf0e10cSrcweir 
544cdf0e10cSrcweir void ViewTabBar::AddTabBarButton (
545cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rButton,
546cdf0e10cSrcweir     sal_Int32 nPosition)
547cdf0e10cSrcweir {
548cdf0e10cSrcweir     if (nPosition>=0
549cdf0e10cSrcweir         && nPosition<=mpTabControl->GetPageCount())
550cdf0e10cSrcweir     {
551cdf0e10cSrcweir         sal_uInt16 nIndex ((sal_uInt16)nPosition);
552cdf0e10cSrcweir 
553cdf0e10cSrcweir         // Insert the button into our local array.
554cdf0e10cSrcweir         maTabBarButtons.insert(maTabBarButtons.begin()+nIndex, rButton);
555cdf0e10cSrcweir         UpdateTabBarButtons();
556cdf0e10cSrcweir         UpdateActiveButton();
557cdf0e10cSrcweir     }
558cdf0e10cSrcweir }
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 
563cdf0e10cSrcweir void ViewTabBar::RemoveTabBarButton (
564cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rButton)
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     sal_uInt16 nIndex;
567cdf0e10cSrcweir     for (nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
568cdf0e10cSrcweir     {
569cdf0e10cSrcweir         if (IsEqual(maTabBarButtons[nIndex], rButton))
570cdf0e10cSrcweir         {
571cdf0e10cSrcweir             maTabBarButtons.erase(maTabBarButtons.begin()+nIndex);
572cdf0e10cSrcweir             UpdateTabBarButtons();
573cdf0e10cSrcweir             UpdateActiveButton();
574cdf0e10cSrcweir             break;
575cdf0e10cSrcweir         }
576cdf0e10cSrcweir     }
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 
582cdf0e10cSrcweir bool ViewTabBar::HasTabBarButton (
583cdf0e10cSrcweir     const ::com::sun::star::drawing::framework::TabBarButton& rButton)
584cdf0e10cSrcweir {
585cdf0e10cSrcweir     bool bResult (false);
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     for (sal_uInt32 nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
588cdf0e10cSrcweir     {
589cdf0e10cSrcweir         if (IsEqual(maTabBarButtons[nIndex], rButton))
590cdf0e10cSrcweir         {
591cdf0e10cSrcweir             bResult = true;
592cdf0e10cSrcweir             break;
593cdf0e10cSrcweir         }
594cdf0e10cSrcweir     }
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     return bResult;
597cdf0e10cSrcweir }
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 
602cdf0e10cSrcweir ::com::sun::star::uno::Sequence<com::sun::star::drawing::framework::TabBarButton>
603cdf0e10cSrcweir     ViewTabBar::GetTabBarButtons (void)
604cdf0e10cSrcweir {
605cdf0e10cSrcweir     sal_uInt32 nCount (maTabBarButtons.size());
606cdf0e10cSrcweir     ::com::sun::star::uno::Sequence<com::sun::star::drawing::framework::TabBarButton>
607cdf0e10cSrcweir           aList (nCount);
608cdf0e10cSrcweir 
609cdf0e10cSrcweir     for (sal_uInt32 nIndex=0; nIndex<nCount; ++nIndex)
610cdf0e10cSrcweir         aList[nIndex] = maTabBarButtons[nIndex];
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     return aList;
613cdf0e10cSrcweir }
614cdf0e10cSrcweir 
615cdf0e10cSrcweir 
616cdf0e10cSrcweir 
617cdf0e10cSrcweir 
618cdf0e10cSrcweir void ViewTabBar::UpdateActiveButton (void)
619cdf0e10cSrcweir {
620cdf0e10cSrcweir     Reference<XView> xView;
621cdf0e10cSrcweir     if (mpViewShellBase != NULL)
622cdf0e10cSrcweir         xView = FrameworkHelper::Instance(*mpViewShellBase)->GetView(
623cdf0e10cSrcweir             mxViewTabBarId->getAnchor());
624cdf0e10cSrcweir     if (xView.is())
625cdf0e10cSrcweir     {
626cdf0e10cSrcweir         Reference<XResourceId> xViewId (xView->getResourceId());
627cdf0e10cSrcweir         for (sal_uInt16 nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
628cdf0e10cSrcweir         {
629cdf0e10cSrcweir             if (maTabBarButtons[nIndex].ResourceId->compareTo(xViewId) == 0)
630cdf0e10cSrcweir             {
631cdf0e10cSrcweir                 mpTabControl->SetCurPageId(nIndex+1);
632cdf0e10cSrcweir                 mpTabControl->::TabControl::ActivatePage();
633cdf0e10cSrcweir                 break;
634cdf0e10cSrcweir             }
635cdf0e10cSrcweir         }
636cdf0e10cSrcweir     }
637cdf0e10cSrcweir }
638cdf0e10cSrcweir 
639cdf0e10cSrcweir 
640cdf0e10cSrcweir 
641cdf0e10cSrcweir 
642cdf0e10cSrcweir void ViewTabBar::UpdateTabBarButtons (void)
643cdf0e10cSrcweir {
644cdf0e10cSrcweir     TabBarButtonList::const_iterator iTab;
645cdf0e10cSrcweir     sal_uInt16 nPageCount (mpTabControl->GetPageCount());
646cdf0e10cSrcweir     sal_uInt16 nIndex;
647cdf0e10cSrcweir     for (iTab=maTabBarButtons.begin(),nIndex=1; iTab!=maTabBarButtons.end(); ++iTab,++nIndex)
648cdf0e10cSrcweir     {
649cdf0e10cSrcweir         // Create a new tab when there are not enough.
650cdf0e10cSrcweir         if (nPageCount < nIndex)
651cdf0e10cSrcweir             mpTabControl->InsertPage(nIndex, iTab->ButtonLabel);
652cdf0e10cSrcweir 
653cdf0e10cSrcweir         // Update the tab.
654cdf0e10cSrcweir         mpTabControl->SetPageText(nIndex, iTab->ButtonLabel);
655cdf0e10cSrcweir         mpTabControl->SetHelpText(nIndex, iTab->HelpText);
656cdf0e10cSrcweir         mpTabControl->SetTabPage(nIndex, mpTabPage.get());
657cdf0e10cSrcweir     }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir     // Delete tabs that are no longer used.
660cdf0e10cSrcweir     for (; nIndex<=nPageCount; ++nIndex)
661cdf0e10cSrcweir         mpTabControl->RemovePage(nIndex);
662cdf0e10cSrcweir 
663cdf0e10cSrcweir     mpTabPage->Hide();
664cdf0e10cSrcweir }
665cdf0e10cSrcweir 
666cdf0e10cSrcweir 
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 
669cdf0e10cSrcweir //===== TabBarControl =========================================================
670cdf0e10cSrcweir 
671cdf0e10cSrcweir TabBarControl::TabBarControl (
672cdf0e10cSrcweir     ::Window* pParentWindow,
673cdf0e10cSrcweir     const ::rtl::Reference<ViewTabBar>& rpViewTabBar)
674cdf0e10cSrcweir     : ::TabControl(pParentWindow),
675cdf0e10cSrcweir       mpViewTabBar(rpViewTabBar)
676cdf0e10cSrcweir {
677cdf0e10cSrcweir }
678cdf0e10cSrcweir 
679cdf0e10cSrcweir 
680cdf0e10cSrcweir 
681cdf0e10cSrcweir 
682cdf0e10cSrcweir void TabBarControl::Paint (const Rectangle& rRect)
683cdf0e10cSrcweir {
684cdf0e10cSrcweir     Color aOriginalFillColor (GetFillColor());
685cdf0e10cSrcweir     Color aOriginalLineColor (GetLineColor());
686cdf0e10cSrcweir 
687cdf0e10cSrcweir     // Because the actual window background is transparent--to avoid
688cdf0e10cSrcweir     // flickering due to multiple background paintings by this and by child
689cdf0e10cSrcweir     // windows--we have to paint the background for this control explicitly:
690cdf0e10cSrcweir     // the actual control is not painted over its whole bounding box.
691cdf0e10cSrcweir     SetFillColor (GetSettings().GetStyleSettings().GetDialogColor());
692cdf0e10cSrcweir     SetLineColor ();
693cdf0e10cSrcweir     DrawRect (rRect);
694cdf0e10cSrcweir     ::TabControl::Paint (rRect);
695cdf0e10cSrcweir 
696cdf0e10cSrcweir     SetFillColor (aOriginalFillColor);
697cdf0e10cSrcweir     SetLineColor (aOriginalLineColor);
698cdf0e10cSrcweir }
699cdf0e10cSrcweir 
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 
702cdf0e10cSrcweir 
703cdf0e10cSrcweir void TabBarControl::ActivatePage (void)
704cdf0e10cSrcweir {
705cdf0e10cSrcweir     if (mpViewTabBar->ActivatePage())
706cdf0e10cSrcweir     {
707cdf0e10cSrcweir         // Call the parent so that the correct tab is highlighted.
708cdf0e10cSrcweir         this->::TabControl::ActivatePage();
709cdf0e10cSrcweir     }
710cdf0e10cSrcweir }
711cdf0e10cSrcweir 
712cdf0e10cSrcweir } // end of namespace sd
713