blob: d25c6e33f280fc9748d8b658f9d12ac58c379476 [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"
// System - Includes ---------------------------------------------------------
// INCLUDE -------------------------------------------------------------------
#include "reffact.hxx"
#include "document.hxx"
#include "scresid.hxx"
#include "globstr.hrc"
#include "crnrdlg.hrc"
#include "docsh.hxx"
#define _CRNRDLG_CXX
#include "crnrdlg.hxx"
#undef _CRNRDLG_CXX
#include <vcl/msgbox.hxx>
//============================================================================
#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute()
#define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute()
const sal_uLong nEntryDataCol = 0;
const sal_uLong nEntryDataRow = 1;
const sal_uLong nEntryDataDelim = 2;
//============================================================================
// class ScColRowNameRangesDlg
/*************************************************************************
#* Member: ScColRowNameRangesDlg Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg.
#* Initialisieren der Klassen- Mitglieder,
#* Uebernahme der Range- Angaben und Aufruf
#* der eigentlichen Initialisierungsroutine
#*
#* Input: Sfx- Verknuepfungen
#* Parent- Window
#* SCViewData
#*
#* Output: ---
#*
#************************************************************************/
ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB,
SfxChildWindow* pCW,
Window* pParent,
ScViewData* ptrViewData )
: ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_COLROWNAMERANGES ),
//
aFlAssign ( this, ScResId( FL_ASSIGN ) ),
aLbRange ( this, ScResId( LB_RANGE ) ),
aEdAssign ( this, this, ScResId( ED_AREA ) ),
aRbAssign ( this, ScResId( RB_AREA ), &aEdAssign, this ),
aBtnColHead ( this, ScResId( BTN_COLHEAD ) ),
aBtnRowHead ( this, ScResId( BTN_ROWHEAD ) ),
aFtAssign2 ( this, ScResId( FT_DATA_LABEL ) ),
aEdAssign2 ( this, this, ScResId( ED_DATA ) ),
aRbAssign2 ( this, ScResId( RB_DATA ), &aEdAssign2, this ),
aBtnOk ( this, ScResId( BTN_OK ) ),
aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
aBtnHelp ( this, ScResId( BTN_HELP ) ),
aBtnAdd ( this, ScResId( BTN_ADD ) ),
aBtnRemove ( this, ScResId( BTN_REMOVE ) ),
pViewData ( ptrViewData ),
pDoc ( ptrViewData->GetDocument() ),
pEdActive ( NULL ),
bDlgLostFocus ( sal_False )
{
xColNameRanges = pDoc->GetColNameRanges()->Clone();
xRowNameRanges = pDoc->GetRowNameRanges()->Clone();
Init();
FreeResource();
aRbAssign.SetAccessibleRelationMemberOf(&aEdAssign);
aRbAssign2.SetAccessibleRelationMemberOf(&aEdAssign);
}
/*************************************************************************
#* Member: ~ScColRowNameRangesDlg Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Destruktor der Klasse
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
__EXPORT ScColRowNameRangesDlg::~ScColRowNameRangesDlg()
{
}
/*************************************************************************
#* Member: Init Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Initialisierungs- Routine:
#* Umlenken der Event- Handler und einstellen der
#* Startparameter.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::Init()
{
SCCOL nStartCol = 0;
SCROW nStartRow = 0;
SCTAB nStartTab = 0;
SCCOL nEndCol = 0;
SCROW nEndRow = 0;
SCTAB nEndTab = 0;
aBtnOk.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) );
aBtnCancel.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) );
aBtnAdd.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) );
aBtnRemove.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) );
aLbRange.SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) );
aEdAssign.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) );
aBtnColHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) );
aBtnRowHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) );
aEdAssign2.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) );
Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl );
aEdAssign.SetGetFocusHdl( aLink );
aRbAssign.SetGetFocusHdl( aLink );
aEdAssign2.SetGetFocusHdl( aLink );
aRbAssign2.SetGetFocusHdl( aLink );
aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl );
aEdAssign.SetLoseFocusHdl( aLink );
aRbAssign.SetLoseFocusHdl( aLink );
aEdAssign2.SetLoseFocusHdl( aLink );
aRbAssign2.SetLoseFocusHdl( aLink );
pEdActive = &aEdAssign;
UpdateNames();
if ( pViewData && pDoc )
{
pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
nEndCol, nEndRow, nEndTab );
SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ),
ScAddress( nEndCol, nEndRow, nEndTab ) ) );
}
else
{
aBtnColHead.Check( sal_True );
aBtnRowHead.Check( sal_False );
aEdAssign.SetText( EMPTY_STRING );
aEdAssign2.SetText( EMPTY_STRING );
}
aLbRange.SetBorderStyle( WINDOW_BORDER_MONO );
aBtnColHead.Enable();
aBtnRowHead.Enable();
aEdAssign.Enable();
aEdAssign.GrabFocus();
aRbAssign.Enable();
//@BugID 54702 Enablen/Disablen nur noch in Basisklasse
//SFX_APPWINDOW->Enable(); // Ref-Feld hat Focus
Range1SelectHdl( 0 );
}
/*************************************************************************
#* Member: SetColRowData Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
#* auf default Werte setzen und beide Referenz-Edit-Felder
#* fuellen.
#*
#* Input: Einstellbereich fuer Labels
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,sal_Bool bRef)
{
theCurData = theCurArea = rLabelRange;
sal_Bool bValid = sal_True;
SCCOL nCol1 = theCurArea.aStart.Col();
SCCOL nCol2 = theCurArea.aEnd.Col();
SCROW nRow1 = theCurArea.aStart.Row();
SCROW nRow2 = theCurArea.aEnd.Row();
if ( (static_cast<SCCOLROW>(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) )
{ // Spaltenkoepfe und Grenzfall gesamte Tabelle
aBtnColHead.Check( sal_True );
aBtnRowHead.Check( sal_False );
if ( nRow2 == MAXROW )
{
if ( nRow1 == 0 )
bValid = sal_False; // Grenzfall gesamte Tabelle
else
{ // Head unten, Data oben
theCurData.aStart.SetRow( 0 );
theCurData.aEnd.SetRow( nRow1 - 1 );
}
}
else
{ // Head oben, Data unten
theCurData.aStart.SetRow( nRow2 + 1 );
theCurData.aEnd.SetRow( MAXROW );
}
}
else
{ // Zeilenkoepfe
aBtnRowHead.Check( sal_True );
aBtnColHead.Check( sal_False );
if ( nCol2 == MAXCOL )
{ // Head rechts, Data links
theCurData.aStart.SetCol( 0 );
theCurData.aEnd.SetCol( nCol2 - 1 );
}
else
{ // Head links, Data rechts
theCurData.aStart.SetCol( nCol2 + 1 );
theCurData.aEnd.SetCol( MAXCOL );
}
}
if ( bValid )
{
const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
String aStr;
theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv );
if(bRef)
aEdAssign.SetRefString( aStr );
else
aEdAssign.SetText( aStr );
aEdAssign.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv );
if(bRef)
aEdAssign2.SetRefString( aStr );
else
aEdAssign2.SetText( aStr );
}
else
{
theCurData = theCurArea = ScRange();
if(bRef)
{
aEdAssign.SetRefString( EMPTY_STRING );
aEdAssign2.SetRefString( EMPTY_STRING );
}
else
{
aEdAssign.SetText( EMPTY_STRING );
aEdAssign2.SetText( EMPTY_STRING );
}
aBtnColHead.Disable();
aBtnRowHead.Disable();
aEdAssign2.Disable();
aRbAssign2.Disable();
}
}
/*************************************************************************
#* Member: AdjustColRowData Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
#* anpassen und Data-Referenz-Edit-Feld fuellen.
#*
#* Input: Bereich fuer Labels
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange,sal_Bool bRef)
{
theCurData = rDataRange;
if ( aBtnColHead.IsChecked() )
{ // Datenbereich gleiche Spalten wie Koepfe
theCurData.aStart.SetCol( theCurArea.aStart.Col() );
theCurData.aEnd.SetCol( theCurArea.aEnd.Col() );
if ( theCurData.Intersects( theCurArea ) )
{
SCROW nRow1 = theCurArea.aStart.Row();
SCROW nRow2 = theCurArea.aEnd.Row();
if ( nRow1 > 0
&& (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) )
{ // Data oben
theCurData.aEnd.SetRow( nRow1 - 1 );
if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
theCurData.aStart.SetRow( theCurData.aEnd.Row() );
}
else
{ // Data unten
theCurData.aStart.SetRow( nRow2 + 1 );
if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
theCurData.aEnd.SetRow( theCurData.aStart.Row() );
}
}
}
else
{ // Datenbereich gleiche Zeilen wie Koepfe
theCurData.aStart.SetRow( theCurArea.aStart.Row() );
theCurData.aEnd.SetRow( theCurArea.aEnd.Row() );
if ( theCurData.Intersects( theCurArea ) )
{
SCCOL nCol1 = theCurArea.aStart.Col();
SCCOL nCol2 = theCurArea.aEnd.Col();
if ( nCol1 > 0
&& (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) )
{ // Data links
theCurData.aEnd.SetCol( nCol1 - 1 );
if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
theCurData.aStart.SetCol( theCurData.aEnd.Col() );
}
else
{ // Data rechts
theCurData.aStart.SetCol( nCol2 + 1 );
if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
theCurData.aEnd.SetCol( theCurData.aStart.Col() );
}
}
}
String aStr;
theCurData.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() );
if(bRef)
aEdAssign2.SetRefString( aStr );
else
aEdAssign2.SetText( aStr );
aEdAssign2.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
}
/*************************************************************************
#* Member: SetReference Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Uebergabe eines mit der Maus selektierten Tabellen-
#* bereiches, der dann als neue Selektion im Referenz-
#* Fenster angezeigt wird.
#*
#* Input: Bereich fuer Labels
#* Dokumentklasse
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ )
{
if ( pEdActive )
{
if ( rRef.aStart != rRef.aEnd )
RefInputStart( pEdActive );
String aRefStr;
if ( pEdActive == &aEdAssign )
SetColRowData( rRef, sal_True );
else
AdjustColRowData( rRef, sal_True );
aBtnColHead.Enable();
aBtnRowHead.Enable();
aBtnAdd.Enable();
aBtnRemove.Disable();
}
}
/*************************************************************************
#* Member: Close Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Schliessen des Fensters
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
sal_Bool __EXPORT ScColRowNameRangesDlg::Close()
{
return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() );
}
/*************************************************************************
#* Member: SetActive Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Aktivieren des Fensters
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::SetActive()
{
if ( bDlgLostFocus )
{
bDlgLostFocus = sal_False;
if( pEdActive )
pEdActive->GrabFocus();
}
else
GrabFocus();
if( pEdActive == &aEdAssign )
Range1DataModifyHdl( 0 );
else if( pEdActive == &aEdAssign2 )
Range2DataModifyHdl( 0 );
RefInputDone();
}
/*************************************************************************
#* Member: UpdateNames Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Aktualisieren der Namen
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::UpdateNames()
{
aLbRange.SetUpdateMode( sal_False );
//-----------------------------------------------------------
aLbRange.Clear();
aRangeMap.clear();
aEdAssign.SetText( EMPTY_STRING );
sal_uLong nCount, j;
sal_uInt16 nPos; //@008 Hilfsvariable q eingefuegt
SCCOL nCol1; //@008 04.09.97
SCROW nRow1; //Erweiterung fuer Bereichsnamen
SCTAB nTab1;
SCCOL nCol2;
SCROW nRow2;
SCTAB nTab2;
String rString;
String strShow;
const ScAddress::Details aDetails(pDoc->GetAddressConvention());
String aString;
String strDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " ));
aString = strDelim;
aString += ScGlobal::GetRscString( STR_COLUMN );
aString += strDelim;
nPos = aLbRange.InsertEntry( aString );
aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim );
if ( (nCount = xColNameRanges->Count()) > 0 )
{
ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray(
nCount, pDoc );
for ( j=0; j < nCount; j++ )
{
const ScRange aRange(ppSortArray[j]->GetRange(0));
aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails );
//@008 Hole Bereichsparameter aus Dok
ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
nCol2, nRow2, nTab2 );
SCCOL q=nCol1+3;
if(q>nCol2) q=nCol2;
//@008 Baue String zusammen
strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
if(pDoc!=NULL)
{
pDoc->GetString(nCol1, nRow1, nTab1,rString);
strShow +=rString;
for(SCCOL i=nCol1+1;i<=q;i++)
{
strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
pDoc->GetString(i, nRow1, nTab1,rString);
strShow += rString;
}
}
if(q<nCol2) // Zu lang? Ergaenzen um ",..."
{
strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
}
strShow += ']';
//@008 String einfuegen in Listbox
String aInsStr = aString;
aInsStr += strShow;
nPos = aLbRange.InsertEntry( aInsStr );
aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
aLbRange.SetEntryData( nPos, (void*)nEntryDataCol );
}
delete [] ppSortArray;
}
aString = strDelim;
aString += ScGlobal::GetRscString( STR_ROW );
aString += strDelim;
nPos = aLbRange.InsertEntry( aString );
aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim );
if ( (nCount = xRowNameRanges->Count()) > 0 )
{
ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray(
nCount, pDoc );
for ( j=0; j < nCount; j++ )
{
const ScRange aRange(ppSortArray[j]->GetRange(0));
aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails );
//@008 Ab hier baue String fuer Zeilen
ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
nCol2, nRow2, nTab2 );
SCROW q=nRow1+3;
if(q>nRow2) q=nRow2;
strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
if(pDoc!=NULL)
{
pDoc->GetString(nCol1, nRow1, nTab1,rString);
strShow += rString;
for(SCROW i=nRow1+1;i<=q;i++)
{
strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
pDoc->GetString(nCol1, i, nTab1,rString);
strShow += rString;
}
}
if(q<nRow2)
{
strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
}
strShow += ']';
String aInsStr = aString;
aInsStr += strShow;
nPos = aLbRange.InsertEntry( aInsStr );
aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
aLbRange.SetEntryData( nPos, (void*)nEntryDataRow );
}
delete [] ppSortArray;
}
//-----------------------------------------------------------
aLbRange.SetUpdateMode( sal_True );
aLbRange.Invalidate();
}
/*************************************************************************
#* Member: UpdateRangeData Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Aktualisieren der Bereichsdaten
#*
#* Input: Bereichs-String
#* Flag fuer Spalten
#*
#* Output: ---
#*
#************************************************************************/
void ScColRowNameRangesDlg::UpdateRangeData( const ScRange& rRange, sal_Bool bColName )
{
ScRangePair* pPair = NULL;
sal_Bool bFound = sal_False;
if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
bFound = sal_True;
else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
bFound = sal_True;
if ( bFound )
{
const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
String aStr;
theCurArea = rRange;
theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv );
aEdAssign.SetText( aStr );
aBtnAdd.Disable();
aBtnRemove.Enable();
aBtnColHead.Check( bColName );
aBtnRowHead.Check( !bColName );
theCurData = pPair->GetRange(1);
theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv );
aEdAssign2.SetText( aStr );
}
else
{
aBtnAdd.Enable();
aBtnRemove.Disable();
}
aBtnColHead.Enable();
aBtnRowHead.Enable();
aEdAssign2.Enable();
aRbAssign2.Enable();
}
/*************************************************************************
#* Member: IsRefInputMode Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Abfragefunktion fuer Referenz- Input- Mode.
#*
#* Input: Bereichs-String
#* Flag fuer Spalten
#*
#* Output: true, wenn Referenz- Input- Mode
#*
#************************************************************************/
sal_Bool ScColRowNameRangesDlg::IsRefInputMode() const
{
return (pEdActive != NULL);
}
//------------------------------------------------------------------------
// Handler:
// ========
/*************************************************************************
#* Handler: OkBtnHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde.
#* Hinzufuegen- Button ausloesen, und die neu einge-
#* stellten Bereiche ans Dokument uebergeben.
#* Fensterschliessen- Anweisung ausloesen.
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, OkBtnHdl, void *, EMPTYARG )
{
AddBtnHdl( 0 );
// die RangeLists den Refs am Doc zuweisen
pDoc->GetColNameRangesRef() = xColNameRanges;
pDoc->GetRowNameRangesRef() = xRowNameRanges;
// geaenderte Datenbereiche muessen sich auswirken
pDoc->CompileColRowNameFormula();
ScDocShell* pDocShell = pViewData->GetDocShell();
pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID );
pDocShell->SetDocumentModified();
Close();
return 0;
}
/*************************************************************************
#* Handler: CancelBtnHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Fensterschliessen- Anweisung ausloesen.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK_INLINE_START( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG )
{
Close();
return 0;
}
IMPL_LINK_INLINE_END( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG )
/*************************************************************************
#* Handler: AddBtnHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden
#* die Bereichsangaben eingestellt und in der
#* Listbox dargestellt.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, AddBtnHdl, void *, EMPTYARG )
{
String aNewArea( aEdAssign.GetText() );
String aNewData( aEdAssign2.GetText() );
if ( aNewArea.Len() > 0 && aNewData.Len() > 0 )
{
const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
ScRange aRange1, aRange2;
sal_Bool bOk1;
if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID)) != sal_False
&& ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) )
{
theCurArea = aRange1;
AdjustColRowData( aRange2 );
ScRangePair* pPair;
if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL )
{
xColNameRanges->Remove( pPair );
delete pPair;
}
if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL )
{
xRowNameRanges->Remove( pPair );
delete pPair;
}
if ( aBtnColHead.IsChecked() )
xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
else
xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
UpdateNames();
aEdAssign.GrabFocus();
aBtnAdd.Disable();
aBtnRemove.Disable();
aEdAssign.SetText( EMPTY_STRING );
aBtnColHead.Check( sal_True );
aBtnRowHead.Check( sal_False );
aEdAssign2.SetText( EMPTY_STRING );
theCurArea = ScRange();
theCurData = theCurArea;
Range1SelectHdl( 0 );
}
else
{
ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) );
if ( !bOk1 )
aEdAssign.GrabFocus();
else
aEdAssign2.GrabFocus();
}
}
return 0;
}
/*************************************************************************
#* Handler: RemoveBtnHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Nach betaetigen des Loeschen- Buttons, wird
#* die markierte Bereichsangabe geloescht.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, RemoveBtnHdl, void *, EMPTYARG )
{
String aRangeStr = aLbRange.GetSelectEntry();
sal_uInt16 nSelectPos = aLbRange.GetSelectEntryPos();
sal_Bool bColName =
((sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol);
NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
if (itr == aRangeMap.end())
return 0;
const ScRange& rRange = itr->second;
ScRangePair* pPair = NULL;
sal_Bool bFound = sal_False;
if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
bFound = sal_True;
else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
bFound = sal_True;
if ( bFound )
{
String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
String aMsg = aStrDelMsg.GetToken( 0, '#' );
aMsg += aRangeStr;
aMsg += aStrDelMsg.GetToken( 1, '#' );
if ( RET_YES == QUERYBOX(aMsg) )
{
if ( bColName )
xColNameRanges->Remove( pPair );
else
xRowNameRanges->Remove( pPair );
delete pPair;
UpdateNames();
sal_uInt16 nCnt = aLbRange.GetEntryCount();
if ( nSelectPos >= nCnt )
{
if ( nCnt )
nSelectPos = nCnt - 1;
else
nSelectPos = 0;
}
aLbRange.SelectEntryPos( nSelectPos );
if ( nSelectPos &&
(sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim )
aLbRange.SelectEntryPos( --nSelectPos ); // ---Zeile---
aLbRange.GrabFocus();
aBtnAdd.Disable();
aBtnRemove.Disable();
aEdAssign.SetText( EMPTY_STRING );
theCurArea = theCurData = ScRange();
aBtnColHead.Check( sal_True );
aBtnRowHead.Check( sal_False );
aEdAssign2.SetText( EMPTY_STRING );
Range1SelectHdl( 0 );
}
}
return 0;
}
/*************************************************************************
#* Handler: Range1SelectHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Wenn Zeile in Listbox ausgewaehlt wird,
#* werden die Eingabefelder entsprechend
#* eingestellt.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, Range1SelectHdl, void *, EMPTYARG )
{
sal_uInt16 nSelectPos = aLbRange.GetSelectEntryPos();
sal_uInt16 nCnt = aLbRange.GetEntryCount();
sal_uInt16 nMoves = 0;
while ( nSelectPos < nCnt
&& (sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim )
{ // skip Delimiter
++nMoves;
aLbRange.SelectEntryPos( ++nSelectPos );
}
String aRangeStr = aLbRange.GetSelectEntry();
if ( nMoves )
{
if ( nSelectPos > 1 && nSelectPos >= nCnt )
{ // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben
// wenn davor Eintraege existieren
nSelectPos = nCnt - 2;
aLbRange.SelectEntryPos( nSelectPos );
aRangeStr = aLbRange.GetSelectEntry();
}
else if ( nSelectPos > 2 && nSelectPos < nCnt && aRangeStr.Len()
&& aRangeStr == aEdAssign.GetText() )
{ // nach oben wandern statt nach unten auf die vorherige Position
nSelectPos -= 2;
aLbRange.SelectEntryPos( nSelectPos );
aRangeStr = aLbRange.GetSelectEntry();
}
}
NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
if ( itr != aRangeMap.end() )
{
sal_Bool bColName =
((sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol);
UpdateRangeData( itr->second, bColName );
aBtnAdd.Disable();
aBtnRemove.Enable();
}
else
{
if ( aEdAssign.GetText().Len() > 0 )
{
if ( aEdAssign2.GetText().Len() > 0 )
aBtnAdd.Enable();
else
aBtnAdd.Disable();
aBtnColHead.Enable();
aBtnRowHead.Enable();
aEdAssign2.Enable();
aRbAssign2.Enable();
}
else
{
aBtnAdd.Disable();
aBtnColHead.Disable();
aBtnRowHead.Disable();
aEdAssign2.Disable();
aRbAssign2.Disable();
}
aBtnRemove.Disable();
aEdAssign.GrabFocus();
}
aEdAssign.Enable();
aRbAssign.Enable();
//@BugID 54702 Enablen/Disablen nur noch in Basisklasse
//SFX_APPWINDOW->Enable();
return 0;
}
/*************************************************************************
#* Handler: Range1DataModifyHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label-
#* Bereich geaendert wurde.
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, Range1DataModifyHdl, void *, EMPTYARG )
{
String aNewArea( aEdAssign.GetText() );
sal_Bool bValid = sal_False;
if ( aNewArea.Len() > 0 )
{
ScRange aRange;
if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
{
SetColRowData( aRange );
bValid = sal_True;
}
}
if ( bValid )
{
aBtnAdd.Enable();
aBtnColHead.Enable();
aBtnRowHead.Enable();
aEdAssign2.Enable();
aRbAssign2.Enable();
}
else
{
aBtnAdd.Disable();
aBtnColHead.Disable();
aBtnRowHead.Disable();
aEdAssign2.Disable();
aRbAssign2.Disable();
}
aBtnRemove.Disable();
return 0;
}
/*************************************************************************
#* Handler: Range2DataModifyHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten-
#* Bereich geaendert wurde
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, Range2DataModifyHdl, void *, EMPTYARG )
{
String aNewData( aEdAssign2.GetText() );
if ( aNewData.Len() > 0 )
{
ScRange aRange;
if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
{
AdjustColRowData( aRange );
aBtnAdd.Enable();
}
else
aBtnAdd.Disable();
}
else
{
aBtnAdd.Disable();
}
return 0;
}
/*************************************************************************
#* Handler: ColClickHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Radiobutton fuer Spalten wurde betaetigt,
#* die entsprechenden Einstellungen werden
#* vorgenommen
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, ColClickHdl, void *, EMPTYARG )
{
if ( !aBtnColHead.GetSavedValue() )
{
aBtnColHead.Check( sal_True );
aBtnRowHead.Check( sal_False );
if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW )
{
theCurArea.aEnd.SetRow( MAXROW - 1 );
String aStr;
theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() );
aEdAssign.SetText( aStr );
}
ScRange aRange( theCurData );
aRange.aStart.SetRow( Min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) );
aRange.aEnd.SetRow( MAXROW );
AdjustColRowData( aRange );
}
return 0;
}
/*************************************************************************
#* Handler: RowClickHdl Datum:04.09.97
#*------------------------------------------------------------------------
#*
#* Klasse: ScColRowNameRangesDlg
#*
#* Funktion: Radiobutton fuer Zeilen wurde betaetigt,
#* die entsprechenden Einstellungen werden
#* vorgenommen
#*
#* Input: ---
#*
#* Output: ---
#*
#************************************************************************/
IMPL_LINK( ScColRowNameRangesDlg, RowClickHdl, void *, EMPTYARG )
{
if ( !aBtnRowHead.GetSavedValue() )
{
aBtnRowHead.Check( sal_True );
aBtnColHead.Check( sal_False );
if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL )
{
theCurArea.aEnd.SetCol( MAXCOL - 1 );
String aStr;
theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() );
aEdAssign.SetText( aStr );
}
ScRange aRange( theCurData );
aRange.aStart.SetCol( static_cast<SCCOL>(Min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) );
aRange.aEnd.SetCol( MAXCOL );
AdjustColRowData( aRange );
}
return 0;
}
IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl )
{
if( (pCtrl == (Control*)&aEdAssign) || (pCtrl == (Control*)&aRbAssign) )
pEdActive = &aEdAssign;
else if( (pCtrl == (Control*)&aEdAssign2) || (pCtrl == (Control*)&aRbAssign2) )
pEdActive = &aEdAssign2;
else
pEdActive = NULL;
if( pEdActive )
pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
return 0;
}
IMPL_LINK( ScColRowNameRangesDlg, LoseFocusHdl, Control*, EMPTYARG )
{
bDlgLostFocus = !IsActive();
return 0;
}