xref: /aoo41x/main/sc/source/ui/namedlg/namedlg.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 // System - Includes ---------------------------------------------------------
32 
33 
34 
35 // INCLUDE -------------------------------------------------------------------
36 
37 #include "global.hxx"
38 #include "reffact.hxx"
39 #include "document.hxx"
40 #include "docfunc.hxx"
41 #include "scresid.hxx"
42 #include "globstr.hrc"
43 #include "namedlg.hrc"
44 
45 #define _NAMEDLG_CXX
46 #include "namedlg.hxx"
47 #undef _NAMEDLG_CXX
48 #include <vcl/msgbox.hxx>
49 
50 
51 
52 // defines -------------------------------------------------------------------
53 
54 #define ABS_SREF		  SCA_VALID \
55 						| SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
56 #define ABS_DREF		  ABS_SREF \
57 						| SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
58 #define ABS_SREF3D		ABS_SREF | SCA_TAB_3D
59 #define ABS_DREF3D		ABS_DREF | SCA_TAB_3D
60 
61 
62 //============================================================================
63 // Hilfsklasse: Merken der aktuellen Bereichsoptionen,
64 // wenn ein Name in der ComboBox gefunden wird.
65 
66 struct SaveData
67 {
68 	SaveData()
69 		: bCriteria(sal_False),bPrintArea(sal_False),
70 		  bColHeader(sal_False),bRowHeader(sal_False),
71 		  bDirty(sal_False) {}
72 
73 	void Clear()
74 		{
75 			aStrSymbol.Erase();
76 			bCriteria  = bPrintArea =
77 			bColHeader = bRowHeader = sal_False;
78 			bDirty = sal_True;
79 		}
80 
81 	String	aStrSymbol;
82 	sal_Bool	bCriteria:1;
83 	sal_Bool	bPrintArea:1;
84 	sal_Bool	bColHeader:1;
85 	sal_Bool	bRowHeader:1;
86 	sal_Bool	bDirty:1;
87 };
88 
89 static SaveData* pSaveObj = NULL;
90 
91 #define SAVE_DATA() \
92 	pSaveObj->aStrSymbol = aEdAssign.GetText(); 		\
93 	pSaveObj->bCriteria  = aBtnCriteria.IsChecked();	\
94 	pSaveObj->bPrintArea = aBtnPrintArea.IsChecked();	\
95 	pSaveObj->bColHeader = aBtnColHeader.IsChecked();	\
96 	pSaveObj->bRowHeader = aBtnRowHeader.IsChecked();	\
97 	pSaveObj->bDirty	 = sal_True;
98 
99 #define RESTORE_DATA() \
100 	if ( pSaveObj->bDirty ) 							\
101 	{													\
102 		aEdAssign.SetText( pSaveObj->aStrSymbol );		\
103 		aBtnCriteria.Check( pSaveObj->bCriteria );		\
104 		aBtnPrintArea.Check( pSaveObj->bPrintArea );	\
105 		aBtnColHeader.Check( pSaveObj->bColHeader );	\
106 		aBtnRowHeader.Check( pSaveObj->bRowHeader );	\
107 		pSaveObj->bDirty = sal_False;						\
108 	}
109 
110 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute();
111 
112 
113 //============================================================================
114 //	class ScNameDlg
115 
116 //----------------------------------------------------------------------------
117 
118 ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
119 					  ScViewData*		ptrViewData,
120 					  const ScAddress&	aCursorPos )
121 
122 	:	ScAnyRefDlg	( pB, pCW, pParent, RID_SCDLG_NAMES ),
123 		//
124         aFlName         ( this, ScResId( FL_NAME ) ),
125 		aEdName 		( this, ScResId( ED_NAME ) ),
126 		//
127         aFlAssign       ( this, ScResId( FL_ASSIGN ) ),
128         aEdAssign       ( this, this, ScResId( ED_ASSIGN ) ),
129 		aRbAssign		( this, ScResId( RB_ASSIGN ), &aEdAssign, this ),
130 		//
131 		aFlType 		( this, ScResId( FL_TYPE ) ),
132 		aBtnPrintArea	( this, ScResId( BTN_PRINTAREA ) ),
133 		aBtnColHeader	( this, ScResId( BTN_COLHEADER ) ),
134 		aBtnCriteria	( this, ScResId( BTN_CRITERIA ) ),
135 		aBtnRowHeader	( this, ScResId( BTN_ROWHEADER ) ),
136 		//
137 		aBtnOk			( this, ScResId( BTN_OK ) ),
138 		aBtnCancel		( this, ScResId( BTN_CANCEL ) ),
139 		aBtnHelp		( this, ScResId( BTN_HELP ) ),
140 		aBtnAdd 		( this, ScResId( BTN_ADD ) ),
141 		aBtnRemove		( this, ScResId( BTN_REMOVE ) ),
142 		aBtnMore		( this, ScResId( BTN_MORE ) ),
143 		//
144 		bSaved			(sal_False),
145 		aStrAdd 		( ScResId( STR_ADD ) ),
146 		aStrModify		( ScResId( STR_MODIFY ) ),
147 		errMsgInvalidSym( ScResId( STR_INVALIDSYMBOL ) ),
148 		//
149 		pViewData		( ptrViewData ),
150 		pDoc			( ptrViewData->GetDocument() ),
151 		aLocalRangeName ( *(pDoc->GetRangeName()) ),
152 		theCursorPos	( aCursorPos )  // zum Berechnen der Referenzen
153 {
154 	pSaveObj = new SaveData;
155 	Init();
156 	FreeResource();
157 
158 	aRbAssign.SetAccessibleRelationMemberOf(&aFlAssign);
159 }
160 
161 
162 //----------------------------------------------------------------------------
163 
164 __EXPORT ScNameDlg::~ScNameDlg()
165 {
166 	DELETEZ( pSaveObj );
167 }
168 
169 
170 //----------------------------------------------------------------------------
171 
172 void __EXPORT ScNameDlg::Init()
173 {
174 	String	aAreaStr;
175 	ScRange aRange;
176 
177 	DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" );
178 
179 	aBtnOk.SetClickHdl		( LINK( this, ScNameDlg, OkBtnHdl ) );
180 	aBtnCancel.SetClickHdl	( LINK( this, ScNameDlg, CancelBtnHdl ) );
181 	aBtnAdd.SetClickHdl		( LINK( this, ScNameDlg, AddBtnHdl ) );
182 	aBtnRemove.SetClickHdl	( LINK( this, ScNameDlg, RemoveBtnHdl ) );
183 	aEdAssign.SetGetFocusHdl( LINK( this, ScNameDlg, AssignGetFocusHdl ) );
184 	aEdAssign.SetModifyHdl	( LINK( this, ScNameDlg, EdModifyHdl ) );
185 	aEdName.SetModifyHdl 	( LINK( this, ScNameDlg, EdModifyHdl ) );
186 	aEdName.SetSelectHdl 	( LINK( this, ScNameDlg, NameSelectHdl ) );
187 
188 	aBtnCriteria .Hide();
189 	aBtnPrintArea.Hide();
190 	aBtnColHeader.Hide();
191 	aBtnRowHeader.Hide();
192 
193 	aBtnMore.AddWindow( &aFlType );
194 	aBtnMore.AddWindow( &aBtnCriteria );
195 	aBtnMore.AddWindow( &aBtnPrintArea );
196 	aBtnMore.AddWindow( &aBtnColHeader );
197 	aBtnMore.AddWindow( &aBtnRowHeader );
198 
199 	UpdateNames();
200 
201 	pViewData->GetSimpleArea( aRange );
202 	aRange.Format( aAreaStr, ABS_DREF3D, pDoc,
203                    ScAddress::Details(pDoc->GetAddressConvention(), 0, 0) );
204 
205 	theCurSel = Selection( 0, SELECTION_MAX );
206 	aEdAssign.GrabFocus();
207 	aEdAssign.SetText( aAreaStr );
208 	aEdAssign.SetSelection( theCurSel );
209 	aEdName.GrabFocus();
210 
211 	aBtnAdd.Disable();
212 	aBtnRemove.Disable();
213 	if ( aEdName.GetEntryCount() > 0 )
214 		aBtnAdd.SetText( aStrAdd );
215 	UpdateChecks();
216 	EdModifyHdl( 0 );
217 
218 	bSaved=sal_True;
219 	SAVE_DATA()
220 
221 	//@BugID 54702
222 	//SFX_APPWINDOW->Disable(sal_False);		//! allgemeine Methode im ScAnyRefDlg
223 }
224 
225 //----------------------------------------------------------------------------
226 sal_Bool ScNameDlg::IsRefInputMode() const
227 {
228 	return aEdAssign.IsEnabled();
229 }
230 
231 void ScNameDlg::RefInputDone( sal_Bool bForced)
232 {
233 	ScAnyRefDlg::RefInputDone(bForced);
234 	EdModifyHdl(&aEdAssign);
235 }
236 //----------------------------------------------------------------------------
237 // Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als
238 // neue Selektion im Referenz-Edit angezeigt wird.
239 
240 
241 void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
242 {
243 	if ( aEdAssign.IsEnabled() )
244 	{
245 		if ( rRef.aStart != rRef.aEnd )
246 			RefInputStart(&aEdAssign);
247 		String aRefStr;
248         rRef.Format( aRefStr, ABS_DREF3D, pDocP,
249                      ScAddress::Details(pDocP->GetAddressConvention(), 0, 0) );
250 		aEdAssign.SetRefString( aRefStr );
251 	}
252 }
253 
254 
255 //----------------------------------------------------------------------------
256 sal_Bool __EXPORT ScNameDlg::Close()
257 {
258 	return DoClose( ScNameDlgWrapper::GetChildWindowId() );
259 }
260 
261 
262 //----------------------------------------------------------------------------
263 
264 void ScNameDlg::SetActive()
265 {
266 	aEdAssign.GrabFocus();
267 	RefInputDone();
268 }
269 
270 
271 //----------------------------------------------------------------------------
272 
273 void __EXPORT ScNameDlg::UpdateChecks()
274 {
275 	sal_uInt16		 nCurPos=0;
276 
277 	if(aLocalRangeName.SearchName( aEdName.GetText(), nCurPos))
278 	{
279 		ScRangeData* pData=(ScRangeData*)(aLocalRangeName.At( nCurPos ));
280 		aBtnCriteria .Check( pData->HasType( RT_CRITERIA ) );
281 		aBtnPrintArea.Check( pData->HasType( RT_PRINTAREA ) );
282 		aBtnColHeader.Check( pData->HasType( RT_COLHEADER ) );
283 		aBtnRowHeader.Check( pData->HasType( RT_ROWHEADER ) );
284 	}
285 
286 	// Falls Edit-Feld leer ist: Typ-CheckBoxen deaktivieren:
287 
288 	if ( aEdName.GetText().Len() != 0 )
289 	{
290 		if ( !aFlType.IsEnabled() )
291 		{
292 			aFlType 	 .Enable();
293 			aBtnCriteria .Enable();
294 			aBtnPrintArea.Enable();
295 			aBtnColHeader.Enable();
296 			aBtnRowHeader.Enable();
297             aFlAssign    .Enable();
298 			aEdAssign    .Enable();
299 			aRbAssign    .Enable();
300 		}
301 	}
302 	else if ( aFlType.IsEnabled() )
303 	{
304 		aFlType 	 .Disable();
305 		aBtnCriteria .Disable();
306 		aBtnPrintArea.Disable();
307 		aBtnColHeader.Disable();
308 		aBtnRowHeader.Disable();
309         aFlAssign    .Disable();
310 		aEdAssign    .Disable();
311 		aRbAssign    .Disable();
312 	}
313 }
314 
315 
316 //----------------------------------------------------------------------------
317 
318 void __EXPORT ScNameDlg::UpdateNames()
319 {
320 	sal_uInt16	nRangeCount = aLocalRangeName.GetCount();
321 
322 	aEdName.SetUpdateMode( sal_False );
323 	//-----------------------------------------------------------
324 	sal_uInt16  nNamePos = aEdName.GetTopEntry();
325 	aEdName.Clear();
326 
327 	aEdAssign.SetText( EMPTY_STRING );
328 
329 	if ( nRangeCount > 0 )
330 	{
331 		ScRangeData*	pRangeData = NULL;
332 		String			aString;
333 
334 		for ( sal_uInt16 i=0; i<nRangeCount; i++ )
335 		{
336 			pRangeData = (ScRangeData*)(aLocalRangeName.At( i ));
337 			if ( pRangeData )
338 			{
339 				if (   !pRangeData->HasType( RT_DATABASE )
340 					&& !pRangeData->HasType( RT_SHARED ) )
341 				{
342 					pRangeData->GetName( aString );
343 					aEdName.InsertEntry( aString );
344 				}
345 			}
346 		}
347 	}
348 	else
349 	{
350 		aBtnAdd.SetText( aStrAdd );
351 		aBtnAdd.Disable();
352 		aBtnRemove.Disable();
353 	}
354 	//-----------------------------------------------------------
355 	aEdName.SetUpdateMode( sal_True );
356 	aEdName.SetTopEntry(nNamePos);
357 	aEdName.Invalidate();
358 }
359 
360 
361 //----------------------------------------------------------------------------
362 
363 void __EXPORT ScNameDlg::CalcCurTableAssign( String& aAssign, sal_uInt16 nCurPos )
364 {
365 	ScRangeData* pRangeData = (ScRangeData*)(aLocalRangeName.At( nCurPos ));
366 
367 	if ( pRangeData )
368 	{
369         rtl::OUStringBuffer sBuffer;
370 		pRangeData->UpdateSymbol( sBuffer, theCursorPos );
371         aAssign = sBuffer;
372 	}
373 	else
374 	{
375 		aAssign.Erase();
376 	}
377 }
378 
379 
380 //----------------------------------------------------------------------------
381 // Handler:
382 // ========
383 
384 IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
385 {
386 	if ( aBtnAdd.IsEnabled() )
387 		AddBtnHdl( 0 );
388 
389 	if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() )
390 	{
391 		ScDocShell* pDocSh = pViewData->GetDocShell();
392 		ScDocFunc aFunc(*pDocSh);
393 		aFunc.ModifyRangeNames( aLocalRangeName, sal_False );
394 		Close();
395 	}
396 	return 0;
397 }
398 
399 
400 //----------------------------------------------------------------------------
401 
402 IMPL_LINK_INLINE_START( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
403 {
404 	Close();
405 	return 0;
406 }
407 IMPL_LINK_INLINE_END( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
408 
409 
410 //----------------------------------------------------------------------------
411 
412 IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
413 {
414 	sal_Bool	bAdded	  = sal_False;
415 	String	aNewEntry = aEdName.GetText();
416 	sal_uInt16  nNamePos = aEdName.GetTopEntry();
417 	aNewEntry.EraseLeadingChars( ' ' );
418 	aNewEntry.EraseTrailingChars( ' ' );
419 
420 	if ( aNewEntry.Len() > 0 )
421 	{
422 		if ( ScRangeData::IsNameValid( aNewEntry, pDoc ) )
423 		{
424 			if ( pDoc )
425 			{
426 				ScRangeData*	pNewEntry	= NULL;
427 				RangeType		nType		= RT_NAME;
428 				sal_uInt16			nFoundAt	= 0;
429 				String			theSymbol	= aEdAssign.GetText();
430 				String			aStrPos;
431 				String			aStrArea;
432 
433 				pNewEntry = new ScRangeData( pDoc,
434 											 aNewEntry,
435 											 theSymbol,
436 											 theCursorPos,
437 											 nType );
438 				if (pNewEntry)
439 				{
440 					nType = nType
441 					| (aBtnRowHeader .IsChecked() ? RT_ROWHEADER  : RangeType(0))
442 					| (aBtnColHeader .IsChecked() ? RT_COLHEADER  : RangeType(0))
443 					| (aBtnPrintArea .IsChecked() ? RT_PRINTAREA  : RangeType(0))
444 					| (aBtnCriteria  .IsChecked() ? RT_CRITERIA   : RangeType(0));
445 					pNewEntry->AddType(nType);
446 				}
447 
448 				// theSymbol gueltig?
449 				// (= konnte theSymbol im ScRangeData-Ctor
450 				//	  in ein Token-Array uebersetzt werden?)
451 				if ( 0 == pNewEntry->GetErrCode() )
452 				{
453 					// Eintrag bereits vorhanden? Dann vorher entfernen (=Aendern)
454 					if ( aLocalRangeName.SearchName( aNewEntry, nFoundAt ) )
455 					{									// alten Index uebernehmen
456 						pNewEntry->SetIndex(
457 							((ScRangeData*)(aLocalRangeName.At(nFoundAt)))->GetIndex() );
458 						aLocalRangeName.AtFree( nFoundAt );
459 					}
460 					else
461 						pSaveObj->Clear();
462 
463 					if ( !aLocalRangeName.Insert( pNewEntry ) )
464 						delete pNewEntry;
465 
466 					UpdateNames();
467 					bSaved=sal_False;
468 					RESTORE_DATA()
469 					aEdName.SetText(EMPTY_STRING);
470 					aEdName.GrabFocus();
471 					UpdateChecks();
472 					aBtnAdd.SetText( aStrAdd );
473 					aBtnAdd.Disable();
474 					aBtnRemove.Disable();
475 
476 					//@BugID 54702 raus mit dem Sch.
477 					//SFX_APPWINDOW->Disable(sal_False);		//! allgemeine Methode im ScAnyRefDlg
478 
479 					bAdded = sal_True;
480 				}
481 				else // theSymbol ungueltig
482 				{
483 					delete pNewEntry;
484 					ERRORBOX( errMsgInvalidSym );
485 					theCurSel = Selection( 0, SELECTION_MAX );
486 					aEdAssign.GrabFocus();
487 				}
488 			}
489 		}
490 		else
491 		{
492 			ERRORBOX( ScGlobal::GetRscString(STR_INVALIDNAME) );
493 			aEdName.SetSelection( Selection( 0, SELECTION_MAX ) );
494 			aEdName.GrabFocus();
495 		}
496 	}
497 
498     aEdName.SetTopEntry(nNamePos);
499 	return bAdded;
500 }
501 
502 
503 //----------------------------------------------------------------------------
504 
505 IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
506 {
507 	sal_uInt16		 nRemoveAt = 0;
508 	const String aStrEntry = aEdName.GetText();
509 
510 	if ( aLocalRangeName.SearchName( aStrEntry, nRemoveAt ) )
511 	{
512 		String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
513 		String aMsg		  = aStrDelMsg.GetToken( 0, '#' );
514 
515 		aMsg += aStrEntry;
516 		aMsg += aStrDelMsg.GetToken( 1, '#' );
517 
518 		if ( RET_YES ==
519 			 QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() )
520 		{
521 			aLocalRangeName.AtFree( nRemoveAt );
522 			UpdateNames();
523 			UpdateChecks();
524 			bSaved=sal_False;
525 			RESTORE_DATA()
526 			theCurSel = Selection( 0, SELECTION_MAX );
527 			aBtnAdd.SetText( aStrAdd );
528 			aBtnAdd.Disable();
529 			aBtnRemove.Disable();
530 		}
531 	}
532 	return 0;
533 }
534 
535 
536 //----------------------------------------------------------------------------
537 
538 IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
539 {
540 	sal_uInt16 nAtPos;
541 
542 	if ( aLocalRangeName.SearchName( aEdName.GetText(), nAtPos ) )
543 	{
544 		String		 aSymbol;
545 		ScRangeData* pData	= (ScRangeData*)(aLocalRangeName.At( nAtPos ));
546 
547 		if ( pData )
548 		{
549 			pData->GetSymbol( aSymbol );
550 			CalcCurTableAssign( aSymbol, nAtPos );
551 			aEdAssign.SetText( aSymbol );
552 			aBtnAdd.SetText( aStrModify );
553 			theCurSel = Selection( 0, SELECTION_MAX );
554 		}
555 	}
556 	UpdateChecks();
557 	return 0;
558 }
559 
560 
561 //----------------------------------------------------------------------------
562 
563 IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
564 {
565 	String	theName 	= aEdName.GetText();
566 	String	theSymbol	= aEdAssign.GetText();
567 	sal_Bool	bNameFound	= (COMBOBOX_ENTRY_NOTFOUND
568 						   != aEdName.GetEntryPos( theName ));
569 
570 	if ( pEd == &aEdName )
571 	{
572 		if ( theName.Len() == 0 )
573 		{
574 			if ( aBtnAdd.GetText() != aStrAdd )
575 				aBtnAdd.SetText( aStrAdd );
576 			aBtnAdd.Disable();
577 			aBtnRemove.Disable();
578             aFlAssign.Disable();
579 			aEdAssign.Disable();
580 			aRbAssign.Disable();
581 			//@BugID 54702 raus mit dem Sch.
582 			//SFX_APPWINDOW->Disable(sal_False);		//! allgemeine Methode im ScAnyRefDlg
583 		}
584 		else
585 		{
586 			if ( bNameFound )
587 			{
588 				if ( aBtnAdd.GetText() != aStrModify )
589 					aBtnAdd.SetText( aStrModify );
590 
591 				aBtnRemove.Enable();
592 
593 				if(!bSaved)
594 				{
595 					bSaved=sal_True;
596 					SAVE_DATA()
597 				}
598 				NameSelectHdl( 0 );
599 			}
600 			else
601 			{
602 				if ( aBtnAdd.GetText() != aStrAdd )
603 					aBtnAdd.SetText( aStrAdd );
604 				aBtnRemove.Disable();
605 
606 				bSaved=sal_False;
607 				RESTORE_DATA()
608 			}
609 			theSymbol = aEdAssign.GetText();
610 
611 			if ( theSymbol.Len() > 0 )
612 				aBtnAdd.Enable();
613 			else
614 				aBtnAdd.Disable();
615 
616             aFlAssign.Enable();
617 			aEdAssign.Enable();
618 			aRbAssign.Enable();
619 			//@BugID 54702 raus mit dem Sch.
620 			//SFX_APPWINDOW->Enable();
621 		}
622 		UpdateChecks();
623 		theCurSel = Selection( 0, SELECTION_MAX );
624 	}
625 	else if ( pEd == &aEdAssign )
626 	{
627 		if ( (theName.Len()>0) && (theSymbol.Len()>0) )
628 		{
629 			aBtnAdd.Enable();
630 			if ( bNameFound )
631 				aBtnRemove.Enable();
632 		}
633 		else
634 		{
635 			aBtnAdd.Disable();
636 			aBtnRemove.Disable();
637 		}
638 	}
639 	return 0;
640 }
641 
642 //------------------------------------------------------------------------
643 
644 IMPL_LINK_INLINE_START( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
645 {
646 	EdModifyHdl( &aEdAssign );
647 	return 0;
648 }
649 IMPL_LINK_INLINE_END( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
650 
651 
652