/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #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, &aFtFormulaRange, this ), aFtRowCell ( this, ScResId( FT_ROWCELL ) ), aEdRowCell ( this, this, ScResId( ED_ROWCELL ) ), aRBRowCell ( this, ScResId( RB_ROWCELL ), &aEdRowCell, &aFtRowCell, this ), aFtColCell ( this, ScResId( FT_COLCELL ) ), aEdColCell ( this, this, ScResId( ED_COLCELL ) ), aRBColCell ( this, ScResId( RB_COLCELL ), &aEdColCell, &aFtColCell, 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 ( 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(); } //---------------------------------------------------------------------------- ScTabOpDlg::~ScTabOpDlg() { Hide(); } //---------------------------------------------------------------------------- void 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 ScTabOpDlg::Close() { return DoClose( ScTabOpDlgWrapper::GetChildWindowId() ); } //---------------------------------------------------------------------------- void ScTabOpDlg::SetActive() { if ( bDlgLostFocus ) { bDlgLostFocus = 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(); } //---------------------------------------------------------------------------- static sal_Bool lcl_Parse( const String& rString, ScDocument* pDoc, SCTAB nCurTab, ScRefAddress& rStart, ScRefAddress& rEnd ) { sal_Bool bRet = 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().isEmpty()) nError = TABOPERR_NOFORMULA; else if (aEdRowCell.GetText().isEmpty() && aEdColCell.GetText().isEmpty()) 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().isEmpty()) { if (!ConvertSingleRef( pDoc, aEdRowCell.GetText(), nCurTab, theRowCell, eConv )) nError = TABOPERR_WRONGROW; else { if (aEdColCell.GetText().isEmpty() && theFormulaCell.Col() != theFormulaEnd.Col()) nError = TABOPERR_NOCOLFORMULA; else nMode = 1; } } if (!aEdColCell.GetText().isEmpty()) { 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( 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_NOARG(ScTabOpDlg, LoseFocusHdl) { bDlgLostFocus = !IsActive(); return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */