001: /*
002: * Copyright 2001-2006 C:1 Financial Services GmbH
003: *
004: * This software is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License Version 2.1, as published by the Free Software Foundation.
007: *
008: * This software is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011: * Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public
014: * License along with this library; if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
016: */
017:
018: package de.finix.contelligent.client.gui.configuration;
019:
020: import java.awt.BorderLayout;
021: import java.awt.Component;
022: import java.awt.GridLayout;
023: import java.awt.event.ActionEvent;
024: import java.awt.event.ActionListener;
025: import java.awt.event.ItemEvent;
026: import java.awt.event.ItemListener;
027: import java.io.IOException;
028: import java.io.StringReader;
029: import java.io.StringWriter;
030: import java.util.Map;
031: import java.util.logging.Level;
032: import java.util.logging.Logger;
033:
034: import javax.swing.DefaultCellEditor;
035: import javax.swing.JComboBox;
036: import javax.swing.JLabel;
037: import javax.swing.JPanel;
038: import javax.swing.JScrollPane;
039: import javax.swing.JTable;
040: import javax.swing.JTextField;
041: import javax.swing.ListSelectionModel;
042: import javax.swing.border.TitledBorder;
043: import javax.swing.table.TableCellRenderer;
044: import javax.xml.parsers.ParserConfigurationException;
045:
046: import org.xml.sax.InputSource;
047: import org.xml.sax.SAXException;
048: import org.xml.sax.helpers.AttributesImpl;
049:
050: import de.finix.contelligent.client.base.ComponentFactory;
051: import de.finix.contelligent.client.base.UserManager;
052: import de.finix.contelligent.client.base.category.ContelligentCategory;
053: import de.finix.contelligent.client.base.category.ContelligentCategoryManager;
054: import de.finix.contelligent.client.base.resource.ContelligentTextResource;
055: import de.finix.contelligent.client.event.ContelligentEvent;
056: import de.finix.contelligent.client.event.ResourceModifiedEvent;
057: import de.finix.contelligent.client.gui.AbstractComponentResourceEditor;
058: import de.finix.contelligent.client.i18n.Resources;
059: import de.finix.contelligent.client.util.DatePanel;
060: import de.finix.contelligent.client.util.SortableTable;
061: import de.finix.contelligent.client.util.TableLayout;
062: import de.finix.contelligent.client.util.TableModelSorter;
063: import de.finix.contelligent.client.util.list.NameValueComboBox;
064: import de.zeigermann.xml.XMLWriter;
065: import de.zeigermann.xml.simpleImporter.DefaultSimpleImportHandler;
066: import de.zeigermann.xml.simpleImporter.SimpleImporter;
067: import de.zeigermann.xml.simpleImporter.SimplePath;
068:
069: public class PreviewConfigurationEditor extends
070: AbstractComponentResourceEditor {
071:
072: private static Logger logger = Logger
073: .getLogger(PreviewConfigurationEditor.class.getName());
074:
075: private String previewName;
076:
077: private Map categoryMap;
078:
079: private long dateInMillis;
080:
081: private JTextField previewNameField;
082:
083: private DatePanel datePanel;
084:
085: private NameValueComboBox groupComboBox;
086:
087: private NameValueComboBox principalComboBox;
088:
089: private CategoryTableModel categoryTableModel;
090:
091: public void init() {
092: setResourceComponent(this );
093: JPanel messagePanel = new JPanel(new TableLayout(
094: new double[][] {
095: { TableLayout.FILL },
096: { TableLayout.PREFERRED, 5,
097: TableLayout.MINIMUM, 3,
098: TableLayout.PREFERRED, 3,
099: TableLayout.FILL } }));
100: messagePanel.setOpaque(false);
101: JPanel previewNamePanel = new JPanel(new BorderLayout());
102: previewNamePanel.setOpaque(false);
103: previewNamePanel.setBorder(new TitledBorder(Resources
104: .getLocalString("preview_name")));
105: previewNameField = new JTextField();
106: previewNamePanel.add(previewNameField, BorderLayout.CENTER);
107: messagePanel.add(previewNamePanel, "0,0");
108: datePanel = new DatePanel(null, Resources.getLocale());
109: datePanel.setBorder(new TitledBorder(Resources
110: .getLocalString("preview_date")));
111: datePanel.setOpaque(false);
112: messagePanel.add(datePanel, "0,2");
113: principalComboBox = new NameValueComboBox();
114: groupComboBox = new NameValueComboBox(UserManager.getInstance()
115: .getRoleGroupsDescriptions());
116: groupComboBox.addItemListener(new ItemListener() {
117: public void itemStateChanged(ItemEvent e) {
118: String group = (String) groupComboBox
119: .getSelectedItemValue();
120: if (group != null) {
121: principalComboBox.setModel(UserManager
122: .getInstance().getPrincipalsDescriptions(
123: group, false, true));
124: if (principalComboBox.getItemCount() > 0) {
125: principalComboBox.setSelectedIndex(0);
126: }
127: }
128: }
129: });
130: if (groupComboBox.getItemCount() > 0) {
131: groupComboBox.setSelectedIndex(0);
132: }
133: JPanel rolePanel = new JPanel(new GridLayout(1, 0));
134: rolePanel.setOpaque(false);
135: rolePanel.add(groupComboBox);
136: rolePanel.add(principalComboBox);
137: rolePanel.setBorder(new TitledBorder(Resources
138: .getLocalString("preview_role")));
139: messagePanel.add(rolePanel, "0,4");
140: JPanel categoryPanel = new JPanel(new BorderLayout());
141: categoryPanel.setOpaque(false);
142: categoryPanel.setBorder(new TitledBorder(Resources
143: .getLocalString("preview_categories")));
144: ContelligentCategory[] categories = ContelligentCategoryManager
145: .getInstance().getDefinedCategories();
146: categoryTableModel = new CategoryTableModel();
147: categoryTableModel.setColumnIdentifiers(new String[] {
148: Resources.getLocalString("category"),
149: Resources.getLocalString("value") });
150: for (int i = 0; i < categories.length; i++) {
151: ContelligentCategory category = categories[i];
152: String categoryName = category.getName();
153: JComboBox categoryValues = new JComboBox(category
154: .getSupportedValues());
155: categoryTableModel.addRow(new Object[] {
156: categoryName,
157: new Selection(category.getDefaultValue(), category
158: .getSupportedValues()) });
159: categoryTableModel.fireTableDataChanged();
160: }
161: SortableTable categoryTable = new SortableTable(
162: new TableModelSorter(categoryTableModel));
163: categoryTable.setRowHeight(25);
164: categoryTable
165: .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
166: categoryTable.setDefaultEditor(Selection.class,
167: new SelectionEditor());
168: categoryTable.setDefaultRenderer(Selection.class,
169: new SelectionRenderer(categoryTable));
170: categoryTable.setDefaultRenderer(String.class,
171: new LocaleTextRenderer(categoryTable));
172: categoryPanel.add(new JScrollPane(categoryTable),
173: BorderLayout.CENTER);
174: messagePanel.add(categoryPanel, "0,6");
175: add(messagePanel, BorderLayout.CENTER);
176: update();
177: }
178:
179: public void setEditable(boolean editable) {
180: super .setEditable(editable);
181: if (previewNameField != null)
182: previewNameField.setEditable(editable);
183: if (datePanel != null)
184: datePanel.setEditable(editable);
185: if (categoryTableModel != null)
186: categoryTableModel.setEditable(editable);
187: if (groupComboBox != null)
188: groupComboBox.setEnabled(editable);
189: if (principalComboBox != null)
190: principalComboBox.setEnabled(editable);
191: }
192:
193: protected void displayResource() {
194: // Parse resource and update editor
195: PreviewHandler handler = new PreviewHandler();
196: ContelligentTextResource resource = (ContelligentTextResource) getGUI()
197: .getResource();
198: if (resource != null) {
199: SimpleImporter importer = new SimpleImporter();
200: importer.addSimpleImportHandler(handler);
201: try {
202: importer.parse(new InputSource(new StringReader(
203: resource.getText())));
204: } catch (ParserConfigurationException e) {
205: } catch (SAXException e) {
206: } catch (IOException e) {
207: }
208: }
209: }
210:
211: protected void updateResource() {
212: ContelligentTextResource resource = (ContelligentTextResource) getGUI()
213: .getResource();
214: if (resource == null || getGUI().isResourceInherited()) {
215: resource = new ContelligentTextResource(getGUI()
216: .getResourceCategoryMap(), getPreviewAsXML());
217: resource.setModified(true);
218: getGUI().setResource(resource);
219: } else {
220: resource.setText(getPreviewAsXML());
221: }
222: if (resource.isModified()) {
223: getComponent().setResourceModified(true);
224: }
225: ComponentFactory.getInstance().fireResourceModifyEvent(
226: new ResourceModifiedEvent(this , getComponent()
227: .getPath(), getGUI().getResourceIdentifier(),
228: resource, getGUI().getResourceMode()));
229: }
230:
231: private String getPreviewAsXML() {
232: StringWriter writer = new StringWriter();
233: XMLWriter xmlWriter = new XMLWriter(writer);
234: try {
235: xmlWriter
236: .writeStartTag(XMLWriter.createStartTag("preview"));
237: XMLWriter.generateAndWriteElementWithCData(xmlWriter,
238: "display", new String[0][0], previewNameField
239: .getText());
240: Object principal = principalComboBox.getSelectedItemValue();
241: if (principal != null) {
242: UserManager.Role role = (UserManager.Role) principal;
243: XMLWriter.generateAndWriteElementWithCData(xmlWriter,
244: "role", new String[0][0], role.groupId + ":"
245: + role.roleId);
246: }
247: XMLWriter.generateAndWriteElementWithCData(xmlWriter,
248: "date", new String[0][0], String.valueOf(datePanel
249: .getMillis()));
250:
251: for (int i = 0; i < categoryTableModel.getRowCount(); i++) {
252: String category = (String) categoryTableModel
253: .getValueAt(i, 0);
254: String value = ((Selection) categoryTableModel
255: .getValueAt(i, 1)).getSelectedValue();
256: xmlWriter.writeEmptyElement(XMLWriter.createEmptyTag(
257: "category", new String[][] {
258: { "name", category },
259: { "value", value } }));
260: }
261: xmlWriter.writeEndTag(XMLWriter.createEndTag("preview"));
262: return writer.toString();
263: } catch (IOException e) {
264: logger.log(Level.SEVERE,
265: "Error while creating XML from preview-editor!", e);
266: }
267: return null;
268: }
269:
270: protected void updateComponent() {
271: updateResource();
272: ContelligentTextResource resource = (ContelligentTextResource) getGUI()
273: .getResource();
274: if (resource != null && !getGUI().isResourceInherited()) {
275: resource.setText(getPreviewAsXML());
276: if (resource.isModified()) {
277: getComponent().setResourceModified(true);
278: }
279: }
280: }
281:
282: protected void componentChanged(ContelligentEvent event) {
283: update();
284: }
285:
286: protected void childComponentAdded(ContelligentEvent event) {
287: }
288:
289: protected void childComponentRemoved(ContelligentEvent event) {
290: }
291:
292: protected void childComponentChanged(ContelligentEvent event) {
293: }
294:
295: protected void descendentComponentChanged(ContelligentEvent event) {
296: }
297:
298: class LocaleTextRenderer implements TableCellRenderer {
299:
300: JTable categoryTable;
301:
302: public LocaleTextRenderer(JTable categoryTable) {
303: this .categoryTable = categoryTable;
304: }
305:
306: public java.awt.Component getTableCellRendererComponent(
307: JTable table, Object object, boolean isSelected,
308: boolean hasFocus, int row, int column) {
309: JLabel cellRenderer = new JLabel();
310: String categoryName = (String) object;
311: String categoryDesc = ContelligentCategoryManager
312: .getInstance().getCategoryTitleByName(categoryName);
313: ContelligentCategory cat = ContelligentCategoryManager
314: .getInstance().getCategoryByName(categoryName);
315: if (cat == null) {
316: categoryDesc = "(" + categoryName + ")";
317: }
318: cellRenderer.setOpaque(true);
319: cellRenderer.setText(categoryDesc);
320: if (isSelected) {
321: cellRenderer.setBackground(categoryTable
322: .getSelectionBackground());
323: cellRenderer.setForeground(categoryTable
324: .getSelectionForeground());
325: } else {
326: cellRenderer.setBackground(categoryTable
327: .getBackground());
328: }
329: cellRenderer.setFont(categoryTable.getFont());
330: return cellRenderer;
331: }
332: }
333:
334: class SelectionEditor extends DefaultCellEditor {
335: private Selection selection;
336:
337: public SelectionEditor() {
338: super (new JTextField());
339: }
340:
341: public Object getCellEditorValue() {
342: return selection;
343: }
344:
345: public Component getTableCellEditorComponent(JTable table,
346: Object object, boolean isSelected, final int row,
347: final int column) {
348: selection = (Selection) object;
349: JComboBox cellEditor = new JComboBox(selection
350: .getPossibleValues());
351: cellEditor.addActionListener(new ActionListener() {
352: public void actionPerformed(ActionEvent e) {
353: JComboBox cb = (JComboBox) e.getSource();
354: selection.setSelectedValue((String) cb
355: .getSelectedItem());
356: fireEditingStopped();
357: }
358: });
359:
360: return cellEditor;
361: }
362: }
363:
364: class SelectionRenderer implements TableCellRenderer {
365: private JTable categoryTable;
366:
367: public SelectionRenderer(JTable categoryTable) {
368: this .categoryTable = categoryTable;
369: }
370:
371: public java.awt.Component getTableCellRendererComponent(
372: JTable table, Object object, boolean isSelected,
373: boolean hasFocus, int row, int column) {
374: JLabel cellRenderer = new JLabel();
375: Selection selection = (Selection) object;
376: cellRenderer.setOpaque(true);
377: cellRenderer.setText(selection.getSelectedValue());
378: if (isSelected) {
379: cellRenderer.setBackground(categoryTable
380: .getSelectionBackground());
381: cellRenderer.setForeground(categoryTable
382: .getSelectionForeground());
383: } else {
384: cellRenderer.setBackground(categoryTable
385: .getBackground());
386: }
387: cellRenderer.setFont(categoryTable.getFont());
388: return cellRenderer;
389: }
390: }
391:
392: class Selection {
393: private String selectedValue;
394:
395: private String[] possibleValues;
396:
397: public Selection(String selectedValue, String[] possibleValues) {
398: this .selectedValue = selectedValue;
399: this .possibleValues = possibleValues;
400: }
401:
402: public String[] getPossibleValues() {
403: return possibleValues;
404: }
405:
406: public String getSelectedValue() {
407: return selectedValue;
408: }
409:
410: public void setSelectedValue(String selectedValue) {
411: this .selectedValue = selectedValue;
412: }
413:
414: }
415:
416: public final class PreviewHandler extends
417: DefaultSimpleImportHandler {
418: public void startElement(SimplePath path, String name,
419: AttributesImpl attrs, String leadingCData) {
420: try {
421: if (path.matches("preview/display")) {
422: previewNameField.setText(leadingCData);
423: } else if (path.matches("preview/category")) {
424: String categoryName = attrs.getValue("name");
425: String categoryValue = attrs.getValue("value");
426: for (int i = 0; i < categoryTableModel
427: .getRowCount(); i++) {
428: String category = (String) categoryTableModel
429: .getValueAt(i, 0);
430: Selection selection = ((Selection) categoryTableModel
431: .getValueAt(i, 1));
432: if (category.equals(categoryName)) {
433: selection.setSelectedValue(categoryValue);
434: }
435: }
436: } else if (path.matches("preview/role")) {
437: String groupId = leadingCData.substring(0,
438: leadingCData.indexOf(':'));
439: String principalId = leadingCData
440: .substring(leadingCData.indexOf(':') + 1);
441: groupComboBox.setSelectedItemByName(groupId);
442: principalComboBox
443: .setSelectedItemByName(principalId);
444: } else if (path.matches("preview/date")) {
445: datePanel.setMillis(Long.parseLong(leadingCData));
446: }
447: } catch (Throwable t) {
448: logger.log(Level.SEVERE,
449: "Caught exception while preview import", t);
450: }
451: }
452: }
453: }
|