summaryrefslogtreecommitdiffstats
path: root/kdeui/keditlistbox.h
blob: bd8b19a64ed432c02328d1969e6455bc92ef115c (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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/* This file is part of the KDE libraries
    Copyright (C) 2000 David Faure <[email protected]>, Alexander Neundorf <[email protected]>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef KEDITLISTBOX_H
#define KEDITLISTBOX_H

#include <tqgroupbox.h>
#include <tqlistbox.h>

#include <kdelibs_export.h>

class KLineEdit;
class KComboBox;
class TQPushButton;

class KEditListBoxPrivate;
/**
 * An editable listbox
 *
 * This class provides a editable listbox ;-), this means
 * a listbox which is accompanied by a line edit to enter new
 * items into the listbox and pushbuttons to add and remove
 * items from the listbox and two buttons to move items up and down.
 *
 * \image html keditlistbox.png "KDE Edit List Box Widget"
 *
 */
class KDEUI_EXPORT KEditListBox : public TQGroupBox
{
   Q_OBJECT
   TQ_OBJECT

   TQ_SETS( Button )
   TQ_PROPERTY( Button buttons READ buttonsProp WRITE setButtonsProp )
   TQ_PROPERTY( TQStringList items READ items WRITE setItems )

public:
   class CustomEditor;

   public:

      /**
       * Enumeration of the buttons, the listbox offers. Specify them in the
       * constructor in the buttons parameter, or in setButtons.
       */
      enum Button { Add = 1, Remove = 2, UpDown = 4 };
      enum { All = Add|Remove|UpDown }; // separated so that it doesn't appear in Qt designer

      /**
       * Create an editable listbox.
       *
       * If @p checkAtEntering is true, after every character you type
       * in the line edit KEditListBox will enable or disable
       * the Add-button, depending whether the current content of the
       * line edit is already in the listbox. Maybe this can become a
       * performance hit with large lists on slow machines.
       * If @p checkAtEntering is false,
       * it will be checked if you press the Add-button. It is not
       * possible to enter items twice into the listbox.
       */
      KEditListBox(TQWidget *parent = 0, const char *name = 0,
		   bool checkAtEntering=false, int buttons = All );
      /**
       * Create an editable listbox.
       *
       * The same as the other constructor, additionally it takes
       * @p title, which will be the title of the frame around the listbox.
       */
      KEditListBox(const TQString& title, TQWidget *parent = 0,
		   const char *name = 0, bool checkAtEntering=false,
		   int buttons = All );

      /**
       * Another constructor, which allows to use a custom editing widget
       * instead of the standard KLineEdit widget. E.g. you can use a
       * KURLRequester or a KComboBox as input widget. The custom
       * editor must consist of a lineedit and optionally another widget that
       * is used as representation. A KComboBox or a KURLRequester have a
       * KLineEdit as child-widget for example, so the KComboBox is used as
       * the representation widget.
       *
       * @see KURLRequester::customEditor()
       * @since 3.1
       */
      KEditListBox( const TQString& title,
                    const CustomEditor &customEditor,
                    TQWidget *parent = 0, const char *name = 0,
                    bool checkAtEntering = false, int buttons = All );

      virtual ~KEditListBox();

      /**
       * Return a pointer to the embedded TQListBox.
       */
      TQListBox* listBox() const     { return m_listBox; }
      /**
       * Return a pointer to the embedded TQLineEdit.
       */
      KLineEdit* lineEdit() const     { return m_lineEdit; }
      /**
       * Return a pointer to the Add button
       */
      TQPushButton* addButton() const     { return servNewButton; }
      /**
       * Return a pointer to the Remove button
       */
      TQPushButton* removeButton() const     { return servRemoveButton; }
      /**
       * Return a pointer to the Up button
       */
      TQPushButton* upButton() const     { return servUpButton; }
      /**
       * Return a pointer to the Down button
       */
      TQPushButton* downButton() const     { return servDownButton; }

      /**
       * See TQListBox::count()
       */
      int count() const   { return int(m_listBox->count()); }
      /**
       * See TQListBox::insertStringList()
       */
      void insertStringList(const TQStringList& list, int index=-1);
      /**
       * See TQListBox::insertStringList()
       */
      void insertStrList(const TQStrList* list, int index=-1);
      /**
       * See TQListBox::insertStrList()
       */
      void insertStrList(const TQStrList& list, int index=-1);
      /**
       * See TQListBox::insertStrList()
       */
      void insertStrList(const char ** list, int numStrings=-1, int index=-1);
      /**
       * See TQListBox::insertItem()
       */
      void insertItem(const TQString& text, int index=-1) {m_listBox->insertItem(text,index);}
      /**
       * Clears both the listbox and the line edit.
       */
      void clear();
      /**
       * See TQListBox::text()
       */
      TQString text(int index) const { return m_listBox->text(index); }
      /**
       * See TQListBox::currentItem()
       */
      int currentItem() const;
      /**
       * See TQListBox::currentText()
       */
      TQString currentText() const  { return m_listBox->currentText(); }

      /**
       * @returns a stringlist of all items in the listbox
       */
      TQStringList items() const;

      /**
       * Clears the listbox and sets the contents to @p items
       *
       * @since 3.4
       */
      void setItems(const TQStringList& items);

      /**
       * Returns which buttons are visible
       */
      int buttons() const;
      inline Button buttonsProp() const { return (Button)buttons(); }

      /**
       * Specifies which buttons should be visible
       */
      void setButtons( uint buttons );
      inline void setButtonsProp( Button buttons ) { setButtons((uint)buttons); }

   signals:
      void changed();

      /**
       * This signal is emitted when the user adds a new string to the list,
       * the parameter is the added string.
       * @since 3.2
       */
      void added( const TQString & text );

      /**
       * This signal is emitted when the user removes a string from the list,
       * the parameter is the removed string.
       * @since 3.2
       */
      void removed( const TQString & text );

   protected slots:
      //the names should be self-explaining
      void moveItemUp();
      void moveItemDown();
      void addItem();
      void removeItem();
      void enableMoveButtons(int index);
      void typedSomething(const TQString& text);

   private:
      TQListBox *m_listBox;
      TQPushButton *servUpButton, *servDownButton;
      TQPushButton *servNewButton, *servRemoveButton;
      KLineEdit *m_lineEdit;

      //this is called in both ctors, to avoid code duplication
      void init( bool checkAtEntering, int buttons,
                 TQWidget *representationWidget = 0L );

   protected:
      virtual void virtual_hook( int id, void* data );
   private:
      //our lovely private d-pointer
      KEditListBoxPrivate* const d;

    /**
     * Custom editor class
     *
     * @since 3.1
     **/
    // ### KDE4: add virtual destructor
    public:
    class CustomEditor
    {
    public:
        KDEUI_EXPORT CustomEditor()
            : m_representationWidget( 0L ),
              m_lineEdit( 0L ) {}
        KDEUI_EXPORT CustomEditor( TQWidget *repWidget, KLineEdit *edit )
            : m_representationWidget( repWidget ),
              m_lineEdit( edit ) {}
        KDEUI_EXPORT CustomEditor( KComboBox *combo );

        KDEUI_EXPORT void setRepresentationWidget( TQWidget *repWidget ) {
            m_representationWidget = repWidget;
        }
        KDEUI_EXPORT void setLineEdit( KLineEdit *edit ) {
            m_lineEdit = edit;
        }

        KDEUI_EXPORT virtual TQWidget   *representationWidget() const {
            return m_representationWidget;
        }
        KDEUI_EXPORT  virtual KLineEdit *lineEdit() const {
            return m_lineEdit;
        }

    protected:
        TQWidget *m_representationWidget;
        KLineEdit *m_lineEdit;
    };
};

#endif