1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef __FRAMEWORK_DISPATCH_WINDOWCOMMANDDISPATCH_HXX_ 25*b1cdbd2cSJim Jagielski #define __FRAMEWORK_DISPATCH_WINDOWCOMMANDDISPATCH_HXX_ 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski //_______________________________________________ 28*b1cdbd2cSJim Jagielski // my own includes 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski #include <threadhelp/threadhelpbase.hxx> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski //_______________________________________________ 33*b1cdbd2cSJim Jagielski // interface includes 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp> 37*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XEventListener.hpp> 38*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp> 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski //_______________________________________________ 41*b1cdbd2cSJim Jagielski // other includes 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx> 44*b1cdbd2cSJim Jagielski #include <tools/link.hxx> 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski //_______________________________________________ 47*b1cdbd2cSJim Jagielski // namespace 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski namespace framework{ 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star; 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski //_______________________________________________ 54*b1cdbd2cSJim Jagielski // exported const 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski //_______________________________________________ 57*b1cdbd2cSJim Jagielski // exported definitions 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski /** @short internal helper to bind e.g. MAC-Menu events to our internal dispatch API. 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski @descr On e.g. MAC platform system menus are merged together with some fix entries as 62*b1cdbd2cSJim Jagielski e.g. "Pereferences" or "About". These menu entries trigger hard coded commands. 63*b1cdbd2cSJim Jagielski Here we map these commands to the right URLs and dispatch them. 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski This helper knows a frame and it's container window (where VCL provide the hard coded 66*b1cdbd2cSJim Jagielski commands). We hold those objects weak ... so there is no need to react for complex dispose/ing() 67*b1cdbd2cSJim Jagielski scenarios. On the other side VCL does not hold us alive (because it doesn't know our UNO reference). 68*b1cdbd2cSJim Jagielski So we register us at the XWindow as event listener also to be sure to live as long the XWindow/VCLWindow lives. 69*b1cdbd2cSJim Jagielski */ 70*b1cdbd2cSJim Jagielski class WindowCommandDispatch : private ThreadHelpBase 71*b1cdbd2cSJim Jagielski , public ::cppu::WeakImplHelper1< css::lang::XEventListener > 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski //___________________________________________ 74*b1cdbd2cSJim Jagielski // const 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski private: 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski /// dispatch URL to trigger our "Tools->Options" dialog 79*b1cdbd2cSJim Jagielski static const ::rtl::OUString COMMAND_PREFERENCES; 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski /// dispatch URL to trigger our About box 82*b1cdbd2cSJim Jagielski static const ::rtl::OUString COMMAND_ABOUTBOX; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski //___________________________________________ 85*b1cdbd2cSJim Jagielski // member 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski private: 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski /// can be used to create own needed services on demand. 90*b1cdbd2cSJim Jagielski css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR; 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski /// knows the frame, where we dispatch our commands as weak reference 93*b1cdbd2cSJim Jagielski css::uno::WeakReference< css::frame::XFrame > m_xFrame; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski /// knows the VCL window (where the hard coded commands occured) as weak XWindow reference 96*b1cdbd2cSJim Jagielski css::uno::WeakReference< css::awt::XWindow > m_xWindow; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski //___________________________________________ 99*b1cdbd2cSJim Jagielski // native interface 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski public: 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski //_______________________________________ 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski /** @short creates a new instance and initialize it with all necessary parameters. 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski @descr Every instance of such MACDispatch can be used for the specified context only. 108*b1cdbd2cSJim Jagielski Means: 1 MACDispatch object is bound to 1 Frame/Window pair in which context 109*b1cdbd2cSJim Jagielski the detected commands will be executed. 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski @param xSMGR 112*b1cdbd2cSJim Jagielski will be used to create own needed services on demand. 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski @param xFrame 115*b1cdbd2cSJim Jagielski used as for new detected commands. 116*b1cdbd2cSJim Jagielski */ 117*b1cdbd2cSJim Jagielski WindowCommandDispatch(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , 118*b1cdbd2cSJim Jagielski const css::uno::Reference< css::frame::XFrame >& xFrame); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski //_______________________________________ 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski /** @short used to free internal resources. 123*b1cdbd2cSJim Jagielski */ 124*b1cdbd2cSJim Jagielski virtual ~WindowCommandDispatch(); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski //___________________________________________ 127*b1cdbd2cSJim Jagielski // uno interface 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski public: 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski // XEventListener 132*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing(const css::lang::EventObject& aSource) 133*b1cdbd2cSJim Jagielski throw (css::uno::RuntimeException); 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski //___________________________________________ 136*b1cdbd2cSJim Jagielski // implementation 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski private: 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski //_______________________________________ 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski /** @short establish all listener connections we need. 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski @descr Those listener connections will be created one times only (see ctor). 145*b1cdbd2cSJim Jagielski Afterwards we listen for incoming events till our referred frame/window pair 146*b1cdbd2cSJim Jagielski will be closed. All objects die by refcount automatically. Because we hold 147*b1cdbd2cSJim Jagielski it weak ... 148*b1cdbd2cSJim Jagielski */ 149*b1cdbd2cSJim Jagielski void impl_startListening(); 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski //_______________________________________ 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski /** @short callback from VCL to notify new commands 154*b1cdbd2cSJim Jagielski */ 155*b1cdbd2cSJim Jagielski DECL_LINK( impl_notifyCommand, void* ); 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski //_______________________________________ 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski /** @short dispatch right command URLs into our frame context. 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski @param sCommand 162*b1cdbd2cSJim Jagielski the command for dispatch 163*b1cdbd2cSJim Jagielski */ 164*b1cdbd2cSJim Jagielski void impl_dispatchCommand(const ::rtl::OUString& sCommand); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski }; // class MACDispatch 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski } // namespace framework 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski #endif // #ifndef __FRAMEWORK_DISPATCH_MACDISPATCH_HXX_ 171