/* * put your module comment here * formatted with JxBeauty (c) johann.langhofer@nextra.at */ package com.swabunga.spell.swing; import com.swabunga.spell.engine.Word; import com.swabunga.spell.event.*; import javax.swing.*; import javax.swing.text.*; import javax.swing.event.*; import java.io.File; import java.awt.*; import java.awt.event.*; import java.util.*; /** Implementation of a spell check form. * <p>This needs to layed out correctly but for the most part it works.</p> * * @author Jason Height (jheight@chariot.net.au) * * NOTE: Modification be Howard Kistler: * Removed the calls that change the Invalid Word text box, because * I think that behaviour is counter-intuitive and might even screw * up other functions that rely on it being the original invalid word. * If it's going to be like this for good, it should probably be a * Label instead of a Textfield. * */ public class JSpellForm extends JPanel implements ActionListener, ListSelectionListener { /** The Ignore button click action command*/ public static final String IGNORE_CMD = "IGNORE"; /** The Ignore All button click action command*/ public static final String IGNOREALL_CMD = "IGNOREALL"; /** The Add button click action command*/ public static final String ADD_CMD = "ADD"; /** The Replace button click action command*/ public static final String REPLACE_CMD = "REPLACE"; /** The Replace All button click action command*/ public static final String REPLACEALL_CMD = "REPLACEALL"; /** The Cancel button click action command*/ public static final String CANCEL_CMD = "CANCEL"; /** The resource for the Suggestions label*/ private static final String SUGGESTIONS_RES = "SUGGESTIONS"; private static final String INVALIDWORD_RES = "INVALIDWORD"; /* Accessible GUI Components */ protected JList suggestList; protected JTextArea checkText; /* The current spell check event */ protected SpellCheckEvent spellEvent; /** The listener list (holds actionlisteners) */ protected EventListenerList listenerList = new EventListenerList(); protected ResourceBundle messages; /** Panel constructor */ public JSpellForm () { messages = ResourceBundle.getBundle("com.swabunga.spell.swing.messages", Locale.getDefault()); initialiseGUI(); } /** Helper method to create a JButton with a command, a text label and a listener*/ private static final JButton createButton (String command, String text, ActionListener listener) { JButton btn = new JButton(text); btn.setActionCommand(command); btn.addActionListener(listener); return btn; } /** Creates the buttons on the left hand side of the panel*/ protected JPanel makeEastPanel () { JPanel jPanel1 = new JPanel(); BoxLayout layout = new BoxLayout(jPanel1, BoxLayout.Y_AXIS); jPanel1.setLayout(layout); JButton ignoreBtn = createButton(IGNORE_CMD, messages.getString(IGNORE_CMD), this); ignoreBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(ignoreBtn); JButton ignoreAllBtn = createButton(IGNOREALL_CMD, messages.getString(IGNOREALL_CMD), this); ignoreAllBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(ignoreAllBtn); JButton addBtn = createButton(ADD_CMD, messages.getString(ADD_CMD), this); addBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(addBtn); JButton changeBtn = createButton(REPLACE_CMD, messages.getString(REPLACE_CMD), this); changeBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(changeBtn); JButton changeAllBtn = createButton(REPLACEALL_CMD, messages.getString(REPLACEALL_CMD), this); changeAllBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(changeAllBtn); JButton cancelBtn = createButton(CANCEL_CMD, messages.getString(CANCEL_CMD), this); cancelBtn.setMaximumSize( new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); jPanel1.add(cancelBtn); return jPanel1; } protected JPanel makeCentrePanel () { JPanel jPanel2 = new JPanel(); jPanel2.setLayout(new BoxLayout(jPanel2, BoxLayout.Y_AXIS)); JLabel lbl1 = new JLabel(messages.getString(INVALIDWORD_RES)); jPanel2.add(lbl1); checkText = new JTextArea(); jPanel2.add(new JScrollPane(checkText)); JLabel lbl2 = new JLabel(messages.getString(SUGGESTIONS_RES)); jPanel2.add(lbl2); suggestList = new JList(); suggestList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jPanel2.add(new JScrollPane(suggestList)); suggestList.addListSelectionListener(this); return jPanel2; } /** Called by the constructor to initialise the GUI*/ protected void initialiseGUI () { setLayout(new BorderLayout()); this.add(makeEastPanel(), BorderLayout.EAST); this.add(makeCentrePanel(), BorderLayout.CENTER); } /** Register an action listener */ public void addActionListener (ActionListener l) { listenerList.add(ActionListener.class, l); } /** Deregister an action listener*/ public void removeActionListener (ActionListener l) { listenerList.remove(ActionListener.class, l); } protected void fireActionEvent (ActionEvent e) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ActionListener.class) { ((ActionListener)listeners[i + 1]).actionPerformed(e); } } } /** Sets the current spell check event that is being shown to the user*/ public void setSpellEvent (SpellCheckEvent event) { spellEvent = event; DefaultListModel m = new DefaultListModel(); java.util.List suggestions = event.getSuggestions(); for (int i = 0; i < suggestions.size(); i++) { m.addElement(suggestions.get(i)); } suggestList.setModel(m); if (m.size()>0) { suggestList.setSelectedIndex(0); } checkText.setText(event.getInvalidWord()); } /** Fired when a value in the list is selected*/ public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { Object selectedValue = suggestList.getSelectedValue(); } } /** Fired when a button is selected */ public void actionPerformed (ActionEvent e) { if (IGNORE_CMD.equals(e.getActionCommand())) { spellEvent.ignoreWord(false); } else if (IGNOREALL_CMD.equals(e.getActionCommand())) { spellEvent.ignoreWord(true); } else if (REPLACE_CMD.equals(e.getActionCommand())) { // Howard Kistler START String replacementWord; if(suggestList.getSelectedValue() != null) { replacementWord = suggestList.getSelectedValue().toString(); } else { replacementWord = checkText.getText(); } spellEvent.replaceWord(replacementWord, false); // Howard Kistler END } else if (REPLACEALL_CMD.equals(e.getActionCommand())) { // Howard Kistler START String replacementWord; if(suggestList.getSelectedValue() != null) { replacementWord = suggestList.getSelectedValue().toString(); } else { replacementWord = checkText.getText(); } spellEvent.replaceWord(replacementWord, true); // Howard Kistler END } else if (ADD_CMD.equals(e.getActionCommand())) { spellEvent.addToDictionary(checkText.getText()); } else if (CANCEL_CMD.equals(e.getActionCommand())) { spellEvent.cancel(); } fireActionEvent(e); } // public static void main (String[] args) { // try { // JSpellForm pane = new JSpellForm(); // JFrame frm = new JFrame("Spelling"); // frm.getContentPane().add(pane); // frm.setSize(300, 300); // frm.setVisible(true); // frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // } catch (Exception ex) { // ex.printStackTrace(); // } // } }