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 "ResourceManager.hxx" 27 28 #include "framework/FrameworkHelper.hxx" 29 #include "framework/ConfigurationController.hxx" 30 #include <com/sun/star/drawing/framework/XControllerManager.hpp> 31 32 #include <comphelper/stl_types.hxx> 33 #include <set> 34 35 using namespace ::com::sun::star; 36 using namespace ::com::sun::star::uno; 37 using namespace ::com::sun::star::drawing::framework; 38 39 using ::rtl::OUString; 40 using ::sd::framework::FrameworkHelper; 41 42 namespace { 43 static const sal_Int32 ResourceActivationRequestEvent = 0; 44 static const sal_Int32 ResourceDeactivationRequestEvent = 1; 45 } 46 47 48 49 50 namespace sd { namespace framework { 51 52 class ResourceManager::MainViewContainer 53 : public ::std::set<OUString, ::comphelper::UStringLess> 54 { 55 public: 56 MainViewContainer (void) {} 57 }; 58 59 60 61 62 //===== ResourceManager ======================================================= 63 64 ResourceManager::ResourceManager ( 65 const Reference<frame::XController>& rxController, 66 const Reference<XResourceId>& rxResourceId) 67 : ResourceManagerInterfaceBase(MutexOwner::maMutex), 68 mxConfigurationController(), 69 mpActiveMainViewContainer(new MainViewContainer()), 70 mxResourceId(rxResourceId), 71 mxMainViewAnchorId(FrameworkHelper::Instance(rxController)->CreateResourceId( 72 FrameworkHelper::msCenterPaneURL)), 73 msCurrentMainViewURL(), 74 mbIsEnabled(true) 75 { 76 Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY); 77 if (xControllerManager.is()) 78 { 79 mxConfigurationController = xControllerManager->getConfigurationController(); 80 81 if (mxConfigurationController.is()) 82 { 83 mxConfigurationController->addConfigurationChangeListener( 84 this, 85 FrameworkHelper::msResourceActivationRequestEvent, 86 makeAny(ResourceActivationRequestEvent)); 87 mxConfigurationController->addConfigurationChangeListener( 88 this, 89 FrameworkHelper::msResourceDeactivationRequestEvent, 90 makeAny(ResourceDeactivationRequestEvent)); 91 } 92 } 93 } 94 95 96 97 98 ResourceManager::~ResourceManager (void) 99 { 100 } 101 102 103 104 105 void ResourceManager::AddActiveMainView ( 106 const OUString& rsMainViewURL) 107 { 108 mpActiveMainViewContainer->insert(rsMainViewURL); 109 } 110 111 112 113 114 void SAL_CALL ResourceManager::disposing (void) 115 { 116 if (mxConfigurationController.is()) 117 { 118 mxConfigurationController->removeConfigurationChangeListener(this); 119 mxConfigurationController = NULL; 120 } 121 } 122 123 124 125 126 void ResourceManager::Enable (void) 127 { 128 mbIsEnabled = true; 129 UpdateForMainViewShell(); 130 } 131 132 133 134 135 void ResourceManager::Disable (void) 136 { 137 mbIsEnabled = false; 138 UpdateForMainViewShell(); 139 } 140 141 142 143 144 void SAL_CALL ResourceManager::notifyConfigurationChange ( 145 const ConfigurationChangeEvent& rEvent) 146 throw (RuntimeException) 147 { 148 OSL_ASSERT(rEvent.ResourceId.is()); 149 150 sal_Int32 nEventType = 0; 151 rEvent.UserData >>= nEventType; 152 switch (nEventType) 153 { 154 case ResourceActivationRequestEvent: 155 if (rEvent.ResourceId->isBoundToURL( 156 FrameworkHelper::msCenterPaneURL, 157 AnchorBindingMode_DIRECT)) 158 { 159 // A resource directly bound to the center pane has been 160 // requested. 161 if (rEvent.ResourceId->getResourceTypePrefix().equals( 162 FrameworkHelper::msViewURLPrefix)) 163 { 164 // The requested resource is a view. Show or hide the 165 // resource managed by this ResourceManager accordingly. 166 HandleMainViewSwitch( 167 rEvent.ResourceId->getResourceURL(), 168 rEvent.Configuration, 169 true); 170 } 171 } 172 else if (rEvent.ResourceId->compareTo(mxResourceId) == 0) 173 { 174 // The resource managed by this ResourceManager has been 175 // explicitly been requested (maybe by us). Remember this 176 // setting. 177 HandleResourceRequest(true, rEvent.Configuration); 178 } 179 break; 180 181 case ResourceDeactivationRequestEvent: 182 if (rEvent.ResourceId->compareTo(mxMainViewAnchorId) == 0) 183 { 184 HandleMainViewSwitch( 185 OUString(), 186 rEvent.Configuration, 187 false); 188 } 189 else if (rEvent.ResourceId->compareTo(mxResourceId) == 0) 190 { 191 // The resource managed by this ResourceManager has been 192 // explicitly been requested to be hidden (maybe by us). 193 // Remember this setting. 194 HandleResourceRequest(false, rEvent.Configuration); 195 } 196 break; 197 } 198 } 199 200 201 202 203 void ResourceManager::UpdateForMainViewShell (void) 204 { 205 if (mxConfigurationController.is()) 206 { 207 ConfigurationController::Lock aLock (mxConfigurationController); 208 209 if (mbIsEnabled 210 && mpActiveMainViewContainer->find(msCurrentMainViewURL) 211 != mpActiveMainViewContainer->end()) 212 { 213 // Activate resource. 214 mxConfigurationController->requestResourceActivation( 215 mxResourceId->getAnchor(), 216 ResourceActivationMode_ADD); 217 mxConfigurationController->requestResourceActivation( 218 mxResourceId, 219 ResourceActivationMode_REPLACE); 220 } 221 else 222 { 223 mxConfigurationController->requestResourceDeactivation(mxResourceId); 224 } 225 } 226 } 227 228 229 230 231 void ResourceManager::HandleMainViewSwitch ( 232 const OUString& rsViewURL, 233 const Reference<XConfiguration>& rxConfiguration, 234 const bool bIsActivated) 235 { 236 (void)rxConfiguration; 237 if (bIsActivated) 238 msCurrentMainViewURL = rsViewURL; 239 else 240 msCurrentMainViewURL = OUString(); 241 UpdateForMainViewShell(); 242 } 243 244 245 246 247 void ResourceManager::HandleResourceRequest( 248 bool bActivation, 249 const Reference<XConfiguration>& rxConfiguration) 250 { 251 if (mbIsEnabled) 252 { 253 Sequence<Reference<XResourceId> > aCenterViews = rxConfiguration->getResources( 254 FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL), 255 FrameworkHelper::msViewURLPrefix, 256 AnchorBindingMode_DIRECT); 257 if (aCenterViews.getLength() == 1) 258 { 259 if (bActivation) 260 { 261 mpActiveMainViewContainer->insert(aCenterViews[0]->getResourceURL()); 262 } 263 else 264 { 265 MainViewContainer::iterator iElement ( 266 mpActiveMainViewContainer->find(aCenterViews[0]->getResourceURL())); 267 if (iElement != mpActiveMainViewContainer->end()) 268 mpActiveMainViewContainer->erase(iElement); 269 } 270 } 271 } 272 } 273 274 275 276 277 void SAL_CALL ResourceManager::disposing ( 278 const lang::EventObject& rEvent) 279 throw (RuntimeException) 280 { 281 if (mxConfigurationController.is() 282 && rEvent.Source == mxConfigurationController) 283 { 284 // Without the configuration controller this class can do nothing. 285 mxConfigurationController = NULL; 286 dispose(); 287 } 288 } 289 290 } } // end of namespace sd::framework 291