001 /******************************************************************************
002 * Copyright (C) MActor Developers. All rights reserved. *
003 * ---------------------------------------------------------------------------*
004 * This file is part of MActor. *
005 * *
006 * MActor is free software; you can redistribute it and/or modify *
007 * it under the terms of the GNU General Public License as published by *
008 * the Free Software Foundation; either version 2 of the License, or *
009 * (at your option) any later version. *
010 * *
011 * MActor is distributed in the hope that it will be useful, *
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
014 * GNU General Public License for more details. *
015 * *
016 * You should have received a copy of the GNU General Public License *
017 * along with MActor; if not, write to the Free Software *
018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
019 ******************************************************************************/
020 package org.mactor.ui.gui.project.editors;
021
022 import java.awt.event.ActionEvent;
023 import java.awt.event.ItemListener;
024 import java.io.File;
025 import java.io.FileWriter;
026 import java.io.IOException;
027
028 import javax.swing.AbstractAction;
029 import javax.swing.JButton;
030 import javax.swing.JFileChooser;
031 import javax.swing.JLabel;
032 import javax.swing.JOptionPane;
033
034 import org.dom4j.Element;
035 import org.mactor.framework.MactorException;
036 import org.mactor.framework.spec.ProjectContext;
037 import org.mactor.ui.gui.GuiUtil;
038
039 public class DataSourceEditor extends SimpleFormPanel {
040 CommandPrototypeComboBox protoCb = new CommandPrototypeComboBox();
041 CommandTypeComboBox typeCb = new CommandTypeComboBox();
042 GlobalConfigDBGroupComboBox gcDbGroup = new GlobalConfigDBGroupComboBox();
043 Element data;
044 SimpleRowPanel dbPanel = new SimpleRowPanel();
045 CsvPanel csvPanel = new CsvPanel();
046 JButton test = new JButton(new AbstractAction("Test...") {
047 public void actionPerformed(ActionEvent e) {
048 try {
049 applyListener.onApply();
050 new DataSourceTestDlg(JOptionPane.getFrameForComponent(DataSourceEditor.this), data).setVisible(true);
051 } catch (MactorException me) {
052 GuiUtil.showGuiError(DataSourceEditor.this, me);
053 }
054 }
055 });
056 ItemListener typeCbListener = new ItemListener() {
057 public void itemStateChanged(java.awt.event.ItemEvent e) {
058 NodeEditorConfig.CommandType type = (NodeEditorConfig.CommandType) typeCb.getSelectedItem();
059 String proto = protoCb.getSelectedPrototype();
060 if (type != null) {
061 protoCb.setConfig(type.getPrototypes());
062 boolean showDbPanel = "sql".equalsIgnoreCase(type.getName());
063 dbPanel.setVisible(showDbPanel);
064 if (showDbPanel)
065 gcDbGroup.load();
066 csvPanel.setVisible("file".equalsIgnoreCase(type.getName()));
067 } else {
068 protoCb.setConfig(null);
069 dbPanel.setVisible(false);
070 csvPanel.setVisible(false);
071 }
072 protoCb.setSelectedPrototype(proto);
073 };
074 };
075 public void setTipListener(TipListener tipListener) {
076 protoCb.setTipListener(tipListener);
077 typeCb.setTipListener(tipListener);
078 }
079 ApplyListener applyListener;
080 public DataSourceEditor(String dataSourceCaption, ApplyListener applyListener) {
081 this.applyListener = applyListener;
082 add(new JLabel(dataSourceCaption));
083 SimpleRowPanel panel = new SimpleRowPanel();
084 panel.add(typeCb);
085 dbPanel.add(new JLabel(":"));
086 dbPanel.add(gcDbGroup);
087 panel.add(dbPanel);
088 panel.add(new JLabel(":"));
089 panel.add(protoCb);
090 panel.add(csvPanel);
091 panel.add(test);
092 add(panel);
093 typeCb.addItemListener(typeCbListener);
094 }
095 public void applyChanges() {
096 if (data.attribute("data_source") == null)
097 data.addAttribute("data_source", "");
098 if (dbPanel.isVisible())
099 data.attribute("data_source").setValue(typeCb.getSelectedType() + ":" + gcDbGroup.getSelectedGroup() + ":" + protoCb.getSelectedPrototype());
100 else
101 data.attribute("data_source").setValue(typeCb.getSelectedType() + ":" + protoCb.getSelectedPrototype());
102 }
103 public void setData(Object data) throws MactorException {
104 this.data = (Element) data;
105 String command = this.data.attributeValue("data_source");
106 String[] parts = null;
107 if (command != null)
108 parts = command.split(":");
109 String type = null;
110 String group = null;
111 String proto = null;
112 if (parts != null) {
113 if (parts.length >= 1)
114 type = parts[0];
115 if (parts.length > 2) {
116 proto = parts[2];
117 group = parts[1];
118 } else if (parts.length == 2)
119 proto = parts[1];
120 }
121 typeCb.setSelectedType(type);
122 gcDbGroup.setSelectedGroup(group);
123 protoCb.setSelectedPrototype(proto);
124 if (!"sql".equalsIgnoreCase(type))
125 dbPanel.setVisible(false);
126 ;
127 }
128 public void setConfig(NodeEditorConfig config) {
129 typeCb.setConfig(config.getCommandTypes());
130 }
131 private class CsvPanel extends SimpleRowPanel {
132 JButton csvEdit = new JButton(new AbstractAction("Edit...") {
133 public void actionPerformed(ActionEvent e) {
134 applyListener.onApply();
135 String name = protoCb.getSelectedPrototype();
136 if (name != null && name.length() > 0) {
137 File path = ProjectContext.getGlobalInstance().getAbsolutePath(name);
138 if (!path.exists()) {
139 if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(CsvPanel.this, "The file '" + name + "' does not exist. Create it?", "Create file", JOptionPane.OK_CANCEL_OPTION)) {
140 return;
141 }
142 try {
143 FileWriter fw = new FileWriter(path);
144 fw.write("MyParam1;MyParam2\nval01;val02\nval11;val12");
145 fw.close();
146 } catch (IOException ioe) {
147 GuiUtil.showGuiError(DataSourceEditor.this, ioe);
148 return;
149 }
150 }
151 new TextFileEditor(name, "Edit CSV File", "Tip: use a real editor").setVisible(true);
152 }
153 }
154 });
155 JFileChooser fc = new JFileChooser(ProjectContext.getGlobalInstance().getProjectDir());
156 JButton selectButton = new JButton(new AbstractAction("Select..") {
157 public void actionPerformed(ActionEvent e) {
158 try {
159 if (protoCb.getSelectedPrototype() != null && protoCb.getSelectedPrototype().toLowerCase().endsWith(".csv"))
160 fc.setSelectedFile(ProjectContext.getGlobalInstance().getAbsolutePath(protoCb.getSelectedPrototype()));
161 fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
162 int returnVal = fc.showOpenDialog(DataSourceEditor.this);
163 if (returnVal == JFileChooser.APPROVE_OPTION) {
164 File f = fc.getSelectedFile();
165 if (!f.getName().toLowerCase().endsWith(".csv"))
166 f = new File(f.getAbsolutePath() + ".csv");
167 f.createNewFile();
168 protoCb.setSelectedPrototype(ProjectContext.getGlobalInstance().getRelativePath(f));
169 }
170 } catch (IOException ioe) {
171 GuiUtil.showGuiError(DataSourceEditor.this, ioe);
172 }
173 }
174 });
175 public CsvPanel() {
176 add(selectButton);
177 add(csvEdit);
178 }
179 }
180 }