~ubuntu-branches/ubuntu/precise/gtkmm3.0/precise

« back to all changes in this revision

Viewing changes to gtk/src/entrycompletion.hg

  • Committer: Bazaar Package Importer
  • Author(s): Michael Biebl
  • Date: 2011-06-17 00:12:44 UTC
  • Revision ID: james.westby@ubuntu.com-20110617001244-9hl5an15hiaaahi6
Tags: upstream-3.0.1
ImportĀ upstreamĀ versionĀ 3.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: entrycompletion.hg,v 1.24 2006/07/19 16:58:50 murrayc Exp $ */
 
2
 
 
3
/* Copyright (C) 2003 The gtkmm Development Team
 
4
 *
 
5
 * This library is free software; you can redistribute it and/or
 
6
 * modify it under the terms of the GNU Lesser General Public
 
7
 * License as published by the Free Software Foundation; either
 
8
 * version 2.1 of the License, or (at your option) any later version.
 
9
 *
 
10
 * This library is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
13
 * Lesser General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU Lesser General Public
 
16
 * License along with this library; if not, write to the Free
 
17
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
18
 */
 
19
 
 
20
#include <gtkmm/widget.h>
 
21
#include <gtkmm/celllayout.h>
 
22
#include <gtkmm/treemodel.h>
 
23
 
 
24
_DEFS(gtkmm,gtk)
 
25
_PINCLUDE(glibmm/private/object_p.h)
 
26
 
 
27
 
 
28
namespace Gtk
 
