changeset 11:fe9c55f86698

Improvements in navigation buttons
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Wed, 24 Nov 2010 22:56:02 +0100
parents d2cbc0278b30
children 29a4044a95ff
files Generic/globalVars.py Gtk/gui.py Gtk/importFiebdc.py images/budget.svg mo/es/LC_MESSAGES/pyArq-Presupuestos.mo mo/pyArq-Presupuestos.es.po mo/pyArq-Presupuestos.pot
diffstat 7 files changed, 811 insertions(+), 580 deletions(-) [+]
line wrap: on
line diff
--- a/Generic/globalVars.py	Fri Nov 19 19:17:11 2010 +0100
+++ b/Generic/globalVars.py	Wed Nov 24 22:56:02 2010 +0100
@@ -24,7 +24,7 @@
 # path: Paths where find the program files needed
 
 version = "pyArq Presupuestos v0.0.0"
-changeset = 7
+changeset = 10
 baseversion = 0
 path = {
     "HOME" : "",
--- a/Gtk/gui.py	Fri Nov 19 19:17:11 2010 +0100
+++ b/Gtk/gui.py	Wed Nov 24 22:56:02 2010 +0100
@@ -74,6 +74,13 @@
     print utils.mapping(_("pyArq-Presupuestos running on $1"),
                         (globalVars.desktop["desktop"],))
 
+# Add MenutoolButton to Uimanager
+class MenuToolAction(gtk.Action):
+       __gtype_name__ = "MenuToolAction"
+
+gobject.type_register(MenuToolAction)
+MenuToolAction.set_tool_item_type(gtk.MenuToolButton)
+
 
 class MainWindow(object):
     """gui.MainWindow:
@@ -87,14 +94,14 @@
     +-- object
       +-- MainWindow
     Atributes:
-        notebook: Read. notebook widget
-        pageList: Read. page list
-        budgetList: Read. budget list
     Methods:
-        removePage
+        changeHistorySignal
+        changeActiveSignal
+        appendEmptyPage
+        updatePage
+        closePage
     """
     # TODO:* Can choose open budget in new window
-    # TODO:* gtk.Action for menu and toolbar
     # TODO:* Can choose show more than one notebook in the same window or
     # TODO:  can show basedata notebook in a side pane
     __ui = '''<ui>
@@ -106,10 +113,9 @@
       <menu action="View">
       </menu>
       <menu action="Go">
-        <menuitem action="GoUp"/>
-        <menuitem action="GoDown"/>
         <menuitem action="GoPrevious"/>
         <menuitem action="GoPosterior"/>
+        <menuitem action="GoUp"/>
         <menuitem action="GoToRoot"/>
       </menu>
       <menu action="Test">
@@ -121,10 +127,9 @@
       <toolitem action="ImportFiebdc"/>
       <toolitem action="Close"/>
       <separator name="sep1"/>
+      <toolitem action="GoPrevMenu"/>
+      <toolitem action="GoPostMenu"/>
       <toolitem action="GoUp"/>
-      <toolitem action="GoDown"/>
-      <toolitem action="GoPrevious"/>
-      <toolitem action="GoPosterior"/>
       <toolitem action="GoToRoot"/>
     </toolbar>
     </ui>'''
@@ -132,19 +137,16 @@
     def __init__(self):
         """__init__()
         
-        Initialize the atributes "__budget_list" and "__page_list" without data.
+        Initialize the atributes self.__page_list without data.
         Creates the widgets "window" and "__notebook".
         
         self.__window: gtk.Window object
-        self.__budget_temp_list: Temporal list of budgets
-        self.__budget_list: List of budgets ("base.Budget" objects)
+        self.__uimanager: gtk.UIManager object
         self.__page_list: List of pages ("Page" object)
         self.__notebook: Notebook widget ("gtk.Notebook" object)
         self.__general_action_group: "General" action group
+        self.__navigation_action_group: "Navigation" action group
         """
-        #TODO: action group for Navigation buttons
-        self.__budget_temp_list = []
-        self.__budget_list = []
         self.__page_list = []
         # Main window
         self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL)
@@ -158,12 +160,11 @@
         self.__window.add(_vbox1)
         _vbox1.show()
         #Uimanager
-        _uimanager = gtk.UIManager()
-        _accelgroup = _uimanager.get_accel_group()
+        self.__uimanager = gtk.UIManager()
+        _accelgroup = self.__uimanager.get_accel_group()
         self.__window.add_accel_group(_accelgroup)
-        _general_action_group = gtk.ActionGroup("General")
-        self.__general_action_group = _general_action_group
-        _general_action_group.add_actions(
+        self.__general_action_group = gtk.ActionGroup("General")
+        self.__general_action_group.add_actions(
             [("File", None, _("_File"), None),
              ("ImportFiebdc", gtk.STOCK_OPEN, _('_Import Fiebdc'), "",
                 _('Import FIEBDC'), self._menuitemImportFiebdc),
@@ -171,16 +172,6 @@
                 self._menuitemClose),
              ("View", None, _("_View")),
              ("Go", None, _("_Go")),
-             ("GoUp", gtk.STOCK_GO_UP, _("_Up Record"),"",
-                _("Go up record"), self._menuitemGoUp),
-             ("GoDown", gtk.STOCK_GO_DOWN, _("_Down Record"),"",
-                _("Go down record"), self._menuitemGoDown),
-             ("GoPrevious", gtk.STOCK_GO_BACK, _("_Previous Record"),"",
-                _("Go Previous record"), self._menuitemGoPrevious),
-             ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Posterior Record"),"",
-                _("Go posterior record"), self._menuitemGoPosterior),
-             ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"",
-                _("Go to root"), self._menuitemGoToRoot),
              ("Test", None, _("_Test")),
              ('ImportFiebdcPriceDatabase', gtk.STOCK_OPEN,
                 _("Import Fiebdc _price database"), "", _("Import database"),
@@ -188,14 +179,51 @@
              ("OpenPriceDatabase", gtk.STOCK_OPEN, _('_Open price database'),
                 "", _('Open Database'), self._menuitemOpenPriceDatabase),
             ])
-        _uimanager.insert_action_group(_general_action_group, 0)
-        _uimanager.add_ui_from_string(self.__ui)
-        _menu_bar = _uimanager.get_widget("/MenuBar")
+        self.__navigation_action_group = gtk.ActionGroup("Navigation")
+        self.__navigation_action_group.add_actions(
+            [("Go", None, _("_Go")),
+             ("GoPrevious", gtk.STOCK_GO_BACK, _("_Back"),"",
+                _("Go to the previous visited item"),
+                  self._menuitemGoPrevious),
+             ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Forward"),"",
+                _("Go to the next visited item"), self._menuitemGoPosterior),
+             ("GoUp", gtk.STOCK_GO_UP, _("_Up Item"),"",
+                _("Go up item"), self._menuitemGoUp),
+             ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"",
+                _("Go to root"), self._menuitemGoToRoot),
+            ])
+        self.__navigation_action_group.add_action(
+            MenuToolAction("GoPrevMenu", None ,
+                           _("Go to the previous visited item"),
+                           gtk.STOCK_GO_BACK))
+        self.__navigation_action_group.add_action(
+             MenuToolAction("GoPostMenu", None ,
+                           _("Go to the next visited item"),
+                           gtk.STOCK_GO_FORWARD))
+        self.__navigation_action_group.set_sensitive(False)
+        self.__navigation_action_group.get_action("GoPostMenu").set_sensitive(
+            False)
+        self.__navigation_action_group.get_action("GoPrevMenu").set_sensitive(
+            False)
+        self.__uimanager.insert_action_group(self.__general_action_group, 0)
+        self.__uimanager.insert_action_group(self.__navigation_action_group, 1)
+        self.__uimanager.add_ui_from_string(self.__ui)
+        _menu_bar = self.__uimanager.get_widget("/MenuBar")
         _vbox1.pack_start(_menu_bar, False, False, 0)
-        _toolbar = _uimanager.get_widget("/ToolBar")
+        _toolbar = self.__uimanager.get_widget("/ToolBar")
         _toolbar.get_settings().set_long_property("gtk-toolbar-icon-size",
             gtk.ICON_SIZE_SMALL_TOOLBAR, "pyArq-Presupuestos:toolbar")
         _vbox1.pack_start(_toolbar, False, False, 0)
+        # menuToolButton go prev
+        _go_prev_button = self.__uimanager.get_widget(
+            "/ToolBar/GoPrevMenu")
+        _go_prev_button.set_arrow_tooltip_text(_("Back history"))
+        _go_prev_button.connect('clicked', self._menuitemGoPrevious)
+        # menuToolButton go pos
+        _go_post_button = self.__uimanager.get_widget(
+            "/ToolBar/GoPostMenu")
+        _go_post_button.set_arrow_tooltip_text(_("Forward history"))
+        _go_post_button.connect('clicked', self._menuitemGoPosterior)
         # Notebook
         self.__notebook = gtk.Notebook()
         _vbox1.pack_start(self.__notebook, True, True, 0)
@@ -203,8 +231,95 @@
         self.__notebook.set_show_tabs(True)
         self.__notebook.set_show_border(True)
         self.__notebook.set_scrollable(True)
+        self.__notebook.connect("switch-page", self._switch_page)
         self.__notebook.show()
         self._main()
