xref: /AOO41X/main/sfx2/source/sidebar/ControllerItem.cxx (revision f35c6d02e275b54a359e950b36624d15e547eb6e)
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 
2645da7d5eSAndre Fischer #include <sfx2/msgpool.hxx>
2745da7d5eSAndre Fischer #include <sfx2/viewsh.hxx>
2845da7d5eSAndre Fischer #include "sfx2/imagemgr.hxx"
2945da7d5eSAndre Fischer #include "sfx2/bindings.hxx"
3045da7d5eSAndre Fischer #include <unotools/cmdoptions.hxx>
31*f35c6d02SAndre Fischer #include "sfx2/sidebar/CommandInfoProvider.hxx"
3245da7d5eSAndre Fischer #include <vcl/svapp.hxx>
3345da7d5eSAndre Fischer #include <vcl/toolbox.hxx>
3445da7d5eSAndre Fischer 
3545da7d5eSAndre Fischer #include <com/sun/star/frame/XFrame.hpp>
3645da7d5eSAndre Fischer #include <com/sun/star/frame/XFrameActionListener.hpp>
3745da7d5eSAndre Fischer 
3845da7d5eSAndre Fischer 
3945da7d5eSAndre Fischer using namespace css;
4045da7d5eSAndre Fischer using namespace cssu;
4145da7d5eSAndre Fischer 
4245da7d5eSAndre Fischer 
4345da7d5eSAndre Fischer #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
4445da7d5eSAndre Fischer 
4545da7d5eSAndre Fischer namespace
4645da7d5eSAndre Fischer {
4745da7d5eSAndre Fischer     typedef ::cppu::WeakComponentImplHelper1 <
4845da7d5eSAndre Fischer         css::frame::XFrameActionListener
4945da7d5eSAndre Fischer         > FrameActionListenerInterfaceBase;
5045da7d5eSAndre Fischer 
5145da7d5eSAndre Fischer     class FrameActionListener
5245da7d5eSAndre Fischer         : public ::cppu::BaseMutex,
5345da7d5eSAndre Fischer           public FrameActionListenerInterfaceBase
5445da7d5eSAndre Fischer     {
5545da7d5eSAndre Fischer     public:
5645da7d5eSAndre Fischer         FrameActionListener (
5745da7d5eSAndre Fischer             sfx2::sidebar::ControllerItem& rControllerItem,
5845da7d5eSAndre Fischer             const Reference<frame::XFrame>& rxFrame)
5945da7d5eSAndre Fischer             : FrameActionListenerInterfaceBase(m_aMutex),
6045da7d5eSAndre Fischer               mrControllerItem(rControllerItem),
6145da7d5eSAndre Fischer               mxFrame(rxFrame)
6245da7d5eSAndre Fischer         {
6345da7d5eSAndre Fischer             if (mxFrame.is())
6445da7d5eSAndre Fischer                 mxFrame->addFrameActionListener(this);
6545da7d5eSAndre Fischer         }
6645da7d5eSAndre Fischer         virtual ~FrameActionListener (void)
6745da7d5eSAndre Fischer         {
6845da7d5eSAndre Fischer         }
6945da7d5eSAndre Fischer         virtual void SAL_CALL disposing (void)
7045da7d5eSAndre Fischer         {
7145da7d5eSAndre Fischer             if (mxFrame.is())
7245da7d5eSAndre Fischer                 mxFrame->removeFrameActionListener(this);
7345da7d5eSAndre Fischer         }
7445da7d5eSAndre Fischer         virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
7545da7d5eSAndre Fischer             throw (cssu::RuntimeException)
7645da7d5eSAndre Fischer         {
7745da7d5eSAndre Fischer             (void)rEvent;
7845da7d5eSAndre Fischer             mrControllerItem.ResetFrame();
7945da7d5eSAndre Fischer             mxFrame = NULL;
8045da7d5eSAndre Fischer         }
8145da7d5eSAndre Fischer         virtual void SAL_CALL frameAction (const css::frame::FrameActionEvent& rEvent)
8245da7d5eSAndre Fischer             throw (cssu::RuntimeException)
8345da7d5eSAndre Fischer         {
8445da7d5eSAndre Fischer             if (rEvent.Action == frame::FrameAction_CONTEXT_CHANGED)
8545da7d5eSAndre Fischer                 mrControllerItem.NotifyFrameContextChange();
8645da7d5eSAndre Fischer         }
8745da7d5eSAndre Fischer 
8845da7d5eSAndre Fischer     private:
8945da7d5eSAndre Fischer         sfx2::sidebar::ControllerItem& mrControllerItem;
9045da7d5eSAndre Fischer         Reference<frame::XFrame> mxFrame;
9145da7d5eSAndre Fischer     };
9245da7d5eSAndre Fischer }
9345da7d5eSAndre Fischer 
94b9e67834SAndre Fischer namespace sfx2 { namespace sidebar {
95b9e67834SAndre Fischer 
96b9e67834SAndre Fischer ControllerItem::ControllerItem (
9745da7d5eSAndre Fischer     const sal_uInt16 nSlotId,
98b9e67834SAndre Fischer     SfxBindings &rBindings,
99b9e67834SAndre Fischer     ItemUpdateReceiverInterface& rItemUpdateReceiver)
10045da7d5eSAndre Fischer     : SfxControllerItem(nSlotId, rBindings),
10145da7d5eSAndre Fischer       mrItemUpdateReceiver(rItemUpdateReceiver),
10245da7d5eSAndre Fischer       mxFrame(),
10345da7d5eSAndre Fischer       mxFrameActionListener(),
10445da7d5eSAndre Fischer       msCommandName()
10545da7d5eSAndre Fischer {
10645da7d5eSAndre Fischer }
10745da7d5eSAndre Fischer 
10845da7d5eSAndre Fischer 
10945da7d5eSAndre Fischer 
11045da7d5eSAndre Fischer 
11145da7d5eSAndre Fischer ControllerItem::ControllerItem (
11245da7d5eSAndre Fischer     const sal_uInt16 nSlotId,
11345da7d5eSAndre Fischer     SfxBindings &rBindings,
11445da7d5eSAndre Fischer     ItemUpdateReceiverInterface& rItemUpdateReceiver,
11545da7d5eSAndre Fischer     const ::rtl::OUString& rsCommandName,
11645da7d5eSAndre Fischer     const Reference<frame::XFrame>& rxFrame)
11745da7d5eSAndre Fischer     : SfxControllerItem(nSlotId, rBindings),
11845da7d5eSAndre Fischer       mrItemUpdateReceiver(rItemUpdateReceiver),
11945da7d5eSAndre Fischer       mxFrame(rxFrame),
12045da7d5eSAndre Fischer       mxFrameActionListener(new FrameActionListener(*this, mxFrame)),
12145da7d5eSAndre Fischer       msCommandName(rsCommandName)
122b9e67834SAndre Fischer {
123b9e67834SAndre Fischer }
124b9e67834SAndre Fischer 
125b9e67834SAndre Fischer 
126b9e67834SAndre Fischer 
127b9e67834SAndre Fischer 
128b9e67834SAndre Fischer ControllerItem::~ControllerItem (void)
129b9e67834SAndre Fischer {
13045da7d5eSAndre Fischer     if (mxFrameActionListener.is())
13145da7d5eSAndre 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 {
14245da7d5eSAndre Fischer     mrItemUpdateReceiver.NotifyItemUpdate(nSID, eState, pState, IsEnabled());
143b9e67834SAndre Fischer }
144b9e67834SAndre Fischer 
1457a32b0c8SAndre Fischer 
1467a32b0c8SAndre Fischer 
1477a32b0c8SAndre Fischer 
14845da7d5eSAndre Fischer bool ControllerItem::IsEnabled (void) const
14945da7d5eSAndre Fischer {
15045da7d5eSAndre Fischer     if ( ! SvtCommandOptions().HasEntries(SvtCommandOptions::CMDOPTION_DISABLED))
15145da7d5eSAndre Fischer     {
15245da7d5eSAndre Fischer         // There are no disabled commands.
15345da7d5eSAndre Fischer         return true;
15445da7d5eSAndre Fischer     }
15545da7d5eSAndre Fischer     else if (msCommandName.getLength() == 0)
15645da7d5eSAndre Fischer     {
15745da7d5eSAndre Fischer         // We were not given a command name at construction and can
15845da7d5eSAndre Fischer         // not check the state now.  Assume the best and return true.
15945da7d5eSAndre Fischer         return true;
16045da7d5eSAndre Fischer     }
16145da7d5eSAndre Fischer     else if (SvtCommandOptions().Lookup(SvtCommandOptions::CMDOPTION_DISABLED, msCommandName))
16245da7d5eSAndre Fischer     {
16345da7d5eSAndre Fischer         // The command is part of a list of disabled commands.
16445da7d5eSAndre Fischer         return false;
16545da7d5eSAndre Fischer     }
16645da7d5eSAndre Fischer     else
16745da7d5eSAndre Fischer         return true;
16845da7d5eSAndre Fischer }
16945da7d5eSAndre Fischer 
17045da7d5eSAndre Fischer 
17145da7d5eSAndre Fischer 
17245da7d5eSAndre Fischer 
17345da7d5eSAndre Fischer void ControllerItem::RequestUpdate (void)
17445da7d5eSAndre Fischer {
17545da7d5eSAndre Fischer     SfxPoolItem* pState = NULL;
17645da7d5eSAndre Fischer     const SfxItemState eState (GetBindings().QueryState(GetId(), pState));
17745da7d5eSAndre Fischer     mrItemUpdateReceiver.NotifyItemUpdate(GetId(), eState, pState, IsEnabled());
17845da7d5eSAndre Fischer }
17945da7d5eSAndre Fischer 
18045da7d5eSAndre Fischer 
18145da7d5eSAndre Fischer 
18245da7d5eSAndre Fischer 
18345da7d5eSAndre Fischer void ControllerItem::NotifyFrameContextChange (void)
18445da7d5eSAndre Fischer {
18545da7d5eSAndre Fischer     RequestUpdate();
18645da7d5eSAndre Fischer }
18745da7d5eSAndre Fischer 
18845da7d5eSAndre Fischer 
18945da7d5eSAndre Fischer 
19045da7d5eSAndre Fischer 
19145da7d5eSAndre Fischer void ControllerItem::ResetFrame (void)
19245da7d5eSAndre Fischer {
19345da7d5eSAndre Fischer     mxFrame = NULL;
19445da7d5eSAndre Fischer }
19545da7d5eSAndre Fischer 
19645da7d5eSAndre Fischer 
19745da7d5eSAndre Fischer 
19845da7d5eSAndre Fischer 
19945da7d5eSAndre Fischer ::rtl::OUString ControllerItem::GetLabel (void) const
20045da7d5eSAndre Fischer {
20145da7d5eSAndre Fischer     return CommandInfoProvider::Instance().GetLabelForCommand(
20245da7d5eSAndre Fischer         A2S(".uno:")+msCommandName,
20345da7d5eSAndre Fischer         mxFrame);
20445da7d5eSAndre Fischer }
20545da7d5eSAndre Fischer 
20645da7d5eSAndre Fischer 
20745da7d5eSAndre Fischer 
20845da7d5eSAndre Fischer 
20945da7d5eSAndre Fischer Image ControllerItem::GetIcon (void) const
21045da7d5eSAndre Fischer {
21145da7d5eSAndre Fischer     return GetIcon(Application::GetSettings().GetStyleSettings().GetHighContrastMode());
21245da7d5eSAndre Fischer }
21345da7d5eSAndre Fischer 
21445da7d5eSAndre Fischer 
21545da7d5eSAndre Fischer 
21645da7d5eSAndre Fischer 
21745da7d5eSAndre Fischer Image ControllerItem::GetIcon (const bool bIsHighContrastMode) const
21845da7d5eSAndre Fischer {
21945da7d5eSAndre Fischer     return GetImage(mxFrame, A2S(".uno:")+msCommandName, sal_False, bIsHighContrastMode);
22045da7d5eSAndre Fischer 
22145da7d5eSAndre Fischer }
22245da7d5eSAndre Fischer 
22345da7d5eSAndre Fischer 
22445da7d5eSAndre Fischer 
22545da7d5eSAndre Fischer 
22645da7d5eSAndre Fischer void ControllerItem::SetupToolBoxItem (ToolBox& rToolBox, const sal_uInt16 nIndex)
22745da7d5eSAndre Fischer {
22845da7d5eSAndre Fischer     rToolBox.SetQuickHelpText(nIndex, GetLabel());
22945da7d5eSAndre Fischer     rToolBox.SetItemImage(nIndex, GetIcon());
23045da7d5eSAndre Fischer }
23145da7d5eSAndre Fischer 
23245da7d5eSAndre Fischer 
233b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar
234