ChooseLevelInPrefs
From OOo4Kids
|
Choose Level in the Prefs |
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.
Goal
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 @@
#include <readonlyimage.hxx>
#define FOLDERWEBVIEW_DEFAULTFILE "folder.so"
+#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 );
- svx/source/cui/optgdlg.hrc : contains predefined constants
Index: svx/source/cui/optgdlg.hrc =================================================================== --- svx/source/cui/optgdlg.hrc (revision 275641) +++ svx/source/cui/optgdlg.hrc (working copy) @@ -202,6 +202,12 @@ #define FT_HELPAGENT_TIME_UNIT 59 #define FL_DOCSTATUS 60 #define CB_DOCSTATUS 61 + +#define FL_USERLEVEL 62 +#define RB_USERLEVEL_BEGINNER 63 +#define RB_USERLEVEL_AVERAGE 64 +#define RB_USERLEVEL_EXPERT 65 + #endif // #ifndef _SVX_OPTGDLG_HRC // ******************************************************************* EOF
- svx/source/cui/optgdlg.cxx : implementation od the dialog box, and, for instance of our UserLevelSettings class
Index: svx/source/cui/optgdlg.cxx
===================================================================
--- svx/source/cui/optgdlg.cxx (revision 275641)
+++ svx/source/cui/optgdlg.cxx (working copy)
@@ -106,6 +106,10 @@
#include <vcl/svapp.hxx>
+#ifdef OOo4Kids
+#include "vcl/unohelp.hxx"
+#endif
+
#include "optgdlg.hrc"
#include "optgdlg.hxx"
#include "ofaitem.hxx"
@@ -127,6 +131,94 @@
#define MAX_PROGRAM_ENTRIES 3
+#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
+
// -----------------------------------------------------------------------
// -------------------------------------------------------------------
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 @@ </info> <value>false</value> </prop> + <prop oor:name="UserLevel" oor:type="xs:short"> + <info> + <author>ericb</author> + <desc> Determines the level of difficulty of the features presented to the user</desc> + </info> + <value>1</value> + </prop> <prop oor:name="SymbolSet" oor:type="xs:short"> <!-- UIHints: Tools Options General View --> <info>
- 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 @@
<prop oor:name="UseSystemPrintDialog" install:module="macosx">
<value>true</value>
</prop>
+ <prop oor:name="UserLevel" oor:type="xs:short">
+ <value>1</value>
+ </prop>
</node>
<node oor:name="Save">
<node oor:name="Document">
- 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:
#define WHOLE_WIDTH 248 #define EDIT_WIDTH 30 #define UNIT_WIDTH 40 #define COLSPACE RSC_SP_CTRL_DESC_X #define COL0 6 #define COL1 (COL0+6) #define COL2 (COL1+10) #define COL3 (COL2+100) #define COL4 (COL3+COLSPACE) #define COL5 (COL4+EDIT_WIDTH) #define COL6 (COL5+COLSPACE) #define ROWSPACE RSC_SP_CTRL_DESC_Y #define ROW0 3 #define ROW1 (ROW0+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE) #define ROW2 (ROW1+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE) #define ROW3 (ROW2+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE) #define ROW4 (ROW3+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE) #define ROW5 (ROW4+RSC_CD_PUSHBUTTON_HEIGHT+ROWSPACE) #define ROW6 (ROW5+RSC_CD_DROPDOWN_HEIGHT+ROWSPACE) #define ROW7 (ROW6+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE) #define ROW8 (ROW7+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE) #define ROW9 (ROW8+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE) #define ROW10 (ROW9+RSC_CD_CHECKBOX_HEIGHT+ROWSPACE) #define ROW11 (ROW10+RSC_CD_FIXEDLINE_HEIGHT+ROWSPACE)


