This file is indexed.

/usr/include/Wt/WMenuItem is in libwt-dev 3.1.10-1ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
// This may look like C code, but it's really -*- C++ -*-
/*
 * Copyright (C) 2008 Emweb bvba, Kessel-Lo, Belgium.
 *
 * See the LICENSE file for terms of use.
 */
#ifndef WMENU_ITEM_H_
#define WMENU_ITEM_H_

#include <Wt/WObject>
#include <Wt/WString>

namespace Wt {

class SignalBase;
class WContainerWidget;
class WMenu;
class WWidget;

/*! \brief A single item in a menu.
 *
 * The item determines the look and behaviour of a single item in a
 * WMenu.
 *
 * By default, for enabled menu items a WMenuItem uses a WAnchor widget. For
 * disabled menu items it uses a WText widget. If item is closeable, WMenuItem
 * puts these widgets and extra WText widget (for a close icon) in
 * a WContainerWidget.
 * When the menu participates in application internal paths
 * (see WMenu::setInternalPathEnabled()), the anchor references the
 * bookmark URL corresponding to the pathComponent() for the item (see
 * WApplication::bookmarkUrl()).
 *
 * To provide another look for the menu items (such as perhaps adding
 * an icon), you can specialize this class, and reimplement the
 * virtual methods:
 *
 * - createItemWidget(): to provide another widget to represent the
 *   item.
 * - updateItemWidget(): to update the widget to reflect item changes,
 *   triggered by for example setText() and setPathComponent().
 * - optionally, activateSignal(): to bind the event for activating
 *   the item to something else than the clicked event.
 * - optionally, closeSignal(): to bind the event for closing
 *   the item to something else than the clicked event.
 * - optionally, renderSelected(bool): if you need to do additional
 *   styling to reflect a selection, other than changing style classes.
 * - optionally, renderHidden(bool): if you need to do additionanl
 *   styling to reflect a hide, other than hiding (see
 *   WWebWidget::setHidden(bool)).
 *
 * To provide another look for the close icon you can override
 * <tt>Wt-closeicon</tt> CSS class (see WMenu for more details).
 * 
 * \sa WMenu
 * \sa WMenu::addItem(WMenuItem *)
 */
class WT_API WMenuItem : public WObject
{
public:
  /*! \brief Enumeration that determines when contents should be loaded.
   */
  enum LoadPolicy {
    LazyLoading, //!< Lazy loading: on first use
    PreLoading   //!< Pre-loading: before first use
  };

  /*! \brief Creates a new item.
   *
   * The text specifies the item text. The contents is the widget that must
   * be shown in the WMenu contents stack when the item is selected.
   *
   * The load policy specifies whether the contents widgets is transmitted
   * only when it the item is activated for the first time (LazyLoading)
   * or transmitted prior to first rendering.
   *
   * The pathComponent() is derived from \p text, and can be
   * customized using setPathComponent().
   *
   * \p contents may be 0, in which case no contents is associated with
   * the item in the contents stack.
   */
  WMenuItem(const WString& text, WWidget *contents,
	    LoadPolicy policy = LazyLoading);

  /* !\brief Destructor.
   *
   * Removes the item from the menu (if it was added previously to one), and
   * also deletes the contents that was associated with the item.
   *
   * \sa WMenu::removeItem()
   */
  ~WMenuItem();

  /*! \brief Sets the text for this item.
   *
   * Unless a custom path component was defined, the pathComponent()
   * is also updated based on the new text.
   *
   * The item widget is updated using updateItemWidget().
   *
   * \sa setPathComponent();
   */
  void setText(const WString& text);

  /*! \brief Returns the text for this item.
   *
   * \sa setText();
   */
  const WString& text() const { return text_; }

  /*! \brief Sets the path component for this item.
   *
   * The path component is used by the menu item in the application
   * internal path (see WApplication::setInternalPath()), when
   * internal paths are enabled (see WMenu::setInternalPathEnabled())
   * for the menu.
   *
   * You may specify an empty \p path to let a menu item be the
   * "default" menu option.
   *
   * For example, if WMenu::internalBasePath() is
   * <tt>"/examples/"</tt> and pathComponent() for is
   * <tt>"charts/"</tt>, then the internal path for the item will be
   * <tt>"/examples/charts/"</tt>.
   *
   * By default, the path is automatically derived from text(). If a
   * \link WString::literal() literal text\endlink is used, the path
   * is based on the text itself, otherwise on the \link
   * WString::key() key\endlink. It is converted to lower case, and
   * replacing white space and special characters with '_'.
   *
   * \sa setText(), WMenu::setInternalPathEnabled()
   */
  void setPathComponent(const std::string& path);

  /*! \brief Returns the path component for this item.
   *
   * You may want to reimplement this to customize the path component
   * set by the item in the application internal path.
   *
   * \sa setPathComponent()
   */
  virtual std::string pathComponent() const;

  /*! \brief Make it possible to close this item interactively or by close().
   *
   * \sa close(), isCloseable()
   */
  void setCloseable(bool closeable);

  /*! \brief Returns whether the item is closeable.
   *
   * \sa setCloseable()
   */
  bool isCloseable() const { return closeable_; }

  /*! \brief Closes this item.
   *
   * Hides the item widget and emits WMenu::itemClosed() signal. Only closeable
   * items can be closed.
   *
   * \sa setCloseable(), hide()
   */
  void close();

  /*! \brief Sets whether the item widget is hidden.
   *
   * Hides or show the item widget.
   * 
   * \sa hide(), show(), isHidden()
   */
  void setHidden(bool hidden);

