sync master with lastest vba changes
[ooovba.git] / sc / source / ui / miscdlgs / crnrdlg.cxx
blob2b27986eebecf866aee91cda8f1aa1327ff297ba
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: crnrdlg.cxx,v $
10 * $Revision: 1.11 $
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"
45 #include "docsh.hxx"
47 #define _CRNRDLG_CXX
48 #include "crnrdlg.hxx"
49 #undef _CRNRDLG_CXX
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
79 #* Parent- Window
80 #* SCViewData
82 #* Output: ---
84 #************************************************************************/
86 ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB,
87 SfxChildWindow* pCW,
88 Window* pParent,
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() ),
113 pEdActive ( NULL ),
114 bDlgLostFocus ( FALSE )
116 xColNameRanges = pDoc->GetColNameRanges()->Clone();
117 xRowNameRanges = pDoc->GetRowNameRanges()->Clone();
118 Init();
119 FreeResource();
123 /*************************************************************************
124 #* Member: ~ScColRowNameRangesDlg Datum:04.09.97
125 #*------------------------------------------------------------------------
127 #* Klasse: ScColRowNameRangesDlg
129 #* Funktion: Destruktor der Klasse
131 #* Input: ---
133 #* Output: ---
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
150 #* Startparameter.
152 #* Input: ---
154 #* Output: ---
156 #************************************************************************/
158 void ScColRowNameRangesDlg::Init()
160 SCCOL nStartCol = 0;
161 SCROW nStartRow = 0;
162 SCTAB nStartTab = 0;
163 SCCOL nEndCol = 0;
164 SCROW nEndRow = 0;
165 SCTAB nEndTab = 0;
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;
191 UpdateNames();
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 ) ) );
200 else
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();
211 aEdAssign.Enable();
212 aEdAssign.GrabFocus();
213 aRbAssign.Enable();
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
229 #* fuellen.
231 #* Input: Einstellbereich fuer Labels
233 #* Output: ---
235 #************************************************************************/
237 void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,BOOL bRef)
239 theCurData = theCurArea = rLabelRange;
240 BOOL bValid = TRUE;
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 )
251 if ( nRow1 == 0 )
252 bValid = FALSE; // Grenzfall gesamte Tabelle
253 else
254 { // Head unten, Data oben
255 theCurData.aStart.SetRow( 0 );
256 theCurData.aEnd.SetRow( nRow1 - 1 );
259 else
260 { // Head oben, Data unten
261 theCurData.aStart.SetRow( nRow2 + 1 );
262 theCurData.aEnd.SetRow( MAXROW );
265 else
266 { // Zeilenkoepfe
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 );
274 else
275 { // Head links, Data rechts
276 theCurData.aStart.SetCol( nCol2 + 1 );
277 theCurData.aEnd.SetCol( MAXCOL );
280 if ( bValid )
282 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
283 String aStr;
284 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv );
286 if(bRef)
287 aEdAssign.SetRefString( aStr );
288 else
289 aEdAssign.SetText( aStr );
291 aEdAssign.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
292 theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv );
294 if(bRef)
295 aEdAssign2.SetRefString( aStr );
296 else
297 aEdAssign2.SetText( aStr );
299 else
301 theCurData = theCurArea = ScRange();
303 if(bRef)
305 aEdAssign.SetRefString( EMPTY_STRING );
306 aEdAssign2.SetRefString( EMPTY_STRING );
308 else
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
333 #* Output: ---
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();
348 if ( nRow1 > 0
349 && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) )
350 { // Data oben
351 theCurData.aEnd.SetRow( nRow1 - 1 );
352 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
353 theCurData.aStart.SetRow( theCurData.aEnd.Row() );
355 else
356 { // Data unten
357 theCurData.aStart.SetRow( nRow2 + 1 );
358 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
359 theCurData.aEnd.SetRow( theCurData.aStart.Row() );
363 else
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();
371 if ( nCol1 > 0
372 && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) )
373 { // Data links
374 theCurData.aEnd.SetCol( nCol1 - 1 );
375 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
376 theCurData.aStart.SetCol( theCurData.aEnd.Col() );
378 else
379 { // Data rechts
380 theCurData.aStart.SetCol( nCol2 + 1 );
381 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
382 theCurData.aEnd.SetCol( theCurData.aStart.Col() );
386 String aStr;
387 theCurData.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() );
389 if(bRef)
390 aEdAssign2.SetRefString( aStr );
391 else
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
409 #* Dokumentklasse
411 #* Output: ---
413 #************************************************************************/
415 void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ )
417 if ( pEdActive )
419 if ( rRef.aStart != rRef.aEnd )
420 RefInputStart( pEdActive );
422 String aRefStr;
423 if ( pEdActive == &aEdAssign )
424 SetColRowData( rRef, TRUE );
425 else
426 AdjustColRowData( rRef, TRUE );
427 aBtnColHead.Enable();
428 aBtnRowHead.Enable();
429 aBtnAdd.Enable();
430 aBtnRemove.Disable();
435 /*************************************************************************
436 #* Member: Close Datum:04.09.97
437 #*------------------------------------------------------------------------
439 #* Klasse: ScColRowNameRangesDlg
441 #* Funktion: Schliessen des Fensters
443 #* Input: ---
445 #* Output: ---
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
463 #* Input: ---
465 #* Output: ---
467 #************************************************************************/
469 void ScColRowNameRangesDlg::SetActive()
471 if ( bDlgLostFocus )
473 bDlgLostFocus = FALSE;
474 if( pEdActive )
475 pEdActive->GrabFocus();
477 else
478 GrabFocus();
480 if( pEdActive == &aEdAssign )
481 Range1DataModifyHdl( 0 );
482 else if( pEdActive == &aEdAssign2 )
483 Range2DataModifyHdl( 0 );
485 RefInputDone();
489 /*************************************************************************
490 #* Member: UpdateNames Datum:04.09.97
491 #*------------------------------------------------------------------------
493 #* Klasse: ScColRowNameRangesDlg
495 #* Funktion: Aktualisieren der Namen
497 #* Input: ---
499 #* Output: ---
501 #************************************************************************/
503 void ScColRowNameRangesDlg::UpdateNames()
505 aLbRange.SetUpdateMode( FALSE );
506 //-----------------------------------------------------------
507 aLbRange.Clear();
508 aRangeMap.clear();
509 aEdAssign.SetText( EMPTY_STRING );
511 ULONG nCount, j;
512 USHORT nPos; //@008 Hilfsvariable q eingefuegt
514 SCCOL nCol1; //@008 04.09.97
515 SCROW nRow1; //Erweiterung fuer Bereichsnamen
516 SCTAB nTab1;
517 SCCOL nCol2;
518 SCROW nRow2;
519 SCTAB nTab2;
520 String rString;
521 String strShow;
522 const ScAddress::Details aDetails(pDoc->GetAddressConvention());
524 String aString;
525 String strDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " ));
526 aString = strDelim;
527 aString += ScGlobal::GetRscString( STR_COLUMN );
528 aString += strDelim;
529 nPos = aLbRange.InsertEntry( aString );
530 aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim );
531 if ( (nCount = xColNameRanges->Count()) > 0 )
533 ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray(
534 nCount, pDoc );
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 );
543 SCCOL q=nCol1+3;
544 if(q>nCol2) q=nCol2;
545 //@008 Baue String zusammen
546 strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
547 if(pDoc!=NULL)
549 pDoc->GetString(nCol1, nRow1, nTab1,rString);
550 strShow +=rString;
551 for(SCCOL i=nCol1+1;i<=q;i++)
553 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
554 pDoc->GetString(i, nRow1, nTab1,rString);
555 strShow += rString;
558 if(q<nCol2) // Zu lang? Ergaenzen um ",..."
560 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
562 strShow += ']';
564 //@008 String einfuegen in Listbox
565 String aInsStr = aString;
566 aInsStr += strShow;
567 nPos = aLbRange.InsertEntry( aInsStr );
568 aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
569 aLbRange.SetEntryData( nPos, (void*)nEntryDataCol );
571 delete [] ppSortArray;
573 aString = strDelim;
574 aString += ScGlobal::GetRscString( STR_ROW );
575 aString += strDelim;
576 nPos = aLbRange.InsertEntry( aString );
577 aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim );
578 if ( (nCount = xRowNameRanges->Count()) > 0 )
580 ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray(
581 nCount, pDoc );
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 );
590 SCROW q=nRow1+3;
591 if(q>nRow2) q=nRow2;
592 strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" ["));
593 if(pDoc!=NULL)
595 pDoc->GetString(nCol1, nRow1, nTab1,rString);
596 strShow += rString;
597 for(SCROW i=nRow1+1;i<=q;i++)
599 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
600 pDoc->GetString(nCol1, i, nTab1,rString);
601 strShow += rString;
604 if(q<nRow2)
606 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ..."));
608 strShow += ']';
610 String aInsStr = aString;
611 aInsStr += strShow;
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
633 #* Flag fuer Spalten
635 #* Output: ---
637 #************************************************************************/
639 void ScColRowNameRangesDlg::UpdateRangeData( const ScRange& rRange, BOOL bColName )
641 ScRangePair* pPair = NULL;
642 BOOL bFound = FALSE;
643 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
644 bFound = TRUE;
645 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
646 bFound = TRUE;
648 if ( bFound )
650 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
651 String aStr;
652 theCurArea = rRange;
653 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv );
654 aEdAssign.SetText( aStr );
655 aBtnAdd.Disable();
656 aBtnRemove.Enable();
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 );
663 else
665 aBtnAdd.Enable();
666 aBtnRemove.Disable();
668 aBtnColHead.Enable();
669 aBtnRowHead.Enable();
670 aEdAssign2.Enable();
671 aRbAssign2.Enable();
675 /*************************************************************************
676 #* Member: IsRefInputMode Datum:04.09.97
677 #*------------------------------------------------------------------------
679 #* Klasse: ScColRowNameRangesDlg
681 #* Funktion: Abfragefunktion fuer Referenz- Input- Mode.
683 #* Input: Bereichs-String
684 #* Flag fuer Spalten
686 #* Output: true, wenn Referenz- Input- Mode
688 #************************************************************************/
690 BOOL ScColRowNameRangesDlg::IsRefInputMode() const
692 return (pEdActive != NULL);
695 //------------------------------------------------------------------------
696 // Handler:
697 // ========
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.
709 #* Input: ---
711 #* Output: ---
713 #************************************************************************/
715 IMPL_LINK( ScColRowNameRangesDlg, OkBtnHdl, void *, EMPTYARG )
717 AddBtnHdl( 0 );
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();
728 Close();
729 return 0;
733 /*************************************************************************
734 #* Handler: CancelBtnHdl Datum:04.09.97
735 #*------------------------------------------------------------------------
737 #* Klasse: ScColRowNameRangesDlg
739 #* Funktion: Fensterschliessen- Anweisung ausloesen.
741 #* Input: ---
743 #* Output: ---
745 #************************************************************************/
747 IMPL_LINK_INLINE_START( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG )
749 Close();
750 return 0;
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.
765 #* Input: ---
767 #* Output: ---
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;
780 BOOL bOk1;
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 );
786 ScRangePair* pPair;
787 if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL )
789 xColNameRanges->Remove( pPair );
790 delete pPair;
792 if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL )
794 xRowNameRanges->Remove( pPair );
795 delete pPair;
797 if ( aBtnColHead.IsChecked() )
798 xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
799 else
800 xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
802 UpdateNames();
804 aEdAssign.GrabFocus();
805 aBtnAdd.Disable();
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 );
815 else
817 ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) );
818 if ( !bOk1 )
819 aEdAssign.GrabFocus();
820 else
821 aEdAssign2.GrabFocus();
824 return 0;
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.
837 #* Input: ---
839 #* Output: ---
841 #************************************************************************/
843 IMPL_LINK( ScColRowNameRangesDlg, RemoveBtnHdl, void *, EMPTYARG )
845 String aRangeStr = aLbRange.GetSelectEntry();
846 USHORT nSelectPos = aLbRange.GetSelectEntryPos();
847 BOOL bColName =
848 ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol);
849 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
850 if (itr == aRangeMap.end())
851 return 0;
852 const ScRange& rRange = itr->second;
854 ScRangePair* pPair = NULL;
855 BOOL bFound = FALSE;
856 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
857 bFound = TRUE;
858 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
859 bFound = TRUE;
860 if ( bFound )
862 String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
863 String aMsg = aStrDelMsg.GetToken( 0, '#' );
865 aMsg += aRangeStr;
866 aMsg += aStrDelMsg.GetToken( 1, '#' );
868 if ( RET_YES == QUERYBOX(aMsg) )
870 if ( bColName )
871 xColNameRanges->Remove( pPair );
872 else
873 xRowNameRanges->Remove( pPair );
874 delete pPair;
876 UpdateNames();
877 USHORT nCnt = aLbRange.GetEntryCount();
878 if ( nSelectPos >= nCnt )
880 if ( nCnt )
881 nSelectPos = nCnt - 1;
882 else
883 nSelectPos = 0;
885 aLbRange.SelectEntryPos( nSelectPos );
886 if ( nSelectPos &&
887 (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim )
888 aLbRange.SelectEntryPos( --nSelectPos ); // ---Zeile---
890 aLbRange.GrabFocus();
891 aBtnAdd.Disable();
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 );
901 return 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
913 #* eingestellt.
915 #* Input: ---
917 #* Output: ---
919 #************************************************************************/
921 IMPL_LINK( ScColRowNameRangesDlg, Range1SelectHdl, void *, EMPTYARG )
923 USHORT nSelectPos = aLbRange.GetSelectEntryPos();
924 USHORT nCnt = aLbRange.GetEntryCount();
925 USHORT nMoves = 0;
926 while ( nSelectPos < nCnt
927 && (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim )
928 { // skip Delimiter
929 ++nMoves;
930 aLbRange.SelectEntryPos( ++nSelectPos );
932 String aRangeStr = aLbRange.GetSelectEntry();
933 if ( nMoves )
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
945 nSelectPos -= 2;
946 aLbRange.SelectEntryPos( nSelectPos );
947 aRangeStr = aLbRange.GetSelectEntry();
950 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
951 if ( itr != aRangeMap.end() )
953 BOOL bColName =
954 ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol);
955 UpdateRangeData( itr->second, bColName );
956 aBtnAdd.Disable();
957 aBtnRemove.Enable();
959 else
961 if ( aEdAssign.GetText().Len() > 0 )
963 if ( aEdAssign2.GetText().Len() > 0 )
964 aBtnAdd.Enable();
965 else
966 aBtnAdd.Disable();
967 aBtnColHead.Enable();
968 aBtnRowHead.Enable();
969 aEdAssign2.Enable();
970 aRbAssign2.Enable();
972 else
974 aBtnAdd.Disable();
975 aBtnColHead.Disable();
976 aBtnRowHead.Disable();
977 aEdAssign2.Disable();
978 aRbAssign2.Disable();
980 aBtnRemove.Disable();
981 aEdAssign.GrabFocus();
984 aEdAssign.Enable();
985 aRbAssign.Enable();
987 //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
988 //SFX_APPWINDOW->Enable();
989 return 0;
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.
1002 #* Input: ---
1004 #* Output: ---
1006 #************************************************************************/
1008 IMPL_LINK( ScColRowNameRangesDlg, Range1DataModifyHdl, void *, EMPTYARG )
1010 String aNewArea( aEdAssign.GetText() );
1011 BOOL bValid = FALSE;
1012 if ( aNewArea.Len() > 0 )
1014 ScRange aRange;
1015 if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
1017 SetColRowData( aRange );
1018 bValid = TRUE;
1021 if ( bValid )
1023 aBtnAdd.Enable();
1024 aBtnColHead.Enable();
1025 aBtnRowHead.Enable();
1026 aEdAssign2.Enable();
1027 aRbAssign2.Enable();
1029 else
1031 aBtnAdd.Disable();
1032 aBtnColHead.Disable();
1033 aBtnRowHead.Disable();
1034 aEdAssign2.Disable();
1035 aRbAssign2.Disable();
1037 aBtnRemove.Disable();
1038 return 0;
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
1051 #* Input: ---
1053 #* Output: ---
1055 #************************************************************************/
1057 IMPL_LINK( ScColRowNameRangesDlg, Range2DataModifyHdl, void *, EMPTYARG )
1059 String aNewData( aEdAssign2.GetText() );
1060 if ( aNewData.Len() > 0 )
1062 ScRange aRange;
1063 if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
1065 AdjustColRowData( aRange );
1066 aBtnAdd.Enable();
1068 else
1069 aBtnAdd.Disable();
1071 else
1073 aBtnAdd.Disable();
1075 return 0;
1079 /*************************************************************************
1080 #* Handler: ColClickHdl Datum:04.09.97
1081 #*------------------------------------------------------------------------
1083 #* Klasse: ScColRowNameRangesDlg
1085 #* Funktion: Radiobutton fuer Spalten wurde betaetigt,
1086 #* die entsprechenden Einstellungen werden
1087 #* vorgenommen
1089 #* Input: ---
1091 #* Output: ---
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 );
1104 String aStr;
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 );
1113 return 0;
1117 /*************************************************************************
1118 #* Handler: RowClickHdl Datum:04.09.97
1119 #*------------------------------------------------------------------------
1121 #* Klasse: ScColRowNameRangesDlg
1123 #* Funktion: Radiobutton fuer Zeilen wurde betaetigt,
1124 #* die entsprechenden Einstellungen werden
1125 #* vorgenommen
1127 #* Input: ---
1129 #* Output: ---
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 );
1142 String aStr;
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 );
1151 return 0;
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;
1161 else
1162 pEdActive = NULL;
1164 if( pEdActive )
1165 pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
1167 return 0;
1171 IMPL_LINK( ScColRowNameRangesDlg, LoseFocusHdl, Control*, EMPTYARG )
1173 bDlgLostFocus = !IsActive();
1174 return 0;