ToolbarsAndUserLevel/fi

From Wiki.ooo4kids.org

Jump to: navigation, search

DRF Back alt.png OOo4Kids

Osaamistason mukaiset työkalupalkit


Kaikkia alkuperäiseen OpenOffice.org-lähdekoodiin tällä sivulla esitettyjä muutoksia koskee:


Johdanto

Below, you'll find a technical description of the Toolbars depending on the User Level feature implementation. It's question there of : the C++ source code, the graphical layout - on the User Interface side, of the UNO Layout manager, of toolbars management in the sfx2 workwin, and some other technical points like read the User Level using the config manager. We suppose that the reader has the minimal knowledge to read and understand the content of what is exposed in this page.

The pre-requisites to read this article have still to be defined, but if ever the reader is not familiar with some points, we invite him to consult the OpenOffice.org wiki to complete his knowlege, and thus, to read this article in the best possible conditions.


Tavoite

Tämä ominaisuus liittyy osaamistason valintaan asetuksista ja tavoitteena on saada yksi uusi työkalupalkki tasoa kohti moduuleihin:

Samaa työkalupalkkia käytetään jokaisessa sovelluksessa( Writer, Calc, Draw, Math, Impress, Chart). Idean mukaisesti käytetään:

Sääntö: vain yksi edellisistä työkalupalkeista kerrallaan on aktiivisena.


Määrittelyt

Tarpeet on kuvailtu wiki-sivulla Ideas and Suggestions (ranskaksi).

Odotettu toiminta: kun tasoa vaihdetaan asetuksista ( napsauta kuvaa sen suurentamiseksi), päätyökalupalkki vaihtuu.


UserLevel UI 4FI.png


Writer (esimerkkinä)

Ehdotuksen mukaisesti tarkoituksena on saada yksi omanlaisensa palkki osaamis- tai käyttäjätasoa kohti.

Ehdotus ei koske vain Writeria, vaan ominaisuus laajennetaan muihin sovelluksiin ( odotetaan opettajien ehdotuksia).

Alkaja-taso

Tarkoitettu 8...9-vuotiaille:

Barre cycle2.png

Osaaja-taso

Tarkoitettu 10...11-vuotiaille:

Barre cycle3.png


Taituri-taso

Yli 11-vuotiaille lapsille:

Barre standard.png


Koodissa

Kehitteillä

-> OOo4Kidsiä koskevat muutokset on suojattu #ifdef OOo4Kids ... #endif -määreillä.


Käsiteltävät moduulit

In fact the feature has two sides, who must be considered there :

Last : keep the possibility to add other toolbars (needs to be confirmed).

This is NOT the final solution: sc, sfx2, svx, svx use the same code to check the User Level in the Common.xcu file, and some code cleanup and factorization will be mandatory soon. Probably, tools or configmgr are the right place, to implement a class allowing to read in the Common.xcu, but this needs some love and investigations. Probably after 1.0



Moduuli svx

Allaolevat osat pitää muokata tiedostossa optgdlg.cxx (joka on hakemistossa svx/source/cui):

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 const OUString sULaNode( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Misc" ) );
static const OUString sULPropertyName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserLevel" ) ) );

Muutkin merkkijonot ovat hyödyksi:

/* mukauta työkalupalkit tasoon */

static const OUString aLayoutManagerPropName( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ) );

// The alignment bar
// static const OUString sAlignmentToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/alignmentbar" ) );
// The standard toolbar
static const OUString sStandardbarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/standardbar" ) );
// The beginner toolbar (every application has its own)
static const OUString sBeginnerbarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/beginner" ) );
// The average toolbar (every application has its own)
static const OUString sAveragebarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/average" ) );



static short setToolbarState( const OUString sSetAToolbarTypeName, bool isTrue )
{
    try
    {
        // avoids a crash if ever the user opens the prefs while the start center is the current view
        if ( ! (SfxViewFrame::Current()) )
            return -1;
        
        Reference< XPropertySet > xPropSet( SfxViewFrame::Current()->GetFrame()->GetFrameInterface(), UNO_QUERY );
        Reference< XLayoutManager > xLayoutManager;

        if ( xPropSet.is() )
        {
            Any aValue = xPropSet->getPropertyValue( aLayoutManagerPropName );
            aValue >>= xLayoutManager;
        }

        if ( !xLayoutManager.is() )
            return -1;
        else
        {
            xLayoutManager->lock();

            if ( isTrue )
                xLayoutManager->requestElement( sSetAToolbarTypeName );
            else
                xLayoutManager->destroyElement( sSetAToolbarTypeName );

            // should refresh, but does not when showElement() is used
            xLayoutManager->unlock();
        }
    }
    catch( Exception& )
    {
    }
    return 0;
}


