PageRenderTime 42ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-5-pre1/org/gjt/sp/jedit/gui/LogViewer.java

#
Java | 560 lines | 456 code | 54 blank | 50 comment | 49 complexity | d4a1aced8fc1618ffeaaa09a984996ef MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * LogViewer.java
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 1999, 2004 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.gui;
  23. //{{{ Imports
  24. import java.awt.*;
  25. import java.awt.event.*;
  26. import javax.swing.*;
  27. import javax.swing.border.EmptyBorder;
  28. import javax.swing.event.*;
  29. import org.gjt.sp.jedit.*;
  30. import org.gjt.sp.jedit.EditBus.EBHandler;
  31. import org.gjt.sp.jedit.msg.PropertiesChanged;
  32. import org.gjt.sp.util.Log;
  33. import org.gjt.sp.util.ThreadUtilities;
  34. //}}}
  35. /**
  36. * @version $Id: LogViewer.java 19134 2010-12-14 16:21:58Z daleanson $
  37. */
  38. public class LogViewer extends JPanel implements DefaultFocusComponent
  39. {
  40. //{{{ LogViewer constructor
  41. public LogViewer()
  42. {
  43. super(new BorderLayout());
  44. setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0));
  45. JPanel caption = new JPanel();
  46. caption.setLayout(new BoxLayout(caption,BoxLayout.X_AXIS));
  47. caption.setBorder(new EmptyBorder(6, 0, 6, 0));
  48. String settingsDirectory = jEdit.getSettingsDirectory();
  49. if(settingsDirectory != null)
  50. {
  51. String[] args = { MiscUtilities.constructPath(
  52. settingsDirectory, "activity.log") };
  53. JLabel label = new JLabel(jEdit.getProperty(
  54. "log-viewer.caption",args));
  55. caption.add(label);
  56. }
  57. caption.add(Box.createHorizontalGlue());
  58. tailIsOn = jEdit.getBooleanProperty("log-viewer.tail", false);
  59. tail = new JCheckBox(
  60. jEdit.getProperty("log-viewer.tail.label"),tailIsOn);
  61. tail.addActionListener(new ActionHandler());
  62. filter = new JTextField();
  63. filter.getDocument().addDocumentListener(new DocumentListener()
  64. {
  65. @Override
  66. public void changedUpdate(DocumentEvent e)
  67. {
  68. setFilter();
  69. }
  70. @Override
  71. public void insertUpdate(DocumentEvent e)
  72. {
  73. setFilter();
  74. }
  75. @Override
  76. public void removeUpdate(DocumentEvent e)
  77. {
  78. setFilter();
  79. }
  80. });
  81. caption.add(filter);
  82. caption.add(tail);
  83. caption.add(Box.createHorizontalStrut(12));
  84. copy = new JButton(jEdit.getProperty("log-viewer.copy"));
  85. copy.addActionListener(new ActionHandler());
  86. caption.add(copy);
  87. caption.add(Box.createHorizontalStrut(6));
  88. JButton settings = new JButton(jEdit.getProperty("log-viewer.settings.label"));
  89. settings.addActionListener(new ActionListener()
  90. {
  91. @Override
  92. public void actionPerformed(ActionEvent ae)
  93. {
  94. new LogSettings();
  95. }
  96. });
  97. caption.add(settings);
  98. ListModel model = Log.getLogListModel();
  99. listModel = new MyFilteredListModel(model);
  100. // without this, listModel is held permanently in model.
  101. // See addNotify() and removeNotify(), and constructor of
  102. // FilteredListModel.
  103. model.removeListDataListener(listModel);
  104. list = new LogList(listModel);
  105. listModel.setList(list);
  106. setFilter();
  107. add(BorderLayout.NORTH,caption);
  108. JScrollPane scroller = new JScrollPane(list);
  109. Dimension dim = scroller.getPreferredSize();
  110. dim.width = Math.min(600,dim.width);
  111. scroller.setPreferredSize(dim);
  112. add(BorderLayout.CENTER,scroller);
  113. propertiesChanged();
  114. } //}}}
  115. //{{{ setBounds() method
  116. @Override
  117. public void setBounds(int x, int y, int width, int height)
  118. {
  119. list.setCellRenderer( new ColorizerCellRenderer() );
  120. super.setBounds(x, y, width, height);
  121. scrollLaterIfRequired();
  122. } //}}}
  123. //{{{ handlePropertiesChanged() method
  124. @EBHandler
  125. public void handlePropertiesChanged(PropertiesChanged msg)
  126. {
  127. propertiesChanged();
  128. } //}}}
  129. //{{{ addNotify() method
  130. @Override
  131. public void addNotify()
  132. {
  133. super.addNotify();
  134. ListModel model = Log.getLogListModel();
  135. model.addListDataListener(listModel);
  136. model.addListDataListener(listHandler = new ListHandler());
  137. if(tailIsOn)
  138. scrollToTail();
  139. EditBus.addToBus(this);
  140. } //}}}
  141. //{{{ removeNotify() method
  142. @Override
  143. public void removeNotify()
  144. {
  145. super.removeNotify();
  146. ListModel model = Log.getLogListModel();
  147. model.removeListDataListener(listModel);
  148. model.removeListDataListener(listHandler);
  149. listHandler = null;
  150. EditBus.removeFromBus(this);
  151. } //}}}
  152. //{{{ focusOnDefaultComponent() method
  153. @Override
  154. public void focusOnDefaultComponent()
  155. {
  156. list.requestFocus();
  157. } //}}}
  158. //{{{ Private members
  159. private ListHandler listHandler;
  160. private final FilteredListModel<ListModel> listModel;
  161. private final JList list;
  162. private final JButton copy;
  163. private final JCheckBox tail;
  164. private final JTextField filter;
  165. private boolean tailIsOn;
  166. private static boolean showDebug = jEdit.getBooleanProperty("log-viewer.message.debug", true);
  167. private static boolean showMessage = jEdit.getBooleanProperty("log-viewer.message.message", true);
  168. private static boolean showNotice = jEdit.getBooleanProperty("log-viewer.message.notice", true);
  169. private static boolean showWarning = jEdit.getBooleanProperty("log-viewer.message.warning", true);
  170. private static boolean showError = jEdit.getBooleanProperty("log-viewer.message.error", true);
  171. //{{{ setFilter() method
  172. private void setFilter()
  173. {
  174. String toFilter = filter.getText();
  175. listModel.setFilter(toFilter.length() == 0 ? " " : toFilter);
  176. scrollLaterIfRequired();
  177. } //}}}
  178. //{{{ propertiesChanged() method
  179. private void propertiesChanged()
  180. {
  181. list.setFont(jEdit.getFontProperty("view.font"));
  182. list.setFixedCellHeight(list.getFontMetrics(list.getFont())
  183. .getHeight());
  184. } //}}}
  185. //{{{ scrollToTail() method
  186. /** Scroll to the tail of the logs. */
  187. private void scrollToTail()
  188. {
  189. int index = list.getModel().getSize();
  190. if(index != 0)
  191. list.ensureIndexIsVisible(index - 1);
  192. } //}}}
  193. //{{{ scrollLaterIfRequired() method
  194. private void scrollLaterIfRequired()
  195. {
  196. if (tailIsOn)
  197. ThreadUtilities.runInDispatchThread(new Runnable()
  198. {
  199. @Override
  200. public void run()
  201. {
  202. scrollToTail();
  203. }
  204. });
  205. } //}}}
  206. //}}}
  207. //{{{ ActionHandler class
  208. private class ActionHandler implements ActionListener
  209. {
  210. @Override
  211. public void actionPerformed(ActionEvent e)
  212. {
  213. Object src = e.getSource();
  214. if(src == tail)
  215. {
  216. tailIsOn = !tailIsOn;
  217. jEdit.setBooleanProperty("log-viewer.tail",tailIsOn);
  218. if(tailIsOn)
  219. {
  220. scrollToTail();
  221. }
  222. }
  223. else if(src == copy)
  224. {
  225. StringBuilder buf = new StringBuilder();
  226. Object[] selected = list.getSelectedValues();
  227. if(selected != null && selected.length != 0)
  228. {
  229. for(int i = 0; i < selected.length; i++)
  230. {
  231. buf.append(selected[i]);
  232. buf.append('\n');
  233. }
  234. }
  235. else
  236. {
  237. ListModel model = list.getModel();
  238. for(int i = 0; i < model.getSize(); i++)
  239. {
  240. buf.append(model.getElementAt(i));
  241. buf.append('\n');
  242. }
  243. }
  244. Registers.setRegister('$',buf.toString());
  245. }
  246. }
  247. } //}}}
  248. //{{{ ListHandler class
  249. private class ListHandler implements ListDataListener
  250. {
  251. @Override
  252. public void intervalAdded(ListDataEvent e)
  253. {
  254. contentsChanged(e);
  255. }
  256. @Override
  257. public void intervalRemoved(ListDataEvent e)
  258. {
  259. contentsChanged(e);
  260. }
  261. @Override
  262. public void contentsChanged(ListDataEvent e)
  263. {
  264. scrollLaterIfRequired();
  265. }
  266. } //}}}
  267. //{{{ LogList class
  268. private class LogList extends JList
  269. {
  270. LogList(ListModel model)
  271. {
  272. super(model);
  273. setVisibleRowCount(24);
  274. getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
  275. setAutoscrolls(true);
  276. }
  277. @Override
  278. public void processMouseEvent(MouseEvent evt)
  279. {
  280. if(evt.getID() == MouseEvent.MOUSE_PRESSED)
  281. {
  282. startIndex = list.locationToIndex(evt.getPoint());
  283. }
  284. super.processMouseEvent(evt);
  285. }
  286. @Override
  287. public void processMouseMotionEvent(MouseEvent evt)
  288. {
  289. if(evt.getID() == MouseEvent.MOUSE_DRAGGED)
  290. {
  291. int row = list.locationToIndex(evt.getPoint());
  292. if(row != -1)
  293. {
  294. if(startIndex == -1)
  295. {
  296. list.setSelectionInterval(row,row);
  297. startIndex = row;
  298. }
  299. else
  300. list.setSelectionInterval(startIndex,row);
  301. list.ensureIndexIsVisible(row);
  302. evt.consume();
  303. }
  304. }
  305. else
  306. super.processMouseMotionEvent(evt);
  307. }
  308. private int startIndex;
  309. } //}}}
  310. //{{{ ColorizerCellRenderer class
  311. private static class ColorizerCellRenderer extends JLabel implements ListCellRenderer
  312. {
  313. // This is the only method defined by ListCellRenderer.
  314. // We just reconfigure the JLabel each time we're called.
  315. @Override
  316. public Component getListCellRendererComponent(
  317. JList list,
  318. Object value, // value to display
  319. int index, // cell index
  320. boolean isSelected, // is the cell selected
  321. boolean cellHasFocus ) // the list and the cell have the focus
  322. {
  323. String s = value.toString();
  324. setText(s);
  325. if (isSelected)
  326. {
  327. setBackground(list.getSelectionBackground());
  328. setForeground(list.getSelectionForeground());
  329. }
  330. else
  331. {
  332. setBackground(list.getBackground());
  333. Color color = list.getForeground();
  334. if (s.contains("[debug]"))
  335. {
  336. color = jEdit.getColorProperty("log-viewer.message.debug.color", Color.BLUE);
  337. }
  338. else if (s.contains("[message]"))
  339. {
  340. color = jEdit.getColorProperty("log-viewer.message.message.color", Color.BLACK);
  341. }
  342. else if (s.contains("[notice]"))
  343. {
  344. color = jEdit.getColorProperty("log-viewer.message.notice.color", Color.GREEN);
  345. }
  346. else if (s.contains("[warning]"))
  347. {
  348. color = jEdit.getColorProperty("log-viewer.message.warning.color", Color.ORANGE);
  349. }
  350. else if (s.contains("[error]"))
  351. {
  352. color = jEdit.getColorProperty("log-viewer.message.error.color", Color.RED);
  353. }
  354. setForeground( color );
  355. }
  356. setEnabled( list.isEnabled() );
  357. setFont( list.getFont() );
  358. setOpaque( true );
  359. return this;
  360. }
  361. } //}}}
  362. //{{{ MyFilteredListModel
  363. private static class MyFilteredListModel extends FilteredListModel<ListModel>
  364. {
  365. MyFilteredListModel(ListModel model)
  366. {
  367. super(model);
  368. }
  369. @Override
  370. public String prepareFilter(String filter)
  371. {
  372. return filter.toLowerCase();
  373. }
  374. @Override
  375. public boolean passFilter(int row, String filter)
  376. {
  377. String text = delegated.getElementAt(row).toString().toLowerCase();
  378. if (text.contains("[debug]") && !showDebug)
  379. return false;
  380. if (text.contains("[message]") && !showMessage)
  381. return false;
  382. if (text.contains("[notice]") && !showNotice)
  383. return false;
  384. if (text.contains("[warning]") && !showWarning)
  385. return false;
  386. if (text.contains("[error]") && !showError)
  387. return false;
  388. return filter.length() == 0 || text.contains(filter);
  389. }
  390. } //}}}
  391. //{{{ LogSettings dialog
  392. private class LogSettings extends JDialog
  393. {
  394. LogSettings()
  395. {
  396. super(jEdit.getActiveView(), jEdit.getProperty("log-viewer.dialog.title"));
  397. AbstractOptionPane pane = new AbstractOptionPane(jEdit.getProperty("log-viewer.settings.label"))
  398. {
  399. @Override
  400. protected void _init()
  401. {
  402. setBorder(BorderFactory.createEmptyBorder(11, 11, 12, 12));
  403. maxLines = new JSpinner(new SpinnerNumberModel(jEdit.getIntegerProperty("log-viewer.maxlines", 500), 500, Integer.MAX_VALUE, 1));
  404. addComponent(jEdit.getProperty("log-viewer.maxlines.label", "Max lines"),
  405. maxLines,
  406. GridBagConstraints.REMAINDER);
  407. addComponent(Box.createVerticalStrut(11));
  408. debug = new JCheckBox(jEdit.getProperty("log-viewer.message.debug.label", "Debug"),
  409. jEdit.getBooleanProperty("log-viewer.message.debug", true));
  410. message = new JCheckBox(jEdit.getProperty("log-viewer.message.message.label", "Message"),
  411. jEdit.getBooleanProperty("log-viewer.message.message", true));
  412. notice = new JCheckBox(jEdit.getProperty("log-viewer.message.notice.label", "Notice"),
  413. jEdit.getBooleanProperty("log-viewer.message.notice", true));
  414. warning = new JCheckBox(jEdit.getProperty("log-viewer.message.warning.label", "Warning"),
  415. jEdit.getBooleanProperty("log-viewer.message.warning", true));
  416. error = new JCheckBox(jEdit.getProperty("log-viewer.message.error.label", "Error"),
  417. jEdit.getBooleanProperty("log-viewer.message.error", true));
  418. addComponent(new JLabel(jEdit.getProperty("log-viewer.message.label", "Message Display:")));
  419. addComponent(debug,
  420. debugColor = new ColorWellButton(
  421. jEdit.getColorProperty("log-viewer.message.debug.color", Color.BLUE)),
  422. GridBagConstraints.REMAINDER);
  423. addComponent(message,
  424. messageColor = new ColorWellButton(
  425. jEdit.getColorProperty("log-viewer.message.message.color", Color.GREEN)),
  426. GridBagConstraints.REMAINDER);
  427. addComponent(notice,
  428. noticeColor = new ColorWellButton(
  429. jEdit.getColorProperty("log-viewer.message.notice.color", Color.GREEN)),
  430. GridBagConstraints.REMAINDER);
  431. addComponent(warning,
  432. warningColor = new ColorWellButton(
  433. jEdit.getColorProperty("log-viewer.message.warning.color", Color.ORANGE)),
  434. GridBagConstraints.REMAINDER);
  435. addComponent(error,
  436. errorColor = new ColorWellButton(
  437. jEdit.getColorProperty("log-viewer.message.error.color", Color.RED)),
  438. GridBagConstraints.REMAINDER);
  439. addComponent(Box.createVerticalStrut(11));
  440. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
  441. JButton okButton = new JButton(jEdit.getProperty("common.ok"));
  442. okButton.addActionListener(new ActionListener()
  443. {
  444. @Override
  445. public void actionPerformed(ActionEvent ae)
  446. {
  447. save();
  448. LogSettings.this.setVisible(false);
  449. LogSettings.this.dispose();
  450. }
  451. });
  452. JButton cancelButton = new JButton(jEdit.getProperty("common.cancel"));
  453. cancelButton.addActionListener(new ActionListener()
  454. {
  455. @Override
  456. public void actionPerformed(ActionEvent ae)
  457. {
  458. LogSettings.this.setVisible(false);
  459. LogSettings.this.dispose();
  460. }
  461. });
  462. buttonPanel.add(okButton);
  463. buttonPanel.add(cancelButton);
  464. addComponent(buttonPanel, GridBagConstraints.HORIZONTAL);
  465. }
  466. @Override
  467. protected void _save()
  468. {
  469. jEdit.setIntegerProperty("log-viewer.maxlines", ((SpinnerNumberModel)maxLines.getModel()).getNumber().intValue());
  470. showDebug = debug.isSelected();
  471. jEdit.setBooleanProperty("log-viewer.message.debug", showDebug);
  472. showMessage = message.isSelected();
  473. jEdit.setBooleanProperty("log-viewer.message.message", showMessage);
  474. showNotice = notice.isSelected();
  475. jEdit.setBooleanProperty("log-viewer.message.notice", showNotice);
  476. showWarning = warning.isSelected();
  477. jEdit.setBooleanProperty("log-viewer.message.warning", showWarning);
  478. showError = error.isSelected();
  479. jEdit.setBooleanProperty("log-viewer.message.error", showError);
  480. jEdit.setColorProperty("log-viewer.message.debug.color", debugColor.getSelectedColor());
  481. jEdit.setColorProperty("log-viewer.message.message.color", messageColor.getSelectedColor());
  482. jEdit.setColorProperty("log-viewer.message.notice.color", noticeColor.getSelectedColor());
  483. jEdit.setColorProperty("log-viewer.message.warning.color", warningColor.getSelectedColor());
  484. jEdit.setColorProperty("log-viewer.message.error.color", errorColor.getSelectedColor());
  485. setFilter();
  486. }
  487. };
  488. setContentPane(pane);
  489. pane.init();
  490. pack();
  491. setLocationRelativeTo(LogViewer.this);
  492. setVisible(true);
  493. }
  494. private JSpinner maxLines;
  495. private JCheckBox debug;
  496. private JCheckBox message;
  497. private JCheckBox notice;
  498. private JCheckBox warning;
  499. private JCheckBox error;
  500. private ColorWellButton debugColor;
  501. private ColorWellButton messageColor;
  502. private ColorWellButton noticeColor;
  503. private ColorWellButton warningColor;
  504. private ColorWellButton errorColor;
  505. } //}}}
  506. }