def _populate_entity_frame(self):
     # pylint: disable=no-member
     self._document_label = AlexLabel(self.entity_frame,
                                      text=_("No document available"))
     self._document_label.pack(padx=7, pady=7)
     self.notebook = Notebook(self.entity_frame, width=600)
     self.notebook.pack(fill=X)
     description = Frame(self.notebook)
     self.notebook.add(description, text=_('Description'))
     self._description_widget = AlexText(description,
                                         font="Helvetica 12 bold",
                                         wrap=WORD,
                                         height=6)
     self._description_widget.pack(fill=X)
     condition = Frame(self.notebook)
     self.notebook.add(condition, text=_('Condition'))
     self._condition_widget = AlexText(condition,
                                       font="Helvetica 12 bold",
                                       wrap=WORD,
                                       height=6)
     self._condition_widget.pack(fill=X)
     keywords = Frame(self.notebook)
     self.notebook.add(keywords, text=_('Keywords'))
     self._keywords_widget = AlexText(keywords,
                                      font="Helvetica 12 bold",
                                      wrap=WORD,
                                      height=6)
     self._keywords_widget.pack(fill=X)
class GenericInputEditDialog(AbstractInputDialog):
    def __init__(self, window_manager, presenter):
        super().__init__(window_manager, presenter)

    def create_dialog(self):
        super().create_dialog()
        self.set_default_buttons()

        self.label = AlexLabel(self.interior)
        self.label.pack()

        self.entry = AlexEntry(self.interior)
        self.entry.pack()

    def config_dialog(self, label=_('Please edit string:'), initvalue=''):

        self.label.set(label)
        self.entry.set(initvalue)

    def _get_entry(self):
        return self.entry.get()

    def _set_entry(self, value):
        self.entry.set(value)

    input = property(_get_entry, _set_entry)
    def config_dialog(self, event_list=[], date=None):

        self.label.set(
            _("Events exist on %s. Please select the event you want or create a new one"
              ) % date)

        if self.event_frame is not None:
            self.event_frame.destroy()

        self.event_frame = Frame(self.interior)
        self.event_frame.pack()
        row_counter = 0
        for event in event_list:
            description = AlexLabel(self.event_frame,
                                    wraplength=500,
                                    justify=LEFT,
                                    text=event.description)
            description.grid(row=row_counter, column=0, sticky=W)

            def closure(event):
                return lambda: self._set_return_value(event)

            button = AlexButton(self.event_frame,
                                text=_("Goto event"),
                                command=closure(event))
            button.grid(row=row_counter, column=1)
            row_counter += 1
    def create_dialog(self):
        '''
        Extend this method in your child class. It already
        provides three frames: interior, buttons_frame and
        errormessage. The errormessage frame already has
        a label that may be read and set by the errormessage
        property.
        To set default buttons in the button_frame, use the
        set default buttons.
        Other buttons may be set through the add_button method.
        '''

        self.window = self.window_manager.create_new_window()
        self.window.protocol("WM_DELETE_WINDOW",
                             lambda: self._set_return_value(None))
        self.window.transient()
        self.window.attributes('-topmost', True)
        self.window.withdraw()

        self.interior = Frame(self.window)
        self.interior.pack()

        self.buttons_frame = Frame(self.window)
        self.buttons_frame.pack()

        self.message_frame = Frame(self.window)
        self.message_frame.pack()

        self._errormessage = AlexLabel(self.message_frame)
        self._errormessage.pack(side=TOP)
    def create_dialog(self):
        super().create_dialog()

        self.earliest_date_entry = AlexDateEntry(self.interior,
                                                 label=_("Earliest Date"))
        self.earliest_date_entry.grid(row=3,
                                      column=0,
                                      sticky=W,
                                      pady=5,
                                      columnspan=2)
        self.latest_date_entry = AlexDateEntry(self.interior,
                                               label=_("Latest Date"))
        self.latest_date_entry.grid(row=4,
                                    column=0,
                                    sticky=W,
                                    pady=5,
                                    columnspan=2)

        AlexLabel(self.interior, text=_("Only local events")).grid(row=5,
                                                                   column=0,
                                                                   sticky=W,
                                                                   pady=5)
        self.local_only_checkbox = AlexCheckBox(self.interior)
        self.local_only_checkbox.grid(row=5, column=1, sticky=W, pady=5)

        AlexLabel(self.interior,
                  text=_("Only unverified events")).grid(row=6,
                                                         column=0,
                                                         sticky=W,
                                                         pady=5)
        self.unverified_only_checkbox = AlexCheckBox(self.interior)
        self.unverified_only_checkbox.grid(row=6, column=1, sticky=W, pady=5)
