import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import javax.swing.border.*;

/** DemoTranslateEnglishGUI2 - extension to
* <code>TranslateEnglishGUI.java</code> that includes
* two translation modes: Pig Latin and Reverse English.<p>
*
* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>Screen snap...</code><br>
* <center><img src = "DemoTranslateEnglishGUI2-1.gif"></center><p>
*
* @see <a href="DemoTranslateEnglishGUI2.java">source code</a>
* @author Scott MacKenzie, 2003
*/
public class DemoTranslateEnglishGUI2
{
   public static void main(String[] args)
   {
      DemoTranslateEnglishGUI2Frame frame = new DemoTranslateEnglishGUI2Frame();
      frame.setTitle("DemoTranslateEnglishGUI2");
      frame.pack();
      frame.show();
   }
}

class DemoTranslateEnglishGUI2Frame extends JFrame
implements KeyListener, ActionListener
{
   final String BANNER = "Translate English\n";
   final String PROMPT = "Enter some text:\n";
   final String PL_BANNER = "Mode = Pig Latin\n";
   final String RE_BANNER = "Mode = Reverse English\n";
   final static int PIG_LATIN = 0;
   final static int REVERSE_ENGLISH = 1;

   private JTextArea enterArea;
   private JRadioButton pigLatinButton;
   private JRadioButton reverseEnglishButton;
   private int mode;

   // constructor

   public DemoTranslateEnglishGUI2Frame()
   {
      // ----------------------------------
      // construct and configure components
      // ----------------------------------

      enterArea = new JTextArea(10, 30);
      enterArea.setFont(new Font("serif", Font.PLAIN, 16));
      enterArea.setText(BANNER);
      enterArea.append(PL_BANNER);
      enterArea.append(PROMPT);
      enterArea.setCaretPosition(enterArea.getText().length());
      enterArea.setEditable(true);
      enterArea.requestFocus();

      pigLatinButton = new JRadioButton("Pig Latin");
      pigLatinButton.setSelected(true);
      reverseEnglishButton = new JRadioButton("Reverse English");

      // add buttons to button group

      ButtonGroup modeGroup = new ButtonGroup();
      modeGroup.add(pigLatinButton);
      modeGroup.add(reverseEnglishButton);

      // -------------
      // add listeners
      // -------------

      this.addWindowListener(new WindowCloser());
      enterArea.addKeyListener(this);
      pigLatinButton.addActionListener(this);
      reverseEnglishButton.addActionListener(this);

      // ------------------
      // arrange components
      // ------------------

      // add components to panels
      
      JPanel textPanel = new JPanel();
      textPanel.add(enterArea);

      JPanel modePanel = new JPanel();
      modePanel.setLayout(new GridLayout(2, 1));
      modePanel.add(pigLatinButton);
      modePanel.add(reverseEnglishButton);
      modePanel.setBorder
         (new TitledBorder(new EtchedBorder(), "Mode"));
      
      // add panels to content pane

      Container contentPane = getContentPane();
      contentPane.add(textPanel, "North");
      contentPane.add(modePanel, "South");
   }

   // ---------------------------------
   // implement KeyListener methods (3)
   // ---------------------------------

   public void keyPressed(KeyEvent ke)
   {
      if (ke.getKeyCode() == KeyEvent.VK_ENTER)
      {
         String s = enterArea.getText();

         // find index of new phrase
         int idx = s.length() - 1;
         while (s.charAt(idx) != '\n')
            --idx;

         // get phrase
         s = s.substring(idx, s.length());

         // translate phrase
         s = translatePhrase(s, mode);

         // output translated phrase
         enterArea.append("\n" + s);
      }
   }
   public void keyReleased(KeyEvent ke) {}
   public void keyTyped(KeyEvent ke) {}

   // ------------------------------------
   // implement ActionListener methods (1)
   // ------------------------------------

   public void actionPerformed(ActionEvent ae)
   {
      Object source = ae.getSource();

      // for in-class demo...
      //if (pigLatinButton.isSelected())
      if (source == pigLatinButton)
      {
         mode = PIG_LATIN;
         enterArea.setText(PL_BANNER);
         enterArea.append(PROMPT);
         enterArea.setCaretPosition(enterArea.getText().length());
         enterArea.requestFocus();
      }

      // for in-class demo...
      //else if (reverseEnglishButton.isSelected())
      else if (source == reverseEnglishButton)
      {
         mode = REVERSE_ENGLISH;
         enterArea.setText(RE_BANNER);
         enterArea.append(PROMPT);
         enterArea.setCaretPosition(enterArea.getText().length());
         enterArea.requestFocus();
      }
   }

   // -------------
   // other methods
   // -------------

   // translate English phrase to Pig Latin or Reverse English
   public static String translatePhrase(String s, int mode)
   {
      StringTokenizer st = new StringTokenizer(s);

      String translation = "";
      while (st.hasMoreTokens())
      {
         String word = st.nextToken();
         String tmp = "";
         if (mode == PIG_LATIN)
            tmp = translateWord(word);
         else if (mode == REVERSE_ENGLISH)
            tmp = reverseWord(word);
         translation += tmp + " ";
      }
      return translation;
   }

   // translate English word to Pig Latin
   private static String translateWord(String s)
   {
      String s1 = s.length() > 1 ? s.substring(1, s.length()) : "";
      String s2 = s.length() > 0 ? s.substring(0, 1) : "";
      String s3 = "ay";
      return s1 + s2 + s3;
   }

   // reverse characters in a string
   public static String reverseWord(String s)  
   {
      if (s.length() == 1)
         return s;
      else
      {
         s = reverseWord(s.substring(1, s.length())) + s.substring(0, 1);
         return s;
      }
   }

   // -------------
   // inner classes
   // -------------

   // Note: WindowAdapter implements WindowListener

   private class WindowCloser extends WindowAdapter
   {
      public void windowClosing(WindowEvent event)
      {
         System.exit(0);
      }
   }
}