+        #TODO: create budget object in mainwindow?
+
+    def changeHistorySignal(self):
+        """changeHistorySignal()
+        
+        A pane emit the updateHistory signal.
+        
+        Nothing to do now
+        """
+        pass
+
+    def changeActiveSignal(self):
+        """changeActiveSignal()
+        
+        A pane emit the change-active signal.
+        
+        Chech buttons sensitive
+        """
+        self._checkButtonsSensitive(self.__notebook.get_current_page())
+
+    def _checkButtonsSensitive(self, page_num):
+        """_checkButtonsSensitive(page_num)
+        
+        page_num: page number in notebook
+        
+        Check and if necessary update the sensitive state of the navigation
+        buttons.
+        """
+        _page = self.__page_list[page_num]
+        if isinstance(_page, Page) and \
+           self.__navigation_action_group.get_sensitive():
+            # GoToRoot and GoUp actions
+            _goto_root = self.__navigation_action_group.get_action("GoToRoot")
+            _go_up = self.__navigation_action_group.get_action("GoUp")
+            if len(_page.activePathRecord) == 1 and \
+               _goto_root.get_sensitive():
+                _goto_root.set_sensitive(False)
+                _go_up.set_sensitive(False)
+            elif len(_page.activePathRecord) != 1 and \
+               not _goto_root.get_sensitive():
+                _goto_root.set_sensitive(True)
+                _go_up.set_sensitive(True)
+            # GoPrevMenu action
+            _go_Previous = self.__navigation_action_group.get_action(
+                "GoPrevious")
+            _go_prev = self.__navigation_action_group.get_action("GoPrevMenu")
+            if _page.previousPathRecord is None:
+                if _go_prev.get_sensitive():
+                    _go_prev.set_sensitive(False)
+                    _go_Previous .set_sensitive(False)
+            else:
+                if not _go_prev.get_sensitive():
+                    _go_prev.set_sensitive(True)
+                    _go_Previous.set_sensitive(True)
+            # GoPostMenu action
+            _go_Posterior = self.__navigation_action_group.get_action(
+                "GoPosterior")
+            _go_post = self.__navigation_action_group.get_action("GoPostMenu")
+            if _page.posteriorPathRecord is None:
+                if _go_post.get_sensitive():
+                    _go_post.set_sensitive(False)
+                    _go_Posterior.set_sensitive(False)
+            else:
+                if not _go_post.get_sensitive():
+                    _go_post.set_sensitive(True)
+                    _go_Posterior.set_sensitive(True)
+
+    def _switch_page(self, notebook, page, page_num,):
+        """_switch_page(notebook, page, page_num)
+         
+        Method connected to the "switch-page" signal of the notebook widget
+        
+        It changes the sensitive state of the navigation action group
+        """
+        _page = self.__page_list[page_num]
+        if isinstance(_page, EmptyPage) and \
+           self.__navigation_action_group.get_sensitive():
+            self.__navigation_action_group.set_sensitive(False)
+        elif isinstance(_page, Page):
+            if not self.__navigation_action_group.get_sensitive():
+                self.__navigation_action_group.set_sensitive(True)
+            self._checkButtonsSensitive(page_num)
+            _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu")
+            _go_prev.set_menu(_page.back_menu)
+            _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu")
+            _go_post.set_menu(_page.forward_menu)
 
     def _main(self):
         """main()
@@ -214,31 +329,32 @@
         self.__window.show()
         gtk.main()
 
-    def _addBudget(self, budget):
-        """_addBudget(budget)
-        
-        budget: "base.Budget" object
-        
-        Appends a budget in the "__budget_list"
+    def appendEmptyPage(self, emptyPage):
+        """appendEmptyPage(widget, label)
+        
+        Append a empty page to the notebook.
         """
-        if not budget is None:
-            _budget = budget
-            if _budget in self.__budget_temp_list:
-                self.__budget_temp_list.remove(_budget)
-            self.__budget_list.append(_budget)
-
-    def _appendPage(self):
-        """_appendPage()
-        
-        Creates a new page (instance of "Page class") from the last budget in
-        __budget_list, appends this page in the "__page_list" and shows the
-        page widget in the notebook widget.
+        self.__page_list.append(emptyPage)
+        self.__notebook.append_page(emptyPage.widget, emptyPage.title)
+        # TODO: reordenable and detachable Pages
+        #self.__notebook.set_tab_reorderable(emptyPage.widget, True)
+        #self.__notebook.set_tab_detachable(emptyPage.widget, True)
+
+    def updatePage(self, empty_page, page):
+        """updatePage(page)
+        
+        Update emptyPage to Page.
         """
-        _last_budget = self.__budget_list[-1]
-        _page = Page(self, _last_budget)
-        self.__notebook.append_page(_page.widget, _page.title)
-        self.__page_list.append(_page)
-
+        _page_num = self.__notebook.page_num(empty_page.widget)
+        self.__page_list[_page_num] = page
+        if self.__notebook.get_current_page() == _page_num:
+            _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu")
+            _go_prev.set_menu(page.back_menu)
+            _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu")
+            _go_post.set_menu(page.forward_menu)
+            if not self.__navigation_action_group.get_sensitive():
+                self.__navigation_action_group.set_sensitive(True)
+                self._checkButtonsSensitive(_page_num)
 
     def _menuitemImportFiebdc(self, widget):
         """_menuitemImportFiebdc(widget)
@@ -249,7 +365,6 @@
         Creates and shows a file selection window to open a budget file.
         """
         _budget = base.Budget()
-        self.__budget_temp_list.append(_budget)
         _budget_file = fiebdc.Read()
         _read_method = _budget_file.readFile
         _filename = "file"
@@ -264,10 +379,10 @@
         widget: the widget where the event is emitted from
         Callback to open a price database file.
         
-        Creates and shows a file selection window to open a price database file.
+        Creates and shows a file selection window to open a price database
+        file.
         """
         _budget = base.Budget()
-        self.__budget_temp_list.append(_budget)
         _budget_file = fiebdc.Read()
         _read_method = _budget_file.readFile
         _filename = "file"
@@ -285,7 +400,6 @@
         Creates and shows a file selection window to open a durus database
         """
         _budget = None
-        self.__budget_temp_list.append(_budget)
         _budget_file = durusdatabase.Read()
         _read_method = _budget_file.readFile
         _filename = "file"
@@ -305,25 +419,29 @@
         if _page_num != -1:
             _page = self.__page_list[_page_num]
             if isinstance(_page, EmptyPage) and _page.filetype == "durus":
-                print _("Cancel reading Durus database has not been implemented.")
+                print _("Cancel reading Durus database has not been "
+                        "implemented.")
             else:
                 _page.close()
 
-    def removePage(self, page_num):
-        """removePage(page_num)
-        
-        page_num: The number Page to be removed
+    def closePage(self, page):
+        """closePage(page)
+        
+        page: EmptyPage or Page object
         
         Removes a page from notebook and page_list.
-        Removes the budget from the budget_list if necessary.
+        Hide navigation action group if necessary
         """
-        _page = self.__page_list[page_num]
-        if isinstance(_page, Page):
-            #not loading budget
-            self.__budget_list.pop(page_num)
-        self.__page_list.pop(page_num)
-        _page.clear()
-        self.__notebook.remove_page(page_num)
+        if page in self.__page_list:
+            _page_num = self.__page_list.index(page)
+            self.__page_list.pop(_page_num)
+            page.clear()
+            self.__notebook.remove_page(_page_num)
+            if len(self.__page_list) == 0:
+                self.__navigation_action_group.set_sensitive(False)
+        else:
+            raise IndexError, _("The page is not in the page list")
+
 
     def _menuitemGoToRoot(self, widget):
         """_menuitemGoToRoot(widget)
@@ -353,29 +471,9 @@
             if isinstance(_page, Page):
                 #not loading budget
                 _active_path = _page.activePathRecord
-                if len(_active_path) > 1 and _active_path[-1] > 0:
-                    _budget = self.__budget_list[_page_num]
-                    _up_path = _active_path[:-1] + (_active_path[-1] - 1,)
-                    if _budget.hasPath(_up_path):
-                        _page.propagateMessageFrom("change_active", (-1,),
-                                                   _up_path)
-
-    def _menuitemGoDown(self, widget):
-        """_menuitemGoToDown(widget)
-        
-        widget: the widget where the event is emitted from
-        
-        Callback to go to down record.
-        """
-        _page_num = self.__notebook.get_current_page()
-        if _page_num != -1:
-            _page = self.__page_list[_page_num]
-            if isinstance(_page, Page):
-                #not loading budget
-                _active_path = _page.activePathRecord
                 if len(_active_path) > 1:
-                    _budget = self.__budget_list[_page_num]
-                    _up_path = _active_path[:-1] + (_active_path[-1] + 1,)
+                    _budget = _page.budget
+                    _up_path = _active_path[:-1]
                     if _budget.hasPath(_up_path):
                         _page.propagateMessageFrom("change_active", (-1,),
                                                    _up_path)
@@ -394,7 +492,7 @@
                 #not loading budget
                 _previous_path = _page.previousPathRecord
                 if _previous_path is not None:
-                    _budget = self.__budget_list[_page_num]
+                    _budget = _page.budget
                     if _budget.hasPath(_previous_path):
                         _page.propagateMessageFrom("change_active", (-1,),
                                                    _previous_path)
@@ -413,7 +511,7 @@
                 #not loading budget
                 _posterior_path = _page.posteriorPathRecord
                 if _posterior_path is not None:
-                    _budget = self.__budget_list[_page_num]
+                    _budget = _page.budget
                     if _budget.hasPath(_posterior_path):
                         _page.propagateMessageFrom("change_active", (-1,),
                                                    _posterior_path)
@@ -445,34 +543,6 @@
         """
         gtk.main_quit()
 
-    def _getNotebook(self):
-        """_getNotebook()
-        
-        Return the notebook widget
-        """
-        return self.__notebook
-
-    def _getPageList(self):
-        """_getPageList()
-        
-        Return the page list
-        """
-        return self.__page_list
-
-    def _getBudgetList(self):
-        """_getBudgetList()
-        
-        Return the budget list
-        """
-        return self.__budget_list
-
-    notebook = property(_getNotebook, None, None,
-                      "notebook object")
-    pageList = property(_getPageList, None, None,
-                      "Page list")
-    budgetList = property(_getBudgetList, None, None,
-                      "Budget list")
-
 
 class EmptyPage(object):
     """gui.EmptyPage:
@@ -555,8 +625,8 @@
         self.__animationThobber = gtk.gdk.PixbufAnimation(
                                   globalVars.getAppPath("THROBBER-GIF"))
         self.__quietThobber = self.__throbber.get_pixbuf()
-        self.__budget_icon = gtk.gdk.pixbuf_new_from_file_at_size(
-                             globalVars.getAppPath("BUDGET-ICON"), 16, 16)
+        self.__budget_icon = gtk.gdk.pixbuf_new_from_file(
+                             globalVars.getAppPath("BUDGET-ICON"))
         _filename = os.path.basename(filename)
         _rootfilename = os.path.splitext(_filename)[0]
         if not _rootfilename == "":
@@ -707,9 +777,7 @@
         for _child in _children:
             self.__widget.remove(_child)
         self.__widget.pack_start(_page.widget, True, True, 0)
-        _noteBook = self.__mainWindow.notebook
-        _pageIndex = _noteBook.page_num(self.__widget)
-        self.__mainWindow.pageList[_pageIndex] = _page
+        self.__mainWindow.updatePage(self, _page)
 
     def threadCanceled(self):
         """threadCanceled()
@@ -717,12 +785,10 @@
         Sets the __children atribute to None
         This causes that the timeouts is ended.
         This method is called from thread when is canceled
-        TODO: it must called threadFinished or somethig
         """
         self.__children = None
         self.stopLoading()
-        _page_num = self.__mainWindow.notebook.page_num(self.widget)
-        self.__mainWindow.removePage(_page_num)
+        self.__mainWindow.closePage(self)
 
     def close(self):
         """close()
@@ -798,6 +864,8 @@
         activePathRecord: Read. The active path record
         previousPathRecord: Read. The previous path record
         posteriorPathRecord Read. The posterior path record
+        back_menu: back menu to show in menutoolbutton
+        forward_menu: forward menu to show in menutoolbutton
     Methods:
         propagateMessageFrom
         sendMessageTo
@@ -816,6 +884,16 @@
         mainWindow: MainWindow object
         budget: "base.Budget" object
         path_record: the active path record
+        
+        self.__mainWindow: MainWindow object
+        self.__widget: a gtk.VBox
+        self.__panes_list: 
+        self.__main_item: 
+        self.__active_path_record:
+        self.__history_back:
+        self.__history_forward:
+        self.__back_menu: a gtk.Menu
+        self.__forward_menu: a gtk.Menu
         """
         #TODO: __panes_list should come from config file...
         self.__mainWindow = mainWindow
@@ -826,9 +904,25 @@
         self.__active_path_record = ()
         self.__history_back = []
         self.__history_forward = []
+        self.__back_menu = gtk.Menu()
+        self.__back_menu.show()
+        self.__forward_menu = gtk.Menu()
+        self.__forward_menu.show()
         self.budget = budget
         self._setActivePathRecord(path_record)
         self.__widget.show()
+        self.__budget_icon = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("BUDGET-ICON"))
+        self.__chapter_icon = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("CHAPTER-ICON"))
+        self.__unit_icon  = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("UNIT-ICON") )
+        self.__material_icon  = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("MATERIAL-ICON") )
+        self.__machinery_icon = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("MACHINERY-ICON"))
+        self.__labourforce_icon = gtk.gdk.pixbuf_new_from_file(
+            globalVars.getAppPath("LABOURFORCE-ICON"))
 
     def propagateMessageFrom(self, message, pane_path, arg=None):
         """propagateMessageFrom(message, pane_path, arg=None)
@@ -848,6 +942,7 @@
         if message == "change_active" and _budget.hasPath(arg):
             self.sendMessageTo(self.__main_item, message, pane_path, arg)
             self._setActivePathRecord(arg)
+            self.__mainWindow.changeActiveSignal()
         elif message == "autoclose":
             self._closeItem(pane_path)
         elif message == "split h":
@@ -872,12 +967,7 @@
         
         Close Page
         """
-        _page_list = self.__mainWindow.pageList
-        if self in _page_list:
-            _page_num = _page_list.index(self)
-            self.__mainWindow.removePage(_page_num)
-        else:
-            raise IndexError, _("The page is not in the page list")
+        self.__mainWindow.closePage(self)
 
     def clear(self):
         """clear()
@@ -885,7 +975,6 @@
         Clear atributes
         """
         self.propagateMessageFrom("clear", (0,))
-        
         del self.__budget
         del self.__panes_list
         del self.__widget
@@ -1036,26 +1125,160 @@
     def _appendHistory(self, path):
         """_appendHistory(path))
         
-        path: the old active path record
-        
-        Sets the old active path record
+        path: the new active path record
+        
+        Append the new active path record to history lists and update menus
+        """
+        if len(self.__history_back) > 1 and path in self.__history_back[:-1]:
+            # the new active record is in back history list
+            # then append forward history and pop back history
+            _items_num = len(self.__history_back) - \
+                         self.__history_back.index(path) -1 
+            for _item in range(_items_num):
+                _record_path = self.__history_back.pop()
+                _first_menuitem = self.__back_menu.get_children()[0]
+                self.__back_menu.remove(_first_menuitem)
+                self.__history_forward.append(_record_path)
+                _menuitem = self._menuItemFactory(_record_path)
+                _menuitem.connect_object("activate", self._menuHistoryForward,
+                    _record_path, _menuitem)
+                self.__forward_menu.prepend(_menuitem)
+            while len(self.__history_forward) > 100:
+                    # list too long
+                    self.__history_forward.pop(0)
+                    _last_menuitem = self.__forward_menu.get_children()[-1]
+                    self.__forward_menu.remove(_last_menuitem)
+        else:
+            # the new active record not is in back history list
+            if len(self.__history_forward) > 1 and \
+               path in self.__history_forward:
+                # the new active record is in history forward list
+                # then append back history and pop forward history
+                _items_num = len(self.__history_forward) - \
+                             self.__history_forward.index(path)
+                for _item in range(_items_num):
+                    _record_path = self.__history_forward.pop()
+                    _first_menuitem = self.__forward_menu.get_children()[0]
+                    self.__forward_menu.remove(_first_menuitem)
+                    self.__history_back.append(_record_path)
+                    if len(self.__history_back) > 1:
+                        _menuitem = self._menuItemFactory(
+                            self.__history_back[-2])
+                        _menuitem.connect_object("activate",
+                            self._menuHistoryBack, self.__history_back[-2],
+                            _menuitem)
+                        self.__back_menu.prepend(_menuitem)
+            else:
+                # the new active record not is in history forward list
+                # then append back history and clear forward history
+                self.__history_forward[:] = []
+                for _child in self.__forward_menu.get_children():
+                    self.__forward_menu.remove(_child)
+                self.__history_back.append(path)
+                if len(self.__history_back) > 1:
+                    _menuitem = self._menuItemFactory(self.__history_back[-2])
+                    _menuitem.connect_object("activate", self._menuHistoryBack,
+                        self.__history_back[-2], _menuitem)
+                    self.__back_menu.prepend(_menuitem)
+            while len(self.__history_back) > 100:
+                # list too long
+                self.__history_back.pop(0)
+                _last_menuitem = self.__back_menu.get_children()[-1]
+                self.__back_menu.remove(_last_menuitem)
+        self.__mainWindow.changeHistorySignal()
+
+    def _getImage(self, record):
+        """_getImage(record)
+        
+        record: record object
+        
+        Returns an image depending on the type of record
         """
-        if len(self.__history_back) > 1 and self.__history_back[-2] == path:
-            # append forward history and pop back history
-            _path = self.__history_back.pop()
-            self.__history_forward.append(_path)
-            if len(self.__history_forward) > 1000:
-                self.__history_forward.pop(0)
+        _hierarchy = record.recordType.hierarchy
+        _type = record.recordType.type
+        _subtype = record.recordType.subtype
+        if _hierarchy == 0:
+            _icon = self.__budget_icon
+        elif _hierarchy == 1:
+            _icon = self.__chapter_icon
         else:
-            # append back history and pop or delete forward history
-            if len(self.__history_forward) > 1 and \
-               self.__history_forward[-1] == path:
-                self.__history_forward.pop()
+            if _type == 0:
+                _icon = self.__unit_icon
+            elif _type == 1:
+                _icon = self.__labourforce_icon
+            elif _type == 2:
+                _icon = self.__machinery_icon
             else:
-                self.__history_forward[:] = []
-            self.__history_back.append(path)
-            if len(self.__history_back) > 1000:
-                self.__history_back.pop(0)
+                _icon = self.__material_icon
+        _image = gtk.Image()
+        _image.set_from_pixbuf(_icon)
+        return _image
+
+    def _menuFactory(self):
+        """_menuFactory()
+        
+        record: record object
+        
+        Creates menus for history back an history forward tool buttons
+        """
+
+        # Back Menu
+        # clear menu
+        for _child in self.__back_menu.get_children():
+            self.__back_menu.remove(_child)
+        # pupulate menu
+        if len(self.__history_back) > 1:
+            for _record_path in self.__history_back[:-1]:
+                _menuitem = self._menuItemFactory(_record_path)
+                _menuitem.connect_object("activate", self._menuHistoryBack,
+                    _record_path, _menuitem)
+                self.__back_menu.prepend(_menuitem)
+        # Forward Menu
+        # clear menu
+        for _child in self.__forward_menu.get_children():
+            self.__forward_menu.remove(_child)
+        # pupulate menu
+        if len(self.__history_forward) > 0:
+            for _record_path in self.__history_forward[:]:
+                _menuitem = self._menuItemFactory(_record_path)
+                _menuitem.connect_object("activate", self._menuHistoryForward,
+                    _record_path, _menuitem)
+                self.__forward_menu.prepend(_menuitem)
+
+    def _menuItemFactory(self, record_path):
+        """_menuItemFactory(record_path):
+        
+        record_path: record path
+        
+        Creates and return a menuItem to go to the record
+        """
+        _code = self.budget.getCode(record_path)
+        _record = self.budget.getRecord(_code)
+        _summary = _record.summary
+        _text = _code + " " + _summary
+        if len(_text) > 30:
+            _text = _text[:27] + "..."
+        _image = self._getImage(_record)
+        _menuitem = gtk.ImageMenuItem(_text)
+        _menuitem.set_image(_image)
+        _menuitem.show()
+        return _menuitem
+
+    def _menuHistoryBack(self, record_path, menu_item):
+        """_menuHistoryBack(record_path, menu_item)
+        
+        Go to the record selected in History Back menu
+        """
+        if self.budget.hasPath(record_path):
+            self.propagateMessageFrom("change_active", (-1,), record_path)
+
+    def _menuHistoryForward(self, record_path, menu_item):
+        """_menuHistoryForward(record_path, menu_item)
+        
+        Go to the record selected in History Forward menu
+        """
+        if self.budget.hasPath(record_path):
+            self.propagateMessageFrom("change_active", (-1,), record_path)
 
     def _getActivePathRecord(self):
         """_getActivePathRecord()
@@ -1084,6 +1307,20 @@
         else:
             return None
 
+    def _getBackMenu(self):
+        """_getBackMenu()
+        
+        Return the Back Menu
+        """
+        return self.__back_menu
+
+    def _getForwardMenu(self):
+        """_getForwardMenu()
+        
+        Return the Forward Menu
+        """
+        return self.__forward_menu
+
     def _getTitle(self):
         """_getTitle()
         
@@ -1149,7 +1386,10 @@
                       "Previous Active Path Record")
     posteriorPathRecord = property(_getPosteriorPathRecord, None, None,
                       "Posterior Active Path Record")
-
+    back_menu = property(_getBackMenu, None, None,
+                      "Back Menu")
+    forward_menu = property(_getForwardMenu, None, None,
+                      "Forward Menu")
 
 class View(object):
     """gui.View:
@@ -4599,4 +4839,4 @@
     values = property(None, _setValues, None,
         "values")
     options = property(None, _setOptions, None,
-        "options")
\ No newline at end of file
+        "options")
--- a/Gtk/importFiebdc.py	Fri Nov 19 19:17:11 2010 +0100
+++ b/Gtk/importFiebdc.py	Wed Nov 24 22:56:02 2010 +0100
@@ -111,9 +111,7 @@
         _emptyPage = gui.EmptyPage(self.__mainWindow, self.__readFileMethod,
                                    self.__budget, self.__filename,
                                    self.__cancelMethod, self.__filetype)
-        self.__mainWindow.notebook.append_page(_emptyPage.widget,
-                                                    _emptyPage.title)
-        self.__mainWindow.pageList.append(_emptyPage)
+        self.__mainWindow.appendEmptyPage(_emptyPage)
         _emptyPage.run()
 
     def _openFile(self, filename):
@@ -424,7 +422,6 @@
             self.__page.threadCanceled()
         else:
             _mainWindow = self.__mainWindow
-            _mainWindow._addBudget(_budget)
             self.__page.threadFinishedSignal(_budget)
             if self.__filetype == "database":
                 self.saveDurusDatabase()
