1*5b190011SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5b190011SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5b190011SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5b190011SAndrew Rist * distributed with this work for additional information 6*5b190011SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5b190011SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5b190011SAndrew Rist * "License"); you may not use this file except in compliance 9*5b190011SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*5b190011SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*5b190011SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5b190011SAndrew Rist * software distributed under the License is distributed on an 15*5b190011SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5b190011SAndrew Rist * KIND, either express or implied. See the License for the 17*5b190011SAndrew Rist * specific language governing permissions and limitations 18*5b190011SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*5b190011SAndrew Rist *************************************************************/ 21*5b190011SAndrew Rist 22*5b190011SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sd.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "sddll.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp> 30cdf0e10cSrcweir #include <sfx2/imagemgr.hxx> 31cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 32cdf0e10cSrcweir #include <sfx2/bindings.hxx> 33cdf0e10cSrcweir #include <sfx2/app.hxx> 34cdf0e10cSrcweir #include <sfx2/request.hxx> 35cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 36cdf0e10cSrcweir 37cdf0e10cSrcweir #include <tools/rcid.h> 38cdf0e10cSrcweir 39cdf0e10cSrcweir #include <vcl/help.hxx> 40cdf0e10cSrcweir #include <vcl/imagerepository.hxx> 41cdf0e10cSrcweir #include <vcl/lazydelete.hxx> 42cdf0e10cSrcweir 43cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx> 44cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx> 45cdf0e10cSrcweir #include <svx/sdr/overlay/overlayanimatedbitmapex.hxx> 46cdf0e10cSrcweir #include <svx/sdr/overlay/overlaybitmapex.hxx> 47cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx> 48cdf0e10cSrcweir #include <svx/svxids.hrc> 49cdf0e10cSrcweir 50cdf0e10cSrcweir #include "view/viewoverlaymanager.hxx" 51cdf0e10cSrcweir 52cdf0e10cSrcweir #include "res_bmp.hrc" 53cdf0e10cSrcweir #include "DrawDocShell.hxx" 54cdf0e10cSrcweir #include "DrawViewShell.hxx" 55cdf0e10cSrcweir #include "DrawController.hxx" 56cdf0e10cSrcweir #include "glob.hrc" 57cdf0e10cSrcweir #include "strings.hrc" 58cdf0e10cSrcweir #include "sdresid.hxx" 59cdf0e10cSrcweir #include "EventMultiplexer.hxx" 60cdf0e10cSrcweir #include "ViewShellManager.hxx" 61cdf0e10cSrcweir #include "helpids.h" 62cdf0e10cSrcweir #include "sdpage.hxx" 63cdf0e10cSrcweir #include "drawdoc.hxx" 64cdf0e10cSrcweir #include "smarttag.hxx" 65cdf0e10cSrcweir 66cdf0e10cSrcweir using ::rtl::OUString; 67cdf0e10cSrcweir using namespace ::com::sun::star::uno; 68cdf0e10cSrcweir using namespace ::com::sun::star::frame; 69cdf0e10cSrcweir 70cdf0e10cSrcweir namespace sd { 71cdf0e10cSrcweir 72cdf0e10cSrcweir class ImageButtonHdl; 73cdf0e10cSrcweir 74cdf0e10cSrcweir // -------------------------------------------------------------------- 75cdf0e10cSrcweir 76cdf0e10cSrcweir static sal_uInt16 gButtonSlots[] = { SID_INSERT_TABLE, SID_INSERT_DIAGRAM, SID_INSERT_GRAPHIC, SID_INSERT_AVMEDIA }; 77cdf0e10cSrcweir static sal_uInt16 gButtonToolTips[] = { STR_INSERT_TABLE, STR_INSERT_CHART, STR_INSERT_PICTURE, STR_INSERT_MOVIE }; 78cdf0e10cSrcweir 79cdf0e10cSrcweir // -------------------------------------------------------------------- 80cdf0e10cSrcweir 81cdf0e10cSrcweir static BitmapEx loadImageResource( sal_uInt16 nId ) 82cdf0e10cSrcweir { 83cdf0e10cSrcweir SdResId aResId( nId ); 84cdf0e10cSrcweir aResId.SetRT( RSC_BITMAP ); 85cdf0e10cSrcweir 86cdf0e10cSrcweir return BitmapEx( aResId ); 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir // -------------------------------------------------------------------- 90cdf0e10cSrcweir 91cdf0e10cSrcweir static BitmapEx* getButtonImage( int index, bool large ) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir static vcl::DeleteOnDeinit< BitmapEx > gSmallButtonImages[BMP_PLACEHOLDER_SMALL_END - BMP_PLACEHOLDER_SMALL_START] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 94cdf0e10cSrcweir static vcl::DeleteOnDeinit< BitmapEx > gLargeButtonImages[BMP_PLACEHOLDER_LARGE_END - BMP_PLACEHOLDER_LARGE_START] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 95cdf0e10cSrcweir 96cdf0e10cSrcweir if( !gSmallButtonImages[0].get() ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir for( sal_uInt16 i = 0; i < (BMP_PLACEHOLDER_SMALL_END-BMP_PLACEHOLDER_SMALL_START); i++ ) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir gSmallButtonImages[i].set( new BitmapEx( loadImageResource( BMP_PLACEHOLDER_SMALL_START + i ) ) ); 101cdf0e10cSrcweir gLargeButtonImages[i].set( new BitmapEx( loadImageResource( BMP_PLACEHOLDER_LARGE_START + i ) ) ); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir if( large ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir return gLargeButtonImages[index].get(); 108cdf0e10cSrcweir } 109cdf0e10cSrcweir else 110cdf0e10cSrcweir { 111cdf0e10cSrcweir return gSmallButtonImages[index].get(); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir // -------------------------------------------------------------------- 116cdf0e10cSrcweir 117cdf0e10cSrcweir const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32; 118cdf0e10cSrcweir 119cdf0e10cSrcweir class ChangePlaceholderTag : public SmartTag 120cdf0e10cSrcweir { 121cdf0e10cSrcweir friend class ImageButtonHdl; 122cdf0e10cSrcweir public: 123cdf0e10cSrcweir ChangePlaceholderTag( ViewOverlayManager& rManager, ::sd::View& rView, SdrObject& rPlaceholderObj ); 124cdf0e10cSrcweir virtual ~ChangePlaceholderTag(); 125cdf0e10cSrcweir 126cdf0e10cSrcweir /** returns true if the SmartTag handled the event. */ 127cdf0e10cSrcweir virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ); 128cdf0e10cSrcweir 129cdf0e10cSrcweir /** returns true if the SmartTag consumes this event. */ 130cdf0e10cSrcweir virtual bool KeyInput( const KeyEvent& rKEvt ); 131cdf0e10cSrcweir 132cdf0e10cSrcweir BitmapEx createOverlayImage( int nHighlight = -1 ); 133cdf0e10cSrcweir 134cdf0e10cSrcweir protected: 135cdf0e10cSrcweir virtual void addCustomHandles( SdrHdlList& rHandlerList ); 136cdf0e10cSrcweir virtual void disposing(); 137cdf0e10cSrcweir virtual void select(); 138cdf0e10cSrcweir virtual void deselect(); 139cdf0e10cSrcweir 140cdf0e10cSrcweir private: 141cdf0e10cSrcweir ViewOverlayManager& mrManager; 142cdf0e10cSrcweir SdrObjectWeakRef mxPlaceholderObj; 143cdf0e10cSrcweir }; 144cdf0e10cSrcweir 145cdf0e10cSrcweir class ImageButtonHdl : public SmartHdl 146cdf0e10cSrcweir { 147cdf0e10cSrcweir public: 148cdf0e10cSrcweir ImageButtonHdl( const SmartTagReference& xTag, /* sal_uInt16 nSID, const Image& rImage, const Image& rImageMO, */ const Point& rPnt ); 149cdf0e10cSrcweir virtual ~ImageButtonHdl(); 150cdf0e10cSrcweir virtual void CreateB2dIAObject(); 151cdf0e10cSrcweir virtual sal_Bool IsFocusHdl() const; 152cdf0e10cSrcweir virtual Pointer GetPointer() const; 153cdf0e10cSrcweir virtual bool isMarkable() const; 154cdf0e10cSrcweir 155cdf0e10cSrcweir virtual void onMouseEnter(const MouseEvent& rMEvt); 156cdf0e10cSrcweir virtual void onMouseLeave(); 157cdf0e10cSrcweir 158cdf0e10cSrcweir int getHighlightId() const { return mnHighlightId; } 159cdf0e10cSrcweir 160cdf0e10cSrcweir void HideTip(); 161cdf0e10cSrcweir 162cdf0e10cSrcweir private: 163cdf0e10cSrcweir rtl::Reference< ChangePlaceholderTag > mxTag; 164cdf0e10cSrcweir 165cdf0e10cSrcweir int mnHighlightId; 166cdf0e10cSrcweir Size maImageSize; 167cdf0e10cSrcweir sal_uLong mnTip; 168cdf0e10cSrcweir }; 169cdf0e10cSrcweir 170cdf0e10cSrcweir // -------------------------------------------------------------------- 171cdf0e10cSrcweir 172cdf0e10cSrcweir ImageButtonHdl::ImageButtonHdl( const SmartTagReference& xTag /*, sal_uInt16 nSID, const Image& rImage, const Image& rImageMO*/, const Point& rPnt ) 173cdf0e10cSrcweir : SmartHdl( xTag, rPnt ) 174cdf0e10cSrcweir , mxTag( dynamic_cast< ChangePlaceholderTag* >( xTag.get() ) ) 175cdf0e10cSrcweir , mnHighlightId( -1 ) 176cdf0e10cSrcweir , maImageSize( 42, 42 ) 177cdf0e10cSrcweir , mnTip( 0 ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir // -------------------------------------------------------------------- 182cdf0e10cSrcweir 183cdf0e10cSrcweir ImageButtonHdl::~ImageButtonHdl() 184cdf0e10cSrcweir { 185cdf0e10cSrcweir HideTip(); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir 188cdf0e10cSrcweir // -------------------------------------------------------------------- 189cdf0e10cSrcweir 190cdf0e10cSrcweir void ImageButtonHdl::HideTip() 191cdf0e10cSrcweir { 192cdf0e10cSrcweir if( mnTip ) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir Help::HideTip( mnTip ); 195cdf0e10cSrcweir mnTip = 0; 196cdf0e10cSrcweir } 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir // -------------------------------------------------------------------- 200cdf0e10cSrcweir 201cdf0e10cSrcweir extern ::rtl::OUString ImplRetrieveLabelFromCommand( const Reference< XFrame >& xFrame, const OUString& aCmdURL ); 202cdf0e10cSrcweir 203cdf0e10cSrcweir void ImageButtonHdl::onMouseEnter(const MouseEvent& rMEvt) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir int nHighlightId = 0; 206cdf0e10cSrcweir 207cdf0e10cSrcweir if( pHdlList && pHdlList->GetView()) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir OutputDevice* pDev = pHdlList->GetView()->GetFirstOutputDevice(); 210cdf0e10cSrcweir if( pDev == 0 ) 211cdf0e10cSrcweir pDev = Application::GetDefaultDevice(); 212cdf0e10cSrcweir 213cdf0e10cSrcweir Point aMDPos( rMEvt.GetPosPixel() ); 214cdf0e10cSrcweir aMDPos -= pDev->LogicToPixel( GetPos() ); 215cdf0e10cSrcweir 216cdf0e10cSrcweir nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0; 217cdf0e10cSrcweir nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0; 218cdf0e10cSrcweir 219cdf0e10cSrcweir if( mnHighlightId != nHighlightId ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir HideTip(); 222cdf0e10cSrcweir 223cdf0e10cSrcweir mnHighlightId = nHighlightId; 224cdf0e10cSrcweir 225cdf0e10cSrcweir if( pHdlList ) 226cdf0e10cSrcweir { 227cdf0e10cSrcweir SdResId aResId( gButtonToolTips[mnHighlightId] ); 228cdf0e10cSrcweir aResId.SetRT( RSC_STRING ); 229cdf0e10cSrcweir 230cdf0e10cSrcweir String aHelpText( aResId ); 231cdf0e10cSrcweir Rectangle aScreenRect( pDev->LogicToPixel( GetPos() ), maImageSize ); 232cdf0e10cSrcweir mnTip = Help::ShowTip( static_cast< ::Window* >( pHdlList->GetView()->GetFirstOutputDevice() ), aScreenRect, aHelpText, 0 ) ; 233cdf0e10cSrcweir } 234cdf0e10cSrcweir Touch(); 235cdf0e10cSrcweir } 236cdf0e10cSrcweir } 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 239cdf0e10cSrcweir // -------------------------------------------------------------------- 240cdf0e10cSrcweir 241cdf0e10cSrcweir void ImageButtonHdl::onMouseLeave() 242cdf0e10cSrcweir { 243cdf0e10cSrcweir mnHighlightId = -1; 244cdf0e10cSrcweir HideTip(); 245cdf0e10cSrcweir Touch(); 246cdf0e10cSrcweir } 247cdf0e10cSrcweir 248cdf0e10cSrcweir // -------------------------------------------------------------------- 249cdf0e10cSrcweir 250cdf0e10cSrcweir void ImageButtonHdl::CreateB2dIAObject() 251cdf0e10cSrcweir { 252cdf0e10cSrcweir // first throw away old one 253cdf0e10cSrcweir GetRidOfIAObject(); 254cdf0e10cSrcweir 255cdf0e10cSrcweir const Point aTagPos( GetPos() ); 256cdf0e10cSrcweir basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() ); 257cdf0e10cSrcweir 258cdf0e10cSrcweir BitmapEx aBitmapEx( mxTag->createOverlayImage( mnHighlightId ) ); // maImageMO.GetBitmapEx() : maImage.GetBitmapEx() ); 259cdf0e10cSrcweir maImageSize = aBitmapEx.GetSizePixel(); 260cdf0e10cSrcweir maImageSize.Width() >>= 1; 261cdf0e10cSrcweir maImageSize.Height() >>= 1; 262cdf0e10cSrcweir 263cdf0e10cSrcweir if(pHdlList) 264cdf0e10cSrcweir { 265cdf0e10cSrcweir SdrMarkView* pView = pHdlList->GetView(); 266cdf0e10cSrcweir 267cdf0e10cSrcweir if(pView && !pView->areMarkHandlesHidden()) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir SdrPageView* pPageView = pView->GetSdrPageView(); 270cdf0e10cSrcweir 271cdf0e10cSrcweir if(pPageView) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b); 276cdf0e10cSrcweir 277cdf0e10cSrcweir SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow(); 278cdf0e10cSrcweir if(rPaintWindow.OutputToWindow() && rPageWindow.GetOverlayManager() ) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir ::sdr::overlay::OverlayObject* pOverlayObject = 0; 281cdf0e10cSrcweir 282cdf0e10cSrcweir pOverlayObject = new ::sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 ); 283cdf0e10cSrcweir rPageWindow.GetOverlayManager()->add(*pOverlayObject); 284cdf0e10cSrcweir maOverlayGroup.append(*pOverlayObject); 285cdf0e10cSrcweir } 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir } 289cdf0e10cSrcweir } 290cdf0e10cSrcweir } 291cdf0e10cSrcweir 292cdf0e10cSrcweir // -------------------------------------------------------------------- 293cdf0e10cSrcweir 294cdf0e10cSrcweir sal_Bool ImageButtonHdl::IsFocusHdl() const 295cdf0e10cSrcweir { 296cdf0e10cSrcweir return false; 297cdf0e10cSrcweir } 298cdf0e10cSrcweir 299cdf0e10cSrcweir // -------------------------------------------------------------------- 300cdf0e10cSrcweir 301cdf0e10cSrcweir bool ImageButtonHdl::isMarkable() const 302cdf0e10cSrcweir { 303cdf0e10cSrcweir return false; 304cdf0e10cSrcweir } 305cdf0e10cSrcweir 306cdf0e10cSrcweir // -------------------------------------------------------------------- 307cdf0e10cSrcweir 308cdf0e10cSrcweir Pointer ImageButtonHdl::GetPointer() const 309cdf0e10cSrcweir { 310cdf0e10cSrcweir return Pointer( POINTER_ARROW ); 311cdf0e10cSrcweir } 312cdf0e10cSrcweir 313cdf0e10cSrcweir // ==================================================================== 314cdf0e10cSrcweir 315cdf0e10cSrcweir ChangePlaceholderTag::ChangePlaceholderTag( ViewOverlayManager& rManager, ::sd::View& rView, SdrObject& rPlaceholderObj ) 316cdf0e10cSrcweir : SmartTag( rView ) 317cdf0e10cSrcweir , mrManager( rManager ) 318cdf0e10cSrcweir , mxPlaceholderObj( &rPlaceholderObj ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir // -------------------------------------------------------------------- 323cdf0e10cSrcweir 324cdf0e10cSrcweir ChangePlaceholderTag::~ChangePlaceholderTag() 325cdf0e10cSrcweir { 326cdf0e10cSrcweir } 327cdf0e10cSrcweir 328cdf0e10cSrcweir // -------------------------------------------------------------------- 329cdf0e10cSrcweir 330cdf0e10cSrcweir /** returns true if the ChangePlaceholderTag handled the event. */ 331cdf0e10cSrcweir bool ChangePlaceholderTag::MouseButtonDown( const MouseEvent& /*rMEvt*/, SmartHdl& rHdl ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir int nHighlightId = static_cast< ImageButtonHdl& >(rHdl).getHighlightId(); 334cdf0e10cSrcweir if( nHighlightId >= 0 ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir sal_uInt16 nSID = gButtonSlots[nHighlightId]; 337cdf0e10cSrcweir 338cdf0e10cSrcweir if( mxPlaceholderObj.get() ) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir // mark placeholder if it is not currently marked (or if also others are marked) 341cdf0e10cSrcweir if( !mrView.IsObjMarked( mxPlaceholderObj.get() ) || (mrView.GetMarkedObjectList().GetMarkCount() != 1) ) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir SdrPageView* pPV = mrView.GetSdrPageView(); 344cdf0e10cSrcweir mrView.UnmarkAllObj(pPV ); 345cdf0e10cSrcweir mrView.MarkObj(mxPlaceholderObj.get(), pPV, sal_False); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir } 348cdf0e10cSrcweir 349cdf0e10cSrcweir mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( nSID, SFX_CALLMODE_ASYNCHRON); 350cdf0e10cSrcweir } 351cdf0e10cSrcweir return false; 352cdf0e10cSrcweir } 353cdf0e10cSrcweir 354cdf0e10cSrcweir // -------------------------------------------------------------------- 355cdf0e10cSrcweir 356cdf0e10cSrcweir /** returns true if the SmartTag consumes this event. */ 357cdf0e10cSrcweir bool ChangePlaceholderTag::KeyInput( const KeyEvent& rKEvt ) 358cdf0e10cSrcweir { 359cdf0e10cSrcweir sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); 360cdf0e10cSrcweir switch( nCode ) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir case KEY_DOWN: 363cdf0e10cSrcweir case KEY_UP: 364cdf0e10cSrcweir case KEY_LEFT: 365cdf0e10cSrcweir case KEY_RIGHT: 366cdf0e10cSrcweir case KEY_ESCAPE: 367cdf0e10cSrcweir case KEY_TAB: 368cdf0e10cSrcweir case KEY_RETURN: 369cdf0e10cSrcweir case KEY_SPACE: 370cdf0e10cSrcweir default: 371cdf0e10cSrcweir return false; 372cdf0e10cSrcweir } 373cdf0e10cSrcweir } 374cdf0e10cSrcweir 375cdf0e10cSrcweir // -------------------------------------------------------------------- 376cdf0e10cSrcweir 377cdf0e10cSrcweir BitmapEx ChangePlaceholderTag::createOverlayImage( int nHighlight ) 378cdf0e10cSrcweir { 379cdf0e10cSrcweir BitmapEx aRet; 380cdf0e10cSrcweir if( mxPlaceholderObj.is() ) 381cdf0e10cSrcweir { 382cdf0e10cSrcweir SdrObject* pPlaceholder = mxPlaceholderObj.get(); 383cdf0e10cSrcweir SmartTagReference xThis( this ); 384cdf0e10cSrcweir const Rectangle& rSnapRect = pPlaceholder->GetSnapRect(); 385cdf0e10cSrcweir const Point aPoint; 386cdf0e10cSrcweir 387cdf0e10cSrcweir OutputDevice* pDev = mrView.GetFirstOutputDevice(); 388cdf0e10cSrcweir if( pDev == 0 ) 389cdf0e10cSrcweir pDev = Application::GetDefaultDevice(); 390cdf0e10cSrcweir 391cdf0e10cSrcweir Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize()); 392cdf0e10cSrcweir long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height()); 393cdf0e10cSrcweir 394cdf0e10cSrcweir bool bLarge = nShapeSizePix > 250; 395cdf0e10cSrcweir 396cdf0e10cSrcweir Size aSize( getButtonImage( 0, bLarge )->GetSizePixel() ); 397cdf0e10cSrcweir 398cdf0e10cSrcweir aRet.SetSizePixel( Size( aSize.Width() << 1, aSize.Height() << 1 ) ); 399cdf0e10cSrcweir 400cdf0e10cSrcweir const Rectangle aRectSrc( Point( 0, 0 ), aSize ); 401cdf0e10cSrcweir 402cdf0e10cSrcweir aRet = *(getButtonImage((nHighlight == 0) ? 4 : 0, bLarge)); 403cdf0e10cSrcweir aRet.Expand( aSize.Width(), aSize.Height(), NULL, sal_True ); 404cdf0e10cSrcweir 405cdf0e10cSrcweir aRet.CopyPixel( Rectangle( Point( aSize.Width(), 0 ), aSize ), aRectSrc, getButtonImage((nHighlight == 1) ? 5 : 1, bLarge) ); 406cdf0e10cSrcweir aRet.CopyPixel( Rectangle( Point( 0, aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 2) ? 6 : 2, bLarge) ); 407cdf0e10cSrcweir aRet.CopyPixel( Rectangle( Point( aSize.Width(), aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 3) ? 7 : 3, bLarge) ); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir return aRet; 411cdf0e10cSrcweir } 412cdf0e10cSrcweir 413cdf0e10cSrcweir void ChangePlaceholderTag::addCustomHandles( SdrHdlList& rHandlerList ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir if( mxPlaceholderObj.is() ) 416cdf0e10cSrcweir { 417cdf0e10cSrcweir SdrObject* pPlaceholder = mxPlaceholderObj.get(); 418cdf0e10cSrcweir SmartTagReference xThis( this ); 419cdf0e10cSrcweir const Rectangle& rSnapRect = pPlaceholder->GetSnapRect(); 420cdf0e10cSrcweir const Point aPoint; 421cdf0e10cSrcweir 422cdf0e10cSrcweir OutputDevice* pDev = mrView.GetFirstOutputDevice(); 423cdf0e10cSrcweir if( pDev == 0 ) 424cdf0e10cSrcweir pDev = Application::GetDefaultDevice(); 425cdf0e10cSrcweir 426cdf0e10cSrcweir Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize()); 427cdf0e10cSrcweir long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height()); 428cdf0e10cSrcweir if( 50 > nShapeSizePix ) 429cdf0e10cSrcweir return; 430cdf0e10cSrcweir 431cdf0e10cSrcweir bool bLarge = nShapeSizePix > 250; 432cdf0e10cSrcweir 433cdf0e10cSrcweir Size aButtonSize( pDev->PixelToLogic( getButtonImage(0, bLarge )->GetSizePixel()) ); 434cdf0e10cSrcweir 435cdf0e10cSrcweir const int nColumns = 2; 436cdf0e10cSrcweir const int nRows = 2; 437cdf0e10cSrcweir 438cdf0e10cSrcweir long all_width = nColumns * aButtonSize.Width(); 439cdf0e10cSrcweir long all_height = nRows * aButtonSize.Height(); 440cdf0e10cSrcweir 441cdf0e10cSrcweir Point aPos( rSnapRect.Center() ); 442cdf0e10cSrcweir aPos.X() -= all_width >> 1; 443cdf0e10cSrcweir aPos.Y() -= all_height >> 1; 444cdf0e10cSrcweir 445cdf0e10cSrcweir ImageButtonHdl* pHdl = new ImageButtonHdl( xThis, aPoint ); 446cdf0e10cSrcweir pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM ); 447cdf0e10cSrcweir pHdl->SetPageView( mrView.GetSdrPageView() ); 448cdf0e10cSrcweir 449cdf0e10cSrcweir pHdl->SetPos( aPos ); 450cdf0e10cSrcweir 451cdf0e10cSrcweir rHandlerList.AddHdl( pHdl ); 452cdf0e10cSrcweir } 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir // -------------------------------------------------------------------- 456cdf0e10cSrcweir 457cdf0e10cSrcweir void ChangePlaceholderTag::disposing() 458cdf0e10cSrcweir { 459cdf0e10cSrcweir SmartTag::disposing(); 460cdf0e10cSrcweir } 461cdf0e10cSrcweir 462cdf0e10cSrcweir // -------------------------------------------------------------------- 463cdf0e10cSrcweir 464cdf0e10cSrcweir void ChangePlaceholderTag::select() 465cdf0e10cSrcweir { 466cdf0e10cSrcweir SmartTag::select(); 467cdf0e10cSrcweir } 468cdf0e10cSrcweir 469cdf0e10cSrcweir // -------------------------------------------------------------------- 470cdf0e10cSrcweir 471cdf0e10cSrcweir void ChangePlaceholderTag::deselect() 472cdf0e10cSrcweir { 473cdf0e10cSrcweir SmartTag::deselect(); 474cdf0e10cSrcweir } 475cdf0e10cSrcweir 476cdf0e10cSrcweir // -------------------------------------------------------------------- 477cdf0e10cSrcweir 478cdf0e10cSrcweir ViewOverlayManager::ViewOverlayManager( ViewShellBase& rViewShellBase ) 479cdf0e10cSrcweir : mrBase( rViewShellBase ) 480cdf0e10cSrcweir , mnUpdateTagsEvent( 0 ) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir Link aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) ); 483cdf0e10cSrcweir mrBase.GetEventMultiplexer()->AddEventListener(aLink, tools::EventMultiplexerEvent::EID_CURRENT_PAGE 484cdf0e10cSrcweir | tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED 485cdf0e10cSrcweir | tools::EventMultiplexerEvent::EID_VIEW_ADDED 486cdf0e10cSrcweir | tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT 487cdf0e10cSrcweir | tools::EventMultiplexerEvent::EID_END_TEXT_EDIT ); 488cdf0e10cSrcweir 489cdf0e10cSrcweir StartListening( *mrBase.GetDocShell() ); 490cdf0e10cSrcweir } 491cdf0e10cSrcweir 492cdf0e10cSrcweir // -------------------------------------------------------------------- 493cdf0e10cSrcweir 494cdf0e10cSrcweir ViewOverlayManager::~ViewOverlayManager() 495cdf0e10cSrcweir { 496cdf0e10cSrcweir Link aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) ); 497cdf0e10cSrcweir mrBase.GetEventMultiplexer()->RemoveEventListener( aLink ); 498cdf0e10cSrcweir 499cdf0e10cSrcweir if( mnUpdateTagsEvent ) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir Application::RemoveUserEvent( mnUpdateTagsEvent ); 502cdf0e10cSrcweir mnUpdateTagsEvent = 0; 503cdf0e10cSrcweir } 504cdf0e10cSrcweir 505cdf0e10cSrcweir DisposeTags(); 506cdf0e10cSrcweir } 507cdf0e10cSrcweir 508cdf0e10cSrcweir // -------------------------------------------------------------------- 509cdf0e10cSrcweir 510cdf0e10cSrcweir void ViewOverlayManager::Notify(SfxBroadcaster&, const SfxHint& rHint) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint); 513cdf0e10cSrcweir if (pSimpleHint != NULL) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir if (pSimpleHint->GetId() == SFX_HINT_DOCCHANGED) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir UpdateTags(); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir } 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir void ViewOverlayManager::onZoomChanged() 523cdf0e10cSrcweir { 524cdf0e10cSrcweir if( !maTagVector.empty() ) 525cdf0e10cSrcweir { 526cdf0e10cSrcweir UpdateTags(); 527cdf0e10cSrcweir } 528cdf0e10cSrcweir } 529cdf0e10cSrcweir 530cdf0e10cSrcweir void ViewOverlayManager::UpdateTags() 531cdf0e10cSrcweir { 532cdf0e10cSrcweir if( !mnUpdateTagsEvent ) 533cdf0e10cSrcweir mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, ViewOverlayManager, UpdateTagsHdl ) ); 534cdf0e10cSrcweir } 535cdf0e10cSrcweir 536cdf0e10cSrcweir IMPL_LINK(ViewOverlayManager,UpdateTagsHdl, void *, EMPTYARG) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir OSL_TRACE("ViewOverlayManager::UpdateTagsHdl"); 539cdf0e10cSrcweir 540cdf0e10cSrcweir mnUpdateTagsEvent = 0; 541cdf0e10cSrcweir bool bChanges = DisposeTags(); 542cdf0e10cSrcweir bChanges |= CreateTags(); 543cdf0e10cSrcweir 544cdf0e10cSrcweir if( bChanges && mrBase.GetDrawView() ) 545cdf0e10cSrcweir static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles(); 546cdf0e10cSrcweir return 0; 547cdf0e10cSrcweir } 548cdf0e10cSrcweir 549cdf0e10cSrcweir bool ViewOverlayManager::CreateTags() 550cdf0e10cSrcweir { 551cdf0e10cSrcweir bool bChanges = false; 552cdf0e10cSrcweir 553cdf0e10cSrcweir SdPage* pPage = mrBase.GetMainViewShell()->getCurrentPage(); 554cdf0e10cSrcweir 555cdf0e10cSrcweir if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList(); 558cdf0e10cSrcweir 559cdf0e10cSrcweir for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); iter++ ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir if( (*iter)->IsEmptyPresObj() && ((*iter)->GetObjIdentifier() == OBJ_OUTLINETEXT) && (mrBase.GetDrawView()->GetTextEditObject() != (*iter)) ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir rtl::Reference< SmartTag > xTag( new ChangePlaceholderTag( *this, *mrBase.GetMainViewShell()->GetView(), *(*iter) ) ); 564cdf0e10cSrcweir maTagVector.push_back(xTag); 565cdf0e10cSrcweir bChanges = true; 566cdf0e10cSrcweir } 567cdf0e10cSrcweir } 568cdf0e10cSrcweir } 569cdf0e10cSrcweir 570cdf0e10cSrcweir return bChanges; 571cdf0e10cSrcweir } 572cdf0e10cSrcweir 573cdf0e10cSrcweir // -------------------------------------------------------------------- 574cdf0e10cSrcweir 575cdf0e10cSrcweir bool ViewOverlayManager::DisposeTags() 576cdf0e10cSrcweir { 577cdf0e10cSrcweir if( !maTagVector.empty() ) 578cdf0e10cSrcweir { 579cdf0e10cSrcweir ViewTagVector vec; 580cdf0e10cSrcweir vec.swap( maTagVector ); 581cdf0e10cSrcweir 582cdf0e10cSrcweir ViewTagVector::iterator iter = vec.begin(); 583cdf0e10cSrcweir do 584cdf0e10cSrcweir { 585cdf0e10cSrcweir (*iter++)->Dispose(); 586cdf0e10cSrcweir } 587cdf0e10cSrcweir while( iter != vec.end() ); 588cdf0e10cSrcweir return true; 589cdf0e10cSrcweir } 590cdf0e10cSrcweir 591cdf0e10cSrcweir return false; 592cdf0e10cSrcweir } 593cdf0e10cSrcweir 594cdf0e10cSrcweir // -------------------------------------------------------------------- 595cdf0e10cSrcweir 596cdf0e10cSrcweir IMPL_LINK(ViewOverlayManager,EventMultiplexerListener, 597cdf0e10cSrcweir tools::EventMultiplexerEvent*,pEvent) 598cdf0e10cSrcweir { 599cdf0e10cSrcweir switch (pEvent->meEventId) 600cdf0e10cSrcweir { 601cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED: 602cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_VIEW_ADDED: 603cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT: 604cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_END_TEXT_EDIT: 605cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_CURRENT_PAGE: 606cdf0e10cSrcweir UpdateTags(); 607cdf0e10cSrcweir break; 608cdf0e10cSrcweir } 609cdf0e10cSrcweir return 0; 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir } 613