It215 week 9 final bookstore project part 6

//IT215 Week 9 Final
//Bookstore Project Part 6
//

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.NumberFormat; //application uses Number Format
import java.util.Locale; //Application uses United States Currenc

public final class Bookstore extends JFrame //Class: Bookstore
{
    final int MAX = 5;
    Books pt[] = new Books[MAX];

   
    int numBooks; //Keeps track of the number of books in the array
    int curBooks;// The current number of books

    JPanel detailPanel; //JPanels
    JPanel navigation;
    JPanel finalButtons;

    JLabel lb1, lb2, lb3, lb4, lb5, lb6, lb7; //JLabels 1-7
    JTextField tf1, tf2, tf3, tf4, tf5, tf6, tf7; //JTextField 1-7
    JButton first, previous, next, last, add, delete, modify, save, search; //JButtons    
   Bookstore() //Bookstore Constructor
   {
        super(“Book Store”); //Frame Title

       numBooks = 0; //Zero books on initial
       curBooks = -1;
       detailPanel = new JPanel();
       detailPanel.setLayout(null);
       first = new JButton(“First”); //Navigation “First” button
       previous = new JButton(“Previous”); //Navigation “Previous” button
       next = new JButton(“Next”);//Navigation “Next” button
       last = new JButton(“Last”);//Navigation “Last” button
       first.addActionListener(new ActionHandler()); //Actionlistener “First” event button
       previous.addActionListener(new ActionHandler()); //Actionlistener “Previous” event button
       next.addActionListener(new ActionHandler()); //Actionlistener “Next” event button
       last.addActionListener(new ActionHandler()); //Actionlistener “Last” event button
//Navigation panel
       navigation = new JPanel();
       navigation.setLayout(new GridLayout(2,2));
       navigation.setBounds(150,0,370,150);
       navigation.add(first);
       navigation.add(previous);
       navigation.add(next);
       navigation.add(last);
       add(navigation);
      
//JLabels
       lb1 = new JLabel(“Title”); //Title Label
       lb2 = new JLabel(“ISBN”); //ISBN Label
       lb3 = new JLabel(“Price”); //Author’s name Label
       lb4 = new JLabel(“Year”); //Year Published Label
       lb5 = new JLabel(“Publisher”); //Publisher’s name label
       lb6 = new JLabel(“Author”); //Price of the book label
       lb7 = new JLabel(“Total”); //Total cost of all books label

//Text fields
       tf1 = new JTextField(20); //Title Text field
       tf2 = new JTextField(20); //ISBN Text field
       tf3 = new JTextField(20); //Author’s name Text field
       tf4 = new JTextField(20); //Year Published Text field
       tf5 = new JTextField(20); //Publisher’s name Text field
       tf6 = new JTextField(20); //Price of the book Text field
       tf7 = new JTextField(20); //Total cost of all books Text field

//Additions for Final Project: buttons
       finalButtons = new JPanel();
       finalButtons.setBounds(0,150,150,350);
       finalButtons.setLayout(new GridLayout(5,1));
       add = new JButton(“Add”);
       delete = new JButton(“Delete”);
       modify = new JButton(“Modify”);
       save = new JButton(“Save”);
       search = new JButton(“Search”);

//Final Project: buttons Actionlisteners
       add.addActionListener(new ActionHandler());
       delete.addActionListener(new ActionHandler());
       modify.addActionListener(new ActionHandler());
       save.addActionListener(new ActionHandler());
       search.addActionListener(new ActionHandler());

       finalButtons.add(add);
       finalButtons.add(delete);
       finalButtons.add(modify);
       finalButtons.add(save);
       finalButtons.add(search);
       add(finalButtons);
     
       setLayout(null);
      
//Set Frame Size
       setSize(528,533);
       setLocation(150,100);
       setResizable(false);

//Panel label positions
       lb1.setBounds(20,30,200,25);   
       lb2.setBounds(20,60,200,25);
       lb3.setBounds(20,90,200,25);
       lb4.setBounds(20,120,200,25);
       lb5.setBounds(20,150,200,25);
       lb6.setBounds(20,180,200,25);
       lb7.setBounds(20,210,200,25);
//Panel Text field positions
       tf1.setBounds(240,30,100,25);
       tf2.setBounds(240,60,100,25);
       tf3.setBounds(240,90,100,25);
       tf4.setBounds(240,120,100,25);
       tf5.setBounds(240,150,100,25);
       tf6.setBounds(240,180,100,25);
       tf7.setBounds(240,210,100,25);
//Removing ability to manually edit text fields
       editText(false);
//Setting text field BG color to WHITE
       tf1.setBackground(Color.WHITE);
       tf2.setBackground(Color.WHITE);
       tf3.setBackground(Color.WHITE);
       tf4.setBackground(Color.WHITE);
       tf5.setBackground(Color.WHITE);
       tf6.setBackground(Color.WHITE);
       tf7.setBackground(Color.WHITE);
//Adding labels to Detail Panel
       detailPanel.add(lb1);
       detailPanel.add(lb2);
       detailPanel.add(lb3);
       detailPanel.add(lb4);
       detailPanel.add(lb5);
       detailPanel.add(lb6);
       detailPanel.add(lb7);
//Adding TF to Detail Panel
       detailPanel.add(tf1);
       detailPanel.add(tf2);
       detailPanel.add(tf3);
       detailPanel.add(tf4);
       detailPanel.add(tf5);
       detailPanel.add(tf6);
       detailPanel.add(tf7);
//Setting Detail Panel to frame
       detailPanel.setBounds(150,150,370,350);
       add(detailPanel);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
   }

//Total value of all items in inventory
   public float total()
    {
    float total = 0;
    for(int i=0; i<numBooks; i++)
    {
        total += pt[i].getTotal();
                  }
    return total;
    }

//bookDisplay method
   public void bookDisplay(int index)
    {
    //Numberformat = US   
    NumberFormat nfc = NumberFormat.getCurrencyInstance(Locale.US);       

    tf1.setText( pt[index].getTitle() );
    tf2.setText( pt[index].getISBN() + “”);
    tf3.setText( nfc.format( pt[index].getPrice() ) );
    tf4.setText( pt[index].getYear() + “”);
    tf5.setText( nfc.format( pt[index].getPublisher() ) );
    tf6.setText( pt[index].getAuthor() );
    tf7.setText( nfc.format(pt[index].getTotal) );
    }

