summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/oconfig.h
blob: 05a1a25bcf568d113f7b3f16134057a9342c5c9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
                             This file is part of the Opie Project

                             (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>

                             Inspired by the config classes from the KDE Project which are
              =.             (C) 1997 Matthias Kalle Dalheimer <kalle@kde.org>
            .=l.
           .>+-=
 _;:,     .>    :=|.         This program is free software; you can
.> <`_,   >  .   <=          redistribute it and/or  modify it under
:`=1 )Y*s>-.--   :           the terms of the GNU Library General Public
.="- .-=="i,     .._         License as published by the Free Software
 - .   .-<_>     .<>         Foundation; either version 2 of the License,
     ._= =}       :          or (at your option) any later version.
    .%`+i>       _;_.
    .i_,=:_.      -<s.       This program is distributed in the hope that
     +  .  -:.       =       it will be useful,  but WITHOUT ANY WARRANTY;
    : ..    .:,     . . .    without even the implied warranty of
    =_        +     =;=|`    MERCHANTABILITY or FITNESS FOR A
  _.=:.       :    :=>`:     PARTICULAR PURPOSE. See the GNU
..}^=.=       =       ;      Library General Public License for more
++=   -.     .`     .:       details.
 :     =  ...= . :.=-
 -.   .:....=;==+<;          You should have received a copy of the GNU
  -_. . .   )=.  =           Library General Public License along with
    --        :-=`           this library; see the file COPYING.LIB.
                             If not, write to the Free Software Foundation,
                             Inc., 59 Temple Place - Suite 330,
                             Boston, MA 02111-1307, USA.
*/

#ifndef OCONFIG_H
#define OCONFIG_H

//FIXME: Implement for X11 or reuse libqpe/Config there also?
//FIXME: Or rather use QSettings also for libqpe?

#include <qpe/config.h>

class QColor;
class QFont;

namespace Opie {
namespace Core {

/**
  * A Configuration class based on the Qtopia @ref Config class
  * featuring additional handling of color and font entries
  */

class OConfig : public Config
{
  public:
    /**
     * Constructs a OConfig object with a @a name.
     */
    OConfig( const QString &name, Domain domain = User );
    /**
     * Destructs the OConfig object.
     *
     * Writes back any dirty configuration entries, and destroys
     * dynamically created objects.
     */
    virtual ~OConfig();
    /**
     * @returns the name of the current group.
     * The current group is used for searching keys and accessing entries.
     * @todo make const
     */
    const QString& group()const { return git.key(); };
    /**
     * @returns a @ref QColor entry or a @a default value if the key is not found.
     */
    QColor readColorEntry( const QString& key, const QColor* pDefault ) const;
    /**
     * @returns a @ref QFont value or a @a default value if the key is not found.
     */
    QFont readFontEntry( const QString& key, const QFont* pDefault ) const;

private:
    class Private;
    Private *d;
};

/**
 * @brief Helper class for easier use of OConfig groups.
 *
 * Careful programmers always set the group of a
 * @ref OConfig object to the group they want to read from
 * and set it back to the old one of afterwards. This is usually
 * written as:
 * <pre>
 *
 * QString oldgroup config()->group();
 * config()->setGroup( "TheGroupThatIWant" );
 * ...
 * config()->writeEntry( "Blah", "Blubb" );
 *
 * config()->setGroup( oldgroup );
 * </pre>
 *
 * In order to facilitate this task, you can use
 * OConfigGroupSaver. Simply construct such an object ON THE STACK
 * when you want to switch to a new group. Then, when the object goes
 * out of scope, the group will automatically be restored. If you
 * want to use several different groups within a function or method,
 * you can still use OConfigGroupSaver: Simply enclose all work with
 * one group (including the creation of the OConfigGroupSaver object)
 * in one block.
 *
 * \code
 * OConfigGroupSaver saver(cfg,"TheGroupThatInWhat");
 * \endcode
 *
 * Note that OConfigGroupSaver (cfg,"TheGroupThatInWhat"); would get imediately
 * destructed after created and that you would save in the old group which
 * is unwished.
 *
 * @author Matthias Kalle Dalheimer <Kalle@kde.org>
 * @version $Id$
 * @see OConfig
 */

class OConfigGroupSaver
{
  public:
    /**
     * Constructor.
     * Create the object giving a OConfig object and a @a group to become
     * the current group.
     */
    OConfigGroupSaver( OConfig* config, QString group ) :_config(config), _oldgroup(config->group() )
        { _config->setGroup( group ); }

    OConfigGroupSaver( OConfig* config, const char *group ) :_config(config), _oldgroup(config->group())
        { _config->setGroup( group ); }

    OConfigGroupSaver( OConfig* config, const QCString &group ) : _config(config), _oldgroup(config->group())
        { _config->setGroup( group ); }
    /**
     * Destructor.
     * Restores the last current group.
     * @todo make it not inline for bc reasons. See KDE BC guide
     */
    ~OConfigGroupSaver() { _config->setGroup( _oldgroup ); }

    OConfig* config() { return _config; };

  private:
    OConfig* _config;
    QString _oldgroup;

    OConfigGroupSaver( const OConfigGroupSaver& );
    OConfigGroupSaver& operator=( const OConfigGroupSaver& );

    class Private;
    Private *d;
};
}
}

#endif // OCONFIG_H