| 
    
       #include <Wt/WApplication>
 
     | 
  
  
     | 
    
       #include <Wt/WEnvironment>
 
     | 
  
  
     | 
    
       #include <Wt/WTable>
 
     | 
  
  
     | 
    
       #include <Wt/WTableCell>
 
     | 
  
  
     | 
    
       #include <Wt/WText>
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #include <string>
 
     | 
  
  
     | 
    
       #include <iostream>
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       using namespace std;
 
     | 
  
  
     | 
    
       using namespace Wt;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       #include <Wt/WVBoxLayout>
 
     | 
  
  
     | 
    
       #include <Wt/WContainerWidget>
 
     | 
  
  
     | 
    
       #include <Wt/WStackedWidget>
 
     | 
  
  
     | 
    
       #include <Wt/WEvent>
 
     | 
  
  
     | 
    
       #include <Wt/WPopupMenu>
 
     | 
  
  
     | 
    
       #include <Wt/WPushButton>
 
     | 
  
  
     | 
    
       #include <Wt/WDialog>
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       class TestPopup : public WContainerWidget
 
     | 
  
  
     | 
    
       {
 
     | 
  
  
     | 
    
       public:
 
     | 
  
  
     | 
    
           TestPopup()
 
     | 
  
  
     | 
    
           : WContainerWidget()
 
     | 
  
  
     | 
    
           , popup_(nullptr)
 
     | 
  
  
     | 
    
           {
 
     | 
  
  
     | 
    
               setAttributeValue("oncontextmenu","event.cancelBubble = true; event.returnValue = false; return false;");
 
     | 
  
  
     | 
    
               mouseWentUp().connect(boost::bind(&TestPopup::onMouseUp,this,_1));
 
     | 
  
  
     | 
    
               decorationStyle().setBackgroundColor(Wt::gray);
 
     | 
  
  
     | 
    
           }
 
     | 
  
  
     | 
    
           void popupAction(const Wt::WMouseEvent& e);
 
     | 
  
  
     | 
    
           void showPopup(const Wt::WMouseEvent &e) ;
 
     | 
  
  
     | 
    
           void onMouseUp(const Wt::WMouseEvent &e) ;
 
     | 
  
  
     | 
    
       private:
 
     | 
  
  
     | 
    
           WPopupMenu *popup_;
 
     | 
  
  
     | 
    
           Wt::Signals::connection onPopupHide_;
 
     | 
  
  
     | 
    
       };
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       void TestPopup::popupAction(const Wt::WMouseEvent& e) {
 
     | 
  
  
     | 
    
               cout << "popup result "<< popup_->result() << endl;
 
     | 
  
  
     | 
    
               if (popup_->result()) cout << "popup result "<< popup_->result()->text().narrow() << endl;
 
     | 
  
  
     | 
    
               return; // any Item was selected
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       void TestPopup::showPopup(const Wt::WMouseEvent &e) {
 
     | 
  
  
     | 
    
           if (!popup_) {
 
     | 
  
  
     | 
    
               popup_  = (new WPopupMenu());
 
     | 
  
  
     | 
    
               popup_->addItem("Plain");
 
     | 
  
  
     | 
    
               popup_->addItem("Check")->setCheckable(true);
 
     | 
  
  
     | 
    
           }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
           if(popup_->isHidden()){
 
     | 
  
  
     | 
    
               popup_->popup(e);
 
     | 
  
  
     | 
    
               popup_->refresh();
 
     | 
  
  
     | 
    
               onPopupHide_.disconnect();
 
     | 
  
  
     | 
    
               // (re)connect in order to use the actual mouse event coordinates
 
     | 
  
  
     | 
    
               onPopupHide_ = popup_->aboutToHide().connect(boost::bind(&TestPopup::popupAction,this,e));
 
     | 
  
  
     | 
    
           }
 
     | 
  
  
     | 
    
           else {
 
     | 
  
  
     | 
    
               popup_->hide();
 
     | 
  
  
     | 
    
           }
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       void TestPopup::onMouseUp(const Wt::WMouseEvent &e) {
 
     | 
  
  
     | 
    
           switch (e.button()) {
 
     | 
  
  
     | 
    
               case  WMouseEvent::RightButton :
 
     | 
  
  
     | 
    
                       showPopup(e);
 
     | 
  
  
     | 
    
                   break;
 
     | 
  
  
     | 
    
               default: break;
 
     | 
  
  
     | 
    
           }
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       void GetDialog(){
 
     | 
  
  
     | 
    
           WDialog dialog("Dialog");
 
     | 
  
  
     | 
    
           WPushButton *btn = new WPushButton("close");
 
     | 
  
  
     | 
    
           btn->clicked().connect(&dialog,&WDialog::reject);
 
     | 
  
  
     | 
    
           dialog.contents()->addWidget(btn);
 
     | 
  
  
     | 
    
           dialog.rejectWhenEscapePressed(true);
 
     | 
  
  
     | 
    
           dialog.exec();
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       Wt::WApplication* WMyApp(const Wt::WEnvironment& env) {
 
     | 
  
  
     | 
    
           WApplication *myApp = new WApplication(env);
 
     | 
  
  
     | 
    
           myApp->setCssTheme("polished");
 
     | 
  
  
     | 
    
           WContainerWidget *w = myApp->root();
 
     | 
  
  
     | 
    
           w->setPadding(0);
 
     | 
  
  
     | 
    
           WContainerWidget *page_ = new TestPopup();
 
     | 
  
  
     | 
    
           page_->resize(1000,100);
 
     | 
  
  
     | 
    
           WPushButton *dialogBtn = new WPushButton("dialog",w);
 
     | 
  
  
     | 
    
           dialogBtn->clicked().connect(boost::bind(&GetDialog));
 
     | 
  
  
     | 
    
           w->addWidget(page_);
 
     | 
  
  
     | 
    
           return myApp;
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       int main(int argc, char** argv) {
 
     | 
  
  
     | 
    
           return WRun(argc,argv,&WMyApp);
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     |