  /*! \brief Returns whether the item widget is hidden.
   *
   * \sa setHidden()
   */
  bool isHidden() const { return hidden_; }

  /*! \brief Hides the item widget.
   *
   * This calls \link setHidden() setHidden(true)\endlink.
   *
   * \sa show()
   */
  void hide();

  /*! \brief Shows the item widget.
   *
   * If the item was previously closed it will be shown.
   * 
   * This calls \link setHidden() setHidden(false)\endlink.
   *
   * \sa hide(), select()
   */
  void show();

  /*! \brief Enables or disables an item.
   *
   * A disabled item cannot be activated.
   *
   * \sa enable(), disable(), isEnabled()
   */
  void setDisabled(bool disabled);

  /*! \brief Returns whether an item is enabled.
   *
   * \sa setDisabled()
   */
  bool isDisabled() const { return disabled_ ; }

  /*! \brief Enables the item.
   *
   * This calls \link setDisabled() setDisabled(false)\endlink.
   *
   * \sa disable()
   */
  void enable();

  /*! \brief Disables the item.
   *
   * This calls \link setDisabled() setDisabled(true)\endlink.
   *
   * \sa enable()
   */
  void disable();

  /*! \brief Sets a tooltip.
   *
   * The tooltip is displayed when the cursor hovers over the label of the item,
   * i.e. WAnchor or WText, depending on whether the item is enabled or not
   * (see createItemWidget()).
   *
   * \sa toolTip()
   */
  void setToolTip(const WString& tip);

  /*! \brief Returns the tooltip.
   */
  const WString& toolTip() const { return tip_; }

  /*! \brief Returns the menu.
   */
  WMenu *menu() const { return menu_; }

  /*! \brief Returns the contents widget for this item.
   *
   * The contents widget is the widget in the WStackedWidget associated with
   * this item.
   */
  WWidget *contents() const;
  WWidget *takeContents();
  void purgeContents();

  /*! \brief Returns the widget that represents the item.
   *
   * This returns the item widget, creating it using
   * createItemWidget() if necessary.
   */
  WWidget *itemWidget();

  /*! \brief Selects this item.
   *
   * If the item was previously closed it will be shown.
   *
   * \sa close()
   */
  void select();

protected:
  /*! \brief Creates the widget that represents the item.
   *
   * The default implementation will return:
   * - a WAnchor if item is not closeable and enabled;
   * - a WText if item is not closeable and disabled;
   * - a WContainerWidget with WAnchor or WText (the label of enabled
   * or disabled item accordingly) and WText (the close icon) inside if
   * item is closeable.
   * 
   * A call to createItemWidget() is immediately followed by
   * updateItemWidget().
   *
   * If you reimplement this method, you should probably also
   * reimplement updateItemWidget().
   */
  virtual WWidget *createItemWidget();

  /*! \brief Updates the widget that represents the item.
   *
   * The default implementation will cast the \p itemWidget to a
   * WAnchor, and set the anchor's text and destination according to
   * text() and pathComponent().
   *
   * \sa createItemWidget()
   */
  virtual void updateItemWidget(WWidget *itemWidget);

  /*! \brief Renders the item as selected or unselected.
   *
   * The default implementation sets the styleclass for itemWidget()
   * to 'item' for an unselected not closeable, 'itemselected' for
   * selected not closeable, 'citem' for an unselected closeable and
   * 'citemselected' for selected closeable item.
   *
   * Note that this method is called from within a stateless slot
   * implementation, and thus should be stateless as well.
   */
  virtual void renderSelected(bool selected);

  /*! \brief Renders the item as hidden or closed.
   *
   * The default implementation hides the item widget (including all its
   * descendant widgets).
   */
  virtual void renderHidden(bool hidden);

  /*! \brief Returns the signal used to activate the item.
   *
   * The default implementation will tries to cast the itemWidget() or
   * its first child if item is \link WMenuItem::setCloseable closeable\endlink
   * to a WInteractWidget and returns the \link WInteractWidget::clicked
   * clicked signal\endlink.
   */
  virtual SignalBase& activateSignal();

  /*! \brief Returns the signal used to close the item.
   *
   * The default implementation will tries to cast the itemWidget() (or
   * its second child if item is \link WMenuItem::setCloseable closeable\endlink)
   * to a WInteractWidget and returns the \link WInteractWidget::clicked
   * clicked signal\endlink.
   */
  virtual SignalBase& closeSignal();

  virtual void setFromInternalPath(const std::string& path);

  /*! \brief Progresses to an Ajax-enabled widget.
   *
   * This method is called when the progressive bootstrap method is
   * used, and support for AJAX has been detected. The default
   * behavior will upgrade the menu and the contents event handling to use AJAX
   * instead of full page reloads.
   *
   * You may want to reimplement this method if you want to make
   * changes to widget when AJAX is enabled.
   *
   * \sa WMenu::enableAjax()
   */
  virtual void enableAjax();

private:
  WWidget          *itemWidget_;
  WContainerWidget *contentsContainer_;
  WWidget          *contents_;
  WMenu            *menu_;
  WString           text_;
  WString           tip_;
  std::string       pathComponent_;
  bool              customPathComponent_;
  bool              closeable_;
  bool              disabled_;
  bool              hidden_;

  bool contentsLoaded() const;
  void loadContents();
  void setMenu(WMenu *menu);
  void selectNotLoaded();
  void selectVisual();
  void undoSelectVisual();
  void connectActivate();
  void connectClose();
  void connectSignals();
  WWidget *recreateItemWidget();

  friend class WMenu;
};

}

#endif // WMENU_ITEM_H_