   //this method sorts the array accoding to the names (Sorting technique: Bubble Sort)
   public void arraySort(int curBooks)
    {
    int pass , i;
    int temp;
    Books s = null;
//sorts books with more than one in array
    if(curBooks > 1)
    {
    //make curBooks – 1 passes through the array
    for(pass=1; pass<curBooks; pass++)
    {
        //in each pass shift largest element to right most position
        for(i=0; i<curBooks-pass; i++)
        {
        //comparing the names of Individuals
        temp = (pt[i].getTitle()).compareTo(pt[i+1].getTitle());
            if( temp > 0)
            {
            //if name at i position of array is greater than one at i+1 position than swap
            s = pt[i];
            pt[i] = pt[i+1];
            pt[i+1] = s;
            }//if ends
        }//second for loop ends
    }//first for loop ends
    }//if condition ends
    }

   //Method to enable and disable textfields.
   void editText(boolean state)
   {
       //disable editing of text fields
      tf1.setEditable(state);
      tf2.setEditable(state);
      tf3.setEditable(state);
      tf4.setEditable(state);
      tf5.setEditable(false);
      tf6.setEditable(state);
      tf7.setEditable(false);
   }

//book search by titles
   int searchByTitle(String searchTitle)
   {
       int i;
            for(i=0;i<numBooks;i++)
            {
                if(pt[i].getTitle().equals(searchTitle)) //case sensative matching of Titles
                {
                    curBooks = i;
                    bookDisplay(curBooks);
                    return i;   //return index if match is found
                }
            }
            if(i == numBooks)    // means no match found
            {
                return -1;  //return -1
            }
       return -1;           // no match found
   }
  
