ChooseLevelInPrefs/fr

À propos du code proposé dans cette page : tous les changements par rapport au code original d'OpenOffice.org ayant servi de base, et fournis dans cette page, sont :


 * '''sous Licence  LGPL v3 ( et vous pouvez-le redistribuer et / ou le modifier selon les termes de la licence GNU Lesser General Public License telle que publiée par la Free Software Foundation)
 * <Copyright Eric Bachard 12th august 2009.

Introduction
Ci-dessous, vous trouverez une description technique de l'implémentation de la fonctionnalité : Choix du niveau de l'utlisateur dans les préférences. Il est ainsi question de code source (C++, objective C), mais aussi de comment on lit écrit dans les fichiers de cofiguration, via le "config manager", et nous supposons que le lecteur possède les bases nécessaires pour lire et comprendre le contenu de ce qui est exposé.

Les pré-requis pour lire cet article sont encore à définir, mais si certaines notions ne vous sont pas familières, nous vous invitons à consulter le wiki d'OpenOffice.org pour compléter vos connaissances, afin de pouvoir lire cet article dans les meilleures conditions possibles.

Merci à Eike Rathke, Thorsten Behrens et Cédric Bosdonnat pour leurs précieux conseils.

Spécifications

 * Modifier les préférences, afin de permettre de choisir un niveau d'utilisateur parmi : débutant, moyen, expert
 * Boutons "Radio" disposés horizontalement : un seul bouton est sélectionné (actif) à la fois
 * Le niveau proposé par défaut (première utilisation d'OOo4Kids) est débutant

Comme indiqué ci-dessous :



Exemples d'utilisation de cette fonctionnalité

 * Dans Calc, toutes les fonctions sont présentes, c'est à dire utilisables, mais ne sont pas forcément visibles dans la liste proposée par l'assistant "fonctions" :
 * avec le niveau "débutant, seules quelques fonctions apparaîtront dans cette liste ;
 * avec le niveau moyen sélectionné, 30 à 40 fonctions apparaîtront ;
 * niveau expert sélectionné : toutes les fonctions sont dans la liste.


 * Dans Writer (juste une idée) : en fonction du niveau, on pourrait afficher plus ou moins de choses dans les boîtes de dialogues du styliste.


 * Dans l'assisstant Writer (à écrire), en fonction du niveau, on pourrait proposer certains modèles, ou d'autres.


 * (ajouter votre idée )

Dans le code
Nous allons utiliser la class MiscTabPage et dérivées, pour implementer la nouvelle option.

Fait :
 * ajout des nouveaux objets suivants dans le constructeur de la classe OfaMiscTabPage
 * Nom : aUserLevelFL ; type : Fixed Line
 * Nom : aUserLevelBeginnerRB ; type : Radio Button
 * Nom : aUserLevelAverageRB ; type : Radio Button
 * Nom : aUserLevelExpertRB ; type : Radio Button
 * Les déclarer dans le fichier d'en tête (optgdlg.hxx)
 * Implémentation de méthodes statiques pour :
 * lire la valeur, appelée UserLevel dans les préférences, c'est à dire dans le fichier Common.xcu, accessible dans le noeud "Misc".
 * Connaître le bouton Radio actif courant
 * Prendre en charge le clic sur un de ces boutons Radio ( via un callback )

Tout fonctionne actuellement :  :


 * l'interface utilisateur ( UI ) est ok
 * le fichier .xcu semble parfaitement fonctionner, et la valeur est lisible dans le Common.xcu file, placé dans le répertoire $SYSUSERCONFIG (ce répertoire contient l'ensemble des préférences utilisateur)
 * initialisation des boutons : OK
 * lecture de la valeur du choix au lancement : vérifié OK
 * cliquer, et voir le nouveau Radio bouton actif, un seul à la fois : vérifié OK
 * démarrer OOo4Kids avec une valeur donnée dans le Common.xcu : initialisation est OK, tous les cas possibles ont été vérifiés OK aussi
 * écrire la nouvelle valeur dans les préférences : vérifié OK
 * Vérifier que la valeur est modifiée : valider un changement, cliquer sur OK, réouvrir les préférences et vérifier que le changement est toujours là : vérifié OK

Merci de nous rapporter tout problème que vous pourriez rencontrer.

Module : svx
Pour les préférences, tout ou presque est situé dans le module svx (autre possibilité : sfx2/source/dialog), svx/source/cui/optgdlg.hrc contient des informations utiles, comme lignes et colonnes, dimensions .. etc. svx/source/cui/optgdlg.src est l'endroit où l'on définit l'emplacement des contrôles.

Fichiers concernés :


 * svx/source/cui/optgdlg.src : contient les contrôles et leur positionnement, mais aussi des textes (boutons, listes .. etc)

Index: svx/source/cui/optgdlg.src

=
====================================================== --- svx/source/cui/optgdlg.src	(revision 275641) +++ svx/source/cui/optgdlg.src	(working copy) @@ -41,49 +41,49 @@ TabPage OFA_TP_MISC { -	HelpID = HID_OFA_TP_MISC ; -	SVLook = TRUE ; -	Size = MAP_APPFONT ( 260, 185 ) ; -	Hide = TRUE ; +   HelpID = HID_OFA_TP_MISC ; +   SVLook = TRUE ; +   Size = MAP_APPFONT ( 260, 185 ) ; +   Hide = TRUE ; FixedLine FL_HELP { -		Pos = MAP_APPFONT( COL0, ROW0 ); -		Size = MAP_APPFONT( WHOLE_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ); -		Text [ en-US ] = "Help"; -	}; -	CheckBox CB_TOOLTIP -	{ -		Pos = MAP_APPFONT( COL1, ROW1 ); -		Size = MAP_APPFONT( WHOLE_WIDTH - COL1, RSC_CD_CHECKBOX_HEIGHT ); -		Text [ en-US ] = "~Tips"; -	}; -	CheckBox CB_EXTHELP -	{ -		Pos = MAP_APPFONT( COL2, ROW2 ); -		Size = MAP_APPFONT( WHOLE_WIDTH - COL2, RSC_CD_CHECKBOX_HEIGHT ); -		Text [ en-US ] = "~Extended tips"; -	}; -	CheckBox CB_HELPAGENT -	{ -		Pos = MAP_APPFONT( COL1, ROW3 ); -		Size = MAP_APPFONT( WHOLE_WIDTH - COL1, RSC_CD_CHECKBOX_HEIGHT ); -		Text [ en-US ] = "~Help Agent"; -	}; +	Pos = MAP_APPFONT( COL0, ROW0 ); +	Size = MAP_APPFONT( WHOLE_WIDTH, 10 ); +	Text [ en-US ] = "Help"; +   }; +    CheckBox CB_TOOLTIP +   { +        Pos = MAP_APPFONT ( COL1, ROW1 ) ; +		Size = MAP_APPFONT ( 60, 10 ) ; +	Text [ en-US ] = "~Tips"; +   }; +    CheckBox CB_EXTHELP +   { +        Pos = MAP_APPFONT ( COL1 + 60, ROW1 ) ; +		Size = MAP_APPFONT ( 60, 10 ) ; +	Text [ en-US ] = "~Extended tips"; +   }; +    CheckBox CB_HELPAGENT +   { +	Pos = MAP_APPFONT( COL1 + 120, ROW1 ); +		Size = MAP_APPFONT ( 60, 10 ) ; +	Text [ en-US ] = "~Help Agent"; +   };     PushButton PB_HELPAGENT_RESET { -		Pos = MAP_APPFONT( COL2, ROW4 ); -		Size = MAP_APPFONT( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ); -		Text [ en-US ] = "~Reset Help Agent"; -	}; +	Pos = MAP_APPFONT( COL1 + 180, ROW1 ); +	Size = MAP_APPFONT( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ); +	Text [ en-US ] = "~Reset Help Agent"; +   };     FixedText FT_HELPFORMAT { -       Pos = MAP_APPFONT( COL1, OFFS_TEXTBOX_FIXEDTEXT(ROW5) ); +       Pos = MAP_APPFONT( COL1, ROW3 ); Size = MAP_APPFONT( DIFF( COL1, COL3 ), RSC_CD_FIXEDTEXT_HEIGHT ); Text [ en-US ] = "Help ~formatting"; };    ListBox LB_HELPFORMAT { -       Pos = MAP_APPFONT( COL4, ROW5 ); +       Pos = MAP_APPFONT( COL4, ROW3 ); Size = MAP_APPFONT( WHOLE_WIDTH - COL4, 50 ); DropDown = TRUE ; Border = TRUE ; @@ -97,6 +97,38 @@            < "High Contrast White" ; > ; }; 	}; +   FixedLine FL_USERLEVEL +   { +	Pos = MAP_APPFONT( COL0, ROW4 ); +	Size = MAP_APPFONT( WHOLE_WIDTH, 10 ); +	Text [ en-US ] = "User Level"; +	Text [ fr ] = "Niveau"; +   }; +    RadioButton RB_USERLEVEL_BEGINNER +   { +        TabStop = TRUE; +       Pos = MAP_APPFONT ( COL1, ROW5 ) ; +		Size = MAP_APPFONT ( 60, 10 ) ; +       Text [ en-US ] = "Beginner"; +       Text [ fr ] = "D√©butant"; +   }; +    RadioButton RB_USERLEVEL_AVERAGE +   { +		TabStop = TRUE; +       Pos = MAP_APPFONT ( COL1 + 60, ROW5 ) ; +		Size = MAP_APPFONT ( 60, 10 ) ; +       Text [ en-US ] = "Average"; +       Text [ fr ] = "Moyen"; +   }; +    RadioButton RB_USERLEVEL_EXPERT +   { +		TabStop = TRUE; +       Pos = MAP_APPFONT( COL1 + 120, ROW5 ); +		Size = MAP_APPFONT ( 60, 10 ) ; +       Text [ en-US ] = "Expert"; +       Text [ fr ] = "Expert"; +   }; +     FixedLine FL_FILEDLG {        Pos = MAP_APPFONT( COL0, ROW6 ); @@ -177,16 +209,17 @@ TabPage OFA_TP_VIEW { -	HelpID = HID_OFA_TP_VIEW ; -	SVLook = TRUE ; -	Size = MAP_APPFONT ( 260, 185 ) ; -	Hide = TRUE ; +   HelpID = HID_OFA_TP_VIEW ; +   SVLook = TRUE ; +   Size = MAP_APPFONT ( 260, 185 ) ; +   Hide = TRUE ; FixedLine FL_USERINTERFACE -	{ -		Pos = MAP_APPFONT ( 6, ROW0 ) ; -       Size = MAP_APPFONT ( 120, 8 ) ; -       Text [ en-US ] = "User Interface" ; +   { +	Pos = MAP_APPFONT ( 6, ROW0 ) ; +	Size = MAP_APPFONT ( 120, 8 ) ; +	Text [ en-US ] = "User Interface" ; }; +    FixedText FT_WINDOWSIZE {        Pos = MAP_APPFONT ( 12, OFFS_TEXTBOX_FIXEDTEXT( ROW_MF_SCALING ) ) ;


 * svx/source/cui/optgdlg.hxx : fichiers d'en-tête de la boîte de dialogues.

Index: svx/source/cui/optgdlg.hxx

=
====================================================== --- svx/source/cui/optgdlg.hxx	(revision 275641) +++ svx/source/cui/optgdlg.hxx	(working copy) @@ -38,6 +38,13 @@ +#if defined( OOo4Kids ) +#define USER_LEVEL_BEGINNER 1 +#define USER_LEVEL_AVERAGE 2 +#define USER_LEVEL_EXPERT  3 +#endif + + // predeclarations class CanvasSettings; class SvtOptionsDrawinglayer; @@ -55,7 +62,12 @@ 	PushButton         aHelpAgentResetBtn; FixedText          aHelpFormatFT; ListBox            aHelpFormatLB; - +#ifdef OOo4Kids +	FixedLine	aUserLevelFL; +	RadioButton	aUserLevelBeginnerRB; +	RadioButton	aUserLevelAverageRB; +	RadioButton	aUserLevelExpertRB; +#endif FixedLine          aFileDlgFL; ReadOnlyImage      aFileDlgROImage; CheckBox           aFileDlgCB; @@ -77,6 +89,9 @@ 	DECL_LINK( TwoFigureConfigHdl, NumericField* ); DECL_LINK( HelpCheckHdl_Impl, CheckBox* ); DECL_LINK( HelpAgentResetHdl_Impl, PushButton* ); +#ifdef OOo4Kids +	DECL_LINK( UserLevelCheckHdl_Impl, RadioButton* pButton ); +#endif protected: virtual int        DeactivatePage( SfxItemSet* pSet = NULL );
 * 1) include 
 * 2) define FOLDERWEBVIEW_DEFAULTFILE  "folder.so"

Index: svx/source/cui/optgdlg.hrc
 * svx/source/cui/optgdlg.hrc : contient des constantes prédéfinies (utilisées pour rendre le code plus llisible)

=
====================================================== --- svx/source/cui/optgdlg.hrc	(revision 275641) +++ svx/source/cui/optgdlg.hrc	(working copy) @@ -202,6 +202,12 @@ + +#define FL_USERLEVEL               62 +#define RB_USERLEVEL_BEGINNER		63 +#define RB_USERLEVEL_AVERAGE		64 +#define RB_USERLEVEL_EXPERT        65 + // ******************************************************************* EOF
 * 1) define FT_HELPAGENT_TIME_UNIT     59
 * 2) define FL_DOCSTATUS               60
 * 3) define CB_DOCSTATUS               61
 * 1) endif // #ifndef _SVX_OPTGDLG_HRC

Index: svx/source/cui/optgdlg.cxx
 * svx/source/cui/optgdlg.cxx : implémentation de la boîte de dialog, ici nos méthodes setUserLevel et getUserLevel + le callback pour exécuter l'une ou l'autre quand un bouton Radio est cliqué.

=
====================================================== --- svx/source/cui/optgdlg.cxx	(revision 275641) +++ svx/source/cui/optgdlg.cxx	(working copy) @@ -106,6 +106,10 @@ +#ifdef OOo4Kids +#include "vcl/unohelp.hxx" +#endif + @@ -127,6 +131,94 @@ +#ifdef OOo4Kids +static const OUString sULConfigSrvc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ); +static const OUString sULAccessSrvc( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationUpdateAccess" ) ); + +static short getUserLevel +{ +   short dUserLevel = 1; // default is beginner +   try +   { +	// get service provider +       Reference< XMultiServiceFactory > xSMgr( vcl::unohelper::GetMultiServiceFactory ); +       // create configuration hierachical access name +       if( xSMgr.is ) +	{ +	   try +           { +                Reference< XMultiServiceFactory > xConfigProvider( +                    Reference< XMultiServiceFactory >( +                       xSMgr->createInstance( sULConfigSrvc ), +                       UNO_QUERY ) +                    ); +               if( xConfigProvider.is ) +               { +                    Sequence< Any > aArgs(1); +                   PropertyValue aVal; +                   aVal.Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); +                   aVal.Value <<= OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Misc" ) ); +                   aArgs.getArray[0] <<= aVal; +                   Reference< XNameAccess > xConfigAccess( +                        Reference< XNameAccess >( +                           xConfigProvider->createInstanceWithArguments( sULAccessSrvc, aArgs ), UNO_QUERY ) +                        ); +                   if( xConfigAccess.is ) +                   { +                        try +                       { +                            short bValue = 1; +                           Any aAny = xConfigAccess->getByName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserLevel" ) ) ); +                           if( aAny >>= bValue ) +                               dUserLevel = bValue; +                       } +                        catch( NoSuchElementException& ) +                       { +                        } +                        catch( WrappedTargetException& ) +                       { +                        } +                    } +                } +            } +            catch( Exception& ) +           { +            } +        } +    } +    catch( WrappedTargetException& ) +   { +    } +    return dUserLevel; +} + +static void setUserLevel( short nLevel ) +{ +   try +   { +        Reference < XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory; +       // get configuration provider +       Reference< XMultiServiceFactory > theConfigProvider = Reference< XMultiServiceFactory >( +        xFactory->createInstance(sULConfigSrvc), UNO_QUERY_THROW); +       Sequence< Any > theArgs(1); +       NamedValue v(OUString::createFromAscii("NodePath"), +            makeAny(OUString::createFromAscii("org.openoffice.Office.Common/Misc"))); +       theArgs[0] <<= v; +        Reference< XPropertySet > pset = Reference< XPropertySet >( +            theConfigProvider->createInstanceWithArguments(sULAccessSrvc, theArgs), UNO_QUERY_THROW); + +       Any result = pset->getPropertyValue(OUString::createFromAscii("UserLevel")); + +       pset->setPropertyValue(OUString::createFromAscii("UserLevel"), makeAny(nLevel)); +       Reference< XChangesBatch >(pset, UNO_QUERY_THROW)->commitChanges; +   } +    catch( Exception& ) +   { +    } +} +#endif // OOo4Kids + // class OfaMiscTabPage -- int OfaMiscTabPage::DeactivatePage( SfxItemSet* pSet_ ) @@ -212,6 +304,12 @@ 	aHelpAgentResetBtn	( this, SVX_RES( PB_HELPAGENT_RESET ) ), aHelpFormatFT		( this, SVX_RES( FT_HELPFORMAT ) ), aHelpFormatLB		( this, SVX_RES( LB_HELPFORMAT ) ), +#ifdef OOo4Kids +	aUserLevelFL       ( this, SVX_RES( FL_USERLEVEL ) ), +	aUserLevelBeginnerRB ( this, SVX_RES( RB_USERLEVEL_BEGINNER ) ), +	aUserLevelAverageRB  ( this, SVX_RES( RB_USERLEVEL_AVERAGE ) ), +	aUserLevelExpertRB   ( this, SVX_RES( RB_USERLEVEL_EXPERT ) ), +#endif aFileDlgFL			( this, SVX_RES( FL_FILEDLG ) ), aFileDlgROImage    ( this, SVX_RES( FI_FILEDLG_RO ) ), aFileDlgCB			( this, SVX_RES( CB_FILEDLG ) ), @@ -227,11 +325,20 @@ { 	FreeResource; +   //system fileopen only available in Windows and with gtk vclplug based +   //picker and on MacOSX (aqua version) +#if !defined( WNT ) && !defined( ENABLE_GTK ) && !( defined(MACOSX) && defined(QUARTZ) ) +   aFileDlgFL.Hide; +   aFileDlgCB.Hide; +#else +#	ifdef ENABLE_GTK if (!lcl_HasSystemFilePicker) {        aFileDlgFL.Hide; aFileDlgCB.Hide; } +#	endif +#endif #if ! defined(QUARTZ) aPrintDlgFL.Hide; @@ -310,6 +417,28 @@ 	aHelpAgentCB.SetClickHdl( aLink ); aHelpAgentResetBtn.SetClickHdl( LINK( this, OfaMiscTabPage, HelpAgentResetHdl_Impl ) ); +#ifdef OOo4Kids +   aUserLevelBeginnerRB.SetClickHdl( LINK( this, OfaMiscTabPage, UserLevelCheckHdl_Impl )); +   aUserLevelAverageRB.SetClickHdl( LINK( this, OfaMiscTabPage, UserLevelCheckHdl_Impl )); +   aUserLevelExpertRB.SetClickHdl( LINK( this, OfaMiscTabPage, UserLevelCheckHdl_Impl )); + +   // initialize the Radio button (User Level) +   switch ( getUserLevel ) +   { +        case USER_LEVEL_BEGINNER: +           aUserLevelBeginnerRB.SetState( TRUE ); +           break; +       case USER_LEVEL_AVERAGE: +           aUserLevelAverageRB.SetState( TRUE ); +           break; +       case USER_LEVEL_EXPERT: +           aUserLevelExpertRB.SetState( TRUE ); +           break; +       default: +           break; +   } +#endif // OOo4Kids +    //fill default names as user data static const char* aHelpFormatNames[] = { @@ -502,6 +631,30 @@ 	return 0; } +#ifdef OOo4Kids +IMPL_LINK( OfaMiscTabPage, UserLevelCheckHdl_Impl, RadioButton*, pButton ) +{ +	(void) pButton; +   if ( aUserLevelExpertRB.IsChecked ) +       setUserLevel( USER_LEVEL_EXPERT ); +   else if ( aUserLevelAverageRB.IsChecked ) +       setUserLevel( USER_LEVEL_AVERAGE ); +   else +       setUserLevel( USER_LEVEL_BEGINNER ); + +	return 0; +} +#endif // OOo4Kids + // --- // ---
 * 1) include 
 * 1) include "optgdlg.hrc"
 * 2) include "optgdlg.hxx"
 * 3) include "ofaitem.hxx"
 * 1) define MAX_PROGRAM_ENTRIES		3

En ce qui concerne le look, nous avons à placer correctement chaque bouton. La première idée (implémentée, mais peut être débattue) est :

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Niveau Utilisateur   : Débutant [X]               Moyen   [ ]                 Expert   [ ]

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Module : officecfg

 * Common.xcs va contenir le schéma, i.e. le prototype de la valeur née de la focntionnalité

Index: officecfg/registry/schema/org/openoffice/Office/Common.xcs

=
====================================================== --- officecfg/registry/schema/org/openoffice/Office/Common.xcs	(revision 275641) +++ officecfg/registry/schema/org/openoffice/Office/Common.xcs	(working copy) @@ -5697,6 +5697,13 @@ 				 false +			 +				 +					 ericb +					 Determines the level of difficulty of the features presented to the user +				 +				 1 +			 			


 * Common.xcu contient le niveau courant, sous forme d'un entier court, et dont la valeur initiale correspond à "débutant"

Index: officecfg/registry/data/org/openoffice/Office/Common.xcu

=
====================================================== --- officecfg/registry/data/org/openoffice/Office/Common.xcu	(revision 275641) +++ officecfg/registry/data/org/openoffice/Office/Common.xcu	(working copy) @@ -547,6 +547,9 @@     true +    +     1 +        


 * Setup.cxu va contenir, le chemin, dans le noeud "Misc" de la valeur "UserLevel" dans les préférences.

Index: officecfg/registry/data/org/openoffice/Setup.xcu

=
====================================================== --- officecfg/registry/data/org/openoffice/Setup.xcu	(revision 275641) +++ officecfg/registry/data/org/openoffice/Setup.xcu	(working copy) @@ -838,6 +838,7 @@            org.openoffice.Office.Common/Misc/SymbolSet org.openoffice.Office.Common/Misc/UseSystemFileDialog org.openoffice.Office.Common/Misc/UseSystemPrintDialog +           org.openoffice.Office.Common/Misc/UserLevel org.openoffice.Office.Common/Misc/SymbolStyle org.openoffice.Office.Common/Passwords org.openoffice.Office.Common/Print/PrintingModifiesDocument

Helpers for the implementation (UI only)
To reorganize the tab, the values below will be very helpfull:


 * 1) define WHOLE_WIDTH				248
 * 2) define EDIT_WIDTH				30
 * 3) define UNIT_WIDTH				40


 * 1) define COLSPACE				RSC_SP_CTRL_DESC_X
 * 2) define COL0					6
 * 3) define COL1					(COL0+6)
 * 4) define COL2					(COL1+10)
 * 5) define COL3					(COL2+100)
 * 6) define COL4					(COL3+COLSPACE)
 * 7) define COL5					(COL4+EDIT_WIDTH)
 * 8) define COL6					(COL5+COLSPACE)


 * 1) define ROWSPACE				RSC_SP_CTRL_DESC_Y
 * 2) define ROW0					3
 * 3) define ROW1					(ROW0+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE)
 * 4) define ROW2					(ROW1+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE)
 * 5) define ROW3					(ROW2+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE)
 * 6) define ROW4					(ROW3+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE)
 * 7) define ROW5                   (ROW4+RSC_CD_PUSHBUTTON_HEIGHT+ROWSPACE)
 * 8) define ROW6                   (ROW5+RSC_CD_DROPDOWN_HEIGHT+ROWSPACE)
 * 9) define ROW7					(ROW6+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE)
 * 10) define ROW8					(ROW7+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE)
 * 11) define ROW9					(ROW8+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE)
 * 12) define ROW10					(ROW9+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE)
 * 13) define ROW11					(ROW10+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE)