Ejemplo n.º 1
0
	def yes(self):
		field_list = self.field_list
		# print(field_list)
		# gui.mainWindow(self.master).delete_contact(name)
		ab.edit_contact(self.entry_id, field_list)
		db.db_commit()
		self.top.destroy()
Ejemplo n.º 2
0
	def field_return(self):
		"""Grabs form data and creates"""

		field_list = [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']
		
		first = self.first_name.get()
		last = self.last_name.get()
		st1 = self.address1.get()
		st2 = self.address2.get()
		city = self.city.get()
		state = self.state.get()
		zip = self.zip.get()
		home = self.home.get()
		mobile = self.mobile.get()
		email = self.email.get()
		bday = self.birthday.get()
		notes = self.notes.get()

		field_vars = [first, last, st1, st2, city, state, zip, home, mobile, email, bday, notes]

		for i in range(12):
			field_list[i] = field_vars[i]

		ab.add_contact(field_list)
		gui.mainWindow(self.master).search_query(gui.mainWindow(self.master).sort.get())
		# self.contact_list()
		self.close_window()
Ejemplo n.º 3
0
 def field_return(self):
     i = 0
     r = self.item.get()
     ab.add_contact(r)
     self.book_list.delete(0, Tk.END)
     for contact in ab.get_contacts_list("last"):
         self.book_list.insert(Tk.END, contact[0] + contact[1])
Ejemplo n.º 4
0
 def field_return(self):
     i = 0
     r = self.item.get()
     ab.add_contact(r)
     self.book_list.delete(0, Tk.END)
     for contact in ab.get_contacts_list('last'):
         self.book_list.insert(Tk.END, contact[0] + contact[1])
Ejemplo n.º 5
0
    def delete_contact(self, name):
        """Deletes selected contact.

		Keyword arguments:
		name -- First and Last name of contact to be deleted
		"""
        ab.remove_contact(name)
        self.search_query(self.sort.get())
Ejemplo n.º 6
0
	def delete_contact(self, name):
		"""Deletes selected contact.

		Keyword arguments:
		name -- First and Last name of contact to be deleted
		"""
		ab.remove_contact(name)
		self.search_query(self.sort.get())
Ejemplo n.º 7
0
def addContact():
    valid_name = valid_phone = False
    while not valid_name or not valid_phone:
        if not valid_name:
            name = input('Enter name:')
            valid_name = AddressBook.validateName(name)
        elif not valid_phone:
            phone_number = input('Enter phone number:')
            valid_phone = AddressBook.validatePhone(phone_number)
    
    c1 = Contact(name)
    c1.addPhone(phone_number)
    abook.addContact(c1)
Ejemplo n.º 8
0
    def onSelect(self, event):
        """Grabs name from contact list upon user click."""
        w = event.widget
        name = str(self.book_list.get(self.book_list.curselection()))
        self.clearTextEntries()

        name_entry = ab.get_contact(name)

        self.first_name.insert(0, str(name_entry[0]))
        self.last_name.insert(0, str(name_entry[1]))
        self.address1.insert(0, str(name_entry[2]))
        self.address2.insert(0, str(name_entry[3]))
        self.city.insert(0, str(name_entry[4]))
        self.state.insert(0, str(name_entry[5]))
        self.zip.insert(0, str(name_entry[6]))
        self.home.insert(0, str(name_entry[7]))
        self.mobile.insert(0, str(name_entry[8]))
        self.email.insert(0, str(name_entry[9]))
        self.birthday.insert(0, str(name_entry[10]))
        self.notes.insert(0, str(name_entry[11]))

        #User cannot edit entry displayed on main GUI, unless clicking edit button.
        self.first_name.configure(state='readonly')
        self.last_name.configure(state='readonly')
        self.address1.configure(state='readonly')
        self.address2.configure(state='readonly')
        self.city.configure(state='readonly')
        self.state.configure(state='readonly')
        self.zip.configure(state='readonly')
        self.home.configure(state='readonly')
        self.mobile.configure(state='readonly')
        self.email.configure(state='readonly')
        self.birthday.configure(state='readonly')
        self.notes.configure(state='readonly')
Ejemplo n.º 9
0
    def onSelect(self, event):
        """Grabs name from contact list upon user click."""
        w = event.widget
        name = str(self.book_list.get(self.book_list.curselection()))
        self.clearTextEntries()

        name_entry = ab.get_contact(name)

        self.first_name.insert(0, str(name_entry[0]))
        self.last_name.insert(0, str(name_entry[1]))
        self.address1.insert(0, str(name_entry[2]))
        self.address2.insert(0, str(name_entry[3]))
        self.city.insert(0, str(name_entry[4]))
        self.state.insert(0, str(name_entry[5]))
        self.zip.insert(0, str(name_entry[6]))
        self.home.insert(0, str(name_entry[7]))
        self.mobile.insert(0, str(name_entry[8]))
        self.email.insert(0, str(name_entry[9]))
        self.birthday.insert(0, str(name_entry[10]))
        self.notes.insert(0, str(name_entry[11]))

        # User cannot edit entry displayed on main GUI, unless clicking edit button.
        self.first_name.configure(state="readonly")
        self.last_name.configure(state="readonly")
        self.address1.configure(state="readonly")
        self.address2.configure(state="readonly")
        self.city.configure(state="readonly")
        self.state.configure(state="readonly")
        self.zip.configure(state="readonly")
        self.home.configure(state="readonly")
        self.mobile.configure(state="readonly")
        self.email.configure(state="readonly")
        self.birthday.configure(state="readonly")
        self.notes.configure(state="readonly")
Ejemplo n.º 10
0
 def __init__(self):
     wx.Frame.__init__(self, None, -1, self.title, wx.Point(30,30))
     self.addressBook = AddressBook()
     self.saveName = ""
     self.create_menu()
     self.create_main_panel()
     self.validation = Validator()
Ejemplo n.º 11
0
 def on_import(self, event):
     openFileDialog = wx.FileDialog(self, "Import .tsv file", "", "", ".tsv files (*.tsv)|*.tsv", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
     if openFileDialog.ShowModal() == wx.ID_CANCEL:
         return
     inFilePath = openFileDialog.GetPath()
     if self.validation.isValidUSPS(inFilePath):
         temp = AddressBook()
         temp.loadTSV(inFilePath)
         for contact in temp.contacts:
             self.addressBook.contacts.append(contact)
         self.addressBook.sort(self.addressBook.sortMethod[0],self.addressBook.sortMethod[1])
         self.display()
         self.flash_status_message("Imported address book {}".format(inFilePath))
         self.addressBook.changed = True
     else:
         dlg = wx.MessageDialog(self, "Unable to import {}".format(inFilePath.split('/')[len(inFilePath.split('/'))-1]), "Invalid File", wx.OK)
         dlg.ShowModal()
         dlg.Destroy()
Ejemplo n.º 12
0
    def field_return(self):
        """Grabs contact form data and sends it to add_contact() in 
		AddressBook.py.
		"""

        # List to hold form data
        field_list = [
            ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '
        ]

        # Get form data
        first = self.first_name.get()
        last = self.last_name.get()
        st1 = self.address1.get()
        st2 = self.address2.get()
        city = self.city.get()
        state = self.state.get()
        zip = self.zip.get()
        home = self.home.get()
        mobile = self.mobile.get()
        email = self.email.get()
        bday = self.birthday.get()
        notes = self.notes.get()

        field_vars = [
            first, last, st1, st2, city, state, zip, home, mobile, email, bday,
            notes
        ]

        # Add form data to field_list
        for i in range(12):
            field_list[i] = field_vars[i]

        # If contact entry has a first name, add the entry.
        #	Else, warn user there is no first name.
        if field_list[0] != '':
            ab.add_contact(field_list)

        else:
            self.c = cw.ConfirmationWindow(self.master)

        gui.mainWindow(self.master).search_query(
            gui.mainWindow(self.master).sort.get())
        self.close_window()
Ejemplo n.º 13
0
	def search_query(self, sort):
		"""Retrieve entries based off search string. Default search string 
		is ''. 

		Keyword arguments:
		sort -- Sorting method (Last Name or Zip)
		"""
		self.book_list.delete(0, Tk.END)

		for contact in ab.search(self.search_bar.get(), sort):
			self.book_list.insert(Tk.END, contact[0] + " " + contact[1])
Ejemplo n.º 14
0
    def search_query(self, sort):
        """Retrieve entries based off search string. Default search string 
		is ''. 

		Keyword arguments:
		sort -- Sorting method (Last Name or Zip)
		"""
        self.book_list.delete(0, Tk.END)

        for contact in ab.search(self.search_bar.get(), sort):
            self.book_list.insert(Tk.END, contact[0] + " " + contact[1])
Ejemplo n.º 15
0
	def field_return(self):
		"""Grabs contact form data and sends it to add_contact() in 
		AddressBook.py.
		"""

		# List to hold form data
		field_list = [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']
		
		# Get form data
		first = self.first_name.get()
		last = self.last_name.get()
		st1 = self.address1.get()
		st2 = self.address2.get()
		city = self.city.get()
		state = self.state.get()
		zip = self.zip.get()
		home = self.home.get()
		mobile = self.mobile.get()
		email = self.email.get()
		bday = self.birthday.get()
		notes = self.notes.get()

		field_vars = [first, last, st1, st2, city, state, zip, home, mobile, email, bday, notes]

		# Add form data to field_list
		for i in range(12):
			field_list[i] = field_vars[i]

		# If contact entry has a first name, add the entry. 
		#	Else, warn user there is no first name.
		if field_list[0] != '':
			ab.add_contact(field_list)
		
		else:
			self.c=cw.ConfirmationWindow(self.master)

		gui.mainWindow(self.master).search_query(gui.mainWindow(self.master).sort.get())
		self.close_window()
Ejemplo n.º 16
0
    def grab_contact(self):
        """Inserts contact information into fields."""

        name_entry = ab.get_contact(self.name)

        self.first_name.insert(0, str(name_entry[0]))
        self.last_name.insert(0, str(name_entry[1]))
        self.address1.insert(0, str(name_entry[2]))
        self.address2.insert(0, str(name_entry[3]))
        self.city.insert(0, str(name_entry[4]))
        self.state.insert(0, str(name_entry[5]))
        self.zip.insert(0, str(name_entry[6]))
        self.home.insert(0, str(name_entry[7]))
        self.mobile.insert(0, str(name_entry[8]))
        self.email.insert(0, str(name_entry[9]))
        self.birthday.insert(0, str(name_entry[10]))
        self.notes.insert(0, str(name_entry[11]))
Ejemplo n.º 17
0
	def grab_contact(self):
		"""Inserts contact information into fields."""

		name_entry = ab.get_contact(self.name)

		self.first_name.insert(0,str(name_entry[0]))
		self.last_name.insert(0,str(name_entry[1]))
		self.address1.insert(0,str(name_entry[2]))
		self.address2.insert(0,str(name_entry[3]))
		self.city.insert(0,str(name_entry[4]))
		self.state.insert(0,str(name_entry[5]))
		self.zip.insert(0,str(name_entry[6]))
		self.home.insert(0,str(name_entry[7]))
		self.mobile.insert(0,str(name_entry[8]))
		self.email.insert(0,str(name_entry[9]))
		self.birthday.insert(0,str(name_entry[10]))
		self.notes.insert(0,str(name_entry[11]))
Ejemplo n.º 18
0
	def onSelect(self,event):
		"""Displays contact information when user selects a contact from the 
		contact list.
		"""
		w = event.widget

		try:
			name = str(self.book_list.get(self.book_list.curselection()))
			self.clearTextEntries()
			
			name_entry = ab.get_contact(name)
			
			self.first_name.insert(0,str(name_entry[0]))
			self.last_name.insert(0,str(name_entry[1]))
			self.address1.insert(0,str(name_entry[2]))
			self.address2.insert(0,str(name_entry[3]))
			self.city.insert(0,str(name_entry[4]))
			self.state.insert(0,str(name_entry[5]))
			self.zip.insert(0,str(name_entry[6]))
			self.home.insert(0,str(name_entry[7]))
			self.mobile.insert(0,str(name_entry[8]))
			self.email.insert(0,str(name_entry[9]))
			self.birthday.insert(0,str(name_entry[10]))
			self.notes.insert(0,str(name_entry[11]))

			# User cannot edit entry displayed on main GUI, unless clicking edit 
			#	button. 
			self.first_name.configure(state='readonly')
			self.last_name.configure(state='readonly')
			self.address1.configure(state='readonly')
			self.address2.configure(state='readonly')
			self.city.configure(state='readonly')
			self.state.configure(state='readonly')
			self.zip.configure(state='readonly')
			self.home.configure(state='readonly')
			self.mobile.configure(state='readonly')
			self.email.configure(state='readonly')
			self.birthday.configure(state='readonly')
			self.notes.configure(state='readonly')

		except:
			return
Ejemplo n.º 19
0
class GUI(wx.Frame):
    title = "Jello Puddin' Pals"
    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title, wx.Point(30,30))
        self.addressBook = AddressBook()
        self.saveName = ""
        self.create_menu()
        self.create_main_panel()
        self.validation = Validator()


    def create_menu(self):
        ##### Menu Bar
        self.Bind(wx.EVT_CLOSE, self.on_exit, self)
        self.menubar = wx.MenuBar()

        menu_file = wx.Menu()
        m_open = menu_file.Append(-1, "&New", "New Address Book")
        self.Bind(wx.EVT_MENU, self.on_new, m_open)
        m_open = menu_file.Append(-1, "&Open", "Open Address Book")
        self.Bind(wx.EVT_MENU, self.on_open, m_open)
        m_save = menu_file.Append(-1, "&Save", "Save Address Book")
        self.Bind(wx.EVT_MENU, self.on_save, m_save)
        m_save_as = menu_file.Append(-1, "&Save as...", "Save Address Book as...")
        self.Bind(wx.EVT_MENU, self.on_save_as, m_save_as)
        m_import = menu_file.Append(-1, "&Import", "Import Address Book")
        self.Bind(wx.EVT_MENU, self.on_import, m_import)
        m_export = menu_file.Append(-1, "&Export", "Export Address Book")
        self.Bind(wx.EVT_MENU, self.on_export, m_export)
        m_exit = menu_file.Append(-1, "&Exit", "Exit Program")
        self.Bind(wx.EVT_MENU, self.on_exit, m_exit)

        menu_contact = wx.Menu()
        m_add = menu_contact.Append(-1, "&Add New Contact", "Add New Contact to Address Book")
        self.Bind(wx.EVT_MENU, self.on_add, m_add)
        m_edit = menu_contact.Append(-1, "&Edit Selected", "Edit Selected Contact")
        self.Bind(wx.EVT_MENU, self.on_edit, m_edit)
        m_remove = menu_contact.Append(-1, "&Remove Selected", "Remove Selected Contact from Address Book")
        self.Bind(wx.EVT_MENU, self.on_remove, m_remove)
        m_print = menu_contact.Append(-1, "Get Mailing Label", "Get Mailing Label for Selected Contact")
        self.Bind(wx.EVT_MENU, self.on_print, m_print)

        menu_help = wx.Menu()
        m_about = menu_help.Append(-1, "&About", "About this application")
        self.Bind(wx.EVT_MENU, self.on_about, m_about)
        self.menubar.Append(menu_file, "&File")
        self.menubar.Append(menu_contact, "&Contact")
        self.menubar.Append(menu_help, "&Help")
        self.SetMenuBar(self.menubar)
        self.statusbar = self.CreateStatusBar()


    def create_main_panel(self):
        self.panel = wx.Panel(self)

        ##### List of Contacts
        self.list = wx.ListCtrl(self.panel, -1, size=wx.Size(775,500), style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
        self.list.InsertColumn(0, 'Name', width=150)
        self.list.InsertColumn(1, 'Phone', width=125)
        self.list.InsertColumn(2, 'Address', width=150)
        self.list.InsertColumn(3, 'Address, cont.', width=100)
        self.list.InsertColumn(4, 'City', width=125)
        self.list.InsertColumn(5, 'State', width=50)
        self.list.InsertColumn(6, 'Zip', width=75)
        self.display()

        ##### User Controls
        self.addButton = wx.Button(self.panel, -1, "+ Add", size=wx.Size(80,20))
        self.Bind(wx.EVT_BUTTON, self.on_add, self.addButton)
        self.removeButton = wx.Button(self.panel, -1, "- Remove", size=wx.Size(80,20))
        self.Bind(wx.EVT_BUTTON, self.on_remove, self.removeButton)
        self.editButton = wx.Button(self.panel, -1, "Edit", size=wx.Size(80,20))
        self.Bind(wx.EVT_BUTTON, self.on_edit, self.editButton)
        self.printButton = wx.Button(self.panel, -1, "Mail Label", size=wx.Size(80,20))
        self.Bind(wx.EVT_BUTTON, self.on_print, self.printButton)
        self.sortName = wx.Button(self.panel, -1, u"Sort by Name \u25B2", size=wx.Size(120,20))
        self.Bind(wx.EVT_BUTTON, self.on_sort_name, self.sortName)
        self.sortZip = wx.Button(self.panel, -1, u"Sort by Zip", size=wx.Size(120,20))
        self.Bind(wx.EVT_BUTTON, self.on_sort_zip, self.sortZip)

        ##### Layout
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        flags = wx.ALIGN_LEFT | wx.ALL | wx.ALIGN_CENTER_VERTICAL
        self.hbox.Add(self.addButton, 0, border=5, flag=flags)
        self.hbox.Add(self.editButton, 0, border=5, flag=flags)
        self.hbox.Add(self.removeButton, 0, border=5, flag=flags)
        self.hbox.Add(self.printButton, 0, border=5, flag=flags)
        self.hbox.AddStretchSpacer()
        self.hbox.Add(self.sortName, 0, border=5, flag=wx.ALIGN_RIGHT | wx.ALL | wx.ALIGN_CENTER_VERTICAL)
        self.hbox.Add(self.sortZip, 0, border=5, flag=wx.ALIGN_RIGHT | wx.ALL | wx.ALIGN_CENTER_VERTICAL)
        self.vbox.Add(self.hbox, 0, flag = wx.ALIGN_LEFT | wx.TOP | wx.EXPAND)
        self.vbox.Add(self.list, 1, border=5, flag = wx.ALL | wx.GROW)
        self.panel.SetSizer(self.vbox)
        self.vbox.Fit(self)


    ##### Functionality
    def display(self):
        self.list.DeleteAllItems()
        for contact in self.addressBook.contacts:
            self.show_contact(contact)
        if self.saveName != "":
            file = self.saveName.split('/')
            self.SetTitle("Jello Puddin' Pals - {}".format(file[len(file)-1]))


    def show_contact(self, contact):
        index = self.list.InsertStringItem(sys.maxint, contact.getAttr('name'))
        self.list.SetStringItem(index, 1, contact.getAttr('phone'))
        self.list.SetStringItem(index, 2, contact.getAttr('address'))
        self.list.SetStringItem(index, 3, contact.getAttr('address2'))
        self.list.SetStringItem(index, 4, contact.getAttr('city'))
        self.list.SetStringItem(index, 5, contact.getAttr('state'))
        self.list.SetStringItem(index, 6, contact.getAttr('zipcode'))


    def on_add(self, event):
        cb = ContactBox(self, "add")
        cb.Show()


    def on_edit(self, event):
        if len(self.addressBook.contacts)>0:
            i = self.list.GetFirstSelected()
            name = self.addressBook.contacts[i].getAttr('name')
            phone = self.addressBook.contacts[i].getAttr('phone')
            address = self.addressBook.contacts[i].getAttr('address')
            address2 = self.addressBook.contacts[i].getAttr('address2')
            city = self.addressBook.contacts[i].getAttr('city')
            state = self.addressBook.contacts[i].getAttr('state')
            zipcode = self.addressBook.contacts[i].getAttr('zipcode')
            cb = ContactBox(self, "edit", name, phone, address, address2, city, state, zipcode, index=i)
            cb.Show()
        else:
            self.flash_status_message("Address book is empty")


    def on_remove(self, event):
        if len(self.addressBook.contacts)>0:
            i = self.list.GetFirstSelected()
            name = self.addressBook.contacts[i].getAttr('name')
            dlg = wx.MessageDialog(self, "Are you sure you want to remove {}?".format(name), "Confirm Delete", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
            result = dlg.ShowModal()
            dlg.Destroy()
            if result == wx.ID_OK:
                del self.addressBook.contacts[i]
                self.addressBook.sort(self.addressBook.sortMethod[0],self.addressBook.sortMethod[1])
                self.display()
                self.addressBook.changed = True
                self.flash_status_message("Removed {}".format(name))
        else:
            self.flash_status_message("Address book is empty")


    def on_sort_name(self, event):
        if self.addressBook.sortMethod == ('name', False):
            self.addressBook.sortMethod = ('name',True)
            self.addressBook.sort('name',True)
            self.sortName.SetLabel(u"Sort by Name \u25BC")
            self.sortZip.SetLabel(u"Sort by Zip")
            self.flash_status_message("Sorted address book by last name, Z-A")
        else:
            self.addressBook.sortMethod = ('name',False)
            self.addressBook.sort('name',False)
            self.sortName.SetLabel(u"Sort by Name \u25B2")
            self.sortZip.SetLabel(u"Sort by Zip")
            self.flash_status_message("Sorted address book by last name, A-Z")
        self.display()


    def on_sort_zip(self, event):
        if self.addressBook.sortMethod == ('zipcode', False):
            self.addressBook.sortMethod = ('zipcode',True)
            self.addressBook.sort('zipcode',True)
            self.sortZip.SetLabel(u"Sort by Zip \u25BC")
            self.sortName.SetLabel(u"Sort by Name")
            self.flash_status_message("Sorted address book by zip code, 9-0")
        else:
            self.addressBook.sortMethod = ('zipcode',False)
            self.addressBook.sort('zipcode',False)
            self.sortZip.SetLabel(u"Sort by Zip \u25B2")
            self.sortName.SetLabel(u"Sort by Name")
            self.flash_status_message("Sorted address book by zip code, 0-9")
        self.display()


    ##### Menu functions
    def on_new(self, event):
        if self.addressBook.changed:
            if wx.MessageBox("This address book contains unsaved changes! Continue anyway?", "Are you sure?", wx.ICON_QUESTION | wx.YES_NO, self) == wx.NO:
                return
        newGui = GUI()
        newGui.display()
        newGui.Show()
        self.Destroy()


    def on_open(self, event):
        if self.addressBook.changed:
            if wx.MessageBox("This address book contains unsaved changes! Continue anyway?", "Are you sure?", wx.ICON_QUESTION | wx.YES_NO, self) == wx.NO:
                return
        openFileDialog = wx.FileDialog(self, "Open .tsv file", "", "", ".tsv files (*.tsv)|*.tsv", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
        if openFileDialog.ShowModal() == wx.ID_CANCEL:
            return
        inFilePath = openFileDialog.GetPath()
        if self.validation.isValidUSPS(inFilePath):
            newGui = GUI()
            newGui.addressBook.loadTSV(inFilePath)
            newGui.saveName = inFilePath
            newGui.addressBook.sort('name',False)
            newGui.display()
            newGui.Show()
            newGui.flash_status_message("Opened address book {}".format(newGui.saveName))
            self.Destroy()
        else:
            dlg = wx.MessageDialog(self, "Unable to open {}".format(inFilePath.split('/')[len(inFilePath.split('/'))-1]), "Invalid File", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()


    def on_save_as(self, mode):
        defaultName = ""
        if mode != 1:
            default = self.saveName.split('/')
            if len(default) > 0:
                defaultName = default[len(default)-1]
        saveFileDialog = wx.FileDialog(self, "Save .tsv file", "", defaultName, ".tsv files (*.tsv)|*.tsv", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
        if saveFileDialog.ShowModal() == wx.ID_CANCEL:
            return
        self.saveName = saveFileDialog.GetPath()
        self.addressBook.writeTSV(self.saveName)
        if (mode != 2):
            self.display()
            self.addressBook.changed = False
        self.flash_status_message("Saved address book as {}".format(self.saveName))


    def on_import(self, event):
        openFileDialog = wx.FileDialog(self, "Import .tsv file", "", "", ".tsv files (*.tsv)|*.tsv", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
        if openFileDialog.ShowModal() == wx.ID_CANCEL:
            return
        inFilePath = openFileDialog.GetPath()
        if self.validation.isValidUSPS(inFilePath):
            temp = AddressBook()
            temp.loadTSV(inFilePath)
            for contact in temp.contacts:
                self.addressBook.contacts.append(contact)
            self.addressBook.sort(self.addressBook.sortMethod[0],self.addressBook.sortMethod[1])
            self.display()
            self.flash_status_message("Imported address book {}".format(inFilePath))
            self.addressBook.changed = True
        else:
            dlg = wx.MessageDialog(self, "Unable to import {}".format(inFilePath.split('/')[len(inFilePath.split('/'))-1]), "Invalid File", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()


    def on_export(self, event):
        self.on_save_as(mode=2)


    def on_save(self, event):
        if self.saveName == "":
            self.on_save_as(mode=0)
        else:
            self.addressBook.writeTSV(self.saveName)
            self.addressBook.changed = False
            self.flash_status_message("Saved address book {}".format(self.saveName))


    def on_print(self, event):
        if len(self.addressBook.contacts)>0:
            i = self.list.GetFirstSelected()
            mail = self.addressBook.contacts[i].getLabel()
            dlg = MessageBox(self, mail)
            dlg.ShowModal()
            dlg.Destroy()
        else:
            self.flash_status_message("Address book is empty")


    def on_exit(self, event):
        if self.addressBook.changed:
            if wx.MessageBox("This address book contains unsaved changes! Exit anyway?", "Are you sure?", wx.ICON_QUESTION | wx.YES_NO, self) == wx.NO:
                return
        self.Destroy()


    def on_about(self, event):
        msg = "Bill Cosby's Eligible Bachelors of Science"
        dlg = wx.MessageDialog(self, msg, "About", wx.OK)
        dlg.ShowModal()
        dlg.Destroy()


    def flash_status_message(self, msg, flash_len_ms=3000):
        self.statusbar.SetStatusText(msg)
        self.timeroff = wx.Timer(self)
        self.Bind(
            wx.EVT_TIMER,
            self.on_flash_status_off,
            self.timeroff)
        self.timeroff.Start(flash_len_ms, oneShot=True)
    def on_flash_status_off(self, event):
        self.statusbar.SetStatusText('')
Ejemplo n.º 20
0
    contact_id = input('Enter contact ID which you want delete (type "all" to clear address book):\n')
    
    if contact_id == 'all':
        if confirmDelete('ALL'):
            abook.deleteAll()
    else:
        contact = abook.getContactByID(contact_id)
        if contact and confirmDelete(contact.name):
            abook.deleteContactByID(contact_id)

def confirmDelete(name):
    confirmation = input('You want to delete {0} contact(s). Are you sure? (y/N)'.format(name))
    return confirmation == 'y' or confirmation == 'Y'


abook = AddressBook(addressBookFile)
is_running = True

while is_running:
    option = input('''Select option:
    a - add new contact
    d - delete contact
    p - print all contacts
    q - quit
''')
    
    if option == 'p':
        abook.print()
    elif option == 'a':
        addContact()
    elif option == 'd':
Ejemplo n.º 21
0
 def delete_contact(self, name):
     """Deletes selected contact"""
     ab.remove_contact(name)
     self.search_query(self.sort.get())
Ejemplo n.º 22
0
    def search_query(self, sort):
        """ """
        self.book_list.delete(0, Tk.END)

        for contact in ab.search(self.search_bar.get(), sort):
            self.book_list.insert(Tk.END, contact[0] + " " + contact[1])
Ejemplo n.º 23
0
		self.target = target
	
	def run(self):
		#let gui start
		import time
		time.sleep(0.2)
		
		#force focus to widget
		self.target.focus_force();
		
		
		#generate mouse 1
		self.target.event_generate("<ButtonPress>")
		self.target.event_generate("<ButtonRelease")

		self.target.update()




if __name__ == "__main__":
	ab.new_book()
	root = Tk.Tk()
	gui.mainWindow(root)
	
	egen = EventGen(root)
	
	egen.start()
	root.mainloop()

Ejemplo n.º 24
0
    def search_query(self, sort):
        """ """
        self.book_list.delete(0, Tk.END)

        for contact in ab.search(self.search_bar.get(), sort):
            self.book_list.insert(Tk.END, contact[0] + " " + contact[1])
Ejemplo n.º 25
0
import json
from AddressBook import *
if __name__ == '__main__':
    book = AddressBook()
    book.show()
Ejemplo n.º 26
0
 def yes(self):
     field_list = self.field_list
     ab.edit_contact(self.entry_id, field_list)
     db.db_commit()
     self.top.destroy()
Ejemplo n.º 27
0
#!/usr/bin/env python

import sys
import subprocess

import AddressBook as AB

# get a reference to the address book
book = AB.ABAddressBook.sharedAddressBook()

# create search parameters - prefix match on first or last name or email
firstname_search = AB.ABPersonCreateSearchElement(
    AB.kABLastNameProperty, None, None, sys.argv[1],
    AB.kABPrefixMatchCaseInsensitive)
lastname_search = AB.ABPersonCreateSearchElement(
    AB.kABFirstNameProperty, None, None, sys.argv[1],
    AB.kABPrefixMatchCaseInsensitive)
email_search = AB.ABPersonCreateSearchElement(
    AB.kABEmailProperty, None, None, sys.argv[1],
    AB.kABContainsSubStringCaseInsensitive)
name_search = AB.ABSearchElement.searchElementForConjunction_children_(
    AB.kABSearchOr, [firstname_search, lastname_search, email_search])

# perform the search
matches = book.recordsMatchingSearchElement_(name_search)

# collect results
results = []
for person in matches:
    emails = person.valueForKey_('Email') or []
    company = person.valueForKey_('Organization')
Ejemplo n.º 28
0
 def delete_contact(self, name):
     """Deletes selected contact"""
     ab.remove_contact(name)
     self.search_query(self.sort.get())
Ejemplo n.º 29
0
# Authors:
#
# Name:                     Student ID:
# Amanda Burgos De Jesus    #97280
# Hiram Zengotita Hernandez #103450
# Ivan Santiago De Jesus    #85519
#

from AddressBook import *
from AddressBookWindow import *
from tkinter import *

root = Tk()
ab = AddressBook()
abw = AddressBookWindow(root, ab)

root.mainloop()
Ejemplo n.º 30
0
    def testFunctions(self):
        self.assertResultIsCFRetained(AddressBook.ABPickerCreate)

        ref = AddressBook.ABPickerCreate()

        try:
            self.assertIsInstance(
                ref,
                (AddressBook.ABPickerRef,
                 objc.lookUpClass("ABPeoplePickerCAdapter")),
            )

        except objc.error:
            self.assertIsInstance(ref, AddressBook.ABPickerRef)

        AddressBook.ABPickerSetFrame(ref, ((90, 100), (200, 400)))
        r = AddressBook.ABPickerGetFrame(ref, None)
        self.assertIsInstance(r, AddressBook.NSRect)
        self.assertEqual(r, ((90, 100), (200, 400)))

        self.assertResultHasType(AddressBook.ABPickerIsVisible, objc._C_BOOL)
        r = AddressBook.ABPickerIsVisible(ref)
        self.assertIsInstance(r, bool)
        self.assertTrue(r is False)

        self.assertArgHasType(AddressBook.ABPickerSetVisibility, 1,
                              objc._C_BOOL)
        AddressBook.ABPickerSetVisibility(ref, True)

        r = AddressBook.ABPickerIsVisible(ref)
        self.assertTrue(r is True)

        AddressBook.ABPickerSetVisibility(ref, False)

        r = AddressBook.ABPickerIsVisible(ref)
        self.assertTrue(r is False)

        r = AddressBook.ABPickerGetAttributes(ref)
        self.assertIsInstance(r, int)

        r = AddressBook.ABPickerChangeAttributes(
            ref, AddressBook.kABPickerAllowMultipleSelection, 0)
        self.assertTrue(r is None)

        AddressBook.ABPickerAddProperty(ref, AddressBook.kABFirstNameProperty)
        AddressBook.ABPickerAddProperty(ref, AddressBook.kABLastNameProperty)
        AddressBook.ABPickerRemoveProperty(ref,
                                           AddressBook.kABFirstNameProperty)

        v = AddressBook.ABPickerCopyProperties(ref)
        self.assertIsInstance(v, AddressBook.NSArray)

        # Disable detailed testing, the RemoveProperties function
        # doesn't actually remove. See radar #7999195.
        # self.assertEqual(tuple(v), (AddressBook.kABLastNameProperty,))

        AddressBook.ABPickerSetColumnTitle(ref, "Achternaam",
                                           AddressBook.kABLastNameProperty)
        v = AddressBook.ABPickerCopyColumnTitle(
            ref, AddressBook.kABLastNameProperty)
        self.assertResultIsCFRetained(AddressBook.ABPickerCopyColumnTitle)
        self.assertEqual(v, "Achternaam")

        AddressBook.ABPickerSetDisplayedProperty(
            ref, AddressBook.kABLastNameProperty)
        v = AddressBook.ABPickerCopyDisplayedProperty(ref)
        self.assertResultIsCFRetained(
            AddressBook.ABPickerCopyDisplayedProperty)
        self.assertIsInstance(v, str)

        v = AddressBook.ABPickerCopySelectedGroups(ref)
        self.assertIsInstance(v, AddressBook.NSArray)

        v = AddressBook.ABPickerCopySelectedRecords(ref)
        self.assertIsInstance(v, AddressBook.NSArray)

        v = AddressBook.ABPickerCopySelectedIdentifiers(
            ref, AddressBook.ABGetMe(AddressBook.ABGetSharedAddressBook()))
        if v is not None:
            self.assertIsInstance(v, AddressBook.NSArray)

        v = AddressBook.ABPickerCopySelectedValues(ref)
        self.assertIsInstance(v, AddressBook.NSArray)

        grp = AddressBook.ABCopyArrayOfAllGroups(
            AddressBook.ABGetSharedAddressBook())[0]
        usr = AddressBook.ABGetMe(AddressBook.ABGetSharedAddressBook())

        AddressBook.ABPickerSelectGroup(ref, grp, True)
        self.assertArgHasType(AddressBook.ABPickerSelectGroup, 2, objc._C_BOOL)

        AddressBook.ABPickerSelectRecord(ref, usr, False)
        self.assertArgHasType(AddressBook.ABPickerSelectRecord, 2,
                              objc._C_BOOL)

        AddressBook.ABPickerSelectIdentifier(
            ref, usr, "Last",
            False)  # AddressBook.ABRecordCopyUniqueId(usr), False)
        self.assertArgHasType(AddressBook.ABPickerSelectIdentifier, 3,
                              objc._C_BOOL)

        AddressBook.ABPickerDeselectIdentifier(ref, usr, "Last")

        AddressBook.ABPickerDeselectGroup(ref, grp)
        AddressBook.ABPickerDeselectRecord(ref, usr)

        AddressBook.ABPickerDeselectAll(ref)

        AddressBook.ABPickerClearSearchField(ref)

        if 0:
            # These are annoying, don't actually call
            AddressBook.ABPickerEditInAddressBook(ref)
            AddressBook.ABPickerSelectInAddressBook(ref)
        else:
            AddressBook.self.assertResultHasType(
                AddressBook.ABPickerEditInAddressBook, objc._C_VOID)
            AddressBook.self.assertResultHasType(
                AddressBook.ABPickerSelectInAddressBook, objc._C_VOID)

        r = AddressBook.ABPickerGetDelegate(ref)

        AddressBook.ABPickerSetDelegate
Ejemplo n.º 31
0
 def testFunctions(self):
     v = AddressBook.ABLocalizedPropertyOrLabel(AddressBook.kABAssistantLabel)
     self.assertIsInstance(v, str)
Ejemplo n.º 32
0
	def yes(self):
		field_list = self.field_list
		ab.edit_contact(self.entry_id, field_list)
		db.db_commit()
		self.top.destroy()
Ejemplo n.º 33
0
			self.target.sort_option_menu.event_generate("<Button-1>",x=10, y=10)

			self.target.sort_option_menu.update()

			self.target.sort_option_menu.event_generate("<ButtonRelease-1>", x=10, y=10)

			self.target.sort_option_menu.update()
			print("sort succeeded")
		except:
			print("sort failed")

		self.target.quit()








if __name__ == "__main__":
	ab.new_book()
	root = Tk.Tk()
	gui = gui.mainWindow(root)
	
	egen = EventGen(gui)
	
	egen.start()
	root.mainloop()

Ejemplo n.º 34
0
    def testFunctions(self):
        ref = AddressBook.ABGetSharedAddressBook()
        self.assertIsInstance(ref, AddressBook.ABAddressBookRef)

        r = AddressBook.ABSave(ref)
        self.assertResultHasType(AddressBook.ABSave, objc._C_BOOL)
        self.assertIsInstance(r, bool)

        r = AddressBook.ABHasUnsavedChanges(ref)
        self.assertResultHasType(AddressBook.ABHasUnsavedChanges, objc._C_BOOL)
        self.assertIsInstance(r, bool)

        r = me = AddressBook.ABGetMe(ref)
        self.assertIsInstance(r, AddressBook.ABPersonRef)

        # There's only one addressbook per user account, therefore
        # testing functions that modify the adressbook isn't safe
        # because we'd update the AddressBook of the user running
        # the test which is a bad thing.
        # Therefore we only test if the function signature is
        # correct. That's not ideal, but because mutation functions
        # have a simple interface it should be sufficient.
        self.assertResultHasType(AddressBook.ABSetMe, objc._C_VOID)
        self.assertArgHasType(AddressBook.ABSetMe, 0, _C_ABAddressBookRef)
        self.assertArgHasType(AddressBook.ABSetMe, 1, _C_ABPersonRef)

        name = AddressBook.ABCopyRecordTypeFromUniqueId(
            ref, AddressBook.ABRecordCopyUniqueId(me))
        self.assertEqual(name, "ABPerson")

        self.assertResultHasType(AddressBook.ABAddPropertiesAndTypes,
                                 objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABAddPropertiesAndTypes, 0,
                              _C_ABAddressBookRef)
        self.assertArgHasType(AddressBook.ABAddPropertiesAndTypes, 1,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABAddPropertiesAndTypes, 2,
                              _C_CFDictionaryRef)

        self.assertResultHasType(AddressBook.ABRemoveProperties,
                                 objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABRemoveProperties, 0,
                              _C_ABAddressBookRef)
        self.assertArgHasType(AddressBook.ABRemoveProperties, 1,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABRemoveProperties, 2, _C_CFArrayRef)

        v = AddressBook.ABCopyArrayOfPropertiesForRecordType(ref, "ABPerson")
        self.assertResultIsCFRetained(
            AddressBook.ABCopyArrayOfPropertiesForRecordType)
        self.assertIsInstance(v, AddressBook.NSArray)
        self.assertTrue(len(v))
        self.assertIsInstance(v[0], str)

        v = AddressBook.ABTypeOfProperty(ref, "ABPersion", v[0])
        self.assertIsInstance(v, int)

        v = AddressBook.ABCopyRecordForUniqueId(
            ref, AddressBook.ABRecordCopyUniqueId(me))
        self.assertResultIsCFRetained(AddressBook.ABCopyRecordForUniqueId)
        self.assertIsInstance(v, AddressBook.ABPersonRef)

        self.assertResultHasType(AddressBook.ABAddRecord, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABAddRecord, 0, _C_ABAddressBookRef)
        self.assertArgHasType(AddressBook.ABAddRecord, 1, objc._C_ID)

        self.assertResultHasType(AddressBook.ABRemoveRecord, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABRemoveRecord, 0,
                              _C_ABAddressBookRef)
        self.assertArgHasType(AddressBook.ABRemoveRecord, 1, objc._C_ID)

        v = AddressBook.ABCopyArrayOfAllPeople(ref)
        self.assertResultIsCFRetained(AddressBook.ABCopyArrayOfAllPeople)
        self.assertIsInstance(v, AddressBook.NSArray)

        v = AddressBook.ABCopyArrayOfAllGroups(ref)
        self.assertResultIsCFRetained(AddressBook.ABCopyArrayOfAllGroups)
        self.assertIsInstance(v, AddressBook.NSArray)

        self.assertResultHasType(AddressBook.ABRecordCreateCopy, objc._C_ID)
        self.assertResultIsCFRetained(AddressBook.ABRecordCreateCopy)
        self.assertArgHasType(AddressBook.ABRecordCreateCopy, 0, objc._C_ID)

        v = AddressBook.ABRecordCopyRecordType(me)
        self.assertResultIsCFRetained(AddressBook.ABRecordCopyRecordType)
        self.assertIsInstance(v, str)

        self.assertResultHasType(AddressBook.ABRecordCopyValue, objc._C_ID)
        self.assertArgHasType(AddressBook.ABRecordCopyValue, 0, objc._C_ID)
        self.assertArgHasType(AddressBook.ABRecordCopyValue, 1, _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABRecordSetValue, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABRecordSetValue, 0, objc._C_ID)
        self.assertArgHasType(AddressBook.ABRecordSetValue, 1, _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABRecordSetValue, 2, objc._C_ID)

        self.assertResultHasType(AddressBook.ABRecordRemoveValue, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABRecordRemoveValue, 0, objc._C_ID)
        self.assertArgHasType(AddressBook.ABRecordRemoveValue, 1,
                              _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABRecordIsReadOnly, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABRecordIsReadOnly, 0, objc._C_ID)

        self.assertResultHasType(AddressBook.ABRecordCopyUniqueId,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABRecordCopyUniqueId, 0, objc._C_ID)

        self.assertResultHasType(AddressBook.ABPersonCreate, _C_ABPersonRef)

        self.assertResultHasType(
            AddressBook.ABPersonCreateWithVCardRepresentation, _C_ABPersonRef)
        self.assertArgHasType(
            AddressBook.ABPersonCreateWithVCardRepresentation, 0, _C_CFDataRef)

        self.assertResultHasType(AddressBook.ABPersonCopyParentGroups,
                                 _C_CFArrayRef)
        self.assertArgHasType(AddressBook.ABPersonCopyParentGroups, 0,
                              _C_ABPersonRef)

        self.assertResultHasType(AddressBook.ABPersonCreateSearchElement,
                                 _C_ABSearchElementRef)
        self.assertArgHasType(AddressBook.ABPersonCreateSearchElement, 0,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABPersonCreateSearchElement, 1,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABPersonCreateSearchElement, 2,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABPersonCreateSearchElement, 3,
                              objc._C_ID)
        self.assertArgHasType(AddressBook.ABPersonCreateSearchElement, 4,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABGroupCreate, _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupCopyArrayOfAllMembers,
                                 _C_CFArrayRef)
        self.assertArgHasType(AddressBook.ABGroupCopyArrayOfAllMembers, 0,
                              _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupAddMember, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABGroupAddMember, 0, _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupAddMember, 1, _C_ABPersonRef)

        self.assertResultHasType(AddressBook.ABGroupRemoveMember, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABGroupRemoveMember, 0,
                              _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupRemoveMember, 1,
                              _C_ABPersonRef)

        self.assertResultHasType(AddressBook.ABGroupCopyArrayOfAllSubgroups,
                                 _C_CFArrayRef)
        self.assertArgHasType(AddressBook.ABGroupCopyArrayOfAllSubgroups, 0,
                              _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupAddGroup, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABGroupAddGroup, 0, _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupAddGroup, 1, _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupRemoveGroup, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABGroupRemoveGroup, 0, _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupRemoveGroup, 1, _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupCopyParentGroups,
                                 _C_CFArrayRef)
        self.assertArgHasType(AddressBook.ABGroupCopyParentGroups, 0,
                              _C_ABGroupRef)

        self.assertResultHasType(AddressBook.ABGroupSetDistributionIdentifier,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABGroupSetDistributionIdentifier, 0,
                              _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupSetDistributionIdentifier, 1,
                              _C_ABPersonRef)
        self.assertArgHasType(AddressBook.ABGroupSetDistributionIdentifier, 2,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABGroupSetDistributionIdentifier, 3,
                              _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABGroupCopyDistributionIdentifier,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABGroupCopyDistributionIdentifier, 0,
                              _C_ABGroupRef)
        self.assertArgHasType(AddressBook.ABGroupCopyDistributionIdentifier, 1,
                              _C_ABPersonRef)
        self.assertArgHasType(AddressBook.ABGroupCopyDistributionIdentifier, 2,
                              _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABGroupCreateSearchElement,
                                 _C_ABSearchElementRef)
        self.assertArgHasType(AddressBook.ABGroupCreateSearchElement, 0,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABGroupCreateSearchElement, 1,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABGroupCreateSearchElement, 2,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABGroupCreateSearchElement, 3,
                              objc._C_ID)
        self.assertArgHasType(AddressBook.ABGroupCreateSearchElement, 4,
                              objc._C_CFIndex)

        self.assertResultHasType(
            AddressBook.ABSearchElementCreateWithConjunction,
            _C_ABSearchElementRef)
        self.assertArgHasType(AddressBook.ABSearchElementCreateWithConjunction,
                              0, objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABSearchElementCreateWithConjunction,
                              1, _C_CFArrayRef)

        self.assertResultHasType(AddressBook.ABSearchElementMatchesRecord,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABSearchElementMatchesRecord, 0,
                              _C_ABSearchElementRef)
        self.assertArgHasType(AddressBook.ABSearchElementMatchesRecord, 1,
                              objc._C_ID)

        self.assertResultHasType(AddressBook.ABMultiValueCreate,
                                 _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueCount,
                                 objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABMultiValueCount, 0,
                              _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueCopyValueAtIndex,
                                 objc._C_ID)
        self.assertArgHasType(AddressBook.ABMultiValueCopyValueAtIndex, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyValueAtIndex, 1,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValueCopyLabelAtIndex,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyLabelAtIndex, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyLabelAtIndex, 1,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValueCopyPrimaryIdentifier,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyPrimaryIdentifier, 0,
                              _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueIndexForIdentifier,
                                 objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABMultiValueIndexForIdentifier, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueIndexForIdentifier, 1,
                              _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABMultiValueCopyIdentifierAtIndex,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyIdentifierAtIndex, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueCopyIdentifierAtIndex, 1,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValuePropertyType,
                                 objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABMultiValuePropertyType, 0,
                              _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueCreateCopy,
                                 _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueCreateCopy, 0,
                              _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueCreateMutable,
                                 _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABMultiValueAdd, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueAdd, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueAdd, 1, objc._C_ID)
        self.assertArgHasType(AddressBook.ABMultiValueAdd, 2, _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueAdd, 3,
                              objc._C_OUT + _C_CFStringRefPtr)

        self.assertResultHasType(AddressBook.ABMultiValueInsert, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueInsert, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueInsert, 1, objc._C_ID)
        self.assertArgHasType(AddressBook.ABMultiValueInsert, 2,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueInsert, 3,
                              objc._C_CFIndex)
        self.assertArgHasType(AddressBook.ABMultiValueInsert, 4,
                              objc._C_OUT + _C_CFStringRefPtr)

        self.assertResultHasType(AddressBook.ABMultiValueRemove, objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueRemove, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueRemove, 1,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValueReplaceValue,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceValue, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceValue, 1,
                              objc._C_ID)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceValue, 2,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValueReplaceLabel,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceLabel, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceLabel, 1,
                              _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABMultiValueReplaceLabel, 2,
                              objc._C_CFIndex)

        self.assertResultHasType(AddressBook.ABMultiValueSetPrimaryIdentifier,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABMultiValueSetPrimaryIdentifier, 0,
                              _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueSetPrimaryIdentifier, 1,
                              _C_CFStringRef)

        self.assertResultHasType(AddressBook.ABMultiValueCreateMutableCopy,
                                 _C_ABMultiValueRef)
        self.assertArgHasType(AddressBook.ABMultiValueCreateMutableCopy, 0,
                              _C_ABMultiValueRef)

        self.assertResultHasType(AddressBook.ABCopyLocalizedPropertyOrLabel,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABCopyLocalizedPropertyOrLabel, 0,
                              _C_CFStringRef)

        self.assertResultHasType(
            AddressBook.ABCreateFormattedAddressFromDictionary, _C_CFStringRef)
        self.assertArgHasType(
            AddressBook.ABCreateFormattedAddressFromDictionary, 0,
            _C_ABAddressBookRef)
        self.assertArgHasType(
            AddressBook.ABCreateFormattedAddressFromDictionary, 1,
            _C_CFDictionaryRef)

        self.assertResultHasType(AddressBook.ABCopyDefaultCountryCode,
                                 _C_CFStringRef)
        self.assertArgHasType(AddressBook.ABCopyDefaultCountryCode, 0,
                              _C_ABAddressBookRef)

        self.assertResultHasType(AddressBook.ABPersonSetImageData,
                                 objc._C_BOOL)
        self.assertArgHasType(AddressBook.ABPersonSetImageData, 0,
                              _C_ABPersonRef)
        self.assertArgHasType(AddressBook.ABPersonSetImageData, 1,
                              _C_CFDataRef)

        self.assertResultHasType(AddressBook.ABPersonCopyImageData,
                                 _C_CFDataRef)
        self.assertArgHasType(AddressBook.ABPersonCopyImageData, 0,
                              _C_ABPersonRef)

        r = []

        @objc.callbackFor(AddressBook.ABBeginLoadingImageDataForClient)
        def callback(imageData, tag, refcon):
            r.append((imageData, tag, refcon))

        idx = AddressBook.ABBeginLoadingImageDataForClient(me, callback, 99)
        self.assertIsInstance(idx, int)

        # AddressBook.CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, True)
        AddressBook.ABCancelLoadingImageDataForTag(idx)