Note: the toolbar are initialized in same time as the RadioButton.


    // initialize the Radio button (User Level)
    switch ( getUserLevel() )
    {
        case USER_LEVEL_BEGINNER:
        {
#ifdef DEBUG
	    fprintf(stdout, " %s : User level beginner \n", __func__);
#endif

            setToolbarState( sStandardbarToolbarTypeName, false);
            setToolbarState( sBeginnerbarToolbarTypeName, true );
            setToolbarState( sAveragebarToolbarTypeName, false);
            aUserLevelBeginnerRB.SetState( TRUE );
        }
            break;

        case USER_LEVEL_AVERAGE:
        {
#ifdef DEBUG
            fprintf(stdout, " %s : User level average \n", __func__);
#endif

            setToolbarState( sStandardbarToolbarTypeName, false);
            setToolbarState( sBeginnerbarToolbarTypeName, false );
            setToolbarState( sAveragebarToolbarTypeName, true);
            aUserLevelAverageRB.SetState( TRUE );
        }
            break;    

        case USER_LEVEL_EXPERT:
        {
#ifdef DEBUG
            fprintf(stdout, " %s : User level expert \n", __func__);
#endif
          aUserLevelExpertRB.SetState( TRUE );

            setToolbarState( sStandardbarToolbarTypeName, true );
            setToolbarState( sBeginnerbarToolbarTypeName, false );
            setToolbarState( sAveragebarToolbarTypeName, false);

        }
            break;
        default:
            break;
    }
#endif // OOo4Kids



Note: to be sure,only one is set, while the two other are reset, for every user level.



#ifdef OOo4Kids
IMPL_LINK( OfaMiscTabPage, UserLevelCheckHdl_Impl, RadioButton*, pButton )
{
	(void) pButton;
    if ( aUserLevelExpertRB.IsChecked() )
    {
        setUserLevel( USER_LEVEL_EXPERT );

        setToolbarState( sStandardbarToolbarTypeName, true );
        setToolbarState( sBeginnerbarToolbarTypeName, false );
        setToolbarState( sAveragebarToolbarTypeName, false);
    }
    
    else if ( aUserLevelAverageRB.IsChecked() )
    {
        setUserLevel( USER_LEVEL_AVERAGE );

        setToolbarState( sStandardbarToolbarTypeName, false );
        setToolbarState( sBeginnerbarToolbarTypeName, false );
        setToolbarState( sAveragebarToolbarTypeName, true);
    }

    else
    {
        setUserLevel( USER_LEVEL_BEGINNER );

        setToolbarState( sStandardbarToolbarTypeName, false );
        setToolbarState( sBeginnerbarToolbarTypeName, true );
        setToolbarState( sAveragebarToolbarTypeName, false);
    }
    return 0;
}



Moduuli sfx2

Everything has been done in sfx2/source/appl/workwin.cxx. The role of the SfxWorkWindow is extremely important: for every new document, the toolbars to be drawn will be checked there. Other case: when closing the preference dialog box ( Modal dialog box)


What has been done:

// The standard toolbar
static const OUString sStandardbarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/standardbar" ) );
// The beginner toolbar (every application has its own)
static const OUString sBeginnerbarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/beginner" ) );
// The average toolbar (every application has its own)
static const OUString sAveragebarToolbarTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/average" ) );
// Generic constants
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;
}


Note: random values ... found no information in the code.

static const ResIdToResName pToolBarResToName[] =
{
    { 558,      "fullscreenbar"        },
    { 560,      "standardbar",         },

...

#ifdef OOo4Kids
    { 20001,    "beginner"      },      //writer
    { 20002,    "average"       },      //writer
#endif

...

Note: unlock the LayoutManager, triggers the refresh, but when the User Level is modified in the prefs, the refresh is triggered only when the dialog box (basically a modal window) is closed.


....

void SfxWorkWindow::UpdateObjectBars_Impl()
{

#ifdef OOo4Kids
        short int nUserLevel = getUserLevel();
        rtl::OUString aTbxId( m_aTbxTypeName );
        aTbxId += GetResourceURLFromResId( aObjBarList[n].nId );

        switch ( nUserLevel ) 
        {
            case USER_LEVEL_BEGINNER:
              {
#ifdef DEBUG
                fprintf(stdout, " %s : User level beginner \n", __func__);
                fprintf(stdout, "nId = %d \n", nId );
                fprintf(stdout, "aTbxId = %s \n", dbg_dump( aTbxId) );
#endif
                //xLayoutManager->showElement( sBeginnerbarToolbarTypeName );
                xLayoutManager->requestElement( sBeginnerbarToolbarTypeName );
                xLayoutManager->destroyElement( sAveragebarToolbarTypeName );
                xLayoutManager->destroyElement( sStandardbarToolbarTypeName );
              }
                break;

            case USER_LEVEL_AVERAGE:
              {
#ifdef DEBUG
                fprintf(stdout, " %s : User level average \n", __func__);
                fprintf(stdout, " nId = %d \n", nId );
#endif
                //xLayoutManager->showElement( sAveragebarToolbarTypeName );
                xLayoutManager->requestElement( sAveragebarToolbarTypeName );
                xLayoutManager->destroyElement( sBeginnerbarToolbarTypeName );
                xLayoutManager->destroyElement( sStandardbarToolbarTypeName );
              }
                break;

            case USER_LEVEL_EXPERT:
              {
#ifdef DEBUG
                fprintf(stdout, " %s : User level expert \n", __func__);
                fprintf(stdout, " nId = %d \n", nId );
#endif
                //xLayoutManager->showElement( sStandardbarToolbarTypeName );
                xLayoutManager->requestElement( sStandardbarToolbarTypeName );
                xLayoutManager->destroyElement( sBeginnerbarToolbarTypeName );
                xLayoutManager->destroyElement( sAveragebarToolbarTypeName );
              }
                break;

            default:
                break;        
        }
#endif // OOo4Kids

...

}
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox