/*
GNU GENERAL LICENSE
Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution
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
verion 3 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 License for more details.
You should have received a copy of the GNU General Public
along with this program. If not, see <http://www.gnu.org/licenses/>.
Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
*/
package org.lobobrowser.primary.gui.bookmarks;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.lobobrowser.primary.ext.HostEntry;
import org.lobobrowser.primary.ext.IconFactory;
import org.lobobrowser.primary.ext.NavigationHistory;
import org.lobobrowser.ua.NavigatorWindow;
/**
* The Class RecentHostsDialog.
*/
public class RecentHostsDialog extends JDialog {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The jtf filter. */
private JTextField jtfFilter;
/** The row sorter. */
private TableRowSorter<TableModel> rowSorter;
/** The window. */
private NavigatorWindow window;
/** The search. */
private final String SEARCH = "/org/lobobrowser/images/search.png";
/**
* Instantiates a new bookmarks dialog.
*/
public RecentHostsDialog(NavigatorWindow window) {
this.window = window;
jtfFilter = new JTextField();
jtfFilter.setToolTipText("Keywords will be matched against URL, title, description and tags");
setLayout(new BorderLayout());
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JLabel("Specify a word to match:"), BorderLayout.WEST);
panel.add(jtfFilter, BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH);
add(tablePane(), BorderLayout.CENTER);
jtfFilter.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
String text = jtfFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void removeUpdate(DocumentEvent e) {
String text = jtfFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void changedUpdate(DocumentEvent e) {}
});
}
/**
* Creates the right pane.
*
* @param prefsPanel
* the prefs panel
* @return the component
*/
private Component tablePane() {
Object columnNames[] = { "Url"};
List<String[]> values = new ArrayList<String[]>();
Collection<HostEntry> hostEntries = NavigationHistory.getInstance().getRecentHostEntries(100);
for (HostEntry entry : hostEntries) {
values.add(new String[] { entry.getHost() });
}
JTable jtable = new JTable(values.toArray(new Object[][] {}), columnNames);
rowSorter = new TableRowSorter<>(jtable.getModel());
jtable.setRowSorter(rowSorter);
jtable.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
Point p = e.getPoint();
int rowNumber = jtable.rowAtPoint(p);
String[] vals = values.get(rowNumber);
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem item = new JMenuItem("Open link in new window");
item.setIcon(IconFactory.getInstance().getIcon(SEARCH));
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
window.getTopFrame().open(new URL("http://" + vals[0]), "GET", null, "window", null);
} catch (MalformedURLException mfu) {
throw new IllegalStateException("not expected", mfu);
}
}
});
popupMenu.add(item);
jtable.setComponentPopupMenu(popupMenu);
}
}
@Override
public void mouseReleased(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseClicked(MouseEvent arg0) {}
});
return new JScrollPane(jtable);
}
}