class ReferenceView(Frame):  # @UndefinedVariable
    def __init__(self, parent, presenter, label):
        super().__init__(parent, borderwidth=1, relief=RIDGE)
        self.parent = parent
        self.presenter = presenter
        self.presenter.view = self

        self.labelframe = Frame(self)
        self.labelframe.pack(pady=5)

        self.listbox = AlexComboBox(self)
        self.listbox.pack(fill=X, padx=5)

        self._add_label(label)
        self.pack(side=LEFT, padx=5, pady=5)

        self.buttonframe = Frame(self)
        self.buttonframe.pack()
        self.buttons = []

    def _add_label(self, label):

        self.label = AlexLabel(self.labelframe)
        self.label.pack()
        self.label.set(label)

    def _set_items(self, items):
        self.deactivate()
        self.listbox.set_items(items)
        self.activate()

    def _get_selected_item(self):
        return self.listbox.get()

    def _get_items(self):
        return self.listbox.get_items()

    def add_button(self, action):
        self.buttons.append(
            AlexButton(self.buttonframe,
                       text=action.label,
                       command=action.callback))
        self.buttons[-1].pack(side=LEFT, padx=5, pady=5)

    def deactivate(self):
        for button in self.buttons:
            button.configure(state=DISABLED)

    def activate(self):
        for button in self.buttons:
            button.configure(state=NORMAL)

    def show_message(self, message_text):
        messagebox.showinfo(_("Hint"), message_text)

    items = property(_get_items, _set_items)
    selected_item = property(_get_selected_item)
    def create_dialog(self):
        super().create_dialog()
        self.set_default_buttons()

        self.label = AlexLabel(self.interior)
        self.label.pack()

        self.entry = AlexEntry(self.interior)
        self.entry.pack()
    def create_dialog(self):

        super().create_dialog()

        self.add_button(_('Create new event'), self.presenter.cancel_action)
        self.label = AlexLabel(self.interior,
                               wraplength=550,
                               font=("Helvetica", 14, "bold"))
        self.label.pack()
        self.event_frame = None
    def create_dialog(self):

        super().create_dialog()

        self.label = AlexLabel(self.interior)
        self.label.pack(side=TOP, padx=5, pady=5)

        filter_frame = Frame(self.interior)
        AlexLabel(filter_frame, text=_('Search tree:')).pack(side=LEFT, pady=5)
        self.filter_entry = AlexEntry(filter_frame)
        self.filter_entry.bind("<KeyRelease>",
                               lambda event: self._apply_filter(event))
        self.filter_entry.pack(side=LEFT, fill=X, expand=YES)
        filter_frame.pack(side=TOP, expand=YES, fill=X)

        self.set_default_buttons()
    def create_signature_entry(self):

        AlexLabel(self.interior, text=_("Signature:")).grid(row=3,
                                                            column=0,
                                                            sticky=W)
        self.signature_widget = AlexEntry(self.interior)
        self.signature_widget.grid(row=3, column=1, sticky=W, pady=5)
class GenericBooleanSelectionDialog(AbstractInputDialog):
    @inject
    def __init__(self, window_manager: guiinjectorkeys.WINDOW_MANAGER_KEY,
                 presenter: guiinjectorkeys.GENERIC_INPUT_DIALOG_PRESENTER):
        super().__init__(window_manager, presenter)

    def create_dialog(self):
        super().create_dialog()
        self.add_button(_('Yes'), self.presenter.yes_action)
        self.add_button(_('No'), self.presenter.no_action)
        self.label = AlexLabel(self.interior)
        self.label.pack(padx=20, pady=20)

    def config_dialog(self, question=('Select yes or no')):

        self.label.set(question)
