/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.spellcheck; import java.awt.*; import java.awt.event.*; import java.util.List; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.plugin.desktoputil.*; import org.dts.spell.dictionary.*; import org.jitsi.service.resources.*; /** * The spell check dialog that would be opened from the right click menu in the * chat window. * * @author Purvesh Sahoo */ public class SpellCheckerConfigDialog extends SIPCommDialog implements ActionListener { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private static final Logger logger = Logger .getLogger(SpellCheckerConfigDialog.class); /** * UI Components */ private JTextComponent currentWord; private JList suggestionList; private JScrollPane suggestionScroll; private JButton changeButton; private JButton nextButton; private JButton addButton; private JPanel checkPanel; private JPanel buttonsPanel; private JPanel topPanel; private JPanel suggestionPanel; private SpellDictionary dict; private Chat chat; private final ResourceManagementService resources = Resources .getResources(); private String word; private int index; private Word clickedWord; public SpellCheckerConfigDialog(Chat chat, Word clickedWord, SpellDictionary dict) { super(false); this.dict = dict; this.chat = chat; initComponents(clickedWord); this.setTitle(resources.getI18NString("plugin.spellcheck.TITLE")); this.setMinimumSize(new Dimension(450, 320)); this.setPreferredSize(new Dimension(450, 320)); this.setResizable(false); JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); mainPanel.add(topPanel); this.getContentPane().add(mainPanel); this.pack(); Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension screenSize = toolkit.getScreenSize(); int x = (screenSize.width - this.getWidth()) / 2; int y = (screenSize.height - this.getHeight()) / 2; this.setLocation(x, y); if (!currentWord.getText().equals(" ") && this.dict.isCorrect(currentWord.getText())) { nextButton.doClick(); } } /** * Initialises the UI components. */ private void initComponents(final Word clickWord) { clickedWord = (clickWord == null) ? Word.getWord(" ", 1, false) : clickWord; topPanel = new TransparentPanel(new BorderLayout()); topPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); checkPanel = new TransparentPanel(new BorderLayout(10, 10)); checkPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); checkPanel.setLayout(new BoxLayout(checkPanel, BoxLayout.X_AXIS)); currentWord = new JTextField(clickedWord.getText()); currentWord.setAlignmentX(LEFT_ALIGNMENT); currentWord.setMaximumSize(new Dimension(550, 30)); currentWord.setText(clickedWord.getText()); currentWord.selectAll(); // JPanel wordPanel = new TransparentPanel(new BorderLayout()); // wordPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); // wordPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5)); // wordPanel.add(currentWord); buttonsPanel = new TransparentPanel(new FlowLayout(FlowLayout.RIGHT, 0, 10)); changeButton = new JButton( resources.getI18NString("plugin.spellcheck.dialog.REPLACE")); changeButton.setMnemonic(resources .getI18nMnemonic("plugin.spellcheck.dialog.REPLACE")); changeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (suggestionList.getSelectedValue() != null) { StringBuffer newMessage = new StringBuffer(chat.getMessage()); int endIndex; if (word != null) { endIndex = index + currentWord.getText().length(); newMessage.replace(index, endIndex, (String) suggestionList.getSelectedValue()); word = (String) suggestionList.getSelectedValue(); } else { endIndex = clickedWord.getStart() + clickedWord.getText().length(); newMessage.replace(clickedWord.getStart(), endIndex, (String) suggestionList.getSelectedValue()); } currentWord.setText((String) suggestionList .getSelectedValue()); chat.setMessage(newMessage.toString()); } } }); changeButton.setEnabled(false); nextButton = new JButton( resources.getI18NString("plugin.spellcheck.dialog.FIND")); nextButton.setMnemonic(resources .getI18nMnemonic("plugin.spellcheck.dialog.FIND")); nextButton.addActionListener(new ActionListener() { public Word getNextWord() { Word nextWord; int wordIndex; if (word == null) { if (currentWord.getText().equals(" ")) { String words[] = chat.getMessage().split(" "); currentWord.setText(words[0]); } wordIndex = chat.getMessage().indexOf(currentWord.getText()); if (dict.isCorrect(currentWord.getText())) currentWord.setText(""); } else { wordIndex = chat.getMessage().indexOf(word, index); } Word presentWord = Word.getWord(chat.getMessage(), wordIndex, false); if (presentWord.getEnd() == chat.getMessage().length()) { nextWord = Word.getWord(chat.getMessage(), 0, false); } else { nextWord = Word.getWord(chat.getMessage(), presentWord.getEnd() + 1, false); } index = nextWord.getStart(); word = nextWord.getText(); return nextWord; } public void actionPerformed(ActionEvent e) { Word nextWord = getNextWord(); int breakIndex = nextWord.getStart(); if(breakIndex == 0) breakIndex = nextWord.getEnd() + 1; if(nextWord.getText().length() == 0) { breakIndex++; nextWord = getNextWord(); } while (dict.isCorrect(nextWord.getText()) && nextWord.getEnd() + 1 != breakIndex) { nextWord = getNextWord(); } if (!dict.isCorrect(nextWord.getText())) { word = nextWord.getText(); currentWord.setText(nextWord.getText()); String clickedWord = currentWord.getText(); setSuggestionModel(clickedWord); } } }); buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.Y_AXIS)); buttonsPanel.add(changeButton); buttonsPanel.add(nextButton); checkPanel.add(currentWord, BorderLayout.NORTH); checkPanel.add(Box.createHorizontalStrut(10)); checkPanel.add(buttonsPanel, BorderLayout.EAST); topPanel.add(checkPanel, BorderLayout.NORTH); topPanel.add(Box.createVerticalStrut(10)); DefaultListModel dataModel = new DefaultListModel(); suggestionList = new JList(dataModel); suggestionScroll = new JScrollPane(suggestionList); suggestionScroll.setAlignmentX(LEFT_ALIGNMENT); if (!dict.isCorrect(clickedWord.getText())) setSuggestionModel(clickedWord.getText()); suggestionList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { changeButton.setEnabled(true); } } }); MouseListener clickListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { StringBuffer newMessage = new StringBuffer(chat.getMessage()); int endIndex; if (word != null) { endIndex = index + currentWord.getText().length(); newMessage.replace(index, endIndex, (String) suggestionList.getSelectedValue()); word = (String) suggestionList.getSelectedValue(); } else { endIndex = clickedWord.getStart() + clickedWord.getText().length(); newMessage.replace(clickedWord.getStart(), endIndex, (String) suggestionList.getSelectedValue()); } currentWord.setText((String) suggestionList .getSelectedValue()); chat.setMessage(newMessage.toString()); } } }; suggestionList.addMouseListener(clickListener); addButton = new JButton(resources.getI18NString("plugin.spellcheck.dialog.ADD")); addButton.setMnemonic(resources .getI18nMnemonic("plugin.spellcheck.dialog.ADD")); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { dict.addWord(currentWord.getText()); chat.promptRepaint(); } catch (SpellDictionaryException exc) { String msg = "Unable to add word to personal dictionary"; logger.error(msg, exc); } } }); suggestionPanel = new TransparentPanel(new BorderLayout(10, 10)); suggestionPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); suggestionPanel.setLayout(new BoxLayout(suggestionPanel, BoxLayout.X_AXIS)); suggestionPanel.add(suggestionScroll); suggestionPanel.add(Box.createHorizontalStrut(10)); suggestionPanel.add(addButton); topPanel.add(suggestionPanel, BorderLayout.SOUTH); } /** * Sets the model for the suggestion list * * @param clickedWord */ private void setSuggestionModel(String clickedWord) { DefaultListModel dataModel = new DefaultListModel(); List<String> corrections = this.dict.getSuggestions(clickedWord); for (String correction : corrections) { dataModel.addElement(correction); } suggestionList.setModel(dataModel); } /** * Returns the selected correction value * * @return selected value from suggestion list */ public Object getCorrection() { return suggestionList.getSelectedValue(); } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } @Override protected void close(boolean escaped) { // TODO Auto-generated method stub } }