def __init__(self, vocabularyPerspective):
     self.vocabularyPerspective = vocabularyPerspective
     self._view = MessageTableView(self)
     self.selectedMessages = []
class MessageTableController(object):

    def __init__(self, vocabularyPerspective):
        self.vocabularyPerspective = vocabularyPerspective
        self._view = MessageTableView(self)
        self.selectedMessages = []

    @property
    def view(self):
        return self._view

    def getSignalsManager(self):
        return self.vocabularyPerspective.netzob.getSignalsManager()

    def getSelectedMessages(self):
        return self.selectedMessages

    def messageTableTreeView_changed_event_cb(self, selection):
        """Callback executed when the user
        clicks on a message in the MessageTable"""
        if self.vocabularyPerspective.controller.selectedMessagesToMove is not None:
            self.vocabularyPerspective.controller.removePendingMessagesToMove()

        self.selectedMessages = []
        if selection is not None:
            (model, rows) = selection.get_selected_rows()
            for row in rows:
                iter = model.get_iter(row)
                msgID = model[iter][0]
                if msgID is not None:
                    message = self.vocabularyPerspective.getCurrentProject().getVocabulary().getMessageByID(msgID)
                    if message is None:
                        logging.warn("Impossible to retrieve the requested message ({0})".format(msgID))
                    else:
                        self.selectedMessages.append(message)
        self.vocabularyPerspective.updateMessageProperties()

        # Send signals to update toolbar
        nbSelectedMessage = len(self.selectedMessages)
        if nbSelectedMessage == 0:
            self.getSignalsManager().emitSignal(SignalsManager.SIG_MESSAGES_NO_SELECTION)
        elif nbSelectedMessage == 1:
            self.getSignalsManager().emitSignal(SignalsManager.SIG_MESSAGES_SINGLE_SELECTION)
        elif nbSelectedMessage > 1:
            self.getSignalsManager().emitSignal(SignalsManager.SIG_MESSAGES_MULTIPLE_SELECTION)

    def messageListBox_button_press_event_cb(self, box, eventButton):
        self.vocabularyPerspective.setSelectedMessageTable(self.view)

    def closeButton_clicked_cb(self, button):
        self.vocabularyPerspective.removeMessageTable(self.view)

    def messageTableTreeView_button_press_event_cb(self, treeview, eventButton):
        # Popup a contextual menu if right click
        self.vocabularyPerspective.setSelectedMessageTable(self.view)
        if eventButton.type == Gdk.EventType.BUTTON_PRESS and eventButton.button == 3:
            x = int(eventButton.x)
            y = int(eventButton.y)
            try:
                (path, treeviewColumn, x, y) = treeview.get_path_at_pos(x, y)
            except:
                # No message selected
                return

            # Retrieve the selected messages
            messages = []
            layer = self._view.getDisplayedField()
            if layer is None:
                logging.warn("No layer selected, please choose one.")
                return

            (model, paths) = treeview.get_selection().get_selected_rows()
            for path in paths:
                message_id = model[path][0]
                if message_id is not None:
                    message = layer.getMessageByID(message_id)
                    messages.append(message)
                else:
                    return

            # Retrieve the selected field number
            iField = self.view.displayedField.getExtendedFields()[0].getIndex()  # Starting displayed field
            for col in treeview.get_columns():
                if col == treeviewColumn:
                    break
                iField += 1
            field = layer.getFieldByIndex(iField)
            if field is None:
                logging.warn("Impossible to retrieve the clicked field!")
                return

            # Popup a contextual menu
            menuController = ContextualMenuOnFieldController(self.vocabularyPerspective.controller, layer, messages, field)
            menuController.run(eventButton)
            return True  # Needed to block remainin signals (especially the 'changed_cb' signal)

    def messageTableTreeView_enter_notify_event_cb(self, treeView, data=None):
        self.view.treeViewHeaderGroup.setAllColumnsFocus(True)

    def messageTableTreeView_leave_notify_event_cb(self, treeView, data=None):
        self.view.treeViewHeaderGroup.setAllColumnsFocus(False)

    def messageTableBox_enter_notify_event_cb(self, treeView, data=None):
        self.view.treeViewHeaderGroup.setAllColumnsFocus(True)

    def messageTableBox_leave_notify_event_cb(self, treeView, data=None):
        self.view.treeViewHeaderGroup.setAllColumnsFocus(False)