1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: crnrdlg.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
34 // System - Includes ---------------------------------------------------------
38 // INCLUDE -------------------------------------------------------------------
40 #include "reffact.hxx"
41 #include "document.hxx"
42 #include "scresid.hxx"
43 #include "globstr.hrc"
44 #include "crnrdlg.hrc"
48 #include "crnrdlg.hxx"
50 #include <vcl/msgbox.hxx>
53 //============================================================================
55 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute()
56 #define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute()
58 const ULONG nEntryDataCol
= 0;
59 const ULONG nEntryDataRow
= 1;
60 const ULONG nEntryDataDelim
= 2;
63 //============================================================================
64 // class ScColRowNameRangesDlg
67 /*************************************************************************
68 #* Member: ScColRowNameRangesDlg Datum:04.09.97
69 #*------------------------------------------------------------------------
71 #* Klasse: ScColRowNameRangesDlg
73 #* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg.
74 #* Initialisieren der Klassen- Mitglieder,
75 #* Uebernahme der Range- Angaben und Aufruf
76 #* der eigentlichen Initialisierungsroutine
78 #* Input: Sfx- Verknuepfungen
84 #************************************************************************/
86 ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings
* pB
,
89 ScViewData
* ptrViewData
)
91 : ScAnyRefDlg ( pB
, pCW
, pParent
, RID_SCDLG_COLROWNAMERANGES
),
93 aFlAssign ( this, ScResId( FL_ASSIGN
) ),
94 aLbRange ( this, ScResId( LB_RANGE
) ),
96 aEdAssign ( this, this, ScResId( ED_AREA
) ),
97 aRbAssign ( this, ScResId( RB_AREA
), &aEdAssign
, this ),
98 aBtnColHead ( this, ScResId( BTN_COLHEAD
) ),
99 aBtnRowHead ( this, ScResId( BTN_ROWHEAD
) ),
100 aFtAssign2 ( this, ScResId( FT_DATA_LABEL
) ),
101 aEdAssign2 ( this, this, ScResId( ED_DATA
) ),
102 aRbAssign2 ( this, ScResId( RB_DATA
), &aEdAssign2
, this ),
104 aBtnOk ( this, ScResId( BTN_OK
) ),
105 aBtnCancel ( this, ScResId( BTN_CANCEL
) ),
106 aBtnHelp ( this, ScResId( BTN_HELP
) ),
107 aBtnAdd ( this, ScResId( BTN_ADD
) ),
108 aBtnRemove ( this, ScResId( BTN_REMOVE
) ),
110 pViewData ( ptrViewData
),
111 pDoc ( ptrViewData
->GetDocument() ),
114 bDlgLostFocus ( FALSE
)
116 xColNameRanges
= pDoc
->GetColNameRanges()->Clone();
117 xRowNameRanges
= pDoc
->GetRowNameRanges()->Clone();
123 /*************************************************************************
124 #* Member: ~ScColRowNameRangesDlg Datum:04.09.97
125 #*------------------------------------------------------------------------
127 #* Klasse: ScColRowNameRangesDlg
129 #* Funktion: Destruktor der Klasse
135 #************************************************************************/
137 __EXPORT
ScColRowNameRangesDlg::~ScColRowNameRangesDlg()
142 /*************************************************************************
143 #* Member: Init Datum:04.09.97
144 #*------------------------------------------------------------------------
146 #* Klasse: ScColRowNameRangesDlg
148 #* Funktion: Initialisierungs- Routine:
149 #* Umlenken der Event- Handler und einstellen der
156 #************************************************************************/
158 void ScColRowNameRangesDlg::Init()
167 aBtnOk
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, OkBtnHdl
) );
168 aBtnCancel
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, CancelBtnHdl
) );
169 aBtnAdd
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, AddBtnHdl
) );
170 aBtnRemove
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, RemoveBtnHdl
) );
171 aLbRange
.SetSelectHdl ( LINK( this, ScColRowNameRangesDlg
, Range1SelectHdl
) );
172 aEdAssign
.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg
, Range1DataModifyHdl
) );
173 aBtnColHead
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, ColClickHdl
) );
174 aBtnRowHead
.SetClickHdl ( LINK( this, ScColRowNameRangesDlg
, RowClickHdl
) );
175 aEdAssign2
.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg
, Range2DataModifyHdl
) );
177 Link aLink
= LINK( this, ScColRowNameRangesDlg
, GetFocusHdl
);
178 aEdAssign
.SetGetFocusHdl( aLink
);
179 aRbAssign
.SetGetFocusHdl( aLink
);
180 aEdAssign2
.SetGetFocusHdl( aLink
);
181 aRbAssign2
.SetGetFocusHdl( aLink
);
183 aLink
= LINK( this, ScColRowNameRangesDlg
, LoseFocusHdl
);
184 aEdAssign
.SetLoseFocusHdl( aLink
);
185 aRbAssign
.SetLoseFocusHdl( aLink
);
186 aEdAssign2
.SetLoseFocusHdl( aLink
);
187 aRbAssign2
.SetLoseFocusHdl( aLink
);
189 pEdActive
= &aEdAssign
;
193 if ( pViewData
&& pDoc
)
195 pViewData
->GetSimpleArea( nStartCol
, nStartRow
, nStartTab
,
196 nEndCol
, nEndRow
, nEndTab
);
197 SetColRowData( ScRange( ScAddress( nStartCol
, nStartRow
, nStartTab
),
198 ScAddress( nEndCol
, nEndRow
, nEndTab
) ) );
202 aBtnColHead
.Check( TRUE
);
203 aBtnRowHead
.Check( FALSE
);
204 aEdAssign
.SetText( EMPTY_STRING
);
205 aEdAssign2
.SetText( EMPTY_STRING
);
208 aLbRange
.SetBorderStyle( WINDOW_BORDER_MONO
);
209 aBtnColHead
.Enable();
210 aBtnRowHead
.Enable();
212 aEdAssign
.GrabFocus();
214 //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
215 //SFX_APPWINDOW->Enable(); // Ref-Feld hat Focus
217 Range1SelectHdl( 0 );
221 /*************************************************************************
222 #* Member: SetColRowData Datum:04.09.97
223 #*------------------------------------------------------------------------
225 #* Klasse: ScColRowNameRangesDlg
227 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
228 #* auf default Werte setzen und beide Referenz-Edit-Felder
231 #* Input: Einstellbereich fuer Labels
235 #************************************************************************/
237 void ScColRowNameRangesDlg::SetColRowData( const ScRange
& rLabelRange
,BOOL bRef
)
239 theCurData
= theCurArea
= rLabelRange
;
241 SCCOL nCol1
= theCurArea
.aStart
.Col();
242 SCCOL nCol2
= theCurArea
.aEnd
.Col();
243 SCROW nRow1
= theCurArea
.aStart
.Row();
244 SCROW nRow2
= theCurArea
.aEnd
.Row();
245 if ( (static_cast<SCCOLROW
>(nCol2
- nCol1
) >= nRow2
- nRow1
) || (nCol1
== 0 && nCol2
== MAXCOL
) )
246 { // Spaltenkoepfe und Grenzfall gesamte Tabelle
247 aBtnColHead
.Check( TRUE
);
248 aBtnRowHead
.Check( FALSE
);
249 if ( nRow2
== MAXROW
)
252 bValid
= FALSE
; // Grenzfall gesamte Tabelle
254 { // Head unten, Data oben
255 theCurData
.aStart
.SetRow( 0 );
256 theCurData
.aEnd
.SetRow( nRow1
- 1 );
260 { // Head oben, Data unten
261 theCurData
.aStart
.SetRow( nRow2
+ 1 );
262 theCurData
.aEnd
.SetRow( MAXROW
);
267 aBtnRowHead
.Check( TRUE
);
268 aBtnColHead
.Check( FALSE
);
269 if ( nCol2
== MAXCOL
)
270 { // Head rechts, Data links
271 theCurData
.aStart
.SetCol( 0 );
272 theCurData
.aEnd
.SetCol( nCol2
- 1 );
275 { // Head links, Data rechts
276 theCurData
.aStart
.SetCol( nCol2
+ 1 );
277 theCurData
.aEnd
.SetCol( MAXCOL
);
282 const formula::FormulaGrammar::AddressConvention eConv
= pDoc
->GetAddressConvention();
284 theCurArea
.Format( aStr
, SCR_ABS_3D
, pDoc
, eConv
);
287 aEdAssign
.SetRefString( aStr
);
289 aEdAssign
.SetText( aStr
);
291 aEdAssign
.SetSelection( Selection( SELECTION_MAX
, SELECTION_MAX
) );
292 theCurData
.Format( aStr
, SCR_ABS_3D
, pDoc
, eConv
);
295 aEdAssign2
.SetRefString( aStr
);
297 aEdAssign2
.SetText( aStr
);
301 theCurData
= theCurArea
= ScRange();
305 aEdAssign
.SetRefString( EMPTY_STRING
);
306 aEdAssign2
.SetRefString( EMPTY_STRING
);
310 aEdAssign
.SetText( EMPTY_STRING
);
311 aEdAssign2
.SetText( EMPTY_STRING
);
314 aBtnColHead
.Disable();
315 aBtnRowHead
.Disable();
316 aEdAssign2
.Disable();
317 aRbAssign2
.Disable();
322 /*************************************************************************
323 #* Member: AdjustColRowData Datum:04.09.97
324 #*------------------------------------------------------------------------
326 #* Klasse: ScColRowNameRangesDlg
328 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
329 #* anpassen und Data-Referenz-Edit-Feld fuellen.
331 #* Input: Bereich fuer Labels
335 #************************************************************************/
337 void ScColRowNameRangesDlg::AdjustColRowData( const ScRange
& rDataRange
,BOOL bRef
)
339 theCurData
= rDataRange
;
340 if ( aBtnColHead
.IsChecked() )
341 { // Datenbereich gleiche Spalten wie Koepfe
342 theCurData
.aStart
.SetCol( theCurArea
.aStart
.Col() );
343 theCurData
.aEnd
.SetCol( theCurArea
.aEnd
.Col() );
344 if ( theCurData
.Intersects( theCurArea
) )
346 SCROW nRow1
= theCurArea
.aStart
.Row();
347 SCROW nRow2
= theCurArea
.aEnd
.Row();
349 && (theCurData
.aEnd
.Row() < nRow2
|| nRow2
== MAXROW
) )
351 theCurData
.aEnd
.SetRow( nRow1
- 1 );
352 if ( theCurData
.aStart
.Row() > theCurData
.aEnd
.Row() )
353 theCurData
.aStart
.SetRow( theCurData
.aEnd
.Row() );
357 theCurData
.aStart
.SetRow( nRow2
+ 1 );
358 if ( theCurData
.aStart
.Row() > theCurData
.aEnd
.Row() )
359 theCurData
.aEnd
.SetRow( theCurData
.aStart
.Row() );
364 { // Datenbereich gleiche Zeilen wie Koepfe
365 theCurData
.aStart
.SetRow( theCurArea
.aStart
.Row() );
366 theCurData
.aEnd
.SetRow( theCurArea
.aEnd
.Row() );
367 if ( theCurData
.Intersects( theCurArea
) )
369 SCCOL nCol1
= theCurArea
.aStart
.Col();
370 SCCOL nCol2
= theCurArea
.aEnd
.Col();
372 && (theCurData
.aEnd
.Col() < nCol2
|| nCol2
== MAXCOL
) )
374 theCurData
.aEnd
.SetCol( nCol1
- 1 );
375 if ( theCurData
.aStart
.Col() > theCurData
.aEnd
.Col() )
376 theCurData
.aStart
.SetCol( theCurData
.aEnd
.Col() );
380 theCurData
.aStart
.SetCol( nCol2
+ 1 );
381 if ( theCurData
.aStart
.Col() > theCurData
.aEnd
.Col() )
382 theCurData
.aEnd
.SetCol( theCurData
.aStart
.Col() );
387 theCurData
.Format( aStr
, SCR_ABS_3D
, pDoc
, pDoc
->GetAddressConvention() );
390 aEdAssign2
.SetRefString( aStr
);
392 aEdAssign2
.SetText( aStr
);
394 aEdAssign2
.SetSelection( Selection( SELECTION_MAX
, SELECTION_MAX
) );
398 /*************************************************************************
399 #* Member: SetReference Datum:04.09.97
400 #*------------------------------------------------------------------------
402 #* Klasse: ScColRowNameRangesDlg
404 #* Funktion: Uebergabe eines mit der Maus selektierten Tabellen-
405 #* bereiches, der dann als neue Selektion im Referenz-
406 #* Fenster angezeigt wird.
408 #* Input: Bereich fuer Labels
413 #************************************************************************/
415 void ScColRowNameRangesDlg::SetReference( const ScRange
& rRef
, ScDocument
* /* pDoc */ )
419 if ( rRef
.aStart
!= rRef
.aEnd
)
420 RefInputStart( pEdActive
);
423 if ( pEdActive
== &aEdAssign
)
424 SetColRowData( rRef
, TRUE
);
426 AdjustColRowData( rRef
, TRUE
);
427 aBtnColHead
.Enable();
428 aBtnRowHead
.Enable();
430 aBtnRemove
.Disable();
435 /*************************************************************************
436 #* Member: Close Datum:04.09.97
437 #*------------------------------------------------------------------------
439 #* Klasse: ScColRowNameRangesDlg
441 #* Funktion: Schliessen des Fensters
447 #************************************************************************/
449 BOOL __EXPORT
ScColRowNameRangesDlg::Close()
451 return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() );
455 /*************************************************************************
456 #* Member: SetActive Datum:04.09.97
457 #*------------------------------------------------------------------------
459 #* Klasse: ScColRowNameRangesDlg
461 #* Funktion: Aktivieren des Fensters
467 #************************************************************************/
469 void ScColRowNameRangesDlg::SetActive()
473 bDlgLostFocus
= FALSE
;
475 pEdActive
->GrabFocus();
480 if( pEdActive
== &aEdAssign
)
481 Range1DataModifyHdl( 0 );
482 else if( pEdActive
== &aEdAssign2
)
483 Range2DataModifyHdl( 0 );
489 /*************************************************************************
490 #* Member: UpdateNames Datum:04.09.97
491 #*------------------------------------------------------------------------
493 #* Klasse: ScColRowNameRangesDlg
495 #* Funktion: Aktualisieren der Namen
501 #************************************************************************/
503 void ScColRowNameRangesDlg::UpdateNames()
505 aLbRange
.SetUpdateMode( FALSE
);
506 //-----------------------------------------------------------
509 aEdAssign
.SetText( EMPTY_STRING
);
512 USHORT nPos
; //@008 Hilfsvariable q eingefuegt
514 SCCOL nCol1
; //@008 04.09.97
515 SCROW nRow1
; //Erweiterung fuer Bereichsnamen
522 const ScAddress::Details
aDetails(pDoc
->GetAddressConvention());
525 String strDelim
= String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " ));
527 aString
+= ScGlobal::GetRscString( STR_COLUMN
);
529 nPos
= aLbRange
.InsertEntry( aString
);
530 aLbRange
.SetEntryData( nPos
, (void*)nEntryDataDelim
);
531 if ( (nCount
= xColNameRanges
->Count()) > 0 )
533 ScRangePair
** ppSortArray
= xColNameRanges
->CreateNameSortedArray(
535 for ( j
=0; j
< nCount
; j
++ )
537 const ScRange
aRange(ppSortArray
[j
]->GetRange(0));
538 aRange
.Format( aString
, SCR_ABS_3D
, pDoc
, aDetails
);
540 //@008 Hole Bereichsparameter aus Dok
541 ppSortArray
[j
]->GetRange(0).GetVars( nCol1
, nRow1
, nTab1
,
542 nCol2
, nRow2
, nTab2
);
545 //@008 Baue String zusammen
546 strShow
.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
549 pDoc
->GetString(nCol1
, nRow1
, nTab1
,rString
);
551 for(SCCOL i
=nCol1
+1;i
<=q
;i
++)
553 strShow
.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
554 pDoc
->GetString(i
, nRow1
, nTab1
,rString
);
558 if(q
<nCol2
) // Zu lang? Ergaenzen um ",..."
560 strShow
.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
564 //@008 String einfuegen in Listbox
565 String aInsStr
= aString
;
567 nPos
= aLbRange
.InsertEntry( aInsStr
);
568 aRangeMap
.insert( NameRangeMap::value_type(aInsStr
, aRange
) );
569 aLbRange
.SetEntryData( nPos
, (void*)nEntryDataCol
);
571 delete [] ppSortArray
;
574 aString
+= ScGlobal::GetRscString( STR_ROW
);
576 nPos
= aLbRange
.InsertEntry( aString
);
577 aLbRange
.SetEntryData( nPos
, (void*)nEntryDataDelim
);
578 if ( (nCount
= xRowNameRanges
->Count()) > 0 )
580 ScRangePair
** ppSortArray
= xRowNameRanges
->CreateNameSortedArray(
582 for ( j
=0; j
< nCount
; j
++ )
584 const ScRange
aRange(ppSortArray
[j
]->GetRange(0));
585 aRange
.Format( aString
, SCR_ABS_3D
, pDoc
, aDetails
);
587 //@008 Ab hier baue String fuer Zeilen
588 ppSortArray
[j
]->GetRange(0).GetVars( nCol1
, nRow1
, nTab1
,
589 nCol2
, nRow2
, nTab2
);
592 strShow
.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
595 pDoc
->GetString(nCol1
, nRow1
, nTab1
,rString
);
597 for(SCROW i
=nRow1
+1;i
<=q
;i
++)
599 strShow
.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
600 pDoc
->GetString(nCol1
, i
, nTab1
,rString
);
606 strShow
.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
610 String aInsStr
= aString
;
612 nPos
= aLbRange
.InsertEntry( aInsStr
);
613 aRangeMap
.insert( NameRangeMap::value_type(aInsStr
, aRange
) );
614 aLbRange
.SetEntryData( nPos
, (void*)nEntryDataRow
);
616 delete [] ppSortArray
;
618 //-----------------------------------------------------------
619 aLbRange
.SetUpdateMode( TRUE
);
620 aLbRange
.Invalidate();
624 /*************************************************************************
625 #* Member: UpdateRangeData Datum:04.09.97
626 #*------------------------------------------------------------------------
628 #* Klasse: ScColRowNameRangesDlg
630 #* Funktion: Aktualisieren der Bereichsdaten
632 #* Input: Bereichs-String
637 #************************************************************************/
639 void ScColRowNameRangesDlg::UpdateRangeData( const ScRange
& rRange
, BOOL bColName
)
641 ScRangePair
* pPair
= NULL
;
643 if ( bColName
&& (pPair
= xColNameRanges
->Find( rRange
)) != NULL
)
645 else if ( !bColName
&& (pPair
= xRowNameRanges
->Find( rRange
)) != NULL
)
650 const formula::FormulaGrammar::AddressConvention eConv
= pDoc
->GetAddressConvention();
653 theCurArea
.Format( aStr
, SCR_ABS_3D
, pDoc
, eConv
);
654 aEdAssign
.SetText( aStr
);
657 aBtnColHead
.Check( bColName
);
658 aBtnRowHead
.Check( !bColName
);
659 theCurData
= pPair
->GetRange(1);
660 theCurData
.Format( aStr
, SCR_ABS_3D
, pDoc
, eConv
);
661 aEdAssign2
.SetText( aStr
);
666 aBtnRemove
.Disable();
668 aBtnColHead
.Enable();
669 aBtnRowHead
.Enable();
675 /*************************************************************************
676 #* Member: IsRefInputMode Datum:04.09.97
677 #*------------------------------------------------------------------------
679 #* Klasse: ScColRowNameRangesDlg
681 #* Funktion: Abfragefunktion fuer Referenz- Input- Mode.
683 #* Input: Bereichs-String
686 #* Output: true, wenn Referenz- Input- Mode
688 #************************************************************************/
690 BOOL
ScColRowNameRangesDlg::IsRefInputMode() const
692 return (pEdActive
!= NULL
);
695 //------------------------------------------------------------------------
699 /*************************************************************************
700 #* Handler: OkBtnHdl Datum:04.09.97
701 #*------------------------------------------------------------------------
703 #* Klasse: ScColRowNameRangesDlg
705 #* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde.
706 #* Hinzufuegen- Button ausloesen, und die neu einge-
707 #* stellten Bereiche ans Dokument uebergeben.
708 #* Fensterschliessen- Anweisung ausloesen.
713 #************************************************************************/
715 IMPL_LINK( ScColRowNameRangesDlg
, OkBtnHdl
, void *, EMPTYARG
)
719 // die RangeLists den Refs am Doc zuweisen
720 pDoc
->GetColNameRangesRef() = xColNameRanges
;
721 pDoc
->GetRowNameRangesRef() = xRowNameRanges
;
722 // geaenderte Datenbereiche muessen sich auswirken
723 pDoc
->CompileColRowNameFormula();
724 ScDocShell
* pDocShell
= pViewData
->GetDocShell();
725 pDocShell
->PostPaint( 0,0,0, MAXCOL
,MAXROW
,MAXTAB
, PAINT_GRID
);
726 pDocShell
->SetDocumentModified();
733 /*************************************************************************
734 #* Handler: CancelBtnHdl Datum:04.09.97
735 #*------------------------------------------------------------------------
737 #* Klasse: ScColRowNameRangesDlg
739 #* Funktion: Fensterschliessen- Anweisung ausloesen.
745 #************************************************************************/
747 IMPL_LINK_INLINE_START( ScColRowNameRangesDlg
, CancelBtnHdl
, void *, EMPTYARG
)
752 IMPL_LINK_INLINE_END( ScColRowNameRangesDlg
, CancelBtnHdl
, void *, EMPTYARG
)
755 /*************************************************************************
756 #* Handler: AddBtnHdl Datum:04.09.97
757 #*------------------------------------------------------------------------
759 #* Klasse: ScColRowNameRangesDlg
761 #* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden
762 #* die Bereichsangaben eingestellt und in der
763 #* Listbox dargestellt.
769 #************************************************************************/
771 IMPL_LINK( ScColRowNameRangesDlg
, AddBtnHdl
, void *, EMPTYARG
)
773 String
aNewArea( aEdAssign
.GetText() );
774 String
aNewData( aEdAssign2
.GetText() );
776 if ( aNewArea
.Len() > 0 && aNewData
.Len() > 0 )
778 const formula::FormulaGrammar::AddressConvention eConv
= pDoc
->GetAddressConvention();
779 ScRange aRange1
, aRange2
;
781 if ( (bOk1
= ((aRange1
.ParseAny( aNewArea
, pDoc
, eConv
) & SCA_VALID
) == SCA_VALID
)) != FALSE
782 && ((aRange2
.ParseAny( aNewData
, pDoc
, eConv
) & SCA_VALID
) == SCA_VALID
) )
784 theCurArea
= aRange1
;
785 AdjustColRowData( aRange2
);
787 if ( ( pPair
= xColNameRanges
->Find( theCurArea
) ) != NULL
)
789 xColNameRanges
->Remove( pPair
);
792 if ( ( pPair
= xRowNameRanges
->Find( theCurArea
) ) != NULL
)
794 xRowNameRanges
->Remove( pPair
);
797 if ( aBtnColHead
.IsChecked() )
798 xColNameRanges
->Join( ScRangePair( theCurArea
, theCurData
) );
800 xRowNameRanges
->Join( ScRangePair( theCurArea
, theCurData
) );
804 aEdAssign
.GrabFocus();
806 aBtnRemove
.Disable();
807 aEdAssign
.SetText( EMPTY_STRING
);
808 aBtnColHead
.Check( TRUE
);
809 aBtnRowHead
.Check( FALSE
);
810 aEdAssign2
.SetText( EMPTY_STRING
);
811 theCurArea
= ScRange();
812 theCurData
= theCurArea
;
813 Range1SelectHdl( 0 );
817 ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME
) );
819 aEdAssign
.GrabFocus();
821 aEdAssign2
.GrabFocus();
828 /*************************************************************************
829 #* Handler: RemoveBtnHdl Datum:04.09.97
830 #*------------------------------------------------------------------------
832 #* Klasse: ScColRowNameRangesDlg
834 #* Funktion: Nach betaetigen des Loeschen- Buttons, wird
835 #* die markierte Bereichsangabe geloescht.
841 #************************************************************************/
843 IMPL_LINK( ScColRowNameRangesDlg
, RemoveBtnHdl
, void *, EMPTYARG
)
845 String aRangeStr
= aLbRange
.GetSelectEntry();
846 USHORT nSelectPos
= aLbRange
.GetSelectEntryPos();
848 ((ULONG
)aLbRange
.GetEntryData( nSelectPos
) == nEntryDataCol
);
849 NameRangeMap::const_iterator itr
= aRangeMap
.find(aRangeStr
);
850 if (itr
== aRangeMap
.end())
852 const ScRange
& rRange
= itr
->second
;
854 ScRangePair
* pPair
= NULL
;
856 if ( bColName
&& (pPair
= xColNameRanges
->Find( rRange
)) != NULL
)
858 else if ( !bColName
&& (pPair
= xRowNameRanges
->Find( rRange
)) != NULL
)
862 String aStrDelMsg
= ScGlobal::GetRscString( STR_QUERY_DELENTRY
);
863 String aMsg
= aStrDelMsg
.GetToken( 0, '#' );
866 aMsg
+= aStrDelMsg
.GetToken( 1, '#' );
868 if ( RET_YES
== QUERYBOX(aMsg
) )
871 xColNameRanges
->Remove( pPair
);
873 xRowNameRanges
->Remove( pPair
);
877 USHORT nCnt
= aLbRange
.GetEntryCount();
878 if ( nSelectPos
>= nCnt
)
881 nSelectPos
= nCnt
- 1;
885 aLbRange
.SelectEntryPos( nSelectPos
);
887 (ULONG
)aLbRange
.GetEntryData( nSelectPos
) == nEntryDataDelim
)
888 aLbRange
.SelectEntryPos( --nSelectPos
); // ---Zeile---
890 aLbRange
.GrabFocus();
892 aBtnRemove
.Disable();
893 aEdAssign
.SetText( EMPTY_STRING
);
894 theCurArea
= theCurData
= ScRange();
895 aBtnColHead
.Check( TRUE
);
896 aBtnRowHead
.Check( FALSE
);
897 aEdAssign2
.SetText( EMPTY_STRING
);
898 Range1SelectHdl( 0 );
905 /*************************************************************************
906 #* Handler: Range1SelectHdl Datum:04.09.97
907 #*------------------------------------------------------------------------
909 #* Klasse: ScColRowNameRangesDlg
911 #* Funktion: Wenn Zeile in Listbox ausgewaehlt wird,
912 #* werden die Eingabefelder entsprechend
919 #************************************************************************/
921 IMPL_LINK( ScColRowNameRangesDlg
, Range1SelectHdl
, void *, EMPTYARG
)
923 USHORT nSelectPos
= aLbRange
.GetSelectEntryPos();
924 USHORT nCnt
= aLbRange
.GetEntryCount();
926 while ( nSelectPos
< nCnt
927 && (ULONG
)aLbRange
.GetEntryData( nSelectPos
) == nEntryDataDelim
)
930 aLbRange
.SelectEntryPos( ++nSelectPos
);
932 String aRangeStr
= aLbRange
.GetSelectEntry();
935 if ( nSelectPos
> 1 && nSelectPos
>= nCnt
)
936 { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben
937 // wenn davor Eintraege existieren
938 nSelectPos
= nCnt
- 2;
939 aLbRange
.SelectEntryPos( nSelectPos
);
940 aRangeStr
= aLbRange
.GetSelectEntry();
942 else if ( nSelectPos
> 2 && nSelectPos
< nCnt
&& aRangeStr
.Len()
943 && aRangeStr
== aEdAssign
.GetText() )
944 { // nach oben wandern statt nach unten auf die vorherige Position
946 aLbRange
.SelectEntryPos( nSelectPos
);
947 aRangeStr
= aLbRange
.GetSelectEntry();
950 NameRangeMap::const_iterator itr
= aRangeMap
.find(aRangeStr
);
951 if ( itr
!= aRangeMap
.end() )
954 ((ULONG
)aLbRange
.GetEntryData( nSelectPos
) == nEntryDataCol
);
955 UpdateRangeData( itr
->second
, bColName
);
961 if ( aEdAssign
.GetText().Len() > 0 )
963 if ( aEdAssign2
.GetText().Len() > 0 )
967 aBtnColHead
.Enable();
968 aBtnRowHead
.Enable();
975 aBtnColHead
.Disable();
976 aBtnRowHead
.Disable();
977 aEdAssign2
.Disable();
978 aRbAssign2
.Disable();
980 aBtnRemove
.Disable();
981 aEdAssign
.GrabFocus();
987 //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
988 //SFX_APPWINDOW->Enable();
993 /*************************************************************************
994 #* Handler: Range1DataModifyHdl Datum:04.09.97
995 #*------------------------------------------------------------------------
997 #* Klasse: ScColRowNameRangesDlg
999 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label-
1000 #* Bereich geaendert wurde.
1006 #************************************************************************/
1008 IMPL_LINK( ScColRowNameRangesDlg
, Range1DataModifyHdl
, void *, EMPTYARG
)
1010 String
aNewArea( aEdAssign
.GetText() );
1011 BOOL bValid
= FALSE
;
1012 if ( aNewArea
.Len() > 0 )
1015 if ( (aRange
.ParseAny( aNewArea
, pDoc
, pDoc
->GetAddressConvention() ) & SCA_VALID
) == SCA_VALID
)
1017 SetColRowData( aRange
);
1024 aBtnColHead
.Enable();
1025 aBtnRowHead
.Enable();
1026 aEdAssign2
.Enable();
1027 aRbAssign2
.Enable();
1032 aBtnColHead
.Disable();
1033 aBtnRowHead
.Disable();
1034 aEdAssign2
.Disable();
1035 aRbAssign2
.Disable();
1037 aBtnRemove
.Disable();
1042 /*************************************************************************
1043 #* Handler: Range2DataModifyHdl Datum:04.09.97
1044 #*------------------------------------------------------------------------
1046 #* Klasse: ScColRowNameRangesDlg
1048 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten-
1049 #* Bereich geaendert wurde
1055 #************************************************************************/
1057 IMPL_LINK( ScColRowNameRangesDlg
, Range2DataModifyHdl
, void *, EMPTYARG
)
1059 String
aNewData( aEdAssign2
.GetText() );
1060 if ( aNewData
.Len() > 0 )
1063 if ( (aRange
.ParseAny( aNewData
, pDoc
, pDoc
->GetAddressConvention() ) & SCA_VALID
) == SCA_VALID
)
1065 AdjustColRowData( aRange
);
1079 /*************************************************************************
1080 #* Handler: ColClickHdl Datum:04.09.97
1081 #*------------------------------------------------------------------------
1083 #* Klasse: ScColRowNameRangesDlg
1085 #* Funktion: Radiobutton fuer Spalten wurde betaetigt,
1086 #* die entsprechenden Einstellungen werden
1093 #************************************************************************/
1095 IMPL_LINK( ScColRowNameRangesDlg
, ColClickHdl
, void *, EMPTYARG
)
1097 if ( !aBtnColHead
.GetSavedValue() )
1099 aBtnColHead
.Check( TRUE
);
1100 aBtnRowHead
.Check( FALSE
);
1101 if ( theCurArea
.aStart
.Row() == 0 && theCurArea
.aEnd
.Row() == MAXROW
)
1103 theCurArea
.aEnd
.SetRow( MAXROW
- 1 );
1105 theCurArea
.Format( aStr
, SCR_ABS_3D
, pDoc
, pDoc
->GetAddressConvention() );
1106 aEdAssign
.SetText( aStr
);
1108 ScRange
aRange( theCurData
);
1109 aRange
.aStart
.SetRow( Min( (long)(theCurArea
.aEnd
.Row() + 1), (long)MAXROW
) );
1110 aRange
.aEnd
.SetRow( MAXROW
);
1111 AdjustColRowData( aRange
);
1117 /*************************************************************************
1118 #* Handler: RowClickHdl Datum:04.09.97
1119 #*------------------------------------------------------------------------
1121 #* Klasse: ScColRowNameRangesDlg
1123 #* Funktion: Radiobutton fuer Zeilen wurde betaetigt,
1124 #* die entsprechenden Einstellungen werden
1131 #************************************************************************/
1133 IMPL_LINK( ScColRowNameRangesDlg
, RowClickHdl
, void *, EMPTYARG
)
1135 if ( !aBtnRowHead
.GetSavedValue() )
1137 aBtnRowHead
.Check( TRUE
);
1138 aBtnColHead
.Check( FALSE
);
1139 if ( theCurArea
.aStart
.Col() == 0 && theCurArea
.aEnd
.Col() == MAXCOL
)
1141 theCurArea
.aEnd
.SetCol( MAXCOL
- 1 );
1143 theCurArea
.Format( aStr
, SCR_ABS_3D
, pDoc
, pDoc
->GetAddressConvention() );
1144 aEdAssign
.SetText( aStr
);
1146 ScRange
aRange( theCurData
);
1147 aRange
.aStart
.SetCol( static_cast<SCCOL
>(Min( (long)(theCurArea
.aEnd
.Col() + 1), (long)MAXCOL
)) );
1148 aRange
.aEnd
.SetCol( MAXCOL
);
1149 AdjustColRowData( aRange
);
1155 IMPL_LINK( ScColRowNameRangesDlg
, GetFocusHdl
, Control
*, pCtrl
)
1157 if( (pCtrl
== (Control
*)&aEdAssign
) || (pCtrl
== (Control
*)&aRbAssign
) )
1158 pEdActive
= &aEdAssign
;
1159 else if( (pCtrl
== (Control
*)&aEdAssign2
) || (pCtrl
== (Control
*)&aRbAssign2
) )
1160 pEdActive
= &aEdAssign2
;
1165 pEdActive
->SetSelection( Selection( 0, SELECTION_MAX
) );
1171 IMPL_LINK( ScColRowNameRangesDlg
, LoseFocusHdl
, Control
*, EMPTYARG
)
1173 bDlgLostFocus
= !IsActive();