package org.jivesoftware.sparkplugin.phonebook.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.regex.PatternSyntaxException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.border.EmptyBorder;
import javax.swing.event.RowSorterEvent;
import javax.swing.event.RowSorterListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import net.java.sipmack.common.Log;
import net.java.sipmack.softphone.SoftPhoneManager;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.RolloverButton;
import org.jivesoftware.spark.plugin.phone.resource.PhoneRes;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.sparkplugin.phonebook.BookManager;
import org.jivesoftware.sparkplugin.phonebook.PhoneNumber;
import org.jivesoftware.sparkplugin.phonebook.PhonebookManager;
public class PhonebookUI extends JPanel
{
private static final long serialVersionUID = -5477841619200563149L;
private JFrame frame = new JFrame();
private RolloverButton btnAdd;
private RolloverButton btnDel;
private RolloverButton btnEdit;
private RolloverButton btnDial;
private static final int iconwidth = 20;
private static final int iconheight = 20;
private DefaultTableModel model;
private BookManager manager;
private JTable table;
private TableRowSorter<TableModel> sorter;
private JTextField tfsearch;
private static final String DEFAULT_FILTER = "^(?is)#.*";
private static final PhonebookUI instance = new PhonebookUI();
public static PhonebookUI getInstance() {
return instance;
}
public PhonebookUI() {
manager = new PhonebookManager();
init();
}
private void init() {
this.removeAll();
model = new DefaultTableModel(){
private static final long serialVersionUID = -1231025049889503785L;
public boolean isCellEditable(int i, int j)
{
return false;
}
};
sorter = new TableRowSorter<TableModel>(model);
table = new JTable(model);
JPanel pbtn = new JPanel();
JPanel psearch = new JPanel();
tfsearch = new JTextField();
JScrollPane scroll = new JScrollPane(table);
table.setRowSorter(sorter);
table.getTableHeader().setReorderingAllowed(false);
btnAdd = new RolloverButton(PhoneRes.getIString("btn.add"));
btnDel = new RolloverButton(PhoneRes.getIString("btn.del"));
btnEdit = new RolloverButton(PhoneRes.getIString("btn.edit"));
btnDial = new RolloverButton(PhoneRes.getIString("btn.dial"));
// add icons
btnAdd.setIcon(new ImageIcon(PhoneRes.getImage("ADDICON").getScaledInstance(iconwidth, iconheight, Image.SCALE_SMOOTH)));
btnDel.setIcon(new ImageIcon(PhoneRes.getImage("DELICON").getScaledInstance(iconwidth, iconheight, Image.SCALE_SMOOTH)));
btnEdit.setIcon(new ImageIcon(PhoneRes.getImage("EDITICON").getScaledInstance(iconwidth, iconheight, Image.SCALE_SMOOTH)));
btnDial.setIcon(new ImageIcon(PhoneRes.getImage("DIALICON").getScaledInstance(iconwidth, iconheight, Image.SCALE_SMOOTH)));
// add actionlisteners
btnAdd.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
btnAddPerformed();
}
});
btnDel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int[] selected = table.getSelectedRows();
if(selected.length == 0) {
JOptionPane.showMessageDialog(PhonebookUI.this, PhoneRes.getIString("book.noEntry"),
PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE);
}
for(int select : selected) {
if(select > -1) {
manager.deleteEntry(table.getValueAt(select, 0).toString(), table.getValueAt(select, 1).toString());
model.removeRow(sorter.convertRowIndexToModel(select));
}
}
loadEntries();
}
});
btnEdit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int selected = table.getSelectedRow();
if(selected > -1) {
btnEditPerformed(table.getValueAt(selected, 0).toString(), table.getValueAt(selected, 1).toString());
}
else {
JOptionPane.showMessageDialog(PhonebookUI.this, PhoneRes.getIString("book.noEntry"),
PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE);
}
}
});
btnDial.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int selected = table.getSelectedRow();
if(selected > -1) {
final SoftPhoneManager phoneManager = SoftPhoneManager.getInstance();
if (phoneManager.getInterlocutors().size() > 0) {
phoneManager.getDefaultGuiManager().hangupAll();
}
else {
phoneManager.getDefaultGuiManager().dial(table.getValueAt(selected, 1).toString());
}
}
else {
JOptionPane.showMessageDialog(PhonebookUI.this, PhoneRes.getIString("book.noEntry"),
PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE);
}
}
});
sorter.addRowSorterListener(new RowSorterListener(){
public void sorterChanged(RowSorterEvent arg0)
{
TableRowSorter<?> rs = (TableRowSorter<?>) arg0.getSource();
String temp = tfsearch.getText();
if (model.getRowCount()> 0
&& rs.getViewRowCount() < 1) {
// nur wenn auch was drin steht, erkennen
if (temp.length() > 0) {
tfsearch.setText(temp.substring(0, temp.length() - 1));
}
filterTable(tfsearch.getText());
}
else if(table.getRowCount() > 0){
table.setRowSelectionInterval(0, 0);
}
}
});
tfsearch.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent evt)
{
keyReleasedSuchFeld(evt);
if(table.getRowCount() > 0) {
table.setRowSelectionInterval(0, 0);
}
}
});
loadEntries();
// add components to layout
pbtn.setLayout(new BoxLayout(pbtn, BoxLayout.X_AXIS));
pbtn.setBorder(new EmptyBorder(5,5,5,5));
pbtn.add(Box.createHorizontalGlue());
pbtn.add(btnDial);
pbtn.add(Box.createHorizontalStrut(5));
pbtn.add(btnAdd);
pbtn.add(Box.createHorizontalStrut(5));
pbtn.add(btnEdit);
pbtn.add(Box.createHorizontalStrut(5));
pbtn.add(btnDel);
pbtn.add(Box.createHorizontalGlue());
psearch.setLayout(new BoxLayout(psearch, BoxLayout.X_AXIS));
psearch.setBorder(new EmptyBorder(5,5,5,5));
psearch.add(new JLabel(PhoneRes.getIString("book.search") + ":"));
psearch.add(tfsearch);
this.setLayout(new BorderLayout());
this.add(psearch, BorderLayout.NORTH);
this.add(pbtn, BorderLayout.SOUTH);
this.add(scroll, BorderLayout.CENTER);
tfsearch.requestFocusInWindow();
frame.setLayout(new BorderLayout());
frame.add(this, BorderLayout.CENTER);
frame.setTitle(PhoneRes.getIString("frame.title"));
frame.setSize(new Dimension(400,300));
frame.setIconImage(SparkRes.getImageIcon(SparkRes.ADDRESS_BOOK_16x16).getImage());
}
/**
* gets the list of phonenumbers from themanager and put them
* into the table
*
*/
public void loadEntries() {
int selRow = table.getSelectedRow();
Vector<String> heading = new Vector<String>();
Vector<Vector<String>> data = new Vector<Vector<String>>();
Vector<String> temp;
heading.add(PhoneRes.getIString("book.name"));
heading.add(PhoneRes.getIString("book.number"));
List<PhoneNumber> numbers = manager.getPhoneNumbers();
for(PhoneNumber number : numbers) {
temp = new Vector<String>();
temp.add(number.getName());
temp.add(number.getNumber());
data.add(temp);
}
model.setDataVector(data, heading);
// sort alphabetic
sorter.toggleSortOrder(0);
// selecte the first row
if(selRow != -1
&& selRow < table.getRowCount())
table.setRowSelectionInterval(selRow, selRow);
else if(table.getRowCount()>0)
table.setRowSelectionInterval(0, 0);
}
public void invoke() {
GraphicUtils.centerWindowOnComponent(frame, SparkManager.getMainWindow());
frame.setVisible(true);
}
public void setManager(BookManager manage) {
manager = manage;
init();
}
/**
* makes a JFrame where you can enter a new entry
*/
private void btnAddPerformed() {
try {
EventQueue.invokeLater(new Runnable(){
public void run() {
EntryFrame addFrame = new EntryFrame(PhonebookUI.this, manager, EntryFrame.TYP_ADD);
addFrame.invoke();
}
});
}
catch(Exception ex) {
Log.error(ex);
}
}
/**
* makes a JFrame where you can edit an existing entry
*/
private void btnEditPerformed(final String name, final String number) {
try {
EventQueue.invokeLater(new Runnable(){
public void run() {
EntryFrame editFrame = new EntryFrame(PhonebookUI.this, manager, EntryFrame.TYP_EDIT);
editFrame.setName(name);
editFrame.setNumber(number);
editFrame.invoke();
}
});
}
catch(Exception ex) {
Log.error(ex);
}
}
private void filterTable(String text)
{
String filterString = text;
ArrayList<RowFilter<TableModel, Object>> andFilter = new ArrayList<RowFilter<TableModel, Object>>(1); //split.length);
ArrayList<RowFilter<TableModel, Object>> subFilter;
RowFilter<TableModel, Object> rf;
RowFilter<TableModel, Object> rf0;
try
{
subFilter = new ArrayList<RowFilter<TableModel, Object>>(1); //split.length);
for (Integer i = 0; i < model.getColumnCount(); i++)
{
rf0 = RowFilter.regexFilter("^(?i)" + filterString, i);
subFilter.add(rf0);
}
rf = RowFilter.orFilter(subFilter);
andFilter.add(rf);
}
catch (PatternSyntaxException pse)
{
Log.error(pse);
}
RowFilter<TableModel, Object> rowf = RowFilter.andFilter(andFilter);
sorter.setRowFilter(rowf);
}
private void keyReleasedSuchFeld(KeyEvent evt)
{
if(table.getRowCount() > 0) {
filterTable(DEFAULT_FILTER.replace("#", tfsearch.getText()));
table.updateUI();
}
}
}