--- a/images/budget.svg	Fri Nov 19 19:17:11 2010 +0100
+++ b/images/budget.svg	Wed Nov 24 22:56:02 2010 +0100
@@ -10,12 +10,12 @@
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="x-office-spreadsheet.svg"
+   sodipodi:docname="budget.svg"
    inkscape:version="0.47 r22583"
    sodipodi:version="0.32"
    id="svg13684"
-   height="48.000000px"
-   width="48.000000px"
+   height="16"
+   width="16"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    version="1.1">
   <defs
@@ -91,10 +91,10 @@
        xlink:href="#linearGradient6687"
        id="linearGradient6746"
        gradientUnits="userSpaceOnUse"
-       x1="-20.750000"
-       y1="29.000000"
-       x2="-19.500000"
-       y2="18.750000" />
+       x1="-20.75"
+       y1="29"
+       x2="-19.5"
+       y2="18.75" />
     <linearGradient
        inkscape:collect="always"
        id="linearGradient6687">
@@ -112,10 +112,10 @@
        xlink:href="#linearGradient6687"
        id="linearGradient6744"
        gradientUnits="userSpaceOnUse"
-       x1="-20.750000"
-       y1="29.000000"
-       x2="-19.500000"
-       y2="18.750000" />
+       x1="-20.75"
+       y1="29"
+       x2="-19.5"
+       y2="18.75" />
     <linearGradient
        id="linearGradient6719">
       <stop
@@ -197,7 +197,7 @@
        fx="24.306795"
        fy="42.07798"
        r="15.821514"
-       gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
+       gradientTransform="matrix(1,0,0,0.284916,0,30.08928)"
        gradientUnits="userSpaceOnUse" />
     <linearGradient
        inkscape:collect="always"
@@ -227,10 +227,10 @@
        xlink:href="#linearGradient269"
        id="radialGradient15656"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
-       cx="8.8244190"
+       gradientTransform="matrix(0.34380385,0,0,0.36611711,0.55258493,31.189988)"
+       cx="8.824419"
        cy="3.7561285"
-       fx="8.8244190"
+       fx="8.824419"
        fy="3.7561285"
        r="37.751713" />
     <linearGradient
@@ -249,12 +249,12 @@
        xlink:href="#linearGradient259"
        id="radialGradient15658"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
+       gradientTransform="matrix(0.34104142,0,0,0.36908261,-0.63815723,30.960825)"
        cx="33.966679"
        cy="35.736916"
        fx="33.966679"
        fy="35.736916"
-       r="86.708450" />
+       r="86.70845" />
     <linearGradient
        id="linearGradient15662">
       <stop
@@ -271,17 +271,17 @@
        xlink:href="#linearGradient15662"
        id="radialGradient15668"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
+       gradientTransform="matrix(0.3449117,0,0,0.36589914,0.52479645,31.21249)"
        cx="8.1435566"
        cy="7.2678967"
        fx="8.1435566"
        fy="7.2678967"
        r="38.158695" />
     <linearGradient
-       y2="99.2984"
+       y2="99.298401"
        x2="118.302"
-       y1="82.0938"
-       x1="97.2412"
+       y1="82.093803"
+       x1="97.241203"
        gradientUnits="userSpaceOnUse"
        id="aigrd13">
       <stop
@@ -296,7 +296,7 @@
     <linearGradient
        y2="100.6528"
        x2="115.5175"
-       y1="89.1104"
+       y1="89.110397"
        x1="90.8311"
        gradientUnits="userSpaceOnUse"
        id="aigrd12">
@@ -310,9 +310,9 @@
          offset="1" />
     </linearGradient>
     <linearGradient
-       y2="92.6123"
+       y2="92.612297"
        x2="124.8197"
-       y1="75.1099"
+       y1="75.109901"
        x1="105.0923"
        gradientUnits="userSpaceOnUse"
        id="aigrd11">
@@ -326,9 +326,9 @@
          offset="1" />
     </linearGradient>
     <linearGradient
-       y2="94.8"
+       y2="94.800003"
        x2="126.1107"
-       y1="84.7578"
+       y1="84.757797"
        x1="107.8672"
        gradientUnits="userSpaceOnUse"
        id="aigrd10">
@@ -342,9 +342,9 @@
          offset="1" />
     </linearGradient>
     <linearGradient
-       y2="95.8999"
+       y2="95.899902"
        x2="118.2002"
-       y1="78.1079"
+       y1="78.107903"
        x1="105.8184"
        gradientUnits="userSpaceOnUse"
        id="aigrd9">
@@ -358,7 +358,7 @@
          offset="1" />
     </linearGradient>
     <linearGradient
-       y2="98.8832"
+       y2="98.883202"
        x2="118.3481"
        y1="81.1763"
        x1="106.0254"
@@ -381,41 +381,41 @@
        x1="106.0254"
        y1="81.1763"
        x2="118.3481"
-       y2="98.8832" />
+       y2="98.883202" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#aigrd9"
        id="linearGradient1683"
        gradientUnits="userSpaceOnUse"
        x1="105.8184"
-       y1="78.1079"
+       y1="78.107903"
        x2="118.2002"
-       y2="95.8999" />
+       y2="95.899902" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#aigrd10"
        id="linearGradient1685"
        gradientUnits="userSpaceOnUse"
        x1="107.8672"
-       y1="84.7578"
+       y1="84.757797"
        x2="126.1107"
-       y2="94.8" />
+       y2="94.800003" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#aigrd11"
        id="linearGradient1687"
        gradientUnits="userSpaceOnUse"
        x1="105.0923"
-       y1="75.1099"
+       y1="75.109901"
        x2="124.8197"
-       y2="92.6123" />
+       y2="92.612297" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#aigrd12"
        id="linearGradient1689"
        gradientUnits="userSpaceOnUse"
        x1="90.8311"
-       y1="89.1104"
+       y1="89.110397"
        x2="115.5175"
        y2="100.6528" />
     <linearGradient
@@ -423,10 +423,10 @@
        xlink:href="#aigrd13"
        id="linearGradient1691"
        gradientUnits="userSpaceOnUse"
-       x1="97.2412"
-       y1="82.0938"
+       x1="97.241203"
+       y1="82.093803"
        x2="118.302"
-       y2="99.2984" />
+       y2="99.298401" />
     <radialGradient
        inkscape:collect="always"
        xlink:href="#linearGradient2456"
@@ -449,9 +449,9 @@
      inkscape:grid-bbox="true"
      showgrid="false"
      inkscape:current-layer="layer1"
-     inkscape:cy="35.847276"
-     inkscape:cx="14.647948"
-     inkscape:zoom="11.313708"
+     inkscape:cy="10.962491"
+     inkscape:cx="9.2512263"
+     inkscape:zoom="45.254832"
      inkscape:pageshadow="2"
      inkscape:pageopacity="0.0"
      borderopacity="1.0"
@@ -500,134 +500,136 @@
      inkscape:groupmode="layer"
      inkscape:label="Layer 1"
      id="layer1"
-     style="display:inline">
+     style="display:inline"
+     transform="translate(0,-32)">
     <g
        style="display:inline"
-       transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
+       transform="matrix(0.00758952,0,0,0.00738372,14.736941,45.576244)"
        id="g6707">
       <rect
-         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         style="opacity:0.40206185;color:#000000;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
          id="rect6709"
          width="1339.6335"
          height="478.35718"
          x="-1559.2523"
          y="-150.69685" />
       <path
-         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+         d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z"
          id="path6711"
          sodipodi:nodetypes="cccc" />
       <path
          sodipodi:nodetypes="cccc"
          id="path6713"
-         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
-         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+         d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z"
+         style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
     </g>
     <rect
-       style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+       style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.35383636;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
        id="rect15391"
-       width="34.996506"
-       height="40.997345"
-       x="6.5017405"
-       y="3.5013213"
-       ry="1.1490481"
-       rx="1.1490482" />
+       width="12.383041"
+       height="14.506358"
+       x="1.7065634"
+       y="32.25349"
+       ry="0.4065752"
+       rx="0.40657523" />
     <rect
-       style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+       style="color:#000000;fill:none;stroke:url(#radialGradient15668);stroke-width:0.35383636;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
        id="rect15660"
-       width="32.996056"
-       height="38.996326"
-       x="7.5033512"
-       y="4.5018268"
-       ry="0.14904855"
-       rx="0.14904846" />
+       width="11.675209"
+       height="13.798324"
+       x="2.0609689"
+       y="32.60751"
+       ry="0.052738819"
+       rx="0.052738789" />
     <path
        id="rect13655"
-       d="M 10.000000,6.0022030 L 10.000000,10.966297 L 10.000000,41.002203 L 20.000000,41.000000 L 20.000000,11.000000 L 38.000000,11.000000 L 38.000000,6.0022030 L 10.000000,6.0022030 z "
-       style="color:#000000;fill:#000000;fill-opacity:0.21052630;fill-rule:evenodd;stroke:none;stroke-width:0.60787594;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+       d="m 2.9443756,33.138397 0,1.756476 0,10.627801 3.5383651,-7.79e-4 0,-10.615095 6.3690573,0 0,-1.768403 -9.9074224,0 z"
+       style="color:#000000;fill:#000000;fill-opacity:0.21052629;fill-rule:evenodd;stroke:none;stroke-width:0.60787594;marker:none;visibility:visible;display:inline;overflow:visible"
        sodipodi:nodetypes="cccccccc" />
     <path
        id="path13660"
-       d="M 37.500415,10.502203 L 10.499583,10.502203"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675026,34.730661 -9.5538797,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383651px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path13662"
-       d="M 37.500755,16.500000 L 10.499230,16.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,36.852898 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path13664"
-       d="M 37.500755,22.500000 L 10.499230,22.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,38.975918 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path13666"
-       d="M 37.500755,28.500000 L 10.499230,28.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,41.098938 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path13668"
-       d="M 37.501332,34.500000 L 10.499823,34.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999964px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675351,43.221956 -9.5541198,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path13682"
-       d="M 37.500755,40.500000 L 10.499230,40.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,45.344975 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path2464"
-       d="M 37.511644,13.500000 L 10.500000,13.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.678999,35.791388 -9.5577051,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383651px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path2466"
-       d="M 37.500755,19.500000 L 10.499230,19.500000"
-       style="fill:none;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,37.914408 -9.5541249,0"
+       style="fill:none;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path2468"
-       d="M 37.500755,25.500000 L 10.499230,25.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,40.037428 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path2470"
-       d="M 37.500755,31.500000 L 10.499230,31.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,42.160447 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
        id="path2472"
-       d="M 37.500755,37.500000 L 10.499230,37.500000"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.675146,44.283465 -9.5541249,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <path
-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
-       d="M 37.500000,6.4997386 L 37.500000,40.500300"
+       style="fill:none;stroke:#000000;stroke-width:0.35383642px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789472"
+       d="m 12.67488,33.314441 0,12.03064"
        id="path2485" />
     <path
-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
-       d="M 31.500000,6.4996867 L 31.500000,40.500315"
+       style="fill:none;stroke:#000000;stroke-width:0.35383648px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789472"
+       d="m 10.55186,33.314424 0,12.030662"
        id="path2487" />
     <path