   //inner class for handling action events       
   class ActionHandler implements ActionListener
   {
    //handle button event
    public void actionPerformed( ActionEvent event )
    {
    // handling events generated by buttons
                  if(event.getSource() == first)              //moving to first record
    {
                     if(numBooks != 0)
                     {
                        curBooks = 0;
                        bookDisplay(curBooks);
                     }
                     else
                     {
                        JOptionPane.showMessageDialog(null,”No books in program.”);
                     }
                  }
    else if( event.getSource() == previous )    //moving to previous record
    {
                  if(numBooks != 0)                  // array is not empty
                  {
             if( curBooks == 0 )                       // showing first record
             {
                        curBooks = numBooks-1;      // move to last
             }
             else
             {
                        if(numBooks > 1)
                        {
                            curBooks–;                        // move to previous
                        }
             }
                     bookDisplay(curBooks);                  // display in GUI
                  }
                  else
                  {
                     JOptionPane.showMessageDialog(null,”No books in program.”);      // array is empty
                  }
        }
        else if( event.getSource() == next )    // moving to next record
        {
                  if(numBooks != 0)              // array is not empty
                  {
             if( curBooks == numBooks – 1 ) //showing last record
             {
            curBooks = 0;                      // move to first
            bookDisplay(curBooks);
             }
             else
             {
            curBooks++;                        // display next
            bookDisplay(curBooks);
             }
                  }
                  else
                  {
                      JOptionPane.showMessageDialog(null,”No books in program.”);     // array is empty
                  }
        }
        else if( event.getSource() == last )    // moving to last record
        {
                    if(numBooks != 0)            // array is not empty
                    {
            curBooks = numBooks – 1;    // move to last
            bookDisplay( curBooks );
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,”No books in program.”);   // array is empty
                    }
        }
                else if( event.getSource() == add )  // Adds book info to array
                {
                    if(numBooks == MAX)
                    {
                        JOptionPane.showMessageDialog(null,”No more room in array.”);
                        return;
                    }

//Method to enter book information.
                    String name = JOptionPane.showInputDialog(null,”Enter Book Name(or QUIT to exit.)”);
                    name = name.trim();
                    if(name.equalsIgnoreCase(“quit”))
                    {
                        return;
                    }
                    while (name.isEmpty())        // Makes sure that field is not left empty
                    {
                        name = JOptionPane.showInputDialog(null,”Incorrect Syntax; Enter the Book Name”);
                        name = name.trim();                     // trims any spaces
                    }

                    String ISBN = JOptionPane.showInputDialog(null,”Enter the ISBN”);
                    {
                   
                     while (ISBN.isEmpty())
                        {
                            ISBN = JOptionPane.showInputDialog(null,”Incorrect Syntax; Enter the ISBN”);
                            ISBN = ISBN.trim();
                        }
                    }

                    float price = 0;
                    //try catch used to data other than required format
                    try
                    {
                    price = Float.parseFloat(JOptionPane.showInputDialog(null,”Enter the Book’s Price”));
                    }
                    catch(HeadlessException | NumberFormatException e)
                    {
                        JOptionPane.showMessageDialog(null,”Please enter the correct price.”);
                    }
                    while (price <= 0)
                    {
                        try
                        {
                            price = Float.parseFloat(JOptionPane.showInputDialog(null,”Please enter the correct price.”));
                        }
                        catch(HeadlessException | NumberFormatException e)
                        {
                            JOptionPane.showMessageDialog(null,”Please enter the correct price.”);
                        }
                    }
                    String Year = JOptionPane.showInputDialog(null,”Enter the Year of publishing.”);
                    {
                   
                     while (Year.isEmpty())
                        {
                            Year = JOptionPane.showInputDialog(null,”Incorrect Syntax; Enter the correct Year.”);
                            Year = Year.trim();
                        }
                    }
                    String Publisher = JOptionPane.showInputDialog(null,”Enter the Publisher’s Name.”);
                    {
                   
                     while (Publisher.isEmpty())
                        {
                            Publisher = JOptionPane.showInputDialog(null,”Incorrect Syntax; Enter the Publisher’s Name.”);
                            Publisher = Publisher.trim();
                        }
                    }
                    String Author = JOptionPane.showInputDialog(null,”Enter the Author’s Name.”);
                    {
                   
                     while (Author.isEmpty())
                        {
                            Author = JOptionPane.showInputDialog(null,”Incorrect Syntax; Enter the Author’s Name.”);
                            Author = Author.trim();
                        }
                    }
                    //prompts the user to input units in stock
                    int Total = 0;
                    //try catch used to data other than required format
                    try
                    {
                        Total = Integer.parseInt(JOptionPane.showInputDialog(null,”Enter the total number of books.”));
                    }
                    catch(HeadlessException | NumberFormatException e)
                    {
                        JOptionPane.showMessageDialog(null,”Please enter a positive number”);
                    }
                    while ( Total <= 0)        //Makes sure user inputs a positive number.
                    {
                        try
                        {
                            Total = Integer.parseInt(JOptionPane.showInputDialog(null,”Please enter a positive number.”));//Tells user to input a positve number.
                        }
                        catch(HeadlessException | NumberFormatException e)
                        {
                            JOptionPane.showMessageDialog(null,”Please enter a positive number.”);
                        }
                    }

                    //create new Books object
                    Books book = new Books();

                    //add book to array
                    pt[numBooks] = book;
   
                    //increment total
                    numBooks++;

                    //display in GUI
                    curBooks = numBooks -1;
                    bookDisplay(curBooks);
   
                    // buttons will not be enabled unless user enters at least one detail
                    if(numBooks > 0)
                    {
                        first.setEnabled(true);
                        previous.setEnabled(true);
                        next.setEnabled(true);
                        last.setEnabled(true);
                    }

                    //sort the array
                    arraySort(numBooks);
                }
                else if(event.getSource() == delete)   // handle events from dlt button
                {
                    if(numBooks>=1)          // array is not empty
                    {
                        int index;
                        String deleteByTitle=null;
                        // prompt for name to delete
                        deleteByTitle = JOptionPane.showInputDialog(null,”Enter the name to delete”);
                        if(deleteByTitle == null)
                        {  
                            return;
                        }
                        index = searchByTitle(deleteByTitle); //search name in the array
                        if(index != -1)
                        {
                            //found
                            if(numBooks==1)  // present at first position
                            {
                                pt[0] = null; //delete
                            }
                            else
                            {
                            for(int i=index;i<numBooks-1;i++)    //shift all to right
                            {
                                pt[i]=pt[i+1];
                            }
                            }
                            pt[numBooks-1] = null;   // delete
                            numBooks–;          //one deleted
                            if(numBooks!=0) // check array is not empty
                            {
                            curBooks=0;
                            bookDisplay(curBooks);   // display first
                            }
                            else        // empty so make text fields empty
                            {
                                tf1.setText(“”);
                                tf2.setText(“”);
                                tf3.setText(“”);
                                tf4.setText(“”);
                                tf5.setText(“”);
                                tf6.setText(“”);
                                tf7.setText(“”);
                            }
                            JOptionPane.showMessageDialog(null,”Record deleted successfully”);
                        }
                        else    //not found
                        {
                            JOptionPane.showMessageDialog(null,”Record not available in Array.”);
                        }
                    }
                    else    // array is empty
                    {
                        JOptionPane.showMessageDialog(null,”No Record Available!!!”);
                    }
                }
                //modify button is used for modification
                //first it displays “Modify” when user presses it, it changes
                // to “Update” to update the changes made
                else if(event.getSource() == modify && modify.getText().equals(“Modify”))   //modify a record
                {
                    if(numBooks != 0) //array is not empty
                    {
                        int index;
                        String modifyTitle=null;
                        // prompt for Title
                        modifyTitle = JOptionPane.showInputDialog(null,”Enter Title to Modify”);
                        //search in array
                        if(modifyTitle == null)
                        {
                            return;
                        }
                        index = searchByTitle(modifyTitle);

                        if(index != -1) //found in array
                        {
                            //display in GUI
                            curBooks = index;
                            bookDisplay(curBooks);
                            JOptionPane.showMessageDialog(null,”Record found. Now you can modify the details in textfields. \nAfter you are done, please press the Update button.”);
                            //change “Modify” to “Update”
                            modify.setText(“Update”);

                            //enable editing of text fields
                            editText(true);
                        }
                        else    //not found
                        {
                            JOptionPane.showMessageDialog(null,”Record not found.”);
                        }
                    }
                    else    // array is empty
                    {
                        JOptionPane.showMessageDialog(null,”No Record Available!!!”);
                    }
                }
                else if(event.getSource() == modify && modify.getText().equals(“Update”)) //user presses “Update”
                {
                    modify.setText(“Modify”);   //change to “Modify”
                    editText(false);        //disable textfields
                    //use setter functions to update all the data
                    pt[curBooks].setTitle(tf1.getText());
                    pt[curBooks].setISBN(tf2.getText());
                    pt[curBooks].setPrice(Float.parseFloat(tf3.getText().substring(1)));
                    pt[curBooks].setYear(tf4.getText());
                    pt[curBooks].setPublisher(tf5.getText());
                    pt[curBooks].setAuthor(tf6.getText());
                    pt[curBooks].setTotal((long) Float.parseFloat(tf7.getText().substring(1)));
                  
                    bookDisplay(curBooks);
                   
                   
                   
                }
                else if(event.getSource() == save) //events from save button
                {
                    if(numBooks != 0)    // array is not empty
                    {
                    try
                    {
                    //first create the directory
                    File f = new File(“c:\\data\\it215\\”);
                    f.mkdir(); 
                    //now create the file in that directory
                    FileOutputStream outputFile = new FileOutputStream(“c:\\data\\it215\\bookinventory.dat”);
                        try (ObjectOutputStream ob = new ObjectOutputStream(outputFile)) {
                            for(int i=0;i<numBooks;i++)
                            {
                                //one object at time to file
                                ob.writeObject(pt[i]);
                            }   }
                    JOptionPane.showMessageDialog(null,”Save successful.”);
                    }
                    catch(IOException | HeadlessException e)
                    {
                        JOptionPane.showMessageDialog(null,”Error opening file.”);
                    }
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,”Array is Empty”);
                    }
                }
                else if(event.getSource() == search)    //search button
                {
                    String searchTitle=null;
                    if(numBooks==0)  //empty array
                    {
                        JOptionPane.showMessageDialog(null,”Array is Empty”);
                    }
                    else //prompt fot name to search
                    {
                    searchTitle = JOptionPane.showInputDialog(null,”Enter the Title to search”);
                    if(searchTitle==null)
                    {
                        return;
                    }
                    //method searchByName displays the detail to GUI if found and returns its index
                    if(searchByTitle(searchTitle)!= -1)
                    {
                        JOptionPane.showMessageDialog(null,”Record available in Array.”);
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,”Record not available in Array.”);
                    }
                    }
                }
    }
    }

    // main method execution starts here
    public static void main(String[] args)
    {
    //creates new Bookstore object
    Bookstore tip = new Bookstore();

    } //Ends main method.
