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