progress with an add screen and a list screen;git push
This commit is contained in:
		
							parent
							
								
									5e81a528a9
								
							
						
					
					
						commit
						3d359f2ae3
					
				@ -31,7 +31,7 @@ Exit
 | 
			
		||||
    ::METHOD Init
 | 
			
		||||
      expose ui db
 | 
			
		||||
      db = .AddressBookDB~new()
 | 
			
		||||
      ui = .AddressBookUI~new()
 | 
			
		||||
      ui = .AddressBookUI~new(db)
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    ::method run
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										202
									
								
								app/appui.cls
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								app/appui.cls
									
									
									
									
									
								
							@ -6,11 +6,12 @@
 | 
			
		||||
::class AddressBookUI public
 | 
			
		||||
 | 
			
		||||
    ::method init
 | 
			
		||||
      expose win mainMenu
 | 
			
		||||
      expose win mainMenu db
 | 
			
		||||
      use arg db
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    ::method initialize
 | 
			
		||||
      expose win mainMenu
 | 
			
		||||
      expose win mainMenu db
 | 
			
		||||
 | 
			
		||||
      win = self~DrawMainPanel(0, .true) /* default colour, draw border box */
 | 
			
		||||
      self~setupMainMenu(win)
 | 
			
		||||
@ -124,6 +125,200 @@
 | 
			
		||||
      menuwin~refresh
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    ::method addContactPanel
 | 
			
		||||
        expose win db menuwin menu_items
 | 
			
		||||
 | 
			
		||||
        /* Create a form panel */
 | 
			
		||||
        max_y = win~lines
 | 
			
		||||
        max_x = win~cols
 | 
			
		||||
        form_height = 14
 | 
			
		||||
        form_width = 50
 | 
			
		||||
        start_y = (max_y - form_height) % 2
 | 
			
		||||
        start_x = (max_x - form_width) % 2
 | 
			
		||||
        formwin = self~DrawSubPanel(form_height, form_width, start_y, start_x, 0, "Add New Contact", .true)
 | 
			
		||||
 | 
			
		||||
        /* Create form fields */
 | 
			
		||||
        formwin~mvaddstr(3, 2, "First Name: ")
 | 
			
		||||
        formwin~mvaddstr(4, 2, "Last Name: ")
 | 
			
		||||
        formwin~mvaddstr(5, 2, "Phone: ")
 | 
			
		||||
        formwin~mvaddstr(6, 2, "Email: ")
 | 
			
		||||
        formwin~mvaddstr(form_height-2, 2, "[Enter] to save, [Esc] to cancel")
 | 
			
		||||
        formwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Input fields */
 | 
			
		||||
        firstName = self~getInputField(formwin, 3, 14, 30)
 | 
			
		||||
        if firstName = .nil then return  /* User canceled */
 | 
			
		||||
 | 
			
		||||
        lastName = self~getInputField(formwin, 4, 14, 30)
 | 
			
		||||
        if lastName = .nil then return
 | 
			
		||||
 | 
			
		||||
        phone = self~getInputField(formwin, 5, 14, 15)
 | 
			
		||||
        if phone = .nil then return
 | 
			
		||||
 | 
			
		||||
        email = self~getInputField(formwin, 6, 14, 30)
 | 
			
		||||
        if email = .nil then return
 | 
			
		||||
 | 
			
		||||
        /* Add to database */
 | 
			
		||||
        contactDict = .Directory~new()
 | 
			
		||||
        contactDict["FIRST_NAME"] = firstName
 | 
			
		||||
        contactDict["LAST_NAME"] = lastName
 | 
			
		||||
        contactDict["PHONE"] = phone
 | 
			
		||||
        contactDict["EMAIL"] = email
 | 
			
		||||
        result = db~addContact(contactDict)
 | 
			
		||||
 | 
			
		||||
        /* Display result message */
 | 
			
		||||
        if result > 0 then do
 | 
			
		||||
            formwin~mvaddstr(8, 2, "Contact ID ["result"] added successfully!")
 | 
			
		||||
        end
 | 
			
		||||
        else do
 | 
			
		||||
            formwin~mvaddstr(8, 2, "Failed to add contact.")
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        formwin~refresh()
 | 
			
		||||
        call SysWait 1.5
 | 
			
		||||
        formwin~erase()
 | 
			
		||||
        formwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Redraw the main menu */
 | 
			
		||||
 | 
			
		||||
        self~setupMainMenu(win)
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
    ::method listAllContactsPanel
 | 
			
		||||
        expose win db menuwin
 | 
			
		||||
 | 
			
		||||
        /* Create a list panel */
 | 
			
		||||
        max_y = win~lines
 | 
			
		||||
        max_x = win~cols
 | 
			
		||||
        list_height = 20
 | 
			
		||||
        list_width = 70
 | 
			
		||||
        start_y = (max_y - list_height) % 2
 | 
			
		||||
        start_x = (max_x - list_width) % 2
 | 
			
		||||
        listwin = self~DrawSubPanel(list_height, list_width, start_y, start_x, 0, "All Contacts", .true)
 | 
			
		||||
 | 
			
		||||
        /* Display column headers */
 | 
			
		||||
        listwin~attron(listwin~A_BOLD)
 | 
			
		||||
        listwin~mvaddstr(3, 2, "ID")
 | 
			
		||||
        listwin~mvaddstr(3, 6, "First Name")
 | 
			
		||||
        listwin~mvaddstr(3, 22, "Last Name")
 | 
			
		||||
        listwin~mvaddstr(4, 2, "--  ----------      ---------")
 | 
			
		||||
        /* listwin~mvaddstr(2, 38, "Phone")
 | 
			
		||||
        listwin~mvaddstr(2, 54, "Email") */
 | 
			
		||||
        listwin~attroff(listwin~A_BOLD)
 | 
			
		||||
 | 
			
		||||
        /* Get all contacts */
 | 
			
		||||
        contacts = db~getAllContacts()
 | 
			
		||||
 | 
			
		||||
        /* Display contacts */
 | 
			
		||||
        if contacts~items > 0 then do
 | 
			
		||||
            do i = 1 to contacts~items
 | 
			
		||||
                contact = contacts[i]
 | 
			
		||||
                listwin~mvaddstr(i+4, 2, contact['ID'])
 | 
			
		||||
                listwin~mvaddstr(i+4, 6, contact['FIRST_NAME'])
 | 
			
		||||
                listwin~mvaddstr(i+4, 22, contact['LAST_NAME'])
 | 
			
		||||
                /* listwin~mvaddstr(i+3, 38, contact['phone'])
 | 
			
		||||
                listwin~mvaddstr(i+3, 54, contact['email']) */
 | 
			
		||||
 | 
			
		||||
                /* Break if we run out of screen space */
 | 
			
		||||
                if i > list_height-6 then leave
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
        else do
 | 
			
		||||
            listwin~mvaddstr(5, 5, "No contacts found.")
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        listwin~mvaddstr(list_height-2, 2, "Press any key to return to main menu")
 | 
			
		||||
        listwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Wait for any key */
 | 
			
		||||
        listwin~getch()
 | 
			
		||||
 | 
			
		||||
        listwin~erase()
 | 
			
		||||
        listwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Redraw the main menu */
 | 
			
		||||
        win~refresh
 | 
			
		||||
        self~setupMainMenu(win)
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
    ::method searchContactPanel
 | 
			
		||||
        expose win db menuwin menu_items
 | 
			
		||||
 | 
			
		||||
        /* Create a search panel */
 | 
			
		||||
        max_y = win~lines
 | 
			
		||||
        max_x = win~cols
 | 
			
		||||
        search_height = 6
 | 
			
		||||
        search_width = 50
 | 
			
		||||
        start_y = (max_y - search_height) % 2
 | 
			
		||||
        start_x = (max_x - search_width) % 2
 | 
			
		||||
        searchwin = self~DrawSubPanel(search_height, search_width, start_y, start_x, 3, "Search Contacts", .true)
 | 
			
		||||
 | 
			
		||||
        searchwin~mvaddstr(3, 2, "Search term: ")
 | 
			
		||||
        searchwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Get search term */
 | 
			
		||||
        term = self~getInputField(searchwin, 3, 14, 30)
 | 
			
		||||
 | 
			
		||||
        /* If canceled, return to main menu */
 | 
			
		||||
        if term = .nil then do
 | 
			
		||||
            searchwin~erase()
 | 
			
		||||
            searchwin~refresh()
 | 
			
		||||
            self~DrawMenu(menuwin, menu_items, .environment~selected, win)
 | 
			
		||||
            menuwin~refresh()
 | 
			
		||||
            return
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        /* Perform search */
 | 
			
		||||
        searchwin~erase()
 | 
			
		||||
        searchwin~refresh()
 | 
			
		||||
 | 
			
		||||
        /* Display results in a new window */
 | 
			
		||||
        self~displaySearchResults(term)
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
    ::method getInputField
 | 
			
		||||
        use arg win, y, x, maxlen
 | 
			
		||||
 | 
			
		||||
        win~move(y, x)
 | 
			
		||||
        win~curs_set(1)  /* Show cursor */
 | 
			
		||||
        win~keypad(1)    /* Enable function keys and arrow keys            */
 | 
			
		||||
        win~echo()       /* Show typed characters */
 | 
			
		||||
        win~raw
 | 
			
		||||
 | 
			
		||||
        buffer = ""
 | 
			
		||||
 | 
			
		||||
        do forever
 | 
			
		||||
            key = win~getch()
 | 
			
		||||
            select
 | 
			
		||||
                when key = D2C(27) then do  /* ESC key */
 | 
			
		||||
                    win~curs_set(0)    /* Hide cursor */
 | 
			
		||||
                    win~noecho()       /* Stop showing typed characters */
 | 
			
		||||
                    return .nil        /* Return nil to indicate cancellation */
 | 
			
		||||
                end
 | 
			
		||||
                when key = D2C(10) | key = D2C(13) then do  /* Enter key */
 | 
			
		||||
                    win~curs_set(0)    /* Hide cursor */
 | 
			
		||||
                    win~noecho()       /* Stop showing typed characters */
 | 
			
		||||
                    return buffer      /* Return the entered text */
 | 
			
		||||
                end
 | 
			
		||||
                when key = D2C(8) | key = 127 then do  /* Backspace */
 | 
			
		||||
                    if buffer~length > 0 then do
 | 
			
		||||
                        buffer = buffer~left(buffer~length - 1)
 | 
			
		||||
                        win~move(y, x)
 | 
			
		||||
                        win~addstr(buffer || " ")  /* Erase the last character */
 | 
			
		||||
                        win~move(y, x + buffer~length)
 | 
			
		||||
                    end
 | 
			
		||||
                end
 | 
			
		||||
                otherwise do
 | 
			
		||||
                    if buffer~length < maxlen then do
 | 
			
		||||
                        ch = key
 | 
			
		||||
                        buffer = buffer || ch
 | 
			
		||||
                    end
 | 
			
		||||
                end
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    return buffer
 | 
			
		||||
 | 
			
		||||
    /** MAIN LOOP **/
 | 
			
		||||
    ::method mainLoop
 | 
			
		||||
      expose win mainMenu menuwin selected menu_items menu_keys
 | 
			
		||||
