ChooseLevelInPrefs

All the changes added to the original OpenOffice.org source code provided in this page, are :


 * '''Under LGPLv3 license ( and you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation)
 * Copyright Eric Bachard 1st September 2009

Thanks to Eike Rathke, Thorsten Behrens and Cédric Bosdonnat for their precious advices.

Specifications

 * Modify the preferences, to allow the choice of the user's level, between : beginner, average, expert
 * Horizontal radio buttons : only one button active
 * The default behavior (at first OOo4Kids launch) will be beginner

As shown below :



Examples of use

 * In Calc, all the functions are there, but not listed :
 * with the beginner level defined, only a few functions will appear in the functions list.
 * average means between 30 to 40 functions will appear
 * expert : all functions are listed


 * In Writer (just an idea) : depending on the level we could show more or less of possibilities of styles


 * In the Writer wizard, depending on the level, we could propose some templates, or some other


 * (add your idea )

In the code
We'll use the MiscTabPage class and inherited, to implement the new option.

Done :
 * add the new objects in the OfaMiscTabPage contructor
 * aUserLevelFL ( Fixed Line )
 * aUserLevelBeginnerRB ( Radio Button )
 * aUserLevelAverageRB ( Radio Button )
 * aUserLevelExpertRB ( Radio Button )
 * Declare them in the header file (optgdlg.hxx)
 * Implement static methods (at the beginning) to:
 * read the value, named UserLevel in the prefs, means in Common.xcu, in the Misc Node
 * know the current active RadioButton
 * Handle a Radio Button click ( will be a callback )

Everything seems to work :  :


 * the UI is ok
 * the .xcu seems to work, and the value is readable in the Common.xcu file, in the $SYSUSERCONFIG directory
 * initialize the button is OK
 * read the values from the config is OK
 * click, and see the new button activated (only one in the same time) is OK
 * start with a given value : initialization is ok, all cases verified is OK
 * write the value in the prefs is OK
 * verify the value is modified : validate the change, click OK, reopen the prefs and the change is still there : is OK

Please report us any issue you found.

Module : svx
For the prefs, everything is mostly located in svx (other are in sfx2/source/dialog), and svx/source/cui/optgdlg.hrc does contain nice information, like the columns an lines, dimensions. svx/source/cui/optgdlg.src is the place where to verify it works

Concerned files :


 * svx/source/cui/optgdlg.src : contains the dialog box distributions of everything (buttons, lists .. and so on )

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 : header of the options dialog

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 : contains predefined constants

=
====================================================== --- 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 : implementation od the dialog box, and, for instance of our UserLevelSettings class

=
====================================================== --- 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

For the look, we'll have to place the right position of every button. The first (to be debated) idea is :

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

Level   : Beginner [X]                 Average    [ ]                 Expert   [ ]

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

Module : officecfg

 * Common.xcs will contain the schema i.e. prototype of the value

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 will contain the initial value "beginner"

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 will contain the path in "Misc" node, for the value "UserLevel" in the prefs

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)