1 package net.sf.bibkeeper;
2
3 import java.awt.event;
4 //import java.awt.datatransfer.*;
5 import javax.swing;
6 import javax.swing.table;
7 import java.awt.Dimension;
8 import java.io;
9
10 public class EntryTable extends JTable {
11
12 final int PREFERRED_WIDTH = 400, PREFERRED_HEIGHT = 30;
13
14 JScrollPane sp = new JScrollPane((JTable)this);
15 JPopupMenu rightClickMenu = null;
16 EntryTableModel tableModel;
17 BibkeeperPrefs prefs;
18 protected boolean showingSearchResults = false,
19 showingGroup = false;
20 private EntryTable ths = this;
21
22 public EntryTable(EntryTableModel tm_, BibkeeperPrefs prefs_) {
23 super(tm_);
24 this.tableModel = tm_;
25 prefs = prefs_;
26
27 getTableHeader().setReorderingAllowed(false); // To prevent color bugs. Must be fixed.
28 setShowVerticalLines(true);
29 setShowHorizontalLines(true);
30 setColumnSelectionAllowed(true);
31 setAutoResizeMode(prefs.getInt("autoResizeMode"));
32 DefaultCellEditor dce = new DefaultCellEditor(new JTextField());
33 dce.setClickCountToStart(2);
34 setDefaultEditor(String.class, dce);
35 getTableHeader().addMouseListener(new MouseAdapter() {
36 public void mouseClicked(MouseEvent e) {
37 int col = getTableHeader().columnAtPoint(e.getPoint());
38 if (col > 0) { // A valid column, but not the first.
39 String s = tableModel.getColumnName(col).toLowerCase();
40
41 // Change sort field ...
42 if (!s.equals(prefs.get("priSort")))
43 prefs.put("priSort", s);
44 // ... or change sort direction
45 else prefs.putBoolean("priDescending",
46 !prefs.getBoolean("priDescending"));
47 tableModel.remap();
48 repaint();
49 }
50
51
52 }
53 });
54 addMouseListener(new MouseAdapter() {
55 public void mouseClicked(MouseEvent e) {
56 if (e.getButton() == MouseEvent.BUTTON3) {
57 if (rightClickMenu != null)
58 rightClickMenu.show(ths, e.getX(), e.getY());
59 }
60
61 }
62 });
63 setWidths();
64 sp.getViewport().setBackground(GUIGlobals.tableBackground);
65 }
66
67 public void setWidths() {
68 // Setting column widths:
69
70 TableColumnModel cm = getColumnModel();
71 for (int i=0; i<getModel().getColumnCount(); i++) {
72 cm.getColumn(i).setPreferredWidth(GUIGlobals.getPreferredFieldLength(getModel().getColumnName(i)));
73 }
74 }
75
76 public JScrollPane getPane() {
77 return sp;
78 }
79
80 public void setShowingSearchResults(boolean search,
81 boolean group) {
82 showingSearchResults = search;
83 showingGroup = group;
84 }
85
86 public void setRightClickMenu(JPopupMenu rcm) {
87 rightClickMenu = rcm;
88 }
89
90 public TableCellRenderer getCellRenderer(int row, int column) {
91 // This method asks the table model whether the given cell represents a
92 // required or optional field, and returns the appropriate renderer.
93 int score = -3;
94 if (!showingSearchResults ||
95 tableModel.nonZeroField(row, DatabaseSearch.SEARCH))
96 score++;
97 if (!showingGroup ||
98 tableModel.nonZeroField(row, DatabaseSearch.GROUPSEARCH))
99 score+=2;
100
101 // Now, a grayed out renderer is for entries with -1, and
102 // a very grayed out one for entries with -2
103 if (score < -1)
104 return veryGrayedOutRenderer;
105 if (score == -1)
106 return grayedOutRenderer;
107
108 if (!prefs.getBoolean("tableColorCodesOn"))
109 return defRenderer;
110 if (column == 0) {
111 // Return a renderer with red background if the entry is incomplete.
112 if (tableModel.isComplete(row))
113 return defRenderer;
114 else {
115 if (tableModel.hasCrossRef(row))
116 return maybeIncRenderer;
117 else
118 return incRenderer;
119 }
120 //return (tableModel.isComplete(row) ? defRenderer: incRenderer);
121 }
122 int status;
123 try { // This try clause is here to contain a bug.
124 status = tableModel.getCellStatus(row, column);
125 } catch (ArrayIndexOutOfBoundsException ex) {
126 return defRenderer; // This should not occur.
127 }
128
129 //if (column == 1)
130 // Util.pr(""+status);
131 if (status == EntryTableModel.REQUIRED)
132 return reqRenderer;
133 else if (status == EntryTableModel.OPTIONAL)
134 return optRenderer;
135 else return defRenderer;
136 }
137
138 public void scrollTo(int y) {
139 JScrollBar scb = sp.getVerticalScrollBar();
140 scb.setValue(y*scb.getUnitIncrement(1));
141 }
142
143 public BibtexEntry[] getSelectedEntries() {
144 BibtexEntry[] bes = null;
145 int[] rows = getSelectedRows();
146 int[] cols = getSelectedColumns();
147 // Entries are selected if only the first or multiple
148 // columns are selected.
149 if (((cols.length == 1) && (cols[0] == 0)) ||
150 (cols.length > 1)) { // entryTable.getColumnCount())) {
151 if (rows.length > 0) {
152 bes = new BibtexEntry[rows.length];
153 for (int i=0; i<rows.length; i++) {
154 bes[i] = tableModel.db.getEntryByID(tableModel.getNameFromNumber(rows[i]));
155 }
156
157
158 }
159 }
160
161 return bes;
162 }
163
164
165 // The following classes define the renderers used to render required
166 // and optional fields in the table. The purpose of these renderers is
167 // to visualize which fields are needed for each entry.
168 private DefaultTableCellRenderer defRenderer = new DefaultTableCellRenderer();
169 private RequiredRenderer reqRenderer = new RequiredRenderer();
170 private OptionalRenderer optRenderer = new OptionalRenderer();
171 private IncompleteEntryRenderer incRenderer = new IncompleteEntryRenderer();
172 private GrayedOutRenderer grayedOutRenderer = new GrayedOutRenderer();
173 private VeryGrayedOutRenderer veryGrayedOutRenderer
174 = new VeryGrayedOutRenderer();
175 private MaybeIncompleteEntryRenderer
176 maybeIncRenderer = new MaybeIncompleteEntryRenderer();
177
178 public class RequiredRenderer extends DefaultTableCellRenderer {
179 public RequiredRenderer() {
180 super();
181 setBackground(GUIGlobals.tableReqFieldBackground);
182 }
183 }
184 public class OptionalRenderer extends DefaultTableCellRenderer {
185 public OptionalRenderer() {
186 super();
187 setBackground(GUIGlobals.tableOptFieldBackground);
188 }
189 }
190 public class IncompleteEntryRenderer extends DefaultTableCellRenderer {
191 public IncompleteEntryRenderer() {
192 super();
193 setBackground(GUIGlobals.tableIncompleteEntryBackground);
194 }
195 }
196 public class MaybeIncompleteEntryRenderer extends DefaultTableCellRenderer {
197 public MaybeIncompleteEntryRenderer() {
198 super();
199 setBackground(GUIGlobals.maybeIncompleteEntryBackground);
200 }
201 }
202
203 public class GrayedOutRenderer extends DefaultTableCellRenderer {
204 public GrayedOutRenderer() {
205 super();
206 setBackground(GUIGlobals.grayedOutBackground);
207 setForeground(GUIGlobals.grayedOutText);
208 }
209 }
210
211 public class VeryGrayedOutRenderer extends DefaultTableCellRenderer {
212 public VeryGrayedOutRenderer() {
213 super();
214 setBackground(GUIGlobals.veryGrayedOutBackground);
215 setForeground(GUIGlobals.veryGrayedOutText);
216 }
217 }
218
219 }