class AlexLabelTest(AbstractComponentTest):
    def __init__(self):
        super().__init__()
        self.name = "Alex label test"

    def test_component(self, master, message_label):

        self.message_label = message_label
        self.master = master

        self.label1 = AlexLabel(master)
        self.label1.set('Label text:')
        self.label1.grid(row=0, column=0)

        self.entry1 = AlexEntry(master)
        self.entry1.set("Enter label text")
        self.entry1.grid(row=0, column=1)

        AlexButton(master, text='Set label text',
                   command=self._set_label_text).grid(row=1, column=0)
        AlexButton(master,
                   text='Set entry from label',
                   command=self._set_entry_from_label).grid(row=1, column=1)

    def _set_label_text(self):

        self.label1.set(self.entry1.get())
        self.entry1.set('')

    def _set_entry_from_label(self):

        self.entry1.set(self.label1.get())
 def create_dialog(self):
     super().create_dialog()
     for input_field in range(0, self.number_of_entries):
         date_entry = DateEntryFrame(self.interior)
         date_entry.day_entry.bind('<KeyRelease>',
                                   lambda event, i=input_field, f='day':
                                   self._on_change(event, i, f))
         date_entry.month_entry.bind('<KeyRelease>',
                                     lambda event, i=input_field, f='month':
                                     self._on_change(event, i, f))
         date_entry.year_entry.bind('<KeyRelease>',
                                    lambda event, i=input_field, f='year':
                                    self._on_change(event, i, f))
         date_entry.pack(padx=10)
         self.date_entry.append(date_entry)
     empty_label = AlexLabel(self.interior)
     empty_label.pack()
     self.set_default_buttons()
    def test_component(self, master, message_label):

        self.message_label = message_label
        self.master = master

        self.label1 = AlexLabel(master)
        self.label1.set('Label text:')
        self.label1.grid(row=0, column=0)

        self.entry1 = AlexEntry(master)
        self.entry1.set("Enter label text")
        self.entry1.grid(row=0, column=1)

        AlexButton(master, text='Set label text',
                   command=self._set_label_text).grid(row=1, column=0)
        AlexButton(master,
                   text='Set entry from label',
                   command=self._set_entry_from_label).grid(row=1, column=1)
Exemple #15
0
    def create_signature_entry(self):

        AlexLabel(self.interior, text=_("Signature:")).grid(row=3,
                                                            column=0,
                                                            sticky=W)
        self.signature_widget = AlexButton(self.interior,
                                           command=self._select_signature)
        self.signature_widget.set(self.NO_SYSTEMATIC_POINT_SELECTED)
        self.signature_widget.grid(row=3, column=1, sticky=W)
 def _add_page1_content(self):
     event_selection_frame = Frame(self.page(1))
     self.add_page_body(event_selection_frame)
     AlexLabel(event_selection_frame,
               text=_("Please select an event:")).pack(side=TOP)
     self.event_list_box = AlexListBox(event_selection_frame,
                                       width=50,
                                       height=5)  # @UndefinedVariable
     self.event_list_box.pack(fill=BOTH)
class EventConfirmationDialog(AbstractInputDialog):
    @inject
    def __init__(self, window_manager: guiinjectorkeys.WINDOW_MANAGER_KEY,
                 presenter: guiinjectorkeys.EVENT_CONFIRMATION_PRESENTER_KEY):
        super().__init__(window_manager, presenter)

    def create_dialog(self):

        super().create_dialog()

        self.add_button(_('Create new event'), self.presenter.cancel_action)
        self.label = AlexLabel(self.interior,
                               wraplength=550,
                               font=("Helvetica", 14, "bold"))
        self.label.pack()
        self.event_frame = None

    def config_dialog(self, event_list=[], date=None):

        self.label.set(
            _("Events exist on %s. Please select the event you want or create a new one"
              ) % date)

        if self.event_frame is not None:
            self.event_frame.destroy()

        self.event_frame = Frame(self.interior)
        self.event_frame.pack()
        row_counter = 0
        for event in event_list:
            description = AlexLabel(self.event_frame,
                                    wraplength=500,
                                    justify=LEFT,
                                    text=event.description)
            description.grid(row=row_counter, column=0, sticky=W)

            def closure(event):
                return lambda: self._set_return_value(event)

            button = AlexButton(self.event_frame,
                                text=_("Goto event"),
                                command=closure(event))
            button.grid(row=row_counter, column=1)
            row_counter += 1
    def create_dialog(self):
        super().create_dialog()

        self.create_signature_entry()

        AlexLabel(self.interior, text=_("No event link:")).grid(row=4,
                                                                column=0,
                                                                sticky=W)
        self.missing_event_checkbox = AlexCheckBox(self.interior)
        self.missing_event_checkbox.grid(row=4, column=1, sticky=W, pady=5)
 def create_dialog(self):
     super().create_dialog()
     self.add_button(_("Set filter"), self.presenter.ok_action)
     self.add_button(_("Clear form"), self._clear_filter_form)
     self.add_button(_("Cancel"), self.presenter.cancel_action)
     self.search_term_entries = []
     for i in range(1, 4):
         AlexLabel(self.interior,
                   text=_("%d. search expression:") % i).grid(row=i - 1,
                                                              column=0,
                                                              sticky=W)
         entry = AlexEntry(self.interior)
         entry.grid(row=i - 1, column=1, sticky=W, pady=5)
         self.search_term_entries.append(entry)
