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 "precompiled_sd.hxx"
25 
26 #include "ViewTabBarModule.hxx"
27 
28 #include "framework/FrameworkHelper.hxx"
29 #include "framework/ConfigurationController.hxx"
30 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
31 #include <com/sun/star/drawing/framework/XTabBar.hpp>
32 
33 #include "strings.hrc"
34 #include "sdresid.hxx"
35 
36 
37 using namespace ::com::sun::star;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::drawing::framework;
40 
41 using ::rtl::OUString;
42 using ::sd::framework::FrameworkHelper;
43 
44 namespace {
45 
46 static const sal_Int32 ResourceActivationRequestEvent = 0;
47 static const sal_Int32 ResourceDeactivationRequestEvent = 1;
48 static const sal_Int32 ResourceActivationEvent = 2;
49 
50 }
51 
52 namespace sd { namespace framework {
53 
54 //===== ViewTabBarModule ==================================================
55 
56 ViewTabBarModule::ViewTabBarModule (
57     const Reference<frame::XController>& rxController,
58     const Reference<XResourceId>& rxViewTabBarId)
59     : ViewTabBarModuleInterfaceBase(MutexOwner::maMutex),
60       mxConfigurationController(),
61       mxViewTabBarId(rxViewTabBarId)
62 {
63     Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
64 
65     if (xControllerManager.is())
66     {
67         mxConfigurationController = xControllerManager->getConfigurationController();
68         if (mxConfigurationController.is())
69         {
70             mxConfigurationController->addConfigurationChangeListener(
71                 this,
72                 FrameworkHelper::msResourceActivationRequestEvent,
73                 makeAny(ResourceActivationRequestEvent));
74             mxConfigurationController->addConfigurationChangeListener(
75                 this,
76                 FrameworkHelper::msResourceDeactivationRequestEvent,
77                 makeAny(ResourceDeactivationRequestEvent));
78 
79             UpdateViewTabBar(NULL);
80             mxConfigurationController->addConfigurationChangeListener(
81                 this,
82                 FrameworkHelper::msResourceActivationEvent,
83                 makeAny(ResourceActivationEvent));
84         }
85     }
86 }
87 
88 
89 
90 
91 ViewTabBarModule::~ViewTabBarModule (void)
92 {
93 }
94 
95 
96 
97 
98 void SAL_CALL ViewTabBarModule::disposing (void)
99 {
100     if (mxConfigurationController.is())
101         mxConfigurationController->removeConfigurationChangeListener(this);
102 
103     mxConfigurationController = NULL;
104 }
105 
106 
107 
108 
109 void SAL_CALL ViewTabBarModule::notifyConfigurationChange (
110     const ConfigurationChangeEvent& rEvent)
111     throw (RuntimeException)
112 {
113     if (mxConfigurationController.is())
114     {
115         sal_Int32 nEventType = 0;
116         rEvent.UserData >>= nEventType;
117         switch (nEventType)
118         {
119             case ResourceActivationRequestEvent:
120                 if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT))
121                 {
122                     mxConfigurationController->requestResourceActivation(
123                         mxViewTabBarId,
124                         ResourceActivationMode_ADD);
125                 }
126                 break;
127 
128             case ResourceDeactivationRequestEvent:
129                 if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT))
130                 {
131                     mxConfigurationController->requestResourceDeactivation(mxViewTabBarId);
132                 }
133                 break;
134 
135             case ResourceActivationEvent:
136                 if (rEvent.ResourceId->compareTo(mxViewTabBarId) == 0)
137                 {
138                     UpdateViewTabBar(Reference<XTabBar>(rEvent.ResourceObject,UNO_QUERY));
139                 }
140         }
141     }
142 }
143 
144 
145 
146 
147 void SAL_CALL ViewTabBarModule::disposing (
148     const lang::EventObject& rEvent)
149     throw (RuntimeException)
150 {
151     if (mxConfigurationController.is()
152         && rEvent.Source == mxConfigurationController)
153     {
154         // Without the configuration controller this class can do nothing.
155         mxConfigurationController = NULL;
156         disposing();
157     }
158 }
159 
160 
161 
162 
163 void ViewTabBarModule::UpdateViewTabBar (const Reference<XTabBar>& rxTabBar)
164 {
165     if (mxConfigurationController.is())
166     {
167         Reference<XTabBar> xBar (rxTabBar);
168         if ( ! xBar.is())
169             xBar = Reference<XTabBar>(
170                 mxConfigurationController->getResource(mxViewTabBarId), UNO_QUERY);
171 
172         if (xBar.is())
173         {
174             TabBarButton aEmptyButton;
175 
176             Reference<XResourceId> xAnchor (mxViewTabBarId->getAnchor());
177 
178             TabBarButton aImpressViewButton;
179             aImpressViewButton.ResourceId = FrameworkHelper::CreateResourceId(
180                 FrameworkHelper::msImpressViewURL,
181                 xAnchor);
182             aImpressViewButton.ButtonLabel = String(SdResId(STR_DRAW_MODE));
183             if ( ! xBar->hasTabBarButton(aImpressViewButton))
184                 xBar->addTabBarButtonAfter(aImpressViewButton, aEmptyButton);
185 
186             TabBarButton aOutlineViewButton;
187             aOutlineViewButton.ResourceId = FrameworkHelper::CreateResourceId(
188                 FrameworkHelper::msOutlineViewURL,
189                 xAnchor);
190             aOutlineViewButton.ButtonLabel = String(SdResId(STR_OUTLINE_MODE));
191             if ( ! xBar->hasTabBarButton(aOutlineViewButton))
192                 xBar->addTabBarButtonAfter(aOutlineViewButton, aImpressViewButton);
193 
194             TabBarButton aNotesViewButton;
195             aNotesViewButton.ResourceId = FrameworkHelper::CreateResourceId(
196                 FrameworkHelper::msNotesViewURL,
197                 xAnchor);
198             aNotesViewButton.ButtonLabel = String(SdResId(STR_NOTES_MODE));
199             if ( ! xBar->hasTabBarButton(aNotesViewButton))
200                 xBar->addTabBarButtonAfter(aNotesViewButton, aOutlineViewButton);
201 
202             TabBarButton aHandoutViewButton;
203             aHandoutViewButton.ResourceId = FrameworkHelper::CreateResourceId(
204                 FrameworkHelper::msHandoutViewURL,
205                 xAnchor);
206             aHandoutViewButton.ButtonLabel = String(SdResId(STR_HANDOUT_MODE));
207             if ( ! xBar->hasTabBarButton(aHandoutViewButton))
208                 xBar->addTabBarButtonAfter(aHandoutViewButton, aNotesViewButton);
209         }
210     }
211 }
212 
213 
214 
215 
216 } } // end of namespace sd::framework
217