/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" //---------------------------------------------------------------------------- #include "scitems.hxx" #include #include #include "uiitems.hxx" #include "global.hxx" #include "document.hxx" #include "scresid.hxx" #include "sc.hrc" #include "reffact.hxx" #include "tabopdlg.hrc" #define _TABOPDLG_CXX #include "tabopdlg.hxx" //============================================================================ // class ScTabOpDlg //---------------------------------------------------------------------------- ScTabOpDlg::ScTabOpDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, ScDocument* pDocument, const ScRefAddress& rCursorPos ) : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_TABOP ), // aFlVariables ( this, ScResId( FL_VARIABLES ) ), aFtFormulaRange ( this, ScResId( FT_FORMULARANGE ) ), aEdFormulaRange ( this, this, ScResId( ED_FORMULARANGE ) ), aRBFormulaRange ( this, ScResId( RB_FORMULARANGE ), &aEdFormulaRange, this ), aFtRowCell ( this, ScResId( FT_ROWCELL ) ), aEdRowCell ( this, this, ScResId( ED_ROWCELL ) ), aRBRowCell ( this, ScResId( RB_ROWCELL ), &aEdRowCell, this ), aFtColCell ( this, ScResId( FT_COLCELL ) ), aEdColCell ( this, this, ScResId( ED_COLCELL ) ), aRBColCell ( this, ScResId( RB_COLCELL ), &aEdColCell, this ), aBtnOk ( this, ScResId( BTN_OK ) ), aBtnCancel ( this, ScResId( BTN_CANCEL ) ), aBtnHelp ( this, ScResId( BTN_HELP ) ), // theFormulaCell ( rCursorPos ), pDoc ( pDocument ), nCurTab ( theFormulaCell.Tab() ), pEdActive ( NULL ), bDlgLostFocus ( sal_False ), errMsgNoFormula ( ScResId( STR_NOFORMULA ) ), errMsgNoColRow ( ScResId( STR_NOCOLROW ) ), errMsgWrongFormula ( ScResId( STR_WRONGFORMULA ) ), errMsgWrongRowCol ( ScResId( STR_WRONGROWCOL ) ), errMsgNoColFormula ( ScResId( STR_NOCOLFORMULA ) ), errMsgNoRowFormula ( ScResId( STR_NOROWFORMULA ) ) { Init(); FreeResource(); } //---------------------------------------------------------------------------- __EXPORT ScTabOpDlg::~ScTabOpDlg() { Hide(); } //---------------------------------------------------------------------------- void __EXPORT ScTabOpDlg::Init() { aBtnOk. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); aBtnCancel. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); Link aLink = LINK( this, ScTabOpDlg, GetFocusHdl ); aEdFormulaRange.SetGetFocusHdl( aLink ); aRBFormulaRange.SetGetFocusHdl( aLink ); aEdRowCell. SetGetFocusHdl( aLink ); aRBRowCell. SetGetFocusHdl( aLink ); aEdColCell. SetGetFocusHdl( aLink ); aRBColCell. SetGetFocusHdl( aLink ); aLink = LINK( this, ScTabOpDlg, LoseFocusHdl ); aEdFormulaRange.SetLoseFocusHdl( aLink ); aRBFormulaRange.SetLoseFocusHdl( aLink ); aEdRowCell. SetLoseFocusHdl( aLink ); aRBRowCell. SetLoseFocusHdl( aLink ); aEdColCell. SetLoseFocusHdl( aLink ); aRBColCell. SetLoseFocusHdl( aLink ); aEdFormulaRange.GrabFocus(); pEdActive = &aEdFormulaRange; //@BugID 54702 Enablen/Disablen nur noch in Basisklasse //SFX_APPWINDOW->Enable(); } //---------------------------------------------------------------------------- sal_Bool __EXPORT ScTabOpDlg::Close() { return DoClose( ScTabOpDlgWrapper::GetChildWindowId() ); } //---------------------------------------------------------------------------- void ScTabOpDlg::SetActive() { if ( bDlgLostFocus ) { bDlgLostFocus = sal_False; if( pEdActive ) pEdActive->GrabFocus(); } else GrabFocus(); RefInputDone(); } //---------------------------------------------------------------------------- void ScTabOpDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) { if ( pEdActive ) { ScAddress::Details aDetails(pDocP->GetAddressConvention(), 0, 0); if ( rRef.aStart != rRef.aEnd ) RefInputStart(pEdActive); String aStr; sal_uInt16 nFmt = ( rRef.aStart.Tab() == nCurTab ) ? SCR_ABS : SCR_ABS_3D; if ( pEdActive == &aEdFormulaRange ) { theFormulaCell.Set( rRef.aStart, false, false, false); theFormulaEnd.Set( rRef.aEnd, false, false, false); rRef.Format( aStr, nFmt, pDocP, aDetails ); } else if ( pEdActive == &aEdRowCell ) { theRowCell.Set( rRef.aStart, false, false, false); rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); } else if ( pEdActive == &aEdColCell ) { theColCell.Set( rRef.aStart, false, false, false); rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); } pEdActive->SetRefString( aStr ); } } //---------------------------------------------------------------------------- void ScTabOpDlg::RaiseError( ScTabOpErr eError ) { const String* pMsg = &errMsgNoFormula; Edit* pEd = &aEdFormulaRange; switch ( eError ) { case TABOPERR_NOFORMULA: pMsg = &errMsgNoFormula; pEd = &aEdFormulaRange; break; case TABOPERR_NOCOLROW: pMsg = &errMsgNoColRow; pEd = &aEdRowCell; break; case TABOPERR_WRONGFORMULA: pMsg = &errMsgWrongFormula; pEd = &aEdFormulaRange; break; case TABOPERR_WRONGROW: pMsg = &errMsgWrongRowCol; pEd = &aEdRowCell; break; case TABOPERR_NOCOLFORMULA: pMsg = &errMsgNoColFormula; pEd = &aEdFormulaRange; break; case TABOPERR_WRONGCOL: pMsg = &errMsgWrongRowCol; pEd = &aEdColCell; break; case TABOPERR_NOROWFORMULA: pMsg = &errMsgNoRowFormula; pEd = &aEdFormulaRange; break; } ErrorBox( this, WinBits( WB_OK_CANCEL | WB_DEF_OK), *pMsg ).Execute(); pEd->GrabFocus(); } //---------------------------------------------------------------------------- sal_Bool lcl_Parse( const String& rString, ScDocument* pDoc, SCTAB nCurTab, ScRefAddress& rStart, ScRefAddress& rEnd ) { sal_Bool bRet = sal_False; const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); if ( rString.Search(':') != STRING_NOTFOUND ) bRet = ConvertDoubleRef( pDoc, rString, nCurTab, rStart, rEnd, eConv ); else { bRet = ConvertSingleRef( pDoc, rString, nCurTab, rStart, eConv ); rEnd = rStart; } return bRet; } //---------------------------------------------------------------------------- // Handler: IMPL_LINK( ScTabOpDlg, BtnHdl, PushButton*, pBtn ) { if ( pBtn == &aBtnOk ) { sal_uInt8 nMode = 3; sal_uInt16 nError = 0; // Zu ueberpruefen: // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen? // 2. IstFormelRang Zeile bei leerer Zeile bzw. Spalte bei leerer Spalte // bzw. Einfachreferenz bei beidem? // 3. Ist mindestens Zeile oder Spalte und Formel voll? if (aEdFormulaRange.GetText().Len() == 0) nError = TABOPERR_NOFORMULA; else if (aEdRowCell.GetText().Len() == 0 && aEdColCell.GetText().Len() == 0) nError = TABOPERR_NOCOLROW; else if ( !lcl_Parse( aEdFormulaRange.GetText(), pDoc, nCurTab, theFormulaCell, theFormulaEnd ) ) nError = TABOPERR_WRONGFORMULA; else { const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); if (aEdRowCell.GetText().Len() > 0) { if (!ConvertSingleRef( pDoc, aEdRowCell.GetText(), nCurTab, theRowCell, eConv )) nError = TABOPERR_WRONGROW; else { if (aEdColCell.GetText().Len() == 0 && theFormulaCell.Col() != theFormulaEnd.Col()) nError = TABOPERR_NOCOLFORMULA; else nMode = 1; } } if (aEdColCell.GetText().Len() > 0) { if (!ConvertSingleRef( pDoc, aEdColCell.GetText(), nCurTab, theColCell, eConv )) nError = TABOPERR_WRONGCOL; else { if (nMode == 1) // beides { nMode = 2; ConvertSingleRef( pDoc, aEdFormulaRange.GetText(), nCurTab, theFormulaCell, eConv ); } else if (theFormulaCell.Row() != theFormulaEnd.Row()) nError = TABOPERR_NOROWFORMULA; else nMode = 0; } } } if (nError) RaiseError( (ScTabOpErr) nError ); else { ScTabOpParam aOutParam( theFormulaCell, theFormulaEnd, theRowCell, theColCell, nMode ); ScTabOpItem aOutItem( SID_TABOP, &aOutParam ); SetDispatcherLock( sal_False ); SwitchToDocument(); GetBindings().GetDispatcher()->Execute( SID_TABOP, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aOutItem, 0L, 0L ); Close(); } } else if ( pBtn == &aBtnCancel ) Close(); return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScTabOpDlg, GetFocusHdl, Control*, pCtrl ) { if( (pCtrl == (Control*)&aEdFormulaRange) || (pCtrl == (Control*)&aRBFormulaRange) ) pEdActive = &aEdFormulaRange; else if( (pCtrl == (Control*)&aEdRowCell) || (pCtrl == (Control*)&aRBRowCell) ) pEdActive = &aEdRowCell; else if( (pCtrl == (Control*)&aEdColCell) || (pCtrl == (Control*)&aRBColCell) ) pEdActive = &aEdColCell; else pEdActive = NULL; if( pEdActive ) pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScTabOpDlg, LoseFocusHdl, Control*, EMPTYARG ) { bDlgLostFocus = !IsActive(); return 0; }