def contextMenuEvent(self, evt):
     """
     Protected method called to create a context menu.
     
     This method is overridden from QWebView.
     
     @param evt reference to the context menu event object (QContextMenuEvent)
     """
     pos = evt.pos()
     menu = QMenu(self)
     
     hit = self.page().mainFrame().hitTestContent(evt.pos())
     if not hit.linkUrl().isEmpty():
         act = menu.addAction(self.trUtf8("Open Link in New Tab\tCtrl+LMB"),
             self.__openLinkInNewTab)
         act.setData(QVariant(hit.linkUrl()))
         menu.addSeparator()
         menu.addAction(self.trUtf8("Save Lin&k"), self.__downloadLink)
         act = menu.addAction(self.trUtf8("Bookmark this Link"), self.__bookmarkLink)
         act.setData(QVariant(hit.linkUrl()))
         menu.addSeparator()
         menu.addAction(self.trUtf8("Copy Link to Clipboard"), self.__copyLink)
     
     if not hit.imageUrl().isEmpty():
         if not menu.isEmpty():
             menu.addSeparator()
         act = menu.addAction(self.trUtf8("Open Image in New Tab"), 
             self.__openLinkInNewTab)
         act.setData(QVariant(hit.imageUrl()))
         menu.addSeparator()
         menu.addAction(self.trUtf8("Save Image"), self.__downloadImage)
         menu.addAction(self.trUtf8("Copy Image to Clipboard"), self.__copyImage)
         act = menu.addAction(self.trUtf8("Copy Image Location to Clipboard"), 
             self.__copyImageLocation)
         act.setData(QVariant(hit.imageUrl().toString()))
         menu.addSeparator()
         act = menu.addAction(self.trUtf8("Block Image"), self.__blockImage)
         act.setData(QVariant(hit.imageUrl().toString()))
     
     if not menu.isEmpty():
         menu.addSeparator()
     menu.addAction(self.mw.newTabAct)
     menu.addAction(self.mw.newAct)
     menu.addSeparator()
     menu.addAction(self.mw.saveAsAct)
     menu.addSeparator()
     menu.addAction(self.trUtf8("Bookmark this Page"), self.__addBookmark)
     menu.addSeparator()
     menu.addAction(self.mw.backAct)
     menu.addAction(self.mw.forwardAct)
     menu.addAction(self.mw.homeAct)
     menu.addSeparator()
     menu.addAction(self.mw.zoomInAct)
     menu.addAction(self.mw.zoomOutAct)
     menu.addSeparator()
     if not self.selectedText().isEmpty():
         menu.addAction(self.mw.copyAct)
     menu.addAction(self.mw.findAct)
     menu.addSeparator()
     if not self.selectedText().isEmpty():
         self.__searchMenu = menu.addMenu(self.trUtf8("Search with..."))
         
         engineNames = self.mw.openSearchManager().allEnginesNames()
         for engineName in engineNames:
             engine = self.mw.openSearchManager().engine(engineName)
             act = OpenSearchEngineAction(engine, self.__searchMenu)
             self.__searchMenu.addAction(act)
             act.setData(QVariant(engineName))
         self.connect(self.__searchMenu, SIGNAL("triggered(QAction *)"), 
                      self.__searchRequested)
         
         menu.addSeparator()
     menu.addAction(self.trUtf8("Web Inspector..."), self.__webInspector)
     
     menu.exec_(evt.globalPos())
 def __showEnginesMenu(self):
     """
     Private slot to handle the display of the engines menu.
     """
     self.__enginesMenu.clear()
     
     engineNames = self.__openSearchManager.allEnginesNames()
     for engineName in engineNames:
         engine = self.__openSearchManager.engine(engineName)
         action = OpenSearchEngineAction(engine, self.__enginesMenu)
         action.setData(QVariant(engineName))
         self.connect(action, SIGNAL("triggered()"), self.__changeCurrentEngine)
         self.__enginesMenu.addAction(action)
         
         if self.__openSearchManager.currentEngineName() == engineName:
             action.setCheckable(True)
             action.setChecked(True)
     
     ct = self.mw.currentBrowser()
     linkedResources = ct.linkedResources("search")
     
     if len(linkedResources) > 0:
         self.__enginesMenu.addSeparator()
     
     for linkedResource in linkedResources:
         url = QUrl(linkedResource.href)
         title = linkedResource.title
         mimetype = linkedResource.type_
         
         if mimetype != "application/opensearchdescription+xml":
             continue
         if url.isEmpty():
             continue
         
         if url.isRelative():
             url = ct.url().resolved(url)
         
         if title.isEmpty():
             if ct.title().isEmpty():
                 title = url.host()
             else:
                 title = ct.title()
         
         action = self.__enginesMenu.addAction(self.trUtf8("Add '%1'").arg(title), 
                                               self.__addEngineFromUrl)
         action.setData(QVariant(url))
         action.setIcon(ct.icon())
     
     self.__enginesMenu.addSeparator()
     self.__enginesMenu.addAction(self.mw.searchEnginesAction())
     
     if not self.__recentSearches.isEmpty():
         self.__enginesMenu.addAction(self.trUtf8("Clear Recent Searches"), 
                                      self.clear)