@ -187,6 +382,7 @@
 | 
			
		||||
                menuwin~mvaddstr(19 - 3, 5, "I would launch the ADD panel     ");
 | 
			
		||||
                menuwin~refresh
 | 
			
		||||
                call SysWait 0.25
 | 
			
		||||
                self~addContactPanel()
 | 
			
		||||
                END
 | 
			
		||||
            when key_char = 'r' then do
 | 
			
		||||
                menuwin~mvaddstr(19 - 3, 5, "I would launch the REMOVE panel  ");
 | 
			
		||||
@ -202,11 +398,13 @@
 | 
			
		||||
                menuwin~mvaddstr(19 - 3, 5, "I would launch the SEARCH panel  ");
 | 
			
		||||
                menuwin~refresh
 | 
			
		||||
                call SysWait 0.25
 | 
			
		||||
                self~searchContactPanel()
 | 
			
		||||
                END
 | 
			
		||||
            when key_char = 'l' then do
 | 
			
		||||
                menuwin~mvaddstr(19 - 3, 5, "I would launch the LIST panel    ")
 | 
			
		||||
                menuwin~refresh
 | 
			
		||||
                call SysWait 0.25
 | 
			
		||||
                self~listAllContactsPanel()
 | 
			
		||||
                END
 | 
			
		||||
            when key_char = 'q' then do
 | 
			
		||||
                menuwin~mvaddstr(19 - 3, 5, "Exiting the application...        ")
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user