/*
* JOrtho
*
* Copyright (C) 2005-2008 by i-net software
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Created on 24.12.2007
*/
package com.inet.jortho;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.ListModel;
import javax.swing.WindowConstants;
/**
* Implements edit dialog for the user dictionary.
* @author Volker Berlin
*/
class DictionaryEditDialog extends JDialog {
private class DeleteAction extends AbstractAction {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Delete the selected entries. The "Delete" Button it the only Listener.
*/
public void actionPerformed(final ActionEvent e) {
final int[] selected = list.getSelectedIndices();
Arrays.sort(selected);
for (int i = selected.length - 1; i >= 0; i--) {
((DefaultListModel) list.getModel()).remove(selected[i]);
isModify = true;
}
}
}
/**
*
*/
private static final long serialVersionUID = 1L;
private final JButton delete;
private boolean isModify;
private final JList list;
DictionaryEditDialog(final JDialog parent) {
super(parent, Utils.getResource("userDictionary"), true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
final Container content = getContentPane();
content.setLayout(new GridBagLayout());
final DefaultListModel data = new DefaultListModel();
loadWordList(data);
list = new JList(data);
content.add(new JScrollPane(list), new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH,
GridBagConstraints.BOTH, new Insets(8, 8, 8, 8), 0, 0));
delete = new JButton(Utils.getResource("delete"));
content.add(delete, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH,
GridBagConstraints.BOTH, new Insets(0, 8, 8, 8), 0, 0));
final DeleteAction deleteAction = new DeleteAction();
delete.addActionListener(deleteAction);
// DELETE Key
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), "DELETE");
getRootPane().getActionMap().put("DELETE", deleteAction);
//ESCAPE Key
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent e) {
dispose();
}
});
pack();
setLocationRelativeTo(parent);
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
super.dispose();
if (isModify) {
final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
if (provider != null) {
final ListModel model = list.getModel();
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < model.getSize(); i++) {
if (builder.length() != 0) {
builder.append('\n');
}
builder.append(model.getElementAt(i));
}
provider.setUserWords(builder.toString());
}
}
}
/**
* A hack for the layout manger to prevent that the dialog is to small to show the title line. The problem occur
* only if there are small words in the list. With a empty list there are no problems.
*/
@Override
public Dimension getPreferredSize() {
final Dimension dim = super.getPreferredSize();
final String title = getTitle();
final int titleWidth = getFontMetrics(getFont()).stringWidth(title) + 80;
if (dim.width < titleWidth) {
dim.width = titleWidth;
}
return dim;
}
/**
* Load all words from the user dictionary if available
* @param data
*/
private void loadWordList(final DefaultListModel data) {
try {
final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
if (provider != null) {
final String userWords = provider.getUserWords(SpellChecker.getCurrentLocale());
if (userWords != null) {
final BufferedReader input = new BufferedReader(new StringReader(userWords));
final ArrayList<String> wordList = new ArrayList<String>();
String word = input.readLine();
while (word != null) {
if (word.length() > 1) {
wordList.add(word);
}
word = input.readLine();
}
// Liste alphabetical sorting with the user language
Collections.sort(wordList, Collator.getInstance());
for (final String str : wordList) {
data.addElement(str);
}
}
}
}
catch (final IOException ex) {
ex.printStackTrace();
}
}
}