1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx" 26*b1cdbd2cSJim Jagielski #include <svx/dialmgr.hxx> 27*b1cdbd2cSJim Jagielski #include <svx/fmshell.hxx> 28*b1cdbd2cSJim Jagielski #include <svx/fmmodel.hxx> 29*b1cdbd2cSJim Jagielski #include <svx/fmpage.hxx> 30*b1cdbd2cSJim Jagielski #include <svx/svdpagv.hxx> 31*b1cdbd2cSJim Jagielski #include "svx/svditer.hxx" 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski #include "fmhelp.hrc" 34*b1cdbd2cSJim Jagielski #include "fmexpl.hrc" 35*b1cdbd2cSJim Jagielski #include "fmexpl.hxx" 36*b1cdbd2cSJim Jagielski #include "svx/fmresids.hrc" 37*b1cdbd2cSJim Jagielski #include "fmshimp.hxx" 38*b1cdbd2cSJim Jagielski #include "fmservs.hxx" 39*b1cdbd2cSJim Jagielski #include "fmundo.hxx" 40*b1cdbd2cSJim Jagielski #include "fmpgeimp.hxx" 41*b1cdbd2cSJim Jagielski #include "fmitems.hxx" 42*b1cdbd2cSJim Jagielski #include "fmobj.hxx" 43*b1cdbd2cSJim Jagielski #include "fmprop.hrc" 44*b1cdbd2cSJim Jagielski #include <vcl/wrkwin.hxx> 45*b1cdbd2cSJim Jagielski #include <sfx2/viewsh.hxx> 46*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx> 47*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx> 48*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx> 49*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx> 50*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp> 51*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp> 52*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp> 53*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XEventAttacherManager.hpp> 54*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 55*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/XTransferable.hpp> 56*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx> 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski #include <svx/svxdlg.hxx> //CHINA001 59*b1cdbd2cSJim Jagielski #include <svx/dialogs.hrc> //CHINA001 60*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx> 61*b1cdbd2cSJim Jagielski //............................................................................ 62*b1cdbd2cSJim Jagielski namespace svxform 63*b1cdbd2cSJim Jagielski { 64*b1cdbd2cSJim Jagielski //............................................................................ 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski #define DROP_ACTION_TIMER_INITIAL_TICKS 10 67*b1cdbd2cSJim Jagielski // solange dauert es, bis das Scrollen anspringt 68*b1cdbd2cSJim Jagielski #define DROP_ACTION_TIMER_SCROLL_TICKS 3 69*b1cdbd2cSJim Jagielski // in diesen Intervallen wird jeweils eine Zeile gescrollt 70*b1cdbd2cSJim Jagielski #define DROP_ACTION_TIMER_TICK_BASE 10 71*b1cdbd2cSJim Jagielski // das ist die Basis, mit der beide Angaben multipliziert werden (in ms) 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski #define EXPLORER_SYNC_DELAY 200 74*b1cdbd2cSJim Jagielski // dieser Betrag an Millisekunden wird gewartet, ehe der Explorer nach einem Select oder Deselect die ::com::sun::star::sdbcx::View synchronisiert 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 77*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang; 78*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans; 79*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form; 80*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt; 81*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container; 82*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::script; 83*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer; 84*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer::clipboard; 85*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski //======================================================================== 88*b1cdbd2cSJim Jagielski // helper 89*b1cdbd2cSJim Jagielski //======================================================================== 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski typedef ::std::map< Reference< XInterface >, SdrObject*, ::comphelper::OInterfaceCompare< XInterface > > 92*b1cdbd2cSJim Jagielski MapModelToShape; 93*b1cdbd2cSJim Jagielski typedef MapModelToShape::value_type ModelShapePair; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ collectShapeModelMapping(SdrPage * _pPage,MapModelToShape & _rMapping)96*b1cdbd2cSJim Jagielski void collectShapeModelMapping( SdrPage* _pPage, MapModelToShape& _rMapping ) 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski OSL_ENSURE( _pPage, "collectShapeModelMapping: invalid arg!" ); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski _rMapping.clear(); 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski SdrObjListIter aIter( *_pPage ); 103*b1cdbd2cSJim Jagielski while ( aIter.IsMore() ) 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski SdrObject* pSdrObject = aIter.Next(); 106*b1cdbd2cSJim Jagielski FmFormObj* pFormObject = FmFormObj::GetFormObject( pSdrObject ); 107*b1cdbd2cSJim Jagielski if ( !pFormObject ) 108*b1cdbd2cSJim Jagielski continue; 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski Reference< XInterface > xNormalizedModel( pFormObject->GetUnoControlModel(), UNO_QUERY ); 111*b1cdbd2cSJim Jagielski // note that this is normalized (i.e. queried for XInterface explicitly) 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL 114*b1cdbd2cSJim Jagielski ::std::pair< MapModelToShape::iterator, bool > aPos = 115*b1cdbd2cSJim Jagielski #endif 116*b1cdbd2cSJim Jagielski _rMapping.insert( ModelShapePair( xNormalizedModel, pSdrObject ) ); 117*b1cdbd2cSJim Jagielski DBG_ASSERT( aPos.second, "collectShapeModelMapping: model was already existent!" ); 118*b1cdbd2cSJim Jagielski // if this asserts, this would mean we have 2 shapes pointing to the same model 119*b1cdbd2cSJim Jagielski } 120*b1cdbd2cSJim Jagielski } 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ isModelShapeMarked(FmEntryData * _pEntry,const MapModelToShape & _rModelMap,SdrMarkView * _pView)123*b1cdbd2cSJim Jagielski sal_Bool isModelShapeMarked( FmEntryData* _pEntry, const MapModelToShape& _rModelMap, SdrMarkView* _pView ) 124*b1cdbd2cSJim Jagielski { 125*b1cdbd2cSJim Jagielski DBG_ASSERT( _pEntry && _pView, "isModelShapeMarked: invalid arguments!" ); 126*b1cdbd2cSJim Jagielski if ( !_pEntry || !_pView ) 127*b1cdbd2cSJim Jagielski return sal_False; 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski DBG_ASSERT( _pEntry->GetElement().get() == Reference< XInterface >( _pEntry->GetElement(), UNO_QUERY ).get(), 130*b1cdbd2cSJim Jagielski "isModelShapeMarked: element of the FmEntryData is not normalized!" ); 131*b1cdbd2cSJim Jagielski // normalization of the XInterface is a prerequisite for properly finding it in the map 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski sal_Bool bIsMarked = sal_False; 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski MapModelToShape::const_iterator aPos = _rModelMap.find( _pEntry->GetElement() ); 136*b1cdbd2cSJim Jagielski if ( _rModelMap.end() != aPos ) 137*b1cdbd2cSJim Jagielski { // there is a shape for this model .... 138*b1cdbd2cSJim Jagielski bIsMarked = _pView->IsObjMarked( aPos->second ); 139*b1cdbd2cSJim Jagielski if ( !bIsMarked ) 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski // IsObjMarked does not step down grouped objects, so the sal_False we 142*b1cdbd2cSJim Jagielski // have is not really reliable (while a sal_True would have been) 143*b1cdbd2cSJim Jagielski // Okay, travel the mark list, and see if there is a group marked, and our shape 144*b1cdbd2cSJim Jagielski // is a part of this group 145*b1cdbd2cSJim Jagielski sal_uInt32 nMarked = _pView->GetMarkedObjectList().GetMarkCount(); 146*b1cdbd2cSJim Jagielski for ( sal_uInt32 i = 0; (i<nMarked ) && !bIsMarked; ++i ) 147*b1cdbd2cSJim Jagielski { 148*b1cdbd2cSJim Jagielski SdrMark* pMark = _pView->GetMarkedObjectList().GetMark( i ); 149*b1cdbd2cSJim Jagielski SdrObject* pObj = pMark ? pMark->GetMarkedSdrObj() : NULL; 150*b1cdbd2cSJim Jagielski if ( pObj && pObj->IsGroupObject() ) 151*b1cdbd2cSJim Jagielski { // the i-th marked shape is a group shape 152*b1cdbd2cSJim Jagielski SdrObjListIter aIter( *pObj ); 153*b1cdbd2cSJim Jagielski while ( aIter.IsMore() ) 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski if ( aIter.Next() == aPos->second ) 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski bIsMarked = sal_True; 158*b1cdbd2cSJim Jagielski break; 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski return bIsMarked; 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski //======================================================================== 170*b1cdbd2cSJim Jagielski // class NavigatorTree 171*b1cdbd2cSJim Jagielski //======================================================================== 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ NavigatorTree(const Reference<XMultiServiceFactory> & _xORB,Window * pParent)174*b1cdbd2cSJim Jagielski NavigatorTree::NavigatorTree( const Reference< XMultiServiceFactory >& _xORB, 175*b1cdbd2cSJim Jagielski Window* pParent ) 176*b1cdbd2cSJim Jagielski :SvTreeListBox( pParent, WB_HASBUTTONS|WB_HASLINES|WB_BORDER|WB_HSCROLL ) // #100258# OJ WB_HSCROLL added 177*b1cdbd2cSJim Jagielski ,m_aControlExchange(this) 178*b1cdbd2cSJim Jagielski ,m_xORB(_xORB) 179*b1cdbd2cSJim Jagielski ,m_pNavModel( NULL ) 180*b1cdbd2cSJim Jagielski ,m_pRootEntry(NULL) 181*b1cdbd2cSJim Jagielski ,m_pEditEntry(NULL) 182*b1cdbd2cSJim Jagielski ,nEditEvent(0) 183*b1cdbd2cSJim Jagielski ,m_sdiState(SDI_DIRTY) 184*b1cdbd2cSJim Jagielski ,m_aTimerTriggered(-1,-1) 185*b1cdbd2cSJim Jagielski ,m_aDropActionType( DA_SCROLLUP ) 186*b1cdbd2cSJim Jagielski ,m_nSelectLock(0) 187*b1cdbd2cSJim Jagielski ,m_nFormsSelected(0) 188*b1cdbd2cSJim Jagielski ,m_nControlsSelected(0) 189*b1cdbd2cSJim Jagielski ,m_nHiddenControls(0) 190*b1cdbd2cSJim Jagielski ,m_aTimerCounter( DROP_ACTION_TIMER_INITIAL_TICKS ) 191*b1cdbd2cSJim Jagielski ,m_bDragDataDirty(sal_False) 192*b1cdbd2cSJim Jagielski ,m_bPrevSelectionMixed(sal_False) 193*b1cdbd2cSJim Jagielski ,m_bMarkingObjects(sal_False) 194*b1cdbd2cSJim Jagielski ,m_bRootSelected(sal_False) 195*b1cdbd2cSJim Jagielski ,m_bInitialUpdate(sal_True) 196*b1cdbd2cSJim Jagielski ,m_bKeyboardCut( sal_False ) 197*b1cdbd2cSJim Jagielski { 198*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::NavigatorTree" ); 199*b1cdbd2cSJim Jagielski SetHelpId( HID_FORM_NAVIGATOR ); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski m_aNavigatorImages = ImageList( SVX_RES( RID_SVXIMGLIST_FMEXPL ) ); 202*b1cdbd2cSJim Jagielski m_aNavigatorImagesHC = ImageList( SVX_RES( RID_SVXIMGLIST_FMEXPL_HC ) ); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski SetNodeBitmaps( 205*b1cdbd2cSJim Jagielski m_aNavigatorImages.GetImage( RID_SVXIMG_COLLAPSEDNODE ), 206*b1cdbd2cSJim Jagielski m_aNavigatorImages.GetImage( RID_SVXIMG_EXPANDEDNODE ), 207*b1cdbd2cSJim Jagielski BMP_COLOR_NORMAL 208*b1cdbd2cSJim Jagielski ); 209*b1cdbd2cSJim Jagielski SetNodeBitmaps( 210*b1cdbd2cSJim Jagielski m_aNavigatorImagesHC.GetImage( RID_SVXIMG_COLLAPSEDNODE ), 211*b1cdbd2cSJim Jagielski m_aNavigatorImagesHC.GetImage( RID_SVXIMG_EXPANDEDNODE ), 212*b1cdbd2cSJim Jagielski BMP_COLOR_HIGHCONTRAST 213*b1cdbd2cSJim Jagielski ); 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski SetDragDropMode(0xFFFF); 216*b1cdbd2cSJim Jagielski EnableInplaceEditing( sal_True ); 217*b1cdbd2cSJim Jagielski SetSelectionMode(MULTIPLE_SELECTION); 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski m_pNavModel = new NavigatorTreeModel( m_aNavigatorImages, m_aNavigatorImagesHC ); 220*b1cdbd2cSJim Jagielski Clear(); 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski StartListening( *m_pNavModel ); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski m_aDropActionTimer.SetTimeoutHdl(LINK(this, NavigatorTree, OnDropActionTimer)); 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski m_aSynchronizeTimer.SetTimeoutHdl(LINK(this, NavigatorTree, OnSynchronizeTimer)); 227*b1cdbd2cSJim Jagielski SetSelectHdl(LINK(this, NavigatorTree, OnEntrySelDesel)); 228*b1cdbd2cSJim Jagielski SetDeselectHdl(LINK(this, NavigatorTree, OnEntrySelDesel)); 229*b1cdbd2cSJim Jagielski } 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ ~NavigatorTree()232*b1cdbd2cSJim Jagielski NavigatorTree::~NavigatorTree() 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski if( nEditEvent ) 235*b1cdbd2cSJim Jagielski Application::RemoveUserEvent( nEditEvent ); 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski if (m_aSynchronizeTimer.IsActive()) 238*b1cdbd2cSJim Jagielski m_aSynchronizeTimer.Stop(); 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski DBG_ASSERT(GetNavModel() != NULL, "NavigatorTree::~NavigatorTree : unerwartet : kein ExplorerModel"); 241*b1cdbd2cSJim Jagielski EndListening( *m_pNavModel ); 242*b1cdbd2cSJim Jagielski Clear(); 243*b1cdbd2cSJim Jagielski delete m_pNavModel; 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ Clear()247*b1cdbd2cSJim Jagielski void NavigatorTree::Clear() 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Clear" ); 250*b1cdbd2cSJim Jagielski m_pNavModel->Clear(); 251*b1cdbd2cSJim Jagielski } 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ UpdateContent(FmFormShell * pFormShell)254*b1cdbd2cSJim Jagielski void NavigatorTree::UpdateContent( FmFormShell* pFormShell ) 255*b1cdbd2cSJim Jagielski { 256*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::UpdateContent" ); 257*b1cdbd2cSJim Jagielski if (m_bInitialUpdate) 258*b1cdbd2cSJim Jagielski { 259*b1cdbd2cSJim Jagielski GrabFocus(); 260*b1cdbd2cSJim Jagielski m_bInitialUpdate = sal_False; 261*b1cdbd2cSJim Jagielski } 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski FmFormShell* pOldShell = GetNavModel()->GetFormShell(); 264*b1cdbd2cSJim Jagielski FmFormPage* pOldPage = GetNavModel()->GetFormPage(); 265*b1cdbd2cSJim Jagielski FmFormPage* pNewPage = pFormShell ? pFormShell->GetCurPage() : NULL; 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski if ((pOldShell != pFormShell) || (pOldPage != pNewPage)) 268*b1cdbd2cSJim Jagielski { 269*b1cdbd2cSJim Jagielski // neue Shell, waehrend ich gerade editiere ? 270*b1cdbd2cSJim Jagielski if (IsEditingActive()) 271*b1cdbd2cSJim Jagielski CancelTextEditing(); 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski m_bDragDataDirty = sal_True; // sicherheitshalber, auch wenn ich gar nicht dragge 274*b1cdbd2cSJim Jagielski } 275*b1cdbd2cSJim Jagielski GetNavModel()->UpdateContent( pFormShell ); 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski // wenn es eine Form gibt, die Root expandieren 278*b1cdbd2cSJim Jagielski if (m_pRootEntry && !IsExpanded(m_pRootEntry)) 279*b1cdbd2cSJim Jagielski Expand(m_pRootEntry); 280*b1cdbd2cSJim Jagielski // wenn es GENAU eine Form gibt, auch diese expandieren 281*b1cdbd2cSJim Jagielski if (m_pRootEntry) 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski SvLBoxEntry* pFirst = FirstChild(m_pRootEntry); 284*b1cdbd2cSJim Jagielski if (pFirst && !NextSibling(pFirst)) 285*b1cdbd2cSJim Jagielski Expand(pFirst); 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------ implAllowExchange(sal_Int8 _nAction,sal_Bool * _pHasNonHidden)290*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::implAllowExchange( sal_Int8 _nAction, sal_Bool* _pHasNonHidden ) 291*b1cdbd2cSJim Jagielski { 292*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implAllowExchange" ); 293*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurEntry = GetCurEntry(); 294*b1cdbd2cSJim Jagielski if (!pCurEntry) 295*b1cdbd2cSJim Jagielski return sal_False; 296*b1cdbd2cSJim Jagielski 297*b1cdbd2cSJim Jagielski // die Informationen fuer das AcceptDrop und ExecuteDrop 298*b1cdbd2cSJim Jagielski CollectSelectionData(SDI_ALL); 299*b1cdbd2cSJim Jagielski if (!m_arrCurrentSelection.Count()) 300*b1cdbd2cSJim Jagielski // nothing to do 301*b1cdbd2cSJim Jagielski return sal_False; 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski // testen, ob es sich vielleicht ausschliesslich um hidden controls handelt (dann koennte ich pCtrlExch noch ein 304*b1cdbd2cSJim Jagielski // zusaetzliches Format geben) 305*b1cdbd2cSJim Jagielski sal_Bool bHasNonHidden = sal_False; 306*b1cdbd2cSJim Jagielski for (sal_Int32 i=0; i<m_arrCurrentSelection.Count(); i++) 307*b1cdbd2cSJim Jagielski { 308*b1cdbd2cSJim Jagielski FmEntryData* pCurrent = static_cast< FmEntryData* >( m_arrCurrentSelection[(sal_uInt16)i]->GetUserData() ); 309*b1cdbd2cSJim Jagielski if ( IsHiddenControl( pCurrent ) ) 310*b1cdbd2cSJim Jagielski continue; 311*b1cdbd2cSJim Jagielski bHasNonHidden = sal_True; 312*b1cdbd2cSJim Jagielski break; 313*b1cdbd2cSJim Jagielski } 314*b1cdbd2cSJim Jagielski 315*b1cdbd2cSJim Jagielski if ( bHasNonHidden && ( 0 == ( _nAction & DND_ACTION_MOVE ) ) ) 316*b1cdbd2cSJim Jagielski // non-hidden controls need to be moved 317*b1cdbd2cSJim Jagielski return sal_False; 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski if ( _pHasNonHidden ) 320*b1cdbd2cSJim Jagielski *_pHasNonHidden = bHasNonHidden; 321*b1cdbd2cSJim Jagielski 322*b1cdbd2cSJim Jagielski return sal_True; 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------ implPrepareExchange(sal_Int8 _nAction)326*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::implPrepareExchange( sal_Int8 _nAction ) 327*b1cdbd2cSJim Jagielski { 328*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implPrepareExchange" ); 329*b1cdbd2cSJim Jagielski sal_Int32 i; 330*b1cdbd2cSJim Jagielski 331*b1cdbd2cSJim Jagielski EndSelection(); 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski sal_Bool bHasNonHidden = sal_False; 334*b1cdbd2cSJim Jagielski if ( !implAllowExchange( _nAction, &bHasNonHidden ) ) 335*b1cdbd2cSJim Jagielski return sal_False; 336*b1cdbd2cSJim Jagielski 337*b1cdbd2cSJim Jagielski m_aControlExchange.prepareDrag(); 338*b1cdbd2cSJim Jagielski m_aControlExchange->setFocusEntry( GetCurEntry() ); 339*b1cdbd2cSJim Jagielski 340*b1cdbd2cSJim Jagielski for ( i = 0; i < m_arrCurrentSelection.Count(); ++i ) 341*b1cdbd2cSJim Jagielski m_aControlExchange->addSelectedEntry(m_arrCurrentSelection[(sal_uInt16)i]); 342*b1cdbd2cSJim Jagielski 343*b1cdbd2cSJim Jagielski m_aControlExchange->setFormsRoot( GetNavModel()->GetFormPage()->GetForms() ); 344*b1cdbd2cSJim Jagielski m_aControlExchange->buildPathFormat( this, m_pRootEntry ); 345*b1cdbd2cSJim Jagielski 346*b1cdbd2cSJim Jagielski if (!bHasNonHidden) 347*b1cdbd2cSJim Jagielski { 348*b1cdbd2cSJim Jagielski // eine entsprechende Sequenz aufbauen 349*b1cdbd2cSJim Jagielski Sequence< Reference< XInterface > > seqIFaces(m_arrCurrentSelection.Count()); 350*b1cdbd2cSJim Jagielski Reference< XInterface >* pArray = seqIFaces.getArray(); 351*b1cdbd2cSJim Jagielski for (i=0; i<m_arrCurrentSelection.Count(); ++i, ++pArray) 352*b1cdbd2cSJim Jagielski *pArray = static_cast< FmEntryData* >( m_arrCurrentSelection[(sal_uInt16)i]->GetUserData() )->GetElement(); 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski // und das neue Format 355*b1cdbd2cSJim Jagielski m_aControlExchange->addHiddenControlsFormat(seqIFaces); 356*b1cdbd2cSJim Jagielski } 357*b1cdbd2cSJim Jagielski 358*b1cdbd2cSJim Jagielski m_bDragDataDirty = sal_False; 359*b1cdbd2cSJim Jagielski return sal_True; 360*b1cdbd2cSJim Jagielski } 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------ StartDrag(sal_Int8,const::Point &)363*b1cdbd2cSJim Jagielski void NavigatorTree::StartDrag( sal_Int8 /*nAction*/, const ::Point& /*rPosPixel*/ ) 364*b1cdbd2cSJim Jagielski { 365*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::StartDrag" ); 366*b1cdbd2cSJim Jagielski EndSelection(); 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski if ( !implPrepareExchange( DND_ACTION_COPYMOVE ) ) 369*b1cdbd2cSJim Jagielski // nothing to do or something went wrong 370*b1cdbd2cSJim Jagielski return; 371*b1cdbd2cSJim Jagielski 372*b1cdbd2cSJim Jagielski // jetzt haben wir alle in der aktuelle Situation moeglichen Formate eingesammelt, es kann also losgehen ... 373*b1cdbd2cSJim Jagielski m_aControlExchange.startDrag( DND_ACTION_COPYMOVE ); 374*b1cdbd2cSJim Jagielski } 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------ Command(const CommandEvent & rEvt)377*b1cdbd2cSJim Jagielski void NavigatorTree::Command( const CommandEvent& rEvt ) 378*b1cdbd2cSJim Jagielski { 379*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Command" ); 380*b1cdbd2cSJim Jagielski sal_Bool bHandled = sal_False; 381*b1cdbd2cSJim Jagielski switch( rEvt.GetCommand() ) 382*b1cdbd2cSJim Jagielski { 383*b1cdbd2cSJim Jagielski case COMMAND_CONTEXTMENU: 384*b1cdbd2cSJim Jagielski { 385*b1cdbd2cSJim Jagielski // die Stelle, an der geklickt wurde 386*b1cdbd2cSJim Jagielski ::Point ptWhere; 387*b1cdbd2cSJim Jagielski if (rEvt.IsMouseEvent()) 388*b1cdbd2cSJim Jagielski { 389*b1cdbd2cSJim Jagielski ptWhere = rEvt.GetMousePosPixel(); 390*b1cdbd2cSJim Jagielski SvLBoxEntry* ptClickedOn = GetEntry(ptWhere); 391*b1cdbd2cSJim Jagielski if (ptClickedOn == NULL) 392*b1cdbd2cSJim Jagielski break; 393*b1cdbd2cSJim Jagielski if ( !IsSelected(ptClickedOn) ) 394*b1cdbd2cSJim Jagielski { 395*b1cdbd2cSJim Jagielski SelectAll(sal_False); 396*b1cdbd2cSJim Jagielski Select(ptClickedOn, sal_True); 397*b1cdbd2cSJim Jagielski SetCurEntry(ptClickedOn); 398*b1cdbd2cSJim Jagielski } 399*b1cdbd2cSJim Jagielski } 400*b1cdbd2cSJim Jagielski else 401*b1cdbd2cSJim Jagielski { 402*b1cdbd2cSJim Jagielski if (m_arrCurrentSelection.Count() == 0) // kann nur bei Kontextmenue ueber Tastatur passieren 403*b1cdbd2cSJim Jagielski break; 404*b1cdbd2cSJim Jagielski 405*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurrent = GetCurEntry(); 406*b1cdbd2cSJim Jagielski if (!pCurrent) 407*b1cdbd2cSJim Jagielski break; 408*b1cdbd2cSJim Jagielski ptWhere = GetEntryPosition(pCurrent); 409*b1cdbd2cSJim Jagielski } 410*b1cdbd2cSJim Jagielski 411*b1cdbd2cSJim Jagielski // meine Selektionsdaten auf den aktuellen Stand 412*b1cdbd2cSJim Jagielski CollectSelectionData(SDI_ALL); 413*b1cdbd2cSJim Jagielski 414*b1cdbd2cSJim Jagielski // wenn mindestens ein Nicht-Root-Eintrag selektiert ist und die Root auch, dann nehme ich letztere aus der Selektion 415*b1cdbd2cSJim Jagielski // fix wieder raus 416*b1cdbd2cSJim Jagielski if ( (m_arrCurrentSelection.Count() > 1) && m_bRootSelected ) 417*b1cdbd2cSJim Jagielski { 418*b1cdbd2cSJim Jagielski Select( m_pRootEntry, sal_False ); 419*b1cdbd2cSJim Jagielski SetCursor( m_arrCurrentSelection.GetObject(0), sal_True); 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski sal_Bool bSingleSelection = (m_arrCurrentSelection.Count() == 1); 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski DBG_ASSERT( (m_arrCurrentSelection.Count() > 0) || m_bRootSelected, "keine Eintraege selektiert" ); 425*b1cdbd2cSJim Jagielski // solte nicht passieren, da ich oben bei der IsSelected-Abfrage auf jeden Fall einen selektiert haette, 426*b1cdbd2cSJim Jagielski // wenn das vorher nicht der Fall gewesen waere 427*b1cdbd2cSJim Jagielski 428*b1cdbd2cSJim Jagielski 429*b1cdbd2cSJim Jagielski // das Menue zusammenbasteln 430*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 431*b1cdbd2cSJim Jagielski FmFormModel* pFormModel = pFormShell ? pFormShell->GetFormModel() : NULL; 432*b1cdbd2cSJim Jagielski if( pFormShell && pFormModel ) 433*b1cdbd2cSJim Jagielski { 434*b1cdbd2cSJim Jagielski PopupMenu aContextMenu(SVX_RES(RID_FMEXPLORER_POPUPMENU)); 435*b1cdbd2cSJim Jagielski PopupMenu* pSubMenuNew = aContextMenu.GetPopupMenu( SID_FM_NEW ); 436*b1cdbd2cSJim Jagielski 437*b1cdbd2cSJim Jagielski // das 'Neu'-Untermenue gibt es nur, wenn genau die Root oder genau ein Formular selektiert sind 438*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_NEW, bSingleSelection && (m_nFormsSelected || m_bRootSelected) ); 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski // 'Neu'\'Formular' unter genau den selben Bedingungen 441*b1cdbd2cSJim Jagielski pSubMenuNew->EnableItem( SID_FM_NEW_FORM, bSingleSelection && (m_nFormsSelected || m_bRootSelected) ); 442*b1cdbd2cSJim Jagielski pSubMenuNew->SetItemImage(SID_FM_NEW_FORM, m_aNavigatorImages.GetImage(RID_SVXIMG_FORM)); 443*b1cdbd2cSJim Jagielski pSubMenuNew->SetItemImage(SID_FM_NEW_HIDDEN, m_aNavigatorImages.GetImage(RID_SVXIMG_HIDDEN)); 444*b1cdbd2cSJim Jagielski 445*b1cdbd2cSJim Jagielski // 'Neu'\'verstecktes...', wenn genau ein Formular selektiert ist 446*b1cdbd2cSJim Jagielski pSubMenuNew->EnableItem( SID_FM_NEW_HIDDEN, bSingleSelection && m_nFormsSelected ); 447*b1cdbd2cSJim Jagielski 448*b1cdbd2cSJim Jagielski // 'Delete': everything which is not root can be removed 449*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_DELETE, !m_bRootSelected ); 450*b1cdbd2cSJim Jagielski 451*b1cdbd2cSJim Jagielski // 'Cut', 'Copy' and 'Paste' 452*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_CUT, !m_bRootSelected && implAllowExchange( DND_ACTION_MOVE ) ); 453*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_COPY, !m_bRootSelected && implAllowExchange( DND_ACTION_COPY ) ); 454*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_PASTE, implAcceptPaste( ) ); 455*b1cdbd2cSJim Jagielski 456*b1cdbd2cSJim Jagielski // der TabDialog, wenn es genau ein Formular ist ... 457*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_TAB_DIALOG, bSingleSelection && m_nFormsSelected ); 458*b1cdbd2cSJim Jagielski 459*b1cdbd2cSJim Jagielski // in XML forms, we don't allow for the properties of a form 460*b1cdbd2cSJim Jagielski // #i36484# / 2004-11-04 /- fs@openoffice.org 461*b1cdbd2cSJim Jagielski if ( pFormShell->GetImpl()->isEnhancedForm() && !m_nControlsSelected ) 462*b1cdbd2cSJim Jagielski aContextMenu.RemoveItem( aContextMenu.GetItemPos( SID_FM_SHOW_PROPERTY_BROWSER ) ); 463*b1cdbd2cSJim Jagielski 464*b1cdbd2cSJim Jagielski // if the property browser is already open, we don't allow for the properties, too 465*b1cdbd2cSJim Jagielski if( pFormShell->GetImpl()->IsPropBrwOpen() ) 466*b1cdbd2cSJim Jagielski aContextMenu.RemoveItem( aContextMenu.GetItemPos( SID_FM_SHOW_PROPERTY_BROWSER ) ); 467*b1cdbd2cSJim Jagielski // and finally, if there's a mixed selection of forms and controls, disable the entry, too 468*b1cdbd2cSJim Jagielski else 469*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_SHOW_PROPERTY_BROWSER, 470*b1cdbd2cSJim Jagielski (m_nControlsSelected && !m_nFormsSelected) || (!m_nControlsSelected && m_nFormsSelected) ); 471*b1cdbd2cSJim Jagielski 472*b1cdbd2cSJim Jagielski // Umbenennen gdw wenn ein Element und nicht die Root 473*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_RENAME_OBJECT, bSingleSelection && !m_bRootSelected ); 474*b1cdbd2cSJim Jagielski 475*b1cdbd2cSJim Jagielski // der Reandonly-Eintrag ist nur auf der Root erlaubt 476*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_OPEN_READONLY, m_bRootSelected ); 477*b1cdbd2cSJim Jagielski // the same for automatic control focus 478*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_AUTOCONTROLFOCUS, m_bRootSelected ); 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski // die ConvertTo-Slots sind enabled, wenn genau ein Control selektiert ist, der 481*b1cdbd2cSJim Jagielski // dem Control entsprechende Slot ist disabled 482*b1cdbd2cSJim Jagielski if (!m_bRootSelected && !m_nFormsSelected && (m_nControlsSelected == 1)) 483*b1cdbd2cSJim Jagielski { 484*b1cdbd2cSJim Jagielski aContextMenu.SetPopupMenu( SID_FM_CHANGECONTROLTYPE, FmXFormShell::GetConversionMenu() ); 485*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 486*b1cdbd2cSJim Jagielski FmControlData* pCurrent = (FmControlData*)(m_arrCurrentSelection[0]->GetUserData()); 487*b1cdbd2cSJim Jagielski OSL_ENSURE( pFormShell->GetImpl()->isSolelySelected( pCurrent->GetFormComponent() ), 488*b1cdbd2cSJim Jagielski "NavigatorTree::Command: inconsistency between the navigator selection, and the selection as the shell knows it!" ); 489*b1cdbd2cSJim Jagielski #endif 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->checkControlConversionSlotsForCurrentSelection( *aContextMenu.GetPopupMenu( SID_FM_CHANGECONTROLTYPE ) ); 492*b1cdbd2cSJim Jagielski } 493*b1cdbd2cSJim Jagielski else 494*b1cdbd2cSJim Jagielski aContextMenu.EnableItem( SID_FM_CHANGECONTROLTYPE, sal_False ); 495*b1cdbd2cSJim Jagielski 496*b1cdbd2cSJim Jagielski // jetzt alles, was disabled wurde, wech 497*b1cdbd2cSJim Jagielski aContextMenu.RemoveDisabledEntries(sal_True, sal_True); 498*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////// 499*b1cdbd2cSJim Jagielski // OpenReadOnly setzen 500*b1cdbd2cSJim Jagielski 501*b1cdbd2cSJim Jagielski aContextMenu.CheckItem( SID_FM_OPEN_READONLY, pFormModel->GetOpenInDesignMode() ); 502*b1cdbd2cSJim Jagielski aContextMenu.CheckItem( SID_FM_AUTOCONTROLFOCUS, pFormModel->GetAutoControlFocus() ); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski sal_uInt16 nSlotId = aContextMenu.Execute( this, ptWhere ); 505*b1cdbd2cSJim Jagielski switch( nSlotId ) 506*b1cdbd2cSJim Jagielski { 507*b1cdbd2cSJim Jagielski case SID_FM_NEW_FORM: 508*b1cdbd2cSJim Jagielski { 509*b1cdbd2cSJim Jagielski XubString aStr(SVX_RES(RID_STR_FORM)); 510*b1cdbd2cSJim Jagielski XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT)); 511*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplace('#', aStr); 512*b1cdbd2cSJim Jagielski 513*b1cdbd2cSJim Jagielski pFormModel->BegUndo(aUndoStr); 514*b1cdbd2cSJim Jagielski // der Slot war nur verfuegbar, wenn es genau einen selektierten Eintrag gibt und dieser die Root 515*b1cdbd2cSJim Jagielski // oder ein Formular ist 516*b1cdbd2cSJim Jagielski NewForm( m_arrCurrentSelection.GetObject(0) ); 517*b1cdbd2cSJim Jagielski pFormModel->EndUndo(); 518*b1cdbd2cSJim Jagielski 519*b1cdbd2cSJim Jagielski } break; 520*b1cdbd2cSJim Jagielski case SID_FM_NEW_HIDDEN: 521*b1cdbd2cSJim Jagielski { 522*b1cdbd2cSJim Jagielski XubString aStr(SVX_RES(RID_STR_CONTROL)); 523*b1cdbd2cSJim Jagielski XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT)); 524*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplace('#', aStr); 525*b1cdbd2cSJim Jagielski 526*b1cdbd2cSJim Jagielski pFormModel->BegUndo(aUndoStr); 527*b1cdbd2cSJim Jagielski // dieser Slot war guletig bei (genau) einem selektierten Formular 528*b1cdbd2cSJim Jagielski rtl::OUString fControlName = FM_COMPONENT_HIDDEN; 529*b1cdbd2cSJim Jagielski NewControl( fControlName, m_arrCurrentSelection.GetObject(0) ); 530*b1cdbd2cSJim Jagielski pFormModel->EndUndo(); 531*b1cdbd2cSJim Jagielski 532*b1cdbd2cSJim Jagielski } break; 533*b1cdbd2cSJim Jagielski 534*b1cdbd2cSJim Jagielski case SID_CUT: 535*b1cdbd2cSJim Jagielski doCut(); 536*b1cdbd2cSJim Jagielski break; 537*b1cdbd2cSJim Jagielski 538*b1cdbd2cSJim Jagielski case SID_COPY: 539*b1cdbd2cSJim Jagielski doCopy(); 540*b1cdbd2cSJim Jagielski break; 541*b1cdbd2cSJim Jagielski 542*b1cdbd2cSJim Jagielski case SID_PASTE: 543*b1cdbd2cSJim Jagielski doPaste(); 544*b1cdbd2cSJim Jagielski break; 545*b1cdbd2cSJim Jagielski 546*b1cdbd2cSJim Jagielski case SID_FM_DELETE: 547*b1cdbd2cSJim Jagielski { 548*b1cdbd2cSJim Jagielski DeleteSelection(); 549*b1cdbd2cSJim Jagielski } 550*b1cdbd2cSJim Jagielski break; 551*b1cdbd2cSJim Jagielski case SID_FM_TAB_DIALOG: 552*b1cdbd2cSJim Jagielski { 553*b1cdbd2cSJim Jagielski // dieser Slot galt bei genau einem selektierten Formular 554*b1cdbd2cSJim Jagielski SvLBoxEntry* pSelectedForm = m_arrCurrentSelection.GetObject(0); 555*b1cdbd2cSJim Jagielski DBG_ASSERT( IsFormEntry(pSelectedForm), "NavigatorTree::Command: Dieser Eintrag muss ein FormEntry sein." ); 556*b1cdbd2cSJim Jagielski 557*b1cdbd2cSJim Jagielski FmFormData* pFormData = (FmFormData*)pSelectedForm->GetUserData(); 558*b1cdbd2cSJim Jagielski Reference< XForm > xForm( pFormData->GetFormIface()); 559*b1cdbd2cSJim Jagielski 560*b1cdbd2cSJim Jagielski Reference< XTabControllerModel > xTabController(xForm, UNO_QUERY); 561*b1cdbd2cSJim Jagielski if( !xTabController.is() ) 562*b1cdbd2cSJim Jagielski break; 563*b1cdbd2cSJim Jagielski GetNavModel()->GetFormShell()->GetImpl()->ExecuteTabOrderDialog( xTabController ); 564*b1cdbd2cSJim Jagielski } 565*b1cdbd2cSJim Jagielski break; 566*b1cdbd2cSJim Jagielski 567*b1cdbd2cSJim Jagielski case SID_FM_SHOW_PROPERTY_BROWSER: 568*b1cdbd2cSJim Jagielski { 569*b1cdbd2cSJim Jagielski ShowSelectionProperties(sal_True); 570*b1cdbd2cSJim Jagielski } 571*b1cdbd2cSJim Jagielski break; 572*b1cdbd2cSJim Jagielski case SID_FM_RENAME_OBJECT: 573*b1cdbd2cSJim Jagielski { 574*b1cdbd2cSJim Jagielski // das war bei genau einem Nicht-Root-Eintrag erlaubt 575*b1cdbd2cSJim Jagielski EditEntry( m_arrCurrentSelection.GetObject(0) ); 576*b1cdbd2cSJim Jagielski } 577*b1cdbd2cSJim Jagielski break; 578*b1cdbd2cSJim Jagielski case SID_FM_OPEN_READONLY: 579*b1cdbd2cSJim Jagielski { 580*b1cdbd2cSJim Jagielski pFormModel->SetOpenInDesignMode( !pFormModel->GetOpenInDesignMode() ); 581*b1cdbd2cSJim Jagielski pFormShell->GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_OPEN_READONLY); 582*b1cdbd2cSJim Jagielski } 583*b1cdbd2cSJim Jagielski break; 584*b1cdbd2cSJim Jagielski case SID_FM_AUTOCONTROLFOCUS: 585*b1cdbd2cSJim Jagielski { 586*b1cdbd2cSJim Jagielski pFormModel->SetAutoControlFocus( !pFormModel->GetAutoControlFocus() ); 587*b1cdbd2cSJim Jagielski pFormShell->GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_AUTOCONTROLFOCUS); 588*b1cdbd2cSJim Jagielski } 589*b1cdbd2cSJim Jagielski break; 590*b1cdbd2cSJim Jagielski default: 591*b1cdbd2cSJim Jagielski if (pFormShell->GetImpl()->isControlConversionSlot(nSlotId)) 592*b1cdbd2cSJim Jagielski { 593*b1cdbd2cSJim Jagielski FmControlData* pCurrent = (FmControlData*)(m_arrCurrentSelection[0]->GetUserData()); 594*b1cdbd2cSJim Jagielski if ( pFormShell->GetImpl()->executeControlConversionSlot( pCurrent->GetFormComponent(), nSlotId ) ) 595*b1cdbd2cSJim Jagielski ShowSelectionProperties(); 596*b1cdbd2cSJim Jagielski } 597*b1cdbd2cSJim Jagielski } 598*b1cdbd2cSJim Jagielski } 599*b1cdbd2cSJim Jagielski bHandled = sal_True; 600*b1cdbd2cSJim Jagielski } break; 601*b1cdbd2cSJim Jagielski } 602*b1cdbd2cSJim Jagielski 603*b1cdbd2cSJim Jagielski if (!bHandled) 604*b1cdbd2cSJim Jagielski SvTreeListBox::Command( rEvt ); 605*b1cdbd2cSJim Jagielski } 606*b1cdbd2cSJim Jagielski 607*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IsDeleteAllowed()608*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::IsDeleteAllowed() 609*b1cdbd2cSJim Jagielski { 610*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::IsDeleteAllowed" ); 611*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 612*b1cdbd2cSJim Jagielski // Haben wir eine Form... 613*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurEntry = GetCurEntry(); 614*b1cdbd2cSJim Jagielski sal_uInt32 nCurEntryPos = GetModel()->GetAbsPos( pCurEntry ); 615*b1cdbd2cSJim Jagielski 616*b1cdbd2cSJim Jagielski if( nCurEntryPos==0 ) // Root kann nicht geloescht werden 617*b1cdbd2cSJim Jagielski return sal_False; 618*b1cdbd2cSJim Jagielski else 619*b1cdbd2cSJim Jagielski return IsFormEntry(pCurEntry) || IsFormComponentEntry(pCurEntry); 620*b1cdbd2cSJim Jagielski } 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ FindEntry(FmEntryData * pEntryData)623*b1cdbd2cSJim Jagielski SvLBoxEntry* NavigatorTree::FindEntry( FmEntryData* pEntryData ) 624*b1cdbd2cSJim Jagielski { 625*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::FindEntry" ); 626*b1cdbd2cSJim Jagielski if( !pEntryData ) return NULL; 627*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurEntry = First(); 628*b1cdbd2cSJim Jagielski FmEntryData* pCurEntryData; 629*b1cdbd2cSJim Jagielski while( pCurEntry ) 630*b1cdbd2cSJim Jagielski { 631*b1cdbd2cSJim Jagielski pCurEntryData = (FmEntryData*)pCurEntry->GetUserData(); 632*b1cdbd2cSJim Jagielski if( pCurEntryData && pCurEntryData->IsEqualWithoutChilds(pEntryData) ) 633*b1cdbd2cSJim Jagielski return pCurEntry; 634*b1cdbd2cSJim Jagielski 635*b1cdbd2cSJim Jagielski pCurEntry = Next( pCurEntry ); 636*b1cdbd2cSJim Jagielski } 637*b1cdbd2cSJim Jagielski 638*b1cdbd2cSJim Jagielski return NULL; 639*b1cdbd2cSJim Jagielski } 640*b1cdbd2cSJim Jagielski 641*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ Notify(SfxBroadcaster &,const SfxHint & rHint)642*b1cdbd2cSJim Jagielski void NavigatorTree::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) 643*b1cdbd2cSJim Jagielski { 644*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Notify" ); 645*b1cdbd2cSJim Jagielski if( rHint.ISA(FmNavRemovedHint) ) 646*b1cdbd2cSJim Jagielski { 647*b1cdbd2cSJim Jagielski FmNavRemovedHint* pRemovedHint = (FmNavRemovedHint*)&rHint; 648*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = pRemovedHint->GetEntryData(); 649*b1cdbd2cSJim Jagielski Remove( pEntryData ); 650*b1cdbd2cSJim Jagielski } 651*b1cdbd2cSJim Jagielski 652*b1cdbd2cSJim Jagielski else if( rHint.ISA(FmNavInsertedHint) ) 653*b1cdbd2cSJim Jagielski { 654*b1cdbd2cSJim Jagielski FmNavInsertedHint* pInsertedHint = (FmNavInsertedHint*)&rHint; 655*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = pInsertedHint->GetEntryData(); 656*b1cdbd2cSJim Jagielski sal_uInt32 nRelPos = pInsertedHint->GetRelPos(); 657*b1cdbd2cSJim Jagielski Insert( pEntryData, nRelPos ); 658*b1cdbd2cSJim Jagielski } 659*b1cdbd2cSJim Jagielski 660*b1cdbd2cSJim Jagielski else if( rHint.ISA(FmNavModelReplacedHint) ) 661*b1cdbd2cSJim Jagielski { 662*b1cdbd2cSJim Jagielski FmEntryData* pData = ((FmNavModelReplacedHint*)&rHint)->GetEntryData(); 663*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = FindEntry( pData ); 664*b1cdbd2cSJim Jagielski if (pEntry) 665*b1cdbd2cSJim Jagielski { // das Image neu setzen 666*b1cdbd2cSJim Jagielski SetCollapsedEntryBmp( pEntry, pData->GetNormalImage(), BMP_COLOR_NORMAL ); 667*b1cdbd2cSJim Jagielski SetExpandedEntryBmp( pEntry, pData->GetNormalImage(), BMP_COLOR_NORMAL ); 668*b1cdbd2cSJim Jagielski 669*b1cdbd2cSJim Jagielski SetCollapsedEntryBmp( pEntry, pData->GetHCImage(), BMP_COLOR_HIGHCONTRAST ); 670*b1cdbd2cSJim Jagielski SetExpandedEntryBmp( pEntry, pData->GetHCImage(), BMP_COLOR_HIGHCONTRAST ); 671*b1cdbd2cSJim Jagielski } 672*b1cdbd2cSJim Jagielski } 673*b1cdbd2cSJim Jagielski 674*b1cdbd2cSJim Jagielski else if( rHint.ISA(FmNavNameChangedHint) ) 675*b1cdbd2cSJim Jagielski { 676*b1cdbd2cSJim Jagielski FmNavNameChangedHint* pNameChangedHint = (FmNavNameChangedHint*)&rHint; 677*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = FindEntry( pNameChangedHint->GetEntryData() ); 678*b1cdbd2cSJim Jagielski SetEntryText( pEntry, pNameChangedHint->GetNewName() ); 679*b1cdbd2cSJim Jagielski } 680*b1cdbd2cSJim Jagielski 681*b1cdbd2cSJim Jagielski else if( rHint.ISA(FmNavClearedHint) ) 682*b1cdbd2cSJim Jagielski { 683*b1cdbd2cSJim Jagielski SvTreeListBox::Clear(); 684*b1cdbd2cSJim Jagielski 685*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 686*b1cdbd2cSJim Jagielski // Default-Eintrag "Formulare" 687*b1cdbd2cSJim Jagielski Image aRootImage( m_aNavigatorImages.GetImage( RID_SVXIMG_FORMS ) ); 688*b1cdbd2cSJim Jagielski m_pRootEntry = InsertEntry( SVX_RES(RID_STR_FORMS), aRootImage, aRootImage, 689*b1cdbd2cSJim Jagielski NULL, sal_False, 0, NULL ); 690*b1cdbd2cSJim Jagielski 691*b1cdbd2cSJim Jagielski if ( m_pRootEntry ) 692*b1cdbd2cSJim Jagielski { 693*b1cdbd2cSJim Jagielski Image aHCRootImage( m_aNavigatorImagesHC.GetImage( RID_SVXIMG_FORMS ) ); 694*b1cdbd2cSJim Jagielski SetExpandedEntryBmp( m_pRootEntry, aHCRootImage, BMP_COLOR_HIGHCONTRAST ); 695*b1cdbd2cSJim Jagielski SetCollapsedEntryBmp( m_pRootEntry, aHCRootImage, BMP_COLOR_HIGHCONTRAST ); 696*b1cdbd2cSJim Jagielski } 697*b1cdbd2cSJim Jagielski } 698*b1cdbd2cSJim Jagielski else if (!m_bMarkingObjects && rHint.ISA(FmNavRequestSelectHint)) 699*b1cdbd2cSJim Jagielski { // wenn m_bMarkingObjects sal_True ist, markiere ich gerade selber Objekte, und da der ganze Mechanismus dahinter synchron ist, 700*b1cdbd2cSJim Jagielski // ist das genau der Hint, der durch mein Markieren ausgeloest wird, also kann ich ihn ignorieren 701*b1cdbd2cSJim Jagielski FmNavRequestSelectHint* pershHint = (FmNavRequestSelectHint*)&rHint; 702*b1cdbd2cSJim Jagielski FmEntryDataArray& arredToSelect = pershHint->GetItems(); 703*b1cdbd2cSJim Jagielski SynchronizeSelection(arredToSelect); 704*b1cdbd2cSJim Jagielski 705*b1cdbd2cSJim Jagielski if (pershHint->IsMixedSelection()) 706*b1cdbd2cSJim Jagielski // in diesem Fall habe ich alles deselektiert, obwohl die View u.U. eine gemischte Markierung hatte 707*b1cdbd2cSJim Jagielski // ich muss also im naechsten Select den Navigator an die View anpassen 708*b1cdbd2cSJim Jagielski m_bPrevSelectionMixed = sal_True; 709*b1cdbd2cSJim Jagielski } 710*b1cdbd2cSJim Jagielski } 711*b1cdbd2cSJim Jagielski 712*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ Insert(FmEntryData * pEntryData,sal_uIntPtr nRelPos)713*b1cdbd2cSJim Jagielski SvLBoxEntry* NavigatorTree::Insert( FmEntryData* pEntryData, sal_uIntPtr nRelPos ) 714*b1cdbd2cSJim Jagielski { 715*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Insert" ); 716*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 717*b1cdbd2cSJim Jagielski // Aktuellen Eintrag einfuegen 718*b1cdbd2cSJim Jagielski SvLBoxEntry* pParentEntry = FindEntry( pEntryData->GetParent() ); 719*b1cdbd2cSJim Jagielski SvLBoxEntry* pNewEntry; 720*b1cdbd2cSJim Jagielski 721*b1cdbd2cSJim Jagielski if( !pParentEntry ) 722*b1cdbd2cSJim Jagielski pNewEntry = InsertEntry( pEntryData->GetText(), 723*b1cdbd2cSJim Jagielski pEntryData->GetNormalImage(), pEntryData->GetNormalImage(), 724*b1cdbd2cSJim Jagielski m_pRootEntry, sal_False, nRelPos, pEntryData ); 725*b1cdbd2cSJim Jagielski 726*b1cdbd2cSJim Jagielski else 727*b1cdbd2cSJim Jagielski pNewEntry = InsertEntry( pEntryData->GetText(), 728*b1cdbd2cSJim Jagielski pEntryData->GetNormalImage(), pEntryData->GetNormalImage(), 729*b1cdbd2cSJim Jagielski pParentEntry, sal_False, nRelPos, pEntryData ); 730*b1cdbd2cSJim Jagielski 731*b1cdbd2cSJim Jagielski if ( pNewEntry ) 732*b1cdbd2cSJim Jagielski { 733*b1cdbd2cSJim Jagielski SetExpandedEntryBmp( pNewEntry, pEntryData->GetHCImage(), BMP_COLOR_HIGHCONTRAST ); 734*b1cdbd2cSJim Jagielski SetCollapsedEntryBmp( pNewEntry, pEntryData->GetHCImage(), BMP_COLOR_HIGHCONTRAST ); 735*b1cdbd2cSJim Jagielski } 736*b1cdbd2cSJim Jagielski 737*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 738*b1cdbd2cSJim Jagielski // Wenn Root-Eintrag Root expandieren 739*b1cdbd2cSJim Jagielski if( !pParentEntry ) 740*b1cdbd2cSJim Jagielski Expand( m_pRootEntry ); 741*b1cdbd2cSJim Jagielski 742*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 743*b1cdbd2cSJim Jagielski // Childs einfuegen 744*b1cdbd2cSJim Jagielski FmEntryDataList* pChildList = pEntryData->GetChildList(); 745*b1cdbd2cSJim Jagielski sal_uInt32 nChildCount = pChildList->Count(); 746*b1cdbd2cSJim Jagielski FmEntryData* pChildData; 747*b1cdbd2cSJim Jagielski for( sal_uInt32 i=0; i<nChildCount; i++ ) 748*b1cdbd2cSJim Jagielski { 749*b1cdbd2cSJim Jagielski pChildData = pChildList->GetObject(i); 750*b1cdbd2cSJim Jagielski Insert( pChildData, LIST_APPEND ); 751*b1cdbd2cSJim Jagielski } 752*b1cdbd2cSJim Jagielski 753*b1cdbd2cSJim Jagielski return pNewEntry; 754*b1cdbd2cSJim Jagielski } 755*b1cdbd2cSJim Jagielski 756*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ Remove(FmEntryData * pEntryData)757*b1cdbd2cSJim Jagielski void NavigatorTree::Remove( FmEntryData* pEntryData ) 758*b1cdbd2cSJim Jagielski { 759*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Remove" ); 760*b1cdbd2cSJim Jagielski if( !pEntryData ) 761*b1cdbd2cSJim Jagielski return; 762*b1cdbd2cSJim Jagielski 763*b1cdbd2cSJim Jagielski // der Entry zu den Daten 764*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = FindEntry( pEntryData ); 765*b1cdbd2cSJim Jagielski if (!pEntry) 766*b1cdbd2cSJim Jagielski return; 767*b1cdbd2cSJim Jagielski 768*b1cdbd2cSJim Jagielski // Eintrag aus TreeListBox entfernen 769*b1cdbd2cSJim Jagielski // ich darf das Select, das ich ausloese, nicht behandeln : 770*b1cdbd2cSJim Jagielski // Select aendert die MarkList der View, wenn das gerade auch jemand anders macht und dabei ein Remove 771*b1cdbd2cSJim Jagielski // triggert, haben wir mit ziemlicher Sicherheit ein Problem - Paradebeispiel war das Gruppieren von Controls mit 772*b1cdbd2cSJim Jagielski // offenem Navigator ...) 773*b1cdbd2cSJim Jagielski LockSelectionHandling(); 774*b1cdbd2cSJim Jagielski 775*b1cdbd2cSJim Jagielski // ein kleines Problem : ich merke mir meine selektierten Daten, wenn mir jetzt jemand einen selektierten Eintrag 776*b1cdbd2cSJim Jagielski // unter dem Hintern wegschiesst, werde ich inkonsistent ... was schlecht waere 777*b1cdbd2cSJim Jagielski Select(pEntry, sal_False); 778*b1cdbd2cSJim Jagielski 779*b1cdbd2cSJim Jagielski // beim eigentlichen Entfernen kann die Selection geaendert werden, da ich aber das SelectionHandling abgeschaltet 780*b1cdbd2cSJim Jagielski // habe, muss ich mich hinterher darum kuemmern 781*b1cdbd2cSJim Jagielski sal_uIntPtr nExpectedSelectionCount = GetSelectionCount(); 782*b1cdbd2cSJim Jagielski 783*b1cdbd2cSJim Jagielski if( pEntry ) 784*b1cdbd2cSJim Jagielski GetModel()->Remove( pEntry ); 785*b1cdbd2cSJim Jagielski 786*b1cdbd2cSJim Jagielski if (nExpectedSelectionCount != GetSelectionCount()) 787*b1cdbd2cSJim Jagielski SynchronizeSelection(); 788*b1cdbd2cSJim Jagielski 789*b1cdbd2cSJim Jagielski // und standardmaessig behandle ich das Select natuerlich 790*b1cdbd2cSJim Jagielski UnlockSelectionHandling(); 791*b1cdbd2cSJim Jagielski } 792*b1cdbd2cSJim Jagielski 793*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IsFormEntry(SvLBoxEntry * pEntry)794*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::IsFormEntry( SvLBoxEntry* pEntry ) 795*b1cdbd2cSJim Jagielski { 796*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::IsFormEntry" ); 797*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = (FmEntryData*)pEntry->GetUserData(); 798*b1cdbd2cSJim Jagielski return !pEntryData || pEntryData->ISA(FmFormData); 799*b1cdbd2cSJim Jagielski } 800*b1cdbd2cSJim Jagielski 801*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IsFormComponentEntry(SvLBoxEntry * pEntry)802*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::IsFormComponentEntry( SvLBoxEntry* pEntry ) 803*b1cdbd2cSJim Jagielski { 804*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::IsFormComponentEntry" ); 805*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = (FmEntryData*)pEntry->GetUserData(); 806*b1cdbd2cSJim Jagielski return pEntryData && pEntryData->ISA(FmControlData); 807*b1cdbd2cSJim Jagielski } 808*b1cdbd2cSJim Jagielski 809*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ implAcceptPaste()810*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::implAcceptPaste( ) 811*b1cdbd2cSJim Jagielski { 812*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implAcceptPaste" ); 813*b1cdbd2cSJim Jagielski SvLBoxEntry* pFirstSelected = FirstSelected(); 814*b1cdbd2cSJim Jagielski if ( !pFirstSelected || NextSelected( pFirstSelected ) ) 815*b1cdbd2cSJim Jagielski // no selected entry, or at least two selected entries 816*b1cdbd2cSJim Jagielski return sal_False; 817*b1cdbd2cSJim Jagielski 818*b1cdbd2cSJim Jagielski // get the clipboard 819*b1cdbd2cSJim Jagielski TransferableDataHelper aClipboardContent( TransferableDataHelper::CreateFromSystemClipboard( this ) ); 820*b1cdbd2cSJim Jagielski 821*b1cdbd2cSJim Jagielski sal_Int8 nAction = m_aControlExchange.isClipboardOwner() && doingKeyboardCut( ) ? DND_ACTION_MOVE : DND_ACTION_COPY; 822*b1cdbd2cSJim Jagielski return ( nAction == implAcceptDataTransfer( aClipboardContent.GetDataFlavorExVector(), nAction, pFirstSelected, sal_False ) ); 823*b1cdbd2cSJim Jagielski } 824*b1cdbd2cSJim Jagielski 825*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ implAcceptDataTransfer(const DataFlavorExVector & _rFlavors,sal_Int8 _nAction,const::Point & _rDropPos,sal_Bool _bDnD)826*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::implAcceptDataTransfer( const DataFlavorExVector& _rFlavors, sal_Int8 _nAction, const ::Point& _rDropPos, sal_Bool _bDnD ) 827*b1cdbd2cSJim Jagielski { 828*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implAcceptDataTransfer" ); 829*b1cdbd2cSJim Jagielski return implAcceptDataTransfer( _rFlavors, _nAction, GetEntry( _rDropPos ), _bDnD ); 830*b1cdbd2cSJim Jagielski } 831*b1cdbd2cSJim Jagielski 832*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ implAcceptDataTransfer(const DataFlavorExVector & _rFlavors,sal_Int8 _nAction,SvLBoxEntry * _pTargetEntry,sal_Bool _bDnD)833*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::implAcceptDataTransfer( const DataFlavorExVector& _rFlavors, sal_Int8 _nAction, SvLBoxEntry* _pTargetEntry, sal_Bool _bDnD ) 834*b1cdbd2cSJim Jagielski { 835*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implAcceptDataTransfer" ); 836*b1cdbd2cSJim Jagielski // no target -> no drop 837*b1cdbd2cSJim Jagielski if (!_pTargetEntry) 838*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 839*b1cdbd2cSJim Jagielski 840*b1cdbd2cSJim Jagielski // format check 841*b1cdbd2cSJim Jagielski sal_Bool bHasDefControlFormat = OControlExchange::hasFieldExchangeFormat( _rFlavors ); 842*b1cdbd2cSJim Jagielski sal_Bool bHasControlPathFormat = OControlExchange::hasControlPathFormat( _rFlavors ); 843*b1cdbd2cSJim Jagielski sal_Bool bHasHiddenControlsFormat = OControlExchange::hasHiddenControlModelsFormat( _rFlavors ); 844*b1cdbd2cSJim Jagielski if (!bHasDefControlFormat && !bHasControlPathFormat && !bHasHiddenControlsFormat) 845*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 846*b1cdbd2cSJim Jagielski 847*b1cdbd2cSJim Jagielski sal_Bool bSelfSource = _bDnD ? m_aControlExchange.isDragSource() : m_aControlExchange.isClipboardOwner(); 848*b1cdbd2cSJim Jagielski 849*b1cdbd2cSJim Jagielski if ( bHasHiddenControlsFormat ) 850*b1cdbd2cSJim Jagielski { // bHasHiddenControlsFormat means that only hidden controls are part of the data 851*b1cdbd2cSJim Jagielski 852*b1cdbd2cSJim Jagielski // hidden controls can be copied to a form only 853*b1cdbd2cSJim Jagielski if ( !_pTargetEntry || ( _pTargetEntry == m_pRootEntry ) || !IsFormEntry( _pTargetEntry ) ) 854*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 855*b1cdbd2cSJim Jagielski 856*b1cdbd2cSJim Jagielski return bSelfSource ? ( DND_ACTION_COPYMOVE & _nAction ) : DND_ACTION_COPY; 857*b1cdbd2cSJim Jagielski } 858*b1cdbd2cSJim Jagielski 859*b1cdbd2cSJim Jagielski if ( !bSelfSource ) 860*b1cdbd2cSJim Jagielski { 861*b1cdbd2cSJim Jagielski // DnD or CnP crossing navigator boundaries 862*b1cdbd2cSJim Jagielski // The main problem here is that the current API does not allow us to sneak into the content which 863*b1cdbd2cSJim Jagielski // is to be inserted. So we have to allow it for the moment, but maybe reject later on (in the real drop). 864*b1cdbd2cSJim Jagielski 865*b1cdbd2cSJim Jagielski // TODO: this smart behaviour later on ... at the moment, we disallow data transfer crossing navigator 866*b1cdbd2cSJim Jagielski // boundaries. 867*b1cdbd2cSJim Jagielski 868*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 869*b1cdbd2cSJim Jagielski } 870*b1cdbd2cSJim Jagielski 871*b1cdbd2cSJim Jagielski DBG_ASSERT( _bDnD ? m_aControlExchange.isDragSource() : m_aControlExchange.isClipboardOwner(), 872*b1cdbd2cSJim Jagielski "NavigatorTree::implAcceptDataTransfer: here only with source=dest!" ); 873*b1cdbd2cSJim Jagielski // somebody changed the logic of this method ... 874*b1cdbd2cSJim Jagielski 875*b1cdbd2cSJim Jagielski // from here on, I can work with m_aControlExchange instead of _rData! 876*b1cdbd2cSJim Jagielski 877*b1cdbd2cSJim Jagielski sal_Bool bForeignCollection = m_aControlExchange->getFormsRoot().get() != GetNavModel()->GetFormPage()->GetForms().get(); 878*b1cdbd2cSJim Jagielski if ( bForeignCollection ) 879*b1cdbd2cSJim Jagielski { 880*b1cdbd2cSJim Jagielski // crossing shell/page boundaries, we can exchange hidden controls only 881*b1cdbd2cSJim Jagielski // But if we survived the checks above, we do not have hidden controls. 882*b1cdbd2cSJim Jagielski // -> no data transfer 883*b1cdbd2cSJim Jagielski DBG_ASSERT( !bHasHiddenControlsFormat, "NavigatorTree::implAcceptDataTransfer: still hidden controls format!" ); 884*b1cdbd2cSJim Jagielski // somebody changed the logic of this method ... 885*b1cdbd2cSJim Jagielski 886*b1cdbd2cSJim Jagielski return DND_ACTION_COPY; 887*b1cdbd2cSJim Jagielski } 888*b1cdbd2cSJim Jagielski 889*b1cdbd2cSJim Jagielski if (DND_ACTION_MOVE != _nAction) // 'normal' controls within a shell are moved only (never copied) 890*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 891*b1cdbd2cSJim Jagielski 892*b1cdbd2cSJim Jagielski if ( m_bDragDataDirty || !bHasDefControlFormat ) 893*b1cdbd2cSJim Jagielski { 894*b1cdbd2cSJim Jagielski if (!bHasControlPathFormat) 895*b1cdbd2cSJim Jagielski // ich befinde mich zwar in der Shell/Page, aus der die Controls stammen, habe aber kein Format, das den stattgefundenen 896*b1cdbd2cSJim Jagielski // Shell-Wechsel ueberlebt hat (SVX_FM_CONTROLS_AS_PATH) 897*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 898*b1cdbd2cSJim Jagielski 899*b1cdbd2cSJim Jagielski // da die Shell waehrend des Draggens umgeschaltet wude, muss ich die Liste des ExchangeObjektes wieder neu aufbauen 900*b1cdbd2cSJim Jagielski // (dort stehen SvLBoxEntries drin, und die sind bei der Umschaltung floeten gegangen) 901*b1cdbd2cSJim Jagielski m_aControlExchange->buildListFromPath(this, m_pRootEntry); 902*b1cdbd2cSJim Jagielski m_bDragDataDirty = sal_False; 903*b1cdbd2cSJim Jagielski } 904*b1cdbd2cSJim Jagielski 905*b1cdbd2cSJim Jagielski // die Liste der gedroppten Eintraege aus dem DragServer 906*b1cdbd2cSJim Jagielski const ListBoxEntrySet& aDropped = m_aControlExchange->selected(); 907*b1cdbd2cSJim Jagielski DBG_ASSERT(aDropped.size() >= 1, "NavigatorTree::implAcceptDataTransfer: keine Eintraege !"); 908*b1cdbd2cSJim Jagielski 909*b1cdbd2cSJim Jagielski sal_Bool bDropTargetIsComponent = IsFormComponentEntry( _pTargetEntry ); 910*b1cdbd2cSJim Jagielski //SvLBoxEntry* pDropTargetParent = GetParent( _pTargetEntry ); 911*b1cdbd2cSJim Jagielski 912*b1cdbd2cSJim Jagielski // conditions to disallow the drop 913*b1cdbd2cSJim Jagielski // 0) the root entry is part of the list (can't DnD the root!) 914*b1cdbd2cSJim Jagielski // 1) one of the draged entries is to be dropped onto it's own parent 915*b1cdbd2cSJim Jagielski // 2) - " - is to be dropped onto itself 916*b1cdbd2cSJim Jagielski // 3) - " - is a Form and to be dropped onto one of it's descendants 917*b1cdbd2cSJim Jagielski // 4) one of the entries is a control and to be dropped onto the root 918*b1cdbd2cSJim Jagielski // 5) a control or form will be dropped onto a control which is _not_ a sibling (dropping onto a sibling 919*b1cdbd2cSJim Jagielski // means moving the control) 920*b1cdbd2cSJim Jagielski 921*b1cdbd2cSJim Jagielski // collect the ancestors of the drop targte (speeds up 3) 922*b1cdbd2cSJim Jagielski SvLBoxEntrySortedArray arrDropAnchestors; 923*b1cdbd2cSJim Jagielski SvLBoxEntry* pLoop = _pTargetEntry; 924*b1cdbd2cSJim Jagielski while (pLoop) 925*b1cdbd2cSJim Jagielski { 926*b1cdbd2cSJim Jagielski arrDropAnchestors.Insert(pLoop); 927*b1cdbd2cSJim Jagielski pLoop = GetParent(pLoop); 928*b1cdbd2cSJim Jagielski } 929*b1cdbd2cSJim Jagielski 930*b1cdbd2cSJim Jagielski for ( ListBoxEntrySet::const_iterator dropped = aDropped.begin(); 931*b1cdbd2cSJim Jagielski dropped != aDropped.end(); 932*b1cdbd2cSJim Jagielski ++dropped 933*b1cdbd2cSJim Jagielski ) 934*b1cdbd2cSJim Jagielski { 935*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurrent = *dropped; 936*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurrentParent = GetParent(pCurrent); 937*b1cdbd2cSJim Jagielski 938*b1cdbd2cSJim Jagielski // test for 0) 939*b1cdbd2cSJim Jagielski if (pCurrent == m_pRootEntry) 940*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 941*b1cdbd2cSJim Jagielski 942*b1cdbd2cSJim Jagielski // test for 1) 943*b1cdbd2cSJim Jagielski if ( _pTargetEntry == pCurrentParent ) 944*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 945*b1cdbd2cSJim Jagielski 946*b1cdbd2cSJim Jagielski // test for 2) 947*b1cdbd2cSJim Jagielski if (pCurrent == _pTargetEntry) 948*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 949*b1cdbd2cSJim Jagielski 950*b1cdbd2cSJim Jagielski // test for 5) 951*b1cdbd2cSJim Jagielski // if ( bDropTargetIsComponent && (pDropTargetParent != pCurrentParent) ) 952*b1cdbd2cSJim Jagielski if ( bDropTargetIsComponent ) // TODO : die obige Zeile wieder rein, dann muss aber ExecuteDrop das Vertauschen auch beherrschen 953*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 954*b1cdbd2cSJim Jagielski 955*b1cdbd2cSJim Jagielski // test for 3) 956*b1cdbd2cSJim Jagielski if ( IsFormEntry(pCurrent) ) 957*b1cdbd2cSJim Jagielski { 958*b1cdbd2cSJim Jagielski sal_uInt16 nPosition; 959*b1cdbd2cSJim Jagielski if ( arrDropAnchestors.Seek_Entry(pCurrent, &nPosition) ) 960*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 961*b1cdbd2cSJim Jagielski } else if ( IsFormComponentEntry(pCurrent) ) 962*b1cdbd2cSJim Jagielski { 963*b1cdbd2cSJim Jagielski // test for 4) 964*b1cdbd2cSJim Jagielski if (_pTargetEntry == m_pRootEntry) 965*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 966*b1cdbd2cSJim Jagielski } 967*b1cdbd2cSJim Jagielski } 968*b1cdbd2cSJim Jagielski 969*b1cdbd2cSJim Jagielski return DND_ACTION_MOVE; 970*b1cdbd2cSJim Jagielski } 971*b1cdbd2cSJim Jagielski 972*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ AcceptDrop(const AcceptDropEvent & rEvt)973*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::AcceptDrop( const AcceptDropEvent& rEvt ) 974*b1cdbd2cSJim Jagielski { 975*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::AcceptDrop" ); 976*b1cdbd2cSJim Jagielski ::Point aDropPos = rEvt.maPosPixel; 977*b1cdbd2cSJim Jagielski 978*b1cdbd2cSJim Jagielski // kuemmern wir uns erst mal um moeglich DropActions (Scrollen und Aufklappen) 979*b1cdbd2cSJim Jagielski if (rEvt.mbLeaving) 980*b1cdbd2cSJim Jagielski { 981*b1cdbd2cSJim Jagielski if (m_aDropActionTimer.IsActive()) 982*b1cdbd2cSJim Jagielski m_aDropActionTimer.Stop(); 983*b1cdbd2cSJim Jagielski } else 984*b1cdbd2cSJim Jagielski { 985*b1cdbd2cSJim Jagielski sal_Bool bNeedTrigger = sal_False; 986*b1cdbd2cSJim Jagielski // auf dem ersten Eintrag ? 987*b1cdbd2cSJim Jagielski if ((aDropPos.Y() >= 0) && (aDropPos.Y() < GetEntryHeight())) 988*b1cdbd2cSJim Jagielski { 989*b1cdbd2cSJim Jagielski m_aDropActionType = DA_SCROLLUP; 990*b1cdbd2cSJim Jagielski bNeedTrigger = sal_True; 991*b1cdbd2cSJim Jagielski } else 992*b1cdbd2cSJim Jagielski // auf dem letzten (bzw. in dem Bereich, den ein Eintrag einnehmen wuerde, wenn er unten genau buendig 993*b1cdbd2cSJim Jagielski // abschliessen wuerde) ? 994*b1cdbd2cSJim Jagielski if ((aDropPos.Y() < GetSizePixel().Height()) && (aDropPos.Y() >= GetSizePixel().Height() - GetEntryHeight())) 995*b1cdbd2cSJim Jagielski { 996*b1cdbd2cSJim Jagielski m_aDropActionType = DA_SCROLLDOWN; 997*b1cdbd2cSJim Jagielski bNeedTrigger = sal_True; 998*b1cdbd2cSJim Jagielski } else 999*b1cdbd2cSJim Jagielski { // auf einem Entry mit Childs, der nicht aufgeklappt ist ? 1000*b1cdbd2cSJim Jagielski SvLBoxEntry* pDropppedOn = GetEntry(aDropPos); 1001*b1cdbd2cSJim Jagielski if (pDropppedOn && (GetChildCount(pDropppedOn) > 0) && !IsExpanded(pDropppedOn)) 1002*b1cdbd2cSJim Jagielski { 1003*b1cdbd2cSJim Jagielski // -> aufklappen 1004*b1cdbd2cSJim Jagielski m_aDropActionType = DA_EXPANDNODE; 1005*b1cdbd2cSJim Jagielski bNeedTrigger = sal_True; 1006*b1cdbd2cSJim Jagielski } 1007*b1cdbd2cSJim Jagielski } 1008*b1cdbd2cSJim Jagielski 1009*b1cdbd2cSJim Jagielski if (bNeedTrigger && (m_aTimerTriggered != aDropPos)) 1010*b1cdbd2cSJim Jagielski { 1011*b1cdbd2cSJim Jagielski // neu anfangen zu zaehlen 1012*b1cdbd2cSJim Jagielski m_aTimerCounter = DROP_ACTION_TIMER_INITIAL_TICKS; 1013*b1cdbd2cSJim Jagielski // die Pos merken, da ich auch AcceptDrops bekomme, wenn sich die Maus gar nicht bewegt hat 1014*b1cdbd2cSJim Jagielski m_aTimerTriggered = aDropPos; 1015*b1cdbd2cSJim Jagielski // und den Timer los 1016*b1cdbd2cSJim Jagielski if (!m_aDropActionTimer.IsActive()) // gibt es den Timer schon ? 1017*b1cdbd2cSJim Jagielski { 1018*b1cdbd2cSJim Jagielski m_aDropActionTimer.SetTimeout(DROP_ACTION_TIMER_TICK_BASE); 1019*b1cdbd2cSJim Jagielski m_aDropActionTimer.Start(); 1020*b1cdbd2cSJim Jagielski } 1021*b1cdbd2cSJim Jagielski } else if (!bNeedTrigger) 1022*b1cdbd2cSJim Jagielski m_aDropActionTimer.Stop(); 1023*b1cdbd2cSJim Jagielski } 1024*b1cdbd2cSJim Jagielski 1025*b1cdbd2cSJim Jagielski return implAcceptDataTransfer( GetDataFlavorExVector(), rEvt.mnAction, aDropPos, sal_True ); 1026*b1cdbd2cSJim Jagielski } 1027*b1cdbd2cSJim Jagielski 1028*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ implExecuteDataTransfer(const OControlTransferData & _rData,sal_Int8 _nAction,const::Point & _rDropPos,sal_Bool _bDnD)1029*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::implExecuteDataTransfer( const OControlTransferData& _rData, sal_Int8 _nAction, const ::Point& _rDropPos, sal_Bool _bDnD ) 1030*b1cdbd2cSJim Jagielski { 1031*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implExecuteDataTransfer" ); 1032*b1cdbd2cSJim Jagielski return implExecuteDataTransfer( _rData, _nAction, GetEntry( _rDropPos ), _bDnD ); 1033*b1cdbd2cSJim Jagielski } 1034*b1cdbd2cSJim Jagielski 1035*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ implExecuteDataTransfer(const OControlTransferData & _rData,sal_Int8 _nAction,SvLBoxEntry * _pTargetEntry,sal_Bool _bDnD)1036*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::implExecuteDataTransfer( const OControlTransferData& _rData, sal_Int8 _nAction, SvLBoxEntry* _pTargetEntry, sal_Bool _bDnD ) 1037*b1cdbd2cSJim Jagielski { 1038*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::implExecuteDataTransfer" ); 1039*b1cdbd2cSJim Jagielski const DataFlavorExVector& rDataFlavors = _rData.GetDataFlavorExVector(); 1040*b1cdbd2cSJim Jagielski 1041*b1cdbd2cSJim Jagielski if ( DND_ACTION_NONE == implAcceptDataTransfer( rDataFlavors, _nAction, _pTargetEntry, _bDnD ) ) 1042*b1cdbd2cSJim Jagielski // under some platforms, it may happen that ExecuteDrop is called though AcceptDrop returned DND_ACTION_NONE 1043*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 1044*b1cdbd2cSJim Jagielski 1045*b1cdbd2cSJim Jagielski // ware schlecht, wenn nach dem Droppen noch gescrollt wird ... 1046*b1cdbd2cSJim Jagielski if (m_aDropActionTimer.IsActive()) 1047*b1cdbd2cSJim Jagielski m_aDropActionTimer.Stop(); 1048*b1cdbd2cSJim Jagielski 1049*b1cdbd2cSJim Jagielski if (!_pTargetEntry) 1050*b1cdbd2cSJim Jagielski // no target -> no drop 1051*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 1052*b1cdbd2cSJim Jagielski 1053*b1cdbd2cSJim Jagielski // format checks 1054*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL 1055*b1cdbd2cSJim Jagielski sal_Bool bHasHiddenControlsFormat = OControlExchange::hasHiddenControlModelsFormat( rDataFlavors ); 1056*b1cdbd2cSJim Jagielski sal_Bool bForeignCollection = _rData.getFormsRoot().get() != GetNavModel()->GetFormPage()->GetForms().get(); 1057*b1cdbd2cSJim Jagielski DBG_ASSERT(!bForeignCollection || bHasHiddenControlsFormat, "NavigatorTree::implExecuteDataTransfer: invalid format (AcceptDrop shouldn't have let this pass) !"); 1058*b1cdbd2cSJim Jagielski DBG_ASSERT(bForeignCollection || !m_bDragDataDirty, "NavigatorTree::implExecuteDataTransfer: invalid state (shell changed since last exchange resync) !"); 1059*b1cdbd2cSJim Jagielski // das sollte in AcceptDrop erledigt worden sein : dort wird in _rData die Liste der Controls aufgebaut und m_bDragDataDirty 1060*b1cdbd2cSJim Jagielski // zurueckgesetzt 1061*b1cdbd2cSJim Jagielski #endif 1062*b1cdbd2cSJim Jagielski 1063*b1cdbd2cSJim Jagielski if ( DND_ACTION_COPY == _nAction ) 1064*b1cdbd2cSJim Jagielski { // bHasHiddenControlsFormat means that only hidden controls are part of the data 1065*b1cdbd2cSJim Jagielski DBG_ASSERT( bHasHiddenControlsFormat, "NavigatorTree::implExecuteDataTransfer: copy allowed for hidden controls only!" ); 1066*b1cdbd2cSJim Jagielski DBG_ASSERT( _pTargetEntry && ( _pTargetEntry != m_pRootEntry ) && IsFormEntry( _pTargetEntry ), 1067*b1cdbd2cSJim Jagielski "NavigatorTree::implExecuteDataTransfer: should not be here!" ); 1068*b1cdbd2cSJim Jagielski // implAcceptDataTransfer should have caught both cases 1069*b1cdbd2cSJim Jagielski 1070*b1cdbd2cSJim Jagielski DBG_ASSERT(bHasHiddenControlsFormat, "NavigatorTree::implExecuteDataTransfer: only copying of hidden controls is supported !"); 1071*b1cdbd2cSJim Jagielski // das sollte das AcceptDrop abgefangen haben 1072*b1cdbd2cSJim Jagielski 1073*b1cdbd2cSJim Jagielski // da ich gleich die Zielobjekte alle selektieren will (und nur die) 1074*b1cdbd2cSJim Jagielski SelectAll(sal_False); 1075*b1cdbd2cSJim Jagielski 1076*b1cdbd2cSJim Jagielski Sequence< Reference< XInterface > > aControls = _rData.hiddenControls(); 1077*b1cdbd2cSJim Jagielski sal_Int32 nCount = aControls.getLength(); 1078*b1cdbd2cSJim Jagielski const Reference< XInterface >* pControls = aControls.getConstArray(); 1079*b1cdbd2cSJim Jagielski 1080*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 1081*b1cdbd2cSJim Jagielski FmFormModel* pFormModel = pFormShell ? pFormShell->GetFormModel() : NULL; 1082*b1cdbd2cSJim Jagielski 1083*b1cdbd2cSJim Jagielski // innerhalb eines Undo ... 1084*b1cdbd2cSJim Jagielski if (pFormModel) 1085*b1cdbd2cSJim Jagielski { 1086*b1cdbd2cSJim Jagielski XubString aStr(SVX_RES(RID_STR_CONTROL)); 1087*b1cdbd2cSJim Jagielski XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT)); 1088*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplace('#', aStr); 1089*b1cdbd2cSJim Jagielski pFormModel->BegUndo(aUndoStr); 1090*b1cdbd2cSJim Jagielski } 1091*b1cdbd2cSJim Jagielski 1092*b1cdbd2cSJim Jagielski // die Conrtols kopieren 1093*b1cdbd2cSJim Jagielski for (sal_Int32 i=0; i<nCount; ++i) 1094*b1cdbd2cSJim Jagielski { 1095*b1cdbd2cSJim Jagielski // neues Control anlegen 1096*b1cdbd2cSJim Jagielski rtl::OUString fControlName = FM_COMPONENT_HIDDEN; 1097*b1cdbd2cSJim Jagielski FmControlData* pNewControlData = NewControl( fControlName, _pTargetEntry, sal_False); 1098*b1cdbd2cSJim Jagielski Reference< XPropertySet > xNewPropSet( pNewControlData->GetPropertySet() ); 1099*b1cdbd2cSJim Jagielski 1100*b1cdbd2cSJim Jagielski // und die Properties des alten in das neue kopieren 1101*b1cdbd2cSJim Jagielski Reference< XPropertySet > xCurrent(pControls[i], UNO_QUERY); 1102*b1cdbd2cSJim Jagielski #if (OSL_DEBUG_LEVEL > 1) || defined DBG_UTIL 1103*b1cdbd2cSJim Jagielski // nur mal eben sehen, ob das Ding tatsaechlich ein hidden control ist 1104*b1cdbd2cSJim Jagielski sal_Int16 nClassId = ::comphelper::getINT16(xCurrent->getPropertyValue(FM_PROP_CLASSID)); 1105*b1cdbd2cSJim Jagielski OSL_ENSURE(nClassId == FormComponentType::HIDDENCONTROL, "NavigatorTree::implExecuteDataTransfer: invalid control in drop list !"); 1106*b1cdbd2cSJim Jagielski // wenn das SVX_FM_HIDDEN_CONTROLS-Format vorhanden ist, dann sollten wirklich nur hidden controls in der Sequenz 1107*b1cdbd2cSJim Jagielski // stecken 1108*b1cdbd2cSJim Jagielski #endif // (OSL_DEBUG_LEVEL > 1) || DBG_UTIL 1109*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > xPropInfo( xCurrent->getPropertySetInfo()); 1110*b1cdbd2cSJim Jagielski Sequence< Property> seqAllCurrentProps = xPropInfo->getProperties(); 1111*b1cdbd2cSJim Jagielski Property* pAllCurrentProps = seqAllCurrentProps.getArray(); 1112*b1cdbd2cSJim Jagielski for (sal_Int32 j=0; j<seqAllCurrentProps.getLength(); ++j) 1113*b1cdbd2cSJim Jagielski { 1114*b1cdbd2cSJim Jagielski ::rtl::OUString sCurrentProp = pAllCurrentProps[j].Name; 1115*b1cdbd2cSJim Jagielski if (((pAllCurrentProps[j].Attributes & PropertyAttribute::READONLY) == 0) && (sCurrentProp != FM_PROP_NAME)) 1116*b1cdbd2cSJim Jagielski { // (read-only attribs werden natuerlich nicht gesetzt, dito der Name, den hat das NewControl schon eindeutig 1117*b1cdbd2cSJim Jagielski // festgelegt) 1118*b1cdbd2cSJim Jagielski xNewPropSet->setPropertyValue(sCurrentProp, xCurrent->getPropertyValue(sCurrentProp)); 1119*b1cdbd2cSJim Jagielski } 1120*b1cdbd2cSJim Jagielski } 1121*b1cdbd2cSJim Jagielski 1122*b1cdbd2cSJim Jagielski SvLBoxEntry* pToSelect = FindEntry(pNewControlData); 1123*b1cdbd2cSJim Jagielski Select(pToSelect, sal_True); 1124*b1cdbd2cSJim Jagielski if (i == 0) 1125*b1cdbd2cSJim Jagielski SetCurEntry(pToSelect); 1126*b1cdbd2cSJim Jagielski } 1127*b1cdbd2cSJim Jagielski 1128*b1cdbd2cSJim Jagielski if (pFormModel) 1129*b1cdbd2cSJim Jagielski pFormModel->EndUndo(); 1130*b1cdbd2cSJim Jagielski 1131*b1cdbd2cSJim Jagielski return _nAction; 1132*b1cdbd2cSJim Jagielski } 1133*b1cdbd2cSJim Jagielski 1134*b1cdbd2cSJim Jagielski if ( !OControlExchange::hasFieldExchangeFormat( _rData.GetDataFlavorExVector() ) ) 1135*b1cdbd2cSJim Jagielski { 1136*b1cdbd2cSJim Jagielski // can't do anything without the internal format here ... usually happens when doing DnD or CnP 1137*b1cdbd2cSJim Jagielski // over navigator boundaries 1138*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 1139*b1cdbd2cSJim Jagielski } 1140*b1cdbd2cSJim Jagielski 1141*b1cdbd2cSJim Jagielski // some data for the target 1142*b1cdbd2cSJim Jagielski sal_Bool bDropTargetIsForm = IsFormEntry(_pTargetEntry); 1143*b1cdbd2cSJim Jagielski FmFormData* pTargetData = bDropTargetIsForm ? (FmFormData*)_pTargetEntry->GetUserData() : NULL; 1144*b1cdbd2cSJim Jagielski 1145*b1cdbd2cSJim Jagielski DBG_ASSERT( DND_ACTION_COPY != _nAction, "NavigatorTree::implExecuteDataTransfer: somebody changed the logics!" ); 1146*b1cdbd2cSJim Jagielski 1147*b1cdbd2cSJim Jagielski // die Liste der gedraggten Eintraege 1148*b1cdbd2cSJim Jagielski ListBoxEntrySet aDropped = _rData.selected(); 1149*b1cdbd2cSJim Jagielski DBG_ASSERT(aDropped.size() >= 1, "NavigatorTree::implExecuteDataTransfer: no entries!"); 1150*b1cdbd2cSJim Jagielski 1151*b1cdbd2cSJim Jagielski // die Shell und das Model 1152*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 1153*b1cdbd2cSJim Jagielski FmFormModel* pFormModel = pFormShell ? pFormShell->GetFormModel() : NULL; 1154*b1cdbd2cSJim Jagielski if (!pFormModel) 1155*b1cdbd2cSJim Jagielski return DND_ACTION_NONE; 1156*b1cdbd2cSJim Jagielski 1157*b1cdbd2cSJim Jagielski // fuer's Undo 1158*b1cdbd2cSJim Jagielski const bool bUndo = pFormModel->IsUndoEnabled(); 1159*b1cdbd2cSJim Jagielski 1160*b1cdbd2cSJim Jagielski if( bUndo ) 1161*b1cdbd2cSJim Jagielski { 1162*b1cdbd2cSJim Jagielski XubString strUndoDescription(SVX_RES(RID_STR_UNDO_CONTAINER_REPLACE)); 1163*b1cdbd2cSJim Jagielski pFormModel->BegUndo(strUndoDescription); 1164*b1cdbd2cSJim Jagielski } 1165*b1cdbd2cSJim Jagielski 1166*b1cdbd2cSJim Jagielski // ich nehme vor dem Einfuegen eines Eintrages seine Selection raus, damit die Markierung dabei nicht flackert 1167*b1cdbd2cSJim Jagielski // -> das Handeln des Select locken 1168*b1cdbd2cSJim Jagielski LockSelectionHandling(); 1169*b1cdbd2cSJim Jagielski 1170*b1cdbd2cSJim Jagielski // jetzt durch alle gedroppten Eintraege ... 1171*b1cdbd2cSJim Jagielski for ( ListBoxEntrySet::const_iterator dropped = aDropped.begin(); 1172*b1cdbd2cSJim Jagielski dropped != aDropped.end(); 1173*b1cdbd2cSJim Jagielski ++dropped 1174*b1cdbd2cSJim Jagielski ) 1175*b1cdbd2cSJim Jagielski { 1176*b1cdbd2cSJim Jagielski // ein paar Daten zum aktuellen Element 1177*b1cdbd2cSJim Jagielski SvLBoxEntry* pCurrent = *dropped; 1178*b1cdbd2cSJim Jagielski DBG_ASSERT(pCurrent != NULL, "NavigatorTree::implExecuteDataTransfer: ungueltiger Eintrag"); 1179*b1cdbd2cSJim Jagielski DBG_ASSERT(GetParent(pCurrent) != NULL, "NavigatorTree::implExecuteDataTransfer: ungueltiger Eintrag"); 1180*b1cdbd2cSJim Jagielski // die Root darf nicht gedraggt werden 1181*b1cdbd2cSJim Jagielski 1182*b1cdbd2cSJim Jagielski FmEntryData* pCurrentUserData = (FmEntryData*)pCurrent->GetUserData(); 1183*b1cdbd2cSJim Jagielski 1184*b1cdbd2cSJim Jagielski Reference< XChild > xCurrentChild(pCurrentUserData->GetChildIFace(), UNO_QUERY); 1185*b1cdbd2cSJim Jagielski Reference< XIndexContainer > xContainer(xCurrentChild->getParent(), UNO_QUERY); 1186*b1cdbd2cSJim Jagielski 1187*b1cdbd2cSJim Jagielski FmFormData* pCurrentParentUserData = (FmFormData*)pCurrentUserData->GetParent(); 1188*b1cdbd2cSJim Jagielski DBG_ASSERT(pCurrentParentUserData == NULL || pCurrentParentUserData->ISA(FmFormData), "NavigatorTree::implExecuteDataTransfer: ungueltiges Parent"); 1189*b1cdbd2cSJim Jagielski 1190*b1cdbd2cSJim Jagielski // beim Vater austragen 1191*b1cdbd2cSJim Jagielski if (pCurrentParentUserData) 1192*b1cdbd2cSJim Jagielski pCurrentParentUserData->GetChildList()->Remove(pCurrentUserData); 1193*b1cdbd2cSJim Jagielski else 1194*b1cdbd2cSJim Jagielski GetNavModel()->GetRootList()->Remove(pCurrentUserData); 1195*b1cdbd2cSJim Jagielski 1196*b1cdbd2cSJim Jagielski // aus dem Container entfernen 1197*b1cdbd2cSJim Jagielski sal_Int32 nIndex = getElementPos(Reference< XIndexAccess > (xContainer, UNO_QUERY), xCurrentChild); 1198*b1cdbd2cSJim Jagielski GetNavModel()->m_pPropChangeList->Lock(); 1199*b1cdbd2cSJim Jagielski // die Undo-Action fuer das Rausnehmen 1200*b1cdbd2cSJim Jagielski if ( bUndo && GetNavModel()->m_pPropChangeList->CanUndo()) 1201*b1cdbd2cSJim Jagielski { 1202*b1cdbd2cSJim Jagielski pFormModel->AddUndo(new FmUndoContainerAction(*pFormModel, FmUndoContainerAction::Removed, 1203*b1cdbd2cSJim Jagielski xContainer, xCurrentChild, nIndex)); 1204*b1cdbd2cSJim Jagielski } 1205*b1cdbd2cSJim Jagielski else if( !GetNavModel()->m_pPropChangeList->CanUndo() ) 1206*b1cdbd2cSJim Jagielski { 1207*b1cdbd2cSJim Jagielski FmUndoContainerAction::DisposeElement( xCurrentChild ); 1208*b1cdbd2cSJim Jagielski } 1209*b1cdbd2cSJim Jagielski 1210*b1cdbd2cSJim Jagielski // Events mitkopieren 1211*b1cdbd2cSJim Jagielski Reference< XEventAttacherManager > xManager(xContainer, UNO_QUERY); 1212*b1cdbd2cSJim Jagielski Sequence< ScriptEventDescriptor > aEvts; 1213*b1cdbd2cSJim Jagielski 1214*b1cdbd2cSJim Jagielski if (xManager.is() && nIndex >= 0) 1215*b1cdbd2cSJim Jagielski aEvts = xManager->getScriptEvents(nIndex); 1216*b1cdbd2cSJim Jagielski xContainer->removeByIndex(nIndex); 1217*b1cdbd2cSJim Jagielski 1218*b1cdbd2cSJim Jagielski // die Selection raus 1219*b1cdbd2cSJim Jagielski Select(pCurrent, sal_False); 1220*b1cdbd2cSJim Jagielski // und weg 1221*b1cdbd2cSJim Jagielski Remove(pCurrentUserData); 1222*b1cdbd2cSJim Jagielski 1223*b1cdbd2cSJim Jagielski // die Stelle innerhalb des DropParents, an der ich die gedroppten Eintraege einfuegen muss 1224*b1cdbd2cSJim Jagielski if (pTargetData) 1225*b1cdbd2cSJim Jagielski xContainer = Reference< XIndexContainer > (pTargetData->GetElement(), UNO_QUERY); 1226*b1cdbd2cSJim Jagielski else 1227*b1cdbd2cSJim Jagielski xContainer = Reference< XIndexContainer > (GetNavModel()->GetForms(), UNO_QUERY); 1228*b1cdbd2cSJim Jagielski 1229*b1cdbd2cSJim Jagielski // immer ganz hinten einfuegen 1230*b1cdbd2cSJim Jagielski nIndex = xContainer->getCount(); 1231*b1cdbd2cSJim Jagielski 1232*b1cdbd2cSJim Jagielski // UndoAction fuer das Einfuegen 1233*b1cdbd2cSJim Jagielski if ( bUndo && GetNavModel()->m_pPropChangeList->CanUndo()) 1234*b1cdbd2cSJim Jagielski pFormModel->AddUndo(new FmUndoContainerAction(*pFormModel, FmUndoContainerAction::Inserted, 1235*b1cdbd2cSJim Jagielski xContainer, xCurrentChild, nIndex)); 1236*b1cdbd2cSJim Jagielski 1237*b1cdbd2cSJim Jagielski // einfuegen im neuen Container 1238*b1cdbd2cSJim Jagielski if (pTargetData) 1239*b1cdbd2cSJim Jagielski { 1240*b1cdbd2cSJim Jagielski // es wird in eine Form eingefuegt, dann brauche ich eine FormComponent 1241*b1cdbd2cSJim Jagielski xContainer->insertByIndex( nIndex, 1242*b1cdbd2cSJim Jagielski makeAny( Reference< XFormComponent >( xCurrentChild, UNO_QUERY ) ) ); 1243*b1cdbd2cSJim Jagielski } 1244*b1cdbd2cSJim Jagielski else 1245*b1cdbd2cSJim Jagielski { 1246*b1cdbd2cSJim Jagielski xContainer->insertByIndex( nIndex, 1247*b1cdbd2cSJim Jagielski makeAny( Reference< XForm >( xCurrentChild, UNO_QUERY ) ) ); 1248*b1cdbd2cSJim Jagielski } 1249*b1cdbd2cSJim Jagielski 1250*b1cdbd2cSJim Jagielski if (aEvts.getLength()) 1251*b1cdbd2cSJim Jagielski { 1252*b1cdbd2cSJim Jagielski xManager = Reference< XEventAttacherManager > (xContainer, UNO_QUERY); 1253*b1cdbd2cSJim Jagielski if (xManager.is()) 1254*b1cdbd2cSJim Jagielski xManager->registerScriptEvents(nIndex, aEvts); 1255*b1cdbd2cSJim Jagielski } 1256*b1cdbd2cSJim Jagielski 1257*b1cdbd2cSJim Jagielski GetNavModel()->m_pPropChangeList->UnLock(); 1258*b1cdbd2cSJim Jagielski 1259*b1cdbd2cSJim Jagielski // zuerst dem Eintrag das neue Parent 1260*b1cdbd2cSJim Jagielski pCurrentUserData->SetParent(pTargetData); 1261*b1cdbd2cSJim Jagielski 1262*b1cdbd2cSJim Jagielski // dann dem Parent das neue Child 1263*b1cdbd2cSJim Jagielski if (pTargetData) 1264*b1cdbd2cSJim Jagielski pTargetData->GetChildList()->Insert(pCurrentUserData, nIndex); 1265*b1cdbd2cSJim Jagielski else 1266*b1cdbd2cSJim Jagielski GetNavModel()->GetRootList()->Insert(pCurrentUserData, nIndex); 1267*b1cdbd2cSJim Jagielski 1268*b1cdbd2cSJim Jagielski // dann bei mir selber bekanntgeben und neu selektieren 1269*b1cdbd2cSJim Jagielski SvLBoxEntry* pNew = Insert( pCurrentUserData, nIndex ); 1270*b1cdbd2cSJim Jagielski if ( ( aDropped.begin() == dropped ) && pNew ) 1271*b1cdbd2cSJim Jagielski { 1272*b1cdbd2cSJim Jagielski SvLBoxEntry* pParent = GetParent( pNew ); 1273*b1cdbd2cSJim Jagielski if ( pParent ) 1274*b1cdbd2cSJim Jagielski Expand( pParent ); 1275*b1cdbd2cSJim Jagielski } 1276*b1cdbd2cSJim Jagielski } 1277*b1cdbd2cSJim Jagielski 1278*b1cdbd2cSJim Jagielski UnlockSelectionHandling(); 1279*b1cdbd2cSJim Jagielski 1280*b1cdbd2cSJim Jagielski if( bUndo ) 1281*b1cdbd2cSJim Jagielski pFormModel->EndUndo(); 1282*b1cdbd2cSJim Jagielski 1283*b1cdbd2cSJim Jagielski // During the move, the markings of the underlying view did not change (because the view is not affected by the logical 1284*b1cdbd2cSJim Jagielski // hierarchy of the form/control models. But my selection changed - which means I have to adjust it according to the 1285*b1cdbd2cSJim Jagielski // view marks, again. 1286*b1cdbd2cSJim Jagielski SynchronizeSelection(); 1287*b1cdbd2cSJim Jagielski 1288*b1cdbd2cSJim Jagielski // in addition, with the move of controls such things as "the current form" may have changed - force the shell 1289*b1cdbd2cSJim Jagielski // to update itself accordingly 1290*b1cdbd2cSJim Jagielski if( pFormShell && pFormShell->GetImpl() && pFormShell->GetFormView() ) 1291*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->DetermineSelection( pFormShell->GetFormView()->GetMarkedObjectList() ); 1292*b1cdbd2cSJim Jagielski 1293*b1cdbd2cSJim Jagielski if ( m_aControlExchange.isClipboardOwner() && ( DND_ACTION_MOVE == _nAction ) ) 1294*b1cdbd2cSJim Jagielski m_aControlExchange->clear(); 1295*b1cdbd2cSJim Jagielski 1296*b1cdbd2cSJim Jagielski return _nAction; 1297*b1cdbd2cSJim Jagielski } 1298*b1cdbd2cSJim Jagielski 1299*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ ExecuteDrop(const ExecuteDropEvent & rEvt)1300*b1cdbd2cSJim Jagielski sal_Int8 NavigatorTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) 1301*b1cdbd2cSJim Jagielski { 1302*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::ExecuteDrop" ); 1303*b1cdbd2cSJim Jagielski sal_Int8 nResult( DND_ACTION_NONE ); 1304*b1cdbd2cSJim Jagielski 1305*b1cdbd2cSJim Jagielski if ( m_aControlExchange.isDragSource() ) 1306*b1cdbd2cSJim Jagielski nResult = implExecuteDataTransfer( *m_aControlExchange, rEvt.mnAction, rEvt.maPosPixel, sal_True ); 1307*b1cdbd2cSJim Jagielski else 1308*b1cdbd2cSJim Jagielski { 1309*b1cdbd2cSJim Jagielski OControlTransferData aDroppedData( rEvt.maDropEvent.Transferable ); 1310*b1cdbd2cSJim Jagielski nResult = implExecuteDataTransfer( aDroppedData, rEvt.mnAction, rEvt.maPosPixel, sal_True ); 1311*b1cdbd2cSJim Jagielski } 1312*b1cdbd2cSJim Jagielski 1313*b1cdbd2cSJim Jagielski return nResult; 1314*b1cdbd2cSJim Jagielski } 1315*b1cdbd2cSJim Jagielski 1316*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ doPaste()1317*b1cdbd2cSJim Jagielski void NavigatorTree::doPaste() 1318*b1cdbd2cSJim Jagielski { 1319*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::doPaste" ); 1320*b1cdbd2cSJim Jagielski try 1321*b1cdbd2cSJim Jagielski { 1322*b1cdbd2cSJim Jagielski if ( m_aControlExchange.isClipboardOwner() ) 1323*b1cdbd2cSJim Jagielski { 1324*b1cdbd2cSJim Jagielski implExecuteDataTransfer( *m_aControlExchange, doingKeyboardCut( ) ? DND_ACTION_MOVE : DND_ACTION_COPY, FirstSelected(), sal_False ); 1325*b1cdbd2cSJim Jagielski } 1326*b1cdbd2cSJim Jagielski else 1327*b1cdbd2cSJim Jagielski { 1328*b1cdbd2cSJim Jagielski // the clipboard content 1329*b1cdbd2cSJim Jagielski Reference< XClipboard > xClipboard( GetClipboard() ); 1330*b1cdbd2cSJim Jagielski Reference< XTransferable > xTransferable; 1331*b1cdbd2cSJim Jagielski if ( xClipboard.is() ) 1332*b1cdbd2cSJim Jagielski xTransferable = xClipboard->getContents(); 1333*b1cdbd2cSJim Jagielski 1334*b1cdbd2cSJim Jagielski OControlTransferData aClipboardContent( xTransferable ); 1335*b1cdbd2cSJim Jagielski implExecuteDataTransfer( aClipboardContent, DND_ACTION_COPY, FirstSelected(), sal_False ); 1336*b1cdbd2cSJim Jagielski } 1337*b1cdbd2cSJim Jagielski } 1338*b1cdbd2cSJim Jagielski catch( const Exception& ) 1339*b1cdbd2cSJim Jagielski { 1340*b1cdbd2cSJim Jagielski DBG_ERROR( "NavigatorTree::doPaste: caught an exception!" ); 1341*b1cdbd2cSJim Jagielski } 1342*b1cdbd2cSJim Jagielski } 1343*b1cdbd2cSJim Jagielski 1344*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ doCopy()1345*b1cdbd2cSJim Jagielski void NavigatorTree::doCopy() 1346*b1cdbd2cSJim Jagielski { 1347*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::doCopy" ); 1348*b1cdbd2cSJim Jagielski if ( implPrepareExchange( DND_ACTION_COPY ) ) 1349*b1cdbd2cSJim Jagielski { 1350*b1cdbd2cSJim Jagielski m_aControlExchange.setClipboardListener( LINK( this, NavigatorTree, OnClipboardAction ) ); 1351*b1cdbd2cSJim Jagielski m_aControlExchange.copyToClipboard( ); 1352*b1cdbd2cSJim Jagielski } 1353*b1cdbd2cSJim Jagielski } 1354*b1cdbd2cSJim Jagielski 1355*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ ModelHasRemoved(SvListEntry * _pEntry)1356*b1cdbd2cSJim Jagielski void NavigatorTree::ModelHasRemoved( SvListEntry* _pEntry ) 1357*b1cdbd2cSJim Jagielski { 1358*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::ModelHasRemoved" ); 1359*b1cdbd2cSJim Jagielski SvLBoxEntry* pTypedEntry = static_cast< SvLBoxEntry* >( _pEntry ); 1360*b1cdbd2cSJim Jagielski if ( doingKeyboardCut() ) 1361*b1cdbd2cSJim Jagielski m_aCutEntries.erase( pTypedEntry ); 1362*b1cdbd2cSJim Jagielski 1363*b1cdbd2cSJim Jagielski if ( m_aControlExchange.isDataExchangeActive() ) 1364*b1cdbd2cSJim Jagielski { 1365*b1cdbd2cSJim Jagielski if ( 0 == m_aControlExchange->onEntryRemoved( pTypedEntry ) ) 1366*b1cdbd2cSJim Jagielski { 1367*b1cdbd2cSJim Jagielski // last of the entries which we put into the clipboard has been deleted from the tree. 1368*b1cdbd2cSJim Jagielski // Give up the clipboard ownership. 1369*b1cdbd2cSJim Jagielski m_aControlExchange.clear(); 1370*b1cdbd2cSJim Jagielski } 1371*b1cdbd2cSJim Jagielski } 1372*b1cdbd2cSJim Jagielski } 1373*b1cdbd2cSJim Jagielski 1374*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ doCut()1375*b1cdbd2cSJim Jagielski void NavigatorTree::doCut() 1376*b1cdbd2cSJim Jagielski { 1377*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::doCut" ); 1378*b1cdbd2cSJim Jagielski if ( implPrepareExchange( DND_ACTION_MOVE ) ) 1379*b1cdbd2cSJim Jagielski { 1380*b1cdbd2cSJim Jagielski m_aControlExchange.setClipboardListener( LINK( this, NavigatorTree, OnClipboardAction ) ); 1381*b1cdbd2cSJim Jagielski m_aControlExchange.copyToClipboard( ); 1382*b1cdbd2cSJim Jagielski m_bKeyboardCut = sal_True; 1383*b1cdbd2cSJim Jagielski 1384*b1cdbd2cSJim Jagielski // mark all the entries we just "cut" into the clipboard as "nearly moved" 1385*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; i<m_arrCurrentSelection.Count(); ++i ) 1386*b1cdbd2cSJim Jagielski { 1387*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = m_arrCurrentSelection[ (sal_uInt16)i ]; 1388*b1cdbd2cSJim Jagielski if ( pEntry ) 1389*b1cdbd2cSJim Jagielski { 1390*b1cdbd2cSJim Jagielski m_aCutEntries.insert( pEntry ); 1391*b1cdbd2cSJim Jagielski pEntry->SetFlags( pEntry->GetFlags() | SV_ENTRYFLAG_SEMITRANSPARENT ); 1392*b1cdbd2cSJim Jagielski InvalidateEntry( pEntry ); 1393*b1cdbd2cSJim Jagielski } 1394*b1cdbd2cSJim Jagielski } 1395*b1cdbd2cSJim Jagielski } 1396*b1cdbd2cSJim Jagielski } 1397*b1cdbd2cSJim Jagielski 1398*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ KeyInput(const::KeyEvent & rKEvt)1399*b1cdbd2cSJim Jagielski void NavigatorTree::KeyInput(const ::KeyEvent& rKEvt) 1400*b1cdbd2cSJim Jagielski { 1401*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::KeyInput" ); 1402*b1cdbd2cSJim Jagielski const KeyCode& rCode = rKEvt.GetKeyCode(); 1403*b1cdbd2cSJim Jagielski 1404*b1cdbd2cSJim Jagielski // delete? 1405*b1cdbd2cSJim Jagielski if (rKEvt.GetKeyCode().GetCode() == KEY_DELETE && !rKEvt.GetKeyCode().GetModifier()) 1406*b1cdbd2cSJim Jagielski { 1407*b1cdbd2cSJim Jagielski DeleteSelection(); 1408*b1cdbd2cSJim Jagielski return; 1409*b1cdbd2cSJim Jagielski } 1410*b1cdbd2cSJim Jagielski 1411*b1cdbd2cSJim Jagielski // copy'n'paste? 1412*b1cdbd2cSJim Jagielski switch ( rCode.GetFunction() ) 1413*b1cdbd2cSJim Jagielski { 1414*b1cdbd2cSJim Jagielski case KEYFUNC_CUT: 1415*b1cdbd2cSJim Jagielski doCut(); 1416*b1cdbd2cSJim Jagielski break; 1417*b1cdbd2cSJim Jagielski 1418*b1cdbd2cSJim Jagielski case KEYFUNC_PASTE: 1419*b1cdbd2cSJim Jagielski if ( implAcceptPaste() ) 1420*b1cdbd2cSJim Jagielski doPaste(); 1421*b1cdbd2cSJim Jagielski break; 1422*b1cdbd2cSJim Jagielski 1423*b1cdbd2cSJim Jagielski case KEYFUNC_COPY: 1424*b1cdbd2cSJim Jagielski doCopy(); 1425*b1cdbd2cSJim Jagielski break; 1426*b1cdbd2cSJim Jagielski 1427*b1cdbd2cSJim Jagielski default: 1428*b1cdbd2cSJim Jagielski break; 1429*b1cdbd2cSJim Jagielski } 1430*b1cdbd2cSJim Jagielski 1431*b1cdbd2cSJim Jagielski SvTreeListBox::KeyInput(rKEvt); 1432*b1cdbd2cSJim Jagielski } 1433*b1cdbd2cSJim Jagielski 1434*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ EditingEntry(SvLBoxEntry * pEntry,Selection & rSelection)1435*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::EditingEntry( SvLBoxEntry* pEntry, Selection& rSelection ) 1436*b1cdbd2cSJim Jagielski { 1437*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::EditingEntry" ); 1438*b1cdbd2cSJim Jagielski if (!SvTreeListBox::EditingEntry( pEntry, rSelection )) 1439*b1cdbd2cSJim Jagielski return sal_False; 1440*b1cdbd2cSJim Jagielski 1441*b1cdbd2cSJim Jagielski return (pEntry && (pEntry->GetUserData() != NULL)); 1442*b1cdbd2cSJim Jagielski // die Wurzel, die ich nicht umbenennen darf, hat als UserData NULL 1443*b1cdbd2cSJim Jagielski } 1444*b1cdbd2cSJim Jagielski 1445*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ NewForm(SvLBoxEntry * pParentEntry)1446*b1cdbd2cSJim Jagielski void NavigatorTree::NewForm( SvLBoxEntry* pParentEntry ) 1447*b1cdbd2cSJim Jagielski { 1448*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::NewForm" ); 1449*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1450*b1cdbd2cSJim Jagielski // ParentFormData holen 1451*b1cdbd2cSJim Jagielski if( !IsFormEntry(pParentEntry) ) 1452*b1cdbd2cSJim Jagielski return; 1453*b1cdbd2cSJim Jagielski 1454*b1cdbd2cSJim Jagielski FmFormData* pParentFormData = (FmFormData*)pParentEntry->GetUserData(); 1455*b1cdbd2cSJim Jagielski 1456*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1457*b1cdbd2cSJim Jagielski // Neue Form erzeugen 1458*b1cdbd2cSJim Jagielski Reference< XForm > xNewForm(m_xORB->createInstance(FM_SUN_COMPONENT_FORM), UNO_QUERY); 1459*b1cdbd2cSJim Jagielski if (!xNewForm.is()) 1460*b1cdbd2cSJim Jagielski return; 1461*b1cdbd2cSJim Jagielski 1462*b1cdbd2cSJim Jagielski FmFormData* pNewFormData = new FmFormData( xNewForm, m_aNavigatorImages, m_aNavigatorImagesHC, pParentFormData ); 1463*b1cdbd2cSJim Jagielski 1464*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1465*b1cdbd2cSJim Jagielski // Namen setzen 1466*b1cdbd2cSJim Jagielski ::rtl::OUString aName = GenerateName(pNewFormData); 1467*b1cdbd2cSJim Jagielski pNewFormData->SetText(aName); 1468*b1cdbd2cSJim Jagielski 1469*b1cdbd2cSJim Jagielski Reference< XPropertySet > xPropertySet(xNewForm, UNO_QUERY); 1470*b1cdbd2cSJim Jagielski if (!xPropertySet.is()) 1471*b1cdbd2cSJim Jagielski return; 1472*b1cdbd2cSJim Jagielski try 1473*b1cdbd2cSJim Jagielski { 1474*b1cdbd2cSJim Jagielski xPropertySet->setPropertyValue( FM_PROP_NAME, makeAny(aName) ); 1475*b1cdbd2cSJim Jagielski // a form should always have the command type table as default 1476*b1cdbd2cSJim Jagielski xPropertySet->setPropertyValue( FM_PROP_COMMANDTYPE, makeAny(sal_Int32(CommandType::TABLE))); 1477*b1cdbd2cSJim Jagielski } 1478*b1cdbd2cSJim Jagielski catch ( const Exception& ) 1479*b1cdbd2cSJim Jagielski { 1480*b1cdbd2cSJim Jagielski DBG_ERROR("NavigatorTree::NewForm : could not set esssential properties !"); 1481*b1cdbd2cSJim Jagielski } 1482*b1cdbd2cSJim Jagielski 1483*b1cdbd2cSJim Jagielski 1484*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1485*b1cdbd2cSJim Jagielski // Form einfuegen 1486*b1cdbd2cSJim Jagielski GetNavModel()->Insert( pNewFormData, LIST_APPEND, sal_True ); 1487*b1cdbd2cSJim Jagielski 1488*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1489*b1cdbd2cSJim Jagielski // Neue Form als aktive Form setzen 1490*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 1491*b1cdbd2cSJim Jagielski if( pFormShell ) 1492*b1cdbd2cSJim Jagielski { 1493*b1cdbd2cSJim Jagielski InterfaceBag aSelection; 1494*b1cdbd2cSJim Jagielski aSelection.insert( Reference< XInterface >( xNewForm, UNO_QUERY ) ); 1495*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->setCurrentSelection( aSelection ); 1496*b1cdbd2cSJim Jagielski 1497*b1cdbd2cSJim Jagielski pFormShell->GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_PROPERTIES,sal_True,sal_True); 1498*b1cdbd2cSJim Jagielski } 1499*b1cdbd2cSJim Jagielski GetNavModel()->SetModified(); 1500*b1cdbd2cSJim Jagielski 1501*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1502*b1cdbd2cSJim Jagielski // In EditMode schalten 1503*b1cdbd2cSJim Jagielski SvLBoxEntry* pNewEntry = FindEntry( pNewFormData ); 1504*b1cdbd2cSJim Jagielski EditEntry( pNewEntry ); 1505*b1cdbd2cSJim Jagielski } 1506*b1cdbd2cSJim Jagielski 1507*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ NewControl(const::rtl::OUString & rServiceName,SvLBoxEntry * pParentEntry,sal_Bool bEditName)1508*b1cdbd2cSJim Jagielski FmControlData* NavigatorTree::NewControl( const ::rtl::OUString& rServiceName, SvLBoxEntry* pParentEntry, sal_Bool bEditName ) 1509*b1cdbd2cSJim Jagielski { 1510*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::NewControl" ); 1511*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1512*b1cdbd2cSJim Jagielski // ParentForm holen 1513*b1cdbd2cSJim Jagielski if (!GetNavModel()->GetFormShell()) 1514*b1cdbd2cSJim Jagielski return NULL; 1515*b1cdbd2cSJim Jagielski if (!IsFormEntry(pParentEntry)) 1516*b1cdbd2cSJim Jagielski return NULL; 1517*b1cdbd2cSJim Jagielski 1518*b1cdbd2cSJim Jagielski FmFormData* pParentFormData = (FmFormData*)pParentEntry->GetUserData();; 1519*b1cdbd2cSJim Jagielski Reference< XForm > xParentForm( pParentFormData->GetFormIface()); 1520*b1cdbd2cSJim Jagielski 1521*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1522*b1cdbd2cSJim Jagielski // Neue Component erzeugen 1523*b1cdbd2cSJim Jagielski Reference< XFormComponent > xNewComponent(::comphelper::getProcessServiceFactory()->createInstance(rServiceName), UNO_QUERY); 1524*b1cdbd2cSJim Jagielski if (!xNewComponent.is()) 1525*b1cdbd2cSJim Jagielski return NULL; 1526*b1cdbd2cSJim Jagielski 1527*b1cdbd2cSJim Jagielski FmControlData* pNewFormControlData = new FmControlData( xNewComponent, m_aNavigatorImages, m_aNavigatorImagesHC, pParentFormData ); 1528*b1cdbd2cSJim Jagielski 1529*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1530*b1cdbd2cSJim Jagielski // Namen setzen 1531*b1cdbd2cSJim Jagielski FmFormView* pFormView = GetNavModel()->GetFormShell()->GetFormView(); 1532*b1cdbd2cSJim Jagielski SdrPageView* pPageView = pFormView->GetSdrPageView(); 1533*b1cdbd2cSJim Jagielski FmFormPage* pPage = (FmFormPage*)pPageView->GetPage(); 1534*b1cdbd2cSJim Jagielski 1535*b1cdbd2cSJim Jagielski ::rtl::OUString sName = pPage->GetImpl().setUniqueName( xNewComponent, xParentForm ); 1536*b1cdbd2cSJim Jagielski 1537*b1cdbd2cSJim Jagielski pNewFormControlData->SetText( sName ); 1538*b1cdbd2cSJim Jagielski 1539*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1540*b1cdbd2cSJim Jagielski // FormComponent einfuegen 1541*b1cdbd2cSJim Jagielski GetNavModel()->Insert( pNewFormControlData, LIST_APPEND, sal_True ); 1542*b1cdbd2cSJim Jagielski GetNavModel()->SetModified(); 1543*b1cdbd2cSJim Jagielski 1544*b1cdbd2cSJim Jagielski if (bEditName) 1545*b1cdbd2cSJim Jagielski { 1546*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1547*b1cdbd2cSJim Jagielski // In EditMode schalten 1548*b1cdbd2cSJim Jagielski SvLBoxEntry* pNewEntry = FindEntry( pNewFormControlData ); 1549*b1cdbd2cSJim Jagielski Select( pNewEntry, sal_True ); 1550*b1cdbd2cSJim Jagielski EditEntry( pNewEntry ); 1551*b1cdbd2cSJim Jagielski } 1552*b1cdbd2cSJim Jagielski 1553*b1cdbd2cSJim Jagielski return pNewFormControlData; 1554*b1cdbd2cSJim Jagielski } 1555*b1cdbd2cSJim Jagielski 1556*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ GenerateName(FmEntryData * pEntryData)1557*b1cdbd2cSJim Jagielski ::rtl::OUString NavigatorTree::GenerateName( FmEntryData* pEntryData ) 1558*b1cdbd2cSJim Jagielski { 1559*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::GenerateName" ); 1560*b1cdbd2cSJim Jagielski const sal_uInt16 nMaxCount = 99; 1561*b1cdbd2cSJim Jagielski ::rtl::OUString aNewName; 1562*b1cdbd2cSJim Jagielski 1563*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1564*b1cdbd2cSJim Jagielski // BasisNamen erzeugen 1565*b1cdbd2cSJim Jagielski UniString aBaseName; 1566*b1cdbd2cSJim Jagielski if( pEntryData->ISA(FmFormData) ) 1567*b1cdbd2cSJim Jagielski aBaseName = SVX_RES( RID_STR_STDFORMNAME ); 1568*b1cdbd2cSJim Jagielski 1569*b1cdbd2cSJim Jagielski else if( pEntryData->ISA(FmControlData) ) 1570*b1cdbd2cSJim Jagielski aBaseName = SVX_RES( RID_STR_CONTROL ); 1571*b1cdbd2cSJim Jagielski 1572*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 1573*b1cdbd2cSJim Jagielski // Neuen Namen erstellen 1574*b1cdbd2cSJim Jagielski FmFormData* pFormParentData = (FmFormData*)pEntryData->GetParent(); 1575*b1cdbd2cSJim Jagielski 1576*b1cdbd2cSJim Jagielski for( sal_Int32 i=0; i<nMaxCount; i++ ) 1577*b1cdbd2cSJim Jagielski { 1578*b1cdbd2cSJim Jagielski aNewName = aBaseName; 1579*b1cdbd2cSJim Jagielski if( i>0 ) 1580*b1cdbd2cSJim Jagielski { 1581*b1cdbd2cSJim Jagielski aNewName += ::rtl::OUString::createFromAscii(" "); 1582*b1cdbd2cSJim Jagielski aNewName += ::rtl::OUString::valueOf(i).getStr(); 1583*b1cdbd2cSJim Jagielski } 1584*b1cdbd2cSJim Jagielski 1585*b1cdbd2cSJim Jagielski if( GetNavModel()->FindData(aNewName, pFormParentData,sal_False) == NULL ) 1586*b1cdbd2cSJim Jagielski break; 1587*b1cdbd2cSJim Jagielski } 1588*b1cdbd2cSJim Jagielski 1589*b1cdbd2cSJim Jagielski return aNewName; 1590*b1cdbd2cSJim Jagielski } 1591*b1cdbd2cSJim Jagielski 1592*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ EditedEntry(SvLBoxEntry * pEntry,const XubString & rNewText)1593*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText ) 1594*b1cdbd2cSJim Jagielski { 1595*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::EditedEntry" ); 1596*b1cdbd2cSJim Jagielski if (EditingCanceled()) 1597*b1cdbd2cSJim Jagielski return sal_True; 1598*b1cdbd2cSJim Jagielski 1599*b1cdbd2cSJim Jagielski GrabFocus(); 1600*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = (FmEntryData*)pEntry->GetUserData(); 1601*b1cdbd2cSJim Jagielski sal_Bool bRes = GetNavModel()->Rename( pEntryData, rNewText); 1602*b1cdbd2cSJim Jagielski if( !bRes ) 1603*b1cdbd2cSJim Jagielski { 1604*b1cdbd2cSJim Jagielski m_pEditEntry = pEntry; 1605*b1cdbd2cSJim Jagielski nEditEvent = Application::PostUserEvent( LINK(this, NavigatorTree, OnEdit) ); 1606*b1cdbd2cSJim Jagielski } else 1607*b1cdbd2cSJim Jagielski SetCursor(pEntry, sal_True); 1608*b1cdbd2cSJim Jagielski 1609*b1cdbd2cSJim Jagielski return bRes; 1610*b1cdbd2cSJim Jagielski } 1611*b1cdbd2cSJim Jagielski 1612*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IMPL_LINK(NavigatorTree,OnEdit,void *,EMPTYARG)1613*b1cdbd2cSJim Jagielski IMPL_LINK( NavigatorTree, OnEdit, void*, EMPTYARG ) 1614*b1cdbd2cSJim Jagielski { 1615*b1cdbd2cSJim Jagielski nEditEvent = 0; 1616*b1cdbd2cSJim Jagielski EditEntry( m_pEditEntry ); 1617*b1cdbd2cSJim Jagielski m_pEditEntry = NULL; 1618*b1cdbd2cSJim Jagielski 1619*b1cdbd2cSJim Jagielski return 0L; 1620*b1cdbd2cSJim Jagielski } 1621*b1cdbd2cSJim Jagielski 1622*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IMPL_LINK(NavigatorTree,OnDropActionTimer,void *,EMPTYARG)1623*b1cdbd2cSJim Jagielski IMPL_LINK( NavigatorTree, OnDropActionTimer, void*, EMPTYARG ) 1624*b1cdbd2cSJim Jagielski { 1625*b1cdbd2cSJim Jagielski if (--m_aTimerCounter > 0) 1626*b1cdbd2cSJim Jagielski return 0L; 1627*b1cdbd2cSJim Jagielski 1628*b1cdbd2cSJim Jagielski switch ( m_aDropActionType ) 1629*b1cdbd2cSJim Jagielski { 1630*b1cdbd2cSJim Jagielski case DA_EXPANDNODE: 1631*b1cdbd2cSJim Jagielski { 1632*b1cdbd2cSJim Jagielski SvLBoxEntry* pToExpand = GetEntry(m_aTimerTriggered); 1633*b1cdbd2cSJim Jagielski if (pToExpand && (GetChildCount(pToExpand) > 0) && !IsExpanded(pToExpand)) 1634*b1cdbd2cSJim Jagielski // tja, eigentlich muesste ich noch testen, ob die Node nicht schon expandiert ist, aber ich 1635*b1cdbd2cSJim Jagielski // habe dazu weder in den Basisklassen noch im Model eine Methode gefunden ... 1636*b1cdbd2cSJim Jagielski // aber ich denke, die BK sollte es auch so vertragen 1637*b1cdbd2cSJim Jagielski Expand(pToExpand); 1638*b1cdbd2cSJim Jagielski 1639*b1cdbd2cSJim Jagielski // nach dem Expand habe ich im Gegensatz zum Scrollen natuerlich nix mehr zu tun 1640*b1cdbd2cSJim Jagielski m_aDropActionTimer.Stop(); 1641*b1cdbd2cSJim Jagielski } 1642*b1cdbd2cSJim Jagielski break; 1643*b1cdbd2cSJim Jagielski 1644*b1cdbd2cSJim Jagielski case DA_SCROLLUP : 1645*b1cdbd2cSJim Jagielski ScrollOutputArea( 1 ); 1646*b1cdbd2cSJim Jagielski m_aTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS; 1647*b1cdbd2cSJim Jagielski break; 1648*b1cdbd2cSJim Jagielski 1649*b1cdbd2cSJim Jagielski case DA_SCROLLDOWN : 1650*b1cdbd2cSJim Jagielski ScrollOutputArea( -1 ); 1651*b1cdbd2cSJim Jagielski m_aTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS; 1652*b1cdbd2cSJim Jagielski break; 1653*b1cdbd2cSJim Jagielski 1654*b1cdbd2cSJim Jagielski } 1655*b1cdbd2cSJim Jagielski 1656*b1cdbd2cSJim Jagielski return 0L; 1657*b1cdbd2cSJim Jagielski } 1658*b1cdbd2cSJim Jagielski 1659*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ 1660*b1cdbd2cSJim Jagielski IMPL_LINK(NavigatorTree, OnEntrySelDesel, NavigatorTree*, /*pThis*/) 1661*b1cdbd2cSJim Jagielski { 1662*b1cdbd2cSJim Jagielski m_sdiState = SDI_DIRTY; 1663*b1cdbd2cSJim Jagielski 1664*b1cdbd2cSJim Jagielski if (IsSelectionHandlingLocked()) 1665*b1cdbd2cSJim Jagielski return 0L; 1666*b1cdbd2cSJim Jagielski 1667*b1cdbd2cSJim Jagielski if (m_aSynchronizeTimer.IsActive()) 1668*b1cdbd2cSJim Jagielski m_aSynchronizeTimer.Stop(); 1669*b1cdbd2cSJim Jagielski 1670*b1cdbd2cSJim Jagielski m_aSynchronizeTimer.SetTimeout(EXPLORER_SYNC_DELAY); 1671*b1cdbd2cSJim Jagielski m_aSynchronizeTimer.Start(); 1672*b1cdbd2cSJim Jagielski 1673*b1cdbd2cSJim Jagielski return 0L; 1674*b1cdbd2cSJim Jagielski } 1675*b1cdbd2cSJim Jagielski 1676*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IMPL_LINK(NavigatorTree,OnSynchronizeTimer,void *,EMPTYARG)1677*b1cdbd2cSJim Jagielski IMPL_LINK(NavigatorTree, OnSynchronizeTimer, void*, EMPTYARG) 1678*b1cdbd2cSJim Jagielski { 1679*b1cdbd2cSJim Jagielski SynchronizeMarkList(); 1680*b1cdbd2cSJim Jagielski return 0L; 1681*b1cdbd2cSJim Jagielski } 1682*b1cdbd2cSJim Jagielski 1683*b1cdbd2cSJim Jagielski 1684*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IMPL_LINK(NavigatorTree,OnClipboardAction,void *,EMPTYARG)1685*b1cdbd2cSJim Jagielski IMPL_LINK( NavigatorTree, OnClipboardAction, void*, EMPTYARG ) 1686*b1cdbd2cSJim Jagielski { 1687*b1cdbd2cSJim Jagielski if ( !m_aControlExchange.isClipboardOwner() ) 1688*b1cdbd2cSJim Jagielski { 1689*b1cdbd2cSJim Jagielski if ( doingKeyboardCut() ) 1690*b1cdbd2cSJim Jagielski { 1691*b1cdbd2cSJim Jagielski for ( ListBoxEntrySet::const_iterator i = m_aCutEntries.begin(); 1692*b1cdbd2cSJim Jagielski i != m_aCutEntries.end(); 1693*b1cdbd2cSJim Jagielski ++i 1694*b1cdbd2cSJim Jagielski ) 1695*b1cdbd2cSJim Jagielski { 1696*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = *i; 1697*b1cdbd2cSJim Jagielski if ( !pEntry ) 1698*b1cdbd2cSJim Jagielski continue; 1699*b1cdbd2cSJim Jagielski 1700*b1cdbd2cSJim Jagielski pEntry->SetFlags( pEntry->GetFlags() & ~SV_ENTRYFLAG_SEMITRANSPARENT ); 1701*b1cdbd2cSJim Jagielski InvalidateEntry( pEntry ); 1702*b1cdbd2cSJim Jagielski } 1703*b1cdbd2cSJim Jagielski ListBoxEntrySet aEmpty; 1704*b1cdbd2cSJim Jagielski m_aCutEntries.swap( aEmpty ); 1705*b1cdbd2cSJim Jagielski 1706*b1cdbd2cSJim Jagielski m_bKeyboardCut = sal_False; 1707*b1cdbd2cSJim Jagielski } 1708*b1cdbd2cSJim Jagielski } 1709*b1cdbd2cSJim Jagielski return 0L; 1710*b1cdbd2cSJim Jagielski } 1711*b1cdbd2cSJim Jagielski 1712*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ ShowSelectionProperties(sal_Bool bForce)1713*b1cdbd2cSJim Jagielski void NavigatorTree::ShowSelectionProperties(sal_Bool bForce) 1714*b1cdbd2cSJim Jagielski { 1715*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::ShowSelectionProperties" ); 1716*b1cdbd2cSJim Jagielski // zuerst brauche ich die FormShell 1717*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 1718*b1cdbd2cSJim Jagielski if (!pFormShell) 1719*b1cdbd2cSJim Jagielski // keine Shell -> ich koennte kein curObject setzen -> raus 1720*b1cdbd2cSJim Jagielski return; 1721*b1cdbd2cSJim Jagielski 1722*b1cdbd2cSJim Jagielski CollectSelectionData(SDI_ALL); 1723*b1cdbd2cSJim Jagielski DBG_ASSERT( m_nFormsSelected + m_nControlsSelected + (m_bRootSelected ? 1 : 0) == m_arrCurrentSelection.Count(), 1724*b1cdbd2cSJim Jagielski "NavigatorTree::ShowSelectionProperties : selection meta data invalid !"); 1725*b1cdbd2cSJim Jagielski 1726*b1cdbd2cSJim Jagielski 1727*b1cdbd2cSJim Jagielski InterfaceBag aSelection; 1728*b1cdbd2cSJim Jagielski sal_Bool bSetSelectionAsMarkList = sal_False; 1729*b1cdbd2cSJim Jagielski 1730*b1cdbd2cSJim Jagielski if (m_bRootSelected) 1731*b1cdbd2cSJim Jagielski ; // no properties for the root, neither for single nor for multi selection 1732*b1cdbd2cSJim Jagielski else if ( m_nFormsSelected + m_nControlsSelected == 0 ) // none of the two should be less 0 1733*b1cdbd2cSJim Jagielski ; // no selection -> no properties 1734*b1cdbd2cSJim Jagielski else if ( m_nFormsSelected * m_nControlsSelected != 0 ) 1735*b1cdbd2cSJim Jagielski ; // mixed selection -> no properties 1736*b1cdbd2cSJim Jagielski else 1737*b1cdbd2cSJim Jagielski { // either only forms, or only controls are selected 1738*b1cdbd2cSJim Jagielski if (m_arrCurrentSelection.Count() == 1) 1739*b1cdbd2cSJim Jagielski { 1740*b1cdbd2cSJim Jagielski if (m_nFormsSelected > 0) 1741*b1cdbd2cSJim Jagielski { // es ist genau eine Form selektiert 1742*b1cdbd2cSJim Jagielski FmFormData* pFormData = (FmFormData*)m_arrCurrentSelection.GetObject(0)->GetUserData(); 1743*b1cdbd2cSJim Jagielski aSelection.insert( Reference< XInterface >( pFormData->GetFormIface(), UNO_QUERY ) ); 1744*b1cdbd2cSJim Jagielski } 1745*b1cdbd2cSJim Jagielski else 1746*b1cdbd2cSJim Jagielski { // es ist genau ein Control selektiert (egal ob hidden oder normal) 1747*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = (FmEntryData*)m_arrCurrentSelection.GetObject(0)->GetUserData(); 1748*b1cdbd2cSJim Jagielski 1749*b1cdbd2cSJim Jagielski aSelection.insert( Reference< XInterface >( pEntryData->GetElement(), UNO_QUERY ) ); 1750*b1cdbd2cSJim Jagielski } 1751*b1cdbd2cSJim Jagielski } 1752*b1cdbd2cSJim Jagielski else 1753*b1cdbd2cSJim Jagielski { // wir haben eine MultiSelection, also muessen wir ein MultiSet dafuer aufbauen 1754*b1cdbd2cSJim Jagielski if (m_nFormsSelected > 0) 1755*b1cdbd2cSJim Jagielski { // ... nur Forms 1756*b1cdbd2cSJim Jagielski // erstmal die PropertySet-Interfaces der Forms einsammeln 1757*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < m_nFormsSelected; ++i ) 1758*b1cdbd2cSJim Jagielski { 1759*b1cdbd2cSJim Jagielski FmFormData* pFormData = (FmFormData*)m_arrCurrentSelection.GetObject((sal_uInt16)i)->GetUserData(); 1760*b1cdbd2cSJim Jagielski aSelection.insert( pFormData->GetPropertySet().get() ); 1761*b1cdbd2cSJim Jagielski } 1762*b1cdbd2cSJim Jagielski } 1763*b1cdbd2cSJim Jagielski else 1764*b1cdbd2cSJim Jagielski { // ... nur Controls 1765*b1cdbd2cSJim Jagielski if (m_nHiddenControls == m_nControlsSelected) 1766*b1cdbd2cSJim Jagielski { // ein MultiSet fuer die Properties der hidden controls 1767*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < m_nHiddenControls; ++i ) 1768*b1cdbd2cSJim Jagielski { 1769*b1cdbd2cSJim Jagielski FmEntryData* pEntryData = (FmEntryData*)m_arrCurrentSelection.GetObject((sal_uInt16)i)->GetUserData(); 1770*b1cdbd2cSJim Jagielski aSelection.insert( pEntryData->GetPropertySet().get() ); 1771*b1cdbd2cSJim Jagielski } 1772*b1cdbd2cSJim Jagielski } 1773*b1cdbd2cSJim Jagielski else if (m_nHiddenControls == 0) 1774*b1cdbd2cSJim Jagielski { // nur normale Controls 1775*b1cdbd2cSJim Jagielski bSetSelectionAsMarkList = sal_True; 1776*b1cdbd2cSJim Jagielski } 1777*b1cdbd2cSJim Jagielski } 1778*b1cdbd2cSJim Jagielski } 1779*b1cdbd2cSJim Jagielski 1780*b1cdbd2cSJim Jagielski } 1781*b1cdbd2cSJim Jagielski 1782*b1cdbd2cSJim Jagielski // und dann meine Form und mein SelObject 1783*b1cdbd2cSJim Jagielski if ( bSetSelectionAsMarkList ) 1784*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->setCurrentSelectionFromMark( pFormShell->GetFormView()->GetMarkedObjectList() ); 1785*b1cdbd2cSJim Jagielski else 1786*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->setCurrentSelection( aSelection ); 1787*b1cdbd2cSJim Jagielski 1788*b1cdbd2cSJim Jagielski if ( pFormShell->GetImpl()->IsPropBrwOpen() || bForce ) 1789*b1cdbd2cSJim Jagielski { 1790*b1cdbd2cSJim Jagielski // und jetzt kann ich das Ganze dem PropertyBrowser uebergeben 1791*b1cdbd2cSJim Jagielski pFormShell->GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( SID_FM_SHOW_PROPERTY_BROWSER, SFX_CALLMODE_ASYNCHRON ); 1792*b1cdbd2cSJim Jagielski } 1793*b1cdbd2cSJim Jagielski } 1794*b1cdbd2cSJim Jagielski 1795*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ DeleteSelection()1796*b1cdbd2cSJim Jagielski void NavigatorTree::DeleteSelection() 1797*b1cdbd2cSJim Jagielski { 1798*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::DeleteSelection" ); 1799*b1cdbd2cSJim Jagielski // die Root darf ich natuerlich nicht mitloeschen 1800*b1cdbd2cSJim Jagielski sal_Bool bRootSelected = IsSelected(m_pRootEntry); 1801*b1cdbd2cSJim Jagielski sal_uIntPtr nSelectedEntries = GetSelectionCount(); 1802*b1cdbd2cSJim Jagielski if (bRootSelected && (nSelectedEntries > 1)) // die Root plus andere Elemente ? 1803*b1cdbd2cSJim Jagielski Select(m_pRootEntry, sal_False); // ja -> die Root raus 1804*b1cdbd2cSJim Jagielski 1805*b1cdbd2cSJim Jagielski if ((nSelectedEntries == 0) || bRootSelected) // immer noch die Root ? 1806*b1cdbd2cSJim Jagielski return; // -> sie ist das einzige selektierte -> raus 1807*b1cdbd2cSJim Jagielski 1808*b1cdbd2cSJim Jagielski DBG_ASSERT(!m_bPrevSelectionMixed, "NavigatorTree::DeleteSelection() : loeschen nicht erlaubt wenn Markierung und Selektion nciht konsistent"); 1809*b1cdbd2cSJim Jagielski 1810*b1cdbd2cSJim Jagielski // ich brauche unten das FormModel ... 1811*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 1812*b1cdbd2cSJim Jagielski if (!pFormShell) 1813*b1cdbd2cSJim Jagielski return; 1814*b1cdbd2cSJim Jagielski FmFormModel* pFormModel = pFormShell ? pFormShell->GetFormModel() : NULL; 1815*b1cdbd2cSJim Jagielski if (!pFormModel) 1816*b1cdbd2cSJim Jagielski return; 1817*b1cdbd2cSJim Jagielski 1818*b1cdbd2cSJim Jagielski // jetzt muss ich noch die DeleteList etwas absichern : wenn man ein Formular und ein abhaengiges 1819*b1cdbd2cSJim Jagielski // Element loescht - und zwar in dieser Reihenfolge - dann ist der SvLBoxEntryPtr des abhaengigen Elementes 1820*b1cdbd2cSJim Jagielski // natuerlich schon ungueltig, wenn es geloescht werden soll ... diesen GPF, den es dann mit Sicherheit gibt, 1821*b1cdbd2cSJim Jagielski // gilt es zu verhindern, also die 'normalisierte' Liste 1822*b1cdbd2cSJim Jagielski CollectSelectionData( SDI_NORMALIZED ); 1823*b1cdbd2cSJim Jagielski 1824*b1cdbd2cSJim Jagielski // see below for why we need this mapping from models to shapes 1825*b1cdbd2cSJim Jagielski FmFormView* pFormView = pFormShell->GetFormView(); 1826*b1cdbd2cSJim Jagielski SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : NULL; 1827*b1cdbd2cSJim Jagielski SdrPage* pPage = pPageView ? pPageView->GetPage() : NULL; 1828*b1cdbd2cSJim Jagielski DBG_ASSERT( pPage, "NavigatorTree::DeleteSelection: invalid form page!" ); 1829*b1cdbd2cSJim Jagielski 1830*b1cdbd2cSJim Jagielski MapModelToShape aModelShapes; 1831*b1cdbd2cSJim Jagielski if ( pPage ) 1832*b1cdbd2cSJim Jagielski collectShapeModelMapping( pPage, aModelShapes ); 1833*b1cdbd2cSJim Jagielski 1834*b1cdbd2cSJim Jagielski // problem: we have to use ExplorerModel::Remove, since only this one properly deletes Form objects. 1835*b1cdbd2cSJim Jagielski // But, the controls themself must be deleted via DeleteMarked (else, the Writer has some problems 1836*b1cdbd2cSJim Jagielski // somewhere). In case I'd first delete the structure, then the controls, the UNDO would not work 1837*b1cdbd2cSJim Jagielski // (since UNDO then would mean to first restore the controls, then the structure, means their parent 1838*b1cdbd2cSJim Jagielski // form). The other way round, the EntryDatas would be invalid, if I'd first delete the controls and 1839*b1cdbd2cSJim Jagielski // then go on to the strucure. This means I have to delete the forms *after* the normal controls, so 1840*b1cdbd2cSJim Jagielski // that during UNDO, they're restored in the proper order. 1841*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->EnableTrackProperties(sal_False); 1842*b1cdbd2cSJim Jagielski sal_uInt16 i; 1843*b1cdbd2cSJim Jagielski for (i = m_arrCurrentSelection.Count(); i>0; --i) 1844*b1cdbd2cSJim Jagielski { 1845*b1cdbd2cSJim Jagielski FmEntryData* pCurrent = (FmEntryData*)(m_arrCurrentSelection.GetObject(i - 1)->GetUserData()); 1846*b1cdbd2cSJim Jagielski 1847*b1cdbd2cSJim Jagielski // eine Form ? 1848*b1cdbd2cSJim Jagielski sal_Bool bIsForm = pCurrent->ISA(FmFormData); 1849*b1cdbd2cSJim Jagielski 1850*b1cdbd2cSJim Jagielski // da ich das Loeschen im folgenden der View ueberlasse und dabei auf deren MarkList aufbaue, im Normalfall aber bei 1851*b1cdbd2cSJim Jagielski // einem makierten Formular nur die direkt, nicht die indirekt abhaengigen Controls markiert werden, muss ich das hier 1852*b1cdbd2cSJim Jagielski // noch nachholen 1853*b1cdbd2cSJim Jagielski if (bIsForm) 1854*b1cdbd2cSJim Jagielski MarkViewObj((FmFormData*)pCurrent, sal_True, sal_True); // das zweite sal_True heisst "deep" 1855*b1cdbd2cSJim Jagielski 1856*b1cdbd2cSJim Jagielski // ein hidden control ? 1857*b1cdbd2cSJim Jagielski sal_Bool bIsHidden = IsHiddenControl(pCurrent); 1858*b1cdbd2cSJim Jagielski 1859*b1cdbd2cSJim Jagielski // Forms und hidden Controls muss ich behalten, alles andere nicht 1860*b1cdbd2cSJim Jagielski if (!bIsForm && !bIsHidden) 1861*b1cdbd2cSJim Jagielski { 1862*b1cdbd2cSJim Jagielski // well, no form and no hidden control -> we can remove it from m_arrCurrentSelection, as it will 1863*b1cdbd2cSJim Jagielski // be deleted automatically. This is because for every model (except forms and hidden control models) 1864*b1cdbd2cSJim Jagielski // there exist a shape, which is marked _if_and_only_if_ the model is selected in our tree. 1865*b1cdbd2cSJim Jagielski if ( aModelShapes.find( pCurrent->GetElement() ) != aModelShapes.end() ) 1866*b1cdbd2cSJim Jagielski { 1867*b1cdbd2cSJim Jagielski // if there's a shape for the current entry, then either it is marked or it is in a 1868*b1cdbd2cSJim Jagielski // hidden layer (#i28502#), or something like this. 1869*b1cdbd2cSJim Jagielski // In the first case, it will be deleted below, in the second case, we currently don't 1870*b1cdbd2cSJim Jagielski // delete it, as there's no real (working!) API for this, neither in UNO nor in non-UNO. 1871*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Remove( i - 1, 1 ); 1872*b1cdbd2cSJim Jagielski } 1873*b1cdbd2cSJim Jagielski // In case there is no shape for the current entry, we keep the entry in m_arrCurrentSelection, 1874*b1cdbd2cSJim Jagielski // since then we can definately remove it. 1875*b1cdbd2cSJim Jagielski // #103597# 1876*b1cdbd2cSJim Jagielski } 1877*b1cdbd2cSJim Jagielski } 1878*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->EnableTrackProperties(sal_True); 1879*b1cdbd2cSJim Jagielski 1880*b1cdbd2cSJim Jagielski // let the view delete the marked controls 1881*b1cdbd2cSJim Jagielski pFormShell->GetFormView()->DeleteMarked(); 1882*b1cdbd2cSJim Jagielski 1883*b1cdbd2cSJim Jagielski // start UNDO at this point. Unfortunately, this results in 2 UNDO actions, since DeleteMarked is 1884*b1cdbd2cSJim Jagielski // creating an own one. However, if we'd move it before DeleteMarked, Writer does not really like 1885*b1cdbd2cSJim Jagielski // this ... :( 1886*b1cdbd2cSJim Jagielski // 2004-07-05 - #i31038# - fs@openoffice.org 1887*b1cdbd2cSJim Jagielski { 1888*b1cdbd2cSJim Jagielski // --------------- 1889*b1cdbd2cSJim Jagielski // initialize UNDO 1890*b1cdbd2cSJim Jagielski String aUndoStr; 1891*b1cdbd2cSJim Jagielski if ( m_arrCurrentSelection.Count() == 1 ) 1892*b1cdbd2cSJim Jagielski { 1893*b1cdbd2cSJim Jagielski aUndoStr = SVX_RES(RID_STR_UNDO_CONTAINER_REMOVE); 1894*b1cdbd2cSJim Jagielski if (m_nFormsSelected) 1895*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplaceAscii( "#", SVX_RES( RID_STR_FORM ) ); 1896*b1cdbd2cSJim Jagielski else 1897*b1cdbd2cSJim Jagielski // it must be a control (else the root would be selected, but it cannot be deleted) 1898*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplaceAscii( "#", SVX_RES( RID_STR_CONTROL ) ); 1899*b1cdbd2cSJim Jagielski } 1900*b1cdbd2cSJim Jagielski else 1901*b1cdbd2cSJim Jagielski { 1902*b1cdbd2cSJim Jagielski aUndoStr = SVX_RES(RID_STR_UNDO_CONTAINER_REMOVE_MULTIPLE); 1903*b1cdbd2cSJim Jagielski aUndoStr.SearchAndReplaceAscii( "#", String::CreateFromInt32( m_arrCurrentSelection.Count() ) ); 1904*b1cdbd2cSJim Jagielski } 1905*b1cdbd2cSJim Jagielski pFormModel->BegUndo(aUndoStr); 1906*b1cdbd2cSJim Jagielski } 1907*b1cdbd2cSJim Jagielski 1908*b1cdbd2cSJim Jagielski // remove remaining structure 1909*b1cdbd2cSJim Jagielski for (i=0; i<m_arrCurrentSelection.Count(); ++i) 1910*b1cdbd2cSJim Jagielski { 1911*b1cdbd2cSJim Jagielski FmEntryData* pCurrent = (FmEntryData*)(m_arrCurrentSelection.GetObject(i)->GetUserData()); 1912*b1cdbd2cSJim Jagielski 1913*b1cdbd2cSJim Jagielski // if the entry still has children, we skipped deletion of one of those children. 1914*b1cdbd2cSJim Jagielski // This may for instance be because the shape is in a hidden layer, where we're unable 1915*b1cdbd2cSJim Jagielski // to remove it 1916*b1cdbd2cSJim Jagielski if ( pCurrent->GetChildList()->Count() ) 1917*b1cdbd2cSJim Jagielski continue; 1918*b1cdbd2cSJim Jagielski 1919*b1cdbd2cSJim Jagielski // noch ein kleines Problem, bevor ich das ganz loesche : wenn es eine Form ist und die Shell diese als CurrentObject 1920*b1cdbd2cSJim Jagielski // kennt, dann muss ich ihr das natuerlich ausreden 1921*b1cdbd2cSJim Jagielski if (pCurrent->ISA(FmFormData)) 1922*b1cdbd2cSJim Jagielski { 1923*b1cdbd2cSJim Jagielski Reference< XForm > xCurrentForm( static_cast< FmFormData* >( pCurrent )->GetFormIface() ); 1924*b1cdbd2cSJim Jagielski if ( pFormShell->GetImpl()->getCurrentForm() == xCurrentForm ) // die Shell kennt die zu loeschende Form ? 1925*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->forgetCurrentForm(); // -> wegnehmen ... 1926*b1cdbd2cSJim Jagielski } 1927*b1cdbd2cSJim Jagielski GetNavModel()->Remove(pCurrent, sal_True); 1928*b1cdbd2cSJim Jagielski } 1929*b1cdbd2cSJim Jagielski pFormModel->EndUndo(); 1930*b1cdbd2cSJim Jagielski } 1931*b1cdbd2cSJim Jagielski 1932*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ CollectSelectionData(SELDATA_ITEMS sdiHow)1933*b1cdbd2cSJim Jagielski void NavigatorTree::CollectSelectionData(SELDATA_ITEMS sdiHow) 1934*b1cdbd2cSJim Jagielski { 1935*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::CollectSelectionData" ); 1936*b1cdbd2cSJim Jagielski DBG_ASSERT(sdiHow != SDI_DIRTY, "NavigatorTree::CollectSelectionData : ever thought about your parameter ? DIRTY ?"); 1937*b1cdbd2cSJim Jagielski if (sdiHow == m_sdiState) 1938*b1cdbd2cSJim Jagielski return; 1939*b1cdbd2cSJim Jagielski 1940*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Remove((sal_uInt16)0, m_arrCurrentSelection.Count()); 1941*b1cdbd2cSJim Jagielski m_nFormsSelected = m_nControlsSelected = m_nHiddenControls = 0; 1942*b1cdbd2cSJim Jagielski m_bRootSelected = sal_False; 1943*b1cdbd2cSJim Jagielski 1944*b1cdbd2cSJim Jagielski SvLBoxEntry* pSelectionLoop = FirstSelected(); 1945*b1cdbd2cSJim Jagielski while (pSelectionLoop) 1946*b1cdbd2cSJim Jagielski { 1947*b1cdbd2cSJim Jagielski // erst mal die Zaehlung der verschiedenen Elemente 1948*b1cdbd2cSJim Jagielski if (pSelectionLoop == m_pRootEntry) 1949*b1cdbd2cSJim Jagielski m_bRootSelected = sal_True; 1950*b1cdbd2cSJim Jagielski else 1951*b1cdbd2cSJim Jagielski { 1952*b1cdbd2cSJim Jagielski if (IsFormEntry(pSelectionLoop)) 1953*b1cdbd2cSJim Jagielski ++m_nFormsSelected; 1954*b1cdbd2cSJim Jagielski else 1955*b1cdbd2cSJim Jagielski { 1956*b1cdbd2cSJim Jagielski ++m_nControlsSelected; 1957*b1cdbd2cSJim Jagielski if (IsHiddenControl((FmEntryData*)(pSelectionLoop->GetUserData()))) 1958*b1cdbd2cSJim Jagielski ++m_nHiddenControls; 1959*b1cdbd2cSJim Jagielski } 1960*b1cdbd2cSJim Jagielski } 1961*b1cdbd2cSJim Jagielski 1962*b1cdbd2cSJim Jagielski if (sdiHow == SDI_NORMALIZED) 1963*b1cdbd2cSJim Jagielski { 1964*b1cdbd2cSJim Jagielski // alles, was schon einen selektierten Vorfahr hat, nicht mitnehmen 1965*b1cdbd2cSJim Jagielski if (pSelectionLoop == m_pRootEntry) 1966*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Insert(pSelectionLoop); 1967*b1cdbd2cSJim Jagielski else 1968*b1cdbd2cSJim Jagielski { 1969*b1cdbd2cSJim Jagielski SvLBoxEntry* pParentLoop = GetParent(pSelectionLoop); 1970*b1cdbd2cSJim Jagielski while (pParentLoop) 1971*b1cdbd2cSJim Jagielski { 1972*b1cdbd2cSJim Jagielski // eigentlich muesste ich testen, ob das Parent in der m_arrCurrentSelection steht ... 1973*b1cdbd2cSJim Jagielski // Aber wenn es selektiert ist, dann steht es in m_arrCurrentSelection, oder wenigstens einer seiner Vorfahren, 1974*b1cdbd2cSJim Jagielski // wenn der auch schon selektiert war. In beiden Faellen reicht also die Abfrage IsSelected 1975*b1cdbd2cSJim Jagielski if (IsSelected(pParentLoop)) 1976*b1cdbd2cSJim Jagielski break; 1977*b1cdbd2cSJim Jagielski else 1978*b1cdbd2cSJim Jagielski { 1979*b1cdbd2cSJim Jagielski if (m_pRootEntry == pParentLoop) 1980*b1cdbd2cSJim Jagielski { 1981*b1cdbd2cSJim Jagielski // bis (exclusive) zur Root gab es kein selektiertes Parent -> der Eintrag gehoert in die normalisierte Liste 1982*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Insert(pSelectionLoop); 1983*b1cdbd2cSJim Jagielski break; 1984*b1cdbd2cSJim Jagielski } 1985*b1cdbd2cSJim Jagielski else 1986*b1cdbd2cSJim Jagielski pParentLoop = GetParent(pParentLoop); 1987*b1cdbd2cSJim Jagielski } 1988*b1cdbd2cSJim Jagielski } 1989*b1cdbd2cSJim Jagielski } 1990*b1cdbd2cSJim Jagielski } 1991*b1cdbd2cSJim Jagielski else if (sdiHow == SDI_NORMALIZED_FORMARK) 1992*b1cdbd2cSJim Jagielski { 1993*b1cdbd2cSJim Jagielski SvLBoxEntry* pParent = GetParent(pSelectionLoop); 1994*b1cdbd2cSJim Jagielski if (!pParent || !IsSelected(pParent) || IsFormEntry(pSelectionLoop)) 1995*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Insert(pSelectionLoop); 1996*b1cdbd2cSJim Jagielski } 1997*b1cdbd2cSJim Jagielski else 1998*b1cdbd2cSJim Jagielski m_arrCurrentSelection.Insert(pSelectionLoop); 1999*b1cdbd2cSJim Jagielski 2000*b1cdbd2cSJim Jagielski 2001*b1cdbd2cSJim Jagielski pSelectionLoop = NextSelected(pSelectionLoop); 2002*b1cdbd2cSJim Jagielski } 2003*b1cdbd2cSJim Jagielski 2004*b1cdbd2cSJim Jagielski m_sdiState = sdiHow; 2005*b1cdbd2cSJim Jagielski } 2006*b1cdbd2cSJim Jagielski 2007*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ SynchronizeSelection(FmEntryDataArray & arredToSelect)2008*b1cdbd2cSJim Jagielski void NavigatorTree::SynchronizeSelection(FmEntryDataArray& arredToSelect) 2009*b1cdbd2cSJim Jagielski { 2010*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::SynchronizeSelection" ); 2011*b1cdbd2cSJim Jagielski LockSelectionHandling(); 2012*b1cdbd2cSJim Jagielski if (arredToSelect.Count() == 0) 2013*b1cdbd2cSJim Jagielski { 2014*b1cdbd2cSJim Jagielski SelectAll(sal_False); 2015*b1cdbd2cSJim Jagielski } 2016*b1cdbd2cSJim Jagielski else 2017*b1cdbd2cSJim Jagielski { 2018*b1cdbd2cSJim Jagielski // erst mal gleiche ich meine aktuelle Selektion mit der geforderten SelectList ab 2019*b1cdbd2cSJim Jagielski SvLBoxEntry* pSelection = FirstSelected(); 2020*b1cdbd2cSJim Jagielski while (pSelection) 2021*b1cdbd2cSJim Jagielski { 2022*b1cdbd2cSJim Jagielski FmEntryData* pCurrent = (FmEntryData*)pSelection->GetUserData(); 2023*b1cdbd2cSJim Jagielski if (pCurrent != NULL) 2024*b1cdbd2cSJim Jagielski { 2025*b1cdbd2cSJim Jagielski sal_uInt16 nPosition; 2026*b1cdbd2cSJim Jagielski if ( arredToSelect.Seek_Entry(pCurrent, &nPosition) ) 2027*b1cdbd2cSJim Jagielski { // der Entry ist schon selektiert, steht aber auch in der SelectList -> er kann aus letzterer 2028*b1cdbd2cSJim Jagielski // raus 2029*b1cdbd2cSJim Jagielski arredToSelect.Remove(nPosition, 1); 2030*b1cdbd2cSJim Jagielski } else 2031*b1cdbd2cSJim Jagielski { // der Entry ist selektiert, aber steht nicht in der SelectList -> Selektion rausnehmen 2032*b1cdbd2cSJim Jagielski Select(pSelection, sal_False); 2033*b1cdbd2cSJim Jagielski // und sichtbar machen (kann ja sein, dass das die einzige Modifikation ist, die ich hier in dem 2034*b1cdbd2cSJim Jagielski // ganzen Handler mache, dann sollte das zu sehen sein) 2035*b1cdbd2cSJim Jagielski MakeVisible(pSelection); 2036*b1cdbd2cSJim Jagielski } 2037*b1cdbd2cSJim Jagielski } 2038*b1cdbd2cSJim Jagielski else 2039*b1cdbd2cSJim Jagielski Select(pSelection, sal_False); 2040*b1cdbd2cSJim Jagielski 2041*b1cdbd2cSJim Jagielski pSelection = NextSelected(pSelection); 2042*b1cdbd2cSJim Jagielski } 2043*b1cdbd2cSJim Jagielski 2044*b1cdbd2cSJim Jagielski // jetzt habe ich in der SelectList genau die Eintraege, die noch selektiert werden muessen 2045*b1cdbd2cSJim Jagielski // zwei Moeglichkeiten : 1) ich gehe durch die SelectList, besorge mir zu jedem Eintrag meinen SvLBoxEntry 2046*b1cdbd2cSJim Jagielski // und selektiere diesen (waere irgendwie intuitiver ;)) 2) ich gehe durch alle meine SvLBoxEntries und selektiere 2047*b1cdbd2cSJim Jagielski // genau die, die ich in der SelectList finde 2048*b1cdbd2cSJim Jagielski // 1) braucht O(k*n) (k=Laenge der SelectList, n=Anzahl meiner Entries), plus den Fakt, dass FindEntry nicht den 2049*b1cdbd2cSJim Jagielski // Pointer auf die UserDaten vergleicht, sondern ein aufwendigeres IsEqualWithoutChilds durchfuehrt 2050*b1cdbd2cSJim Jagielski // 2) braucht O(n*log k), dupliziert aber etwas Code (naemlich den aus FindEntry) 2051*b1cdbd2cSJim Jagielski // da das hier eine relativ oft aufgerufenen Stelle sein koennte (bei jeder Aenderung in der Markierung in der View !), 2052*b1cdbd2cSJim Jagielski // nehme ich doch lieber letzteres 2053*b1cdbd2cSJim Jagielski SvLBoxEntry* pLoop = First(); 2054*b1cdbd2cSJim Jagielski while( pLoop ) 2055*b1cdbd2cSJim Jagielski { 2056*b1cdbd2cSJim Jagielski FmEntryData* pCurEntryData = (FmEntryData*)pLoop->GetUserData(); 2057*b1cdbd2cSJim Jagielski sal_uInt16 nPosition; 2058*b1cdbd2cSJim Jagielski if ( arredToSelect.Seek_Entry(pCurEntryData, &nPosition) ) 2059*b1cdbd2cSJim Jagielski { 2060*b1cdbd2cSJim Jagielski Select(pLoop, sal_True); 2061*b1cdbd2cSJim Jagielski MakeVisible(pLoop); 2062*b1cdbd2cSJim Jagielski SetCursor(pLoop, sal_True); 2063*b1cdbd2cSJim Jagielski } 2064*b1cdbd2cSJim Jagielski 2065*b1cdbd2cSJim Jagielski pLoop = Next( pLoop ); 2066*b1cdbd2cSJim Jagielski } 2067*b1cdbd2cSJim Jagielski } 2068*b1cdbd2cSJim Jagielski UnlockSelectionHandling(); 2069*b1cdbd2cSJim Jagielski } 2070*b1cdbd2cSJim Jagielski 2071*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ SynchronizeSelection()2072*b1cdbd2cSJim Jagielski void NavigatorTree::SynchronizeSelection() 2073*b1cdbd2cSJim Jagielski { 2074*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::SynchronizeSelection" ); 2075*b1cdbd2cSJim Jagielski // Shell und View 2076*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 2077*b1cdbd2cSJim Jagielski if(!pFormShell) return; 2078*b1cdbd2cSJim Jagielski 2079*b1cdbd2cSJim Jagielski FmFormView* pFormView = pFormShell->GetFormView(); 2080*b1cdbd2cSJim Jagielski if (!pFormView) return; 2081*b1cdbd2cSJim Jagielski 2082*b1cdbd2cSJim Jagielski GetNavModel()->BroadcastMarkedObjects(pFormView->GetMarkedObjectList()); 2083*b1cdbd2cSJim Jagielski } 2084*b1cdbd2cSJim Jagielski 2085*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ SynchronizeMarkList()2086*b1cdbd2cSJim Jagielski void NavigatorTree::SynchronizeMarkList() 2087*b1cdbd2cSJim Jagielski { 2088*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::SynchronizeMarkList" ); 2089*b1cdbd2cSJim Jagielski // die Shell werde ich brauchen ... 2090*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 2091*b1cdbd2cSJim Jagielski if (!pFormShell) return; 2092*b1cdbd2cSJim Jagielski 2093*b1cdbd2cSJim Jagielski CollectSelectionData(SDI_NORMALIZED_FORMARK); 2094*b1cdbd2cSJim Jagielski 2095*b1cdbd2cSJim Jagielski // Die View soll jetzt kein Notify bei einer Aenderung der MarkList rauslassen 2096*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->EnableTrackProperties(sal_False); 2097*b1cdbd2cSJim Jagielski 2098*b1cdbd2cSJim Jagielski UnmarkAllViewObj(); 2099*b1cdbd2cSJim Jagielski 2100*b1cdbd2cSJim Jagielski for (sal_uInt32 i=0; i<m_arrCurrentSelection.Count(); ++i) 2101*b1cdbd2cSJim Jagielski { 2102*b1cdbd2cSJim Jagielski SvLBoxEntry* pSelectionLoop = m_arrCurrentSelection.GetObject((sal_uInt16)i); 2103*b1cdbd2cSJim Jagielski // Bei Formselektion alle Controls dieser Form markieren 2104*b1cdbd2cSJim Jagielski if (IsFormEntry(pSelectionLoop) && (pSelectionLoop != m_pRootEntry)) 2105*b1cdbd2cSJim Jagielski MarkViewObj((FmFormData*)pSelectionLoop->GetUserData(), sal_True, sal_False); 2106*b1cdbd2cSJim Jagielski 2107*b1cdbd2cSJim Jagielski // Bei Controlselektion Control-SdrObjects markieren 2108*b1cdbd2cSJim Jagielski else if (IsFormComponentEntry(pSelectionLoop)) 2109*b1cdbd2cSJim Jagielski { 2110*b1cdbd2cSJim Jagielski FmControlData* pControlData = (FmControlData*)pSelectionLoop->GetUserData(); 2111*b1cdbd2cSJim Jagielski if (pControlData) 2112*b1cdbd2cSJim Jagielski { 2113*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////// 2114*b1cdbd2cSJim Jagielski // Beim HiddenControl kann kein Object selektiert werden 2115*b1cdbd2cSJim Jagielski Reference< XFormComponent > xFormComponent( pControlData->GetFormComponent()); 2116*b1cdbd2cSJim Jagielski if (!xFormComponent.is()) 2117*b1cdbd2cSJim Jagielski continue; 2118*b1cdbd2cSJim Jagielski Reference< XPropertySet > xSet(xFormComponent, UNO_QUERY); 2119*b1cdbd2cSJim Jagielski if (!xSet.is()) 2120*b1cdbd2cSJim Jagielski continue; 2121*b1cdbd2cSJim Jagielski 2122*b1cdbd2cSJim Jagielski sal_uInt16 nClassId = ::comphelper::getINT16(xSet->getPropertyValue(FM_PROP_CLASSID)); 2123*b1cdbd2cSJim Jagielski if (nClassId != FormComponentType::HIDDENCONTROL) 2124*b1cdbd2cSJim Jagielski MarkViewObj(pControlData, sal_True, sal_True); 2125*b1cdbd2cSJim Jagielski } 2126*b1cdbd2cSJim Jagielski } 2127*b1cdbd2cSJim Jagielski } 2128*b1cdbd2cSJim Jagielski 2129*b1cdbd2cSJim Jagielski // wenn der PropertyBrowser offen ist, muss ich den entsprechend meiner Selektion anpassen 2130*b1cdbd2cSJim Jagielski // (NICHT entsprechend der MarkList der View : wenn ich ein Formular selektiert habe, sind in der 2131*b1cdbd2cSJim Jagielski // View alle zugehoerigen Controls markiert, trotzdem moechte ich natuerlich die Formular-Eigenschaften 2132*b1cdbd2cSJim Jagielski // sehen) 2133*b1cdbd2cSJim Jagielski ShowSelectionProperties(sal_False); 2134*b1cdbd2cSJim Jagielski 2135*b1cdbd2cSJim Jagielski // Flag an View wieder zuruecksetzen 2136*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->EnableTrackProperties(sal_True); 2137*b1cdbd2cSJim Jagielski 2138*b1cdbd2cSJim Jagielski // wenn jetzt genau eine Form selektiert ist, sollte die Shell das als CurrentForm mitbekommen 2139*b1cdbd2cSJim Jagielski // (wenn SelectionHandling nicht locked ist, kuemmert sich die View eigentlich in MarkListHasChanged drum, 2140*b1cdbd2cSJim Jagielski // aber der Mechanismus greift zum Beispiel nicht, wenn die Form leer ist) 2141*b1cdbd2cSJim Jagielski if ((m_arrCurrentSelection.Count() == 1) && (m_nFormsSelected == 1)) 2142*b1cdbd2cSJim Jagielski { 2143*b1cdbd2cSJim Jagielski FmFormData* pSingleSelectionData = PTR_CAST( FmFormData, static_cast< FmEntryData* >( FirstSelected()->GetUserData() ) ); 2144*b1cdbd2cSJim Jagielski DBG_ASSERT( pSingleSelectionData, "NavigatorTree::SynchronizeMarkList: invalid selected form!" ); 2145*b1cdbd2cSJim Jagielski if ( pSingleSelectionData ) 2146*b1cdbd2cSJim Jagielski { 2147*b1cdbd2cSJim Jagielski InterfaceBag aSelection; 2148*b1cdbd2cSJim Jagielski aSelection.insert( Reference< XInterface >( pSingleSelectionData->GetFormIface(), UNO_QUERY ) ); 2149*b1cdbd2cSJim Jagielski pFormShell->GetImpl()->setCurrentSelection( aSelection ); 2150*b1cdbd2cSJim Jagielski } 2151*b1cdbd2cSJim Jagielski } 2152*b1cdbd2cSJim Jagielski } 2153*b1cdbd2cSJim Jagielski 2154*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ IsHiddenControl(FmEntryData * pEntryData)2155*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::IsHiddenControl(FmEntryData* pEntryData) 2156*b1cdbd2cSJim Jagielski { 2157*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::IsHiddenControl" ); 2158*b1cdbd2cSJim Jagielski if (pEntryData == NULL) return sal_False; 2159*b1cdbd2cSJim Jagielski 2160*b1cdbd2cSJim Jagielski Reference< XPropertySet > xProperties( pEntryData->GetPropertySet() ); 2161*b1cdbd2cSJim Jagielski if (::comphelper::hasProperty(FM_PROP_CLASSID, xProperties)) 2162*b1cdbd2cSJim Jagielski { 2163*b1cdbd2cSJim Jagielski Any aClassID = xProperties->getPropertyValue( FM_PROP_CLASSID ); 2164*b1cdbd2cSJim Jagielski return (::comphelper::getINT16(aClassID) == FormComponentType::HIDDENCONTROL); 2165*b1cdbd2cSJim Jagielski } 2166*b1cdbd2cSJim Jagielski return sal_False; 2167*b1cdbd2cSJim Jagielski } 2168*b1cdbd2cSJim Jagielski 2169*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ Select(SvLBoxEntry * pEntry,sal_Bool bSelect)2170*b1cdbd2cSJim Jagielski sal_Bool NavigatorTree::Select( SvLBoxEntry* pEntry, sal_Bool bSelect ) 2171*b1cdbd2cSJim Jagielski { 2172*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::Select" ); 2173*b1cdbd2cSJim Jagielski if (bSelect == IsSelected(pEntry)) // das passiert manchmal, ich glaube, die Basisklasse geht zu sehr auf Nummer sicher ;) 2174*b1cdbd2cSJim Jagielski return sal_True; 2175*b1cdbd2cSJim Jagielski 2176*b1cdbd2cSJim Jagielski return SvTreeListBox::Select(pEntry, bSelect ); 2177*b1cdbd2cSJim Jagielski } 2178*b1cdbd2cSJim Jagielski 2179*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ UnmarkAllViewObj()2180*b1cdbd2cSJim Jagielski void NavigatorTree::UnmarkAllViewObj() 2181*b1cdbd2cSJim Jagielski { 2182*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::UnmarkAllViewObj" ); 2183*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 2184*b1cdbd2cSJim Jagielski if( !pFormShell ) 2185*b1cdbd2cSJim Jagielski return; 2186*b1cdbd2cSJim Jagielski FmFormView* pFormView = pFormShell->GetFormView(); 2187*b1cdbd2cSJim Jagielski pFormView->UnMarkAll(); 2188*b1cdbd2cSJim Jagielski } 2189*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ MarkViewObj(FmFormData * pFormData,sal_Bool bMark,sal_Bool bDeep)2190*b1cdbd2cSJim Jagielski void NavigatorTree::MarkViewObj(FmFormData* pFormData, sal_Bool bMark, sal_Bool bDeep ) 2191*b1cdbd2cSJim Jagielski { 2192*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::MarkViewObjects" ); 2193*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 2194*b1cdbd2cSJim Jagielski if( !pFormShell ) 2195*b1cdbd2cSJim Jagielski return; 2196*b1cdbd2cSJim Jagielski 2197*b1cdbd2cSJim Jagielski // first collect all sdrobjects 2198*b1cdbd2cSJim Jagielski ::std::set< Reference< XFormComponent > > aObjects; 2199*b1cdbd2cSJim Jagielski CollectObjects(pFormData,bDeep,aObjects); 2200*b1cdbd2cSJim Jagielski 2201*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 2202*b1cdbd2cSJim Jagielski // In der Page das entsprechende SdrObj finden und selektieren 2203*b1cdbd2cSJim Jagielski FmFormView* pFormView = pFormShell->GetFormView(); 2204*b1cdbd2cSJim Jagielski SdrPageView* pPageView = pFormView->GetSdrPageView(); 2205*b1cdbd2cSJim Jagielski SdrPage* pPage = pPageView->GetPage(); 2206*b1cdbd2cSJim Jagielski //FmFormPage* pFormPage = dynamic_cast< FmFormPage* >( pPage ); 2207*b1cdbd2cSJim Jagielski 2208*b1cdbd2cSJim Jagielski SdrObjListIter aIter( *pPage ); 2209*b1cdbd2cSJim Jagielski while ( aIter.IsMore() ) 2210*b1cdbd2cSJim Jagielski { 2211*b1cdbd2cSJim Jagielski SdrObject* pSdrObject = aIter.Next(); 2212*b1cdbd2cSJim Jagielski FmFormObj* pFormObject = FmFormObj::GetFormObject( pSdrObject ); 2213*b1cdbd2cSJim Jagielski if ( !pFormObject ) 2214*b1cdbd2cSJim Jagielski continue; 2215*b1cdbd2cSJim Jagielski 2216*b1cdbd2cSJim Jagielski Reference< XFormComponent > xControlModel( pFormObject->GetUnoControlModel(),UNO_QUERY ); 2217*b1cdbd2cSJim Jagielski if ( xControlModel.is() && aObjects.find(xControlModel) != aObjects.end() && bMark != pFormView->IsObjMarked( pSdrObject ) ) 2218*b1cdbd2cSJim Jagielski { 2219*b1cdbd2cSJim Jagielski // unfortunately, the writer doesn't like marking an already-marked object, again, so reset the mark first 2220*b1cdbd2cSJim Jagielski pFormView->MarkObj( pSdrObject, pPageView, !bMark, sal_False ); 2221*b1cdbd2cSJim Jagielski } 2222*b1cdbd2cSJim Jagielski } // while ( aIter.IsMore() ) 2223*b1cdbd2cSJim Jagielski if ( bMark ) 2224*b1cdbd2cSJim Jagielski { 2225*b1cdbd2cSJim Jagielski // make the mark visible 2226*b1cdbd2cSJim Jagielski ::Rectangle aMarkRect( pFormView->GetAllMarkedRect()); 2227*b1cdbd2cSJim Jagielski for ( sal_uInt32 i = 0; i < pFormView->PaintWindowCount(); ++i ) 2228*b1cdbd2cSJim Jagielski { 2229*b1cdbd2cSJim Jagielski SdrPaintWindow* pPaintWindow = pFormView->GetPaintWindow( i ); 2230*b1cdbd2cSJim Jagielski OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); 2231*b1cdbd2cSJim Jagielski if ( ( OUTDEV_WINDOW == rOutDev.GetOutDevType() ) && !aMarkRect.IsEmpty() ) 2232*b1cdbd2cSJim Jagielski { 2233*b1cdbd2cSJim Jagielski pFormView->MakeVisible( aMarkRect, (Window&)rOutDev ); 2234*b1cdbd2cSJim Jagielski } 2235*b1cdbd2cSJim Jagielski } // for ( sal_uInt32 i = 0; i < pFormView->PaintWindowCount(); ++i ) 2236*b1cdbd2cSJim Jagielski } 2237*b1cdbd2cSJim Jagielski } 2238*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ CollectObjects(FmFormData * pFormData,sal_Bool bDeep,::std::set<Reference<XFormComponent>> & _rObjects)2239*b1cdbd2cSJim Jagielski void NavigatorTree::CollectObjects(FmFormData* pFormData, sal_Bool bDeep, ::std::set< Reference< XFormComponent > >& _rObjects) 2240*b1cdbd2cSJim Jagielski { 2241*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::MarkViewObjects" ); 2242*b1cdbd2cSJim Jagielski FmEntryDataList* pChildList = pFormData->GetChildList(); 2243*b1cdbd2cSJim Jagielski FmEntryData* pEntryData; 2244*b1cdbd2cSJim Jagielski FmControlData* pControlData; 2245*b1cdbd2cSJim Jagielski for( sal_uInt32 i=0; i < pChildList->Count(); ++i ) 2246*b1cdbd2cSJim Jagielski { 2247*b1cdbd2cSJim Jagielski pEntryData = pChildList->GetObject(i); 2248*b1cdbd2cSJim Jagielski if( pEntryData->ISA(FmControlData) ) 2249*b1cdbd2cSJim Jagielski { 2250*b1cdbd2cSJim Jagielski pControlData = (FmControlData*)pEntryData; 2251*b1cdbd2cSJim Jagielski _rObjects.insert(pControlData->GetFormComponent()); 2252*b1cdbd2cSJim Jagielski } // if( pEntryData->ISA(FmControlData) ) 2253*b1cdbd2cSJim Jagielski else if (bDeep && (pEntryData->ISA(FmFormData))) 2254*b1cdbd2cSJim Jagielski CollectObjects((FmFormData*)pEntryData,bDeep,_rObjects); 2255*b1cdbd2cSJim Jagielski } // for( sal_uInt32 i=0; i<pChildList->Count(); i++ ) 2256*b1cdbd2cSJim Jagielski } 2257*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------ MarkViewObj(FmControlData * pControlData,sal_Bool bMarkHandles,sal_Bool bMark)2258*b1cdbd2cSJim Jagielski void NavigatorTree::MarkViewObj( FmControlData* pControlData, sal_Bool bMarkHandles, sal_Bool bMark) 2259*b1cdbd2cSJim Jagielski { 2260*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTree::MarkViewObj" ); 2261*b1cdbd2cSJim Jagielski if( !pControlData ) 2262*b1cdbd2cSJim Jagielski return; 2263*b1cdbd2cSJim Jagielski FmFormShell* pFormShell = GetNavModel()->GetFormShell(); 2264*b1cdbd2cSJim Jagielski if( !pFormShell ) 2265*b1cdbd2cSJim Jagielski return; 2266*b1cdbd2cSJim Jagielski 2267*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 2268*b1cdbd2cSJim Jagielski // In der Page das entsprechende SdrObj finden und selektieren 2269*b1cdbd2cSJim Jagielski FmFormView* pFormView = pFormShell->GetFormView(); 2270*b1cdbd2cSJim Jagielski Reference< XFormComponent > xFormComponent( pControlData->GetFormComponent()); 2271*b1cdbd2cSJim Jagielski SdrPageView* pPageView = pFormView->GetSdrPageView(); 2272*b1cdbd2cSJim Jagielski SdrPage* pPage = pPageView->GetPage(); 2273*b1cdbd2cSJim Jagielski 2274*b1cdbd2cSJim Jagielski bool bPaint = false; 2275*b1cdbd2cSJim Jagielski SdrObjListIter aIter( *pPage ); 2276*b1cdbd2cSJim Jagielski while ( aIter.IsMore() ) 2277*b1cdbd2cSJim Jagielski { 2278*b1cdbd2cSJim Jagielski SdrObject* pSdrObject = aIter.Next(); 2279*b1cdbd2cSJim Jagielski FmFormObj* pFormObject = FmFormObj::GetFormObject( pSdrObject ); 2280*b1cdbd2cSJim Jagielski if ( !pFormObject ) 2281*b1cdbd2cSJim Jagielski continue; 2282*b1cdbd2cSJim Jagielski 2283*b1cdbd2cSJim Jagielski Reference< XInterface > xControlModel( pFormObject->GetUnoControlModel() ); 2284*b1cdbd2cSJim Jagielski if ( xControlModel != xFormComponent ) 2285*b1cdbd2cSJim Jagielski continue; 2286*b1cdbd2cSJim Jagielski 2287*b1cdbd2cSJim Jagielski // mark the object 2288*b1cdbd2cSJim Jagielski if ( bMark != pFormView->IsObjMarked( pSdrObject ) ) 2289*b1cdbd2cSJim Jagielski // unfortunately, the writer doesn't like marking an already-marked object, again, so reset the mark first 2290*b1cdbd2cSJim Jagielski pFormView->MarkObj( pSdrObject, pPageView, !bMark, sal_False ); 2291*b1cdbd2cSJim Jagielski 2292*b1cdbd2cSJim Jagielski if ( !bMarkHandles || !bMark ) 2293*b1cdbd2cSJim Jagielski continue; 2294*b1cdbd2cSJim Jagielski 2295*b1cdbd2cSJim Jagielski bPaint = true; 2296*b1cdbd2cSJim Jagielski 2297*b1cdbd2cSJim Jagielski } // while ( aIter.IsMore() ) 2298*b1cdbd2cSJim Jagielski if ( bPaint ) 2299*b1cdbd2cSJim Jagielski { 2300*b1cdbd2cSJim Jagielski // make the mark visible 2301*b1cdbd2cSJim Jagielski ::Rectangle aMarkRect( pFormView->GetAllMarkedRect()); 2302*b1cdbd2cSJim Jagielski for ( sal_uInt32 i = 0; i < pFormView->PaintWindowCount(); ++i ) 2303*b1cdbd2cSJim Jagielski { 2304*b1cdbd2cSJim Jagielski SdrPaintWindow* pPaintWindow = pFormView->GetPaintWindow( i ); 2305*b1cdbd2cSJim Jagielski OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); 2306*b1cdbd2cSJim Jagielski if ( OUTDEV_WINDOW == rOutDev.GetOutDevType() ) 2307*b1cdbd2cSJim Jagielski { 2308*b1cdbd2cSJim Jagielski pFormView->MakeVisible( aMarkRect, (Window&)rOutDev ); 2309*b1cdbd2cSJim Jagielski } 2310*b1cdbd2cSJim Jagielski } // for ( sal_uInt32 i = 0; i < pFormView->PaintWindowCount(); ++i ) 2311*b1cdbd2cSJim Jagielski } 2312*b1cdbd2cSJim Jagielski } 2313*b1cdbd2cSJim Jagielski 2314*b1cdbd2cSJim Jagielski //............................................................................ 2315*b1cdbd2cSJim Jagielski } // namespace svxform 2316*b1cdbd2cSJim Jagielski //............................................................................ 2317*b1cdbd2cSJim Jagielski 2318*b1cdbd2cSJim Jagielski 2319