xref: /trunk/main/sc/source/ui/optdlg/tpusrlst.cxx (revision 24297db34623acd4ed3cd634e301c7c8a91fabbc)
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_scui.hxx"
26 
27 
28 
29 
30 //------------------------------------------------------------------
31 
32 #include <vcl/msgbox.hxx>
33 
34 #include "global.hxx"
35 #include "document.hxx"
36 #include "tabvwsh.hxx"
37 #include "viewdata.hxx"
38 #include "uiitems.hxx"
39 #include "userlist.hxx"
40 #include "rangeutl.hxx"
41 #include "crdlg.hxx"
42 #include "scresid.hxx"
43 #include "sc.hrc"       // -> Slot-IDs
44 #include "optdlg.hrc"
45 #include "globstr.hrc"
46 
47 #define _TPUSRLST_CXX
48 #include "tpusrlst.hxx"
49 #undef _TPUSRLST_CXX
50 
51 //CHINA001 #include "scui_def.hxx" //CHINA001
52 //CHINA001 #include "scresid.hxx" //add by CHINA001
53 //CHINA001 #include "miscdlgs.hrc"  //add by CHINA001
54 //CHINA001
55 //CHINA001 #include "scabstdlg.hxx" //CHINA001
56 // STATIC DATA -----------------------------------------------------------
57 
58 #define CR  (sal_Unicode)13
59 #define LF  (sal_Unicode)10
60 
61 static sal_uInt16 pUserListsRanges[] =
62 {
63     SID_SCUSERLISTS,
64     SID_SCUSERLISTS,
65     0
66 };
67 
68 static const sal_Unicode cDelimiter = ',';
69 
70 
71 //========================================================================
72 // Benutzerdefinierte Listen:
73 
74 
75 ScTpUserLists::ScTpUserLists( Window*               pParent,
76                               const SfxItemSet&     rCoreAttrs )
77 
78     :   SfxTabPage      ( pParent,
79                           ScResId( RID_SCPAGE_USERLISTS ),
80                           rCoreAttrs ),
81         aFtLists        ( this, ScResId( FT_LISTS ) ),
82         aLbLists        ( this, ScResId( LB_LISTS ) ),
83         aFtEntries      ( this, ScResId( FT_ENTRIES ) ),
84         aEdEntries      ( this, ScResId( ED_ENTRIES ) ),
85         aFtCopyFrom     ( this, ScResId( FT_COPYFROM ) ),
86         aEdCopyFrom     ( this, ScResId( ED_COPYFROM ) ),
87         aBtnNew         ( this, ScResId( BTN_NEW ) ),
88         aBtnAdd         ( this, ScResId( BTN_ADD ) ),
89         aBtnRemove      ( this, ScResId( BTN_REMOVE ) ),
90         aBtnCopy        ( this, ScResId( BTN_COPY ) ),
91         aStrQueryRemove ( ScResId( STR_QUERYREMOVE ) ),
92         aStrNew         ( aBtnNew.GetText() ),
93         aStrCancel      ( ScResId( STR_DISMISS ) ),
94         aStrAdd         ( ScResId( SCSTR_ADD ) ),
95         aStrModify      ( ScResId( SCSTR_MODIFY ) ),
96         aStrCopyList    ( ScResId( STR_COPYLIST ) ),
97         aStrCopyFrom    ( ScResId( STR_COPYFROM ) ),
98         aStrCopyErr     ( ScResId( STR_COPYERR ) ),
99         //
100         nWhichUserLists ( GetWhich( SID_SCUSERLISTS ) ),
101         pUserLists      ( NULL ),
102         pDoc            ( NULL ),
103         pViewData       ( NULL ),
104         pRangeUtil      ( new ScRangeUtil ),
105         bModifyMode     ( sal_False ),
106         bCancelMode     ( sal_False ),
107         bCopyDone       ( sal_False ),
108         nCancelPos      ( 0 )
109 {
110     SetExchangeSupport();
111     Init();
112     FreeResource();
113 }
114 
115 // -----------------------------------------------------------------------
116 
117 __EXPORT ScTpUserLists::~ScTpUserLists()
118 {
119     delete pUserLists;
120     delete pRangeUtil;
121 }
122 
123 // -----------------------------------------------------------------------
124 
125 void ScTpUserLists::Init()
126 {
127     SfxViewShell*   pSh = SfxViewShell::Current();
128     ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell, pSh);
129 
130     aLbLists.SetSelectHdl   ( LINK( this, ScTpUserLists, LbSelectHdl ) );
131     aBtnNew.SetClickHdl     ( LINK( this, ScTpUserLists, BtnClickHdl ) );
132     aBtnNew.SetClickHdl     ( LINK( this, ScTpUserLists, BtnClickHdl ) );
133     aBtnAdd.SetClickHdl     ( LINK( this, ScTpUserLists, BtnClickHdl ) );
134     aBtnRemove.SetClickHdl  ( LINK( this, ScTpUserLists, BtnClickHdl ) );
135     aEdEntries.SetModifyHdl ( LINK( this, ScTpUserLists, EdEntriesModHdl ) );
136 
137 
138     if ( pViewSh )
139     {
140         SCTAB   nStartTab   = 0;
141         SCTAB   nEndTab     = 0;
142         SCCOL   nStartCol   = 0;
143         SCROW   nStartRow   = 0;
144         SCCOL   nEndCol     = 0;
145         SCROW   nEndRow     = 0;
146 
147         pViewData = pViewSh->GetViewData();
148         pDoc = pViewData->GetDocument();
149 
150         pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
151                                   nEndCol,   nEndRow,  nEndTab );
152 
153         PutInOrder( nStartCol, nEndCol );
154         PutInOrder( nStartRow, nEndRow );
155         PutInOrder( nStartTab, nEndTab );
156 
157         ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab
158                 ).Format( aStrSelectedArea, SCR_ABS_3D, pDoc );
159 
160         aBtnCopy.SetClickHdl ( LINK( this, ScTpUserLists, BtnClickHdl ) );
161         aBtnCopy.Enable();
162     }
163     else
164     {
165         aBtnCopy.Disable();
166         aFtCopyFrom.Disable();
167         aEdCopyFrom.Disable();
168     }
169 
170 //  aLbLists.GrabFocus();
171 }
172 
173 // -----------------------------------------------------------------------
174 
175 sal_uInt16* __EXPORT ScTpUserLists::GetRanges()
176 {
177     return pUserListsRanges;
178 }
179 
180 // -----------------------------------------------------------------------
181 
182 SfxTabPage* __EXPORT ScTpUserLists::Create( Window* pParent, const SfxItemSet& rAttrSet )
183 {
184     return ( new ScTpUserLists( pParent, rAttrSet ) );
185 }
186 
187 // -----------------------------------------------------------------------
188 
189 void __EXPORT ScTpUserLists::Reset( const SfxItemSet& rCoreAttrs )
190 {
191     const ScUserListItem& rUserListItem = (const ScUserListItem&)
192                                            rCoreAttrs.Get( nWhichUserLists );
193     const ScUserList*     pCoreList     = rUserListItem.GetUserList();
194 
195     DBG_ASSERT( pCoreList, "UserList not found :-/" );
196 
197     if ( pCoreList )
198     {
199         if ( !pUserLists )
200             pUserLists = new ScUserList( *pCoreList );
201         else
202             *pUserLists = *pCoreList;
203 
204         if ( UpdateUserListBox() > 0 )
205         {
206             aLbLists.SelectEntryPos( 0 );
207             UpdateEntries( 0 );
208         }
209     }
210     else if ( !pUserLists )
211         pUserLists = new ScUserList;
212 
213     aEdCopyFrom.SetText( aStrSelectedArea );
214 
215     if ( aLbLists.GetEntryCount() == 0 )
216     {
217         aFtLists    .Disable();
218         aLbLists    .Disable();
219         aFtEntries  .Disable();
220         aEdEntries  .Disable();
221         aBtnRemove  .Disable();
222     }
223 
224     aBtnNew.SetText( aStrNew );
225     aBtnAdd.SetText( aStrAdd );
226     aBtnAdd.Disable();
227 
228     if ( !bCopyDone && pViewData )
229     {
230         aFtCopyFrom .Enable();
231         aEdCopyFrom .Enable();
232         aBtnCopy    .Enable();
233     }
234 
235 //  aLbLists.GrabFocus();
236 }
237 
238 // -----------------------------------------------------------------------
239 
240 sal_Bool __EXPORT ScTpUserLists::FillItemSet( SfxItemSet& rCoreAttrs )
241 {
242     // Modifikationen noch nicht uebernommen?
243     // -> Click auf Add-Button simulieren
244 
245     if ( bModifyMode || bCancelMode )
246         BtnClickHdl( &aBtnAdd );
247 
248     const ScUserListItem& rUserListItem = (const ScUserListItem&)
249                                            GetItemSet().Get( nWhichUserLists );
250 
251     ScUserList* pCoreList       = rUserListItem.GetUserList();
252     sal_Bool        bDataModified   = sal_False;
253 
254     if ( (pUserLists == NULL) && (pCoreList == NULL) )
255     {
256         bDataModified = sal_False;
257     }
258     else if ( pUserLists != NULL )
259     {
260         if ( pCoreList != NULL )
261             bDataModified = (*pUserLists != *pCoreList);
262         else
263             bDataModified = sal_True;
264     }
265 
266     if ( bDataModified )
267     {
268         ScUserListItem aULItem( nWhichUserLists );
269 
270         if ( pUserLists )
271             aULItem.SetUserList( *pUserLists );
272 
273         rCoreAttrs.Put( aULItem );
274     }
275 
276     return bDataModified;
277 }
278 
279 // -----------------------------------------------------------------------
280 
281 int __EXPORT ScTpUserLists::DeactivatePage( SfxItemSet* pSetP )
282 {
283     if ( pSetP )
284         FillItemSet( *pSetP );
285 
286     return LEAVE_PAGE;
287 }
288 
289 // -----------------------------------------------------------------------
290 
291 sal_uInt16 ScTpUserLists::UpdateUserListBox()
292 {
293     aLbLists.Clear();
294 
295     if ( !pUserLists ) return 0;
296 
297     //----------------------------------------------------------
298 
299     sal_uInt16  nCount = pUserLists->GetCount();
300     String  aEntry;
301 
302     if ( nCount > 0 )
303     {
304         for ( sal_uInt16 i=0; i<nCount; i++ )
305         {
306             aEntry = (*pUserLists)[i]->GetString();
307             DBG_ASSERT( aEntry.Len() > 0, "Empty UserList-entry :-/" );
308             aLbLists.InsertEntry( aEntry );
309         }
310     }
311 
312     return nCount;
313 }
314 
315 // -----------------------------------------------------------------------
316 
317 void ScTpUserLists::UpdateEntries( sal_uInt16 nList )
318 {
319     if ( !pUserLists ) return;
320 
321     //----------------------------------------------------------
322 
323     if ( nList < pUserLists->GetCount() )
324     {
325         ScUserListData* pList     = (*pUserLists)[nList];
326         sal_uInt16          nSubCount = pList->GetSubCount();
327         String          aEntryListStr;
328 
329         for ( sal_uInt16 i=0; i<nSubCount; i++ )
330         {
331             if ( i!=0 )
332                 aEntryListStr += CR;
333             aEntryListStr += pList->GetSubStr( i );
334         }
335 
336         aEntryListStr.ConvertLineEnd();
337         aEdEntries.SetText( aEntryListStr );
338     }
339     else
340     {
341         DBG_ERROR( "Invalid ListIndex :-/" );
342     }
343 }
344 
345 // -----------------------------------------------------------------------
346 
347 void ScTpUserLists::MakeListStr( String& rListStr )
348 {
349     String  aInputStr(rListStr);
350     String  aStr;
351 
352     xub_StrLen  nLen    = aStr.Len();
353     xub_StrLen  c       = 0;
354 
355     aInputStr.ConvertLineEnd( LINEEND_LF );
356     //aStr.EraseAllChars( ' ' );
357 
358     xub_StrLen nToken=rListStr.GetTokenCount(LF);
359 
360     for(xub_StrLen i=0;i<nToken;i++)
361     {
362         String aString=rListStr.GetToken(i,LF);
363         aString.EraseLeadingChars(' ');
364         aString.EraseTrailingChars(' ');
365         aStr+=aString;
366         aStr+=cDelimiter;
367     }
368 
369     /*
370     // '\n' durch cDelimiter ersetzen:
371     for ( c=0;
372           (c < nLen) && (nFound != STRING_NOTFOUND);
373           c++ )
374     {
375         nFound = aStr.Search( LF, nFound );
376         if ( nFound != STRING_NOTFOUND )
377             aStr[nFound] = cDelimiter;
378     }
379     */
380 
381     aStr.EraseLeadingChars( cDelimiter );
382     aStr.EraseTrailingChars( cDelimiter );
383     nLen = aStr.Len();
384 
385     rListStr.Erase();
386 
387     // Alle Doppelten cDelimiter entfernen:
388     c=0;
389     while ( c < nLen )
390     {
391         rListStr += aStr.GetChar(c);
392         c++;
393 
394         if ( aStr.GetChar(c) == cDelimiter )
395         {
396             rListStr += aStr.GetChar(c);
397 
398             while ( (aStr.GetChar(c) == cDelimiter) && (c < nLen) )
399                 c++;
400         }
401     }
402 
403 }
404 
405 // -----------------------------------------------------------------------
406 
407 void ScTpUserLists::AddNewList( const String& rEntriesStr )
408 {
409     String theEntriesStr( rEntriesStr );
410 
411     if ( !pUserLists )
412         pUserLists = new ScUserList;
413 
414     MakeListStr( theEntriesStr );
415 
416     if ( !pUserLists->Insert( new ScUserListData( theEntriesStr ) ) )
417     {
418         DBG_ERROR( "Entry could not be inserted :-/" );
419     }
420 }
421 
422 // -----------------------------------------------------------------------
423 
424 void ScTpUserLists::CopyListFromArea( const ScRefAddress& rStartPos,
425                                       const ScRefAddress& rEndPos )
426 {
427     if ( bCopyDone ) return;
428 
429     //----------------------------------------------------------
430 
431     SCTAB   nTab            = rStartPos.Tab();
432     SCCOL   nStartCol       = rStartPos.Col();
433     SCROW   nStartRow       = rStartPos.Row();
434     SCCOL   nEndCol         = rEndPos.Col();
435     SCROW   nEndRow         = rEndPos.Row();
436     sal_uInt16  nCellDir        = SCRET_COLS;
437     sal_Bool    bValueIgnored   = sal_False;
438 
439     if ( (nStartCol != nEndCol) && (nStartRow != nEndRow) )
440     {
441         nCellDir = ScColOrRowDlg( this, aStrCopyList, aStrCopyFrom ).Execute();
442 //CHINA001      ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
443 //CHINA001      DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
444 //CHINA001
445 //CHINA001      VclAbstractDialog* pDlg = pFact->CreateScColOrRowDlg( this, aStrCopyList, aStrCopyFrom,ResId(RID_SCDLG_COLORROW) );
446 //CHINA001      DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
447 //CHINA001      nCellDir = pDlg->Execute();
448 //CHINA001      delete pDlg; //CHINA001
449     }
450     else if ( nStartCol != nEndCol )
451         nCellDir = SCRET_ROWS;
452     else
453         nCellDir = SCRET_COLS;
454 
455     if ( nCellDir != RET_CANCEL )
456     {
457         String  aStrList;
458         String  aStrField;
459 
460         if ( nCellDir == SCRET_COLS )
461         {
462             for ( SCCOL col=nStartCol; col<=nEndCol; col++ )
463             {
464                 for ( SCROW row=nStartRow; row<=nEndRow; row++ )
465                 {
466                     if ( pDoc->HasStringData( col, row, nTab ) )
467                     {
468                         pDoc->GetString( col, row, nTab, aStrField );
469 
470                         if ( aStrField.Len() > 0 )
471                         {
472                             aStrList += aStrField;
473                             aStrList += '\n';
474                         }
475                     }
476                     else
477                         bValueIgnored = sal_True;
478                 }
479                 if ( aStrList.Len() > 0 )
480                     AddNewList( aStrList );
481                 aStrList.Erase();
482             }
483         }
484         else
485         {
486             for ( SCROW row=nStartRow; row<=nEndRow; row++ )
487             {
488                 for ( SCCOL col=nStartCol; col<=nEndCol; col++ )
489                 {
490                     if ( pDoc->HasStringData( col, row, nTab ) )
491                     {
492                         pDoc->GetString( col, row, nTab, aStrField );
493 
494                         if ( aStrField.Len() > 0 )
495                         {
496                             aStrList += aStrField;
497                             aStrList += '\n';
498                         }
499                     }
500                     else
501                         bValueIgnored = sal_True;
502                 }
503                 if ( aStrList.Len() > 0 )
504                     AddNewList( aStrList );
505                 aStrList.Erase();
506             }
507         }
508 
509         if ( bValueIgnored )
510         {
511             InfoBox( this, aStrCopyErr ).Execute();
512         }
513     }
514 
515     //----------------------------------------------------------
516 
517     bCopyDone = sal_True;
518 
519 }
520 
521 // -----------------------------------------------------------------------
522 
523 void ScTpUserLists::ModifyList( sal_uInt16          nSelList,
524                                 const String&   rEntriesStr )
525 {
526     if ( !pUserLists ) return;
527 
528     //----------------------------------------------------------
529 
530     String theEntriesStr( rEntriesStr );
531 
532     MakeListStr( theEntriesStr );
533 
534     (*pUserLists)[nSelList]->SetString( theEntriesStr );
535 }
536 
537 // -----------------------------------------------------------------------
538 
539 void ScTpUserLists::RemoveList( sal_uInt16 nList )
540 {
541     if ( pUserLists ) pUserLists->AtFree( nList );
542 }
543 
544 //-----------------------------------------------------------------------
545 // Handler:
546 //---------
547 
548 IMPL_LINK( ScTpUserLists, LbSelectHdl, ListBox*, pLb )
549 {
550     if ( pLb == &aLbLists )
551     {
552         sal_uInt16 nSelPos = aLbLists.GetSelectEntryPos();
553         if ( nSelPos != LISTBOX_ENTRY_NOTFOUND )
554         {
555             if ( !aFtEntries.IsEnabled() )  aFtEntries.Enable();
556             if ( !aEdEntries.IsEnabled() )  aEdEntries.Enable();
557             if ( !aBtnRemove.IsEnabled() )  aBtnRemove.Enable();
558             if (  aBtnAdd.IsEnabled() )     aBtnAdd.Disable();
559 
560             UpdateEntries( nSelPos );
561         }
562     }
563 
564     return 0;
565 }
566 
567 // -----------------------------------------------------------------------
568 
569 IMPL_LINK( ScTpUserLists, BtnClickHdl, PushButton*, pBtn )
570 {
571     if ( pBtn == &aBtnNew )
572     {
573         if ( !bCancelMode )
574         {
575             nCancelPos = ( aLbLists.GetEntryCount() > 0 )
576                             ? aLbLists.GetSelectEntryPos()
577                             : 0;
578             aLbLists.SetNoSelection();
579             aFtLists.Disable();
580             aLbLists.Disable();
581             aFtEntries.Enable();
582             aEdEntries.Enable();
583             aEdEntries.SetText( EMPTY_STRING );
584             aEdEntries.GrabFocus();
585             aBtnAdd.Disable();
586             aBtnRemove.Disable();
587             //-----------------------------
588             if ( aBtnCopy.IsEnabled() )
589             {
590                 aBtnCopy.Disable();
591                 aFtCopyFrom.Disable();
592                 aEdCopyFrom.Disable();
593             }
594             aBtnNew.SetText( aStrCancel );
595             bCancelMode = sal_True;
596         }
597         else // if ( bCancelMode )
598         {
599             if ( aLbLists.GetEntryCount() > 0 )
600             {
601                 aLbLists.SelectEntryPos( nCancelPos );
602                 LbSelectHdl( &aLbLists );
603                 aFtLists.Enable();
604                 aLbLists.Enable();
605             }
606             else
607             {
608                 aFtEntries.Disable();
609                 aEdEntries.Disable();
610                 aEdEntries.SetText( EMPTY_STRING );
611                 aBtnRemove.Disable();
612             }
613             aBtnAdd.Disable();
614             //-----------------------------
615             if ( pViewData && !bCopyDone )
616             {
617                 aBtnCopy.Enable();
618                 aFtCopyFrom.Enable();
619                 aEdCopyFrom.Enable();
620             }
621             aBtnNew.SetText( aStrNew );
622             bCancelMode = sal_False;
623             bModifyMode = sal_False;
624         }
625     }
626     else if ( pBtn == &aBtnAdd )
627     {
628         String theEntriesStr( aEdEntries.GetText() );
629 
630         if ( !bModifyMode )
631         {
632             if ( theEntriesStr.Len() > 0 )
633             {
634                 AddNewList( theEntriesStr );
635                 UpdateUserListBox();
636                 aLbLists.SelectEntryPos( aLbLists.GetEntryCount()-1 );
637                 LbSelectHdl( &aLbLists );
638                 aFtLists.Enable();
639                 aLbLists.Enable();
640             }
641             else
642             {
643                 if ( aLbLists.GetEntryCount() > 0 )
644                 {
645                     aLbLists.SelectEntryPos( nCancelPos );
646                     LbSelectHdl( &aLbLists );
647                     aLbLists.Enable();
648                     aLbLists.Enable();
649                 }
650             }
651 
652             aBtnAdd.Disable();
653             aBtnRemove.Enable();
654             aBtnNew.SetText( aStrNew );
655             bCancelMode = sal_False;
656         }
657         else // if ( bModifyMode )
658         {
659             sal_uInt16 nSelList = aLbLists.GetSelectEntryPos();
660 
661             DBG_ASSERT( nSelList != LISTBOX_ENTRY_NOTFOUND, "Modify without List :-/" );
662 
663             if ( theEntriesStr.Len() > 0 )
664             {
665                 ModifyList( nSelList, theEntriesStr );
666                 UpdateUserListBox();
667                 aLbLists.SelectEntryPos( nSelList );
668             }
669             else
670             {
671                 aLbLists.SelectEntryPos( 0 );
672                 LbSelectHdl( &aLbLists );
673             }
674 
675             aBtnNew.SetText( aStrNew ); bCancelMode = sal_False;
676             aBtnAdd.SetText( aStrAdd ); bModifyMode = sal_False;
677             aBtnAdd.Disable();
678             aBtnRemove.Enable();
679             aFtLists.Enable();
680             aLbLists.Enable();
681         }
682 
683         if ( pViewData && !bCopyDone )
684         {
685             aBtnCopy.Enable();
686             aFtCopyFrom.Enable();
687             aEdCopyFrom.Enable();
688         }
689     }
690     else if ( pBtn == &aBtnRemove )
691     {
692         if ( aLbLists.GetEntryCount() > 0 )
693         {
694             sal_uInt16 nRemovePos   = aLbLists.GetSelectEntryPos();
695             String aMsg         ( aStrQueryRemove.GetToken( 0, '#' ) );
696 
697             aMsg += aLbLists.GetEntry( nRemovePos );
698             aMsg += aStrQueryRemove.GetToken( 1, '#' );
699 
700 
701             if ( RET_YES == QueryBox( this,
702                                       WinBits( WB_YES_NO | WB_DEF_YES ),
703                                       aMsg
704                                      ).Execute() )
705             {
706                 RemoveList( nRemovePos );
707                 UpdateUserListBox();
708 
709                 if ( aLbLists.GetEntryCount() > 0 )
710                 {
711                     aLbLists.SelectEntryPos(
712                         ( nRemovePos >= aLbLists.GetEntryCount() )
713                             ? aLbLists.GetEntryCount()-1
714                             : nRemovePos );
715                     LbSelectHdl( &aLbLists );
716                 }
717                 else
718                 {
719                     aFtLists.Disable();
720                     aLbLists.Disable();
721                     aFtEntries.Disable();
722                     aEdEntries.Disable();
723                     aEdEntries.SetText( EMPTY_STRING );
724                     aBtnRemove.Disable();
725                 }
726             }
727 
728             if ( pViewData && !bCopyDone && !aBtnCopy.IsEnabled() )
729             {
730                 aBtnCopy.Enable();
731                 aFtCopyFrom.Enable();
732                 aEdCopyFrom.Enable();
733             }
734         }
735     }
736     else if ( pViewData && (pBtn == &aBtnCopy) )
737     {
738         if ( bCopyDone )
739             return 0;
740 
741         //-----------------------------------------------------------
742 
743         ScRefAddress theStartPos;
744         ScRefAddress theEndPos;
745         String      theAreaStr( aEdCopyFrom.GetText() );
746         sal_Bool        bAreaOk = sal_False;
747 
748         if ( theAreaStr.Len() > 0 )
749         {
750             bAreaOk = pRangeUtil->IsAbsArea( theAreaStr,
751                                              pDoc,
752                                              pViewData->GetTabNo(),
753                                              &theAreaStr,
754                                              &theStartPos,
755                                              &theEndPos,
756                                              pDoc->GetAddressConvention() );
757             if ( !bAreaOk )
758             {
759                 bAreaOk = pRangeUtil->IsAbsPos(  theAreaStr,
760                                                  pDoc,
761                                                  pViewData->GetTabNo(),
762                                                  &theAreaStr,
763                                                  &theStartPos,
764                                                  pDoc->GetAddressConvention() );
765                 theEndPos = theStartPos;
766             }
767         }
768 
769         if ( bAreaOk )
770         {
771             CopyListFromArea( theStartPos, theEndPos );
772             UpdateUserListBox();
773             aLbLists.SelectEntryPos( aLbLists.GetEntryCount()-1 );
774             LbSelectHdl( &aLbLists );
775             aEdCopyFrom .SetText( theAreaStr );
776             aEdCopyFrom .Disable();
777             aBtnCopy    .Disable();
778             aFtCopyFrom .Disable();
779         }
780         else
781         {
782             ErrorBox( this, WinBits( WB_OK | WB_DEF_OK ),
783                       ScGlobal::GetRscString( STR_INVALID_TABREF )
784                     ).Execute();
785             aEdCopyFrom.GrabFocus();
786             aEdCopyFrom.SetSelection( Selection( 0, SELECTION_MAX ) );
787         }
788     }
789 
790     return 0;
791 }
792 
793 // -----------------------------------------------------------------------
794 
795 IMPL_LINK( ScTpUserLists, EdEntriesModHdl, MultiLineEdit*, pEd )
796 {
797     if ( pEd != &aEdEntries )
798         return 0;
799 
800     //-----------------------------------------------------------
801 
802     if ( aBtnCopy.IsEnabled() )
803     {
804         aBtnCopy    .Disable();
805         aFtCopyFrom .Disable();
806         aEdCopyFrom .Disable();
807     }
808 
809     if ( aEdEntries.GetText().Len() > 0 )
810     {
811         if ( !bCancelMode && !bModifyMode )
812         {
813             aBtnNew.SetText( aStrCancel );  bCancelMode = sal_True;
814             aBtnAdd.SetText( aStrModify );  bModifyMode = sal_True;
815             aBtnAdd.Enable();
816             aBtnRemove.Disable();
817             aFtLists.Disable();
818             aLbLists.Disable();
819         }
820         else // if ( bCancelMode || bModifyMode )
821         {
822             if ( !aBtnAdd.IsEnabled() ) aBtnAdd.Enable();
823         }
824     }
825     else
826     {
827         if ( aBtnAdd.IsEnabled() ) aBtnAdd.Disable();
828     }
829 
830     return 0;
831 }
832