package com.limegroup.gnutella.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.gui.themes.ThemeFileHandler;
import com.limegroup.gnutella.gui.themes.ThemeMediator;
import com.limegroup.gnutella.gui.themes.ThemeObserver;
import com.limegroup.gnutella.settings.QuestionsHandler;
import com.limegroup.gnutella.settings.UISettings;
/**
* Control the monitoring of Query Requests and present the requests
* to the user.
*/
public class MonitorView extends JPanel implements ThemeObserver {
// Components on this panel
private JCheckBox showQueriesCheckBox;
private JTextField listSizeTextField;
private JList listOfQueries;
private JScrollPane scrollPane;
private int listFixedSize;
private static final int LIST_FIXED_SIZE_DEFAULT = 32;
private boolean bypassCountChange = false;
private BufferListModel model = new BufferListModel(LIST_FIXED_SIZE_DEFAULT);
/**
* Creates a new MonitorView, which is the GUI component that allows
* the user to control the monitoring of incoming search queries.
*/
public MonitorView() {
GUIMediator.setSplashScreenString(
GUIMediator.getStringResource("SPLASH_STATUS_MONITOR_WINDOW"));
// Create the controls
int pad = GUIConstants.SEPARATOR;
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.X_AXIS));
// Create the "Show" check box
showQueriesCheckBox = new JCheckBox(GUIMediator.getStringResource("MONITOR_VIEW_INCOMING_SEARCHES"));
showQueriesCheckBox.setPreferredSize(new Dimension(200, 20));
showQueriesCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (listOfQueries != null)
listOfQueries.setEnabled(showQueriesCheckBox.isSelected());
if (listSizeTextField != null)
listSizeTextField.setEnabled(showQueriesCheckBox.isSelected());
// Uncomment this line to persist the value of the "Show" check box.
// UISettings.UI_MONITOR_SHOW_INCOMING_SEARCHES.setValue(showQueriesCheckBox.isSelected());
if (e.getStateChange() == ItemEvent.SELECTED && RouterService.isShieldedLeaf()) {
GUIMediator.showMessage("MONITOR_VIEW_LEAF_MESSAGE", QuestionsHandler.MONITOR_VIEW);
}
}
});
showQueriesCheckBox.setSelected(UISettings.UI_MONITOR_SHOW_INCOMING_SEARCHES.getValue());
controlPanel.add(showQueriesCheckBox);
controlPanel.add(Box.createHorizontalGlue());
controlPanel.add(new JLabel(GUIMediator.getStringResource("MONITOR_VIEW_SHOW_LAST")));
controlPanel.add(Box.createHorizontalStrut(pad / 2));
// Create the list size check box
listFixedSize = LIST_FIXED_SIZE_DEFAULT;
listSizeTextField = new WholeNumberField(listFixedSize, 3);
Dimension d = new Dimension(16, 24);
listSizeTextField.setPreferredSize(d);
listSizeTextField.setMaximumSize(d);
listSizeTextField.setEnabled(showQueriesCheckBox.isSelected());
listSizeTextField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
handleCountChange();
}
public void removeUpdate(DocumentEvent e) {
handleCountChange();
}
public void changedUpdate(DocumentEvent e) {
}
});
controlPanel.add(listSizeTextField);
controlPanel.add(Box.createHorizontalStrut(pad / 2));
controlPanel.add(new JLabel(GUIMediator.getStringResource("MONITOR_VIEW_SEARCHES")));
// Create the list inside a scroll pane, and trigger search on double-click
listOfQueries = new JList(model);
listOfQueries.setPrototypeCellValue(" ");
listOfQueries.setFixedCellHeight(16);
listOfQueries.setEnabled(showQueriesCheckBox.isSelected());
listOfQueries.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() >= 2) {
int index = listOfQueries.locationToIndex(e.getPoint());
if(index != -1) {
String str = (String)model.getElementAt(index);
GUIMediator.instance().triggerSearch(str);
}
}
}
});
scrollPane = new JScrollPane(listOfQueries);
scrollPane.setPreferredSize(new Dimension(340, 180));
// Add control panel and scroll pane to this
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(pad, pad, pad, pad);
gbc.gridy = 0;
add(controlPanel, gbc);
gbc.gridy = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(0, pad, pad, pad);
add(scrollPane, gbc);
updateTheme();
ThemeMediator.addThemeObserver(this);
}
/**
* Updates the appearance of this panel based on the current theme.
*/
public void updateTheme() {
Color tableColor = ThemeFileHandler.TABLE_BACKGROUND_COLOR.getValue();
scrollPane.getViewport().setBackground(tableColor);
listOfQueries.setBackground(tableColor);
}
/**
* The user has changed the desired list size, so enact the change.
*/
private void handleCountChange() {
if(bypassCountChange)
return;
String val = listSizeTextField.getText();
if(val != null && !val.equals("")) {
int size = Integer.parseInt(val);
if(size > 1000) {
// need to set the count outside the document listener
listFixedSize = LIST_FIXED_SIZE_DEFAULT;
Runnable runner = new Runnable() {
public void run() {
bypassCountChange = true;
listSizeTextField.setText(String.valueOf(listFixedSize));
bypassCountChange = false;
}
};
SwingUtilities.invokeLater(runner);
} else {
listFixedSize = size;
}
model.changeSize(listFixedSize);
scrollPane.validate();
}
}
/**
* Receives a given query string, <tt>query</tt>, and presents
* the query string to the user if queries are being shown.
*/
public void handleQueryString(String query) {
if(!showQueriesCheckBox.isSelected())
return;
if(query.length() == 0)
return;
char c = query.charAt(query.length() - 1);
if (Character.isISOControl(c) || !Character.isDefined(c)) {
query = query.substring(0, query.length() - 1);
}
model.addFirst(query);
}
}