Stop leaking all ScPostIt instances.
[LibreOffice.git] / sc / source / ui / miscdlgs / crnrdlg.cxx
blobadce6ab0310d3d6d2203511ed725ad13648b7536
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "reffact.hxx"
21 #include "document.hxx"
22 #include "scresid.hxx"
23 #include "globstr.hrc"
24 #include "docsh.hxx"
26 #define _CRNRDLG_CXX
27 #include "crnrdlg.hxx"
28 #undef _CRNRDLG_CXX
29 #include <vcl/msgbox.hxx>
32 //============================================================================
34 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute()
35 #define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute()
37 const sal_uLong nEntryDataCol = 0;
38 const sal_uLong nEntryDataRow = 1;
39 const sal_uLong nEntryDataDelim = 2;
42 //============================================================================
43 // class ScColRowNameRangesDlg
46 /*************************************************************************
47 #* Member: ScColRowNameRangesDlg
48 #*------------------------------------------------------------------------
50 #* Klasse: ScColRowNameRangesDlg
52 #* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg.
53 #* Initialisieren der Klassen- Mitglieder,
54 #* Uebernahme der Range- Angaben und Aufruf
55 #* der eigentlichen Initialisierungsroutine
57 #* Input: Sfx- Verknuepfungen
58 #* Parent- Window
59 #* SCViewData
61 #* Output: ---
63 #************************************************************************/
65 ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB,
66 SfxChildWindow* pCW,
67 Window* pParent,
68 ScViewData* ptrViewData )
70 : ScAnyRefDlg ( pB, pCW, pParent, "NameRangesDialog" , "modules/scalc/ui/namerangesdialog.ui" ),
72 pViewData ( ptrViewData ),
73 pDoc ( ptrViewData->GetDocument() ),
75 pEdActive ( NULL ),
76 bDlgLostFocus ( false )
78 get(pLbRange,"range");
80 get(pEdAssign,"edassign");
81 get(pRbAssign,"rbassign");
82 pRbAssign->SetReferences(this, pEdAssign);
83 pEdAssign->SetReferences(this, get<VclFrame>("rangeframe")->get_label_widget());
84 get(pBtnColHead,"colhead");
85 get(pBtnRowHead,"rowhead");
86 get(pEdAssign2,"edassign2");
87 get(pRbAssign2,"rbassign2");
88 pRbAssign2->SetReferences(this, pEdAssign2);
89 pEdAssign2->SetReferences(this, get<FixedText>("datarange"));
91 get(pBtnOk,"ok");
92 get(pBtnCancel,"cancel");
93 get(pBtnAdd,"add");
94 get(pBtnRemove,"delete");
96 xColNameRanges = pDoc->GetColNameRanges()->Clone();
97 xRowNameRanges = pDoc->GetRowNameRanges()->Clone();
98 Init();
102 /*************************************************************************
103 #* Member: ~ScColRowNameRangesDlg
104 #*------------------------------------------------------------------------
106 #* Klasse: ScColRowNameRangesDlg
108 #* Funktion: Destruktor der Klasse
110 #* Input: ---
112 #* Output: ---
114 #************************************************************************/
116 ScColRowNameRangesDlg::~ScColRowNameRangesDlg()
121 /*************************************************************************
122 #* Member: Init
123 #*------------------------------------------------------------------------
125 #* Klasse: ScColRowNameRangesDlg
127 #* Funktion: Initialisierungs- Routine:
128 #* Umlenken der Event- Handler und einstellen der
129 #* Startparameter.
131 #* Input: ---
133 #* Output: ---
135 #************************************************************************/
137 void ScColRowNameRangesDlg::Init()
139 pBtnOk->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) );
140 pBtnCancel->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) );
141 pBtnAdd->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) );
142 pBtnRemove->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) );
143 pLbRange->SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) );
144 pEdAssign->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) );
145 pBtnColHead->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) );
146 pBtnRowHead->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) );
147 pEdAssign2->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) );
149 Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl );
150 pEdAssign->SetGetFocusHdl( aLink );
151 pRbAssign->SetGetFocusHdl( aLink );
152 pEdAssign2->SetGetFocusHdl( aLink );
153 pRbAssign2->SetGetFocusHdl( aLink );
155 aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl );
156 pEdAssign->SetLoseFocusHdl( aLink );
157 pRbAssign->SetLoseFocusHdl( aLink );
158 pEdAssign2->SetLoseFocusHdl( aLink );
159 pRbAssign2->SetLoseFocusHdl( aLink );
161 pLbRange->SetDropDownLineCount(10);
163 pEdActive = pEdAssign;
165 UpdateNames();
167 if ( pViewData && pDoc )
169 SCCOL nStartCol = 0;
170 SCROW nStartRow = 0;
171 SCTAB nStartTab = 0;
172 SCCOL nEndCol = 0;
173 SCROW nEndRow = 0;
174 SCTAB nEndTab = 0;
175 pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
176 nEndCol, nEndRow, nEndTab );
177 SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ),
178 ScAddress( nEndCol, nEndRow, nEndTab ) ) );
180 else
182 pBtnColHead->Check( sal_True );
183 pBtnRowHead->Check( false );
184 pEdAssign->SetText( EMPTY_OUSTRING );
185 pEdAssign2->SetText( EMPTY_OUSTRING );
188 pLbRange->SetBorderStyle( WINDOW_BORDER_MONO );
189 pBtnColHead->Enable();
190 pBtnRowHead->Enable();
191 pEdAssign->Enable();
192 pEdAssign->GrabFocus();
193 pRbAssign->Enable();
195 Range1SelectHdl( 0 );
199 /*************************************************************************
200 #* Member: SetColRowData
201 #*------------------------------------------------------------------------
203 #* Klasse: ScColRowNameRangesDlg
205 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
206 #* auf default Werte setzen und beide Referenz-Edit-Felder
207 #* fuellen.
209 #* Input: Einstellbereich fuer Labels
211 #* Output: ---
213 #************************************************************************/
215 void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,sal_Bool bRef)
217 theCurData = theCurArea = rLabelRange;
218 sal_Bool bValid = sal_True;
219 SCCOL nCol1 = theCurArea.aStart.Col();
220 SCCOL nCol2 = theCurArea.aEnd.Col();
221 SCROW nRow1 = theCurArea.aStart.Row();
222 SCROW nRow2 = theCurArea.aEnd.Row();
223 if ( (static_cast<SCCOLROW>(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) )
224 { // Spaltenkoepfe und Grenzfall gesamte Tabelle
225 pBtnColHead->Check( sal_True );
226 pBtnRowHead->Check( false );
227 if ( nRow2 == MAXROW )
229 if ( nRow1 == 0 )
230 bValid = false; // Grenzfall gesamte Tabelle
231 else
232 { // Head unten, Data oben
233 theCurData.aStart.SetRow( 0 );
234 theCurData.aEnd.SetRow( nRow1 - 1 );
237 else
238 { // Head oben, Data unten
239 theCurData.aStart.SetRow( nRow2 + 1 );
240 theCurData.aEnd.SetRow( MAXROW );
243 else
244 { // Zeilenkoepfe
245 pBtnRowHead->Check( sal_True );
246 pBtnColHead->Check( false );
247 if ( nCol2 == MAXCOL )
248 { // Head rechts, Data links
249 theCurData.aStart.SetCol( 0 );
250 theCurData.aEnd.SetCol( nCol2 - 1 );
252 else
253 { // Head links, Data rechts
254 theCurData.aStart.SetCol( nCol2 + 1 );
255 theCurData.aEnd.SetCol( MAXCOL );
258 if ( bValid )
260 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
261 OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, eConv));
263 if(bRef)
264 pEdAssign->SetRefString( aStr );
265 else
266 pEdAssign->SetText( aStr );
268 pEdAssign->SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
269 aStr = theCurData.Format(SCR_ABS_3D, pDoc, eConv);
271 if(bRef)
272 pEdAssign2->SetRefString( aStr );
273 else
274 pEdAssign2->SetText( aStr );
276 else
278 theCurData = theCurArea = ScRange();
280 if(bRef)
282 pEdAssign->SetRefString( EMPTY_OUSTRING );
283 pEdAssign2->SetRefString( EMPTY_OUSTRING );
285 else
287 pEdAssign->SetText( EMPTY_OUSTRING );
288 pEdAssign2->SetText( EMPTY_OUSTRING );
291 pBtnColHead->Disable();
292 pBtnRowHead->Disable();
293 pEdAssign2->Disable();
294 pRbAssign2->Disable();
299 /*************************************************************************
300 #* Member: AdjustColRowData
301 #*------------------------------------------------------------------------
303 #* Klasse: ScColRowNameRangesDlg
305 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
306 #* anpassen und Data-Referenz-Edit-Feld fuellen.
308 #* Input: Bereich fuer Labels
310 #* Output: ---
312 #************************************************************************/
314 void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange,sal_Bool bRef)
316 theCurData = rDataRange;
317 if ( pBtnColHead->IsChecked() )
318 { // Datenbereich gleiche Spalten wie Koepfe
319 theCurData.aStart.SetCol( theCurArea.aStart.Col() );
320 theCurData.aEnd.SetCol( theCurArea.aEnd.Col() );
321 if ( theCurData.Intersects( theCurArea ) )
323 SCROW nRow1 = theCurArea.aStart.Row();
324 SCROW nRow2 = theCurArea.aEnd.Row();
325 if ( nRow1 > 0
326 && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) )
327 { // Data oben
328 theCurData.aEnd.SetRow( nRow1 - 1 );
329 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
330 theCurData.aStart.SetRow( theCurData.aEnd.Row() );
332 else
333 { // Data unten
334 theCurData.aStart.SetRow( nRow2 + 1 );
335 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
336 theCurData.aEnd.SetRow( theCurData.aStart.Row() );
340 else
341 { // Datenbereich gleiche Zeilen wie Koepfe
342 theCurData.aStart.SetRow( theCurArea.aStart.Row() );
343 theCurData.aEnd.SetRow( theCurArea.aEnd.Row() );
344 if ( theCurData.Intersects( theCurArea ) )
346 SCCOL nCol1 = theCurArea.aStart.Col();
347 SCCOL nCol2 = theCurArea.aEnd.Col();
348 if ( nCol1 > 0
349 && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) )
350 { // Data links
351 theCurData.aEnd.SetCol( nCol1 - 1 );
352 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
353 theCurData.aStart.SetCol( theCurData.aEnd.Col() );
355 else
356 { // Data rechts
357 theCurData.aStart.SetCol( nCol2 + 1 );
358 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
359 theCurData.aEnd.SetCol( theCurData.aStart.Col() );
363 OUString aStr(theCurData.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
365 if(bRef)
366 pEdAssign2->SetRefString( aStr );
367 else
368 pEdAssign2->SetText( aStr );
370 pEdAssign2->SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
374 /*************************************************************************
375 #* Member: SetReference
376 #*------------------------------------------------------------------------
378 #* Klasse: ScColRowNameRangesDlg
380 #* Funktion: Uebergabe eines mit der Maus selektierten Tabellen-
381 #* bereiches, der dann als neue Selektion im Referenz-
382 #* Fenster angezeigt wird.
384 #* Input: Bereich fuer Labels
385 #* Dokumentklasse
387 #* Output: ---
389 #************************************************************************/
391 void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ )
393 if ( pEdActive )
395 if ( rRef.aStart != rRef.aEnd )
396 RefInputStart( pEdActive );
398 if ( pEdActive == pEdAssign )
399 SetColRowData( rRef, sal_True );
400 else
401 AdjustColRowData( rRef, sal_True );
402 pBtnColHead->Enable();
403 pBtnRowHead->Enable();
404 pBtnAdd->Enable();
405 pBtnRemove->Disable();
410 /*************************************************************************
411 #* Member: Close
412 #*------------------------------------------------------------------------
414 #* Klasse: ScColRowNameRangesDlg
416 #* Funktion: Schliessen des Fensters
418 #* Input: ---
420 #* Output: ---
422 #************************************************************************/
424 sal_Bool ScColRowNameRangesDlg::Close()
426 return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() );
430 /*************************************************************************
431 #* Member: SetActive
432 #*------------------------------------------------------------------------
434 #* Klasse: ScColRowNameRangesDlg
436 #* Funktion: Aktivieren des Fensters
438 #* Input: ---
440 #* Output: ---
442 #************************************************************************/
444 void ScColRowNameRangesDlg::SetActive()
446 if ( bDlgLostFocus )
448 bDlgLostFocus = false;
449 if( pEdActive )
450 pEdActive->GrabFocus();
452 else
453 GrabFocus();
455 if( pEdActive == pEdAssign )
456 Range1DataModifyHdl( 0 );
457 else if( pEdActive == pEdAssign2 )
458 Range2DataModifyHdl( 0 );
460 RefInputDone();
464 /*************************************************************************
465 #* Member: UpdateNames
466 #*------------------------------------------------------------------------
468 #* Klasse: ScColRowNameRangesDlg
470 #* Funktion: Aktualisieren der Namen
472 #* Input: ---
474 #* Output: ---
476 #************************************************************************/
478 void ScColRowNameRangesDlg::UpdateNames()
480 pLbRange->SetUpdateMode( false );
481 //-----------------------------------------------------------
482 pLbRange->Clear();
483 aRangeMap.clear();
484 pEdAssign->SetText( EMPTY_OUSTRING );
486 size_t nCount, j;
487 sal_uInt16 nPos; //@008 Hilfsvariable q eingefuegt
489 SCCOL nCol1;
490 SCROW nRow1; //Erweiterung fuer Bereichsnamen
491 SCTAB nTab1;
492 SCCOL nCol2;
493 SCROW nRow2;
494 SCTAB nTab2;
495 OUString rString;
496 OUString strShow;
497 const ScAddress::Details aDetails(pDoc->GetAddressConvention());
499 OUString aString;
500 OUString strDelim(" --- ");
501 aString = strDelim;
502 aString += ScGlobal::GetRscString( STR_COLUMN );
503 aString += strDelim;
504 nPos = pLbRange->InsertEntry( aString );
505 pLbRange->SetEntryData( nPos, (void*)nEntryDataDelim );
506 if ( (nCount = xColNameRanges->size()) > 0 )
508 ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray(
509 nCount, pDoc );
510 for ( j=0; j < nCount; j++ )
512 const ScRange aRange(ppSortArray[j]->GetRange(0));
513 aString = aRange.Format(SCR_ABS_3D, pDoc, aDetails);
515 //@008 Hole Bereichsparameter aus Dok
516 ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
517 nCol2, nRow2, nTab2 );
518 SCCOL q=nCol1+3;
519 if(q>nCol2) q=nCol2;
520 //@008 Baue String zusammen
521 strShow = " [";
522 if(pDoc!=NULL)
524 rString = pDoc->GetString(nCol1, nRow1, nTab1);
525 strShow += rString;
526 for(SCCOL i=nCol1+1;i<=q;i++)
528 strShow += ", ";
529 rString = pDoc->GetString(i, nRow1, nTab1);
530 strShow += rString;
533 if(q<nCol2) // Zu lang? Ergaenzen um ",..."
535 strShow += ", ...";
537 strShow += "]";
539 //@008 String einfuegen in Listbox
540 OUString aInsStr = aString;
541 aInsStr += strShow;
542 nPos = pLbRange->InsertEntry( aInsStr );
543 aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
544 pLbRange->SetEntryData( nPos, (void*)nEntryDataCol );
546 delete [] ppSortArray;
548 aString = strDelim;
549 aString += ScGlobal::GetRscString( STR_ROW );
550 aString += strDelim;
551 nPos = pLbRange->InsertEntry( aString );
552 pLbRange->SetEntryData( nPos, (void*)nEntryDataDelim );
553 if ( (nCount = xRowNameRanges->size()) > 0 )
555 ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray(
556 nCount, pDoc );
557 for ( j=0; j < nCount; j++ )
559 const ScRange aRange(ppSortArray[j]->GetRange(0));
560 aString = aRange.Format(SCR_ABS_3D, pDoc, aDetails);
562 //@008 Ab hier baue String fuer Zeilen
563 ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
564 nCol2, nRow2, nTab2 );
565 SCROW q=nRow1+3;
566 if(q>nRow2) q=nRow2;
567 strShow = " [";
568 if(pDoc!=NULL)
570 rString = pDoc->GetString(nCol1, nRow1, nTab1);
571 strShow += rString;
572 for(SCROW i=nRow1+1;i<=q;i++)
574 strShow += ", ";
575 rString = pDoc->GetString(nCol1, i, nTab1);
576 strShow += rString;
579 if(q<nRow2)
581 strShow += ", ...";
583 strShow += "]";
585 OUString aInsStr = aString;
586 aInsStr += strShow;
587 nPos = pLbRange->InsertEntry( aInsStr );
588 aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
589 pLbRange->SetEntryData( nPos, (void*)nEntryDataRow );
591 delete [] ppSortArray;
593 //-----------------------------------------------------------
594 pLbRange->SetUpdateMode( sal_True );
595 pLbRange->Invalidate();
599 /*************************************************************************
600 #* Member: UpdateRangeData
601 #*------------------------------------------------------------------------
603 #* Klasse: ScColRowNameRangesDlg
605 #* Funktion: Aktualisieren der Bereichsdaten
607 #* Input: Bereichs-String
608 #* Flag fuer Spalten
610 #* Output: ---
612 #************************************************************************/
614 void ScColRowNameRangesDlg::UpdateRangeData( const ScRange& rRange, sal_Bool bColName )
616 ScRangePair* pPair = NULL;
617 sal_Bool bFound = false;
618 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
619 bFound = sal_True;
620 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
621 bFound = sal_True;
623 if ( bFound )
625 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
626 theCurArea = rRange;
627 OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, eConv));
628 pEdAssign->SetText( aStr );
629 pBtnAdd->Disable();
630 pBtnRemove->Enable();
631 pBtnColHead->Check( bColName );
632 pBtnRowHead->Check( !bColName );
633 theCurData = pPair->GetRange(1);
634 aStr = theCurData.Format(SCR_ABS_3D, pDoc, eConv);
635 pEdAssign2->SetText( aStr );
637 else
639 pBtnAdd->Enable();
640 pBtnRemove->Disable();
642 pBtnColHead->Enable();
643 pBtnRowHead->Enable();
644 pEdAssign2->Enable();
645 pRbAssign2->Enable();
649 /*************************************************************************
650 #* Member: IsRefInputMode
651 #*------------------------------------------------------------------------
653 #* Klasse: ScColRowNameRangesDlg
655 #* Funktion: Abfragefunktion fuer Referenz- Input- Mode.
657 #* Input: Bereichs-String
658 #* Flag fuer Spalten
660 #* Output: true, wenn Referenz- Input- Mode
662 #************************************************************************/
664 sal_Bool ScColRowNameRangesDlg::IsRefInputMode() const
666 return (pEdActive != NULL);
669 //------------------------------------------------------------------------
670 // Handler:
671 // ========
673 /*************************************************************************
674 #* Handler: OkBtnHdl
675 #*------------------------------------------------------------------------
677 #* Klasse: ScColRowNameRangesDlg
679 #* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde.
680 #* Hinzufuegen- Button ausloesen, und die neu einge-
681 #* stellten Bereiche ans Dokument uebergeben.
682 #* Fensterschliessen- Anweisung ausloesen.
683 #* Input: ---
685 #* Output: ---
687 #************************************************************************/
689 IMPL_LINK_NOARG(ScColRowNameRangesDlg, OkBtnHdl)
691 AddBtnHdl( 0 );
693 // die RangeLists den Refs am Doc zuweisen
694 pDoc->GetColNameRangesRef() = xColNameRanges;
695 pDoc->GetRowNameRangesRef() = xRowNameRanges;
696 // geaenderte Datenbereiche muessen sich auswirken
697 pDoc->CompileColRowNameFormula();
698 ScDocShell* pDocShell = pViewData->GetDocShell();
699 pDocShell->PostPaint(ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB), PAINT_GRID);
700 pDocShell->SetDocumentModified();
702 Close();
703 return 0;
707 /*************************************************************************
708 #* Handler: CancelBtnHdl
709 #*------------------------------------------------------------------------
711 #* Klasse: ScColRowNameRangesDlg
713 #* Funktion: Fensterschliessen- Anweisung ausloesen.
715 #* Input: ---
717 #* Output: ---
719 #************************************************************************/
721 IMPL_LINK_NOARG_INLINE_START(ScColRowNameRangesDlg, CancelBtnHdl)
723 Close();
724 return 0;
726 IMPL_LINK_NOARG_INLINE_END(ScColRowNameRangesDlg, CancelBtnHdl)
729 /*************************************************************************
730 #* Handler: AddBtnHdl
731 #*------------------------------------------------------------------------
733 #* Klasse: ScColRowNameRangesDlg
735 #* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden
736 #* die Bereichsangaben eingestellt und in der
737 #* Listbox dargestellt.
739 #* Input: ---
741 #* Output: ---
743 #************************************************************************/
745 IMPL_LINK_NOARG(ScColRowNameRangesDlg, AddBtnHdl)
747 OUString aNewArea( pEdAssign->GetText() );
748 OUString aNewData( pEdAssign2->GetText() );
750 if ( !aNewArea.isEmpty() && !aNewData.isEmpty() )
752 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
753 ScRange aRange1, aRange2;
754 sal_Bool bOk1;
755 if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID)) != false
756 && ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) )
758 theCurArea = aRange1;
759 AdjustColRowData( aRange2 );
760 ScRangePair* pPair;
761 if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL )
763 xColNameRanges->Remove( pPair );
764 delete pPair;
766 if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL )
768 xRowNameRanges->Remove( pPair );
769 delete pPair;
771 if ( pBtnColHead->IsChecked() )
772 xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
773 else
774 xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
776 UpdateNames();
778 pEdAssign->GrabFocus();
779 pBtnAdd->Disable();
780 pBtnRemove->Disable();
781 pEdAssign->SetText( EMPTY_OUSTRING );
782 pBtnColHead->Check( sal_True );
783 pBtnRowHead->Check( false );
784 pEdAssign2->SetText( EMPTY_OUSTRING );
785 theCurArea = ScRange();
786 theCurData = theCurArea;
787 Range1SelectHdl( 0 );
789 else
791 ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) );
792 if ( !bOk1 )
793 pEdAssign->GrabFocus();
794 else
795 pEdAssign2->GrabFocus();
798 return 0;
802 /*************************************************************************
803 #* Handler: RemoveBtnHdl
804 #*------------------------------------------------------------------------
806 #* Klasse: ScColRowNameRangesDlg
808 #* Funktion: Nach betaetigen des Loeschen- Buttons, wird
809 #* die markierte Bereichsangabe geloescht.
811 #* Input: ---
813 #* Output: ---
815 #************************************************************************/
817 IMPL_LINK_NOARG(ScColRowNameRangesDlg, RemoveBtnHdl)
819 OUString aRangeStr = pLbRange->GetSelectEntry();
820 sal_uInt16 nSelectPos = pLbRange->GetSelectEntryPos();
821 sal_Bool bColName =
822 ((sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataCol);
823 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
824 if (itr == aRangeMap.end())
825 return 0;
826 const ScRange& rRange = itr->second;
828 ScRangePair* pPair = NULL;
829 sal_Bool bFound = false;
830 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
831 bFound = sal_True;
832 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
833 bFound = sal_True;
834 if ( bFound )
836 OUString aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
837 OUString aMsg = aStrDelMsg.getToken( 0, '#' );
839 aMsg += aRangeStr;
840 aMsg += aStrDelMsg.getToken( 1, '#' );
842 if ( RET_YES == QUERYBOX(aMsg) )
844 if ( bColName )
845 xColNameRanges->Remove( pPair );
846 else
847 xRowNameRanges->Remove( pPair );
848 delete pPair;
850 UpdateNames();
851 sal_uInt16 nCnt = pLbRange->GetEntryCount();
852 if ( nSelectPos >= nCnt )
854 if ( nCnt )
855 nSelectPos = nCnt - 1;
856 else
857 nSelectPos = 0;
859 pLbRange->SelectEntryPos( nSelectPos );
860 if ( nSelectPos &&
861 (sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataDelim )
862 pLbRange->SelectEntryPos( --nSelectPos ); // ---Zeile---
864 pLbRange->GrabFocus();
865 pBtnAdd->Disable();
866 pBtnRemove->Disable();
867 pEdAssign->SetText( EMPTY_OUSTRING );
868 theCurArea = theCurData = ScRange();
869 pBtnColHead->Check( sal_True );
870 pBtnRowHead->Check( false );
871 pEdAssign2->SetText( EMPTY_OUSTRING );
872 Range1SelectHdl( 0 );
875 return 0;
879 /*************************************************************************
880 #* Handler: Range1SelectHdl
881 #*------------------------------------------------------------------------
883 #* Klasse: ScColRowNameRangesDlg
885 #* Funktion: Wenn Zeile in Listbox ausgewaehlt wird,
886 #* werden die Eingabefelder entsprechend
887 #* eingestellt.
889 #* Input: ---
891 #* Output: ---
893 #************************************************************************/
895 IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range1SelectHdl)
897 sal_uInt16 nSelectPos = pLbRange->GetSelectEntryPos();
898 sal_uInt16 nCnt = pLbRange->GetEntryCount();
899 sal_uInt16 nMoves = 0;
900 while ( nSelectPos < nCnt
901 && (sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataDelim )
902 { // skip Delimiter
903 ++nMoves;
904 pLbRange->SelectEntryPos( ++nSelectPos );
906 OUString aRangeStr = pLbRange->GetSelectEntry();
907 if ( nMoves )
909 if ( nSelectPos > 1 && nSelectPos >= nCnt )
910 { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben
911 // wenn davor Eintraege existieren
912 nSelectPos = nCnt - 2;
913 pLbRange->SelectEntryPos( nSelectPos );
914 aRangeStr = pLbRange->GetSelectEntry();
916 else if ( nSelectPos > 2 && nSelectPos < nCnt && !aRangeStr.isEmpty()
917 && aRangeStr == pEdAssign->GetText() )
918 { // nach oben wandern statt nach unten auf die vorherige Position
919 nSelectPos -= 2;
920 pLbRange->SelectEntryPos( nSelectPos );
921 aRangeStr = pLbRange->GetSelectEntry();
924 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
925 if ( itr != aRangeMap.end() )
927 sal_Bool bColName =
928 ((sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataCol);
929 UpdateRangeData( itr->second, bColName );
930 pBtnAdd->Disable();
931 pBtnRemove->Enable();
933 else
935 if ( !pEdAssign->GetText().isEmpty() )
937 if ( !pEdAssign2->GetText().isEmpty() )
938 pBtnAdd->Enable();
939 else
940 pBtnAdd->Disable();
941 pBtnColHead->Enable();
942 pBtnRowHead->Enable();
943 pEdAssign2->Enable();
944 pRbAssign2->Enable();
946 else
948 pBtnAdd->Disable();
949 pBtnColHead->Disable();
950 pBtnRowHead->Disable();
951 pEdAssign2->Disable();
952 pRbAssign2->Disable();
954 pBtnRemove->Disable();
955 pEdAssign->GrabFocus();
958 pEdAssign->Enable();
959 pRbAssign->Enable();
961 return 0;
965 /*************************************************************************
966 #* Handler: Range1DataModifyHdl
967 #*------------------------------------------------------------------------
969 #* Klasse: ScColRowNameRangesDlg
971 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label-
972 #* Bereich geaendert wurde.
974 #* Input: ---
976 #* Output: ---
978 #************************************************************************/
980 IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range1DataModifyHdl)
982 OUString aNewArea( pEdAssign->GetText() );
983 sal_Bool bValid = false;
984 if ( !aNewArea.isEmpty() )
986 ScRange aRange;
987 if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
989 SetColRowData( aRange );
990 bValid = sal_True;
993 if ( bValid )
995 pBtnAdd->Enable();
996 pBtnColHead->Enable();
997 pBtnRowHead->Enable();
998 pEdAssign2->Enable();
999 pRbAssign2->Enable();
1001 else
1003 pBtnAdd->Disable();
1004 pBtnColHead->Disable();
1005 pBtnRowHead->Disable();
1006 pEdAssign2->Disable();
1007 pRbAssign2->Disable();
1009 pBtnRemove->Disable();
1010 return 0;
1014 /*************************************************************************
1015 #* Handler: Range2DataModifyHdl
1016 #*------------------------------------------------------------------------
1018 #* Klasse: ScColRowNameRangesDlg
1020 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten-
1021 #* Bereich geaendert wurde
1023 #* Input: ---
1025 #* Output: ---
1027 #************************************************************************/
1029 IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range2DataModifyHdl)
1031 OUString aNewData( pEdAssign2->GetText() );
1032 if ( !aNewData.isEmpty() )
1034 ScRange aRange;
1035 if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
1037 AdjustColRowData( aRange );
1038 pBtnAdd->Enable();
1040 else
1041 pBtnAdd->Disable();
1043 else
1045 pBtnAdd->Disable();
1047 return 0;
1051 /*************************************************************************
1052 #* Handler: ColClickHdl
1053 #*------------------------------------------------------------------------
1055 #* Klasse: ScColRowNameRangesDlg
1057 #* Funktion: Radiobutton fuer Spalten wurde betaetigt,
1058 #* die entsprechenden Einstellungen werden
1059 #* vorgenommen
1061 #* Input: ---
1063 #* Output: ---
1065 #************************************************************************/
1067 IMPL_LINK_NOARG(ScColRowNameRangesDlg, ColClickHdl)
1069 if ( !pBtnColHead->GetSavedValue() )
1071 pBtnColHead->Check( sal_True );
1072 pBtnRowHead->Check( false );
1073 if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW )
1075 theCurArea.aEnd.SetRow( MAXROW - 1 );
1076 OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
1077 pEdAssign->SetText( aStr );
1079 ScRange aRange( theCurData );
1080 aRange.aStart.SetRow( std::min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) );
1081 aRange.aEnd.SetRow( MAXROW );
1082 AdjustColRowData( aRange );
1084 return 0;
1088 /*************************************************************************
1089 #* Handler: RowClickHdl
1090 #*------------------------------------------------------------------------
1092 #* Klasse: ScColRowNameRangesDlg
1094 #* Funktion: Radiobutton fuer Zeilen wurde betaetigt,
1095 #* die entsprechenden Einstellungen werden
1096 #* vorgenommen
1098 #* Input: ---
1100 #* Output: ---
1102 #************************************************************************/
1104 IMPL_LINK_NOARG(ScColRowNameRangesDlg, RowClickHdl)
1106 if ( !pBtnRowHead->GetSavedValue() )
1108 pBtnRowHead->Check( sal_True );
1109 pBtnColHead->Check( false );
1110 if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL )
1112 theCurArea.aEnd.SetCol( MAXCOL - 1 );
1113 OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
1114 pEdAssign->SetText( aStr );
1116 ScRange aRange( theCurData );
1117 aRange.aStart.SetCol( static_cast<SCCOL>(std::min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) );
1118 aRange.aEnd.SetCol( MAXCOL );
1119 AdjustColRowData( aRange );
1121 return 0;
1125 IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl )
1127 if( (pCtrl == (Control*)pEdAssign) || (pCtrl == (Control*)pRbAssign) )
1128 pEdActive = pEdAssign;
1129 else if( (pCtrl == (Control*)pEdAssign2) || (pCtrl == (Control*)pRbAssign2) )
1130 pEdActive = pEdAssign2;
1131 else
1132 pEdActive = NULL;
1134 if( pEdActive )
1135 pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
1137 return 0;
1141 IMPL_LINK_NOARG(ScColRowNameRangesDlg, LoseFocusHdl)
1143 bDlgLostFocus = !IsActive();
1144 return 0;
1147 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */