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 23 24 #include "precompiled_sd.hxx" 25 26 #include "SlsDragAndDropContext.hxx" 27 28 #include "SlideSorter.hxx" 29 #include "model/SlideSorterModel.hxx" 30 #include "model/SlsPageEnumerationProvider.hxx" 31 #include "view/SlideSorterView.hxx" 32 #include "controller/SlideSorterController.hxx" 33 #include "controller/SlsInsertionIndicatorHandler.hxx" 34 #include "controller/SlsScrollBarManager.hxx" 35 #include "controller/SlsProperties.hxx" 36 #include "controller/SlsSelectionFunction.hxx" 37 #include "controller/SlsSelectionManager.hxx" 38 #include "controller/SlsClipboard.hxx" 39 #include "controller/SlsTransferableData.hxx" 40 #include "DrawDocShell.hxx" 41 #include "drawdoc.hxx" 42 #include "app.hrc" 43 #include "sdtreelb.hxx" 44 #include <sfx2/bindings.hxx> 45 #include <boost/bind.hpp> 46 47 namespace sd { namespace slidesorter { namespace controller { 48 49 DragAndDropContext::DragAndDropContext (SlideSorter& rSlideSorter) 50 : mpTargetSlideSorter(&rSlideSorter), 51 mnInsertionIndex(-1) 52 { 53 ::std::vector<const SdPage*> aPages; 54 55 // No Drag-and-Drop for master pages. 56 if (rSlideSorter.GetModel().GetEditMode() != EM_PAGE) 57 return; 58 59 // For poperly handling transferables created by the navigator we 60 // need additional information. For this a user data object is 61 // created that contains the necessary information. 62 SdTransferable* pTransferable = SD_MOD()->pTransferDrag; 63 SdPageObjsTLB::SdPageObjsTransferable* pTreeListBoxTransferable 64 = dynamic_cast<SdPageObjsTLB::SdPageObjsTransferable*>(pTransferable); 65 if (pTreeListBoxTransferable!=NULL && !TransferableData::GetFromTransferable(pTransferable)) 66 { 67 pTransferable->AddUserData( 68 rSlideSorter.GetController().GetClipboard().CreateTransferableUserData(pTransferable)); 69 } 70 71 rSlideSorter.GetController().GetInsertionIndicatorHandler()->UpdateIndicatorIcon(pTransferable); 72 } 73 74 75 76 77 DragAndDropContext::~DragAndDropContext (void) 78 { 79 SetTargetSlideSorter (NULL, Point(0,0), InsertionIndicatorHandler::UnknownMode, false); 80 } 81 82 83 84 85 void DragAndDropContext::GetPagesFromBookmarks ( 86 ::std::vector<const SdPage*>& rPages, 87 sal_Int32& rnSelectionCount, 88 DrawDocShell* pDocShell, 89 const List& rBookmarks) const 90 { 91 if (pDocShell == NULL) 92 return; 93 94 const SdDrawDocument* pDocument = pDocShell->GetDoc(); 95 if (pDocument == NULL) 96 return; 97 98 for (sal_uLong nIndex=0,nCount=rBookmarks.Count(); nIndex<nCount; ++nIndex) 99 { 100 const String sPageName (*static_cast<String*>(rBookmarks.GetObject(nIndex))); 101 sal_Bool bIsMasterPage (sal_False); 102 const sal_uInt16 nPageIndex (pDocument->GetPageByName(sPageName, bIsMasterPage)); 103 if (nPageIndex == SDRPAGE_NOTFOUND) 104 continue; 105 106 const SdPage* pPage = dynamic_cast<const SdPage*>(pDocument->GetPage(nPageIndex)); 107 if (pPage != NULL) 108 rPages.push_back(pPage); 109 } 110 rnSelectionCount = rBookmarks.Count(); 111 } 112 113 114 115 116 void DragAndDropContext::GetPagesFromSelection ( 117 ::std::vector<const SdPage*>& rPages, 118 sal_Int32& rnSelectionCount, 119 model::PageEnumeration& rSelection) const 120 { 121 // Show a new substitution for the selected page objects. 122 rnSelectionCount = 0; 123 124 while (rSelection.HasMoreElements()) 125 { 126 model::SharedPageDescriptor pDescriptor (rSelection.GetNextElement()); 127 if (rPages.size() < 3) 128 rPages.push_back(pDescriptor->GetPage()); 129 ++rnSelectionCount; 130 } 131 } 132 133 134 135 136 void DragAndDropContext::Dispose (void) 137 { 138 mnInsertionIndex = -1; 139 } 140 141 142 143 144 void DragAndDropContext::UpdatePosition ( 145 const Point& rMousePosition, 146 const InsertionIndicatorHandler::Mode eMode, 147 const bool bAllowAutoScroll) 148 { 149 if (mpTargetSlideSorter == NULL) 150 return; 151 152 if (mpTargetSlideSorter->GetProperties()->IsUIReadOnly()) 153 return; 154 155 // Convert window coordinates into model coordinates (we need the 156 // window coordinates for auto-scrolling because that remains 157 // constant while scrolling.) 158 SharedSdWindow pWindow (mpTargetSlideSorter->GetContentWindow()); 159 const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition)); 160 ::boost::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler ( 161 mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()); 162 163 if ( ! (bAllowAutoScroll 164 && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll( 165 rMousePosition, 166 ::boost::bind( 167 &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false)))) 168 { 169 pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode); 170 171 // Remember the new insertion index. 172 mnInsertionIndex = pInsertionIndicatorHandler->GetInsertionPageIndex(); 173 if (pInsertionIndicatorHandler->IsInsertionTrivial(mnInsertionIndex, eMode)) 174 mnInsertionIndex = -1; 175 } 176 } 177 178 179 180 181 void DragAndDropContext::SetTargetSlideSorter ( 182 SlideSorter* pSlideSorter, 183 const Point aMousePosition, 184 const InsertionIndicatorHandler::Mode eMode, 185 const bool bIsOverSourceView) 186 { 187 if (mpTargetSlideSorter != NULL) 188 { 189 mpTargetSlideSorter->GetController().GetScrollBarManager().StopAutoScroll(); 190 mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()->End( 191 Animator::AM_Animated); 192 } 193 194 mpTargetSlideSorter = pSlideSorter; 195 196 if (mpTargetSlideSorter != NULL) 197 { 198 mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()->Start( 199 bIsOverSourceView); 200 mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()->UpdatePosition( 201 aMousePosition, 202 eMode); 203 204 } 205 } 206 207 208 } } } // end of namespace ::sd::slidesorter::controller 209