Exemple #20
0
    def __init__(self, test_classes):

        self.message_broker = MessageBroker()
        self.window_manager = WindowManager(self.message_broker)

        self.create_test_instances(test_classes)

        self.root = self.window_manager.create_new_window()
        geometry = '800x450'
        self.root.geometry(geometry)

        self.test_frame = None

        top_frame = Frame(self.root)
        top_frame.pack(side=TOP, fill=BOTH, expand=TRUE)

        message_frame = Frame(self.root)
        message_frame.pack(side=TOP)

        button_frame = Frame(self.root)
        button_frame.pack(side=TOP)

        self.message_label = AlexLabel(message_frame)
        self.message_label.pack(side=LEFT)

        self.menu_frame = Frame(top_frame)
        self.menu_frame.pack(side=LEFT, anchor=NW, padx=5)

        label = AlexLabel(self.menu_frame)
        label.set("Select a test")
        label.pack()

        self.tests = AlexListBox(
            self.menu_frame,  # @UndefinedVariable
            height=len(self.test_instances),
            selectioncommand=self.run_selected_test,
        )

        self.tests.set_items(self.test_instances)
        self.tests.pack(anchor=NW)

        self.widget_frame = Frame(top_frame, borderwidth=1, relief=SOLID)
        self.widget_frame.pack(side=LEFT, fill=BOTH, expand=TRUE)

        quit_button = Button(button_frame, command=self.root.quit, text="Quit")
        quit_button.pack(side=LEFT)
class GenericTreeSelectionDialog(AbstractInputDialog):
    def __init__(self, window_manager, presenter):

        super().__init__(window_manager, presenter)

        self.tree_widget = None
        self.filter_is_set = False

    def create_dialog(self):

        super().create_dialog()

        self.label = AlexLabel(self.interior)
        self.label.pack(side=TOP, padx=5, pady=5)

        filter_frame = Frame(self.interior)
        AlexLabel(filter_frame, text=_('Search tree:')).pack(side=LEFT, pady=5)
        self.filter_entry = AlexEntry(filter_frame)
        self.filter_entry.bind("<KeyRelease>",
                               lambda event: self._apply_filter(event))
        self.filter_entry.pack(side=LEFT, fill=X, expand=YES)
        filter_frame.pack(side=TOP, expand=YES, fill=X)

        self.set_default_buttons()

    def config_dialog(self, label=_('Select a tree node')):
        self.label.set(label)

    def _apply_filter(self, event):
        filter_string = self.filter_entry.get()
        if len(filter_string) > 2:
            visible_nodes = self.tree_widget.apply_filter(filter_string)
            if visible_nodes < 20:
                self.tree_widget.expand_all()
            self.filter_is_set = True
        else:
            if self.filter_is_set:
                self.tree_widget.clear_filter()
                self.filter_is_set = False

    def set_tree(self, tree):
        if self.tree_widget is not None:
            self.tree_widget.destroy()
        self.tree_widget = AlexTree(self.interior, tree)
        self.tree_widget.pack()

    def activate(self, callback, label):
        if self.window is not None:
            self.label.set(label)
        super().activate(callback, label=label)

    input = property(lambda self: self.tree_widget.get())
    tree = property(None, set_tree)
    def create_dialog(self):

        super().create_dialog()

        label = AlexLabel(self.interior)
        label.set("%s:" % _('Please select year'))
        label.pack()

        self.year_combo_box = AlexComboBox(self.interior)
        self.year_combo_box.pack(padx=5, pady=5)

        self.set_default_buttons()
