def __init__(self, vocabularyController, field):
     self.vocabularyController = vocabularyController
     self._view = SplitFieldView(self)
     self.log = logging.getLogger(__name__)
     self.field = field
     self.clickIn = None
 def __init__(self, vocabularyController, field):
     self.vocabularyController = vocabularyController
     self._view = SplitFieldView(self)
     self.log = logging.getLogger(__name__)
     self.field = field
     self.clickIn = None
class SplitFieldController(object):
    """Split a field in two fields"""
    def __init__(self, vocabularyController, field):
        self.vocabularyController = vocabularyController
        self._view = SplitFieldView(self)
        self.log = logging.getLogger(__name__)
        self.field = field
        self.clickIn = None

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

    def run(self):
        if not self.initBuffer():
            self.log.warning(
                "An error occured while initiating the split field controller."
            )
            return
        self._view.run()

    #+----------------------------------------------
    #|  rightClickToSplitColumn:
    #|   Callback to split a column
    #+----------------------------------------------
    def initBuffer(self):
        self.split_position = 1
        self.split_min_len = 999999
        self.split_max_len = 0
        self.split_align = "left"

        # Find the size of the shortest/longest message
        cells = self.field.getCells()
        for m in cells:
            if len(m) > self.split_max_len:
                self.split_max_len = len(m)
            if len(m) < self.split_min_len:
                self.split_min_len = len(m)

        if self.split_min_len == 0:
            self.view.splitFieldDialog.destroy()
            NetzobErrorMessage(_("Can't split field with empty cell(s)."))
            return False

        self.view.buffer.get_buffer().create_tag("redTag",
                                                 weight=Pango.Weight.BOLD,
                                                 foreground="red",
                                                 family="Courier")
        self.view.buffer.get_buffer().create_tag("greenTag",
                                                 weight=Pango.Weight.BOLD,
                                                 foreground="#006400",
                                                 family="Courier")

        self.updateDisplayFollowingSplitPosition()

        self.view.setMaxSizeOfSplitPositionAdjustment(self.split_min_len - 1)

        return True

    def cancel_clicked_cb(self, widget):
        self.view.splitFieldDialog.destroy()
        self.vocabularyController.view.updateSymbolList()

    def doSplit_clicked_cb(self, widget):
        if self.split_max_len <= 1:
            self.view.splitFieldDialog.destroy()
            return

        if self.split_align == "right":
            split_index = -self.split_position
        else:
            split_index = self.split_position
        self.field.splitField(split_index, self.split_align)
        self.view.splitFieldDialog.destroy()
        self.vocabularyController.view.updateSelectedMessageTable()

    def splitPositionAdjustment_value_changed_cb(self, widget):
        if self.clickIn is not None:
            elaspedTime = time.time() - self.clickIn
            if elaspedTime < 0.5:
                return

        self.split_position = int(self.view.getSplitPosition())
        self.updateDisplayFollowingSplitPosition()

    def adjustSplitLeft_clicked_cb(self, widget):
        self.adjustSplit_clicked("left")

    def adjustSplitRight_clicked_cb(self, widget):
        self.adjustSplit_clicked("right")

    def scale1_button_release_event_cb(self, widget, param):
        self.clickIn = None
        tmp = int(self.view.getSplitPosition())
        if tmp != self.split_position:
            self.split_position = tmp
            self.updateDisplayFollowingSplitPosition()

    def scale1_button_press_event_cb(self, widget, param):
        self.clickIn = time.time()

    def adjustSplit_clicked(self, direction):
        if self.split_max_len <= 1:
            return

        # Bounds checking
        if self.split_align == "left":
            if direction == "left":
                self.split_position -= 1
                if self.split_position < 1:
                    self.split_position = 1
            else:
                self.split_position += 1
                if self.split_position > self.split_min_len - 1:
                    self.split_position = self.split_min_len - 1
                    if self.split_position == 0:
                        self.split_position = 1
        else:
            if direction == "left":
                self.split_position += 1
                if self.split_position > self.split_min_len - 1:
                    self.split_position = self.split_min_len - 1
                    if self.split_position == 0:
                        self.split_position = 1
            else:
                self.split_position -= 1
                if self.split_position < 1:
                    self.split_position = 1

        self.view.setSplitPosition(self.split_position)
        self.updateDisplayFollowingSplitPosition()

    def updateDisplayFollowingSplitPosition(self):
        messages = self.field.getCells()
        # Colorize text according to position
        self.view.buffer.get_buffer().set_text("")

        for m in messages:
            # Crate padding in case of right alignment
            if self.split_align == "right":
                padding = " " * (self.split_max_len - len(m))
                self.view.buffer.get_buffer().insert_with_tags_by_name(
                    self.view.buffer.get_buffer().get_end_iter(), padding,
                    "greenTag")
                split_index = -self.split_position
            else:
                split_index = self.split_position

            leftContent = m[:split_index]
            rightContent = m[split_index:]

            self.view.buffer.get_buffer().insert_with_tags_by_name(
                self.view.buffer.get_buffer().get_end_iter(),
                TypeConvertor.encodeNetzobRawToGivenType(
                    leftContent, self.field.getFormat()) + "  ", "redTag")
            self.view.buffer.get_buffer().insert_with_tags_by_name(
                self.view.buffer.get_buffer().get_end_iter(),
                TypeConvertor.encodeNetzobRawToGivenType(
                    rightContent, self.field.getFormat()) + "\n", "greenTag")

        value = self.split_position * (self.view.getMaxSizeOfHBuffer() /
                                       self.split_max_len)
        self.view.adjustHPositionOfBuffer(value)

    def changeAlignment_clicked_cb(self, widget):
        if self.split_align == "left":
            self.split_align = "right"
            self.view.invertScale(True)
        else:
            self.split_align = "left"
            self.view.invertScale(False)

        messages = self.field.getCells()

        # Adapt alignment
        self.view.buffer.get_buffer().set_text("")
        for m in messages:
            # Crate padding in case of right alignment
            if self.split_align == "right":
                padding = ""
                messageLen = len(m)
                for i in range(self.split_max_len - messageLen):
                    padding += " "
                self.view.buffer.get_buffer().insert_with_tags_by_name(
                    self.view.buffer.get_buffer().get_end_iter(), padding,
                    "greenTag")
                split_index = -self.split_position
            else:
                split_index = self.split_position
            self.view.buffer.get_buffer().insert_with_tags_by_name(
                self.view.buffer.get_buffer().get_end_iter(),
                TypeConvertor.encodeNetzobRawToGivenType(
                    m[:split_index], self.field.getFormat()) + "  ", "redTag")
            self.view.buffer.get_buffer().insert_with_tags_by_name(
                self.view.buffer.get_buffer().get_end_iter(),
                TypeConvertor.encodeNetzobRawToGivenType(
                    m[split_index:], self.field.getFormat()) + "\n",
                "greenTag")

        value = self.split_position * (self.view.getMaxSizeOfHBuffer() /
                                       self.split_max_len)
        self.view.adjustHPositionOfBuffer(value)