-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
-       d="M 25.500000,6.4996865 L 25.500000,40.500314"
+       style="fill:none;stroke:#000000;stroke-width:0.35383648px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789472"
+       d="m 8.4288415,33.314424 0,12.030662"
        id="path2489" />
     <path
-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
-       d="M 19.500000,6.4996867 L 19.500000,40.500315"
+       style="fill:none;stroke:#000000;stroke-width:0.35383648px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789472"
+       d="m 6.3058226,33.314424 0,12.030662"
        id="path2491" />
     <path
-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
-       d="M 10.500000,6.4996867 L 10.500000,40.500315"
+       style="fill:none;stroke:#000000;stroke-width:0.35383648px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789472"
+       d="m 3.1212939,33.314424 0,12.030662"
        id="path2493" />
     <path
        id="path2495"
-       d="M 37.500227,6.5022030 L 10.499460,6.5022030"
-       style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+       d="m 12.674959,33.315315 -9.5538562,0"
+       style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383645px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
     <text
        xml:space="preserve"
-       style="font-size:30px;font-style:normal;font-weight:normal;fill:#000080;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25.897785"
-       y="46.762562"
+       style="font-size:10.61509514px;font-style:normal;font-weight:normal;fill:#000080;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="8.5695915"
+       y="47.560902"
        id="text2919"><tspan
          sodipodi:role="line"
          id="tspan2921"
-         x="25.897785"
-         y="46.762562">€</tspan></text>
+         x="8.5695915"
+         y="47.560902">€</tspan></text>
   </g>
   <g
      inkscape:groupmode="layer"
      id="layer2"
      inkscape:label="emblem"
-     style="display:inline" />
+     style="display:inline"
+     transform="translate(0,-32)" />
 </svg>
Binary file mo/es/LC_MESSAGES/pyArq-Presupuestos.mo has changed
--- a/mo/pyArq-Presupuestos.es.po	Fri Nov 19 19:17:11 2010 +0100
+++ b/mo/pyArq-Presupuestos.es.po	Wed Nov 24 22:56:02 2010 +0100
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: pyArq-Presupuestos 0.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-11 23:10+0100\n"
+"POT-Creation-Date: 2010-11-24 22:27+0100\n"
 "PO-Revision-Date: 2010-01-11 12:24+0100\n"
 "Last-Translator: Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso."
 "es>\n"
@@ -691,228 +691,228 @@
 msgid "End Test"
 msgstr "Comprobación finalizada"
 
-#: ../Gtk/gui.py:69
+#: ../Gtk/gui.py:68
 msgid "The icon file does not exist. '$1'"
 msgstr "El archivo de icono no existe. «$1»"
 
-#: ../Gtk/gui.py:75
+#: ../Gtk/gui.py:74
 msgid "pyArq-Presupuestos running on $1"
 msgstr "pyArq-Presupuestos ejecutandose en $1"
 
-#: ../Gtk/gui.py:167
+#: ../Gtk/gui.py:168
 msgid "_File"
 msgstr "_Archivo"
 
-#: ../Gtk/gui.py:168
+#: ../Gtk/gui.py:169
 msgid "_Import Fiebdc"
 msgstr "_Importar Fiebdc"
 
-#: ../Gtk/gui.py:169
+#: ../Gtk/gui.py:170
 msgid "Import FIEBDC"
 msgstr "Importar FIEBDC"
 
-#: ../Gtk/gui.py:170
+#: ../Gtk/gui.py:171
 msgid "_Close"
 msgstr "_Cerrar"
 
-#: ../Gtk/gui.py:170
+#: ../Gtk/gui.py:171
 msgid "Close"
 msgstr "Cerrar"
 
-#: ../Gtk/gui.py:172
+#: ../Gtk/gui.py:173
 msgid "_View"
 msgstr "_Ver"
 
-#: ../Gtk/gui.py:173
+#: ../Gtk/gui.py:174 ../Gtk/gui.py:184
 msgid "_Go"
 msgstr "_Ir"
 
-#: ../Gtk/gui.py:174
-msgid "_Up Record"
-msgstr "Registro _Superior"
+#: ../Gtk/gui.py:175
+msgid "_Test"
+msgstr "_Pruebas"
 
-#: ../Gtk/gui.py:175
-msgid "Go up record"
-msgstr "Ir al registro superior"
-
-#: ../Gtk/gui.py:176
-msgid "_Down Record"
-msgstr "Registro _Inferior"
+#: ../Gtk/gui.py:177
+msgid "Import Fiebdc _price database"
+msgstr "Importar base de _precios Fiebdc"
 
 #: ../Gtk/gui.py:177
-msgid "Go down record"
-msgstr "Ir al registro inferior"
-
-#: ../Gtk/gui.py:178
-msgid "_Previous Record"
-msgstr "Registro _Previo"
+msgid "Import database"
+msgstr "Importar base de datos"
 
 #: ../Gtk/gui.py:179
-msgid "Go Previous record"
-msgstr "Ir al registro previo"
+msgid "_Open price database"
+msgstr "_Abrir base de precios"
 
 #: ../Gtk/gui.py:180
-msgid "_Posterior Record"
-msgstr "Registro P_osterior"
+msgid "Open Database"
+msgstr "Abrir base de datos"
+
+#: ../Gtk/gui.py:185
+msgid "_Back"
+msgstr "A_tras"
+
+#: ../Gtk/gui.py:186 ../Gtk/gui.py:197
+msgid "Go to the previous visited item"
+msgstr "Ir al concepto anterior"
 
-#: ../Gtk/gui.py:181
-msgid "Go posterior record"
-msgstr "Ir al registro posterior"
+#: ../Gtk/gui.py:188
+msgid "_Forward"
+msgstr "A_delante"
+
+#: ../Gtk/gui.py:189 ../Gtk/gui.py:201
+msgid "Go to the next visited item"
+msgstr "Ir al concepto siguiente"
 
-#: ../Gtk/gui.py:182
+#: ../Gtk/gui.py:190
+msgid "_Up Item"
+msgstr "Concepto _Superior"
+
+#: ../Gtk/gui.py:191
+msgid "Go up item"
+msgstr "Ir al concepto superior"
+
+#: ../Gtk/gui.py:192
 msgid "_Root"
 msgstr "_Raiz"
 
-#: ../Gtk/gui.py:183
+#: ../Gtk/gui.py:193
 msgid "Go to root"
 msgstr "Ir a la raiz"
 
-#: ../Gtk/gui.py:184
-msgid "_Test"
-msgstr "_Pruebas"
-
-#: ../Gtk/gui.py:186
-msgid "Import Fiebdc _price database"
-msgstr "Importar base de _precios Fiebdc"
+#: ../Gtk/gui.py:220
+msgid "Back history"
+msgstr "Retroceder histórico"
 
-#: ../Gtk/gui.py:186
-msgid "Import database"
-msgstr "Importar base de datos"
+#: ../Gtk/gui.py:225
+msgid "Forward history"
+msgstr "Adelantar histórico"
 
-#: ../Gtk/gui.py:188
-msgid "_Open price database"
-msgstr "_Abrir base de precios"
-
-#: ../Gtk/gui.py:189
-msgid "Open Database"
-msgstr "Abrir base de datos"
-
-#: ../Gtk/gui.py:308
+#: ../Gtk/gui.py:422
 msgid "Cancel reading Durus database has not been implemented."
 msgstr ""
 "La interrupción de la lectura de bases de datos Durus no ha sido implementada"
 
-#: ../Gtk/gui.py:589 ../Gtk/importFiebdc.py:222
-msgid "Time: 0s"
-msgstr "Tiempo: 0s"
-
-#: ../Gtk/gui.py:656 ../Gtk/importFiebdc.py:301
-msgid "Time: $1"
-msgstr "Tiempo: $1"
-
-#: ../Gtk/gui.py:852
+#: ../Gtk/gui.py:443
 msgid "The page is not in the page list"
 msgstr "La pestaña no está en la lista de pestañas"
 
-#: ../Gtk/gui.py:958
+#: ../Gtk/gui.py:672 ../Gtk/importFiebdc.py:220
+msgid "Time: 0s"
+msgstr "Tiempo: 0s"
+
+#: ../Gtk/gui.py:749 ../Gtk/importFiebdc.py:299
+msgid "Time: $1"
+msgstr "Tiempo: $1"
+
+#: ../Gtk/gui.py:1075
 msgid "The value must be a list"
 msgstr "El valor debe ser una lista"
 
-#: ../Gtk/gui.py:961
+#: ../Gtk/gui.py:1078
 msgid "Incorrect len"
 msgstr "Longuitud incorrecta"
 
-#: ../Gtk/gui.py:989
+#: ../Gtk/gui.py:1106
 msgid "Incorrect item $1"
 msgstr "Elemento incorrecto $1"
 
-#: ../Gtk/gui.py:1005
+#: ../Gtk/gui.py:1122
 msgid "The budget does not have the path record: $1"
 msgstr "El presupuesto no tiene el registro con camino: $1"
 
-#: ../Gtk/gui.py:1196
+#: ../Gtk/gui.py:1478
 msgid "Decomposition"
 msgstr "Descomposición"
 
-#: ../Gtk/gui.py:1197 ../Gtk/gui.py:2213
+#: ../Gtk/gui.py:1479 ../Gtk/gui.py:2485
 msgid "Description"
 msgstr "Descripción"
 
-#: ../Gtk/gui.py:1198 ../Gtk/gui.py:2215
+#: ../Gtk/gui.py:1480 ../Gtk/gui.py:2487
 msgid "Measure"
 msgstr "Medición"
 
-#: ../Gtk/gui.py:1199
+#: ../Gtk/gui.py:1481
 msgid "Sheet of Conditions"
 msgstr "Pliego de condicones"
 
-#: ../Gtk/gui.py:1200
+#: ../Gtk/gui.py:1482
 msgid "Files"
 msgstr "Archivos"
 
-#: ../Gtk/gui.py:1201
+#: ../Gtk/gui.py:1483
 msgid "Companies"
 msgstr "Entidades"
 
-#: ../Gtk/gui.py:1385
+#: ../Gtk/gui.py:1660
 msgid "Split View Left/Right"
 msgstr "Partir vista Izquierda/Derecha"
 
-#: ../Gtk/gui.py:1389
+#: ../Gtk/gui.py:1664
 msgid "Split View Top/Bottom"
 msgstr "Partir vista Arriba/Abajo"
 
-#: ../Gtk/gui.py:1393
+#: ../Gtk/gui.py:1668
 msgid "Close view"
 msgstr "Cerrar vista"
 
-#: ../Gtk/gui.py:1562
+#: ../Gtk/gui.py:1836
 msgid "The item must be a widget object."
 msgstr "El elemento debe ser un objeto «widget»."
 
-#: ../Gtk/gui.py:1568
+#: ../Gtk/gui.py:1842
 msgid "Invalid orientation."
 msgstr "Orientación no válida"
 
