def addProject_(self, sender):
     projectName = self.edtAddProject.stringValue()
     if projectName not in Projects.get() and not re.match("^\s*$", projectName):
             Projects.add(self.edtAddProject.stringValue())
     else:
         """Show alert with reason for failure"""
         alert = NSAlert.alloc().init()
         alert.addButtonWithTitle_('OK')
         alert.setMessageText_("Failed to add new project")
         alert.setInformativeText_("Please ensure the project does not already exist and that it contains characters.")
         alert.runModal()
         
     self.loadProjectsLists()
     self.edtAddProject.setStringValue_("")
 def initControls(self):
     """Init basic controls"""
     self.outputArea.setString_("")
     
     self.tasks = Tasks()
     
     if Settings.get("showWorkTill"):
         self.workTillBox.setHidden_(False)
     else:
         self.workTillBox.setHidden_(True)
         
     self.pbtnProject.removeAllItems()
     self.pbtnProject.addItemsWithTitles_(Projects.get())
     self.pbtnProject.selectItemWithTitle_(Settings.get("selectedProject"))
     
     self.projectChange_(None)
     
     self.fillTasks()
     self.scrollToEnd()
 def loadProjectsLists(self):
     self.pbtnRemoveProject.removeAllItems()
     self.pbtnRemoveProject.addItemsWithTitles_(Projects.get())
 def addProject_(self, sender):
     if self.edtAddProject.stringValue() not in Projects.get():
         Projects.add(self.edtAddProject.stringValue())
         
         self.loadProjectsLists()
         self.edtAddProject.setStringValue_("")