29
{
 
30
 
 
31
class Entry;
 
32
 
 
33
//TODO: we should add "It derives from the Gtk::CellLayout, to allow the user to add extra cells to the Gtk::TreeView with completion matches".
 
34
 
 
35
/** Completion functionality for Gtk::Entry.
 
36
 *
 
37
 * Gtk::EntryCompletion is an auxiliary object to be used in conjunction with 
 
38
 * Gtk::Entry to provide the completion functionality. 
 
39
 * 
 
40
 * "Completion functionality" means that when the user modifies the text in the 
 
41
 * entry, Gtk::EntryCompletion checks which rows in the model match the current 
 
42
 * content of the entry, and displays a list of matches. By default, the
 
43
 * matching is done by comparing the entry text case-insensitively against 
 
44
 * the text column of the model (see set_text_column()), 
 
45
 * but this can be overridden with a custom match function (see set_match_func()).
 
46
 *
 
47
 * When the user selects a completion, the content of the entry is updated. 
 
48
 * By default, the content of the entry is replaced by the text column of the 
 
49
 * model, but this can be overridden by connecting to the match_selected signal 
 
50
 * and updating the entry in the signal handler. Note that you should return true 
 
51
 * from the signal handler to suppress the default behaviour.
 
52
 * 
 
53
 * To add completion functionality to an entry, use Gtk::Entry::set_completion().
 
54
 * 
 
55
 * In addition to regular completion matches, which will be inserted into 
 
56
 * the entry when they are selected, Gtk::EntryCompletion also allows the display of  
 
57
 * "actions" in the popup window. Their appearance is similar to menu items, 
 
58
 * to differentiate them clearly from completion strings. When an action is 
 
59
 * selected, the action_activated signal is emitted. 
 
60
 */
 
61
class EntryCompletion
 
62
 : public Glib::Object,
 
63
   public Gtk::CellLayout,
 
64
   public Gtk::Buildable
 
65
{
 
66
  _CLASS_GOBJECT(EntryCompletion, GtkEntryCompletion, GTK_ENTRY_COMPLETION, Glib::Object, GObject)
 
67
  _IMPLEMENTS_INTERFACE(CellLayout)
 
68
  _IMPLEMENTS_INTERFACE(Buildable)
 
69
 
 
70
protected:
 
71
  _CTOR_DEFAULT()
 
72
 
 
73
public:
 
74
  _WRAP_CREATE()
 
75
 
 
76
  //Careful, this actually returns a GtkWidget*, so it might not always be a GtkEntry in future GTK+ versions.
 
77
  _WRAP_METHOD(Entry* get_entry(), gtk_entry_completion_get_entry)
 
78
  _WRAP_METHOD(const Entry* get_entry() const, gtk_entry_completion_get_entry)
 
79
 
 
80
  _WRAP_METHOD(void set_model(const Glib::RefPtr<TreeModel>& model), gtk_entry_completion_set_model)
 
81
  _WRAP_METHOD(Glib::RefPtr<TreeModel> get_model(), gtk_entry_completion_get_model, refreturn)
 
82
  _WRAP_METHOD(Glib::RefPtr<const TreeModel> get_model() const, gtk_entry_completion_get_model, refreturn, constversion)
 
83
 
 
84
  /** Remove the model from the EntryCompletion.
 
85
   *
 
86
   * @see set_model().
 
87
   *
 
88
   * @newin{2,16}
 
89
   */
 
90
  void unset_model();
 
91
 
 
92
  /// For example, bool on_match(const Glib::ustring& key, const TreeModel::const_iterator& iter);
 
93
  typedef sigc::slot<bool, const Glib::ustring&, const TreeModel::const_iterator&> SlotMatch;
 
94
  
 
95
  void set_match_func(const SlotMatch& slot);
 
96
  _IGNORE(gtk_entry_completion_set_match_func)
 
97
  
 
98
  _WRAP_METHOD(void set_minimum_key_length(int length), gtk_entry_completion_set_minimum_key_length)
 
99
  _WRAP_METHOD(int get_minimum_key_length() const, gtk_entry_completion_get_minimum_key_length)
 
100
  _WRAP_METHOD(void complete(), gtk_entry_completion_complete)
 
101
 
 
102
  _WRAP_METHOD(void insert_prefix(), gtk_entry_completion_insert_prefix)
 
103
 
 
104
  //We reordered the parameters, compared to the C version, so that we can have method overloads without the index.
 
105
 
 
106
  // TODO: We would really like an insert() which before-inserts an iterator, like ListStore::insert(),
 
107
  // but there is no EntryCompletion::insert_before() for us to use.
 
108
  void insert_action_text(const Glib::ustring& text, int index);
 
109
  void prepend_action_text(const Glib::ustring& text);
 
110
  //TODO: Add append_action_text() somehow? It would be slow if we count the children each time. murrayc.
 
111
  _IGNORE(gtk_entry_completion_insert_action_text)
 
112
  void insert_action_markup(const Glib::ustring& markup, int index);
 
113
  void prepend_action_markup(const Glib::ustring& markup);
 
114
  _IGNORE(gtk_entry_completion_insert_action_markup)
 
115
 
 
116
  //TODO: Change default - it would be nicer to delete the last action instead of the first.
 
117
  _WRAP_METHOD(void delete_action(int index = 0), gtk_entry_completion_delete_action)
 
118
 
 
119
  _WRAP_METHOD(void set_inline_completion(bool inline_completion = true), gtk_entry_completion_set_inline_completion)
 
120
  _WRAP_METHOD(bool get_inline_completion() const, gtk_entry_completion_get_inline_completion)
 
121
  _WRAP_METHOD(void set_inline_selection(bool inline_selection = true), gtk_entry_completion_set_inline_selection)
 
122
  _WRAP_METHOD(bool get_inline_selection() const, gtk_entry_completion_get_inline_selection)
 
123
  _WRAP_METHOD(void set_popup_completion(bool popup_completion = true), gtk_entry_completion_set_popup_completion)
 
124
  _WRAP_METHOD(bool get_popup_completion() const, gtk_entry_completion_get_popup_completion)
 
125
 
 
126
  _WRAP_METHOD(void set_popup_set_width(bool popup_set_width = true), gtk_entry_completion_set_popup_set_width)
 
127
  _WRAP_METHOD(bool get_popup_set_width() const, gtk_entry_completion_get_popup_set_width)
 
128
 
 
129
  _WRAP_METHOD(void set_popup_single_match(bool popup_single_match = true), gtk_entry_completion_set_popup_single_match)
 
130
 
 
131
  _WRAP_METHOD(bool get_popup_single_match() const, gtk_entry_completion_get_popup_single_match)
 
132
  _WRAP_METHOD(Glib::ustring get_completion_prefix() const, gtk_entry_completion_get_completion_prefix)
 
133
 
 
134
  _WRAP_METHOD(void set_text_column(const TreeModelColumnBase& column), gtk_entry_completion_set_text_column)
 
135
  _WRAP_METHOD(void set_text_column(int column), gtk_entry_completion_set_text_column)
 
136
  _WRAP_METHOD(int get_text_column() const, gtk_entry_completion_get_text_column)
 
137
 
 
138
  /** Emitted when an action is activated.
 
139
   *
 
140
   * @param index The index of the activated action.
 
141
   */
 
142
  _WRAP_SIGNAL(void action_activated(int index), action_activated)
 
143
 
 
144
  //We completely hand-code these signals because we want to change how the parameters are wrapped,
 
145
  //because we need both the iter and the model to make the C++ iter.
 
146
  _IGNORE_SIGNAL(match_selected)
 
147
  _IGNORE_SIGNAL(cursor_on_match)
 
148
 
 
149
  /** Emitted when a match from the list is selected. 
 
150
   * The default behaviour is to replace the contents of the 
 
151
   * entry with the contents of the text column in the row 
 
152
   * pointed to by @a iter.
 
153
   *
 
154
   * It is necessary to connect your signal handler <i>before</i>
 
155
   * the default one, which would otherwise return <tt>true</tt>,
 
156
   * a value which signifies that the signal has been handled,
 
157
   * thus preventing any other handler from being invoked.
 
158
   *
 
159
   * To do this, pass <tt>false</tt> to this signal proxy's
 
160
   * <tt>connect()</tt> method. For example:
 
161
   * <tt> completion->signal_match_selected().connect(sigc::mem_fun(*this, &YourClass::on_completion_match_selected), false); </tt>
 
162
   *
 
163
   * @param model The TreeModel containing the matches
 
164
   * @param iter A TreeModel::iterator positioned at the selected match
 
165
   * @result true if the signal has been handled
 
166
   * 
 
167
   * @par Prototype:
 
168
   * <tt>bool %on_match_selected(const TreeModel::iterator& iter)</tt>
 
169
   */
 
170
  Glib::SignalProxy1< bool, const TreeModel::iterator& > signal_match_selected();
 
171
 
 
172
  /** Emitted when a match from the cursor is on a match
 
173
   * of the list. The default behaviour is to replace the contents
 
174
   * of the entry with the contents of the text column in the row 
 
175
   * pointed to by @a iter.
 
176
   *
 
177
   * @param model The TreeModel containing the matches
 
178
   * @param iter A TreeModel::iterator positioned at the selected match
 
179
   * @result true if the signal has been handled
 
180
   * 
 
181
   * @par Prototype:
 
182
   * <tt>bool %on_cursor_on_match(const TreeModel::iterator& iter)</tt>
 
183
   *
 
184
   * @newin{2,12}
 
185
   */
 
186
  Glib::SignalProxy1< bool, const TreeModel::iterator& > signal_cursor_on_match();
 
187
 
 
188
 
 
189
  #m4begin
 
190
dnl// Hook in custom callback.
 
191
dnl// It will use the callback.
 
192
dnl
 
193
  _PUSH(SECTION_PCC_CLASS_INIT_DEFAULT_SIGNAL_HANDLERS)
 
194
    klass->match_selected = &match_selected_callback_custom;
 
195
  _SECTION(SECTION_PH_DEFAULT_SIGNAL_HANDLERS)
 
196
    static gboolean match_selected_callback_custom(GtkEntryCompletion* self, GtkTreeModel* c_model, GtkTreeIter* c_iter);
 
197
  _POP()
 
198
#m4end
 
199
 
 
200
#m4 _CONVERSION(`const char*',`const Glib::ustring&',__GCHARP_TO_USTRING)
 
201
 
 
202
 
 
203
  /** Emitted when the inline autocompletion is triggered. 
 
204
   * The default behaviour is to make the entry display the 
 
205
   * whole prefix and select the newly inserted part.
 
206
   *
 
207
   * Applications may connect to this signal in order to insert only a
 
208
   * smaller part of the @a prefix into the entry - e.g. the entry used in
 
209
   * the FileChooser inserts only the part of the prefix up to the 
 
210
   * next '/'.
 
211
   * 
 
212
   * @newin{2,6}
 
213
   *
 
214
   * @param prefix The common prefix of all possible completions.
 
215
   * @result true if the signal has been handled
 
216
   */ 
 
217
  _WRAP_SIGNAL(bool insert_prefix(const Glib::ustring& prefix), insert_prefix)
 
218
 
 
219
  _WRAP_PROPERTY("model", Glib::RefPtr<Gtk::TreeModel>)
 
220
  _WRAP_PROPERTY("minimum_key_length", int)
 
221
  _WRAP_PROPERTY("text_column, int)
 
222
  _WRAP_PROPERTY("inline_completion", bool)
 
223
  _WRAP_PROPERTY("popup_completion", bool)
 
224
  _WRAP_PROPERTY("popup_set_width", bool)
 
225
  _WRAP_PROPERTY("popup_single_match", bool)
 
226
  _WRAP_PROPERTY("inline-selection", bool)
 
227
  _WRAP_PROPERTY("cell-area", Glib::RefPtr<CellArea>)
 
228
 
 
229
protected:
 
230
 
 
231
  //Default Signal Handler:
 
232
  virtual bool on_match_selected(const TreeModel::iterator& iter);  
 
233
  //No default handler for on_cursor_on_match(), to preserver ABI. TODO: Add this when we can break ABI.      
 
234
};
 
235
 
 
236
} // namespace Gtk
 
237