PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

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

#
Java | 406 lines | 310 code | 49 blank | 47 comment | 57 complexity | 0a04ef36e5cd8df19c04a4bfb5a7642b 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. * RegisterViewer.java - Dockable view of register contents
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2004, 2005 Nicholas O'Leary
  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.Registers.Register;
  32. import org.gjt.sp.jedit.msg.RegisterChanged;
  33. import org.gjt.sp.jedit.msg.PropertiesChanged;
  34. //}}}
  35. public class RegisterViewer extends JPanel implements ActionListener,
  36. DockableWindow
  37. {
  38. //{{{ RegisterViewer constructor
  39. public RegisterViewer(View view, String position)
  40. {
  41. super(new BorderLayout());
  42. this.view = view;
  43. Box toolBar = new Box(BoxLayout.X_AXIS);
  44. JLabel label = new JLabel(
  45. jEdit.getProperty("view-registers.title"));
  46. label.setBorder(new EmptyBorder(0,0,3,0));
  47. toolBar.add(label);
  48. toolBar.add(Box.createGlue());
  49. RolloverButton pasteRegister = new RolloverButton(
  50. GUIUtilities.loadIcon("Paste.png"));
  51. pasteRegister.setToolTipText(GUIUtilities.prettifyMenuLabel(
  52. jEdit.getProperty("paste-string-register.label")));
  53. pasteRegister.addActionListener(this);
  54. pasteRegister.setActionCommand("paste-string-register");
  55. toolBar.add(pasteRegister);
  56. RolloverButton clearRegister = new RolloverButton(
  57. GUIUtilities.loadIcon("Clear.png"));
  58. clearRegister.setToolTipText(GUIUtilities.prettifyMenuLabel(
  59. jEdit.getProperty("clear-string-register.label")));
  60. clearRegister.addActionListener(this);
  61. clearRegister.setActionCommand("clear-string-register");
  62. toolBar.add(clearRegister);
  63. add(BorderLayout.NORTH,toolBar);
  64. DefaultListModel registerModel = new DefaultListModel();
  65. registerList = new JList(registerModel);
  66. registerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  67. registerList.setCellRenderer(new Renderer());
  68. registerList.addListSelectionListener(new ListHandler());
  69. registerList.addMouseListener(new MouseHandler());
  70. contentTextArea = new JTextArea(10,20);
  71. contentTextArea.setEditable(true);
  72. documentHandler = new DocumentHandler();
  73. //contentTextArea.getDocument().addDocumentListener(documentHandler);
  74. contentTextArea.addFocusListener(new FocusHandler());
  75. int orientation = JSplitPane.HORIZONTAL_SPLIT;
  76. if (position.equals(DockableWindowManager.LEFT) ||
  77. position.equals(DockableWindowManager.RIGHT))
  78. orientation = JSplitPane.VERTICAL_SPLIT;
  79. add(BorderLayout.CENTER,splitPane = new JSplitPane(orientation,
  80. jEdit.getBooleanProperty("appearance.continuousLayout"),
  81. new JScrollPane(registerList),
  82. new JScrollPane(contentTextArea)));
  83. refreshList();
  84. } //}}}
  85. //{{{ actionPerformed() method
  86. public void actionPerformed(ActionEvent evt)
  87. {
  88. String cmd = evt.getActionCommand();
  89. if (cmd.equals("paste-string-register"))
  90. insertRegister();
  91. else if (cmd.equals("clear-string-register"))
  92. clearSelectedIndex();
  93. } //}}}
  94. //{{{ handleRegisterChanged() method
  95. @EBHandler
  96. public void handleRegisterChanged(RegisterChanged msg)
  97. {
  98. if (msg.getRegisterName() != '%')
  99. refreshList();
  100. } //}}}
  101. //{{{ handlePropertiesChanged
  102. @EBHandler
  103. public void handlePropertiesChanged(PropertiesChanged msg)
  104. {
  105. GUIUtilities.initContinuousLayout(splitPane);
  106. } //}}}
  107. //{{{ addNotify() method
  108. @Override
  109. public void addNotify()
  110. {
  111. super.addNotify();
  112. EditBus.addToBus(this);
  113. } //}}}
  114. //{{{ removeNotify() method
  115. @Override
  116. public void removeNotify()
  117. {
  118. super.removeNotify();
  119. EditBus.removeFromBus(this);
  120. } //}}}
  121. //{{{ move() method
  122. public void move(String newPosition)
  123. {
  124. int orientation = JSplitPane.HORIZONTAL_SPLIT;
  125. if (newPosition.equals(DockableWindowManager.LEFT) ||
  126. newPosition.equals(DockableWindowManager.RIGHT))
  127. orientation = JSplitPane.VERTICAL_SPLIT;
  128. splitPane.setOrientation(orientation);
  129. revalidate();
  130. } //}}}
  131. //{{{ Private members
  132. //{{{ clearSelectedIndex() method
  133. private void clearSelectedIndex()
  134. {
  135. Object o = registerList.getSelectedValue();
  136. if (o != null && o instanceof Character)
  137. {
  138. Registers.clearRegister(((Character)o).charValue());
  139. refreshList();
  140. }
  141. } //}}}
  142. //{{{ Instance variables
  143. private JList registerList;
  144. private JTextArea contentTextArea;
  145. private DocumentHandler documentHandler;
  146. private View view;
  147. private boolean editing;
  148. private JSplitPane splitPane;
  149. private JPopupMenu popup;
  150. //}}}
  151. //{{{ refreshList
  152. private void refreshList()
  153. {
  154. DefaultListModel registerModel = (DefaultListModel)registerList.getModel();
  155. Object o = registerList.getSelectedValue();
  156. int selected = -1;
  157. if (o != null && o instanceof Character)
  158. selected = ((Character)o).charValue();
  159. registerModel.removeAllElements();
  160. Registers.Register[] registers = Registers.getRegisters();
  161. int index = 0;
  162. for(int i = 0; i < registers.length; i++)
  163. {
  164. Registers.Register reg = registers[i];
  165. if(reg == null)
  166. continue;
  167. if (i == '%')
  168. continue;
  169. String value = reg.toString();
  170. if(value == null) // || value.length() == 0)
  171. continue;
  172. if (i == selected)
  173. index = registerModel.size();
  174. registerModel.addElement(Character.valueOf((char)i));
  175. }
  176. if(registerModel.getSize() == 0)
  177. {
  178. registerModel.addElement(jEdit.getProperty("view-registers.none"));
  179. registerList.setEnabled(false);
  180. }
  181. else
  182. registerList.setEnabled(true);
  183. registerList.setSelectedIndex(index);
  184. } //}}}
  185. //{{{ insertRegister
  186. private void insertRegister()
  187. {
  188. Object o = registerList.getSelectedValue();
  189. if (o == null || !(o instanceof Character))
  190. return;
  191. Registers.Register reg = Registers.getRegister(((Character)o).charValue());
  192. view.getTextArea().setSelectedText(reg.toString());
  193. view.getTextArea().requestFocus();
  194. } //}}}
  195. //}}}
  196. //{{{ Inner classes
  197. //{{{ Renderer Class
  198. static class Renderer extends DefaultListCellRenderer
  199. {
  200. @Override
  201. public Component getListCellRendererComponent(
  202. JList list, Object value, int index,
  203. boolean isSelected, boolean cellHasFocus)
  204. {
  205. super.getListCellRendererComponent(list,value,
  206. index,isSelected,cellHasFocus);
  207. if(value instanceof Character)
  208. {
  209. char name = ((Character)value).charValue();
  210. String label;
  211. if(name == '\n')
  212. label = "\n";
  213. else if(name == '\t')
  214. label = "\t";
  215. else if(name == '$')
  216. label = jEdit.getProperty("view-registers.clipboard");
  217. else if(name == '%')
  218. label = jEdit.getProperty("view-registers.selection");
  219. else
  220. label = String.valueOf(name);
  221. Register register = Registers.getRegister(name);
  222. String registerValue;
  223. if (register == null)
  224. {
  225. // The register is not defined anymore, it has been removed before
  226. // the painting event
  227. registerValue = jEdit.getProperty("view-registers.undefined");
  228. }
  229. else
  230. {
  231. registerValue = register.toString();
  232. if (registerValue.length() > 100)
  233. registerValue = registerValue.substring(0,100)+"...";
  234. registerValue = registerValue.replaceAll("\n"," ");
  235. registerValue = registerValue.replaceAll("\t"," ");
  236. }
  237. setText(label + " : " + registerValue);
  238. }
  239. return this;
  240. }
  241. } //}}}
  242. //{{{ ListHandler Class
  243. class ListHandler implements ListSelectionListener
  244. {
  245. public void valueChanged(ListSelectionEvent evt)
  246. {
  247. Object value = registerList.getSelectedValue();
  248. if(!(value instanceof Character))
  249. {
  250. if (!editing)
  251. {
  252. contentTextArea.setText("");
  253. contentTextArea.setEditable(false);
  254. }
  255. return;
  256. }
  257. char name = ((Character)value).charValue();
  258. Registers.Register reg = Registers.getRegister(name);
  259. if(reg == null)
  260. {
  261. if (!editing)
  262. {
  263. contentTextArea.setText("");
  264. contentTextArea.setEditable(false);
  265. }
  266. return;
  267. }
  268. if (!editing)
  269. {
  270. contentTextArea.setText(reg.toString());
  271. contentTextArea.setEditable(true);
  272. contentTextArea.setCaretPosition(0);
  273. }
  274. }
  275. } //}}}
  276. //{{{ MouseHandler Class
  277. class MouseHandler extends MouseAdapter
  278. {
  279. @Override
  280. public void mouseClicked(MouseEvent evt)
  281. {
  282. int i = registerList.locationToIndex(evt.getPoint());
  283. if (i != -1)
  284. registerList.setSelectedIndex(i);
  285. if (GUIUtilities.isPopupTrigger(evt))
  286. {
  287. if (popup == null)
  288. {
  289. popup = new JPopupMenu();
  290. JMenuItem item = GUIUtilities.loadMenuItem("paste");
  291. popup.add(item);
  292. item = new JMenuItem(jEdit.getProperty("clear-string-register.label"));
  293. item.addActionListener(new ActionListener()
  294. {
  295. public void actionPerformed(ActionEvent e)
  296. {
  297. clearSelectedIndex();
  298. }
  299. });
  300. popup.add(item);
  301. }
  302. GUIUtilities.showPopupMenu(popup, registerList, evt.getX(), evt.getY(), false);
  303. }
  304. else if (evt.getClickCount() % 2 == 0)
  305. insertRegister();
  306. }
  307. } //}}}
  308. //{{{ DocumentHandler Class
  309. class DocumentHandler implements DocumentListener
  310. {
  311. public void changedUpdate(DocumentEvent e)
  312. {
  313. updateRegisterSafely();
  314. }
  315. public void insertUpdate(DocumentEvent e)
  316. {
  317. updateRegisterSafely();
  318. }
  319. public void removeUpdate(DocumentEvent e)
  320. {
  321. updateRegisterSafely();
  322. }
  323. private void updateRegisterSafely()
  324. {
  325. try
  326. {
  327. editing = true;
  328. updateRegister();
  329. }
  330. finally
  331. {
  332. editing = false;
  333. }
  334. }
  335. private void updateRegister()
  336. {
  337. Object value = registerList.getSelectedValue();
  338. if(!(value instanceof Character))
  339. return;
  340. char name = ((Character)value).charValue();
  341. Registers.setRegister(name,contentTextArea.getText());
  342. }
  343. } //}}}
  344. //{{{ FocusHandler Class
  345. class FocusHandler implements FocusListener
  346. {
  347. public void focusGained(FocusEvent e)
  348. {
  349. contentTextArea.getDocument().addDocumentListener(documentHandler);
  350. }
  351. public void focusLost(FocusEvent e)
  352. {
  353. contentTextArea.getDocument().removeDocumentListener(documentHandler);
  354. }
  355. }//}}}
  356. //}}}
  357. }