/usr/include/Wt/WPopupMenu 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 | // 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 WPOPUP_MENU_H_
#define WPOPUP_MENU_H_
#include <Wt/WCompositeWidget>
#include <Wt/WJavaScript>
#include <Wt/WPopupMenuItem>
namespace Wt {
class WApplication;
class WTemplate;
class WMouseEvent;
class WPoint;
class WPopupMenuItem;
/*! \class WPopupMenu Wt/WPopupMenu Wt/WPopupMenu
* \brief A menu presented in a popup window.
*
* The menu implements a typical context menu, with support for
* submenu's. It is not to be confused with WMenu which implements an
* always-visible navigation menu for a web application.
*
* When initially created, the menu is invisible, until popup() or
* exec() is called. Then, the menu will remain visible until an item
* is selected, or the user cancels the menu (by hitting Escape or
* clicking elsewhere).
*
* The implementation assumes availability of JavaScript to position
* the menu at the current mouse position and provide feed-back of the
* currently selected item.
*
* Similar in use as WDialog, there are two ways of using the
* menu. The simplest way is to use one of the exec() methods, to use
* a reentrant event loop and wait until the user cancelled the popup
* menu (by hitting Escape or clicking elsewhere), or selected an item.
*
* Alternatively, you can use one of the popup() methods to show the
* menu and listen to the \link WPopupMenu::aboutToHide
* aboutToHide\endlink signal where you read the result().
*
* You have several options to react to the selection of an item:
* - Either you use the WPopupMenuItem itself to identify the action,
* perhaps by specialization or simply by binding custom data using
* WPopupMenuItem::setData().
* - You can bind a separate method to each item's WPopupMenuItem::triggered
* signal.
* \if cpp
* - You can use a WSignalMapper to bind extra data with an item's
* WPopupMenuItem::triggered signal, and handle them in a single
* slot.
* \endif
*
* Usage example:
* \if cpp
* \code
* // Create a menu with some items
* WPopupMenu popup;
* popup.addItem("icons/item1.gif", "Item 1");
* popup.addItem("Item 2")->setCheckable(true);
* popup.addItem("Item 3");
* popup.addSeparator();
* popup.addItem("Item 4");
* popup.addSeparator();
* popup.addItem("Item 5");
* popup.addItem("Item 6");
* popup.addSeparator();
*
* WPopupMenu *subMenu = new WPopupMenu();
* subMenu->addItem("Sub Item 1");
* subMenu->addItem("Sub Item 2");
* popup.addMenu("Item 7", subMenu);
*
* WPopupMenuItem *item = popup.exec(event);
*
* if (item) {
* // ... do associated action.
* }
* \endcode
* \elseif java
* \code
* // Create a menu with some items
* WPopupMenu popup = new WPopupMenu();
* popup.addItem("icons/item1.gif", "Item 1");
* popup.addItem("Item 2").setCheckable(true);
* popup.addItem("Item 3");
* popup.addSeparator();
* popup.addItem("Item 4");
* popup.addSeparator();
* popup.addItem("Item 5");
* popup.addItem("Item 6");
* popup.addSeparator();
*
* WPopupMenu subMenu = new WPopupMenu();
* subMenu.addItem("Sub Item 1");
* subMenu.addItem("Sub Item 2");
* popup.addMenu("Item 7", subMenu);
*
* WPopupMenuItem item = popup.exec(event);
*
* if (item) {
* // ... do associated action.
* }
* \endcode
* \endif
*
* <h3>CSS</h3>
*
* A WPopupMenu has the <tt>Wt-popupmenu</tt> style class.
* The look can be overridden using the following style class
* selectors:
*
* \verbatim
.Wt-popupmenu .Wt-item, .Wt-popupmenu .Wt-selected : item
.Wt-popupmenu .Wt-selected : selected item
.Wt-popupmenu .Wt-separator : separator
\endverbatim
*
* A snapshot of the WPopupMenu:
* \image html WPopupMenu-default-1.png "WPopupMenu example (default)"
* \image html WPopupMenu-polished-1.png "WPopupMenu example (polished)"
* \sa WPopupMenuItem
*/
class WT_API WPopupMenu : public WCompositeWidget
{
public:
/*! \brief Creates a new popup menu.
*
* The menu is hidden, by default, and must be shown using popup()
* or exec().
*/
WPopupMenu();
/*! \brief Adds an item with given text.
*
* Adds an item to the menu with given text, and returns the
* corresponding item object.
*
* \sa add(WPopupMenuItem *)
*/
WPopupMenuItem *addItem(const WString& text);
/*! \brief Adds an item with given icon and text.
*
* Adds an item to the menu with given text and icon, and returns
* the corresponding item object.
*
* \note The icon should have a width of 16 pixels.
*
* \sa add(WPopupMenuItem *)
*/
WPopupMenuItem *addItem(const std::string& iconPath, const WString& text);
/*! \brief Adds an item with given text, and specify a slot method to be
* called when the item is triggered.
*
* The <i>target</i> and \p method are connected to the
* WPopupMenuItem::triggered signal.
*
* \sa add(WPopupMenuItem *)
*/
template<class T, class V>
WPopupMenuItem *addItem(const WString& text,
T *target, void (V::*method)());
/*! \brief Adds an item with given text and icon, and specify a slot
* method to be called when activated.
*
* The <i>target</i> and \p method are connected to the
* WPopupMenuItem::triggered signal.
*
* \note The icon should have a width of 16 pixels.
*
* \sa add(WPopupMenuItem *)
*/
template<class T, class V>
WPopupMenuItem *addItem(const std::string& iconPath, const WString& text,
T *target, void (V::*method)());
/*! \brief Adds a submenu, with given text.
*
* Adds an item with text \p text, that leads to a submenu
* \p menu.
*
* \sa add(WPopupMenuItem *)
*/
WPopupMenuItem *addMenu(const WString& text, WPopupMenu *menu);
/*! \brief Adds a submenu, with given icon and text.
*
* Adds an item with given text and icon, that leads to a submenu
* \p menu.
*
* \sa add(WPopupMenuItem *)
*/
WPopupMenuItem *addMenu(const std::string& iconPath, const WString& text,
WPopupMenu *menu);
/*! \brief Adds a menu item.
*
* Adds an item to the popup menu.
*/
void add(WPopupMenuItem *item);
/*! \brief Adds a separator to the menu.
*
* Adds a separator the popup menu. The separator is an empty div with
* style-class "separator".
*/
void addSeparator();
/*! \brief Shows the the popup at a position.
*
* Displays the popup at a point with document coordinates
* \p point. The positions intelligent, and will chose one of
* the four menu corners to correspond to this point so that the
* popup menu is completely visible within the window.
*
* \sa exec()
*/
void popup(const WPoint& point);
/*! \brief Shows the the popup at the location of a mouse event.
*
* This is a convenience method for popup(const WPoint&) that uses the
* event's document coordinates.
*
* \sa popup(const WPoint& p), WMouseEvent::document()
*/
void popup(const WMouseEvent& event);
/*! \brief Shows the popup besides a widget.
*
* \sa positionAt(), popup(const WPointF&)
*/
void popup(WWidget *location, Orientation orientation = Vertical);
/*! \brief Executes the the popup at a position.
*
* Displays the popup at a point with document coordinates \p p,
* using popup(), and the waits until a menu item is selected, or
* the menu is cancelled.
*
* Returns the selected menu (or sub-menu) item, or \c 0 if the user
* cancelled the menu.
*
* \sa popup()
*/
WPopupMenuItem *exec(const WPoint& point);
/*! \brief Executes the the popup at the location of a mouse event.
*
* This is a convenience method for exec(const WPoint& p) that uses the
* event's document coordinates.
*
* \sa exec(const WPoint&)
*/
WPopupMenuItem *exec(const WMouseEvent& event);
/*! \brief Executes the popup besides a widget.
*
* \sa positionAt(), popup(const WPointF&)
*/
WPopupMenuItem *exec(WWidget *location, Orientation orientation = Vertical);
/*! \brief Returns the last triggered menu item.
*
* The result is \c 0 when the user cancelled the popup menu.
*/
WPopupMenuItem *result() const { return result_; }
virtual void setHidden(bool hidden,
const WAnimation& animation = WAnimation());
virtual void setMaximumSize(const WLength& width, const WLength& height);
virtual void setMinimumSize(const WLength& width, const WLength& height);
/*! \brief %Signal emitted when the popup is hidden.
*
* This signal is emitted when the popup is hidden, either because an item
* was selected, or when the menu was cancelled.
*
* You can use result() to get the selected item.
*/
Signal<>& aboutToHide() { return aboutToHide_; }
private:
WTemplate *impl_;
WPopupMenuItem *parentItem_, *result_;
Signal<> aboutToHide_;
boost::signals::connection globalClickConnection_, globalEscapeConnection_;
bool recursiveEventLoop_;
WContainerWidget *contents();
WPopupMenu *topLevelMenu();
void done();
void done(WPopupMenuItem *result);
void popupImpl();
void popupToo(WWidget *location);
void prepareRender(WApplication *app);
void renderOutAll();
friend class WPopupMenuItem;
};
template<class T, class V>
WPopupMenuItem *WPopupMenu::addItem(const WString& text,
T *target, void (V::*method)())
{
return addItem(std::string(), text, target, method);
}
template<class T, class V>
WPopupMenuItem *WPopupMenu::addItem(const std::string& iconPath,
const WString& text,
T *target, void (V::*method)())
{
WPopupMenuItem *item = addItem(iconPath, text);
item->triggered().connect(target, method);
return item;
}
}
#endif // WPOPUP_MENU_H_
|