-#: ../Gtk/gui.py:1943 ../Gtk/gui.py:2577 ../Gtk/gui.py:3987
+#: ../Gtk/gui.py:2214 ../Gtk/gui.py:2841 ../Gtk/gui.py:4171
 msgid "Argument must be a Budget object"
 msgstr "El argumento debe ser un objeto «Budget»"
 
-#: ../Gtk/gui.py:1952
-msgid "DecompositionList.__init__: Record path can not be None"
-msgstr "«DecompositionList.__init__:» La ruta del registro no puede ser «None»"
+#: ../Gtk/gui.py:2223
+msgid "Record path can not be None"
+msgstr "La ruta del registrio no puede ser None"
 
-#: ../Gtk/gui.py:1983
+#: ../Gtk/gui.py:2254
 msgid "a"
 msgstr "a"
 
-#: ../Gtk/gui.py:2210 ../Gtk/gui.py:4047
+#: ../Gtk/gui.py:2482 ../Gtk/gui.py:4234
 msgid "Code"
 msgstr "Código"
 
-#: ../Gtk/gui.py:2211
+#: ../Gtk/gui.py:2483
 msgid "Unit"
 msgstr "Unidad"
 
-#: ../Gtk/gui.py:2217
+#: ../Gtk/gui.py:2489
 msgid "Price"
 msgstr "Precio"
 
-#: ../Gtk/gui.py:2219
+#: ../Gtk/gui.py:2491
 msgid "Amount"
 msgstr "Importe"
 
-#: ../Gtk/gui.py:2231 ../Gtk/gui.py:2709
+#: ../Gtk/gui.py:2502 ../Gtk/gui.py:2981
 msgid "Invalid path"
 msgstr "Ruta no válida"
 
-#: ../Gtk/gui.py:2582
+#: ../Gtk/gui.py:2846
 msgid "Record path must be a tuple"
 msgstr "La posición del registro debe ser una tupla"
 
-#: ../Gtk/gui.py:2726
+#: ../Gtk/gui.py:2990
 msgid "measure must be a Measure object. Type: $1"
 msgstr "«measure» debe ser un objeto «Measure». Tipo: $1"
 
-#: ../Gtk/gui.py:2737 ../Gtk/gui.py:4062 ../Gtk/gui.py:4389
+#: ../Gtk/gui.py:3002 ../Gtk/gui.py:4249 ../Gtk/gui.py:4562
 msgid "Type"
 msgstr "Tipo"
 
-#: ../Gtk/gui.py:2738
+#: ../Gtk/gui.py:3003
 msgid "Comment"
 msgstr "Comentario"
 
-#: ../Gtk/gui.py:2739
+#: ../Gtk/gui.py:3004
 msgid ""
 "N\n"
 "(a)"
@@ -920,7 +920,7 @@
 "N\n"
 "(a)"
 
-#: ../Gtk/gui.py:2740
+#: ../Gtk/gui.py:3005
 msgid ""
 "Length\n"
 "(b)"
@@ -928,7 +928,7 @@
 "Longitud\n"
 "(b)"
 
-#: ../Gtk/gui.py:2741
+#: ../Gtk/gui.py:3006
 msgid ""
 "Width\n"
 "(c)"
@@ -936,7 +936,7 @@
 "Anchura\n"
 "(c)"
 
-#: ../Gtk/gui.py:2742
+#: ../Gtk/gui.py:3007
 msgid ""
 "Height\n"
 "(d)"
@@ -944,11 +944,11 @@
 "Altura\n"
 "(d)"
 
-#: ../Gtk/gui.py:2743
+#: ../Gtk/gui.py:3008
 msgid "Formula"
 msgstr "Fórmula"
 
-#: ../Gtk/gui.py:2744
+#: ../Gtk/gui.py:3009
 #, python-format
 msgid ""
 "Parcial\n"
@@ -957,79 +957,75 @@
 "Parcial\n"
 "[%s]"
 
-#: ../Gtk/gui.py:2745
+#: ../Gtk/gui.py:3010
 msgid "Subtotal"
 msgstr "Subtotal"
 
-#: ../Gtk/gui.py:3153 ../Gtk/gui.py:3175
+#: ../Gtk/gui.py:3418 ../Gtk/gui.py:3440
 msgid "Description text of the record $1"
 msgstr "Texto descriptivo del registro $1"
 
-#: ../Gtk/gui.py:3332
+#: ../Gtk/gui.py:3591
 msgid "Sheet of Conditions of the record $1"
 msgstr "Pliego de condiciones del registro $1"
 
-#: ../Gtk/gui.py:3352
+#: ../Gtk/gui.py:3609
 msgid "Field"
 msgstr "Ámbito"
 
-#: ../Gtk/gui.py:3374
+#: ../Gtk/gui.py:3630
 msgid "Section"
 msgstr "Sección"
 
-#: ../Gtk/gui.py:3527
+#: ../Gtk/gui.py:3778
 msgid "Sheet2 of Conditions of the record $1"
 msgstr "Pliego2 de condiciones del registro $1"
 
-#: ../Gtk/gui.py:3903
-msgid "$1 text"
-msgstr "Texto de $1"
-
-#: ../Gtk/gui.py:4048
+#: ../Gtk/gui.py:4235
 msgid "Code that define the company"
 msgstr "Código que define la entidad"
 
-#: ../Gtk/gui.py:4049
+#: ../Gtk/gui.py:4236
 msgid "Summary"
 msgstr "Resumen"
 
-#: ../Gtk/gui.py:4050
+#: ../Gtk/gui.py:4237
 msgid "Summary of the company name"
 msgstr "Resumen del nombre de la entidad"
 
-#: ../Gtk/gui.py:4051 ../Gtk/gui.py:4067
+#: ../Gtk/gui.py:4238 ../Gtk/gui.py:4254
 msgid "Name"
 msgstr "Nombre"
 
-#: ../Gtk/gui.py:4052
+#: ../Gtk/gui.py:4239
 msgid "Complete name"
 msgstr "Nombre completo"
 
-#: ../Gtk/gui.py:4053
+#: ../Gtk/gui.py:4240
 msgid "CIF"
 msgstr "CIF"
 
-#: ../Gtk/gui.py:4054
+#: ../Gtk/gui.py:4241
 msgid "Fiscal identifier number"
 msgstr "Número de identificación fiscal"
 
-#: ../Gtk/gui.py:4055
+#: ../Gtk/gui.py:4242
 msgid "Web"
 msgstr "Web"
 
-#: ../Gtk/gui.py:4056
+#: ../Gtk/gui.py:4243
 msgid "Company web page"
 msgstr "Página web de la entidad"
 
-#: ../Gtk/gui.py:4057
+#: ../Gtk/gui.py:4244
 msgid "Email"
 msgstr "Email"
 
-#: ../Gtk/gui.py:4058
+#: ../Gtk/gui.py:4245
 msgid "Company email"
 msgstr "Correo electrónico de la entidad"
 
-#: ../Gtk/gui.py:4063
+#: ../Gtk/gui.py:4250
 msgid ""
 "Type of Office:\n"
 "                           C: Central office\n"
@@ -1041,131 +1037,131 @@
 "                           D: Delegación\n"
 "                           R: Representante"
 
-#: ../Gtk/gui.py:4068
+#: ../Gtk/gui.py:4255
 msgid "Office name"
 msgstr "Nombre de la oficina"
 
-#: ../Gtk/gui.py:4069
+#: ../Gtk/gui.py:4256
 msgid "Address"
 msgstr "Dirección"
 
-#: ../Gtk/gui.py:4070
+#: ../Gtk/gui.py:4257
 msgid "Postal code"
 msgstr "Código postal"
 
-#: ../Gtk/gui.py:4071
+#: ../Gtk/gui.py:4258
 msgid "Town"
 msgstr "Ciudad"
 
-#: ../Gtk/gui.py:4072
+#: ../Gtk/gui.py:4259
 msgid "Province"
 msgstr "Provincia"
 
-#: ../Gtk/gui.py:4073
+#: ../Gtk/gui.py:4260
 msgid "Country"
 msgstr "Ciudad"
 
-#: ../Gtk/gui.py:4074
+#: ../Gtk/gui.py:4261
 msgid "Phone"
 msgstr "Teléfono"
 
-#: ../Gtk/gui.py:4075
+#: ../Gtk/gui.py:4262
 msgid "Phone numbers of the office"
 msgstr "Teléfono de la officina"
 
-#: ../Gtk/gui.py:4076
+#: ../Gtk/gui.py:4263
 msgid "Fax"
 msgstr "Fax"
 
-#: ../Gtk/gui.py:4077
+#: ../Gtk/gui.py:4264
 msgid "Fax numbers of the office"
 msgstr "Fax de la oficina"
 
-#: ../Gtk/gui.py:4078
+#: ../Gtk/gui.py:4265
 msgid "Contact person"
 msgstr "Persona de contacto"
 
-#: ../Gtk/gui.py:4079
+#: ../Gtk/gui.py:4266
 msgid "Contact persons in the office"
 msgstr "Persona de contacto en la oficina"
 
-#: ../Gtk/gui.py:4083
+#: ../Gtk/gui.py:4270
 msgid "Unknow Option Type"
 msgstr "Tipo de opcion desconocida"
 
-#: ../Gtk/gui.py:4327
+#: ../Gtk/gui.py:4500
 msgid "Boolean"
 msgstr "Booleano"
 
-#: ../Gtk/gui.py:4328
+#: ../Gtk/gui.py:4501
 msgid "Integer"
 msgstr "Entero"
 
-#: ../Gtk/gui.py:4329
+#: ../Gtk/gui.py:4502
 msgid "Text"
 msgstr "Texto"
 
-#: ../Gtk/gui.py:4330
+#: ../Gtk/gui.py:4503
 msgid "Color"
 msgstr "Color"
 
-#: ../Gtk/gui.py:4331
+#: ../Gtk/gui.py:4504
 msgid "List"
 msgstr "Lista"
 
-#: ../Gtk/gui.py:4363
+#: ../Gtk/gui.py:4536
 msgid "Option name"
 msgstr "Nombre de Opción"
 
-#: ../Gtk/gui.py:4376
+#: ../Gtk/gui.py:4549
 msgid "Value"
 msgstr "Valor"
 
-#: ../Gtk/gui.py:4414
+#: ../Gtk/gui.py:4588
 msgid "Description:"
 msgstr "Descripción:"
 
-#: ../Gtk/gui.py:4576
+#: ../Gtk/gui.py:4749
 msgid "Option values must be strings"
 msgstr "Los valores de la opción deben ser cadenas"
 
-#: ../Gtk/gui.py:4578
+#: ../Gtk/gui.py:4751
 msgid "Option must be a tuple with 4 items"
 msgstr "La opcion debe ser una tupla de 4 elementos"
 
-#: ../Gtk/gui.py:4580
+#: ../Gtk/gui.py:4753
 msgid "Option list must be a list"
 msgstr "La lista de opciones debe ser una lista lista"
 
