blob: 84da08166dcde3c310fa9b56da7dd23eaa88801a [file] [log] [blame]
/**************************************************************
*
* 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 <sfx2/dispatch.hxx>
#include <vcl/msgbox.hxx>
#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;
}