Source code: com/cybertivity/powerjournal/SingleEntryView.java
1 package com.cybertivity.powerjournal;
2 import java.awt.BorderLayout;
3 import java.awt.Color;
4 import java.awt.Container;
5 import java.awt.FlowLayout;
6 import java.awt.Image;
7 import java.awt.Insets;
8 import java.awt.Toolkit;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.InputEvent;
11 import java.awt.event.KeyAdapter;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.KeyListener;
14 import java.awt.event.WindowAdapter;
15 import java.awt.event.WindowEvent;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.Set;
20 import javax.swing.BorderFactory;
21 import javax.swing.JButton;
22 import javax.swing.JCheckBox;
23 import javax.swing.JComponent;
24 import javax.swing.JFrame;
25 import javax.swing.JLabel;
26 import javax.swing.JList;
27 import javax.swing.JMenu;
28 import javax.swing.JMenuBar;
29 import javax.swing.JOptionPane;
30 import javax.swing.JPanel;
31 import javax.swing.JScrollPane;
32 import javax.swing.JTextArea;
33 import javax.swing.JTextField;
34 import javax.swing.SwingConstants;
35 import javax.swing.SwingUtilities;
36 import javax.swing.UIManager;
37 import javax.swing.border.Border;
38 import javax.swing.event.ChangeEvent;
39 import javax.swing.event.ChangeListener;
40 import com.cybertivity.powerjournal.framework.*;
41 import com.cybertivity.powerjournal.gridpanel.*;
42
43 /**
44 * Title: PowerJournal
45 * Description: $Id: SingleEntryView.java,v 1.2 2001/12/15 17:12:38 arrowood Exp $
46 * Copyright: Copyright (c) 2001
47 * Company: <A HREF="http://www.cybertivity.com">Cybertivity</A>
48 *
49 * @author <A HREF="mailto:chris.arrowood@cybertivity.com">Chris Arrowood</A>
50 * @created December 9, 2001
51 * @version 1.0
52 */
53
54 public class SingleEntryView extends EntryView {
55
56 private JPanel panelTitle = null;
57 private JPanel panelEntry = null;
58 private JPanel panelControl = null;
59 private HashMap buttons = new HashMap();
60 private JLabel lblEntryNumber = null;
61 private JLabel lblPosition = null;
62 private JLabel lblJournalName = null;
63 private JTextField txtDate = null;
64 private JTextArea txtEntryContents = null;
65 private JTextField txtEntryDesc = null;
66 private JCheckBox chkPrivate = null;
67 public final static String NEW_ENTRY_NUMBER_LABEL = "(NEXT)";
68 public final static String INITIAL_ENTRY_NUMBER = "";
69 public final static String EVENT_NEW = "New";
70 public final static String EVENT_PREVIOUS = "Prev.";
71 public final static String EVENT_LAST = "Last";
72 public final static String EVENT_FIRST = "First";
73 public final static String EVENT_NEXT = "Next";
74 public final static String EVENT_DELETE = "Delete";
75 public final static String EVENT_RELOAD = "Reload";
76 public final static String EVENT_VIEW_ALL = "View All";
77 private String appName = "";
78 private boolean guestMode = true;
79
80
81 public SingleEntryView(String appNameArg, boolean guestModeArg) {
82 appName = appNameArg;
83 guestMode = guestModeArg;
84 createWindow();
85 }
86
87
88 protected void cleanUp() { }
89
90
91 protected void handleModelEvent(ModelEvent event) { }
92
93
94 protected void displayEntries(ArrayList entries) { }
95
96
97 private void createWindow() {
98 content.removeAll();
99 BorderLayout layout = new BorderLayout();
100 content.setLayout(layout);
101 panelTitle = buildPanelTitle();
102 panelEntry = buildPanelEntry();
103 panelControl = buildPanelControl();
104 content.add(panelTitle, BorderLayout.NORTH);
105 content.add(panelEntry, BorderLayout.CENTER);
106 content.add(panelControl, BorderLayout.SOUTH);
107 }
108
109
110 private JPanel buildPanelTitle() {
111 JPanel panel = new JPanel();
112 BorderLayout layout = new BorderLayout();
113 JLabel labelTitle = new JLabel();
114 labelTitle.setFont(new java.awt.Font("SansSerif", 1, 20));
115 labelTitle.setHorizontalAlignment(SwingConstants.CENTER);
116 labelTitle.setHorizontalTextPosition(SwingConstants.CENTER);
117 labelTitle.setText(appName);
118 panel.add(labelTitle, BorderLayout.CENTER);
119 return panel;
120 }
121
122
123 private JPanel buildPanelControl() {
124 //create buttons
125 JButton btnPrev = makeButton("<.", EVENT_PREVIOUS, Color.magenta);
126 JButton btnNext = makeButton(">", EVENT_NEXT, Color.magenta);
127 JButton btnFirst = makeButton("<<", EVENT_FIRST, Color.magenta);
128 JButton btnLast = makeButton(">>", EVENT_LAST, Color.magenta);
129 JButton btnNew = makeButton(EVENT_NEW, EVENT_NEW, Color.blue);
130 JButton btnDelete = makeButton(EVENT_DELETE, EVENT_DELETE, Color.red);
131 JButton btnReload = makeButton(EVENT_RELOAD, EVENT_RELOAD, Color.blue);
132 JButton btnViewAll = makeButton(EVENT_VIEW_ALL, EVENT_VIEW_ALL, Color.blue);
133 btnPrev.setToolTipText("Previous Entry");
134 btnNext.setToolTipText("Next Entry");
135 btnFirst.setToolTipText("First Entry");
136 btnLast.setToolTipText("Last Entry");
137 btnNew.setToolTipText("Create a new entry");
138 btnDelete.setToolTipText("Delete current entry");
139 btnReload.setToolTipText("Cancel changes and the reload current entry.");
140 btnViewAll.setToolTipText("View a summary of all entries in this journal");
141 //create JPanel and add buttons
142 JPanel btnPanel = new JPanel();
143 FlowLayout btnPanelLayout = new FlowLayout();
144 btnPanel.setBorder(BorderFactory.createEtchedBorder());
145 btnPanel.setLayout(btnPanelLayout);
146 btnPanel.add(btnFirst, null);
147 btnPanel.add(btnPrev, null);
148 btnPanel.add(btnNext, null);
149 btnPanel.add(btnLast, null);
150 btnPanel.add(btnViewAll, null);
151 btnPanel.add(btnNew, null);
152 btnPanel.add(btnReload, null);
153 btnPanel.add(btnDelete, null);
154 //create Jpanel for copyright info
155 JPanel copyrightPanel = new JPanel();
156 JLabel copyrightLabel = new JLabel("© 2001 Chris Arrowood");
157 copyrightLabel.setForeground(Color.darkGray);
158 copyrightPanel.add(copyrightLabel);
159 //glue all of it together
160 JPanel panel = new JPanel();
161 BorderLayout layout = new BorderLayout();
162 panel.setLayout(layout);
163 panel.add(btnPanel, BorderLayout.CENTER);
164 panel.add(copyrightPanel, BorderLayout.SOUTH);
165 return panel;
166 }
167
168
169 private JPanel buildPanelEntry() {
170 JPanel panel = null;
171 try {
172 Insets insets = new Insets(2, 10, 0, 2);
173 GridPanelColumn leftColumn = createLabelColumn();
174 GridPanelColumn rightColumn = createTextBoxesColumn();
175 ArrayList columns = new ArrayList();
176 columns.add(0, leftColumn);
177 columns.add(1, rightColumn);
178 panel = GridPanelBuilder.createGridPanel(insets, columns);
179 panel.setBorder(BorderFactory.createEtchedBorder());
180 } catch (GridPanelException ex) {
181 panel = new JPanel();
182 }
183 return panel;
184 }
185
186
187
188 private GridPanelColumn createTextBoxesColumn() {
189 //create text boxes
190 lblPosition = new JLabel("");
191 lblJournalName = new JLabel("");
192 lblEntryNumber = new JLabel(INITIAL_ENTRY_NUMBER);
193 txtDate = new JTextField(17);
194 txtEntryContents = new JTextArea("", 17, 45);
195 txtEntryDesc = new JTextField(40);
196 chkPrivate = new JCheckBox();
197 //set up text area
198 txtEntryContents.setBorder(txtEntryDesc.getBorder());
199 txtEntryContents.setFont(txtEntryDesc.getFont());
200 txtEntryContents.setWrapStyleWord(true);
201 txtEntryContents.setLineWrap(true);
202 //add to column
203 GridPanelColumn column = new GridPanelColumn();
204 column.add(lblJournalName, true, false);
205 column.add(lblPosition, true, false);
206 column.add(lblEntryNumber, true, false);
207 column.add(chkPrivate, true, false);
208 column.add(txtDate, true, false);
209 column.add(txtEntryDesc, true, false);
210 column.add(createEntryContentsPanel(txtEntryContents), true, true);
211 return column;
212 }
213
214
215 private GridPanelColumn createLabelColumn() {
216 GridPanelColumn column = new GridPanelColumn();
217 float hAlign = GridPanelColumn.RIGHT_ALIGNMENT;
218 float vAlign = GridPanelColumn.TOP_ALIGNMENT;
219 int fill = GridPanelColumn.NONE_FILL;
220 int anchor = GridPanelColumn.EAST_ANCHOR;
221 JLabel jLabelJournal = new JLabel("Journal:");
222 JLabel jLabelPostition = new JLabel("Postition:");
223 JLabel jLabelID = new JLabel("ID:");
224 JLabel jLabelPrivate = new JLabel("Private:");
225 JLabel jLabelDate = new JLabel("Date:");
226 JLabel jLabelDescription = new JLabel("Description:");
227 JLabel jLabelEntry = new JLabel("Entry:");
228 column.add(jLabelJournal, false, false, hAlign, vAlign, fill, anchor);
229 column.add(jLabelPostition, false, false, hAlign, vAlign, fill, anchor);
230 column.add(jLabelID, false, false, hAlign, vAlign, fill, anchor);
231 column.add(jLabelPrivate, false, false, hAlign, vAlign, fill, anchor);
232 column.add(jLabelDate, false, false, hAlign, vAlign, fill, anchor);
233 column.add(jLabelDescription, false, false, hAlign, vAlign, fill, anchor);
234 column.add(jLabelEntry, false, false, hAlign, vAlign, fill, anchor);
235 return column;
236 }
237
238
239 private JPanel createEntryContentsPanel(JTextArea textInputArea) {
240 JPanel textEntryPanel = new JPanel();
241 textInputArea.setEditable(true);
242 JScrollPane textScroller = new JScrollPane(textInputArea);
243 textScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
244 textScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
245 textEntryPanel.setLayout(new BorderLayout());
246 textEntryPanel.add(textScroller, BorderLayout.CENTER);
247 return textEntryPanel;
248 }
249
250
251 private JButton makeButton(String name, final String action, Color color) {
252 JButton btn = new JButton();
253 btn.setText(name);
254 if (color != null) {
255 btn.setForeground(color);
256 }
257
258 btn.addActionListener(
259 new java.awt.event.ActionListener() {
260 //private final String actionFinal = action;
261 public void actionPerformed(ActionEvent e) {
262 fireEvent(action);
263 }
264 });
265 if (buttons != null) {
266 buttons.put(name, btn);
267 }
268 return btn;
269 }
270
271
272 protected void displayEntry(Entry displayEntry, boolean guestModeArg, boolean isNewEntry) {
273 guestMode = guestModeArg;
274 if (displayEntry != null) {
275 if (isNewEntry) {
276 lblEntryNumber.setText(NEW_ENTRY_NUMBER_LABEL);
277 lblPosition.setText("(New)");
278 } else {
279 lblEntryNumber.setText("" + displayEntry.getEntryNumber());
280 lblPosition.setText(displayEntry.getEntryPositionMemo());
281 }
282 txtDate.setText(displayEntry.getEntryDateAsString());
283 txtEntryContents.setText(displayEntry.getEntryContents());
284 txtEntryDesc.setText(displayEntry.getEntryDescription());
285 chkPrivate.setSelected(displayEntry.getEntryPrivate());
286 lblJournalName.setText(displayEntry.getJournalName().replace('_', ' '));
287 if (isNewEntry) {
288 txtEntryDesc.requestFocus();
289 }
290
291 } else {
292 displayEntry(new Entry("", ""), guestMode, true);
293 if (guestMode) {
294 Dialogs.showError(content, "Entry not found", "The entry you specified does not exist.");
295 } else {
296 Dialogs.showError(content, "Entry not found", "The entry you specified does not exist. A new one has been created for you.");
297 }
298 }
299 enableControls();
300 }
301
302
303 private void buttonsSetEnabled(boolean enable) {
304 Set set = buttons.keySet();
305 Iterator iter = set.iterator();
306 while (iter.hasNext()) {
307 String name = (String) iter.next();
308 JButton btn = (JButton) buttons.get(name);
309 if (guestMode && (name.equals(EVENT_NEW))) {
310 btn.setEnabled(false);
311 } else if (guestMode && (name.equals(EVENT_DELETE))) {
312 btn.setEnabled(false);
313 } else if (guestMode && (name.equals(EVENT_RELOAD))) {
314 btn.setEnabled(false);
315 } else {
316 btn.setEnabled(enable);
317 }
318 }
319 }
320
321
322 protected void enableControls() {
323 txtDate.enable();
324 txtEntryContents.enable();
325 txtEntryDesc.enable();
326 buttonsSetEnabled(true);
327 chkPrivate.setEnabled(!guestMode);
328 txtDate.setEditable(!guestMode);
329 txtEntryContents.setEditable(!guestMode);
330 txtEntryDesc.setEditable(!guestMode);
331 }
332
333
334 protected void disableControls() {
335 txtDate.disable();
336 txtEntryContents.disable();
337 txtEntryDesc.disable();
338 buttonsSetEnabled(false);
339 }
340
341
342 protected void displayEntry(Entry entry, boolean guestMode) {
343 displayEntry(entry, guestMode, false);
344 }
345
346
347 public String getDisplayedEntryDescription() {
348 return txtEntryDesc.getText();
349 }
350
351
352 public String getDisplayedEntryDate() {
353 return txtDate.getText();
354 }
355
356
357 public String getDisplayedEntryContents() {
358 return txtEntryContents.getText();
359 }
360
361
362 protected String getSelectedEntryNumber() {
363 return lblEntryNumber.getText();
364 }
365
366
367 public String getDisplayedJournalName() {
368 return lblJournalName.getText();
369 }
370
371
372 public boolean getDisplayedEntryIsPrivate() {
373 return chkPrivate.isSelected();
374 }
375
376 }