-#: ../Gtk/gui.py:4600
+#: ../Gtk/gui.py:4773
 msgid "Icorrect type, must be boolean"
 msgstr "Tipo erroneo, debe ser booleano"
 
-#: ../Gtk/gui.py:4605
+#: ../Gtk/gui.py:4778
 msgid "Icorrect type, must be integer"
 msgstr "Tipo erroneo, debe ser un número entero"
 
-#: ../Gtk/gui.py:4618
+#: ../Gtk/gui.py:4791
 msgid "Icorrect type, must be string"
 msgstr "Tipo erroneo, debe ser una cadena de texto"
 
-#: ../Gtk/gui.py:4631
+#: ../Gtk/gui.py:4804
 msgid "Icorrect type, must be list"
 msgstr "Tipo erroneo, debe ser una lista"
 
-#: ../Gtk/gui.py:4637
+#: ../Gtk/gui.py:4810
 msgid "Icorrect type, must be a parseable color"
 msgstr "Tipo erroneo, debe ser un color parseable"
 
-#: ../Gtk/gui.py:4645
+#: ../Gtk/gui.py:4818
 msgid "Type must be boolean, integer, string or color"
 msgstr "El tipo debe ser booleano, entero, cadena de texto o color"
 
-#: ../Gtk/gui.py:4648
+#: ../Gtk/gui.py:4821
 msgid "Value must be in the option dict"
 msgstr "El valor debe estar en el diccionario de opciones"
 
-#: ../Gtk/gui.py:4650
+#: ../Gtk/gui.py:4823
 msgid "Values must be a dict"
 msgstr "El valor debe ser un dicionario"
 
@@ -1173,26 +1169,26 @@
 msgid "Open File"
 msgstr "Abrir archivo"
 
-#: ../Gtk/importFiebdc.py:137
+#: ../Gtk/importFiebdc.py:135
 msgid "The file must have 'bc3' extension"
 msgstr "El archivo debe tener extensión «bc3»"
 
-#: ../Gtk/importFiebdc.py:139
+#: ../Gtk/importFiebdc.py:137
 msgid "The file must have 'durus' extension"
 msgstr "El nombre del archivo debe tener extensión «durus»"
 
-#: ../Gtk/importFiebdc.py:210
+#: ../Gtk/importFiebdc.py:208
 msgid "Loading file ..."
 msgstr "Cargando archivo ..."
 
-#: ../Gtk/importFiebdc.py:234
+#: ../Gtk/importFiebdc.py:232
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: ../Gtk/importFiebdc.py:439
+#: ../Gtk/importFiebdc.py:436
 msgid "Saving file: $1"
 msgstr "Guardando archivo: $1"
 
-#: ../Gtk/importFiebdc.py:444
+#: ../Gtk/importFiebdc.py:441
 msgid "Saving time: $1 seconds"
 msgstr "Tiempo de guardado: $1 segundos"
--- a/mo/pyArq-Presupuestos.pot	Fri Nov 19 19:17:11 2010 +0100
+++ b/mo/pyArq-Presupuestos.pot	Wed Nov 24 22:56:02 2010 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-11 23:10+0100\n"
+"POT-Creation-Date: 2010-11-24 22:27+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -655,334 +655,330 @@
 msgid "End Test"
 msgstr ""
 
-#: ../Gtk/gui.py:69
+#: ../Gtk/gui.py:68
 msgid "The icon file does not exist. '$1'"
 msgstr ""
 
-#: ../Gtk/gui.py:75
+#: ../Gtk/gui.py:74
 msgid "pyArq-Presupuestos running on $1"
 msgstr ""
 
-#: ../Gtk/gui.py:167
+#: ../Gtk/gui.py:168
 msgid "_File"
 msgstr ""
 
-#: ../Gtk/gui.py:168
+#: ../Gtk/gui.py:169
 msgid "_Import Fiebdc"
 msgstr ""
 
-#: ../Gtk/gui.py:169
-msgid "Import FIEBDC"
-msgstr ""
-
 #: ../Gtk/gui.py:170
+msgid "Import FIEBDC"
+msgstr ""
+
+#: ../Gtk/gui.py:171
 msgid "_Close"
 msgstr ""
 
-#: ../Gtk/gui.py:170
+#: ../Gtk/gui.py:171
 msgid "Close"
 msgstr ""
 
-#: ../Gtk/gui.py:172
-msgid "_View"
-msgstr ""
-
 #: ../Gtk/gui.py:173
+msgid "_View"
+msgstr ""
+
+#: ../Gtk/gui.py:174 ../Gtk/gui.py:184
 msgid "_Go"
 msgstr ""
 
-#: ../Gtk/gui.py:174
-msgid "_Up Record"
+#: ../Gtk/gui.py:175
+msgid "_Test"
 msgstr ""
 
-#: ../Gtk/gui.py:175
-msgid "Go up record"
-msgstr ""
-
-#: ../Gtk/gui.py:176
-msgid "_Down Record"
+#: ../Gtk/gui.py:177
+msgid "Import Fiebdc _price database"
 msgstr ""
 
 #: ../Gtk/gui.py:177
-msgid "Go down record"
-msgstr ""
-
-#: ../Gtk/gui.py:178
-msgid "_Previous Record"
+msgid "Import database"
 msgstr ""
 
 #: ../Gtk/gui.py:179
-msgid "Go Previous record"
+msgid "_Open price database"
 msgstr ""
 
 #: ../Gtk/gui.py:180
-msgid "_Posterior Record"
+msgid "Open Database"
+msgstr ""
+
+#: ../Gtk/gui.py:185
+msgid "_Back"
+msgstr ""
+
+#: ../Gtk/gui.py:186 ../Gtk/gui.py:197
+msgid "Go to the previous visited item"
 msgstr ""
 
-#: ../Gtk/gui.py:181
-msgid "Go posterior record"
+#: ../Gtk/gui.py:188
+msgid "_Forward"
+msgstr ""
+
+#: ../Gtk/gui.py:189 ../Gtk/gui.py:201
+msgid "Go to the next visited item"
 msgstr ""
 
-#: ../Gtk/gui.py:182
+#: ../Gtk/gui.py:190
+msgid "_Up Item"
+msgstr ""
+
+#: ../Gtk/gui.py:191
+msgid "Go up item"
+msgstr ""
+
+#: ../Gtk/gui.py:192
 msgid "_Root"
 msgstr ""
 
-#: ../Gtk/gui.py:183
+#: ../Gtk/gui.py:193
 msgid "Go to root"
 msgstr ""
 
-#: ../Gtk/gui.py:184
-msgid "_Test"
-msgstr ""
-
-#: ../Gtk/gui.py:186
-msgid "Import Fiebdc _price database"
+#: ../Gtk/gui.py:220
+msgid "Back history"
 msgstr ""
 
-#: ../Gtk/gui.py:186
-msgid "Import database"
+#: ../Gtk/gui.py:225
+msgid "Forward history"
 msgstr ""
 
-#: ../Gtk/gui.py:188
-msgid "_Open price database"
-msgstr ""
-
-#: ../Gtk/gui.py:189
-msgid "Open Database"
-msgstr ""
-
-#: ../Gtk/gui.py:308
+#: ../Gtk/gui.py:422
 msgid "Cancel reading Durus database has not been implemented."
 msgstr ""
 
-#: ../Gtk/gui.py:589 ../Gtk/importFiebdc.py:222
+#: ../Gtk/gui.py:443
+msgid "The page is not in the page list"
+msgstr ""
+
+#: ../Gtk/gui.py:672 ../Gtk/importFiebdc.py:220
 msgid "Time: 0s"
 msgstr ""
 
-#: ../Gtk/gui.py:656 ../Gtk/importFiebdc.py:301
+#: ../Gtk/gui.py:749 ../Gtk/importFiebdc.py:299
 msgid "Time: $1"
 msgstr ""
 
-#: ../Gtk/gui.py:852
-msgid "The page is not in the page list"
-msgstr ""
-
-#: ../Gtk/gui.py:958
+#: ../Gtk/gui.py:1075
 msgid "The value must be a list"
 msgstr ""
 
-#: ../Gtk/gui.py:961
+#: ../Gtk/gui.py:1078
 msgid "Incorrect len"
 msgstr ""
 
-#: ../Gtk/gui.py:989
+#: ../Gtk/gui.py:1106
 msgid "Incorrect item $1"
 msgstr ""
 
-#: ../Gtk/gui.py:1005
+#: ../Gtk/gui.py:1122
 msgid "The budget does not have the path record: $1"
 msgstr ""
 
-#: ../Gtk/gui.py:1196
+#: ../Gtk/gui.py:1478
 msgid "Decomposition"
 msgstr ""
 
-#: ../Gtk/gui.py:1197 ../Gtk/gui.py:2213
+#: ../Gtk/gui.py:1479 ../Gtk/gui.py:2485
 msgid "Description"
 msgstr ""
 
-#: ../Gtk/gui.py:1198 ../Gtk/gui.py:2215
+#: ../Gtk/gui.py:1480 ../Gtk/gui.py:2487
 msgid "Measure"
 msgstr ""
 
-#: ../Gtk/gui.py:1199
+#: ../Gtk/gui.py:1481
 msgid "Sheet of Conditions"
 msgstr ""
 
-#: ../Gtk/gui.py:1200
+#: ../Gtk/gui.py:1482
 msgid "Files"
 msgstr ""
 
-#: ../Gtk/gui.py:1201
+#: ../Gtk/gui.py:1483
 msgid "Companies"
 msgstr ""
 
-#: ../Gtk/gui.py:1385
+#: ../Gtk/gui.py:1660
 msgid "Split View Left/Right"
 msgstr ""
 
-#: ../Gtk/gui.py:1389
+#: ../Gtk/gui.py:1664
 msgid "Split View Top/Bottom"
 msgstr ""
 
-#: ../Gtk/gui.py:1393
+#: ../Gtk/gui.py:1668
 msgid "Close view"
 msgstr ""
 
-#: ../Gtk/gui.py:1562
+#: ../Gtk/gui.py:1836
 msgid "The item must be a widget object."
 msgstr ""
 
-#: ../Gtk/gui.py:1568
+#: ../Gtk/gui.py:1842
 msgid "Invalid orientation."
 msgstr ""
 
-#: ../Gtk/gui.py:1943 ../Gtk/gui.py:2577 ../Gtk/gui.py:3987
+#: ../Gtk/gui.py:2214 ../Gtk/gui.py:2841 ../Gtk/gui.py:4171
 msgid "Argument must be a Budget object"
 msgstr ""
 
-#: ../Gtk/gui.py:1952
-msgid "DecompositionList.__init__: Record path can not be None"
+#: ../Gtk/gui.py:2223
+msgid "Record path can not be None"
 msgstr ""
 
-#: ../Gtk/gui.py:1983
+#: ../Gtk/gui.py:2254
 msgid "a"
 msgstr ""
 