class Books extends Book implements Serializable
{
        private Object getTotal;
   
   

    Books()
    {
        super();
       
       
    }
   
    Books(String Title, String ISBN, float Price, String Year, String Publisher, String Author, long Total)
    {
        super();
        }
   
}//class ends
class Book implements Serializable
{
    //Variable specifications
    private String Title;    // Variable that stores the title
    private String ISBN;        // Variable that stores the product ID/number
    private float Price;    // Variable that stores the unit price of the product
        private String Year;
        private String Publisher;
        private String Author;
        private long Total;    // Variable that stores the number of product units in stock
       
    // Constructor for a product that is not specified
    Book()
    {       
        setTitle(“UNKNOWN”);
        setISBN(“UNKNOWN”);
        setPrice(0);
        setTotal(0);               
    }
       
    // Constructor for a product with a Title, ID/number, unit price, and number of units in stock
    Book(String Title, String ISBN, float Price, String Year, String Publisher, String Author, long Total)
    {
        setTitle(Title);
        setISBN(ISBN);
        setPrice(0);
                setYear(Year);
                setPublisher(Publisher);
                setAuthor(Author);
        setTotal(0);
               
    }
//Setters
    public void setTitle (String Title)
    {
        this.Title = Title;
    }
    public void setISBN (String ISBN)
    {
        this.ISBN = ISBN;
    }
    public void setPrice (float Price)
    {
        this.Price = Price;
    }
        public void setYear (String Year)
    {
        this.Year = Year;
    }
    public void setPublisher (String Publisher)
    {
        this.Publisher = Publisher;
    }
        public void setAuthor (String Author)
    {
        this.Author = Author;
    }
    public void setTotal (long Total)
    {
        this.Total = Total;
    }
//Getters       
    public String getTitle()
    {
        return Title;       
    }
    public String getISBN()
    {
        return ISBN;
    }
    public float getPrice()
    {
        return Price;
    }   
        public String getYear()
    {
        return Year;       
    }
        public String getPublisher()
    {
        return Publisher;       
    }
        public String getAuthor()
    {
        return Author;       
    }
    public long getTotal()
    {
        return Total;
    }
                           
    //Computes and Returns total price of all objects
    public float getTotal2()
    {
        return (Total * Price);
    }
           
} // end class Product
} //Ends class Bookstore