Exemple #23
0
    def create_dialog(self):
        super().create_dialog()

        AlexButton(self.buttons_frame,
                   text=_("Create chronology"),
                   command=self.presenter.ok_action).pack(side=LEFT)
        AlexButton(self.buttons_frame,
                   text=_("Cancel"),
                   command=self.presenter.cancel_action).pack(side=LEFT)

        self.quarter_select = AlexRadioGroup(self.interior,
                                             title=_('Quarter'),
                                             choices=self.quarters)
        self.quarter_select.pack()

        AlexLabel(self.interior, text=_(_("Year"))).pack(side=LEFT,
                                                         padx=10,
                                                         pady=10)
        self.year_entry = AlexEntry(self.interior)
        self.year_entry.pack(side=LEFT, padx=10, pady=10)
    def create_dialog(self):

        self.window = self.window_manager.create_new_window()
        self.window.withdraw()

        super().__init__(self.window)
        self.pack()

        label = AlexLabel(self)
        label.set(_("Please select user:"))
        label.pack(padx=5, pady=5)

        self.combobox = AlexComboBox(self)
        self.combobox.pack(padx=5, pady=5)

        buttonframe = Frame(self)
        buttonframe.pack(padx=5, pady=5)

        AlexButton(buttonframe, text=_('OK'),
                   command=self.presenter.ok_action).pack(side=LEFT)
        AlexButton(buttonframe,
                   text=_('Cancel'),
                   command=self.presenter.cancel_action).pack(side=LEFT)
    def test_component(self, master, message_label):
        self.message_label = message_label
        self.master = master

        label1 = AlexLabel(master)
        label1.set('Entry 1:')
        label1.grid(row=0, column=0)

        self.entry1 = AlexEntry(master)
        self.entry1.set("Entry 1 text")
        self.entry1.grid(row=0, column=1)

        label2 = AlexLabel(master)
        label2.set('Entry 2:')
        label2.grid(row=1, column=0)

        self.entry2 = AlexEntry(master)
        self.entry2.set("Entry 2 text")
        self.entry2.grid(row=1, column=1)

        AlexButton(master, text='Switch input',
                   command=self._switch_input).grid(row=2, column=1)
 def create_dialog(self):
     super().create_dialog()
     self.add_button(_('Yes'), self.presenter.yes_action)
     self.add_button(_('No'), self.presenter.no_action)
     self.label = AlexLabel(self.interior)
     self.label.pack(padx=20, pady=20)
