Changes to templates to include e-mail as a link
[biacv.git] / biacv_mainwindow.py
index dbcbc05..ec74b82 100644 (file)
+# BiaCV
 # class for main window
 
 import PyQt4
+import sys
+
 import biacv_mainwindow_ui as bui
+import biacv_lang as lang
+import biacv_data as data
+import biacv_exporter as exporter
 
 class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
        def __init__ (self):
                PyQt4.QtGui.QMainWindow.__init__ (self)
+               self.show ()
                self.setupUi (self)
                self.currentfile = None
+               self.ismodified = False
+               self.setWindowTitle ("BiaCV - untitled")
+
+       # on window closing
+       def closeEvent (self, event):
+               if self.ismodified is True:
+                       ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DISCARD_SAVE,
+                               PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+                       # ignore event if not confirmed
+                       if ans <> PyQt4.QtGui.QMessageBox.Yes:
+                               event.ignore ()
+
+       # on help about dialog box
+       def on_help_about (self):
+               PyQt4.QtGui.QMessageBox.about (self, lang.ABOUT_TITLE, lang.ABOUT_TEXT)
+
+       # on file exit
+       def on_exit (self):
+               # call the close event
+               self.close()
+
+       # on file export - export current document to any external format based on
+       # a template
+       def on_file_export (self):
+               # get the template directory
+               templatedir = PyQt4.QtGui.QFileDialog.getExistingDirectory (self,
+                                               lang.OPEN_TEMPLATE_TITLE)
+               if templatedir == "":
+                       return
+
+               # create a new exporter object
+               exp = exporter.BiaCVExporter ()
+
+               # set the document data
+               exp.set_data (self.get_document_data ().data)
+
+               # set the template directory
+               exp.set_template_directory (unicode (templatedir.toUtf8(), "utf-8"))
+
+               # get the output file path
+               outputfile = PyQt4.QtGui.QFileDialog.getSaveFileName (self,
+                       exp.exporter_name, filter=exp.export_filter)
+
+               if outputfile == "":
+                       return
+
+
+               # set the output file
+               exp.set_output (unicode (outputfile.toUtf8(), "utf-8"))
+
+               # carry out the export function
+               exp.export ()
+
+       # function to open a file
+       def on_file_open (self):
+               # if modified, confirm
+               if self.ismodified is True:
+                       ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DISCARD_SAVE,
+                               PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+                       # if no, then don't open the file
+                       if ans <> PyQt4.QtGui.QMessageBox.Yes:
+                               return
+
+               # open file dialog
+               openfilename = PyQt4.QtGui.QFileDialog.getOpenFileName (self, lang.OPEN_TITLE,
+                               filter = lang.BIACV_FILE_FILTER)
+               # if no open file name then return
+               if openfilename == "":
+                       return
+
+               # load the document data from open file name
+               docdata = data.BiaCVData ()
+               docdata.load_data (openfilename)
+
+               # set the title
+               self.title.setText (docdata.data["title"])
+
+               # set the personal information fields from document data
+               self.set_personal_info (docdata)
+
+               # set the profile highlights
+               self.set_profile_highlights (docdata)
+
+               # set the educational qualifications
+               self.set_educational_qualifications (docdata)
+
+               # set the professional history
+               self.set_professional_history (docdata)
+
+               # set the career objectives
+               self.set_career_objectives (docdata)
+
+               # set the skills list
+               self.set_skillsets_info (docdata)
+
+               # set the additional information
+               self.set_additional_info (docdata)
+
+               # set the current document
+               self.currentfile = openfilename
+               self.ismodified = False
+
+               # set the window title
+               self.setWindowTitle ("BiaCV - " + self.currentfile)
+
+       # function to save a file as a new document
+       def on_file_save_as (self):
+               savefilename = PyQt4.QtGui.QFileDialog.getSaveFileName (self,
+                       lang.SAVE_TITLE, filter=lang.BIACV_FILE_FILTER)
+
+               # if save file name is not none
+               if savefilename <> "":
+                       mydata = self.get_document_data ()
+                       mydata.save_data (savefilename)
+                       self.ismodified = False
+                       self.currentfile = savefilename
+                       self.setWindowTitle ("BiaCV - " + self.currentfile)
+
+       # function to save a file
+       def on_file_save (self):
+               # only save modified file
+               if self.ismodified is False:
+                       return
+
+               # if no current file get file name from file save dialog
+               if self.currentfile is None:
+                       savefilename = PyQt4.QtGui.QFileDialog.getSaveFileName (self,
+                               lang.SAVE_TITLE, filter=lang.BIACV_FILE_FILTER)
+
+                       if savefilename <> "":
+                               mydata = self.get_document_data ()
+                               mydata.save_data (savefilename)
+                               self.ismodified = False
+                               self.currentfile = savefilename
+                               self.setWindowTitle ("BiaCV - " + self.currentfile)
+               else:
+                       mydata = self.get_document_data ()
+                       mydata.save_data (self.currentfile)
+                       self.ismodified = False
+
+       # function to set document data from the GUI
+       def get_document_data (self):
+               docdata = data.BiaCVData ()
+
+               # set the document title
+               docdata.set_document_title (unicode (self.title.text ().toUtf8 (), "utf-8"))
+
+               # get the marital status string from check box
+               if self.married.isChecked ():
+                       maritalstatus = True
+               elif self.single.isChecked ():
+                       maritalstatus = False
+               else:
+                       maritalstatus = None
+
+               docdata.set_personal_info (
+                               unicode (self.nametitle.lineEdit ().text ().toUtf8 (), "utf-8"),
+                               unicode (self.firstname.text ().toUtf8 (), "utf-8"),
+                               unicode (self.lastname.text ().toUtf8 (), "utf-8"),
+                               unicode (self.dateofbirth.date().toString ("dd MMM, yyyy"), "utf-8"),
+                               unicode (self.street.text ().toUtf8 (), "utf-8"),
+                               unicode (self.area.text ().toUtf8 (), "utf-8"),
+                               unicode (self.city.text ().toUtf8 (), "utf-8"),
+                               unicode (self.areacode.text ().toUtf8 (), "utf-8"),
+                               unicode (self.country.text ().toUtf8 (), "utf-8"),
+                               unicode (self.countrycode_landline.text ().toUtf8 (), "utf-8"),
+                               unicode (self.telephone.text ().toUtf8 (), "utf-8"),
+                               unicode (self.countrycode_mobile.text ().toUtf8 (), "utf-8"),
+                               unicode (self.mobilenumber.text ().toUtf8 (), "utf-8"),
+                               unicode (self.email.text ().toUtf8 (), "utf-8"),
+                               maritalstatus
+                       )
+
+               # set the profile highlights
+               profile_highlights = unicode (self.profile.toPlainText ().toUtf8 (), "utf-8").splitlines ()
+               docdata.set_profile (profile_highlights)
+
+               # get the list of educational qualifications from the treewidget
+               education = []
+               i = 0
+               while i < self.educationlist.topLevelItemCount ():
+                       curitem = self.educationlist.topLevelItem (i)
+                       curdict = {}
+                       curdict["degree"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
+                       curdict["graduation"] = unicode (curitem.text (1).toUtf8 (), "utf-8")
+                       curdict["institution"] = unicode (curitem.text (2).toUtf8 (), "utf-8")
+                       curdict["university"] = unicode (curitem.text (3).toUtf8 (), "utf-8")
+                       curdict["grade"] = unicode (curitem.text (4).toUtf8 (), "utf-8")
+                       curdict["percentage"] = float (curitem.text (5))
+                       education.append (curdict)
+                       i += 1
+
+               # set the educational qualifications
+               docdata.set_educational_qualifications (education)
+
+               # get the list of professional history from the treewidget
+               professional = []
+               i = 0
+               while i < self.professionlist.topLevelItemCount ():
+                       curitem = self.professionlist.topLevelItem (i)
+                       curdict = {}
+                       curdict["jobtitle"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
+                       curdict["joindate"] = unicode (curitem.text (1), "utf-8")
+                       curdict["leavedate"] = unicode (curitem.text (2), "utf-8")
+                       curdict["organization"] = unicode (curitem.text (3).toUtf8 (), "utf-8")
+                       curdict["additionalinfo"] = unicode (curitem.text (4).toUtf8 (), "utf-8")
+                       professional.append (curdict)
+                       i += 1
+
+               # set the professional qualifications
+               docdata.set_professional_history (professional)
+
+               # set the career objectives
+               shorttermobjectives = unicode (self.shorttermcareer.toPlainText ().toUtf8 (), "utf-8").splitlines ()
+               longtermgoals = unicode (self.longtermgoals.toPlainText ().toUtf8 (), "utf-8").splitlines ()
+
+               docdata.set_career_objectives (shorttermobjectives, longtermgoals)
+
+               # set the skill sets
+               skills = []
+               i = 0
+               while i < self.skillslist.topLevelItemCount ():
+                       curitem = self.skillslist.topLevelItem (i)
+                       curdict = {}
+                       curdict["skilltitle"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
+                       curdict["skilldesc"] = unicode (curitem.text (1).toUtf8 (), "utf-8")
+                       skills.append (curdict)
+                       i += 1
+               # set the list of skills
+               docdata.set_skillsets (skills)
+
+               # get the list of languages
+               langsknown = []
+               i = 0
+               while i < self.languageslist.topLevelItemCount ():
+                       curitem = self.languageslist.topLevelItem (i)
+                       curdict = {}
+                       curdict["language"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
+                       curdict["canspeak" ] = (curitem.text (1) == "True")
+                       curdict["canreadwrite"] = (curitem.text (2) == "True")
+                       curdict["isproficient"] = (curitem.text (3) == "True")
+                       langsknown.append (curdict)
+                       i += 1
+
+               additionalinformation = unicode (self.additionalinformation.toPlainText ().toUtf8 (), "utf-8")
+
+               docdata.set_additional_information (langsknown, additionalinformation)
+
+               return docdata
+
+       # function to reset personal information data in the GUI
+       def reset_personal_info (self):
+               self.nametitle.setEditText ("")
+               self.firstname.setText ("")
+               self.lastname.setText ("")
+               self.dateofbirth.setDate (PyQt4.QtCore.QDate (1970, 1, 1))
+               self.street.setText ("")
+               self.area.setText ("")
+               self.city.setText ("")
+               self.countrycode_landline.setText ("")
+               self.telephone.setText ("")
+               self.countrycode_mobile.setText ("")
+               self.mobilenumber.setText ("")
+               self.email.setText ("")
+               self.areacode.setText ("")
+               self.unspecified.setChecked (True)
+               self.country.setText ("")
+
+       # function to set the profile highlights in the GUI from document data
+       def set_profile_highlights (self, docdata):
+               self.profile.setPlainText (u'\n'.join (docdata.data["profile"]))
+
+       # function to reset profile highlights data in GUI
+       def reset_profile_highlights (self):
+               self.profile.setPlainText ("")
+
+       # function to set personal information data in the GUI from document data
+       def set_personal_info (self, docdata):
+               self.nametitle.setEditText (docdata.data["nametitle"])
+               self.firstname.setText (docdata.data["firstname"])
+               self.lastname.setText (docdata.data["lastname"])
+               self.dateofbirth.setDate (PyQt4.QtCore.QDate.fromString (docdata.data["dateofbirth"], "dd MMM, yyyy"))
+               self.street.setText (docdata.data["street"])
+               self.area.setText (docdata.data["area"])
+               self.city.setText (docdata.data["city"])
+               self.countrycode_landline.setText (docdata.data["countrycode_landline"])
+               self.telephone.setText (docdata.data["landline"])
+               self.countrycode_mobile.setText (docdata.data["countrycode_mobile"])
+               self.mobilenumber.setText (docdata.data["mobile"])
+               self.email.setText (docdata.data["email"])
+               self.areacode.setText (docdata.data["areacode"])
+               self.country.setText (docdata.data["country"])
+
+               if docdata.data["maritalstatus"] is True:
+                       self.married.setChecked (True)
+               elif docdata.data["maritalstatus"] is False:
+                       self.single.setChecked (True)
+               else:
+                       self.unspecified.setChecked (True)
+
+       # function to clear professional history in the GUI
+       def reset_professional_history (self):
+               self.reset_profession_fields ()
+               self.professionlist.clear ()
+
+       # function to set the professional history in the GUI from the document data
+       def set_professional_history (self, docdata):
+               # reset the professional history
+               self.reset_professional_history ()
+
+               # add the professional history items to list
+               for item in docdata.data["professionalhistory"]:
+                       professionitem = PyQt4.QtGui.QTreeWidgetItem (
+                                       [
+                                               item["jobtitle"],
+                                               item["joindate"],
+                                               item["leavedate"],
+                                               item["organization"],
+                                               item["additionalinfo"]
+                                       ]
+                               )
+                       self.professionlist.addTopLevelItem (professionitem)
+
+       # function to clear educational qualifications in the GUI
+       def reset_educational_qualifications (self):
+               self.reset_education_fields ()
+               self.educationlist.clear ()
+
+       # function to set education qualifications in the GUI from document data
+       def set_educational_qualifications (self, docdata):
+               # reset the educational qualifications
+               self.reset_educational_qualifications ()
+
+               # add education items to list
+               for item in docdata.data["educationalqualifications"]:
+                       educationitem = PyQt4.QtGui.QTreeWidgetItem (
+                                       [
+                                               item["degree"],
+                                               item["graduation"],
+                                               item["institution"],
+                                               item["university"],
+                                               item["grade"],
+                                               str (item["percentage"])
+                                       ]
+                               )
+                       self.educationlist.addTopLevelItem (educationitem)
+
+       # function to clear career objectives data in the GUI
+       def reset_career_objectives (self):
+               self.shorttermcareer.setPlainText ("")
+               self.longtermgoals.setPlainText ("")
+
+       # function to set career objectives data in the GUI from document data
+       def set_career_objectives (self, docdata):
+               self.shorttermcareer.setPlainText (u'\n'.join (docdata.data["shorttermobjectives"]))
+               self.longtermgoals.setPlainText (u'\n'.join (docdata.data["longtermgoals"]))
+
+       # function to clear skill sets data in the GUI
+       def reset_skillsets_info (self):
+               self.reset_skillset_fields ()
+               self.skillslist.clear ()
+
+       # function to set the skill sets data in the GUI from document data
+       def set_skillsets_info (self, docdata):
+               # clear the skill sets information
+               self.reset_skillsets_info ()
+
+               for item in docdata.data["skillsets"]:
+                       skillitem = PyQt4.QtGui.QTreeWidgetItem (
+                                       [
+                                               item["skilltitle"],
+                                               item["skilldesc"]
+                                       ]
+                               )
+                       self.skillslist.addTopLevelItem (skillitem)
+
+
+       # function to clear additional information data in the GUI
+       def reset_additional_info (self):
+               self.reset_language_fields ()
+               self.languageslist.clear ()
+               self.additionalinformation.setPlainText ("")
+
+       # function to set additional information data in the GUI from the document data
+       def set_additional_info (self, docdata):
+               # clear the additional information
+               self.reset_additional_info ()
+
+               # set the languages list
+               for item in docdata.data["languagesknown"]:
+                       langitem = PyQt4.QtGui.QTreeWidgetItem (
+                                       [
+                                               item["language"],
+                                               str (item["canspeak"]),
+                                               str (item["canreadwrite"]),
+                                               str (item["isproficient"])
+                                       ]
+                               )
+                       self.languageslist.addTopLevelItem (langitem)
+
+               self.additionalinformation.setPlainText (docdata.data["additionalinformation"])
+
+       # function to clear all the fields and reset them to defaults
+       def new_document (self):
+               # first clear the individual record fields in the tabs
+               self.reset_language_fields ()
+               self.reset_skillset_fields ()
+
+               # clear document data
+               self.title.setText ("")
+
+               self.reset_personal_info ()
+               self.reset_profile_highlights ()
+               self.reset_professional_history ()
+               self.reset_educational_qualifications ()
+               self.reset_career_objectives ()
+               self.reset_skillsets_info ()
+               self.reset_additional_info ()
+
+               # set the page to first page
+               self.pages.setCurrentIndex (0)
+
+               # set current file to none and modified to false
+               self.currentfile = None
+               self.ismodified = False
+
+               # set the window title
+               self.setWindowTitle ("BiaCV - untitled")
+
+       # file new action is triggered
+       def on_file_new (self):
+               # if the previous document is modified
+               # as if it should be discarded
+               if self.ismodified is True:
+                       ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM,
+                               lang.CONFIRM_DISCARD_SAVE,
+                               PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+                       if ans == PyQt4.QtGui.QMessageBox.Yes:
+                               self.new_document ()
+               # if not modified then simply create a new document
+               else:
+                       self.new_document ()
+
+       # when the document is modified
+       def on_document_modified (self):
+               # set the document modified flag
+               self.ismodified = True
+
+       # update a language in the list of languages
+       def on_update_lang (self):
+               # get the selected language
+               selitems = self.languageslist.selectedItems ()
+               if selitems == []:
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
+                       return
+               # check if the language string is not empty
+               if self.language.text () == "":
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
+                       return
+               selitem = selitems[0]
+               selitem.setText (0, self.language.text ())
+               selitem.setText (1, str (self.canspeak.isChecked ()))
+               selitem.setText (2, str (self.canreadwrite.isChecked ()))
+               selitem.setText (3, str (self.isproficient.isChecked ()))
+
+               # modified the document
+               self.ismodified = True
+
+       # selecting a language from the list of languages
+       def on_select_lang (self):
+               # set the language fields from the selected item
+               self.set_language_fields ()
+
+       # delete a language from the list of languages known
+       def on_delete_lang (self):
+               # get selected language
+               selitems = self.languageslist.selectedItems ()
+               if selitems == []:
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_REQ_MISSING)
+                       return
+               # confirm
+               ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
+                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+               if ans == PyQt4.QtGui.QMessageBox.Yes:
+                       for item in selitems:
+                               self.languageslist.takeTopLevelItem (self.languageslist.indexOfTopLevelItem (item))
+
+                       self.reset_language_fields ()
+                       # set the modified flag
+                       self.ismodified = True
+
+       # add a language to the list of languages known
+       def on_add_lang (self):
+               # check if the language is set
+               if self.language.text () == "":
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
+                       return
+               langitem = PyQt4.QtGui.QTreeWidgetItem (
+                               [
+                                       self.language.text (),
+                                       str (self.canspeak.isChecked ()),
+                                       str (self.canreadwrite.isChecked ()),
+                                       str (self.isproficient.isChecked ())
+                               ]
+                       )
+               self.languageslist.addTopLevelItem (langitem)
+               self.reset_language_fields ()
+
+               # set the modified flag
+               self.ismodified = True
+
+       # set the language fields from the selected item
+       def set_language_fields (self):
+               selitems = self.languageslist.selectedItems ()
+               if selitems == []:
+                       return
+               selitem = selitems[0]
+               self.language.setText (selitem.text (0))
+               self.canspeak.setChecked (selitem.text (1) == "True")
+               self.canreadwrite.setChecked (selitem.text(2) == "True")
+               self.isproficient.setChecked (selitem.text(3) == "True")
+
+       # reset the language fields
+       def reset_language_fields (self):
+               self.language.setText ("")
+               self.canspeak.setChecked (True)
+               self.canreadwrite.setChecked (False)
+               self.isproficient.setChecked (False)
+
+       # update the skill set button event
+       def on_update_skill (self):
+               # get the selected item
+               selitems = self.skillslist.selectedItems ()
+               if selitems == []:
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
+                       return
+               if self.skillsettitle.text () == "":
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
+                       return
+               selitem = selitems[0]
+
+               selitem.setText (0, self.skillsettitle.text ())
+               selitem.setText (1, self.skilldescription.toPlainText ())
+               # set the modified flag
+               self.ismodified = True
+
+       # selecting a skill from the list event
+       def on_select_skill (self):
+               self.set_skill_fields ()
+
+       # set the skill fields from the selected skill from the list
+       def set_skill_fields (self):
+               # get the selected items
+               selitems = self.skillslist.selectedItems ()
+               if selitems == []:
+                       return
+               selitem = selitems[0]
+               self.skillsettitle.setText (selitem.text (0))
+               self.skilldescription.setPlainText (selitem.text (1))
+
+       # delete skill set button is clicked
+       def on_delete_skill (self):
+               # get the selected items
+               selitems = self.skillslist.selectedItems ()
+               if selitems == []:
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
+                       return
+               # confirm
+               ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
+                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+               # answer is yes
+               if ans == PyQt4.QtGui.QMessageBox.Yes:
+                       for item in selitems:
+                               self.skillslist.takeTopLevelItem (self.skillslist.indexOfTopLevelItem (item))
+
+                       self.reset_skillset_fields ()
+                       # set the modified flag
+                       self.ismodified = True
 
        # add skill set button is clicked
        def on_add_skill (self):
                # if the skill title is blank
                if self.skillsettitle.text () == "":
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot add", "A required field is missing.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
                        return
                skillitem = PyQt4.QtGui.QTreeWidgetItem (
                                [
@@ -23,10 +608,12 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                        )
                self.skillslist.addTopLevelItem (skillitem)
                self.reset_skillset_fields ()
+               # set the modified flag
+               self.ismodified = True
 
        # clear the skill set fields
        def reset_skillset_fields (self):
-               self.skillsetitle.setText ("")
+               self.skillsettitle.setText ("")
                self.skilldescription.setPlainText ("")
 
        # update professional history button is clicked
@@ -34,22 +621,21 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                # get the selected item
                selitems = self.professionlist.selectedItems ()
                if selitems == []:
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot update", "No item selected.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
                        return
                selitem = selitems[0]
                # if designation is not set
                if self.designation.text () == "":
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot update", "A required field is missing.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
                        return
                # if currently employed in that position, leaving date is to be disabled
-               # and set to "current"
+               # and set to empty
                if self.currentemployment.isChecked ():
-                       leavedatestr = "current"
+                       leavedatestr = ""
                else:
                        # if the leaving date is < join date
                        if self.leavedate.date () < self.joindate.date ():
-                               PyQt4.QtGui.QMessageBox.critical (self, "Cannot add",
-                                       "Leaving date cannot be earlier than join date.")
+                               PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_DATE)
                                return
                        leavedatestr = self.leavedate.date ().toString ("dd MMM, yyyy")
 
@@ -58,38 +644,40 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                selitem.setText (2, leavedatestr)
                selitem.setText (3, self.organization.text ())
                selitem.setText (4, self.additionalinfo.text ())
+               # set the modified flag
+               self.ismodified = True
 
        # delete professional history button is clicked
        def on_delete_profession (self):
                # get the selected items
                selitems = self.professionlist.selectedItems ()
                if selitems == []:
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot delete", "No item selected.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
                        return
                # confirm deletion
-               ans = PyQt4.QtGui.QMessageBox.question (self, "Confirm",
-                       "Are you sure you wish to delete the selected item?",
+               ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
                        PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
                # if confirmed
                if ans == PyQt4.QtGui.QMessageBox.Yes:
                        for item in selitems:
                                self.professionlist.takeTopLevelItem (self.professionlist.indexOfTopLevelItem (item))
                        self.reset_profession_fields ()
+                       # set the modified flag
+                       self.ismodified = True
 
        # add professional history button is clicked
        def on_add_profession (self):
                if self.designation.text () == "":
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot add", "A required field is missing.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
                        return
                # if currently employed in that position, leaving date is to be disabled
-               # and set to "current"
+               # and set to ""
                if self.currentemployment.isChecked ():
-                       leavedatestr = "current"
+                       leavedatestr = ""
                else:
                        # if the leaving date is < join date
                        if self.leavedate.date () < self.joindate.date ():
-                               PyQt4.QtGui.QMessageBox.critical (self, "Cannot add",
-                                       "Leaving date cannot be earlier than join date.")
+                               PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_DATE)
                                return
                        leavedatestr = self.leavedate.date ().toString ("dd MMM, yyyy")
 
@@ -106,6 +694,8 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                self.professionlist.addTopLevelItem (professionitem)
 
                self.reset_profession_fields ()
+               # set the modified flag
+               self.ismodified = True
 
        # when selection of profession list is changed
        def on_select_profession (self):
@@ -119,7 +709,7 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                selitem = selitems[0]
                self.designation.setText (selitem.text (0))
                self.joindate.setDate (PyQt4.QtCore.QDate.fromString (selitem.text(1), "dd MMM, yyyy"))
-               if selitem.text (2) == "current":
+               if selitem.text (2) == "":
                        self.leavedate.setEnabled (False)
                        self.currentemployment.setChecked (True)
                else:
@@ -151,17 +741,18 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                selitems = self.educationlist.selectedItems ()
                # if no items are selected
                if selitems == []:
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot delete", "No items selected.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
                # delete the items after confirmation
                else:
-                       ans = PyQt4.QtGui.QMessageBox.question (self, "Confirm",
-                               "Are you sure you wish to delete selected item?",
+                       ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
                                PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
                        if ans == PyQt4.QtGui.QMessageBox.Yes:
                                # remove the item selected
                                for item in selitems:
                                        self.educationlist.takeTopLevelItem (self.educationlist.indexOfTopLevelItem (item))
                                self.reset_education_fields ()
+                               # set the modified flag
+                               self.ismodified = True
 
        # selection is changed
        def on_select_education (self):
@@ -172,11 +763,11 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                selitems = self.educationlist.selectedItems ()
                # if no item is selected
                if selitems == []:
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot update", "No item selected")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
                        return
                # if the qualification title is not set
                if self.degree_name.text () == "":
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot update", "A required field is missing.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
                        return
                selitem = selitems[0]
 
@@ -186,12 +777,14 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                selitem.setText (3, self.university.text ())
                selitem.setText (4, self.grade.text ())
                selitem.setText (5, str (self.percentage.value ()))
+               # set the modified flag
+               self.ismodified = True
 
        # add educational qualification button
        def on_add_education (self):
                # check if the qualification title is set
                if self.degree_name.text () == "":
-                       PyQt4.QtGui.QMessageBox.critical (self, "Cannot add", "A required fields is missing.")
+                       PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
                        return
                educationitem = PyQt4.QtGui.QTreeWidgetItem ([
                        self.degree_name.text (),
@@ -204,6 +797,8 @@ class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
                self.educationlist.addTopLevelItem (educationitem)
                # clear the fields
                self.reset_education_fields ()
+               # set the modified flag
+               self.ismodified = True
 
        # set fields in the education tab from current selected item
        def set_education_fields (self):