/*
   Chapter7:      Classics on DVD
   Programer:     Brad Shedd
   Date:          August 27, 2006
   Filename:      DVD.java
   Purpose:    This program creates a Swing interface for sorting a DVD collection.
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class DVD extends JFrame implements ActionListener
{
  
//construct components
   JLabel sortPrompt = new JLabel("Sort by:");
   JComboBox fieldCombo =
new JComboBox();
   JTextPane textPane =
new JTextPane();

  
//initialize data in arrays
   String title[] = {"Casablanca" , "Citizen Kane" , "Singin' in the Rain" , "The Wizard of Oz"};
   String studio[] = {
"Warner Brothers" , "RKO Pictures" , "MGM" , "MGM"};
   String year[] = {
"1942", "1941" , "1952", "1939"};

  
//construct instance of DVD
   public DVD()
   {
     
super("Classics on DVD");
   }

  
//create the menu system
   public JMenuBar createMenuBar()
  {
     
//create an instance of the menu
      JMenuBar mnuBar = new JMenuBar();
      setJMenuBar(mnuBar);

     
//construct and populate the File menu
      JMenu mnuFile = new JMenu("File", true);
         mnuFile.setMnemonic(KeyEvent.VK_F);
         mnuFile.setDisplayedMnemonicIndex(0);
         mnuBar.add(mnuFile);

      JMenuItem mnuFileExit =
new JMenuItem("Exit");
         mnuFileExit.setMnemonic(KeyEvent.VK_X);
        mnuFileExit.setDisplayedMnemonicIndex(1);
         mnuFile.add(mnuFileExit);
         mnuFileExit.setActionCommand(
"Exit");
         mnuFileExit.addActionListener(
this);

     
//construct and populate the Edit menu
      JMenu mnuEdit = new JMenu("Edit", true);
         mnuEdit.setMnemonic(KeyEvent.VK_E);
         mnuEdit.setDisplayedMnemonicIndex(0);
         mnuBar.add(mnuEdit);

      JMenuItem mnuEditInsert =
new JMenuItem("Insert New DVD");
         mnuEditInsert.setMnemonic(KeyEvent.VK_I);
         mnuEditInsert.setDisplayedMnemonicIndex(0);
         mnuEdit.add(mnuEditInsert);
         mnuEditInsert.setActionCommand(
"Insert");
         mnuEditInsert.addActionListener(
this);

      JMenu mnuEditSearch =
new JMenu("Search");
         mnuEditSearch.setMnemonic(KeyEvent.VK_R);
         mnuEditSearch.setDisplayedMnemonicIndex(3);
         mnuEdit.add(mnuEditSearch);

      JMenuItem mnuEditSearchByTitle =
new JMenuItem("by Title");
         mnuEditSearchByTitle.setMnemonic(KeyEvent.VK_T);
         mnuEditSearchByTitle.setDisplayedMnemonicIndex(3);
         mnuEditSearch.add(mnuEditSearchByTitle);
         mnuEditSearchByTitle.setActionCommand(
"title");
         mnuEditSearchByTitle.addActionListener(
this);

      JMenuItem mnuEditSearchByStudio =
new JMenuItem("by Studio");
         mnuEditSearchByStudio.setMnemonic(KeyEvent.VK_S);
         mnuEditSearchByStudio.setDisplayedMnemonicIndex(3);
         mnuEditSearch.add(mnuEditSearchByStudio);
         mnuEditSearchByStudio.setActionCommand(
"studio");
         mnuEditSearchByStudio.addActionListener(
this);

      JMenuItem mnuEditSearchByYear =
new JMenuItem("by Year");
         mnuEditSearchByYear.setMnemonic(KeyEvent.VK_Y);
         mnuEditSearchByYear.setDisplayedMnemonicIndex(3);
         mnuEditSearch.add(mnuEditSearchByYear);
         mnuEditSearchByYear.setActionCommand(
"year");
         mnuEditSearchByYear.addActionListener(
this);

     
return mnuBar;
   }

  
//create the content pane
   public Container createContentPane()
   {
     
//populate the JComboBox
      fieldCombo.addItem("Tilte");
      fieldCombo.addItem(
"Studio");
      fieldCombo.addItem(
"Year");
      fieldCombo.addActionListener(
this);
      fieldCombo.setToolTipText(
"Click the drop-down arrow to display sort fields.");

     
//construct and populate the north panel
      JPanel northPanel = new JPanel();
         northPanel.setLayout(
new FlowLayout());
         northPanel.add(sortPrompt);
         northPanel.add(fieldCombo);

     
//create the JTextPane and center panel
      JPanel centerPanel = new JPanel();
         setTabsAndStyles(textPane);
         textPane = addTextToTextPane();
         JScrollPane scrollPane =
new JScrollPane(textPane);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scrollPane.setPreferredSize(
new Dimension(500, 200));
         centerPanel.add(scrollPane);

     
//create Container and set attributes
      Container c = getContentPane();
         c.setLayout(
new BorderLayout(10,10));
         c.add(northPanel,BorderLayout.NORTH);
         c.add(centerPanel,BorderLayout.CENTER);

     
return c;
   }

  
//method to create tab stops and set foont styles
   protected void setTabsAndStyles(JTextPane textPane)
   {
     
//create tab stops
      TabStop[] tabs = new TabStop[2];
         tabs[0] =
new TabStop(200, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE);
        tabs[1] =
new TabStop(350, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE);
      TabSet tabset =
new TabSet(tabs);

    
//set tab style
      StyleContext tabStyle = StyleContext.getDefaultStyleContext();
      AttributeSet aset =
        tabStyle.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.TabSet, tabset);
      textPane.setParagraphAttributes(aset,
false);

     
//set font style
      Style fontStyle=
         StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);

      Style regular = textPane.addStyle(
"regular", fontStyle);
      StyleConstants.setFontFamily(fontStyle,
"SansSerif");

      Style s = textPane.addStyle(
"italic", regular);
      StyleConstants.setItalic(s,
true);

      s = textPane.addStyle(
"bold", regular);
      StyleConstants.setBold(s,
true);

      s = textPane.addStyle(
"large", regular);
      StyleConstants.setFontSize(s, 16);
   }

  
//method to add new text to the JTextPane
   public JTextPane addTextToTextPane()
   {
      Document doc = textPane.getDocument();
     
try
      {
        
//clear previous text
         doc.remove(0, doc.getLength());

        
//insert title
         doc.insertString(0, "TITLE\tSTUDIO\tYEAR\n", textPane.getStyle("large"));

        
//insert detail
         for (int j = 0; j<title.length; j++)
         {
            doc.insertString(doc.getLength(), title[j] +
"\t", textPane.getStyle("bold"));
            doc.insertString(doc.getLength(), studio[j] +
"\t", textPane.getStyle("italic"));
            doc.insertString(doc.getLength(), year[j] +
"\n", textPane.getStyle("regular"));
         }
      }
     
catch (BadLocationException ble)
      {
         System.err.println(
"Couldn't insert text.");
      }

     
return textPane;
   }

  
//event to process user clicks
   public void actionPerformed(ActionEvent e)
   {
      String arg = e.getActionCommand();

     
//user clicks the sort by combo box
      if (e.getSource() == fieldCombo)
      {
        
switch (fieldCombo.getSelectedIndex())
         {
           
case 0:
               sort(title);
              
break;
           
case 1:
               sort(studio);
              
break;
           
case 2:
               sort(year);
             
break;
         }
      }

     
//user clicks Exit on the File menu
      if (arg == "Exit")
         System.exit(0);

     
//user clicks Insert New DVD on the Edit menu
      if (arg == "Insert")
      {
        
//accept new data
         String newTitle = JOptionPane.showInputDialog(null, "Please enter the new movie's title");
         String newStudio = JOptionPane.showInputDialog(
null, "Please enter the studio for" + newTitle);
         String newYear = JOptionPane.showInputDialog(
null, "Please enter the year for" + newTitle);

        
//enlarge arrays
         title = enlargeArray(title);
         studio = enlargeArray(studio);
         year = enlargeArray(year);

        
//add new data to arrays
         title[title.length-1] = newTitle;
         studio[studio.length-1] = newStudio;
         year[year.length-1] = newYear;

        
//call sort method
         sort(title);
         fieldCombo.setSelectedIndex(0);
      }

     
//if user clicks Title on the Search submenu
      if (arg == "title")
         search(arg, title);

     
//user clicks studio on the search submenu
      if (arg == "studio")
         search(arg, studio);

      
//user clicks year on the search submenu
      if (arg == "year")
         search(arg, year);
   }

  
//method to enlarge an arry by 1
   public String[] enlargeArray(String[] currentArray)
   {
      String[] newArray =
new String[currentArray.length + 1];
     
for(int i = 0; i<currentArray.length; i++)
         newArray[i] = currentArray[i];
        
return newArray;
   }

  
//method to sort string
   public void sort (String tempArray[])
   {
     
//loop to control number of passes
      for (int pass = 1; pass < tempArray.length; pass++)
      {
        
for(int element = 0; element < tempArray.length - 1; element++)
        
if (tempArray[element].compareTo(tempArray[element + 1])>0)
         {
            swap(title, element, element + 1);
            swap(studio, element, element + 1);
           swap(year, element, element + 1);
         }
      }
      addTextToTextPane();
   }

  
//method to swap two elements of an Array
   public void swap(String swapArray[], int first, int second)
   {
      String hold;  
//temp holding area for swap
      hold = swapArray[first];
      swapArray[first] = swapArray[second];
      swapArray[second] = hold;
   }

  
public void search(String searchField, String searchArray[])
   {
     
try
      {
         Document doc = textPane.getDocument();
//assign text to document object
         doc.remove(0,doc.getLength()); // clear previous text

         //display column titles
         doc.insertString(0, "TITLE\tSTUDIO\tYEAR\n", textPane.getStyle("large"));

         
//prompt user for search data
         String search = JOptionPane.showInputDialog(null, "Please enter the" + searchField);
        
boolean found = false;

        
//search arrays
         for (int i = 0; i<title.length; i++)
         {
            
if(search.compareTo(searchArray[i])==0)
            {
               doc.insertString(doc.getLength(), title[i] +
"\t",textPane.getStyle("bold"));
               doc.insertString(doc.getLength(), studio[i] +
"\t",textPane.getStyle("italic"));
               doc.insertString(doc.getLength(), year[i] +
"\n",textPane.getStyle("regular"));
               found =
true;
            }
         }
        
if (found == false)
        {
            JOptionPane.showMessageDialog(
null, "Your search produced no results.", "No results found",JOptionPane.INFORMATION_MESSAGE);
            sort(title);
         }
      }
     
catch (BadLocationException ble)
      {
         System.err.println(
"Couldn't insert text.");
      }
   }

  
//main method executes at run time
   public static void main(String args[])
   {
      JFrame.setDefaultLookAndFeelDecorated(
true);
      DVD f =
new DVD();
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.setJMenuBar(f.createMenuBar());
      f.setContentPane(f.createContentPane());
      f.setSize(600,375);
      f.setVisible(
true);
  }
}

Homepage