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 // System - Includes --------------------------------------------------------- 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir // INCLUDE ------------------------------------------------------------------- 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include "tabvwsh.hxx" 40*cdf0e10cSrcweir #include "uiitems.hxx" 41*cdf0e10cSrcweir #include "dbcolect.hxx" 42*cdf0e10cSrcweir #include "rangenam.hxx" 43*cdf0e10cSrcweir #include "rangeutl.hxx" 44*cdf0e10cSrcweir #include "reffact.hxx" 45*cdf0e10cSrcweir #include "document.hxx" 46*cdf0e10cSrcweir #include "scresid.hxx" 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir #include "globstr.hrc" 49*cdf0e10cSrcweir #include "consdlg.hrc" 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir #define _CONSDLG_CXX 52*cdf0e10cSrcweir #include "consdlg.hxx" 53*cdf0e10cSrcweir #undef _CONSDLG_CXX 54*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir #define INFOBOX(id) InfoBox(this, ScGlobal::GetRscString(id)).Execute() 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir //============================================================================ 59*cdf0e10cSrcweir // class ScAreaData 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir class ScAreaData 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir public: 64*cdf0e10cSrcweir ScAreaData() {} 65*cdf0e10cSrcweir ~ScAreaData() {} 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir void Set( const String& rName, const String& rArea, sal_Bool bDb ) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir aStrName = rName; 70*cdf0e10cSrcweir aStrArea = rArea; 71*cdf0e10cSrcweir bIsDbArea = bDb; 72*cdf0e10cSrcweir } 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir String aStrName; 75*cdf0e10cSrcweir String aStrArea; 76*cdf0e10cSrcweir sal_Bool bIsDbArea; 77*cdf0e10cSrcweir }; 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir //============================================================================ 81*cdf0e10cSrcweir // class ScConsolidateDialog 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir ScConsolidateDlg::ScConsolidateDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, 85*cdf0e10cSrcweir const SfxItemSet& rArgSet ) 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_CONSOLIDATE ), 88*cdf0e10cSrcweir // 89*cdf0e10cSrcweir aFtFunc ( this, ScResId( FT_FUNC ) ), 90*cdf0e10cSrcweir aLbFunc ( this, ScResId( LB_FUNC ) ), 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir aFtConsAreas ( this, ScResId( FT_CONSAREAS ) ), 93*cdf0e10cSrcweir aLbConsAreas ( this, ScResId( LB_CONSAREAS ) ), 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir aLbDataArea ( this, ScResId( LB_DATA_AREA ) ), 96*cdf0e10cSrcweir aFtDataArea ( this, ScResId( FT_DATA_AREA ) ), 97*cdf0e10cSrcweir aEdDataArea ( this, this, ScResId( ED_DATA_AREA ) ), 98*cdf0e10cSrcweir aRbDataArea ( this, ScResId( RB_DATA_AREA ), &aEdDataArea, this ), 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir aLbDestArea ( this, ScResId( LB_DEST_AREA ) ), 101*cdf0e10cSrcweir aFtDestArea ( this, ScResId( FT_DEST_AREA ) ), 102*cdf0e10cSrcweir aEdDestArea ( this, this, ScResId( ED_DEST_AREA ) ), 103*cdf0e10cSrcweir aRbDestArea ( this, ScResId( RB_DEST_AREA ), &aEdDestArea, this), 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir aFlConsBy ( this, ScResId( FL_CONSBY ) ), 106*cdf0e10cSrcweir aBtnByRow ( this, ScResId( BTN_BYROW ) ), 107*cdf0e10cSrcweir aBtnByCol ( this, ScResId( BTN_BYCOL) ), 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir aFlSep ( this, ScResId( FL_SEP ) ), 110*cdf0e10cSrcweir aFlOptions ( this, ScResId( FL_OPTIONS ) ), 111*cdf0e10cSrcweir aBtnRefs ( this, ScResId( BTN_REFS ) ), 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir aBtnOk ( this, ScResId( BTN_OK ) ), 114*cdf0e10cSrcweir aBtnCancel ( this, ScResId( BTN_CANCEL ) ), 115*cdf0e10cSrcweir aBtnHelp ( this, ScResId( BTN_HELP ) ), 116*cdf0e10cSrcweir aBtnAdd ( this, ScResId( BTN_ADD ) ), 117*cdf0e10cSrcweir aBtnRemove ( this, ScResId( BTN_REMOVE ) ), 118*cdf0e10cSrcweir aBtnMore ( this, ScResId( BTN_MORE ) ), 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir aStrUndefined ( ScResId( SCSTR_UNDEFINED ) ), 121*cdf0e10cSrcweir // 122*cdf0e10cSrcweir theConsData ( ((const ScConsolidateItem&) 123*cdf0e10cSrcweir rArgSet.Get( rArgSet.GetPool()-> 124*cdf0e10cSrcweir GetWhich( SID_CONSOLIDATE ) ) 125*cdf0e10cSrcweir ).GetData() ), 126*cdf0e10cSrcweir pViewData ( ((ScTabViewShell*)SfxViewShell::Current())-> 127*cdf0e10cSrcweir GetViewData() ), 128*cdf0e10cSrcweir pDoc ( ((ScTabViewShell*)SfxViewShell::Current())-> 129*cdf0e10cSrcweir GetViewData()->GetDocument() ), 130*cdf0e10cSrcweir pRangeUtil ( new ScRangeUtil ), 131*cdf0e10cSrcweir pAreaData ( NULL ), 132*cdf0e10cSrcweir nAreaDataCount ( 0 ), 133*cdf0e10cSrcweir nWhichCons ( rArgSet.GetPool()->GetWhich( SID_CONSOLIDATE ) ), 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir pRefInputEdit ( &aEdDataArea ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir Init(); 138*cdf0e10cSrcweir FreeResource(); 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir //---------------------------------------------------------------------------- 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir __EXPORT ScConsolidateDlg::~ScConsolidateDlg() 145*cdf0e10cSrcweir { 146*cdf0e10cSrcweir delete [] pAreaData; 147*cdf0e10cSrcweir delete pRangeUtil; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir //---------------------------------------------------------------------------- 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir void ScConsolidateDlg::Init() 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir DBG_ASSERT( pViewData && pDoc && pRangeUtil, "Error in Ctor" ); 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir String aStr; 158*cdf0e10cSrcweir sal_uInt16 i=0; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir aEdDataArea .SetGetFocusHdl( LINK( this, ScConsolidateDlg, GetFocusHdl ) ); 161*cdf0e10cSrcweir aEdDestArea .SetGetFocusHdl( LINK( this, ScConsolidateDlg, GetFocusHdl ) ); 162*cdf0e10cSrcweir aLbDataArea .SetGetFocusHdl( LINK( this, ScConsolidateDlg, GetFocusHdl ) ); 163*cdf0e10cSrcweir aLbDestArea .SetGetFocusHdl( LINK( this, ScConsolidateDlg, GetFocusHdl ) ); 164*cdf0e10cSrcweir aEdDataArea .SetModifyHdl ( LINK( this, ScConsolidateDlg, ModifyHdl ) ); 165*cdf0e10cSrcweir aEdDestArea .SetModifyHdl ( LINK( this, ScConsolidateDlg, ModifyHdl ) ); 166*cdf0e10cSrcweir aLbConsAreas.SetSelectHdl ( LINK( this, ScConsolidateDlg, SelectHdl ) ); 167*cdf0e10cSrcweir aLbDataArea .SetSelectHdl ( LINK( this, ScConsolidateDlg, SelectHdl ) ); 168*cdf0e10cSrcweir aLbDestArea .SetSelectHdl ( LINK( this, ScConsolidateDlg, SelectHdl ) ); 169*cdf0e10cSrcweir aBtnOk .SetClickHdl ( LINK( this, ScConsolidateDlg, OkHdl ) ); 170*cdf0e10cSrcweir aBtnCancel .SetClickHdl ( LINK( this, ScConsolidateDlg, ClickHdl ) ); 171*cdf0e10cSrcweir aBtnAdd .SetClickHdl ( LINK( this, ScConsolidateDlg, ClickHdl ) ); 172*cdf0e10cSrcweir aBtnRemove .SetClickHdl ( LINK( this, ScConsolidateDlg, ClickHdl ) ); 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir aBtnMore.AddWindow( &aFlConsBy ); 175*cdf0e10cSrcweir aBtnMore.AddWindow( &aBtnByRow ); 176*cdf0e10cSrcweir aBtnMore.AddWindow( &aBtnByCol ); 177*cdf0e10cSrcweir aBtnMore.AddWindow( &aFlSep ); 178*cdf0e10cSrcweir aBtnMore.AddWindow( &aFlOptions ); 179*cdf0e10cSrcweir aBtnMore.AddWindow( &aBtnRefs ); 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir aBtnAdd.Disable(); 182*cdf0e10cSrcweir aBtnRemove.Disable(); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir aBtnByRow.Check( theConsData.bByRow ); 185*cdf0e10cSrcweir aBtnByCol.Check( theConsData.bByCol ); 186*cdf0e10cSrcweir aBtnRefs .Check( theConsData.bReferenceData ); 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir aLbFunc.SelectEntryPos( FuncToLbPos( theConsData.eFunction ) ); 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir // Einlesen der Konsolidierungsbereiche 191*cdf0e10cSrcweir aLbConsAreas.Clear(); 192*cdf0e10cSrcweir const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 193*cdf0e10cSrcweir for ( i=0; i<theConsData.nDataAreaCount; i++ ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir const ScArea& rArea = *(theConsData.ppDataAreas[i] ); 196*cdf0e10cSrcweir if ( rArea.nTab < pDoc->GetTableCount() ) 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir ScRange( rArea.nColStart, rArea.nRowStart, rArea.nTab, 199*cdf0e10cSrcweir rArea.nColEnd, rArea.nRowEnd, rArea.nTab ).Format( aStr, 200*cdf0e10cSrcweir SCR_ABS_3D, pDoc, eConv ); 201*cdf0e10cSrcweir aLbConsAreas.InsertEntry( aStr ); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir if ( theConsData.nTab < pDoc->GetTableCount() ) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir ScAddress( theConsData.nCol, theConsData.nRow, theConsData.nTab 208*cdf0e10cSrcweir ).Format( aStr, SCA_ABS_3D, pDoc, eConv ); 209*cdf0e10cSrcweir aEdDestArea.SetText( aStr ); 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir else 212*cdf0e10cSrcweir aEdDestArea.SetText( EMPTY_STRING ); 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir //---------------------------------------------------------- 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir /* 217*cdf0e10cSrcweir * Aus den RangeNames und Datenbankbereichen werden sich 218*cdf0e10cSrcweir * in der Hilfsklasse ScAreaData die Bereichsnamen gemerkt, 219*cdf0e10cSrcweir * die in den ListBoxen erscheinen. 220*cdf0e10cSrcweir */ 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir ScRangeName* pRangeNames = pDoc->GetRangeName(); 223*cdf0e10cSrcweir ScDBCollection* pDbNames = pDoc->GetDBCollection(); 224*cdf0e10cSrcweir const sal_uInt16 nRangeCount = pRangeNames ? pRangeNames->GetCount() : 0; 225*cdf0e10cSrcweir const sal_uInt16 nDbCount = pDbNames ? pDbNames ->GetCount() : 0; 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir nAreaDataCount = nRangeCount+nDbCount; 228*cdf0e10cSrcweir pAreaData = NULL; 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir if ( nAreaDataCount > 0 ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir pAreaData = new ScAreaData[nAreaDataCount]; 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir String aStrName; 235*cdf0e10cSrcweir String aStrArea; 236*cdf0e10cSrcweir sal_uInt16 nAt = 0; 237*cdf0e10cSrcweir ScRange aRange; 238*cdf0e10cSrcweir ScAreaNameIterator aIter( pDoc ); 239*cdf0e10cSrcweir while ( aIter.Next( aStrName, aRange ) ) 240*cdf0e10cSrcweir { 241*cdf0e10cSrcweir aRange.Format( aStrArea, SCA_ABS_3D, pDoc, eConv ); 242*cdf0e10cSrcweir pAreaData[nAt++].Set( aStrName, aStrArea, aIter.WasDBName() ); 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir FillAreaLists(); 247*cdf0e10cSrcweir ModifyHdl( &aEdDestArea ); 248*cdf0e10cSrcweir aLbDataArea.SelectEntryPos( 0 ); 249*cdf0e10cSrcweir aEdDataArea.SetText( EMPTY_STRING ); 250*cdf0e10cSrcweir aEdDataArea.GrabFocus(); 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir aFlSep.SetStyle( aFlSep.GetStyle() | WB_VERT ); 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir //@BugID 54702 Enablen/Disablen nur noch in Basisklasse 255*cdf0e10cSrcweir //SFX_APPWINDOW->Enable(); 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir //---------------------------------------------------------------------------- 260*cdf0e10cSrcweir void ScConsolidateDlg::FillAreaLists() 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir aLbDataArea.Clear(); 263*cdf0e10cSrcweir aLbDestArea.Clear(); 264*cdf0e10cSrcweir aLbDataArea.InsertEntry( aStrUndefined ); 265*cdf0e10cSrcweir aLbDestArea.InsertEntry( aStrUndefined ); 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir if ( pRangeUtil && pAreaData && (nAreaDataCount > 0) ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir String aString; 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir for ( sal_uInt16 i=0; 272*cdf0e10cSrcweir (i<nAreaDataCount) && (pAreaData[i].aStrName.Len()>0); 273*cdf0e10cSrcweir i++ ) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir aLbDataArea.InsertEntry( pAreaData[i].aStrName, i+1 ); 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir // if ( !pAreaData[i].bIsDbArea ) 278*cdf0e10cSrcweir aLbDestArea.InsertEntry( pAreaData[i].aStrName, i+1 ); 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir } 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir //---------------------------------------------------------------------------- 285*cdf0e10cSrcweir // Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als 286*cdf0e10cSrcweir // neue Selektion im Referenz-Fenster angezeigt wird. 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir void ScConsolidateDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir if ( pRefInputEdit ) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir if ( rRef.aStart != rRef.aEnd ) 294*cdf0e10cSrcweir RefInputStart( pRefInputEdit ); 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir String aStr; 297*cdf0e10cSrcweir sal_uInt16 nFmt = SCR_ABS_3D; //!!! nCurTab fehlt noch 298*cdf0e10cSrcweir const formula::FormulaGrammar::AddressConvention eConv = pDocP->GetAddressConvention(); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir if ( rRef.aStart.Tab() != rRef.aEnd.Tab() ) 301*cdf0e10cSrcweir nFmt |= SCA_TAB2_3D; 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir if ( pRefInputEdit == &aEdDataArea) 304*cdf0e10cSrcweir rRef.Format( aStr, nFmt, pDocP, eConv ); 305*cdf0e10cSrcweir else if ( pRefInputEdit == &aEdDestArea ) 306*cdf0e10cSrcweir rRef.aStart.Format( aStr, nFmt, pDocP, eConv ); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir pRefInputEdit->SetRefString( aStr ); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir ModifyHdl( pRefInputEdit ); 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir //---------------------------------------------------------------------------- 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir sal_Bool __EXPORT ScConsolidateDlg::Close() 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir return DoClose( ScConsolidateDlgWrapper::GetChildWindowId() ); 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir //---------------------------------------------------------------------------- 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir void ScConsolidateDlg::SetActive() 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir if ( bDlgLostFocus ) 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir bDlgLostFocus = sal_False; 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir if ( pRefInputEdit ) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir pRefInputEdit->GrabFocus(); 334*cdf0e10cSrcweir ModifyHdl( pRefInputEdit ); 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir else 338*cdf0e10cSrcweir GrabFocus(); 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir RefInputDone(); 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir //---------------------------------------------------------------------------- 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir void __EXPORT ScConsolidateDlg::Deactivate() 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir bDlgLostFocus = sal_True; 349*cdf0e10cSrcweir } 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir //---------------------------------------------------------------------------- 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir sal_Bool ScConsolidateDlg::VerifyEdit( formula::RefEdit* pEd ) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir if ( !pRangeUtil || !pDoc || !pViewData || 357*cdf0e10cSrcweir ((pEd != &aEdDataArea) && (pEd != &aEdDestArea)) ) 358*cdf0e10cSrcweir return sal_False; 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 361*cdf0e10cSrcweir sal_Bool bEditOk = sal_False; 362*cdf0e10cSrcweir String theCompleteStr; 363*cdf0e10cSrcweir const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir if ( pEd == &aEdDataArea ) 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir bEditOk = pRangeUtil->IsAbsArea( pEd->GetText(), pDoc, 368*cdf0e10cSrcweir nTab, &theCompleteStr, NULL, NULL, eConv ); 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir else if ( pEd == &aEdDestArea ) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir String aPosStr; 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir pRangeUtil->CutPosString( pEd->GetText(), aPosStr ); 375*cdf0e10cSrcweir bEditOk = pRangeUtil->IsAbsPos( aPosStr, pDoc, 376*cdf0e10cSrcweir nTab, &theCompleteStr, NULL, eConv ); 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir if ( bEditOk ) 380*cdf0e10cSrcweir pEd->SetText( theCompleteStr ); 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir return bEditOk; 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir //---------------------------------------------------------------------------- 387*cdf0e10cSrcweir // Handler: 388*cdf0e10cSrcweir // ======== 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir IMPL_LINK( ScConsolidateDlg, GetFocusHdl, Control*, pCtr ) 391*cdf0e10cSrcweir { 392*cdf0e10cSrcweir if ( pCtr ==(Control*)&aEdDataArea || 393*cdf0e10cSrcweir pCtr ==(Control*)&aEdDestArea) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir pRefInputEdit = (formula::RefEdit*)pCtr; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir else if(pCtr ==(Control*)&aLbDataArea ) 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir pRefInputEdit = &aEdDataArea; 400*cdf0e10cSrcweir } 401*cdf0e10cSrcweir else if(pCtr ==(Control*)&aLbDestArea ) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir pRefInputEdit = &aEdDestArea; 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir return 0; 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir //---------------------------------------------------------------------------- 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir IMPL_LINK( ScConsolidateDlg, OkHdl, void*, EMPTYARG ) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir sal_uInt16 nDataAreaCount = aLbConsAreas.GetEntryCount(); 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir if ( nDataAreaCount > 0 ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir ScRefAddress aDestAddress; 418*cdf0e10cSrcweir SCTAB nTab = pViewData->GetTabNo(); 419*cdf0e10cSrcweir String aDestPosStr( aEdDestArea.GetText() ); 420*cdf0e10cSrcweir const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir if ( pRangeUtil->IsAbsPos( aDestPosStr, pDoc, nTab, NULL, &aDestAddress, eConv ) ) 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir ScConsolidateParam theOutParam( theConsData ); 425*cdf0e10cSrcweir ScArea** ppDataAreas = new ScArea*[nDataAreaCount]; 426*cdf0e10cSrcweir ScArea* pArea; 427*cdf0e10cSrcweir sal_uInt16 i=0; 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir for ( i=0; i<nDataAreaCount; i++ ) 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir pArea = new ScArea; 432*cdf0e10cSrcweir pRangeUtil->MakeArea( aLbConsAreas.GetEntry( i ), 433*cdf0e10cSrcweir *pArea, pDoc, nTab, eConv ); 434*cdf0e10cSrcweir ppDataAreas[i] = pArea; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir theOutParam.nCol = aDestAddress.Col(); 438*cdf0e10cSrcweir theOutParam.nRow = aDestAddress.Row(); 439*cdf0e10cSrcweir theOutParam.nTab = aDestAddress.Tab(); 440*cdf0e10cSrcweir theOutParam.eFunction = LbPosToFunc( aLbFunc.GetSelectEntryPos() ); 441*cdf0e10cSrcweir theOutParam.bByCol = aBtnByCol.IsChecked(); 442*cdf0e10cSrcweir theOutParam.bByRow = aBtnByRow.IsChecked(); 443*cdf0e10cSrcweir theOutParam.bReferenceData = aBtnRefs.IsChecked(); 444*cdf0e10cSrcweir theOutParam.SetAreas( ppDataAreas, nDataAreaCount ); 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir for ( i=0; i<nDataAreaCount; i++ ) 447*cdf0e10cSrcweir delete ppDataAreas[i]; 448*cdf0e10cSrcweir delete [] ppDataAreas; 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir ScConsolidateItem aOutItem( nWhichCons, &theOutParam ); 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir SetDispatcherLock( sal_False ); 453*cdf0e10cSrcweir SwitchToDocument(); 454*cdf0e10cSrcweir GetBindings().GetDispatcher()->Execute( SID_CONSOLIDATE, 455*cdf0e10cSrcweir SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, 456*cdf0e10cSrcweir &aOutItem, 0L, 0L ); 457*cdf0e10cSrcweir Close(); 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir else 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir INFOBOX( STR_INVALID_TABREF ); 462*cdf0e10cSrcweir aEdDestArea.GrabFocus(); 463*cdf0e10cSrcweir } 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir else 466*cdf0e10cSrcweir Close(); // keine Datenbereiche definiert -> Cancel 467*cdf0e10cSrcweir return 0; 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir //---------------------------------------------------------------------------- 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir IMPL_LINK( ScConsolidateDlg, ClickHdl, PushButton*, pBtn ) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir if ( pBtn == &aBtnCancel ) 476*cdf0e10cSrcweir Close(); 477*cdf0e10cSrcweir else if ( pBtn == &aBtnAdd ) 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir if ( aEdDataArea.GetText().Len() > 0 ) 480*cdf0e10cSrcweir { 481*cdf0e10cSrcweir String aNewEntry( aEdDataArea.GetText() ); 482*cdf0e10cSrcweir ScArea** ppAreas = NULL; 483*cdf0e10cSrcweir sal_uInt16 nAreaCount = 0; 484*cdf0e10cSrcweir const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir if ( pRangeUtil->IsAbsTabArea( aNewEntry, pDoc, &ppAreas, &nAreaCount, sal_True, eConv ) ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir // IsAbsTabArea() legt ein Array von ScArea-Zeigern an, 489*cdf0e10cSrcweir // welche ebenfalls dynamisch erzeugt wurden. 490*cdf0e10cSrcweir // Diese Objekte muessen hier abgeraeumt werden. 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir for ( sal_uInt16 i=0; i<nAreaCount; i++ ) 493*cdf0e10cSrcweir { 494*cdf0e10cSrcweir String aNewArea; 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir if ( ppAreas[i] ) 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir const ScArea& rArea = *(ppAreas[i]); 499*cdf0e10cSrcweir ScRange( rArea.nColStart, rArea.nRowStart, rArea.nTab, 500*cdf0e10cSrcweir rArea.nColEnd, rArea.nRowEnd, rArea.nTab 501*cdf0e10cSrcweir ).Format( aNewArea, SCR_ABS_3D, pDoc, eConv ); 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir if ( aLbConsAreas.GetEntryPos( aNewArea ) 504*cdf0e10cSrcweir == LISTBOX_ENTRY_NOTFOUND ) 505*cdf0e10cSrcweir { 506*cdf0e10cSrcweir aLbConsAreas.InsertEntry( aNewArea ); 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir delete ppAreas[i]; 509*cdf0e10cSrcweir } 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir delete [] ppAreas; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir else if ( VerifyEdit( &aEdDataArea ) ) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir String aNewArea( aEdDataArea.GetText() ); 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir if ( aLbConsAreas.GetEntryPos( aNewArea ) == LISTBOX_ENTRY_NOTFOUND ) 518*cdf0e10cSrcweir aLbConsAreas.InsertEntry( aNewArea ); 519*cdf0e10cSrcweir else 520*cdf0e10cSrcweir INFOBOX( STR_AREA_ALREADY_INSERTED ); 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir else 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir INFOBOX( STR_INVALID_TABREF ); 525*cdf0e10cSrcweir aEdDataArea.GrabFocus(); 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir } 529*cdf0e10cSrcweir else if ( pBtn == &aBtnRemove ) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir while ( aLbConsAreas.GetSelectEntryCount() ) 532*cdf0e10cSrcweir aLbConsAreas.RemoveEntry( aLbConsAreas.GetSelectEntryPos() ); 533*cdf0e10cSrcweir aBtnRemove.Disable(); 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir return 0; 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir //---------------------------------------------------------------------------- 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir IMPL_LINK( ScConsolidateDlg, SelectHdl, ListBox*, pLb ) 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir if ( pLb == &aLbConsAreas ) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir if ( aLbConsAreas.GetSelectEntryCount() > 0 ) 546*cdf0e10cSrcweir aBtnRemove.Enable(); 547*cdf0e10cSrcweir else 548*cdf0e10cSrcweir aBtnRemove.Disable(); 549*cdf0e10cSrcweir } 550*cdf0e10cSrcweir else if ( (pLb == &aLbDataArea) || (pLb == &aLbDestArea) ) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir Edit* pEd = (pLb == &aLbDataArea) ? &aEdDataArea : &aEdDestArea; 553*cdf0e10cSrcweir sal_uInt16 nSelPos = pLb->GetSelectEntryPos(); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir if ( pRangeUtil 556*cdf0e10cSrcweir && (nSelPos > 0) 557*cdf0e10cSrcweir && (nAreaDataCount > 0) 558*cdf0e10cSrcweir && (pAreaData != NULL) ) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir if ( nSelPos <= nAreaDataCount ) 561*cdf0e10cSrcweir { 562*cdf0e10cSrcweir String aString( pAreaData[nSelPos-1].aStrArea ); 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir if ( pLb == &aLbDestArea ) 565*cdf0e10cSrcweir pRangeUtil->CutPosString( aString, aString ); 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir pEd->SetText( aString ); 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir if ( pEd == &aEdDataArea ) 570*cdf0e10cSrcweir aBtnAdd.Enable(); 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir } 573*cdf0e10cSrcweir else 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir pEd->SetText( EMPTY_STRING ); 576*cdf0e10cSrcweir if ( pEd == &aEdDataArea ) 577*cdf0e10cSrcweir aBtnAdd.Enable(); 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir return 0; 581*cdf0e10cSrcweir } 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir 584*cdf0e10cSrcweir //---------------------------------------------------------------------------- 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir IMPL_LINK( ScConsolidateDlg, ModifyHdl, formula::RefEdit*, pEd ) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir if ( pEd == &aEdDataArea ) 589*cdf0e10cSrcweir { 590*cdf0e10cSrcweir String aAreaStr( pEd->GetText() ); 591*cdf0e10cSrcweir if ( aAreaStr.Len() > 0 ) 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir aBtnAdd.Enable(); 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir else 596*cdf0e10cSrcweir aBtnAdd.Disable(); 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir else if ( pEd == &aEdDestArea ) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir aLbDestArea.SelectEntryPos(0); 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir return 0; 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir //---------------------------------------------------------------------------- 607*cdf0e10cSrcweir // Verallgemeinern!!! : 608*cdf0e10cSrcweir // Resource der ListBox und diese beiden Umrechnungsmethoden gibt es 609*cdf0e10cSrcweir // auch noch in tpsubt bzw. ueberall, wo StarCalc-Funktionen 610*cdf0e10cSrcweir // auswaehlbar sind. 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir ScSubTotalFunc ScConsolidateDlg::LbPosToFunc( sal_uInt16 nPos ) 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir switch ( nPos ) 615*cdf0e10cSrcweir { 616*cdf0e10cSrcweir case 2: return SUBTOTAL_FUNC_AVE; 617*cdf0e10cSrcweir case 6: return SUBTOTAL_FUNC_CNT; 618*cdf0e10cSrcweir case 1: return SUBTOTAL_FUNC_CNT2; 619*cdf0e10cSrcweir case 3: return SUBTOTAL_FUNC_MAX; 620*cdf0e10cSrcweir case 4: return SUBTOTAL_FUNC_MIN; 621*cdf0e10cSrcweir case 5: return SUBTOTAL_FUNC_PROD; 622*cdf0e10cSrcweir case 7: return SUBTOTAL_FUNC_STD; 623*cdf0e10cSrcweir case 8: return SUBTOTAL_FUNC_STDP; 624*cdf0e10cSrcweir case 9: return SUBTOTAL_FUNC_VAR; 625*cdf0e10cSrcweir case 10: return SUBTOTAL_FUNC_VARP; 626*cdf0e10cSrcweir case 0: 627*cdf0e10cSrcweir default: 628*cdf0e10cSrcweir return SUBTOTAL_FUNC_SUM; 629*cdf0e10cSrcweir } 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir //---------------------------------------------------------------------------- 634*cdf0e10cSrcweir 635*cdf0e10cSrcweir sal_uInt16 ScConsolidateDlg::FuncToLbPos( ScSubTotalFunc eFunc ) 636*cdf0e10cSrcweir { 637*cdf0e10cSrcweir switch ( eFunc ) 638*cdf0e10cSrcweir { 639*cdf0e10cSrcweir case SUBTOTAL_FUNC_AVE: return 2; 640*cdf0e10cSrcweir case SUBTOTAL_FUNC_CNT: return 6; 641*cdf0e10cSrcweir case SUBTOTAL_FUNC_CNT2: return 1; 642*cdf0e10cSrcweir case SUBTOTAL_FUNC_MAX: return 3; 643*cdf0e10cSrcweir case SUBTOTAL_FUNC_MIN: return 4; 644*cdf0e10cSrcweir case SUBTOTAL_FUNC_PROD: return 5; 645*cdf0e10cSrcweir case SUBTOTAL_FUNC_STD: return 7; 646*cdf0e10cSrcweir case SUBTOTAL_FUNC_STDP: return 8; 647*cdf0e10cSrcweir case SUBTOTAL_FUNC_VAR: return 9; 648*cdf0e10cSrcweir case SUBTOTAL_FUNC_VARP: return 10; 649*cdf0e10cSrcweir case SUBTOTAL_FUNC_NONE: 650*cdf0e10cSrcweir case SUBTOTAL_FUNC_SUM: 651*cdf0e10cSrcweir default: 652*cdf0e10cSrcweir return 0; 653*cdf0e10cSrcweir } 654*cdf0e10cSrcweir } 655*cdf0e10cSrcweir 656