Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #include "reffact.hxx"
21 : #include "document.hxx"
22 : #include "scresid.hxx"
23 : #include "globstr.hrc"
24 : #include "docsh.hxx"
25 :
26 : #define _CRNRDLG_CXX
27 : #include "crnrdlg.hxx"
28 : #undef _CRNRDLG_CXX
29 : #include <vcl/msgbox.hxx>
30 : #include <boost/scoped_array.hpp>
31 :
32 : #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute()
33 : #define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute()
34 :
35 : const sal_uLong nEntryDataCol = 0;
36 : const sal_uLong nEntryDataRow = 1;
37 : const sal_uLong nEntryDataDelim = 2;
38 :
39 : // class ScColRowNameRangesDlg
40 :
41 :
42 : /*************************************************************************
43 : #* Member: ScColRowNameRangesDlg
44 : #*------------------------------------------------------------------------
45 : #*
46 : #* Klasse: ScColRowNameRangesDlg
47 : #*
48 : #* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg.
49 : #* Initialisieren der Klassen- Mitglieder,
50 : #* Uebernahme der Range- Angaben und Aufruf
51 : #* der eigentlichen Initialisierungsroutine
52 : #*
53 : #* Input: Sfx- Verknuepfungen
54 : #* Parent- Window
55 : #* SCViewData
56 : #*
57 : #* Output: ---
58 : #*
59 : #************************************************************************/
60 :
61 0 : ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB,
62 : SfxChildWindow* pCW,
63 : Window* pParent,
64 : ScViewData* ptrViewData )
65 :
66 : : ScAnyRefDlg ( pB, pCW, pParent, "NameRangesDialog" , "modules/scalc/ui/namerangesdialog.ui" ),
67 :
68 : pViewData ( ptrViewData ),
69 0 : pDoc ( ptrViewData->GetDocument() ),
70 :
71 : pEdActive ( NULL ),
72 0 : bDlgLostFocus ( false )
73 : {
74 0 : get(pLbRange,"range");
75 :
76 0 : get(pEdAssign,"edassign");
77 0 : get(pRbAssign,"rbassign");
78 0 : pRbAssign->SetReferences(this, pEdAssign);
79 0 : pEdAssign->SetReferences(this, get<VclFrame>("rangeframe")->get_label_widget());
80 0 : get(pBtnColHead,"colhead");
81 0 : get(pBtnRowHead,"rowhead");
82 0 : get(pEdAssign2,"edassign2");
83 0 : get(pRbAssign2,"rbassign2");
84 0 : pRbAssign2->SetReferences(this, pEdAssign2);
85 0 : pEdAssign2->SetReferences(this, get<FixedText>("datarange"));
86 :
87 0 : get(pBtnOk,"ok");
88 0 : get(pBtnCancel,"cancel");
89 0 : get(pBtnAdd,"add");
90 0 : get(pBtnRemove,"delete");
91 :
92 0 : xColNameRanges = pDoc->GetColNameRanges()->Clone();
93 0 : xRowNameRanges = pDoc->GetRowNameRanges()->Clone();
94 0 : Init();
95 0 : }
96 :
97 :
98 : /*************************************************************************
99 : #* Member: ~ScColRowNameRangesDlg
100 : #*------------------------------------------------------------------------
101 : #*
102 : #* Klasse: ScColRowNameRangesDlg
103 : #*
104 : #* Funktion: Destruktor der Klasse
105 : #*
106 : #* Input: ---
107 : #*
108 : #* Output: ---
109 : #*
110 : #************************************************************************/
111 :
112 0 : ScColRowNameRangesDlg::~ScColRowNameRangesDlg()
113 : {
114 0 : }
115 :
116 :
117 : /*************************************************************************
118 : #* Member: Init
119 : #*------------------------------------------------------------------------
120 : #*
121 : #* Klasse: ScColRowNameRangesDlg
122 : #*
123 : #* Funktion: Initialisierungs- Routine:
124 : #* Umlenken der Event- Handler und einstellen der
125 : #* Startparameter.
126 : #*
127 : #* Input: ---
128 : #*
129 : #* Output: ---
130 : #*
131 : #************************************************************************/
132 :
133 0 : void ScColRowNameRangesDlg::Init()
134 : {
135 0 : pBtnOk->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) );
136 0 : pBtnCancel->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) );
137 0 : pBtnAdd->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) );
138 0 : pBtnRemove->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) );
139 0 : pLbRange->SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) );
140 0 : pEdAssign->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) );
141 0 : pBtnColHead->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) );
142 0 : pBtnRowHead->SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) );
143 0 : pEdAssign2->SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) );
144 :
145 0 : Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl );
146 0 : pEdAssign->SetGetFocusHdl( aLink );
147 0 : pRbAssign->SetGetFocusHdl( aLink );
148 0 : pEdAssign2->SetGetFocusHdl( aLink );
149 0 : pRbAssign2->SetGetFocusHdl( aLink );
150 :
151 0 : aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl );
152 0 : pEdAssign->SetLoseFocusHdl( aLink );
153 0 : pRbAssign->SetLoseFocusHdl( aLink );
154 0 : pEdAssign2->SetLoseFocusHdl( aLink );
155 0 : pRbAssign2->SetLoseFocusHdl( aLink );
156 :
157 0 : pLbRange->SetDropDownLineCount(10);
158 :
159 0 : pEdActive = pEdAssign;
160 :
161 0 : UpdateNames();
162 :
163 0 : if ( pViewData && pDoc )
164 : {
165 0 : SCCOL nStartCol = 0;
166 0 : SCROW nStartRow = 0;
167 0 : SCTAB nStartTab = 0;
168 0 : SCCOL nEndCol = 0;
169 0 : SCROW nEndRow = 0;
170 0 : SCTAB nEndTab = 0;
171 : pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
172 0 : nEndCol, nEndRow, nEndTab );
173 : SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ),
174 0 : ScAddress( nEndCol, nEndRow, nEndTab ) ) );
175 : }
176 : else
177 : {
178 0 : pBtnColHead->Check( true );
179 0 : pBtnRowHead->Check( false );
180 0 : pEdAssign->SetText( EMPTY_OUSTRING );
181 0 : pEdAssign2->SetText( EMPTY_OUSTRING );
182 : }
183 :
184 0 : pLbRange->SetBorderStyle( WINDOW_BORDER_MONO );
185 0 : pBtnColHead->Enable();
186 0 : pBtnRowHead->Enable();
187 0 : pEdAssign->Enable();
188 0 : pEdAssign->GrabFocus();
189 0 : pRbAssign->Enable();
190 :
191 0 : Range1SelectHdl( 0 );
192 0 : }
193 :
194 :
195 : /*************************************************************************
196 : #* Member: SetColRowData
197 : #*------------------------------------------------------------------------
198 : #*
199 : #* Klasse: ScColRowNameRangesDlg
200 : #*
201 : #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
202 : #* auf default Werte setzen und beide Referenz-Edit-Felder
203 : #* fuellen.
204 : #*
205 : #* Input: Einstellbereich fuer Labels
206 : #*
207 : #* Output: ---
208 : #*
209 : #************************************************************************/
210 :
211 0 : void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange, bool bRef)
212 : {
213 0 : theCurData = theCurArea = rLabelRange;
214 0 : sal_Bool bValid = sal_True;
215 0 : SCCOL nCol1 = theCurArea.aStart.Col();
216 0 : SCCOL nCol2 = theCurArea.aEnd.Col();
217 0 : SCROW nRow1 = theCurArea.aStart.Row();
218 0 : SCROW nRow2 = theCurArea.aEnd.Row();
219 0 : if ( (static_cast<SCCOLROW>(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) )
220 : { // Spaltenkoepfe und Grenzfall gesamte Tabelle
221 0 : pBtnColHead->Check( true );
222 0 : pBtnRowHead->Check( false );
223 0 : if ( nRow2 == MAXROW )
224 : {
225 0 : if ( nRow1 == 0 )
226 0 : bValid = false; // Grenzfall gesamte Tabelle
227 : else
228 : { // Head unten, Data oben
229 0 : theCurData.aStart.SetRow( 0 );
230 0 : theCurData.aEnd.SetRow( nRow1 - 1 );
231 : }
232 : }
233 : else
234 : { // Head oben, Data unten
235 0 : theCurData.aStart.SetRow( nRow2 + 1 );
236 0 : theCurData.aEnd.SetRow( MAXROW );
237 : }
238 : }
239 : else
240 : { // Zeilenkoepfe
241 0 : pBtnRowHead->Check( true );
242 0 : pBtnColHead->Check( false );
243 0 : if ( nCol2 == MAXCOL )
244 : { // Head rechts, Data links
245 0 : theCurData.aStart.SetCol( 0 );
246 0 : theCurData.aEnd.SetCol( nCol2 - 1 );
247 : }
248 : else
249 : { // Head links, Data rechts
250 0 : theCurData.aStart.SetCol( nCol2 + 1 );
251 0 : theCurData.aEnd.SetCol( MAXCOL );
252 : }
253 : }
254 0 : if ( bValid )
255 : {
256 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
257 0 : OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, eConv));
258 :
259 0 : if(bRef)
260 0 : pEdAssign->SetRefString( aStr );
261 : else
262 0 : pEdAssign->SetText( aStr );
263 :
264 0 : pEdAssign->SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
265 0 : aStr = theCurData.Format(SCR_ABS_3D, pDoc, eConv);
266 :
267 0 : if(bRef)
268 0 : pEdAssign2->SetRefString( aStr );
269 : else
270 0 : pEdAssign2->SetText( aStr );
271 : }
272 : else
273 : {
274 0 : theCurData = theCurArea = ScRange();
275 :
276 0 : if(bRef)
277 : {
278 0 : pEdAssign->SetRefString( EMPTY_OUSTRING );
279 0 : pEdAssign2->SetRefString( EMPTY_OUSTRING );
280 : }
281 : else
282 : {
283 0 : pEdAssign->SetText( EMPTY_OUSTRING );
284 0 : pEdAssign2->SetText( EMPTY_OUSTRING );
285 : }
286 :
287 0 : pBtnColHead->Disable();
288 0 : pBtnRowHead->Disable();
289 0 : pEdAssign2->Disable();
290 0 : pRbAssign2->Disable();
291 : }
292 0 : }
293 :
294 :
295 : /*************************************************************************
296 : #* Member: AdjustColRowData
297 : #*------------------------------------------------------------------------
298 : #*
299 : #* Klasse: ScColRowNameRangesDlg
300 : #*
301 : #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches
302 : #* anpassen und Data-Referenz-Edit-Feld fuellen.
303 : #*
304 : #* Input: Bereich fuer Labels
305 : #*
306 : #* Output: ---
307 : #*
308 : #************************************************************************/
309 :
310 0 : void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange, bool bRef)
311 : {
312 0 : theCurData = rDataRange;
313 0 : if ( pBtnColHead->IsChecked() )
314 : { // Datenbereich gleiche Spalten wie Koepfe
315 0 : theCurData.aStart.SetCol( theCurArea.aStart.Col() );
316 0 : theCurData.aEnd.SetCol( theCurArea.aEnd.Col() );
317 0 : if ( theCurData.Intersects( theCurArea ) )
318 : {
319 0 : SCROW nRow1 = theCurArea.aStart.Row();
320 0 : SCROW nRow2 = theCurArea.aEnd.Row();
321 0 : if ( nRow1 > 0
322 0 : && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) )
323 : { // Data oben
324 0 : theCurData.aEnd.SetRow( nRow1 - 1 );
325 0 : if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
326 0 : theCurData.aStart.SetRow( theCurData.aEnd.Row() );
327 : }
328 : else
329 : { // Data unten
330 0 : theCurData.aStart.SetRow( nRow2 + 1 );
331 0 : if ( theCurData.aStart.Row() > theCurData.aEnd.Row() )
332 0 : theCurData.aEnd.SetRow( theCurData.aStart.Row() );
333 : }
334 : }
335 : }
336 : else
337 : { // Datenbereich gleiche Zeilen wie Koepfe
338 0 : theCurData.aStart.SetRow( theCurArea.aStart.Row() );
339 0 : theCurData.aEnd.SetRow( theCurArea.aEnd.Row() );
340 0 : if ( theCurData.Intersects( theCurArea ) )
341 : {
342 0 : SCCOL nCol1 = theCurArea.aStart.Col();
343 0 : SCCOL nCol2 = theCurArea.aEnd.Col();
344 0 : if ( nCol1 > 0
345 0 : && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) )
346 : { // Data links
347 0 : theCurData.aEnd.SetCol( nCol1 - 1 );
348 0 : if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
349 0 : theCurData.aStart.SetCol( theCurData.aEnd.Col() );
350 : }
351 : else
352 : { // Data rechts
353 0 : theCurData.aStart.SetCol( nCol2 + 1 );
354 0 : if ( theCurData.aStart.Col() > theCurData.aEnd.Col() )
355 0 : theCurData.aEnd.SetCol( theCurData.aStart.Col() );
356 : }
357 : }
358 : }
359 0 : OUString aStr(theCurData.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
360 :
361 0 : if(bRef)
362 0 : pEdAssign2->SetRefString( aStr );
363 : else
364 0 : pEdAssign2->SetText( aStr );
365 :
366 0 : pEdAssign2->SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) );
367 0 : }
368 :
369 :
370 : /*************************************************************************
371 : #* Member: SetReference
372 : #*------------------------------------------------------------------------
373 : #*
374 : #* Klasse: ScColRowNameRangesDlg
375 : #*
376 : #* Funktion: Uebergabe eines mit der Maus selektierten Tabellen-
377 : #* bereiches, der dann als neue Selektion im Referenz-
378 : #* Fenster angezeigt wird.
379 : #*
380 : #* Input: Bereich fuer Labels
381 : #* Dokumentklasse
382 : #*
383 : #* Output: ---
384 : #*
385 : #************************************************************************/
386 :
387 0 : void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ )
388 : {
389 0 : if ( pEdActive )
390 : {
391 0 : if ( rRef.aStart != rRef.aEnd )
392 0 : RefInputStart( pEdActive );
393 :
394 0 : if ( pEdActive == pEdAssign )
395 0 : SetColRowData( rRef, true );
396 : else
397 0 : AdjustColRowData( rRef, true );
398 0 : pBtnColHead->Enable();
399 0 : pBtnRowHead->Enable();
400 0 : pBtnAdd->Enable();
401 0 : pBtnRemove->Disable();
402 : }
403 0 : }
404 :
405 :
406 : /*************************************************************************
407 : #* Member: Close
408 : #*------------------------------------------------------------------------
409 : #*
410 : #* Klasse: ScColRowNameRangesDlg
411 : #*
412 : #* Funktion: Schliessen des Fensters
413 : #*
414 : #* Input: ---
415 : #*
416 : #* Output: ---
417 : #*
418 : #************************************************************************/
419 :
420 0 : bool ScColRowNameRangesDlg::Close()
421 : {
422 0 : return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() );
423 : }
424 :
425 :
426 : /*************************************************************************
427 : #* Member: SetActive
428 : #*------------------------------------------------------------------------
429 : #*
430 : #* Klasse: ScColRowNameRangesDlg
431 : #*
432 : #* Funktion: Aktivieren des Fensters
433 : #*
434 : #* Input: ---
435 : #*
436 : #* Output: ---
437 : #*
438 : #************************************************************************/
439 :
440 0 : void ScColRowNameRangesDlg::SetActive()
441 : {
442 0 : if ( bDlgLostFocus )
443 : {
444 0 : bDlgLostFocus = false;
445 0 : if( pEdActive )
446 0 : pEdActive->GrabFocus();
447 : }
448 : else
449 0 : GrabFocus();
450 :
451 0 : if( pEdActive == pEdAssign )
452 0 : Range1DataModifyHdl( 0 );
453 0 : else if( pEdActive == pEdAssign2 )
454 0 : Range2DataModifyHdl( 0 );
455 :
456 0 : RefInputDone();
457 0 : }
458 :
459 :
460 : /*************************************************************************
461 : #* Member: UpdateNames
462 : #*------------------------------------------------------------------------
463 : #*
464 : #* Klasse: ScColRowNameRangesDlg
465 : #*
466 : #* Funktion: Aktualisieren der Namen
467 : #*
468 : #* Input: ---
469 : #*
470 : #* Output: ---
471 : #*
472 : #************************************************************************/
473 :
474 0 : void ScColRowNameRangesDlg::UpdateNames()
475 : {
476 0 : pLbRange->SetUpdateMode( false );
477 :
478 0 : pLbRange->Clear();
479 0 : aRangeMap.clear();
480 0 : pEdAssign->SetText( EMPTY_OUSTRING );
481 :
482 : size_t nCount, j;
483 : sal_uInt16 nPos; //@008 Hilfsvariable q eingefuegt
484 :
485 : SCCOL nCol1;
486 : SCROW nRow1; //Erweiterung fuer Bereichsnamen
487 : SCTAB nTab1;
488 : SCCOL nCol2;
489 : SCROW nRow2;
490 : SCTAB nTab2;
491 0 : OUString rString;
492 0 : OUString strShow;
493 0 : const ScAddress::Details aDetails(pDoc->GetAddressConvention());
494 :
495 0 : OUString aString;
496 0 : OUString strDelim(" --- ");
497 0 : aString = strDelim;
498 0 : aString += ScGlobal::GetRscString( STR_COLUMN );
499 0 : aString += strDelim;
500 0 : nPos = pLbRange->InsertEntry( aString );
501 0 : pLbRange->SetEntryData( nPos, (void*)nEntryDataDelim );
502 0 : if ( (nCount = xColNameRanges->size()) > 0 )
503 : {
504 : boost::scoped_array<ScRangePair*> ppSortArray(xColNameRanges->CreateNameSortedArray(
505 0 : nCount, pDoc ));
506 0 : for ( j=0; j < nCount; j++ )
507 : {
508 0 : const ScRange aRange(ppSortArray[j]->GetRange(0));
509 0 : aString = aRange.Format(SCR_ABS_3D, pDoc, aDetails);
510 :
511 : //@008 Hole Bereichsparameter aus Dok
512 0 : ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
513 0 : nCol2, nRow2, nTab2 );
514 0 : SCCOL q=nCol1+3;
515 0 : if(q>nCol2) q=nCol2;
516 : //@008 Baue String zusammen
517 0 : strShow = " [";
518 0 : if(pDoc!=NULL)
519 : {
520 0 : rString = pDoc->GetString(nCol1, nRow1, nTab1);
521 0 : strShow += rString;
522 0 : for(SCCOL i=nCol1+1;i<=q;i++)
523 : {
524 0 : strShow += ", ";
525 0 : rString = pDoc->GetString(i, nRow1, nTab1);
526 0 : strShow += rString;
527 : }
528 : }
529 0 : if(q<nCol2) // Zu lang? Ergaenzen um ",..."
530 : {
531 0 : strShow += ", ...";
532 : }
533 0 : strShow += "]";
534 :
535 : //@008 String einfuegen in Listbox
536 0 : OUString aInsStr = aString;
537 0 : aInsStr += strShow;
538 0 : nPos = pLbRange->InsertEntry( aInsStr );
539 0 : aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
540 0 : pLbRange->SetEntryData( nPos, (void*)nEntryDataCol );
541 0 : }
542 : }
543 0 : aString = strDelim;
544 0 : aString += ScGlobal::GetRscString( STR_ROW );
545 0 : aString += strDelim;
546 0 : nPos = pLbRange->InsertEntry( aString );
547 0 : pLbRange->SetEntryData( nPos, (void*)nEntryDataDelim );
548 0 : if ( (nCount = xRowNameRanges->size()) > 0 )
549 : {
550 : boost::scoped_array<ScRangePair*> ppSortArray(xRowNameRanges->CreateNameSortedArray(
551 0 : nCount, pDoc ));
552 0 : for ( j=0; j < nCount; j++ )
553 : {
554 0 : const ScRange aRange(ppSortArray[j]->GetRange(0));
555 0 : aString = aRange.Format(SCR_ABS_3D, pDoc, aDetails);
556 :
557 : //@008 Ab hier baue String fuer Zeilen
558 0 : ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1,
559 0 : nCol2, nRow2, nTab2 );
560 0 : SCROW q=nRow1+3;
561 0 : if(q>nRow2) q=nRow2;
562 0 : strShow = " [";
563 0 : if(pDoc!=NULL)
564 : {
565 0 : rString = pDoc->GetString(nCol1, nRow1, nTab1);
566 0 : strShow += rString;
567 0 : for(SCROW i=nRow1+1;i<=q;i++)
568 : {
569 0 : strShow += ", ";
570 0 : rString = pDoc->GetString(nCol1, i, nTab1);
571 0 : strShow += rString;
572 : }
573 : }
574 0 : if(q<nRow2)
575 : {
576 0 : strShow += ", ...";
577 : }
578 0 : strShow += "]";
579 :
580 0 : OUString aInsStr = aString;
581 0 : aInsStr += strShow;
582 0 : nPos = pLbRange->InsertEntry( aInsStr );
583 0 : aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) );
584 0 : pLbRange->SetEntryData( nPos, (void*)nEntryDataRow );
585 0 : }
586 : }
587 :
588 0 : pLbRange->SetUpdateMode( true );
589 0 : pLbRange->Invalidate();
590 0 : }
591 :
592 :
593 : /*************************************************************************
594 : #* Member: UpdateRangeData
595 : #*------------------------------------------------------------------------
596 : #*
597 : #* Klasse: ScColRowNameRangesDlg
598 : #*
599 : #* Funktion: Aktualisieren der Bereichsdaten
600 : #*
601 : #* Input: Bereichs-String
602 : #* Flag fuer Spalten
603 : #*
604 : #* Output: ---
605 : #*
606 : #************************************************************************/
607 :
608 0 : void ScColRowNameRangesDlg::UpdateRangeData( const ScRange& rRange, bool bColName )
609 : {
610 0 : ScRangePair* pPair = NULL;
611 0 : sal_Bool bFound = false;
612 0 : if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
613 0 : bFound = sal_True;
614 0 : else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
615 0 : bFound = sal_True;
616 :
617 0 : if ( bFound )
618 : {
619 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
620 0 : theCurArea = rRange;
621 0 : OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, eConv));
622 0 : pEdAssign->SetText( aStr );
623 0 : pBtnAdd->Disable();
624 0 : pBtnRemove->Enable();
625 0 : pBtnColHead->Check( bColName );
626 0 : pBtnRowHead->Check( !bColName );
627 0 : theCurData = pPair->GetRange(1);
628 0 : aStr = theCurData.Format(SCR_ABS_3D, pDoc, eConv);
629 0 : pEdAssign2->SetText( aStr );
630 : }
631 : else
632 : {
633 0 : pBtnAdd->Enable();
634 0 : pBtnRemove->Disable();
635 : }
636 0 : pBtnColHead->Enable();
637 0 : pBtnRowHead->Enable();
638 0 : pEdAssign2->Enable();
639 0 : pRbAssign2->Enable();
640 0 : }
641 :
642 :
643 : /*************************************************************************
644 : #* Member: IsRefInputMode
645 : #*------------------------------------------------------------------------
646 : #*
647 : #* Klasse: ScColRowNameRangesDlg
648 : #*
649 : #* Funktion: Abfragefunktion fuer Referenz- Input- Mode.
650 : #*
651 : #* Input: Bereichs-String
652 : #* Flag fuer Spalten
653 : #*
654 : #* Output: true, wenn Referenz- Input- Mode
655 : #*
656 : #************************************************************************/
657 :
658 0 : bool ScColRowNameRangesDlg::IsRefInputMode() const
659 : {
660 0 : return (pEdActive != NULL);
661 : }
662 :
663 :
664 : // Handler:
665 :
666 :
667 : /*************************************************************************
668 : #* Handler: OkBtnHdl
669 : #*------------------------------------------------------------------------
670 : #*
671 : #* Klasse: ScColRowNameRangesDlg
672 : #*
673 : #* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde.
674 : #* Hinzufuegen- Button ausloesen, und die neu einge-
675 : #* stellten Bereiche ans Dokument uebergeben.
676 : #* Fensterschliessen- Anweisung ausloesen.
677 : #* Input: ---
678 : #*
679 : #* Output: ---
680 : #*
681 : #************************************************************************/
682 :
683 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, OkBtnHdl)
684 : {
685 0 : AddBtnHdl( 0 );
686 :
687 : // die RangeLists den Refs am Doc zuweisen
688 0 : pDoc->GetColNameRangesRef() = xColNameRanges;
689 0 : pDoc->GetRowNameRangesRef() = xRowNameRanges;
690 : // geaenderte Datenbereiche muessen sich auswirken
691 0 : pDoc->CompileColRowNameFormula();
692 0 : ScDocShell* pDocShell = pViewData->GetDocShell();
693 0 : pDocShell->PostPaint(ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB), PAINT_GRID);
694 0 : pDocShell->SetDocumentModified();
695 :
696 0 : Close();
697 0 : return 0;
698 : }
699 :
700 :
701 : /*************************************************************************
702 : #* Handler: CancelBtnHdl
703 : #*------------------------------------------------------------------------
704 : #*
705 : #* Klasse: ScColRowNameRangesDlg
706 : #*
707 : #* Funktion: Fensterschliessen- Anweisung ausloesen.
708 : #*
709 : #* Input: ---
710 : #*
711 : #* Output: ---
712 : #*
713 : #************************************************************************/
714 :
715 0 : IMPL_LINK_NOARG_INLINE_START(ScColRowNameRangesDlg, CancelBtnHdl)
716 : {
717 0 : Close();
718 0 : return 0;
719 : }
720 0 : IMPL_LINK_NOARG_INLINE_END(ScColRowNameRangesDlg, CancelBtnHdl)
721 :
722 :
723 : /*************************************************************************
724 : #* Handler: AddBtnHdl
725 : #*------------------------------------------------------------------------
726 : #*
727 : #* Klasse: ScColRowNameRangesDlg
728 : #*
729 : #* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden
730 : #* die Bereichsangaben eingestellt und in der
731 : #* Listbox dargestellt.
732 : #*
733 : #* Input: ---
734 : #*
735 : #* Output: ---
736 : #*
737 : #************************************************************************/
738 :
739 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, AddBtnHdl)
740 : {
741 0 : OUString aNewArea( pEdAssign->GetText() );
742 0 : OUString aNewData( pEdAssign2->GetText() );
743 :
744 0 : if ( !aNewArea.isEmpty() && !aNewData.isEmpty() )
745 : {
746 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
747 0 : ScRange aRange1, aRange2;
748 : sal_Bool bOk1;
749 0 : if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID))
750 0 : && ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) )
751 : {
752 0 : theCurArea = aRange1;
753 0 : AdjustColRowData( aRange2 );
754 : ScRangePair* pPair;
755 0 : if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL )
756 : {
757 0 : xColNameRanges->Remove( pPair );
758 0 : delete pPair;
759 : }
760 0 : if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL )
761 : {
762 0 : xRowNameRanges->Remove( pPair );
763 0 : delete pPair;
764 : }
765 0 : if ( pBtnColHead->IsChecked() )
766 0 : xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
767 : else
768 0 : xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) );
769 :
770 0 : UpdateNames();
771 :
772 0 : pEdAssign->GrabFocus();
773 0 : pBtnAdd->Disable();
774 0 : pBtnRemove->Disable();
775 0 : pEdAssign->SetText( EMPTY_OUSTRING );
776 0 : pBtnColHead->Check( true );
777 0 : pBtnRowHead->Check( false );
778 0 : pEdAssign2->SetText( EMPTY_OUSTRING );
779 0 : theCurArea = ScRange();
780 0 : theCurData = theCurArea;
781 0 : Range1SelectHdl( 0 );
782 : }
783 : else
784 : {
785 0 : ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) );
786 0 : if ( !bOk1 )
787 0 : pEdAssign->GrabFocus();
788 : else
789 0 : pEdAssign2->GrabFocus();
790 : }
791 : }
792 0 : return 0;
793 : }
794 :
795 :
796 : /*************************************************************************
797 : #* Handler: RemoveBtnHdl
798 : #*------------------------------------------------------------------------
799 : #*
800 : #* Klasse: ScColRowNameRangesDlg
801 : #*
802 : #* Funktion: Nach betaetigen des Loeschen- Buttons, wird
803 : #* die markierte Bereichsangabe geloescht.
804 : #*
805 : #* Input: ---
806 : #*
807 : #* Output: ---
808 : #*
809 : #************************************************************************/
810 :
811 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, RemoveBtnHdl)
812 : {
813 0 : OUString aRangeStr = pLbRange->GetSelectEntry();
814 0 : sal_uInt16 nSelectPos = pLbRange->GetSelectEntryPos();
815 : sal_Bool bColName =
816 0 : ((sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataCol);
817 0 : NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
818 0 : if (itr == aRangeMap.end())
819 0 : return 0;
820 0 : const ScRange& rRange = itr->second;
821 :
822 0 : ScRangePair* pPair = NULL;
823 0 : sal_Bool bFound = false;
824 0 : if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL )
825 0 : bFound = sal_True;
826 0 : else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL )
827 0 : bFound = sal_True;
828 0 : if ( bFound )
829 : {
830 0 : OUString aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
831 0 : OUString aMsg = aStrDelMsg.getToken( 0, '#' );
832 :
833 0 : aMsg += aRangeStr;
834 0 : aMsg += aStrDelMsg.getToken( 1, '#' );
835 :
836 0 : if ( RET_YES == QUERYBOX(aMsg) )
837 : {
838 0 : if ( bColName )
839 0 : xColNameRanges->Remove( pPair );
840 : else
841 0 : xRowNameRanges->Remove( pPair );
842 0 : delete pPair;
843 :
844 0 : UpdateNames();
845 0 : sal_uInt16 nCnt = pLbRange->GetEntryCount();
846 0 : if ( nSelectPos >= nCnt )
847 : {
848 0 : if ( nCnt )
849 0 : nSelectPos = nCnt - 1;
850 : else
851 0 : nSelectPos = 0;
852 : }
853 0 : pLbRange->SelectEntryPos( nSelectPos );
854 0 : if ( nSelectPos &&
855 0 : (sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataDelim )
856 0 : pLbRange->SelectEntryPos( --nSelectPos ); // ---Zeile---
857 :
858 0 : pLbRange->GrabFocus();
859 0 : pBtnAdd->Disable();
860 0 : pBtnRemove->Disable();
861 0 : pEdAssign->SetText( EMPTY_OUSTRING );
862 0 : theCurArea = theCurData = ScRange();
863 0 : pBtnColHead->Check( true );
864 0 : pBtnRowHead->Check( false );
865 0 : pEdAssign2->SetText( EMPTY_OUSTRING );
866 0 : Range1SelectHdl( 0 );
867 0 : }
868 : }
869 0 : return 0;
870 : }
871 :
872 :
873 : /*************************************************************************
874 : #* Handler: Range1SelectHdl
875 : #*------------------------------------------------------------------------
876 : #*
877 : #* Klasse: ScColRowNameRangesDlg
878 : #*
879 : #* Funktion: Wenn Zeile in Listbox ausgewaehlt wird,
880 : #* werden die Eingabefelder entsprechend
881 : #* eingestellt.
882 : #*
883 : #* Input: ---
884 : #*
885 : #* Output: ---
886 : #*
887 : #************************************************************************/
888 :
889 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range1SelectHdl)
890 : {
891 0 : sal_uInt16 nSelectPos = pLbRange->GetSelectEntryPos();
892 0 : sal_uInt16 nCnt = pLbRange->GetEntryCount();
893 0 : sal_uInt16 nMoves = 0;
894 0 : while ( nSelectPos < nCnt
895 0 : && (sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataDelim )
896 : { // skip Delimiter
897 0 : ++nMoves;
898 0 : pLbRange->SelectEntryPos( ++nSelectPos );
899 : }
900 0 : OUString aRangeStr = pLbRange->GetSelectEntry();
901 0 : if ( nMoves )
902 : {
903 0 : if ( nSelectPos > 1 && nSelectPos >= nCnt )
904 : { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben
905 : // wenn davor Eintraege existieren
906 0 : nSelectPos = nCnt - 2;
907 0 : pLbRange->SelectEntryPos( nSelectPos );
908 0 : aRangeStr = pLbRange->GetSelectEntry();
909 : }
910 0 : else if ( nSelectPos > 2 && nSelectPos < nCnt && !aRangeStr.isEmpty()
911 0 : && aRangeStr == pEdAssign->GetText() )
912 : { // nach oben wandern statt nach unten auf die vorherige Position
913 0 : nSelectPos -= 2;
914 0 : pLbRange->SelectEntryPos( nSelectPos );
915 0 : aRangeStr = pLbRange->GetSelectEntry();
916 : }
917 : }
918 0 : NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr);
919 0 : if ( itr != aRangeMap.end() )
920 : {
921 : sal_Bool bColName =
922 0 : ((sal_uLong)pLbRange->GetEntryData( nSelectPos ) == nEntryDataCol);
923 0 : UpdateRangeData( itr->second, bColName );
924 0 : pBtnAdd->Disable();
925 0 : pBtnRemove->Enable();
926 : }
927 : else
928 : {
929 0 : if ( !pEdAssign->GetText().isEmpty() )
930 : {
931 0 : if ( !pEdAssign2->GetText().isEmpty() )
932 0 : pBtnAdd->Enable();
933 : else
934 0 : pBtnAdd->Disable();
935 0 : pBtnColHead->Enable();
936 0 : pBtnRowHead->Enable();
937 0 : pEdAssign2->Enable();
938 0 : pRbAssign2->Enable();
939 : }
940 : else
941 : {
942 0 : pBtnAdd->Disable();
943 0 : pBtnColHead->Disable();
944 0 : pBtnRowHead->Disable();
945 0 : pEdAssign2->Disable();
946 0 : pRbAssign2->Disable();
947 : }
948 0 : pBtnRemove->Disable();
949 0 : pEdAssign->GrabFocus();
950 : }
951 :
952 0 : pEdAssign->Enable();
953 0 : pRbAssign->Enable();
954 :
955 0 : return 0;
956 : }
957 :
958 :
959 : /*************************************************************************
960 : #* Handler: Range1DataModifyHdl
961 : #*------------------------------------------------------------------------
962 : #*
963 : #* Klasse: ScColRowNameRangesDlg
964 : #*
965 : #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label-
966 : #* Bereich geaendert wurde.
967 : #*
968 : #* Input: ---
969 : #*
970 : #* Output: ---
971 : #*
972 : #************************************************************************/
973 :
974 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range1DataModifyHdl)
975 : {
976 0 : OUString aNewArea( pEdAssign->GetText() );
977 0 : sal_Bool bValid = false;
978 0 : if (!aNewArea.isEmpty() && pDoc)
979 : {
980 0 : ScRange aRange;
981 0 : if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
982 : {
983 0 : SetColRowData( aRange );
984 0 : bValid = sal_True;
985 : }
986 : }
987 0 : if ( bValid )
988 : {
989 0 : pBtnAdd->Enable();
990 0 : pBtnColHead->Enable();
991 0 : pBtnRowHead->Enable();
992 0 : pEdAssign2->Enable();
993 0 : pRbAssign2->Enable();
994 : }
995 : else
996 : {
997 0 : pBtnAdd->Disable();
998 0 : pBtnColHead->Disable();
999 0 : pBtnRowHead->Disable();
1000 0 : pEdAssign2->Disable();
1001 0 : pRbAssign2->Disable();
1002 : }
1003 0 : pBtnRemove->Disable();
1004 0 : return 0;
1005 : }
1006 :
1007 :
1008 : /*************************************************************************
1009 : #* Handler: Range2DataModifyHdl
1010 : #*------------------------------------------------------------------------
1011 : #*
1012 : #* Klasse: ScColRowNameRangesDlg
1013 : #*
1014 : #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten-
1015 : #* Bereich geaendert wurde
1016 : #*
1017 : #* Input: ---
1018 : #*
1019 : #* Output: ---
1020 : #*
1021 : #************************************************************************/
1022 :
1023 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, Range2DataModifyHdl)
1024 : {
1025 0 : OUString aNewData( pEdAssign2->GetText() );
1026 0 : if ( !aNewData.isEmpty() )
1027 : {
1028 0 : ScRange aRange;
1029 0 : if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID )
1030 : {
1031 0 : AdjustColRowData( aRange );
1032 0 : pBtnAdd->Enable();
1033 : }
1034 : else
1035 0 : pBtnAdd->Disable();
1036 : }
1037 : else
1038 : {
1039 0 : pBtnAdd->Disable();
1040 : }
1041 0 : return 0;
1042 : }
1043 :
1044 :
1045 : /*************************************************************************
1046 : #* Handler: ColClickHdl
1047 : #*------------------------------------------------------------------------
1048 : #*
1049 : #* Klasse: ScColRowNameRangesDlg
1050 : #*
1051 : #* Funktion: Radiobutton fuer Spalten wurde betaetigt,
1052 : #* die entsprechenden Einstellungen werden
1053 : #* vorgenommen
1054 : #*
1055 : #* Input: ---
1056 : #*
1057 : #* Output: ---
1058 : #*
1059 : #************************************************************************/
1060 :
1061 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, ColClickHdl)
1062 : {
1063 0 : if ( !pBtnColHead->GetSavedValue() )
1064 : {
1065 0 : pBtnColHead->Check( true );
1066 0 : pBtnRowHead->Check( false );
1067 0 : if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW )
1068 : {
1069 0 : theCurArea.aEnd.SetRow( MAXROW - 1 );
1070 0 : OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
1071 0 : pEdAssign->SetText( aStr );
1072 : }
1073 0 : ScRange aRange( theCurData );
1074 0 : aRange.aStart.SetRow( std::min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) );
1075 0 : aRange.aEnd.SetRow( MAXROW );
1076 0 : AdjustColRowData( aRange );
1077 : }
1078 0 : return 0;
1079 : }
1080 :
1081 :
1082 : /*************************************************************************
1083 : #* Handler: RowClickHdl
1084 : #*------------------------------------------------------------------------
1085 : #*
1086 : #* Klasse: ScColRowNameRangesDlg
1087 : #*
1088 : #* Funktion: Radiobutton fuer Zeilen wurde betaetigt,
1089 : #* die entsprechenden Einstellungen werden
1090 : #* vorgenommen
1091 : #*
1092 : #* Input: ---
1093 : #*
1094 : #* Output: ---
1095 : #*
1096 : #************************************************************************/
1097 :
1098 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, RowClickHdl)
1099 : {
1100 0 : if ( !pBtnRowHead->GetSavedValue() )
1101 : {
1102 0 : pBtnRowHead->Check( true );
1103 0 : pBtnColHead->Check( false );
1104 0 : if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL )
1105 : {
1106 0 : theCurArea.aEnd.SetCol( MAXCOL - 1 );
1107 0 : OUString aStr(theCurArea.Format(SCR_ABS_3D, pDoc, pDoc->GetAddressConvention()));
1108 0 : pEdAssign->SetText( aStr );
1109 : }
1110 0 : ScRange aRange( theCurData );
1111 0 : aRange.aStart.SetCol( static_cast<SCCOL>(std::min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) );
1112 0 : aRange.aEnd.SetCol( MAXCOL );
1113 0 : AdjustColRowData( aRange );
1114 : }
1115 0 : return 0;
1116 : }
1117 :
1118 :
1119 0 : IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl )
1120 : {
1121 0 : if( (pCtrl == (Control*)pEdAssign) || (pCtrl == (Control*)pRbAssign) )
1122 0 : pEdActive = pEdAssign;
1123 0 : else if( (pCtrl == (Control*)pEdAssign2) || (pCtrl == (Control*)pRbAssign2) )
1124 0 : pEdActive = pEdAssign2;
1125 : else
1126 0 : pEdActive = NULL;
1127 :
1128 0 : if( pEdActive )
1129 0 : pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
1130 :
1131 0 : return 0;
1132 : }
1133 :
1134 :
1135 0 : IMPL_LINK_NOARG(ScColRowNameRangesDlg, LoseFocusHdl)
1136 : {
1137 0 : bDlgLostFocus = !IsActive();
1138 0 : return 0;
1139 0 : }
1140 :
1141 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|