class BaseWindow(Frame):
    """
        This class handles a lot of the functionality of the
        main windows of the application that are not dependent
        on the record type: menus, navigation buttons, the references
        grid etc.
    
    """
    GOTO_DIALOG = 'goto_dialog'
    FILTER_DIALOG = 'filter_dialog'

    def __init__(self, window_manager, message_broker, presenter, dialogs,
                 plugins):

        self.window_manager = window_manager
        self.window = self.window_manager.create_new_window()
        self.window.withdraw()

        message_broker.subscribe(self)

        super().__init__(self.window)

        self.presenter = presenter
        self.presenter.view = self

        self.dialogs = dialogs
        self.plugins = plugins

        self._entity = None
        self._entity_has_changed = False

        self.references = []
        self.new_record_id = None
        self.filter_object = None

        self._add_frames()

        self.references_frame = Frame(self.window, border=2, relief=RIDGE)
        self.references_frame.pack(side=TOP, anchor=NW, expand=YES, fill=BOTH)

        self._add_message_bar()

    def receive_message(self, message):
        if message == CONF_SETUP_FINISHED:
            self.show_window()

    def show_window(self):

        self.window.deiconify()

    def _get_icon_dir(self):
        this_module = BaseWindow.__module__
        this_file = os.path.abspath(sys.modules[this_module].__file__)
        this_directory = os.path.dirname(this_file)
        return os.path.join(this_directory, 'Icons')

    def _add_frames(self):

        top = Frame(self.window)
        top.pack(fill=X, expand=1)

        self._add_menu(top)

        self._add_filter_warning(self.window)

        self.entity_frame = Frame(self.window)
        self.entity_frame.pack(side=TOP, anchor=NW)
        self._populate_entity_frame()

    def _add_menu(self, parent):

        # pylint: disable=no-member
        self.menubar = AlexMenuBar(parent)
        self.window.config(menu=self.menubar)

        self.menubar.addmenu(_('Records'), '')
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('First record'),
                                 command=self.presenter.goto_first)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('Last record'),
                                 command=self.presenter.goto_last)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('Next record'),
                                 command=self.presenter.goto_next)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('Previous record'),
                                 command=self.presenter.goto_previous)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('New record'),
                                 command=self._create_new)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('Delete record'),
                                 command=self.presenter.delete)
        self.menubar.addmenuitem(_('Records'),
                                 'command',
                                 label=_('Quit'),
                                 command=self.presenter.quit)

        self.menubar.addmenu(_('Navigation'))
        self.menubar.addmenuitem(_('Navigation'),
                                 'command',
                                 label=_('Goto record'),
                                 command=self._activate_record_dialog)
        self.menubar.addmenuitem(_('Navigation'),
                                 'command',
                                 label=_('Filtering'),
                                 command=self._toggle_filter)

        self.shortcutbar = AlexShortcutBar(parent)
        self.shortcutbar.pack(side=LEFT)

        icondir = self._get_icon_dir()

        self.shortcutbar.addshortcut(imagefile=os.path.join(
            icondir, 'first.gif'),
                                     command=self.presenter.goto_first,
                                     tooltip=_('Goto first record'))
        self.shortcutbar.addshortcut(imagefile=os.path.join(
            icondir, 'previous.gif'),
                                     command=self.presenter.goto_previous,
                                     tooltip=_('Go one record back'))
        self.shortcutbar.addshortcut(imagefile=os.path.join(
            icondir, 'new.gif'),
                                     command=self._create_new,
                                     tooltip=_('Create a new record'))
        self.shortcutbar.addshortcut(imagefile=os.path.join(
            icondir, 'next.gif'),
                                     command=self.presenter.goto_next,
                                     tooltip=_('Go one record forward'))
        self.shortcutbar.addshortcut(imagefile=os.path.join(
            icondir, 'last.gif'),
                                     command=self.presenter.goto_last,
                                     tooltip=_('Goto last record'))

        for plugin in self.plugins:
            plugin.attach_to_window(self)

    def _add_filter_warning(self, parent):

        self.filter_warning = AlexLabel(parent, text="", foreground='red')
        self.filter_warning.pack(side=TOP)

    def add_references(self, reference_factories):

        side = RIGHT

        for factory in reference_factories:
            if side == RIGHT:
                row = Frame(self.references_frame)
                row.pack(side=TOP, expand=YES, fill=BOTH)
                side = LEFT
            else:
                side = RIGHT
            view = factory.get_view(row)
            self.references.append(view)
            view.pack(side=side, expand=YES, fill=BOTH, padx=5, pady=5)

    def _add_message_bar(self):

        message_frame = Frame(self.window)
        message_frame.pack(side=TOP, anchor=NW, fill=X, expand=1)
        message_bar = AlexMessageBar(message_frame)
        message_bar.pack(fill=X, expand=1)
        # TODO: inject message broker into windows
        self.presenter.message_broker.subscribe(message_bar)

    def entity_has_changed(self):
        if self._entity_has_changed:
            return True
        self._view_to_entity()
        return self._entity_has_changed

    def _populate_entity_frame(self):
        raise Exception("Implement in child class!")

    def _entity_to_view(self, entity):
        raise Exception("Implement in child class!")

    def _view_to_entity(self):
        raise Exception("Implement in child class!")

    def _execute_dialog(self, dialog, *params, **kw):
        return self.dialogs[dialog].activate(*params, **kw)

    def _toggle_filter(self):
        if self.filter_object is None:
            self.dialogs[self.FILTER_DIALOG].activate(self._activate_filter)
        else:
            self.filter_object = None
            self.presenter.update_filter_expression()
            self.filter_warning.configure(text="")

    def _activate_filter(self, filter_object):
        self.filter_object = filter_object
        self.presenter.update_filter_expression()
        self.filter_warning.configure(text=_("Filter is set!"))
        self.presenter.goto_first()

    def _activate_record_dialog(self):
        self.dialogs[self.GOTO_DIALOG].activate(self._goto_record)

    def _goto_record(self, record_id):
        self.new_record_id = record_id
        self.presenter.goto_record()

    # This is kind of hackish because we want to be able to overwrite the setters
    # and getters in child classes. Without lambda, it would use the methods
    # in the parent class
    entity = property(lambda self: self._view_to_entity(),
                      lambda self, entity: self._entity_to_view(entity))
