1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "pvlaydlg.hxx" 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 37*cdf0e10cSrcweir #include <vcl/mnemonic.hxx> 38*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #include "dbdocfun.hxx" 41*cdf0e10cSrcweir #include "uiitems.hxx" 42*cdf0e10cSrcweir #include "rangeutl.hxx" 43*cdf0e10cSrcweir #include "document.hxx" 44*cdf0e10cSrcweir #include "viewdata.hxx" 45*cdf0e10cSrcweir #include "tabvwsh.hxx" 46*cdf0e10cSrcweir #include "reffact.hxx" 47*cdf0e10cSrcweir #include "scresid.hxx" 48*cdf0e10cSrcweir #include "globstr.hrc" 49*cdf0e10cSrcweir #include "pivot.hrc" 50*cdf0e10cSrcweir #include "dpobject.hxx" 51*cdf0e10cSrcweir #include "dpsave.hxx" 52*cdf0e10cSrcweir #include "dpshttab.hxx" 53*cdf0e10cSrcweir #include "scmod.hxx" 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir #include "sc.hrc" //CHINA001 56*cdf0e10cSrcweir #include "scabstdlg.hxx" //CHINA001 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir // ============================================================================ 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir using namespace ::com::sun::star; 61*cdf0e10cSrcweir using ::rtl::OUString; 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir // ============================================================================ 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir namespace { 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir const sal_uInt16 STD_FORMAT = sal_uInt16( SCA_VALID | SCA_TAB_3D | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE ); 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir OUString lclGetNameWithoutMnemonic( const FixedText& rFixedText ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir return MnemonicGenerator::EraseAllMnemonicChars( rFixedText.GetText() ); 72*cdf0e10cSrcweir } 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir } // namespace 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir // ============================================================================ 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir ScPivotLayoutDlg::ScPivotLayoutDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, const ScDPObject& rDPObject ) : 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir ScAnyRefDlg( pB, pCW, pParent, RID_SCDLG_PIVOT_LAYOUT ), 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir maFlLayout( this, ScResId( FL_LAYOUT ) ), 83*cdf0e10cSrcweir maScrPage( this, ScResId( SCROLL_PAGE ) ), 84*cdf0e10cSrcweir maFtPage( this, ScResId( FT_PAGE ) ), 85*cdf0e10cSrcweir maWndPage( this, ScResId( WND_PAGE ), maScrPage, &maFtPage, lclGetNameWithoutMnemonic( maFtPage ), PIVOTFIELDTYPE_PAGE, HID_SC_DPLAY_PAGE, POINTER_PIVOT_FIELD, 5, 2, 1, 0 ), 86*cdf0e10cSrcweir maScrCol( this, ScResId( SCROLL_COL ) ), 87*cdf0e10cSrcweir maFtCol( this, ScResId( FT_COL ) ), 88*cdf0e10cSrcweir maWndCol( this, ScResId( WND_COL ), maScrCol, &maFtCol, lclGetNameWithoutMnemonic( maFtCol ), PIVOTFIELDTYPE_COL, HID_SC_DPLAY_COLUMN, POINTER_PIVOT_COL, 4, 2, 1, 0 ), 89*cdf0e10cSrcweir maScrRow( this, ScResId( SCROLL_ROW ) ), 90*cdf0e10cSrcweir maFtRow( this, ScResId( FT_ROW ) ), 91*cdf0e10cSrcweir maWndRow( this, ScResId( WND_ROW ), maScrRow, &maFtRow, lclGetNameWithoutMnemonic( maFtRow ), PIVOTFIELDTYPE_ROW, HID_SC_DPLAY_ROW, POINTER_PIVOT_ROW, 1, 8, 1, 0 ), 92*cdf0e10cSrcweir maScrData( this, ScResId( SCROLL_DATA ) ), 93*cdf0e10cSrcweir maFtData( this, ScResId( FT_DATA ) ), 94*cdf0e10cSrcweir maWndData( this, ScResId( WND_DATA ), maScrData, &maFtData, lclGetNameWithoutMnemonic( maFtData ), PIVOTFIELDTYPE_DATA, HID_SC_DPLAY_DATA, POINTER_PIVOT_FIELD, 1, 8, 4, 0 ), 95*cdf0e10cSrcweir maFlSelect( this, ScResId( FL_SELECT ) ), 96*cdf0e10cSrcweir maScrSelect( this, ScResId( WND_HSCROLL ) ), 97*cdf0e10cSrcweir maWndSelect( this, ScResId( WND_SELECT ), maScrSelect, 0, String( ScResId( STR_SELECT ) ), PIVOTFIELDTYPE_SELECT, HID_SC_DPLAY_SELECT, POINTER_PIVOT_FIELD, 2, 10, 1, 2 ), 98*cdf0e10cSrcweir maFtInfo( this, ScResId( FT_INFO ) ), 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir maFlAreas( this, ScResId( FL_OUTPUT ) ), 101*cdf0e10cSrcweir maFtInArea( this, ScResId( FT_INAREA) ), 102*cdf0e10cSrcweir maEdInPos( this, this, ScResId( ED_INAREA) ), 103*cdf0e10cSrcweir maRbInPos( this, ScResId( RB_INAREA ), &maEdInPos, this ), 104*cdf0e10cSrcweir maLbOutPos( this, ScResId( LB_OUTAREA ) ), 105*cdf0e10cSrcweir maFtOutArea( this, ScResId( FT_OUTAREA ) ), 106*cdf0e10cSrcweir maEdOutPos( this, this, ScResId( ED_OUTAREA ) ), 107*cdf0e10cSrcweir maRbOutPos( this, ScResId( RB_OUTAREA ), &maEdOutPos, this ), 108*cdf0e10cSrcweir maBtnIgnEmptyRows( this, ScResId( BTN_IGNEMPTYROWS ) ), 109*cdf0e10cSrcweir maBtnDetectCat( this, ScResId( BTN_DETECTCAT ) ), 110*cdf0e10cSrcweir maBtnTotalCol( this, ScResId( BTN_TOTALCOL ) ), 111*cdf0e10cSrcweir maBtnTotalRow( this, ScResId( BTN_TOTALROW ) ), 112*cdf0e10cSrcweir maBtnFilter( this, ScResId( BTN_FILTER ) ), 113*cdf0e10cSrcweir maBtnDrillDown( this, ScResId( BTN_DRILLDOWN ) ), 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir maBtnOk( this, ScResId( BTN_OK ) ), 116*cdf0e10cSrcweir maBtnCancel( this, ScResId( BTN_CANCEL ) ), 117*cdf0e10cSrcweir maBtnHelp( this, ScResId( BTN_HELP ) ), 118*cdf0e10cSrcweir maBtnRemove( this, ScResId( BTN_REMOVE ) ), 119*cdf0e10cSrcweir maBtnOptions( this, ScResId( BTN_OPTIONS ) ), 120*cdf0e10cSrcweir maBtnMore( this, ScResId( BTN_MORE ) ), 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir mxDlgDPObject( new ScDPObject( rDPObject ) ), 123*cdf0e10cSrcweir mpViewData( ((ScTabViewShell*)SfxViewShell::Current())->GetViewData() ), 124*cdf0e10cSrcweir mpDoc( ((ScTabViewShell*)SfxViewShell::Current())->GetViewData()->GetDocument() ), 125*cdf0e10cSrcweir mpFocusWindow( 0 ), 126*cdf0e10cSrcweir mpTrackingWindow( 0 ), 127*cdf0e10cSrcweir mpDropWindow( 0 ), 128*cdf0e10cSrcweir mpActiveEdit( 0 ), 129*cdf0e10cSrcweir mbRefInputMode( false ) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir DBG_ASSERT( mpViewData && mpDoc, "ScPivotLayoutDlg::ScPivotLayoutDlg - missing document or view data" ); 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir mxDlgDPObject->SetAlive( true ); // needed to get structure information 134*cdf0e10cSrcweir mxDlgDPObject->FillOldParam( maPivotData ); 135*cdf0e10cSrcweir mxDlgDPObject->FillLabelData( maPivotData ); 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir maBtnRemove.SetClickHdl( LINK( this, ScPivotLayoutDlg, ClickHdl ) ); 138*cdf0e10cSrcweir maBtnOptions.SetClickHdl( LINK( this, ScPivotLayoutDlg, ClickHdl ) ); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir // PIVOT_MAXFUNC defined in sc/inc/dpglobal.hxx 141*cdf0e10cSrcweir maFuncNames.reserve( PIVOT_MAXFUNC ); 142*cdf0e10cSrcweir for( sal_uInt16 i = 1; i <= PIVOT_MAXFUNC; ++i ) 143*cdf0e10cSrcweir maFuncNames.push_back( String( ScResId( i ) ) ); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir maBtnMore.AddWindow( &maFlAreas ); 146*cdf0e10cSrcweir maBtnMore.AddWindow( &maFtInArea ); 147*cdf0e10cSrcweir maBtnMore.AddWindow( &maEdInPos ); 148*cdf0e10cSrcweir maBtnMore.AddWindow( &maRbInPos ); 149*cdf0e10cSrcweir maBtnMore.AddWindow( &maFtOutArea ); 150*cdf0e10cSrcweir maBtnMore.AddWindow( &maLbOutPos ); 151*cdf0e10cSrcweir maBtnMore.AddWindow( &maEdOutPos ); 152*cdf0e10cSrcweir maBtnMore.AddWindow( &maRbOutPos ); 153*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnIgnEmptyRows ); 154*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnDetectCat ); 155*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnTotalCol ); 156*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnTotalRow ); 157*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnFilter ); 158*cdf0e10cSrcweir maBtnMore.AddWindow( &maBtnDrillDown ); 159*cdf0e10cSrcweir maBtnMore.SetClickHdl( LINK( this, ScPivotLayoutDlg, MoreClickHdl ) ); 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir if( mxDlgDPObject->GetSheetDesc() ) 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir maEdInPos.Enable(); 164*cdf0e10cSrcweir maRbInPos.Enable(); 165*cdf0e10cSrcweir ScRange aRange = mxDlgDPObject->GetSheetDesc()->aSourceRange; 166*cdf0e10cSrcweir String aString; 167*cdf0e10cSrcweir aRange.Format( aString, SCR_ABS_3D, mpDoc, mpDoc->GetAddressConvention() ); 168*cdf0e10cSrcweir maEdInPos.SetText( aString ); 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir else 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir // data is not reachable, so could be a remote database 173*cdf0e10cSrcweir maEdInPos.Disable(); 174*cdf0e10cSrcweir maRbInPos.Disable(); 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir // #i29203# align right border of page window with data window 178*cdf0e10cSrcweir long nPagePosX = maWndData.GetPosPixel().X() + maWndData.GetSizePixel().Width() - maWndPage.GetSizePixel().Width(); 179*cdf0e10cSrcweir maWndPage.SetPosPixel( Point( nPagePosX, maWndPage.GetPosPixel().Y() ) ); 180*cdf0e10cSrcweir maScrPage.SetPosPixel( Point( maScrData.GetPosPixel().X(), maScrPage.GetPosPixel().Y() ) ); 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir InitFieldWindows(); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir maLbOutPos.SetSelectHdl( LINK( this, ScPivotLayoutDlg, SelAreaHdl ) ); 185*cdf0e10cSrcweir maEdOutPos.SetModifyHdl( LINK( this, ScPivotLayoutDlg, EdOutModifyHdl ) ); 186*cdf0e10cSrcweir maEdInPos.SetModifyHdl( LINK( this, ScPivotLayoutDlg, EdInModifyHdl ) ); 187*cdf0e10cSrcweir maBtnOk.SetClickHdl( LINK( this, ScPivotLayoutDlg, OkHdl ) ); 188*cdf0e10cSrcweir maBtnCancel.SetClickHdl( LINK( this, ScPivotLayoutDlg, CancelHdl ) ); 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir if( mpViewData && mpDoc ) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir /* 193*cdf0e10cSrcweir * Aus den RangeNames des Dokumentes werden nun die 194*cdf0e10cSrcweir * in einem Zeiger-Array gemerkt, bei denen es sich 195*cdf0e10cSrcweir * um sinnvolle Bereiche handelt 196*cdf0e10cSrcweir */ 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir maLbOutPos.Clear(); 199*cdf0e10cSrcweir maLbOutPos.InsertEntry( String( ScResId( SCSTR_UNDEFINED ) ), 0 ); 200*cdf0e10cSrcweir maLbOutPos.InsertEntry( String( ScResId( SCSTR_NEWTABLE ) ), 1 ); 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir ScAreaNameIterator aIter( mpDoc ); 203*cdf0e10cSrcweir String aName; 204*cdf0e10cSrcweir ScRange aRange; 205*cdf0e10cSrcweir String aRefStr; 206*cdf0e10cSrcweir while ( aIter.Next( aName, aRange ) ) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir if ( !aIter.WasDBName() ) // hier keine DB-Bereiche ! 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir sal_uInt16 nInsert = maLbOutPos.InsertEntry( aName ); 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir aRange.aStart.Format( aRefStr, SCA_ABS_3D, mpDoc, mpDoc->GetAddressConvention() ); 213*cdf0e10cSrcweir maLbOutPos.SetEntryData( nInsert, new String( aRefStr ) ); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir if ( maPivotData.nTab != MAXTAB+1 ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir String aStr; 221*cdf0e10cSrcweir ScAddress( maPivotData.nCol, 222*cdf0e10cSrcweir maPivotData.nRow, 223*cdf0e10cSrcweir maPivotData.nTab ).Format( aStr, STD_FORMAT, mpDoc, mpDoc->GetAddressConvention() ); 224*cdf0e10cSrcweir maEdOutPos.SetText( aStr ); 225*cdf0e10cSrcweir EdOutModifyHdl( 0 ); 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir else 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir maLbOutPos.SelectEntryPos( maLbOutPos.GetEntryCount()-1 ); 230*cdf0e10cSrcweir SelAreaHdl(NULL); 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir maBtnIgnEmptyRows.Check( maPivotData.bIgnoreEmptyRows ); 234*cdf0e10cSrcweir maBtnDetectCat.Check( maPivotData.bDetectCategories ); 235*cdf0e10cSrcweir maBtnTotalCol.Check( maPivotData.bMakeTotalCol ); 236*cdf0e10cSrcweir maBtnTotalRow.Check( maPivotData.bMakeTotalRow ); 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir const ScDPSaveData* pSaveData = mxDlgDPObject->GetSaveData(); 239*cdf0e10cSrcweir maBtnFilter.Check( !pSaveData || pSaveData->GetFilterButton() ); 240*cdf0e10cSrcweir maBtnDrillDown.Check( !pSaveData || pSaveData->GetDrillDown() ); 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir // child event listener handles field movement when keyboard shortcut is pressed 243*cdf0e10cSrcweir AddChildEventListener( LINK( this, ScPivotLayoutDlg, ChildEventListener ) ); 244*cdf0e10cSrcweir GrabFieldFocus( maWndSelect ); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir FreeResource(); 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir ScPivotLayoutDlg::~ScPivotLayoutDlg() 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir RemoveChildEventListener( LINK( this, ScPivotLayoutDlg, ChildEventListener ) ); 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir for( sal_uInt16 i = 2, nEntries = maLbOutPos.GetEntryCount(); i < nEntries; ++i ) 254*cdf0e10cSrcweir delete (String*)maLbOutPos.GetEntryData( i ); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir ScDPLabelData* ScPivotLayoutDlg::GetLabelData( SCCOL nCol, size_t* pnIndex ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir ScDPLabelData* pLabelData = 0; 260*cdf0e10cSrcweir for( ScDPLabelDataVector::iterator aIt = maLabelData.begin(), aEnd = maLabelData.end(); !pLabelData && (aIt != aEnd); ++aIt ) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir if( aIt->mnCol == nCol ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir pLabelData = &*aIt; 265*cdf0e10cSrcweir if( pnIndex ) 266*cdf0e10cSrcweir *pnIndex = aIt - maLabelData.begin(); 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir return pLabelData; 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir String ScPivotLayoutDlg::GetFuncString( sal_uInt16& rnFuncMask, bool bIsValue ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir String aStr; 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir if( (rnFuncMask == PIVOT_FUNC_NONE) || (rnFuncMask == PIVOT_FUNC_AUTO) ) 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir if( bIsValue ) 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir aStr = GetFuncName( PIVOTSTR_SUM ); 281*cdf0e10cSrcweir rnFuncMask = PIVOT_FUNC_SUM; 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir else 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir aStr = GetFuncName( PIVOTSTR_COUNT ); 286*cdf0e10cSrcweir rnFuncMask = PIVOT_FUNC_COUNT; 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_SUM ) aStr = GetFuncName( PIVOTSTR_SUM ); 290*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_COUNT ) aStr = GetFuncName( PIVOTSTR_COUNT ); 291*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_AVERAGE ) aStr = GetFuncName( PIVOTSTR_AVG ); 292*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_MAX ) aStr = GetFuncName( PIVOTSTR_MAX ); 293*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_MIN ) aStr = GetFuncName( PIVOTSTR_MIN ); 294*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_PRODUCT ) aStr = GetFuncName( PIVOTSTR_PROD ); 295*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_COUNT_NUM ) aStr = GetFuncName( PIVOTSTR_COUNT2 ); 296*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_STD_DEV ) aStr = GetFuncName( PIVOTSTR_DEV ); 297*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_STD_DEVP ) aStr = GetFuncName( PIVOTSTR_DEV2 ); 298*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_STD_VAR ) aStr = GetFuncName( PIVOTSTR_VAR ); 299*cdf0e10cSrcweir else if( rnFuncMask == PIVOT_FUNC_STD_VARP ) aStr = GetFuncName( PIVOTSTR_VAR2 ); 300*cdf0e10cSrcweir else 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir aStr = ScGlobal::GetRscString( STR_TABLE_ERGEBNIS ); 303*cdf0e10cSrcweir aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " - " ) ); 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir return aStr; 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir void ScPivotLayoutDlg::NotifyStartTracking( ScPivotFieldWindow& rSourceWindow ) 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir mpTrackingWindow = &rSourceWindow; 312*cdf0e10cSrcweir mpDropWindow = 0; 313*cdf0e10cSrcweir rSourceWindow.NotifyStartTracking(); 314*cdf0e10cSrcweir StartTracking( STARTTRACK_BUTTONREPEAT ); 315*cdf0e10cSrcweir SetPointer( Pointer( rSourceWindow.GetDropPointerStyle() ) ); 316*cdf0e10cSrcweir } 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir void ScPivotLayoutDlg::NotifyDoubleClick( ScPivotFieldWindow& rSourceWindow ) 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir // nothing to do on double-click in selection window 321*cdf0e10cSrcweir if( rSourceWindow.GetType() == PIVOTFIELDTYPE_SELECT ) 322*cdf0e10cSrcweir return; 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir const ScPivotFuncData* pFuncData = rSourceWindow.GetSelectedFuncData(); 325*cdf0e10cSrcweir DBG_ASSERT( pFuncData, "ScPivotLayoutDlg::NotifyDoubleClick - invalid selection" ); 326*cdf0e10cSrcweir if( !pFuncData ) 327*cdf0e10cSrcweir return; 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir ScDPLabelData* pLabelData = GetLabelData( pFuncData->mnCol ); 330*cdf0e10cSrcweir DBG_ASSERT( pLabelData, "ScPivotLayoutDlg::NotifyDoubleClick - missing label data" ); 331*cdf0e10cSrcweir if( !pLabelData ) 332*cdf0e10cSrcweir return; 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir ScAbstractDialogFactory* pFactory = ScAbstractDialogFactory::Create(); 335*cdf0e10cSrcweir DBG_ASSERT( pFactory, "ScPivotLayoutDlg::NotifyDoubleClick - ScAbstractDialogFactory creation failed" ); 336*cdf0e10cSrcweir if( !pFactory ) 337*cdf0e10cSrcweir return; 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir if( rSourceWindow.GetType() == PIVOTFIELDTYPE_DATA ) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir ::std::auto_ptr< AbstractScDPFunctionDlg > xDlg( pFactory->CreateScDPFunctionDlg( 342*cdf0e10cSrcweir this, RID_SCDLG_DPDATAFIELD, maLabelData, *pLabelData, *pFuncData ) ); 343*cdf0e10cSrcweir if( xDlg->Execute() == RET_OK ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir ScPivotFuncData aFuncData( *pFuncData ); 346*cdf0e10cSrcweir aFuncData.mnFuncMask = pLabelData->mnFuncMask = xDlg->GetFuncMask(); 347*cdf0e10cSrcweir aFuncData.maFieldRef = xDlg->GetFieldRef(); 348*cdf0e10cSrcweir rSourceWindow.ModifySelectedField( aFuncData ); 349*cdf0e10cSrcweir } 350*cdf0e10cSrcweir } 351*cdf0e10cSrcweir else 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir // list of plain names of all data fields 354*cdf0e10cSrcweir ScDPNameVec aDataFieldNames; 355*cdf0e10cSrcweir maWndData.WriteFieldNames( aDataFieldNames ); 356*cdf0e10cSrcweir // allow to modify layout options for row fields, if multiple data fields exist, or if it is not the last row field 357*cdf0e10cSrcweir bool bLayout = (rSourceWindow.GetType() == PIVOTFIELDTYPE_ROW) && ((aDataFieldNames.size() > 1) || (rSourceWindow.GetSelectedIndex() + 1 < rSourceWindow.GetFieldCount())); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir ::std::auto_ptr< AbstractScDPSubtotalDlg > xDlg( pFactory->CreateScDPSubtotalDlg( 360*cdf0e10cSrcweir this, RID_SCDLG_PIVOTSUBT, *mxDlgDPObject, *pLabelData, *pFuncData, aDataFieldNames, bLayout ) ); 361*cdf0e10cSrcweir if( xDlg->Execute() == RET_OK ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir xDlg->FillLabelData( *pLabelData ); 364*cdf0e10cSrcweir ScPivotFuncData aFuncData( *pFuncData ); 365*cdf0e10cSrcweir aFuncData.mnFuncMask = pLabelData->mnFuncMask; 366*cdf0e10cSrcweir rSourceWindow.ModifySelectedField( aFuncData ); 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir void ScPivotLayoutDlg::NotifyFieldRemoved( ScPivotFieldWindow& rSourceWindow ) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir // update focus: move to selection window, if source window is empty now 374*cdf0e10cSrcweir GrabFieldFocus( rSourceWindow ); 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir // protected ------------------------------------------------------------------ 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir void ScPivotLayoutDlg::Tracking( const TrackingEvent& rTEvt ) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir DBG_ASSERT( mpTrackingWindow, "ScPivotLayoutDlg::Tracking - missing tracking source window" ); 382*cdf0e10cSrcweir if( !mpTrackingWindow ) 383*cdf0e10cSrcweir return; 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir // find target window 386*cdf0e10cSrcweir const Point& rDialogPos = rTEvt.GetMouseEvent().GetPosPixel(); 387*cdf0e10cSrcweir ScPivotFieldWindow* pTargetWindow = dynamic_cast< ScPivotFieldWindow* >( FindWindow( rDialogPos ) ); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir // check if the target orientation is allowed for this field 390*cdf0e10cSrcweir if( pTargetWindow && (mpTrackingWindow != pTargetWindow) && !IsInsertAllowed( *mpTrackingWindow, *pTargetWindow ) ) 391*cdf0e10cSrcweir pTargetWindow = 0; 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir // tracking from selection window: do not show "delete" mouse pointer 394*cdf0e10cSrcweir PointerStyle eTargetPointer = pTargetWindow ? pTargetWindow->GetDropPointerStyle() : 395*cdf0e10cSrcweir ((mpTrackingWindow->GetType() == PIVOTFIELDTYPE_SELECT) ? POINTER_NOTALLOWED : POINTER_PIVOT_DELETE); 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir // after calculating pointer style, check if target is selection window 398*cdf0e10cSrcweir if( pTargetWindow && (pTargetWindow->GetType() == PIVOTFIELDTYPE_SELECT) ) 399*cdf0e10cSrcweir pTargetWindow = 0; 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir // notify windows about tracking 402*cdf0e10cSrcweir if( mpDropWindow != pTargetWindow ) 403*cdf0e10cSrcweir { 404*cdf0e10cSrcweir // tracking window changed 405*cdf0e10cSrcweir if( mpDropWindow ) 406*cdf0e10cSrcweir mpDropWindow->NotifyEndTracking( ENDTRACKING_SUSPEND ); 407*cdf0e10cSrcweir if( pTargetWindow ) 408*cdf0e10cSrcweir pTargetWindow->NotifyStartTracking(); 409*cdf0e10cSrcweir mpDropWindow = pTargetWindow; 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir if( mpDropWindow ) 412*cdf0e10cSrcweir mpDropWindow->NotifyTracking( rDialogPos - pTargetWindow->GetPosPixel() ); 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir // end tracking: move or remove field 415*cdf0e10cSrcweir if( rTEvt.IsTrackingEnded() ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir bool bCancelled = rTEvt.IsTrackingCanceled(); 418*cdf0e10cSrcweir if( mpDropWindow ) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir mpDropWindow->NotifyEndTracking( bCancelled ? ENDTRACKING_CANCEL : ENDTRACKING_DROP ); 421*cdf0e10cSrcweir if( !bCancelled ) 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir size_t nInsertIndex = mpDropWindow->GetDropIndex( rDialogPos - mpDropWindow->GetPosPixel() ); 424*cdf0e10cSrcweir bool bMoved = MoveField( *mpTrackingWindow, *mpDropWindow, nInsertIndex, true ); 425*cdf0e10cSrcweir // focus drop window, if move was successful, otherwise back to source window 426*cdf0e10cSrcweir GrabFieldFocus( bMoved ? *mpDropWindow : *mpTrackingWindow ); 427*cdf0e10cSrcweir } 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir else 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir // drop target invalid (outside field windows): remove tracked field 432*cdf0e10cSrcweir if( !bCancelled ) 433*cdf0e10cSrcweir mpTrackingWindow->RemoveSelectedField(); 434*cdf0e10cSrcweir // focus source window (or another window, if it is empty now) 435*cdf0e10cSrcweir GrabFieldFocus( *mpTrackingWindow ); 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir eTargetPointer = POINTER_ARROW; 438*cdf0e10cSrcweir if( mpTrackingWindow != mpDropWindow ) 439*cdf0e10cSrcweir mpTrackingWindow->NotifyEndTracking( ENDTRACKING_CANCEL ); 440*cdf0e10cSrcweir mpTrackingWindow = mpDropWindow = 0; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir SetPointer( eTargetPointer ); 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir void ScPivotLayoutDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir if( !mbRefInputMode || !mpActiveEdit ) 448*cdf0e10cSrcweir return; 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir if( rRef.aStart != rRef.aEnd ) 451*cdf0e10cSrcweir RefInputStart( mpActiveEdit ); 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir if( mpActiveEdit == &maEdInPos ) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir String aRefStr; 456*cdf0e10cSrcweir rRef.Format( aRefStr, SCR_ABS_3D, pDocP, pDocP->GetAddressConvention() ); 457*cdf0e10cSrcweir mpActiveEdit->SetRefString( aRefStr ); 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir else if( mpActiveEdit == &maEdOutPos ) 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir String aRefStr; 462*cdf0e10cSrcweir rRef.aStart.Format( aRefStr, STD_FORMAT, pDocP, pDocP->GetAddressConvention() ); 463*cdf0e10cSrcweir mpActiveEdit->SetRefString( aRefStr ); 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir sal_Bool ScPivotLayoutDlg::IsRefInputMode() const 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir return mbRefInputMode; 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir void ScPivotLayoutDlg::SetActive() 473*cdf0e10cSrcweir { 474*cdf0e10cSrcweir if( mbRefInputMode ) 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir if( mpActiveEdit ) 477*cdf0e10cSrcweir mpActiveEdit->GrabFocus(); 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir if( mpActiveEdit == &maEdInPos ) 480*cdf0e10cSrcweir EdInModifyHdl( 0 ); 481*cdf0e10cSrcweir else if( mpActiveEdit == &maEdOutPos ) 482*cdf0e10cSrcweir EdOutModifyHdl( 0 ); 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir else 485*cdf0e10cSrcweir { 486*cdf0e10cSrcweir GrabFocus(); 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir RefInputDone(); 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir sal_Bool ScPivotLayoutDlg::Close() 493*cdf0e10cSrcweir { 494*cdf0e10cSrcweir return DoClose( ScPivotLayoutWrapper::GetChildWindowId() ); 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir // private -------------------------------------------------------------------- 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir ScPivotFieldWindow& ScPivotLayoutDlg::GetFieldWindow( ScPivotFieldType eFieldType ) 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir switch( eFieldType ) 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir case PIVOTFIELDTYPE_PAGE: return maWndPage; 504*cdf0e10cSrcweir case PIVOTFIELDTYPE_ROW: return maWndRow; 505*cdf0e10cSrcweir case PIVOTFIELDTYPE_COL: return maWndCol; 506*cdf0e10cSrcweir case PIVOTFIELDTYPE_DATA: return maWndData; 507*cdf0e10cSrcweir default:; 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir return maWndSelect; 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir bool ScPivotLayoutDlg::IsInsertAllowed( const ScPivotFieldWindow& rSourceWindow, const ScPivotFieldWindow& rTargetWindow ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir if( rTargetWindow.GetType() != PIVOTFIELDTYPE_SELECT ) 515*cdf0e10cSrcweir { 516*cdf0e10cSrcweir const ScPivotFuncData* pSourceData = rSourceWindow.GetSelectedFuncData(); 517*cdf0e10cSrcweir ScDPLabelData* pLabelData = pSourceData ? GetLabelData( pSourceData->mnCol ) : 0; 518*cdf0e10cSrcweir DBG_ASSERT( pLabelData, "ScPivotLayoutDlg::IsInsertAllowed - label data not found" ); 519*cdf0e10cSrcweir if( pLabelData ) 520*cdf0e10cSrcweir { 521*cdf0e10cSrcweir sheet::DataPilotFieldOrientation eOrient = sheet::DataPilotFieldOrientation_HIDDEN; 522*cdf0e10cSrcweir switch( rTargetWindow.GetType() ) 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir case PIVOTFIELDTYPE_PAGE: eOrient = sheet::DataPilotFieldOrientation_PAGE; break; 525*cdf0e10cSrcweir case PIVOTFIELDTYPE_COL: eOrient = sheet::DataPilotFieldOrientation_COLUMN; break; 526*cdf0e10cSrcweir case PIVOTFIELDTYPE_ROW: eOrient = sheet::DataPilotFieldOrientation_ROW; break; 527*cdf0e10cSrcweir case PIVOTFIELDTYPE_DATA: eOrient = sheet::DataPilotFieldOrientation_DATA; break; 528*cdf0e10cSrcweir default: return false; 529*cdf0e10cSrcweir } 530*cdf0e10cSrcweir return ScDPObject::IsOrientationAllowed( static_cast< sal_uInt16 >( eOrient ), pLabelData->mnFlags ); 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir } 533*cdf0e10cSrcweir return false; 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir 536*cdf0e10cSrcweir void ScPivotLayoutDlg::InitFieldWindows() 537*cdf0e10cSrcweir { 538*cdf0e10cSrcweir maLabelData = maPivotData.maLabelArray; 539*cdf0e10cSrcweir maWndSelect.ReadDataLabels( maLabelData ); 540*cdf0e10cSrcweir maWndPage.ReadPivotFields( maPivotData.maPageArr ); 541*cdf0e10cSrcweir maWndCol.ReadPivotFields( maPivotData.maColArr ); 542*cdf0e10cSrcweir maWndRow.ReadPivotFields( maPivotData.maRowArr ); 543*cdf0e10cSrcweir maWndData.ReadPivotFields( maPivotData.maDataArr ); 544*cdf0e10cSrcweir } 545*cdf0e10cSrcweir 546*cdf0e10cSrcweir void ScPivotLayoutDlg::GrabFieldFocus( ScPivotFieldWindow& rFieldWindow ) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir if( rFieldWindow.IsEmpty() ) 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir if( maWndSelect.IsEmpty() ) 551*cdf0e10cSrcweir maBtnOk.GrabFocus(); 552*cdf0e10cSrcweir else 553*cdf0e10cSrcweir maWndSelect.GrabFocus(); 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir else 556*cdf0e10cSrcweir rFieldWindow.GrabFocus(); 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir namespace { 560*cdf0e10cSrcweir 561*cdf0e10cSrcweir void lclFindFieldWindow( ScPivotFieldWindow*& rpFieldWindow, const ScPivotFuncData*& rpFuncData, size_t& rnFieldIndex, ScPivotFieldWindow& rFieldWindow ) 562*cdf0e10cSrcweir { 563*cdf0e10cSrcweir ScPivotFuncDataEntry aEntry = rFieldWindow.FindFuncDataByCol( rpFuncData->mnCol ); 564*cdf0e10cSrcweir if( aEntry.first ) 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir rpFieldWindow = &rFieldWindow; 567*cdf0e10cSrcweir rpFuncData = aEntry.first; 568*cdf0e10cSrcweir rnFieldIndex = aEntry.second; 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir } 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir } // namespace 573*cdf0e10cSrcweir 574*cdf0e10cSrcweir bool ScPivotLayoutDlg::MoveField( ScPivotFieldWindow& rSourceWindow, ScPivotFieldWindow& rTargetWindow, size_t nInsertIndex, bool bMoveExisting ) 575*cdf0e10cSrcweir { 576*cdf0e10cSrcweir // move inside the same window 577*cdf0e10cSrcweir if( &rSourceWindow == &rTargetWindow ) 578*cdf0e10cSrcweir return bMoveExisting && rTargetWindow.MoveSelectedField( nInsertIndex ); 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir // do not insert if not supported by target window 581*cdf0e10cSrcweir if( !IsInsertAllowed( rSourceWindow, rTargetWindow ) ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir rSourceWindow.RemoveSelectedField(); 584*cdf0e10cSrcweir return false; 585*cdf0e10cSrcweir } 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir // move from one window to another window 588*cdf0e10cSrcweir if( const ScPivotFuncData* pSourceData = rSourceWindow.GetSelectedFuncData() ) 589*cdf0e10cSrcweir { 590*cdf0e10cSrcweir // move to page/col/row window: try to find existing field in another window 591*cdf0e10cSrcweir ScPivotFieldWindow* pSourceWindow = &rSourceWindow; 592*cdf0e10cSrcweir size_t nSourceIndex = rSourceWindow.GetSelectedIndex(); 593*cdf0e10cSrcweir if( rTargetWindow.GetType() != PIVOTFIELDTYPE_DATA ) 594*cdf0e10cSrcweir { 595*cdf0e10cSrcweir lclFindFieldWindow( pSourceWindow, pSourceData, nSourceIndex, maWndPage ); 596*cdf0e10cSrcweir lclFindFieldWindow( pSourceWindow, pSourceData, nSourceIndex, maWndCol ); 597*cdf0e10cSrcweir lclFindFieldWindow( pSourceWindow, pSourceData, nSourceIndex, maWndRow ); 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir // found in target window: move to new position 601*cdf0e10cSrcweir if( pSourceWindow == &rTargetWindow ) 602*cdf0e10cSrcweir return bMoveExisting && pSourceWindow->MoveField( nSourceIndex, nInsertIndex ); 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir // insert field into target window 605*cdf0e10cSrcweir rTargetWindow.InsertField( nInsertIndex, *pSourceData ); 606*cdf0e10cSrcweir // remove field from source window 607*cdf0e10cSrcweir pSourceWindow->RemoveField( nSourceIndex ); 608*cdf0e10cSrcweir // remove field from data window, if it is the original source 609*cdf0e10cSrcweir if( (rSourceWindow.GetType() == PIVOTFIELDTYPE_DATA) && (pSourceWindow->GetType() != PIVOTFIELDTYPE_DATA) ) 610*cdf0e10cSrcweir rSourceWindow.RemoveSelectedField(); 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir return true; 613*cdf0e10cSrcweir } 614*cdf0e10cSrcweir 615*cdf0e10cSrcweir return false; 616*cdf0e10cSrcweir } 617*cdf0e10cSrcweir 618*cdf0e10cSrcweir // handlers ------------------------------------------------------------------- 619*cdf0e10cSrcweir 620*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, ClickHdl, PushButton *, pBtn ) 621*cdf0e10cSrcweir { 622*cdf0e10cSrcweir if( mpFocusWindow ) 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir /* Raising sub dialogs (from the NotifyDoubleClick function) triggers 625*cdf0e10cSrcweir VCL child window focus events from this sub dialog which may 626*cdf0e10cSrcweir invalidate the member mpFocusWindow pointing to the target field 627*cdf0e10cSrcweir window. This would cause a crash with the following call to the 628*cdf0e10cSrcweir GrabFieldFocus function, if mpFocusWindow is used directly. */ 629*cdf0e10cSrcweir ScPivotFieldWindow& rTargetWindow = *mpFocusWindow; 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir if( pBtn == &maBtnRemove ) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir rTargetWindow.RemoveSelectedField(); 634*cdf0e10cSrcweir // focus back to field window 635*cdf0e10cSrcweir GrabFieldFocus( rTargetWindow ); 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir else if( pBtn == &maBtnOptions ) 638*cdf0e10cSrcweir { 639*cdf0e10cSrcweir NotifyDoubleClick( rTargetWindow ); 640*cdf0e10cSrcweir // focus back to field window 641*cdf0e10cSrcweir GrabFieldFocus( rTargetWindow ); 642*cdf0e10cSrcweir } 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir return 0; 645*cdf0e10cSrcweir } 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, OkHdl, OKButton *, EMPTYARG ) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir String aOutPosStr = maEdOutPos.GetText(); 650*cdf0e10cSrcweir ScAddress aAdrDest; 651*cdf0e10cSrcweir bool bToNewTable = maLbOutPos.GetSelectEntryPos() == 1; 652*cdf0e10cSrcweir sal_uInt16 nResult = !bToNewTable ? aAdrDest.Parse( aOutPosStr, mpDoc, mpDoc->GetAddressConvention() ) : 0; 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir if( bToNewTable || ((aOutPosStr.Len() > 0) && ((nResult & SCA_VALID) == SCA_VALID)) ) 655*cdf0e10cSrcweir { 656*cdf0e10cSrcweir ScPivotFieldVector aPageFields, aColFields, aRowFields, aDataFields; 657*cdf0e10cSrcweir maWndPage.WritePivotFields( aPageFields ); 658*cdf0e10cSrcweir maWndCol.WritePivotFields( aColFields ); 659*cdf0e10cSrcweir maWndRow.WritePivotFields( aRowFields ); 660*cdf0e10cSrcweir maWndData.WritePivotFields( aDataFields ); 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir // TODO: handle data field in dialog field windows? 663*cdf0e10cSrcweir aRowFields.resize( aRowFields.size() + 1 ); 664*cdf0e10cSrcweir aRowFields.back().nCol = PIVOT_DATA_FIELD; 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir ScDPSaveData* pOldSaveData = mxDlgDPObject->GetSaveData(); 667*cdf0e10cSrcweir 668*cdf0e10cSrcweir ScRange aOutRange( aAdrDest ); // bToNewTable is passed separately 669*cdf0e10cSrcweir 670*cdf0e10cSrcweir ScDPSaveData aSaveData; 671*cdf0e10cSrcweir aSaveData.SetIgnoreEmptyRows( maBtnIgnEmptyRows.IsChecked() ); 672*cdf0e10cSrcweir aSaveData.SetRepeatIfEmpty( maBtnDetectCat.IsChecked() ); 673*cdf0e10cSrcweir aSaveData.SetColumnGrand( maBtnTotalCol.IsChecked() ); 674*cdf0e10cSrcweir aSaveData.SetRowGrand( maBtnTotalRow.IsChecked() ); 675*cdf0e10cSrcweir aSaveData.SetFilterButton( maBtnFilter.IsChecked() ); 676*cdf0e10cSrcweir aSaveData.SetDrillDown( maBtnDrillDown.IsChecked() ); 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir uno::Reference< sheet::XDimensionsSupplier > xSource = mxDlgDPObject->GetSource(); 679*cdf0e10cSrcweir 680*cdf0e10cSrcweir ScDPObject::ConvertOrientation( aSaveData, aPageFields, sheet::DataPilotFieldOrientation_PAGE, 0, 0, 0, xSource, false ); 681*cdf0e10cSrcweir ScDPObject::ConvertOrientation( aSaveData, aColFields, sheet::DataPilotFieldOrientation_COLUMN, 0, 0, 0, xSource, false ); 682*cdf0e10cSrcweir ScDPObject::ConvertOrientation( aSaveData, aRowFields, sheet::DataPilotFieldOrientation_ROW, 0, 0, 0, xSource, false ); 683*cdf0e10cSrcweir ScDPObject::ConvertOrientation( aSaveData, aDataFields, sheet::DataPilotFieldOrientation_DATA, 0, 0, 0, xSource, false, &aColFields, &aRowFields, &aPageFields ); 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir for( ScDPLabelDataVector::const_iterator aIt = maLabelData.begin(), aEnd = maLabelData.end(); aIt != aEnd; ++aIt ) 686*cdf0e10cSrcweir { 687*cdf0e10cSrcweir if( ScDPSaveDimension* pDim = aSaveData.GetExistingDimensionByName( aIt->maName ) ) 688*cdf0e10cSrcweir { 689*cdf0e10cSrcweir pDim->SetUsedHierarchy( aIt->mnUsedHier ); 690*cdf0e10cSrcweir pDim->SetShowEmpty( aIt->mbShowAll ); 691*cdf0e10cSrcweir pDim->SetSortInfo( &aIt->maSortInfo ); 692*cdf0e10cSrcweir pDim->SetLayoutInfo( &aIt->maLayoutInfo ); 693*cdf0e10cSrcweir pDim->SetAutoShowInfo( &aIt->maShowInfo ); 694*cdf0e10cSrcweir ScDPSaveDimension* pOldDim = NULL; 695*cdf0e10cSrcweir if (pOldSaveData) 696*cdf0e10cSrcweir { 697*cdf0e10cSrcweir // Transfer the existing layout names to new dimension instance. 698*cdf0e10cSrcweir pOldDim = pOldSaveData->GetExistingDimensionByName(aIt->maName); 699*cdf0e10cSrcweir if (pOldDim) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir const OUString* pLayoutName = pOldDim->GetLayoutName(); 702*cdf0e10cSrcweir if (pLayoutName) 703*cdf0e10cSrcweir pDim->SetLayoutName(*pLayoutName); 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir const OUString* pSubtotalName = pOldDim->GetSubtotalName(); 706*cdf0e10cSrcweir if (pSubtotalName) 707*cdf0e10cSrcweir pDim->SetSubtotalName(*pSubtotalName); 708*cdf0e10cSrcweir } 709*cdf0e10cSrcweir } 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir bool bManualSort = ( aIt->maSortInfo.Mode == sheet::DataPilotFieldSortMode::MANUAL ); 712*cdf0e10cSrcweir 713*cdf0e10cSrcweir // visibility of members 714*cdf0e10cSrcweir for (::std::vector<ScDPLabelData::Member>::const_iterator itr = aIt->maMembers.begin(), itrEnd = aIt->maMembers.end(); 715*cdf0e10cSrcweir itr != itrEnd; ++itr) 716*cdf0e10cSrcweir { 717*cdf0e10cSrcweir ScDPSaveMember* pMember = pDim->GetMemberByName(itr->maName); 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir // #i40054# create/access members only if flags are not default 720*cdf0e10cSrcweir // (or in manual sorting mode - to keep the order) 721*cdf0e10cSrcweir if (bManualSort || !itr->mbVisible || !itr->mbShowDetails) 722*cdf0e10cSrcweir { 723*cdf0e10cSrcweir pMember->SetIsVisible(itr->mbVisible); 724*cdf0e10cSrcweir pMember->SetShowDetails(itr->mbShowDetails); 725*cdf0e10cSrcweir } 726*cdf0e10cSrcweir if (pOldDim) 727*cdf0e10cSrcweir { 728*cdf0e10cSrcweir // Transfer the existing layout name. 729*cdf0e10cSrcweir ScDPSaveMember* pOldMember = pOldDim->GetMemberByName(itr->maName); 730*cdf0e10cSrcweir if (pOldMember) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir const OUString* pLayoutName = pOldMember->GetLayoutName(); 733*cdf0e10cSrcweir if (pLayoutName) 734*cdf0e10cSrcweir pMember->SetLayoutName(*pLayoutName); 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir } 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir } 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir ScDPSaveDimension* pDim = aSaveData.GetDataLayoutDimension(); 741*cdf0e10cSrcweir if (pDim && pOldSaveData) 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir ScDPSaveDimension* pOldDim = pOldSaveData->GetDataLayoutDimension(); 744*cdf0e10cSrcweir if (pOldDim) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir const OUString* pLayoutName = pOldDim->GetLayoutName(); 747*cdf0e10cSrcweir if (pLayoutName) 748*cdf0e10cSrcweir pDim->SetLayoutName(*pLayoutName); 749*cdf0e10cSrcweir } 750*cdf0e10cSrcweir } 751*cdf0e10cSrcweir 752*cdf0e10cSrcweir // also transfer grand total name 753*cdf0e10cSrcweir if (pOldSaveData) 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir const OUString* pGrandTotalName = pOldSaveData->GetGrandTotalName(); 756*cdf0e10cSrcweir if (pGrandTotalName) 757*cdf0e10cSrcweir aSaveData.SetGrandTotalName(*pGrandTotalName); 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir 760*cdf0e10cSrcweir sal_uInt16 nWhichPivot = SC_MOD()->GetPool().GetWhich( SID_PIVOT_TABLE ); 761*cdf0e10cSrcweir ScPivotItem aOutItem( nWhichPivot, &aSaveData, &aOutRange, bToNewTable ); 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir mbRefInputMode = false; // to allow deselecting when switching sheets 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir SetDispatcherLock( false ); 766*cdf0e10cSrcweir SwitchToDocument(); 767*cdf0e10cSrcweir 768*cdf0e10cSrcweir // #95513# don't hide the dialog before executing the slot, instead it is used as 769*cdf0e10cSrcweir // parent for message boxes in ScTabViewShell::GetDialogParent 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir const SfxPoolItem* pRet = GetBindings().GetDispatcher()->Execute( 772*cdf0e10cSrcweir SID_PIVOT_TABLE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aOutItem, 0L, 0L ); 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir bool bSuccess = true; 775*cdf0e10cSrcweir if (pRet) 776*cdf0e10cSrcweir { 777*cdf0e10cSrcweir const SfxBoolItem* pItem = dynamic_cast<const SfxBoolItem*>(pRet); 778*cdf0e10cSrcweir if (pItem) 779*cdf0e10cSrcweir bSuccess = pItem->GetValue(); 780*cdf0e10cSrcweir } 781*cdf0e10cSrcweir if (bSuccess) 782*cdf0e10cSrcweir // Table successfully inserted. 783*cdf0e10cSrcweir Close(); 784*cdf0e10cSrcweir else 785*cdf0e10cSrcweir { 786*cdf0e10cSrcweir // Table insertion failed. Keep the dialog open. 787*cdf0e10cSrcweir mbRefInputMode = true; 788*cdf0e10cSrcweir SetDispatcherLock(true); 789*cdf0e10cSrcweir } 790*cdf0e10cSrcweir } 791*cdf0e10cSrcweir else 792*cdf0e10cSrcweir { 793*cdf0e10cSrcweir if( !maBtnMore.GetState() ) 794*cdf0e10cSrcweir maBtnMore.SetState( true ); 795*cdf0e10cSrcweir 796*cdf0e10cSrcweir ErrorBox( this, WinBits( WB_OK | WB_DEF_OK ), ScGlobal::GetRscString( STR_INVALID_TABREF ) ).Execute(); 797*cdf0e10cSrcweir maEdOutPos.GrabFocus(); 798*cdf0e10cSrcweir } 799*cdf0e10cSrcweir return 0; 800*cdf0e10cSrcweir } 801*cdf0e10cSrcweir 802*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, CancelHdl, CancelButton *, EMPTYARG ) 803*cdf0e10cSrcweir { 804*cdf0e10cSrcweir Close(); 805*cdf0e10cSrcweir return 0; 806*cdf0e10cSrcweir } 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, MoreClickHdl, MoreButton *, EMPTYARG ) 809*cdf0e10cSrcweir { 810*cdf0e10cSrcweir if ( maBtnMore.GetState() ) 811*cdf0e10cSrcweir { 812*cdf0e10cSrcweir mbRefInputMode = true; 813*cdf0e10cSrcweir if ( maEdInPos.IsEnabled() ) 814*cdf0e10cSrcweir { 815*cdf0e10cSrcweir maEdInPos.Enable(); 816*cdf0e10cSrcweir maEdInPos.GrabFocus(); 817*cdf0e10cSrcweir maEdInPos.Enable(); 818*cdf0e10cSrcweir } 819*cdf0e10cSrcweir else 820*cdf0e10cSrcweir { 821*cdf0e10cSrcweir maEdOutPos.Enable(); 822*cdf0e10cSrcweir maEdOutPos.GrabFocus(); 823*cdf0e10cSrcweir maEdOutPos.Enable(); 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir } 826*cdf0e10cSrcweir else 827*cdf0e10cSrcweir { 828*cdf0e10cSrcweir mbRefInputMode = false; 829*cdf0e10cSrcweir } 830*cdf0e10cSrcweir return 0; 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, EdOutModifyHdl, Edit *, EMPTYARG ) 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir String theCurPosStr = maEdOutPos.GetText(); 836*cdf0e10cSrcweir sal_uInt16 nResult = ScAddress().Parse( theCurPosStr, mpDoc, mpDoc->GetAddressConvention() ); 837*cdf0e10cSrcweir 838*cdf0e10cSrcweir if ( SCA_VALID == (nResult & SCA_VALID) ) 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir String* pStr = 0; 841*cdf0e10cSrcweir bool bFound = false; 842*cdf0e10cSrcweir sal_uInt16 i = 0; 843*cdf0e10cSrcweir sal_uInt16 nCount = maLbOutPos.GetEntryCount(); 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir for ( i=2; i<nCount && !bFound; i++ ) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir pStr = (String*)maLbOutPos.GetEntryData( i ); 848*cdf0e10cSrcweir bFound = (theCurPosStr == *pStr); 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir 851*cdf0e10cSrcweir if ( bFound ) 852*cdf0e10cSrcweir maLbOutPos.SelectEntryPos( --i ); 853*cdf0e10cSrcweir else 854*cdf0e10cSrcweir maLbOutPos.SelectEntryPos( 0 ); 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir return 0; 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir 860*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, EdInModifyHdl, Edit *, EMPTYARG ) 861*cdf0e10cSrcweir { 862*cdf0e10cSrcweir String theCurPosStr = maEdInPos.GetText(); 863*cdf0e10cSrcweir sal_uInt16 nResult = ScRange().Parse( theCurPosStr, mpDoc, mpDoc->GetAddressConvention() ); 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir // invalid source range 866*cdf0e10cSrcweir if( SCA_VALID != (nResult & SCA_VALID) ) 867*cdf0e10cSrcweir return 0; 868*cdf0e10cSrcweir 869*cdf0e10cSrcweir ScRefAddress start, end; 870*cdf0e10cSrcweir ConvertDoubleRef( mpDoc, theCurPosStr, 1, start, end, mpDoc->GetAddressConvention() ); 871*cdf0e10cSrcweir ScRange aNewRange( start.GetAddress(), end.GetAddress() ); 872*cdf0e10cSrcweir ScSheetSourceDesc inSheet = *mxDlgDPObject->GetSheetDesc(); 873*cdf0e10cSrcweir 874*cdf0e10cSrcweir // new range is identical to the current range 875*cdf0e10cSrcweir if( inSheet.aSourceRange == aNewRange ) 876*cdf0e10cSrcweir return 0; 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir ScTabViewShell* pTabViewShell = mpViewData->GetViewShell(); 879*cdf0e10cSrcweir inSheet.aSourceRange = aNewRange; 880*cdf0e10cSrcweir mxDlgDPObject->SetSheetDesc( inSheet ); 881*cdf0e10cSrcweir mxDlgDPObject->FillOldParam( maPivotData ); 882*cdf0e10cSrcweir mxDlgDPObject->FillLabelData( maPivotData ); 883*cdf0e10cSrcweir 884*cdf0e10cSrcweir // SetDialogDPObject does not take ownership but makes a copy internally 885*cdf0e10cSrcweir pTabViewShell->SetDialogDPObject( mxDlgDPObject.get() ); 886*cdf0e10cSrcweir 887*cdf0e10cSrcweir // re-initialize the field windows from the new data 888*cdf0e10cSrcweir InitFieldWindows(); 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir return 0; 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir 893*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, SelAreaHdl, ListBox *, EMPTYARG ) 894*cdf0e10cSrcweir { 895*cdf0e10cSrcweir String aString; 896*cdf0e10cSrcweir sal_uInt16 nSelPos = maLbOutPos.GetSelectEntryPos(); 897*cdf0e10cSrcweir if( nSelPos > 1 ) 898*cdf0e10cSrcweir { 899*cdf0e10cSrcweir aString = *(String*)maLbOutPos.GetEntryData( nSelPos ); 900*cdf0e10cSrcweir } 901*cdf0e10cSrcweir else 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir // do not allow to specify output position, if target is "new sheet" 904*cdf0e10cSrcweir bool bNewSheet = nSelPos == 1; 905*cdf0e10cSrcweir maEdOutPos.Enable( !bNewSheet ); 906*cdf0e10cSrcweir maRbOutPos.Enable( !bNewSheet ); 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir 909*cdf0e10cSrcweir maEdOutPos.SetText( aString ); 910*cdf0e10cSrcweir return 0; 911*cdf0e10cSrcweir } 912*cdf0e10cSrcweir 913*cdf0e10cSrcweir IMPL_LINK( ScPivotLayoutDlg, ChildEventListener, VclWindowEvent*, pEvent ) 914*cdf0e10cSrcweir { 915*cdf0e10cSrcweir Window* pWindow = pEvent->GetWindow(); 916*cdf0e10cSrcweir // check that this dialog is the parent of the window, to ignore focus events from sub dialogs 917*cdf0e10cSrcweir if( (pEvent->GetId() == VCLEVENT_WINDOW_GETFOCUS) && pWindow && (pWindow->GetParent() == this) ) 918*cdf0e10cSrcweir { 919*cdf0e10cSrcweir // check if old window and/or new window are field windows 920*cdf0e10cSrcweir ScPivotFieldWindow* pSourceWindow = mpFocusWindow; 921*cdf0e10cSrcweir ScPivotFieldWindow* pTargetWindow = dynamic_cast< ScPivotFieldWindow* >( pWindow ); 922*cdf0e10cSrcweir 923*cdf0e10cSrcweir /* Enable or disable the Remove/Options buttons. Do nothing if the 924*cdf0e10cSrcweir buttons themselves get the focus. 925*cdf0e10cSrcweir #128113# The TestTool may set the focus into an empty window. Then 926*cdf0e10cSrcweir the Remove/Options buttons must be disabled. */ 927*cdf0e10cSrcweir if( (pWindow != &maBtnRemove) && (pWindow != &maBtnOptions) ) 928*cdf0e10cSrcweir { 929*cdf0e10cSrcweir bool bEnableButtons = pTargetWindow && (pTargetWindow->GetType() != PIVOTFIELDTYPE_SELECT) && !pTargetWindow->IsEmpty(); 930*cdf0e10cSrcweir maBtnRemove.Enable( bEnableButtons ); 931*cdf0e10cSrcweir maBtnOptions.Enable( bEnableButtons ); 932*cdf0e10cSrcweir /* Remember the new focus window (will not be changed, if 933*cdf0e10cSrcweir Remove/Option buttons are getting focus, because they need to 934*cdf0e10cSrcweir know the field window they are working on). */ 935*cdf0e10cSrcweir mpFocusWindow = pTargetWindow; 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir 938*cdf0e10cSrcweir /* Move the last selected field to target window, if focus changes via 939*cdf0e10cSrcweir keyboard shortcut. */ 940*cdf0e10cSrcweir if( pSourceWindow && pTargetWindow && (pSourceWindow != pTargetWindow) && ((pTargetWindow->GetGetFocusFlags() & GETFOCUS_MNEMONIC) != 0) ) 941*cdf0e10cSrcweir { 942*cdf0e10cSrcweir // append field in target window 943*cdf0e10cSrcweir MoveField( *pSourceWindow, *pTargetWindow, pTargetWindow->GetFieldCount(), false ); 944*cdf0e10cSrcweir // move cursor in selection window to next field 945*cdf0e10cSrcweir if( pSourceWindow->GetType() == PIVOTFIELDTYPE_SELECT ) 946*cdf0e10cSrcweir pSourceWindow->SelectNextField(); 947*cdf0e10cSrcweir // return focus to source window (if it is not empty) 948*cdf0e10cSrcweir GrabFieldFocus( pSourceWindow->IsEmpty() ? *pTargetWindow : *pSourceWindow ); 949*cdf0e10cSrcweir } 950*cdf0e10cSrcweir 951*cdf0e10cSrcweir mpActiveEdit = dynamic_cast< ::formula::RefEdit* >( pEvent->GetWindow() ); 952*cdf0e10cSrcweir } 953*cdf0e10cSrcweir return 0; 954*cdf0e10cSrcweir } 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir // ============================================================================ 957