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 #include "precompiled_sfx2.hxx" 23 24 #include "sidebar/ControllerItem.hxx" 25 26 #include <sfx2/msgpool.hxx> 27 #include <sfx2/viewsh.hxx> 28 #include "sfx2/imagemgr.hxx" 29 #include "sfx2/bindings.hxx" 30 #include <unotools/cmdoptions.hxx> 31 #include "sfx2/sidebar/CommandInfoProvider.hxx" 32 #include <vcl/svapp.hxx> 33 #include <vcl/toolbox.hxx> 34 #include <vcl/help.hxx> 35 36 #include <com/sun/star/frame/XFrame.hpp> 37 #include <com/sun/star/frame/XFrameActionListener.hpp> 38 39 40 using namespace css; 41 using namespace cssu; 42 43 44 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) 45 46 namespace 47 { 48 typedef ::cppu::WeakComponentImplHelper1 < 49 css::frame::XFrameActionListener 50 > FrameActionListenerInterfaceBase; 51 52 class FrameActionListener 53 : public ::cppu::BaseMutex, 54 public FrameActionListenerInterfaceBase 55 { 56 public: 57 FrameActionListener ( 58 sfx2::sidebar::ControllerItem& rControllerItem, 59 const Reference<frame::XFrame>& rxFrame) 60 : FrameActionListenerInterfaceBase(m_aMutex), 61 mrControllerItem(rControllerItem), 62 mxFrame(rxFrame) 63 { 64 if (mxFrame.is()) 65 mxFrame->addFrameActionListener(this); 66 } 67 virtual ~FrameActionListener (void) 68 { 69 } 70 virtual void SAL_CALL disposing (void) 71 { 72 if (mxFrame.is()) 73 mxFrame->removeFrameActionListener(this); 74 } 75 virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) 76 throw (cssu::RuntimeException) 77 { 78 (void)rEvent; 79 mrControllerItem.ResetFrame(); 80 mxFrame = NULL; 81 } 82 virtual void SAL_CALL frameAction (const css::frame::FrameActionEvent& rEvent) 83 throw (cssu::RuntimeException) 84 { 85 if (rEvent.Action == frame::FrameAction_CONTEXT_CHANGED) 86 mrControllerItem.NotifyFrameContextChange(); 87 } 88 89 private: 90 sfx2::sidebar::ControllerItem& mrControllerItem; 91 Reference<frame::XFrame> mxFrame; 92 }; 93 } 94 95 namespace sfx2 { namespace sidebar { 96 97 ControllerItem::ControllerItem ( 98 const sal_uInt16 nSlotId, 99 SfxBindings &rBindings, 100 ItemUpdateReceiverInterface& rItemUpdateReceiver) 101 : SfxControllerItem(nSlotId, rBindings), 102 mrItemUpdateReceiver(rItemUpdateReceiver), 103 mxFrame(), 104 mxFrameActionListener(), 105 msCommandName() 106 { 107 } 108 109 110 111 112 ControllerItem::ControllerItem ( 113 const sal_uInt16 nSlotId, 114 SfxBindings &rBindings, 115 ItemUpdateReceiverInterface& rItemUpdateReceiver, 116 const ::rtl::OUString& rsCommandName, 117 const Reference<frame::XFrame>& rxFrame) 118 : SfxControllerItem(nSlotId, rBindings), 119 mrItemUpdateReceiver(rItemUpdateReceiver), 120 mxFrame(rxFrame), 121 mxFrameActionListener(new FrameActionListener(*this, mxFrame)), 122 msCommandName(rsCommandName) 123 { 124 } 125 126 127 128 129 ControllerItem::~ControllerItem (void) 130 { 131 if (mxFrameActionListener.is()) 132 mxFrameActionListener->dispose(); 133 } 134 135 136 137 138 void ControllerItem::StateChanged ( 139 sal_uInt16 nSID, 140 SfxItemState eState, 141 const SfxPoolItem* pState) 142 { 143 mrItemUpdateReceiver.NotifyItemUpdate(nSID, eState, pState, IsEnabled(eState)); 144 } 145 146 147 148 149 bool ControllerItem::IsEnabled (SfxItemState eState) const 150 { 151 if (eState == SFX_ITEM_DISABLED) 152 return false; 153 else if ( ! SvtCommandOptions().HasEntries(SvtCommandOptions::CMDOPTION_DISABLED)) 154 { 155 // There are no disabled commands. 156 return true; 157 } 158 else if (msCommandName.getLength() == 0) 159 { 160 // We were not given a command name at construction and can 161 // not check the state now. Assume the best and return true. 162 return true; 163 } 164 else if (SvtCommandOptions().Lookup(SvtCommandOptions::CMDOPTION_DISABLED, msCommandName)) 165 { 166 // The command is part of a list of disabled commands. 167 return false; 168 } 169 else 170 return true; 171 } 172 173 174 175 176 void ControllerItem::RequestUpdate (void) 177 { 178 SfxPoolItem* pState = NULL; 179 const SfxItemState eState (GetBindings().QueryState(GetId(), pState)); 180 mrItemUpdateReceiver.NotifyItemUpdate(GetId(), eState, pState, IsEnabled(eState)); 181 } 182 183 184 185 186 void ControllerItem::NotifyFrameContextChange (void) 187 { 188 RequestUpdate(); 189 } 190 191 192 193 194 void ControllerItem::ResetFrame (void) 195 { 196 mxFrame = NULL; 197 } 198 199 200 201 202 ::rtl::OUString ControllerItem::GetLabel (void) const 203 { 204 return CommandInfoProvider::Instance().GetLabelForCommand( 205 A2S(".uno:")+msCommandName, 206 mxFrame); 207 } 208 209 210 211 212 ::rtl::OUString ControllerItem::GetHelpText (void) const 213 { 214 Help* pHelp = Application::GetHelp(); 215 if (pHelp != NULL) 216 { 217 if (msCommandName.getLength() > 0) 218 { 219 const ::rtl::OUString sHelp (pHelp->GetHelpText(A2S(".uno:")+msCommandName, NULL)); 220 return sHelp; 221 } 222 } 223 return ::rtl::OUString(); 224 } 225 226 227 228 229 Image ControllerItem::GetIcon (void) const 230 { 231 return GetIcon(Application::GetSettings().GetStyleSettings().GetHighContrastMode()); 232 } 233 234 235 236 237 Image ControllerItem::GetIcon (const bool bIsHighContrastMode) const 238 { 239 return GetImage(mxFrame, A2S(".uno:")+msCommandName, sal_False, bIsHighContrastMode); 240 241 } 242 243 244 245 246 void ControllerItem::SetupToolBoxItem (ToolBox& rToolBox, const sal_uInt16 nIndex) 247 { 248 rToolBox.SetQuickHelpText(nIndex, GetLabel()); 249 rToolBox.SetHelpText(nIndex, GetHelpText()); 250 rToolBox.SetItemImage(nIndex, GetIcon()); 251 } 252 253 254 } } // end of namespace sfx2::sidebar 255