-#: ../Gtk/gui.py:2210 ../Gtk/gui.py:4047
+#: ../Gtk/gui.py:2482 ../Gtk/gui.py:4234
 msgid "Code"
 msgstr ""
 
-#: ../Gtk/gui.py:2211
+#: ../Gtk/gui.py:2483
 msgid "Unit"
 msgstr ""
 
-#: ../Gtk/gui.py:2217
+#: ../Gtk/gui.py:2489
 msgid "Price"
 msgstr ""
 
-#: ../Gtk/gui.py:2219
+#: ../Gtk/gui.py:2491
 msgid "Amount"
 msgstr ""
 
-#: ../Gtk/gui.py:2231 ../Gtk/gui.py:2709
+#: ../Gtk/gui.py:2502 ../Gtk/gui.py:2981
 msgid "Invalid path"
 msgstr ""
 
-#: ../Gtk/gui.py:2582
+#: ../Gtk/gui.py:2846
 msgid "Record path must be a tuple"
 msgstr ""
 
-#: ../Gtk/gui.py:2726
+#: ../Gtk/gui.py:2990
 msgid "measure must be a Measure object. Type: $1"
 msgstr ""
 
-#: ../Gtk/gui.py:2737 ../Gtk/gui.py:4062 ../Gtk/gui.py:4389
+#: ../Gtk/gui.py:3002 ../Gtk/gui.py:4249 ../Gtk/gui.py:4562
 msgid "Type"
 msgstr ""
 
-#: ../Gtk/gui.py:2738
+#: ../Gtk/gui.py:3003
 msgid "Comment"
 msgstr ""
 
-#: ../Gtk/gui.py:2739
+#: ../Gtk/gui.py:3004
 msgid ""
 "N\n"
 "(a)"
 msgstr ""
 
-#: ../Gtk/gui.py:2740
+#: ../Gtk/gui.py:3005
 msgid ""
 "Length\n"
 "(b)"
 msgstr ""
 
-#: ../Gtk/gui.py:2741
+#: ../Gtk/gui.py:3006
 msgid ""
 "Width\n"
 "(c)"
 msgstr ""
 
-#: ../Gtk/gui.py:2742
+#: ../Gtk/gui.py:3007
 msgid ""
 "Height\n"
 "(d)"
 msgstr ""
 
-#: ../Gtk/gui.py:2743
+#: ../Gtk/gui.py:3008
 msgid "Formula"
 msgstr ""
 
-#: ../Gtk/gui.py:2744
+#: ../Gtk/gui.py:3009
 #, python-format
 msgid ""
 "Parcial\n"
 "[%s]"
 msgstr ""
 
-#: ../Gtk/gui.py:2745
+#: ../Gtk/gui.py:3010
 msgid "Subtotal"
 msgstr ""
 
-#: ../Gtk/gui.py:3153 ../Gtk/gui.py:3175
+#: ../Gtk/gui.py:3418 ../Gtk/gui.py:3440
 msgid "Description text of the record $1"
 msgstr ""
 
-#: ../Gtk/gui.py:3332
+#: ../Gtk/gui.py:3591
 msgid "Sheet of Conditions of the record $1"
 msgstr ""
 
-#: ../Gtk/gui.py:3352
+#: ../Gtk/gui.py:3609
 msgid "Field"
 msgstr ""
 
-#: ../Gtk/gui.py:3374
+#: ../Gtk/gui.py:3630
 msgid "Section"
 msgstr ""
 
-#: ../Gtk/gui.py:3527
+#: ../Gtk/gui.py:3778
 msgid "Sheet2 of Conditions of the record $1"
 msgstr ""
 
-#: ../Gtk/gui.py:3903
-msgid "$1 text"
-msgstr ""
-
-#: ../Gtk/gui.py:4048
+#: ../Gtk/gui.py:4235
 msgid "Code that define the company"
 msgstr ""
 
-#: ../Gtk/gui.py:4049
+#: ../Gtk/gui.py:4236
 msgid "Summary"
 msgstr ""
 
-#: ../Gtk/gui.py:4050
+#: ../Gtk/gui.py:4237
 msgid "Summary of the company name"
 msgstr ""
 
-#: ../Gtk/gui.py:4051 ../Gtk/gui.py:4067
+#: ../Gtk/gui.py:4238 ../Gtk/gui.py:4254
 msgid "Name"
 msgstr ""
 
-#: ../Gtk/gui.py:4052
+#: ../Gtk/gui.py:4239
 msgid "Complete name"
 msgstr ""
 
-#: ../Gtk/gui.py:4053
+#: ../Gtk/gui.py:4240
 msgid "CIF"
 msgstr ""
 
-#: ../Gtk/gui.py:4054
+#: ../Gtk/gui.py:4241
 msgid "Fiscal identifier number"
 msgstr ""
 
-#: ../Gtk/gui.py:4055
+#: ../Gtk/gui.py:4242
 msgid "Web"
 msgstr ""
 
-#: ../Gtk/gui.py:4056
+#: ../Gtk/gui.py:4243
 msgid "Company web page"
 msgstr ""
 
-#: ../Gtk/gui.py:4057
+#: ../Gtk/gui.py:4244
 msgid "Email"
 msgstr ""
 
-#: ../Gtk/gui.py:4058
+#: ../Gtk/gui.py:4245
 msgid "Company email"
 msgstr ""
 
-#: ../Gtk/gui.py:4063
+#: ../Gtk/gui.py:4250
 msgid ""
 "Type of Office:\n"
 "                           C: Central office\n"
@@ -990,131 +986,131 @@
 "                           R: Performer"
 msgstr ""
 
-#: ../Gtk/gui.py:4068
+#: ../Gtk/gui.py:4255
 msgid "Office name"
 msgstr ""
 
-#: ../Gtk/gui.py:4069
+#: ../Gtk/gui.py:4256
 msgid "Address"
 msgstr ""
 
-#: ../Gtk/gui.py:4070
+#: ../Gtk/gui.py:4257
 msgid "Postal code"
 msgstr ""
 
-#: ../Gtk/gui.py:4071
+#: ../Gtk/gui.py:4258
 msgid "Town"
 msgstr ""
 
-#: ../Gtk/gui.py:4072
+#: ../Gtk/gui.py:4259
 msgid "Province"
 msgstr ""
 
-#: ../Gtk/gui.py:4073
+#: ../Gtk/gui.py:4260
 msgid "Country"
 msgstr ""
 
-#: ../Gtk/gui.py:4074
+#: ../Gtk/gui.py:4261
 msgid "Phone"
 msgstr ""
 
-#: ../Gtk/gui.py:4075
+#: ../Gtk/gui.py:4262
 msgid "Phone numbers of the office"
 msgstr ""
 
-#: ../Gtk/gui.py:4076
+#: ../Gtk/gui.py:4263
 msgid "Fax"
 msgstr ""
 
-#: ../Gtk/gui.py:4077
+#: ../Gtk/gui.py:4264
 msgid "Fax numbers of the office"
 msgstr ""
 
-#: ../Gtk/gui.py:4078
+#: ../Gtk/gui.py:4265
 msgid "Contact person"
 msgstr ""
 
-#: ../Gtk/gui.py:4079
+#: ../Gtk/gui.py:4266
 msgid "Contact persons in the office"
 msgstr ""
 
-#: ../Gtk/gui.py:4083
+#: ../Gtk/gui.py:4270
 msgid "Unknow Option Type"
 msgstr ""
 
-#: ../Gtk/gui.py:4327
+#: ../Gtk/gui.py:4500
 msgid "Boolean"
 msgstr ""
 
-#: ../Gtk/gui.py:4328
+#: ../Gtk/gui.py:4501
 msgid "Integer"
 msgstr ""
 
-#: ../Gtk/gui.py:4329
+#: ../Gtk/gui.py:4502
 msgid "Text"
 msgstr ""
 
-#: ../Gtk/gui.py:4330
+#: ../Gtk/gui.py:4503
 msgid "Color"
 msgstr ""
 
-#: ../Gtk/gui.py:4331
+#: ../Gtk/gui.py:4504
 msgid "List"
 msgstr ""
 
-#: ../Gtk/gui.py:4363
+#: ../Gtk/gui.py:4536
 msgid "Option name"
 msgstr ""
 
-#: ../Gtk/gui.py:4376
+#: ../Gtk/gui.py:4549
 msgid "Value"
 msgstr ""
 
-#: ../Gtk/gui.py:4414
+#: ../Gtk/gui.py:4588
 msgid "Description:"
 msgstr ""
 
-#: ../Gtk/gui.py:4576
+#: ../Gtk/gui.py:4749
 msgid "Option values must be strings"
 msgstr ""
 
-#: ../Gtk/gui.py:4578
+#: ../Gtk/gui.py:4751
 msgid "Option must be a tuple with 4 items"
 msgstr ""
 
-#: ../Gtk/gui.py:4580
+#: ../Gtk/gui.py:4753
 msgid "Option list must be a list"
 msgstr ""
 
-#: ../Gtk/gui.py:4600
+#: ../Gtk/gui.py:4773
 msgid "Icorrect type, must be boolean"
 msgstr ""
 
-#: ../Gtk/gui.py:4605
+#: ../Gtk/gui.py:4778
 msgid "Icorrect type, must be integer"
 msgstr ""
 
-#: ../Gtk/gui.py:4618
+#: ../Gtk/gui.py:4791
 msgid "Icorrect type, must be string"
 msgstr ""
 
-#: ../Gtk/gui.py:4631
+#: ../Gtk/gui.py:4804
 msgid "Icorrect type, must be list"
 msgstr ""
 
-#: ../Gtk/gui.py:4637
+#: ../Gtk/gui.py:4810
 msgid "Icorrect type, must be a parseable color"
 msgstr ""
 
-#: ../Gtk/gui.py:4645
+#: ../Gtk/gui.py:4818
 msgid "Type must be boolean, integer, string or color"
 msgstr ""
 
-#: ../Gtk/gui.py:4648
+#: ../Gtk/gui.py:4821
 msgid "Value must be in the option dict"
 msgstr ""
 
-#: ../Gtk/gui.py:4650
+#: ../Gtk/gui.py:4823
 msgid "Values must be a dict"
 msgstr ""
 
@@ -1122,26 +1118,26 @@
 msgid "Open File"
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:137
+#: ../Gtk/importFiebdc.py:135
 msgid "The file must have 'bc3' extension"
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:139
+#: ../Gtk/importFiebdc.py:137
 msgid "The file must have 'durus' extension"
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:210
+#: ../Gtk/importFiebdc.py:208
 msgid "Loading file ..."
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:234
+#: ../Gtk/importFiebdc.py:232
 msgid "Cancel"
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:439
+#: ../Gtk/importFiebdc.py:436
 msgid "Saving file: $1"
 msgstr ""
 
-#: ../Gtk/importFiebdc.py:444
+#: ../Gtk/importFiebdc.py:441
 msgid "Saving time: $1 seconds"
 msgstr ""