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

/bundles/plugins-trunk/TextTools/TextToolsSortControl.java

#
Java | 422 lines | 278 code | 53 blank | 91 comment | 19 complexity | 43d2f00e818d6f242a4a7d28c9a091d4 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. * TextToolsSortControl.java - sort options
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2002 Carmine Lucarelli
  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. //{{{ imports
  23. import javax.swing.*;
  24. import javax.swing.table.*;
  25. import javax.swing.border.*;
  26. import java.awt.*;
  27. import java.awt.event.*;
  28. import java.util.Iterator;
  29. import org.gjt.sp.jedit.*;
  30. import org.gjt.sp.util.Log;
  31. import org.gjt.sp.jedit.textarea.JEditTextArea;
  32. import org.gjt.sp.jedit.gui.EnhancedDialog;
  33. //}}}
  34. /**
  35. * An option dialog for JSort options.
  36. * @author Carmine Lucarelli
  37. */
  38. public class TextToolsSortControl extends EnhancedDialog implements ActionListener
  39. {
  40. //{{{ TextToolsSortControl constructor
  41. /**
  42. * Constructor. Sets up and shows the GUI
  43. */
  44. public TextToolsSortControl(View view, JEditTextArea textArea, java.util.List data, boolean selection)
  45. {
  46. super(view, jEdit.getProperty("text-tools.sortcontrol.label"), false);
  47. this.view = view;
  48. this.textArea = textArea;
  49. this.data = data;
  50. this.selection = selection;
  51. view.showWaitCursor();
  52. sortTableModel = new SortTableModel();
  53. sortTable = new JTable(sortTableModel);
  54. TableColumnModel cMod = sortTable.getColumnModel();
  55. sortTable.setTableHeader((new SortTableHeader(cMod)));
  56. sortTable.setRowHeight(25);
  57. sortTable.setPreferredScrollableViewportSize(new Dimension(430, 200));
  58. JScrollPane scroll = new JScrollPane(sortTable);
  59. JPanel content = new JPanel(new BorderLayout());
  60. content.setBorder(new EmptyBorder(5,8,8,8));
  61. content.setLayout(new BorderLayout());
  62. setContentPane(content);
  63. content.add(scroll, BorderLayout.CENTER);
  64. JPanel buttons = new JPanel();
  65. buttons.setBorder(new EmptyBorder(12,0,0,0));
  66. buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
  67. buttons.add(Box.createGlue());
  68. ok = new JButton(jEdit.getProperty("common.ok"));
  69. ok.addActionListener(this);
  70. buttons.add(ok);
  71. buttons.add(Box.createHorizontalStrut(6));
  72. getRootPane().setDefaultButton(ok);
  73. cancel = new JButton(jEdit.getProperty("common.cancel"));
  74. cancel.addActionListener(this);
  75. buttons.add(cancel);
  76. buttons.add(Box.createHorizontalStrut(6));
  77. clear = new JButton("Clear");
  78. clear.addActionListener(this);
  79. buttons.add(clear);
  80. buttons.add(Box.createHorizontalStrut(6));
  81. help = new JButton("Help");
  82. help.addActionListener(this);
  83. buttons.add(help);
  84. buttons.add(Box.createHorizontalStrut(6));
  85. buttons.add(Box.createGlue());
  86. content.add(buttons, BorderLayout.SOUTH);
  87. dups = new JCheckBox("Delete Duplicate Entries: ");
  88. content.add(dups, BorderLayout.NORTH);
  89. view.hideWaitCursor();
  90. pack();
  91. GUIUtilities.loadGeometry(this, "texttools-sort-control");
  92. setLocationRelativeTo(view);
  93. setVisible(true);
  94. } //}}}
  95. //{{{ EnhancedDialog methods
  96. //{{{ ok() method
  97. public void ok()
  98. {
  99. ok(true);
  100. } //}}}
  101. //{{{ cancel() method
  102. public void cancel()
  103. {
  104. dispose();
  105. }//}}}
  106. //}}}
  107. //{{{ ok() method
  108. /**
  109. * run the sort
  110. */
  111. public void ok(boolean dispose)
  112. {
  113. jsort = new JSort(dups.isSelected());
  114. Log.log(Log.DEBUG, this, " delDups is set to " + dups.isSelected());
  115. for(int i = 0; i < 10; i++)
  116. {
  117. int start = ((Integer)sortTableModel.getValueAt(i, 0)).intValue();
  118. int end = ((Integer)sortTableModel.getValueAt(i, 1)).intValue();
  119. if(end == 0)
  120. {
  121. break;
  122. }
  123. boolean ascending = !((Boolean)sortTableModel.getValueAt(i, 2)).booleanValue();
  124. boolean ignoreCase = ((Boolean)sortTableModel.getValueAt(i, 3)).booleanValue();
  125. boolean textType = ((Boolean)sortTableModel.getValueAt(i, 4)).booleanValue();
  126. boolean trim = ((Boolean)sortTableModel.getValueAt(i, 5)).booleanValue();
  127. Log.log(Log.DEBUG, this, "Sort constraint: " + start + " " + end + " " + ascending
  128. + " " + ignoreCase + " " + textType + " " + trim);
  129. jsort.addSortConstraint(start, end, ascending, ignoreCase, textType, trim, false);
  130. }
  131. jsort.sort(data);
  132. Iterator iter = data.iterator();
  133. StringBuilder sb = new StringBuilder();
  134. while(iter.hasNext())
  135. {
  136. sb.append(iter.next()).append('\n');
  137. }
  138. sb.deleteCharAt(sb.length() - 1);
  139. if(selection)
  140. {
  141. textArea.setSelectedText(sb.toString());
  142. }
  143. else
  144. {
  145. textArea.setText(sb.toString());
  146. }
  147. GUIUtilities.saveGeometry(this, "texttools-sort-control");
  148. // get rid of this dialog if necessary
  149. if (dispose)
  150. dispose();
  151. } //}}}
  152. //{{{ actionPerformed() method
  153. public void actionPerformed(ActionEvent evt)
  154. {
  155. Object source = evt.getSource();
  156. if (source == ok)
  157. {
  158. ok();
  159. }
  160. else if (source == cancel)
  161. {
  162. cancel();
  163. }
  164. else if (source == clear)
  165. {
  166. sortTableModel.clear();
  167. }
  168. else if(source == help)
  169. {
  170. showHelp();
  171. }
  172. } //}}}
  173. //{{{ showHelp() method
  174. /**
  175. * Shows JSort help in the jEdit help viewer
  176. */
  177. private void showHelp()
  178. {
  179. java.net.URL helpUrl = TextToolsSortControl.class.getResource("TextTools.html");
  180. if (helpUrl == null)
  181. {
  182. Log.log(Log.NOTICE, this, "Help URL is null, cannot display help");
  183. }
  184. else
  185. {
  186. new org.gjt.sp.jedit.help.HelpViewer(helpUrl.toString());
  187. }
  188. } //}}}
  189. //{{{ SortTableModel class
  190. /**
  191. * Our table model
  192. */
  193. private class SortTableModel extends AbstractTableModel
  194. {
  195. //{{{ SortTableModel constructor
  196. public SortTableModel()
  197. {
  198. columnNames = new String[6];
  199. columnNames[0] = "Start";
  200. columnNames[1] = "End";
  201. columnNames[2] = "Desc";
  202. columnNames[3] = "ICase";
  203. columnNames[4] = "Numeric";
  204. columnNames[5] = "Trim";
  205. clear();
  206. } //}}}
  207. //{{{ clear() method
  208. public void clear()
  209. {
  210. startColumns = new int[10];
  211. endColumns = new int[10];
  212. ignoreCases = new boolean[10];
  213. directions = new boolean[10];
  214. types = new boolean[10];
  215. trims = new boolean[10];
  216. fireTableDataChanged();
  217. }//}}}
  218. //{{{ setValueAt() method
  219. public void setValueAt(Object value, int row, int col)
  220. {
  221. switch(col)
  222. {
  223. case 0:
  224. startColumns[row] = ((Integer)value).intValue();
  225. break;
  226. case 1:
  227. endColumns[row] = ((Integer)value).intValue();
  228. break;
  229. case 2:
  230. directions[row] = ((Boolean)value).booleanValue();
  231. break;
  232. case 3:
  233. ignoreCases[row] = ((Boolean)value).booleanValue();
  234. break;
  235. case 4:
  236. types[row] = ((Boolean)value).booleanValue();
  237. break;
  238. case 5:
  239. trims[row] = ((Boolean)value).booleanValue();
  240. break;
  241. }
  242. fireTableCellUpdated(row, col);
  243. } //}}}
  244. //{{{ getColumnCount() method
  245. public int getColumnCount()
  246. {
  247. return columnNames.length;
  248. }//}}}
  249. //{{{ getRowCount() method
  250. public int getRowCount()
  251. {
  252. return startColumns.length;
  253. } //}}}
  254. //{{{ getColumnName() method
  255. public String getColumnName(int col)
  256. {
  257. return columnNames[col];
  258. } //}}}
  259. //{{{ getValueAt() method
  260. public Object getValueAt(int row, int col)
  261. {
  262. switch(col)
  263. {
  264. case 0:
  265. return new Integer(startColumns[row]);
  266. case 1:
  267. return new Integer(endColumns[row]);
  268. case 2:
  269. return new Boolean(directions[row]);
  270. case 3:
  271. return new Boolean(ignoreCases[row]);
  272. case 4:
  273. return new Boolean(types[row]);
  274. case 5:
  275. return new Boolean(trims[row]);
  276. }
  277. return null;
  278. } //}}}
  279. //{{{ getColumnClass() method
  280. /**
  281. * JTable uses this method to determine the default renderer/
  282. * editor for each cell. If we didn't implement this method,
  283. * then the last column would contain text ("true"/"false"),
  284. * rather than a check box.
  285. */
  286. public Class getColumnClass(int c)
  287. {
  288. return getValueAt(0, c).getClass();
  289. } //}}}
  290. //{{{ isCellEditable() method
  291. /*
  292. * Don't need to implement this method unless your table's
  293. * editable.
  294. */
  295. public boolean isCellEditable(int row, int col)
  296. {
  297. return true;
  298. } //}}}
  299. //{{{ Private members
  300. private String[] columnNames;
  301. private int[] startColumns;
  302. private int[] endColumns;
  303. private boolean[] ignoreCases;
  304. private boolean[] directions;
  305. private boolean[] types;
  306. private boolean[] trims;
  307. //}}}
  308. } //}}}
  309. //{{{ SortTableHeader class
  310. private class SortTableHeader extends JTableHeader
  311. {
  312. //{{{ SortTableHeader constructor
  313. public SortTableHeader(TableColumnModel tcom)
  314. {
  315. super(tcom);
  316. } //}}}
  317. //{{{ getToolTipText() method
  318. public String getToolTipText(MouseEvent event)
  319. {
  320. Point p = event.getPoint();
  321. switch(this.columnAtPoint(p))
  322. {
  323. case 0:
  324. return "Start column for the sort field";
  325. case 1:
  326. return "End column for the sort field";
  327. case 2:
  328. return "Enable for descending sort order";
  329. case 3:
  330. return "Enable for case insensitive sort";
  331. case 4:
  332. return "Enable for numeric type sort";
  333. case 5:
  334. return "Trim whitespace before sorting";
  335. }
  336. return null;
  337. } //}}}
  338. } //}}}
  339. //{{{ Private members
  340. /**
  341. * The class with the sort routines.
  342. */
  343. private JSort jsort;
  344. /**
  345. * The data to be sorted
  346. */
  347. private java.util.List data;
  348. /**
  349. * The view containing the buffer that contained the data to be sorted (whew!!)
  350. */
  351. private View view;
  352. /**
  353. * The text area we'll write the results to
  354. */
  355. private JEditTextArea textArea;
  356. /**
  357. * Did the data come from a selection within the buffer?
  358. */
  359. private boolean selection;
  360. // gui components
  361. private JCheckBox dups;
  362. private JButton ok;
  363. private JButton cancel;
  364. private JButton clear;
  365. private JButton help;
  366. private SortTableModel sortTableModel;
  367. private JTable sortTable;
  368. //}}}
  369. }