class SplitFieldController(object):
    """Split a field in two fields"""

    def __init__(self, vocabularyController, field):
        self.vocabularyController = vocabularyController
        self._view = SplitFieldView(self)
        self.log = logging.getLogger(__name__)
        self.field = field
        self.clickIn = None

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

    def run(self):
        if not self.initBuffer():
            self.log.warning("An error occured while initiating the split field controller.")
            return
        self._view.run()

    #+----------------------------------------------
    #|  rightClickToSplitColumn:
    #|   Callback to split a column
    #+----------------------------------------------
    def initBuffer(self):
        self.split_position = 1
        self.split_min_len = 999999
        self.split_max_len = 0
        self.split_align = "left"

        # Find the size of the shortest/longest message
        cells = self.field.getCells()
        for m in cells:
            if len(m) > self.split_max_len:
                self.split_max_len = len(m)
            if len(m) < self.split_min_len:
                self.split_min_len = len(m)

        if self.split_min_len == 0:
            self.view.splitFieldDialog.destroy()
            NetzobErrorMessage(_("Can't split field with empty cell(s)."))
            return False

        self.view.buffer.get_buffer().create_tag("redTag", weight=Pango.Weight.BOLD, foreground="red", family="Courier")
        self.view.buffer.get_buffer().create_tag("greenTag", weight=Pango.Weight.BOLD, foreground="#006400", family="Courier")

        self.updateDisplayFollowingSplitPosition()

        self.view.setMaxSizeOfSplitPositionAdjustment(self.split_min_len - 1)

        return True

    def cancel_clicked_cb(self, widget):
        self.view.splitFieldDialog.destroy()
        self.vocabularyController.view.updateSymbolList()

    def doSplit_clicked_cb(self, widget):
        if self.split_max_len <= 1:
            self.view.splitFieldDialog.destroy()
            return

        if self.split_align == "right":
            split_index = -self.split_position
        else:
            split_index = self.split_position
        self.field.splitField(split_index, self.split_align)
        self.view.splitFieldDialog.destroy()
        self.vocabularyController.view.updateSelectedMessageTable()

    def splitPositionAdjustment_value_changed_cb(self, widget):
        if self.clickIn is not None:
            elaspedTime = time.time() - self.clickIn
            if elaspedTime < 0.5:
                return

        self.split_position = int(self.view.getSplitPosition())
        self.updateDisplayFollowingSplitPosition()

    def adjustSplitLeft_clicked_cb(self, widget):
        self.adjustSplit_clicked("left")

    def adjustSplitRight_clicked_cb(self, widget):
        self.adjustSplit_clicked("right")

    def scale1_button_release_event_cb(self, widget, param):
        self.clickIn = None
        tmp = int(self.view.getSplitPosition())
        if tmp != self.split_position:
            self.split_position = tmp
            self.updateDisplayFollowingSplitPosition()

    def scale1_button_press_event_cb(self, widget, param):
        self.clickIn = time.time()

    def adjustSplit_clicked(self, direction):
        if self.split_max_len <= 1:
            return

        # Bounds checking
        if self.split_align == "left":
            if direction == "left":
                self.split_position -= 1
                if self.split_position < 1:
                    self.split_position = 1
            else:
                self.split_position += 1
                if self.split_position > self.split_min_len - 1:
                    self.split_position = self.split_min_len - 1
                    if self.split_position == 0:
                        self.split_position = 1
        else:
            if direction == "left":
                self.split_position += 1
                if self.split_position > self.split_min_len - 1:
                    self.split_position = self.split_min_len - 1
                    if self.split_position == 0:
                        self.split_position = 1
            else:
                self.split_position -= 1
                if self.split_position < 1:
                    self.split_position = 1

        self.view.setSplitPosition(self.split_position)
        self.updateDisplayFollowingSplitPosition()

    def updateDisplayFollowingSplitPosition(self):
        messages = self.field.getCells()
        # Colorize text according to position
        self.view.buffer.get_buffer().set_text("")

        for m in messages:
            # Crate padding in case of right alignment
            if self.split_align == "right":
                padding = " " * (self.split_max_len - len(m))
                self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), padding, "greenTag")
                split_index = -self.split_position
            else:
                split_index = self.split_position

            leftContent = m[:split_index]
            rightContent = m[split_index:]

            self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), TypeConvertor.encodeNetzobRawToGivenType(leftContent, self.field.getFormat()) + "  ", "redTag")
            self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), TypeConvertor.encodeNetzobRawToGivenType(rightContent, self.field.getFormat()) + "\n", "greenTag")

        value = self.split_position * (self.view.getMaxSizeOfHBuffer() / self.split_max_len)
        self.view.adjustHPositionOfBuffer(value)

    def changeAlignment_clicked_cb(self, widget):
        if self.split_align == "left":
            self.split_align = "right"
            self.view.invertScale(True)
        else:
            self.split_align = "left"
            self.view.invertScale(False)

        messages = self.field.getCells()

        # Adapt alignment
        self.view.buffer.get_buffer().set_text("")
        for m in messages:
            # Crate padding in case of right alignment
            if self.split_align == "right":
                padding = ""
                messageLen = len(m)
                for i in range(self.split_max_len - messageLen):
                    padding += " "
                self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), padding, "greenTag")
                split_index = -self.split_position
            else:
                split_index = self.split_position
            self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), TypeConvertor.encodeNetzobRawToGivenType(m[:split_index], self.field.getFormat()) + "  ", "redTag")
            self.view.buffer.get_buffer().insert_with_tags_by_name(self.view.buffer.get_buffer().get_end_iter(), TypeConvertor.encodeNetzobRawToGivenType(m[split_index:], self.field.getFormat()) + "\n", "greenTag")

        value = self.split_position * (self.view.getMaxSizeOfHBuffer() / self.split_max_len)
        self.view.adjustHPositionOfBuffer(value)