class DocumentWindow(BaseWindow):
    '''
    The window for manipulating documents.
    '''
    @inject
    @singleton
    def __init__(self, window_manager: guiinjectorkeys.WINDOW_MANAGER_KEY,
                 message_broker: guiinjectorkeys.MESSAGE_BROKER_KEY,
                 presenter: guiinjectorkeys.DOCUMENT_WINDOW_PRESENTER_KEY,
                 dialogs: guiinjectorkeys.DOCUMENT_WINDOW_DIALOGS_KEY,
                 document_menu_additions: guiinjectorkeys.
                 DOCUMENT_MENU_ADDITIONS_KEY):
        self.notebook = None
        self._description_widget = None
        self._condition_widget = None
        self._keywords_widget = None
        super().__init__(window_manager, message_broker, presenter, dialogs,
                         document_menu_additions)
        self.window.title(_("Alexandria documents"))

    def _create_new(self):
        self.presenter.create_new()

    def _change_widget_state(self, state):
        self._description_widget.configure(state=state)
        self._condition_widget.configure(state=state)
        self._keywords_widget.configure(state=state)

    def _clear_widgets(self):
        self._document_label.set(_("No document available"))
        self._description_widget.set('')
        self._condition_widget.set('')
        self._keywords_widget.set('')

    def _disable_widgets(self):
        self._change_widget_state(DISABLED)

    def _enable_widgets(self):
        self._change_widget_state(NORMAL)

    def _populate_entity_frame(self):
        # pylint: disable=no-member
        self._document_label = AlexLabel(self.entity_frame,
                                         text=_("No document available"))
        self._document_label.pack(padx=7, pady=7)
        self.notebook = Notebook(self.entity_frame, width=600)
        self.notebook.pack(fill=X)
        description = Frame(self.notebook)
        self.notebook.add(description, text=_('Description'))
        self._description_widget = AlexText(description,
                                            font="Helvetica 12 bold",
                                            wrap=WORD,
                                            height=6)
        self._description_widget.pack(fill=X)
        condition = Frame(self.notebook)
        self.notebook.add(condition, text=_('Condition'))
        self._condition_widget = AlexText(condition,
                                          font="Helvetica 12 bold",
                                          wrap=WORD,
                                          height=6)
        self._condition_widget.pack(fill=X)
        keywords = Frame(self.notebook)
        self.notebook.add(keywords, text=_('Keywords'))
        self._keywords_widget = AlexText(keywords,
                                         font="Helvetica 12 bold",
                                         wrap=WORD,
                                         height=6)
        self._keywords_widget.pack(fill=X)

    def _view_to_entity(self):
        if self._entity == None:
            return None

        if self._description_widget.get() != self._entity.description:
            self._entity_has_changed = True
            self._entity.description = self._description_widget.get()
        if self._condition_widget.get() != self._entity.condition:
            self._entity_has_changed = True
            self._entity.condition = self._condition_widget.get()
        if self._keywords_widget.get() != self._entity.keywords:
            self._entity_has_changed = True
            self._entity.keywords = self._keywords_widget.get()

        return self._entity

    def _entity_to_view(self, entity):

        if self._entity != entity:
            self._entity_has_changed = False

        if self._entity == None:
            self._enable_widgets()

        self._entity = entity
        if entity == None:
            self._clear_widgets()
            self._disable_widgets()
            return

        if self._entity.id == None:
            self._document_label.set(_("New document"))
        else:
            self._document_label.set(
                _("Document no.{0:d} ({1!s})").format(
                    self._entity.id, self._entity.document_type.description))
        self._description_widget.set(self._entity.description)
        self._condition_widget.set(self._entity.condition)
        self._keywords_widget.set(self._entity.keywords)
    def _add_filter_warning(self, parent):

        self.filter_warning = AlexLabel(parent, text="", foreground='red')
        self.filter_warning.pack(side=TOP)
    def _add_label(self, label):

        self.label = AlexLabel(self.labelframe)
        self.label.pack()
        self.label.set(label)