xref: /AOO41X/main/sfx2/source/sidebar/ControllerItem.cxx (revision 45da7d5eec8bb670617c18931b2b362b2fb77cde)
1b9e67834SAndre Fischer /**************************************************************
2b9e67834SAndre Fischer  *
3b9e67834SAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
4b9e67834SAndre Fischer  * or more contributor license agreements.  See the NOTICE file
5b9e67834SAndre Fischer  * distributed with this work for additional information
6b9e67834SAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
7b9e67834SAndre Fischer  * to you under the Apache License, Version 2.0 (the
8b9e67834SAndre Fischer  * "License"); you may not use this file except in compliance
9b9e67834SAndre Fischer  * with the License.  You may obtain a copy of the License at
10b9e67834SAndre Fischer  *
11b9e67834SAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
12b9e67834SAndre Fischer  *
13b9e67834SAndre Fischer  * Unless required by applicable law or agreed to in writing,
14b9e67834SAndre Fischer  * software distributed under the License is distributed on an
15b9e67834SAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b9e67834SAndre Fischer  * KIND, either express or implied.  See the License for the
17b9e67834SAndre Fischer  * specific language governing permissions and limitations
18b9e67834SAndre Fischer  * under the License.
19b9e67834SAndre Fischer  *
20b9e67834SAndre Fischer  *************************************************************/
21b9e67834SAndre Fischer 
22b9e67834SAndre Fischer #include "precompiled_sfx2.hxx"
23b9e67834SAndre Fischer 
24b9e67834SAndre Fischer #include "sidebar/ControllerItem.hxx"
25b9e67834SAndre Fischer 
26*45da7d5eSAndre Fischer #include <sfx2/msgpool.hxx>
27*45da7d5eSAndre Fischer #include <sfx2/viewsh.hxx>
28*45da7d5eSAndre Fischer #include "sfx2/imagemgr.hxx"
29*45da7d5eSAndre Fischer #include "sfx2/bindings.hxx"
30*45da7d5eSAndre Fischer #include <unotools/cmdoptions.hxx>
31*45da7d5eSAndre Fischer #include "CommandInfoProvider.hxx"
32*45da7d5eSAndre Fischer #include <vcl/svapp.hxx>
33*45da7d5eSAndre Fischer #include <vcl/toolbox.hxx>
34*45da7d5eSAndre Fischer 
35*45da7d5eSAndre Fischer #include <com/sun/star/frame/XFrame.hpp>
36*45da7d5eSAndre Fischer #include <com/sun/star/frame/XFrameActionListener.hpp>
37*45da7d5eSAndre Fischer 
38*45da7d5eSAndre Fischer 
39*45da7d5eSAndre Fischer using namespace css;
40*45da7d5eSAndre Fischer using namespace cssu;
41*45da7d5eSAndre Fischer 
42*45da7d5eSAndre Fischer 
43*45da7d5eSAndre Fischer #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
44*45da7d5eSAndre Fischer 
45*45da7d5eSAndre Fischer namespace
46*45da7d5eSAndre Fischer {
47*45da7d5eSAndre Fischer     typedef ::cppu::WeakComponentImplHelper1 <
48*45da7d5eSAndre Fischer         css::frame::XFrameActionListener
49*45da7d5eSAndre Fischer         > FrameActionListenerInterfaceBase;
50*45da7d5eSAndre Fischer 
51*45da7d5eSAndre Fischer     class FrameActionListener
52*45da7d5eSAndre Fischer         : public ::cppu::BaseMutex,
53*45da7d5eSAndre Fischer           public FrameActionListenerInterfaceBase
54*45da7d5eSAndre Fischer     {
55*45da7d5eSAndre Fischer     public:
56*45da7d5eSAndre Fischer         FrameActionListener (
57*45da7d5eSAndre Fischer             sfx2::sidebar::ControllerItem& rControllerItem,
58*45da7d5eSAndre Fischer             const Reference<frame::XFrame>& rxFrame)
59*45da7d5eSAndre Fischer             : FrameActionListenerInterfaceBase(m_aMutex),
60*45da7d5eSAndre Fischer               mrControllerItem(rControllerItem),
61*45da7d5eSAndre Fischer               mxFrame(rxFrame)
62*45da7d5eSAndre Fischer         {
63*45da7d5eSAndre Fischer             if (mxFrame.is())
64*45da7d5eSAndre Fischer                 mxFrame->addFrameActionListener(this);
65*45da7d5eSAndre Fischer         }
66*45da7d5eSAndre Fischer         virtual ~FrameActionListener (void)
67*45da7d5eSAndre Fischer         {
68*45da7d5eSAndre Fischer         }
69*45da7d5eSAndre Fischer         virtual void SAL_CALL disposing (void)
70*45da7d5eSAndre Fischer         {
71*45da7d5eSAndre Fischer             if (mxFrame.is())
72*45da7d5eSAndre Fischer                 mxFrame->removeFrameActionListener(this);
73*45da7d5eSAndre Fischer         }
74*45da7d5eSAndre Fischer         virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
75*45da7d5eSAndre Fischer             throw (cssu::RuntimeException)
76*45da7d5eSAndre Fischer         {
77*45da7d5eSAndre Fischer             (void)rEvent;
78*45da7d5eSAndre Fischer             mrControllerItem.ResetFrame();
79*45da7d5eSAndre Fischer             mxFrame = NULL;
80*45da7d5eSAndre Fischer         }
81*45da7d5eSAndre Fischer         virtual void SAL_CALL frameAction (const css::frame::FrameActionEvent& rEvent)
82*45da7d5eSAndre Fischer             throw (cssu::RuntimeException)
83*45da7d5eSAndre Fischer         {
84*45da7d5eSAndre Fischer             if (rEvent.Action == frame::FrameAction_CONTEXT_CHANGED)
85*45da7d5eSAndre Fischer                 mrControllerItem.NotifyFrameContextChange();
86*45da7d5eSAndre Fischer         }
87*45da7d5eSAndre Fischer 
88*45da7d5eSAndre Fischer     private:
89*45da7d5eSAndre Fischer         sfx2::sidebar::ControllerItem& mrControllerItem;
90*45da7d5eSAndre Fischer         Reference<frame::XFrame> mxFrame;
91*45da7d5eSAndre Fischer     };
92*45da7d5eSAndre Fischer }
93*45da7d5eSAndre Fischer 
94b9e67834SAndre Fischer namespace sfx2 { namespace sidebar {
95b9e67834SAndre Fischer 
96b9e67834SAndre Fischer ControllerItem::ControllerItem (
97*45da7d5eSAndre Fischer     const sal_uInt16 nSlotId,
98b9e67834SAndre Fischer     SfxBindings &rBindings,
99b9e67834SAndre Fischer     ItemUpdateReceiverInterface& rItemUpdateReceiver)
100*45da7d5eSAndre Fischer     : SfxControllerItem(nSlotId, rBindings),
101*45da7d5eSAndre Fischer       mrItemUpdateReceiver(rItemUpdateReceiver),
102*45da7d5eSAndre Fischer       mxFrame(),
103*45da7d5eSAndre Fischer       mxFrameActionListener(),
104*45da7d5eSAndre Fischer       msCommandName()
105*45da7d5eSAndre Fischer {
106*45da7d5eSAndre Fischer }
107*45da7d5eSAndre Fischer 
108*45da7d5eSAndre Fischer 
109*45da7d5eSAndre Fischer 
110*45da7d5eSAndre Fischer 
111*45da7d5eSAndre Fischer ControllerItem::ControllerItem (
112*45da7d5eSAndre Fischer     const sal_uInt16 nSlotId,
113*45da7d5eSAndre Fischer     SfxBindings &rBindings,
114*45da7d5eSAndre Fischer     ItemUpdateReceiverInterface& rItemUpdateReceiver,
115*45da7d5eSAndre Fischer     const ::rtl::OUString& rsCommandName,
116*45da7d5eSAndre Fischer     const Reference<frame::XFrame>& rxFrame)
117*45da7d5eSAndre Fischer     : SfxControllerItem(nSlotId, rBindings),
118*45da7d5eSAndre Fischer       mrItemUpdateReceiver(rItemUpdateReceiver),
119*45da7d5eSAndre Fischer       mxFrame(rxFrame),
120*45da7d5eSAndre Fischer       mxFrameActionListener(new FrameActionListener(*this, mxFrame)),
121*45da7d5eSAndre Fischer       msCommandName(rsCommandName)
122b9e67834SAndre Fischer {
123b9e67834SAndre Fischer }
124b9e67834SAndre Fischer 
125b9e67834SAndre Fischer 
126b9e67834SAndre Fischer 
127b9e67834SAndre Fischer 
128b9e67834SAndre Fischer ControllerItem::~ControllerItem (void)
129b9e67834SAndre Fischer {
130*45da7d5eSAndre Fischer     if (mxFrameActionListener.is())
131*45da7d5eSAndre Fischer         mxFrameActionListener->dispose();
132b9e67834SAndre Fischer }
133b9e67834SAndre Fischer 
134b9e67834SAndre Fischer 
135b9e67834SAndre Fischer 
136b9e67834SAndre Fischer 
137b9e67834SAndre Fischer void ControllerItem::StateChanged (
138b9e67834SAndre Fischer     sal_uInt16 nSID,
139b9e67834SAndre Fischer     SfxItemState eState,
140b9e67834SAndre Fischer     const SfxPoolItem* pState)
141b9e67834SAndre Fischer {
142*45da7d5eSAndre Fischer     mrItemUpdateReceiver.NotifyItemUpdate(nSID, eState, pState, IsEnabled());
143b9e67834SAndre Fischer }
144b9e67834SAndre Fischer 
1457a32b0c8SAndre Fischer 
1467a32b0c8SAndre Fischer 
1477a32b0c8SAndre Fischer 
148*45da7d5eSAndre Fischer bool ControllerItem::IsEnabled (void) const
149*45da7d5eSAndre Fischer {
150*45da7d5eSAndre Fischer     if ( ! SvtCommandOptions().HasEntries(SvtCommandOptions::CMDOPTION_DISABLED))
151*45da7d5eSAndre Fischer     {
152*45da7d5eSAndre Fischer         // There are no disabled commands.
153*45da7d5eSAndre Fischer         return true;
154*45da7d5eSAndre Fischer     }
155*45da7d5eSAndre Fischer     else if (msCommandName.getLength() == 0)
156*45da7d5eSAndre Fischer     {
157*45da7d5eSAndre Fischer         // We were not given a command name at construction and can
158*45da7d5eSAndre Fischer         // not check the state now.  Assume the best and return true.
159*45da7d5eSAndre Fischer         return true;
160*45da7d5eSAndre Fischer     }
161*45da7d5eSAndre Fischer     else if (SvtCommandOptions().Lookup(SvtCommandOptions::CMDOPTION_DISABLED, msCommandName))
162*45da7d5eSAndre Fischer     {
163*45da7d5eSAndre Fischer         // The command is part of a list of disabled commands.
164*45da7d5eSAndre Fischer         return false;
165*45da7d5eSAndre Fischer     }
166*45da7d5eSAndre Fischer     else
167*45da7d5eSAndre Fischer         return true;
168*45da7d5eSAndre Fischer }
169*45da7d5eSAndre Fischer 
170*45da7d5eSAndre Fischer 
171*45da7d5eSAndre Fischer 
172*45da7d5eSAndre Fischer 
173*45da7d5eSAndre Fischer void ControllerItem::RequestUpdate (void)
174*45da7d5eSAndre Fischer {
175*45da7d5eSAndre Fischer     SfxPoolItem* pState = NULL;
176*45da7d5eSAndre Fischer     const SfxItemState eState (GetBindings().QueryState(GetId(), pState));
177*45da7d5eSAndre Fischer     mrItemUpdateReceiver.NotifyItemUpdate(GetId(), eState, pState, IsEnabled());
178*45da7d5eSAndre Fischer }
179*45da7d5eSAndre Fischer 
180*45da7d5eSAndre Fischer 
181*45da7d5eSAndre Fischer 
182*45da7d5eSAndre Fischer 
183*45da7d5eSAndre Fischer void ControllerItem::NotifyFrameContextChange (void)
184*45da7d5eSAndre Fischer {
185*45da7d5eSAndre Fischer     RequestUpdate();
186*45da7d5eSAndre Fischer }
187*45da7d5eSAndre Fischer 
188*45da7d5eSAndre Fischer 
189*45da7d5eSAndre Fischer 
190*45da7d5eSAndre Fischer 
191*45da7d5eSAndre Fischer void ControllerItem::ResetFrame (void)
192*45da7d5eSAndre Fischer {
193*45da7d5eSAndre Fischer     mxFrame = NULL;
194*45da7d5eSAndre Fischer }
195*45da7d5eSAndre Fischer 
196*45da7d5eSAndre Fischer 
197*45da7d5eSAndre Fischer 
198*45da7d5eSAndre Fischer 
199*45da7d5eSAndre Fischer ::rtl::OUString ControllerItem::GetLabel (void) const
200*45da7d5eSAndre Fischer {
201*45da7d5eSAndre Fischer     return CommandInfoProvider::Instance().GetLabelForCommand(
202*45da7d5eSAndre Fischer         A2S(".uno:")+msCommandName,
203*45da7d5eSAndre Fischer         mxFrame);
204*45da7d5eSAndre Fischer }
205*45da7d5eSAndre Fischer 
206*45da7d5eSAndre Fischer 
207*45da7d5eSAndre Fischer 
208*45da7d5eSAndre Fischer 
209*45da7d5eSAndre Fischer Image ControllerItem::GetIcon (void) const
210*45da7d5eSAndre Fischer {
211*45da7d5eSAndre Fischer     return GetIcon(Application::GetSettings().GetStyleSettings().GetHighContrastMode());
212*45da7d5eSAndre Fischer }
213*45da7d5eSAndre Fischer 
214*45da7d5eSAndre Fischer 
215*45da7d5eSAndre Fischer 
216*45da7d5eSAndre Fischer 
217*45da7d5eSAndre Fischer Image ControllerItem::GetIcon (const bool bIsHighContrastMode) const
218*45da7d5eSAndre Fischer {
219*45da7d5eSAndre Fischer     return GetImage(mxFrame, A2S(".uno:")+msCommandName, sal_False, bIsHighContrastMode);
220*45da7d5eSAndre Fischer 
221*45da7d5eSAndre Fischer }
222*45da7d5eSAndre Fischer 
223*45da7d5eSAndre Fischer 
224*45da7d5eSAndre Fischer 
225*45da7d5eSAndre Fischer 
226*45da7d5eSAndre Fischer void ControllerItem::SetupToolBoxItem (ToolBox& rToolBox, const sal_uInt16 nIndex)
227*45da7d5eSAndre Fischer {
228*45da7d5eSAndre Fischer     rToolBox.SetQuickHelpText(nIndex, GetLabel());
229*45da7d5eSAndre Fischer     rToolBox.SetItemImage(nIndex, GetIcon());
230*45da7d5eSAndre Fischer }
231*45da7d5eSAndre Fischer 
232*45da7d5eSAndre Fischer 
233b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar
234