PageRenderTime 45ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/bundles/plugins-trunk/XML/xml/translate/TrangGUI.java

#
Java | 540 lines | 409 code | 104 blank | 27 comment | 26 complexity | 48aceaa2bcb0b86868fa47114b3a397e 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. * TrangGUI.java
  3. * :folding=explicit:collapseFolds=1:
  4. *
  5. * Copyright (C) 2010 Eric Le Lay
  6. *
  7. * The XML plugin is licensed under the GNU General Public License, with
  8. * the following exception:
  9. *
  10. * "Permission is granted to link this code with software released under
  11. * the Apache license version 1.1, for example used by the Xerces XML
  12. * parser package."
  13. *
  14. * This class has been inspired by
  15. * jing-trang-20090818/mod/trang/src/main/com/thaiopensource/relaxng/translate/Driver.java
  16. */
  17. package xml.translate;
  18. //{{{ imports
  19. //{{{ standard imports
  20. import java.util.Collections;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. import java.util.ArrayList;
  24. import java.util.Map;
  25. import java.util.HashMap;
  26. import java.beans.PropertyChangeListener;
  27. import java.beans.PropertyChangeEvent;
  28. import javax.swing.BorderFactory;
  29. import javax.swing.JCheckBox;
  30. import javax.swing.JComboBox;
  31. import javax.swing.JLabel;
  32. import javax.swing.JPanel;
  33. import javax.swing.JScrollPane;
  34. import javax.swing.JTextArea;
  35. import javax.swing.JTextField;
  36. import javax.swing.JComponent;
  37. import javax.swing.SwingUtilities;
  38. import java.awt.Color;
  39. import java.awt.BorderLayout;
  40. import java.awt.Component;
  41. import java.awt.Container;
  42. import java.awt.CardLayout;
  43. import java.awt.event.ItemListener;
  44. import java.awt.event.ItemEvent;
  45. import java.awt.event.KeyEvent;
  46. import java.awt.event.KeyAdapter;
  47. //}}}
  48. // jEdit
  49. import org.gjt.sp.jedit.gui.EnhancedDialog;
  50. import org.gjt.sp.jedit.View;
  51. import org.gjt.sp.jedit.Buffer;
  52. import org.gjt.sp.jedit.jEdit;
  53. import org.gjt.sp.util.Log;
  54. // common controls
  55. import common.gui.OkCancelButtons;
  56. import common.gui.ListPanel;
  57. import common.gui.pathbuilder.PathBuilder;
  58. import ise.java.awt.KappaLayout;
  59. import xml.gui.VFSFileTextField;
  60. import xml.gui.VFSFileList;
  61. //}}}
  62. /**
  63. * graphical front-end to Trang operations.
  64. */
  65. public class TrangGUI extends EnhancedDialog {
  66. private static final String OUTPUT_TYPE_PROP = "xml.translate.output-type";
  67. private View view;
  68. private Buffer buffer;
  69. private VFSFileTextField inputField;
  70. private VFSFileTextField outputField;
  71. private JComboBox inputTypeBox;
  72. private JComboBox outputTypeBox;
  73. private Map<String, Options> inputOptions;
  74. private Map<String, Options> outputOptions;
  75. public TrangGUI(View parent, Buffer buffer){
  76. super(parent, "Trang GUI", false);
  77. this.view = view;
  78. this.buffer = buffer;
  79. inputOptions = new HashMap<String,Options>();
  80. outputOptions = new HashMap<String,Options>();
  81. Container c = getContentPane();
  82. c.setLayout(new KappaLayout());
  83. JLabel l;
  84. l = new JLabel("Input:");
  85. c.add(l, "0, 0, 2, 1, E, 0, 5");
  86. inputField = new VFSFileTextField(view, "xml.translate.input");
  87. inputField.setFile(buffer.getPath());
  88. inputField.addPropertyChangeListener(new PropertyChangeListener(){
  89. public void propertyChange(PropertyChangeEvent pce){
  90. if("file".equals(pce.getPropertyName())){
  91. String path = (String)pce.getNewValue();
  92. final String extension = path.substring(path.length() - 3);
  93. if(Arrays.asList(TrangTranslator.inputTypes).contains(extension))
  94. {
  95. SwingUtilities.invokeLater(new Runnable(){
  96. public void run(){
  97. inputTypeBox.setSelectedItem(extension);
  98. }
  99. });
  100. }
  101. }
  102. }
  103. });
  104. c.add(inputField, "2, 0, 7, 1, W, w, 5");
  105. l = new JLabel("Input Type:");
  106. c.add(l, "0, 1, 2, 1, E, 0, 5");
  107. inputTypeBox = new JComboBox(TrangTranslator.inputTypes);
  108. inputTypeBox.setName("input-type");
  109. c.add(inputTypeBox, "2, 1, 3, 1, W, 0, 5");
  110. final CardLayout inputOptionsLayout = new CardLayout();
  111. final JPanel inputOptionsPanel = new JPanel(inputOptionsLayout);
  112. inputOptionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK),"Options..."));
  113. inputOptions.put("rng",new Options(""));
  114. inputOptions.put("rnc",new Options(""));
  115. inputOptions.put("xml",new XMLOptions());
  116. inputOptions.put("dtd",new DTDOptions());
  117. outputOptions.put("rng",new Options(""));
  118. outputOptions.put("rnc",new Options(""));
  119. outputOptions.put("dtd",new Options(""));
  120. outputOptions.put("xsd",new XSDOptions());
  121. for(Map.Entry<String,Options> options: inputOptions.entrySet()){
  122. inputOptionsPanel.add(options.getValue(),options.getKey());
  123. }
  124. c.add(inputOptionsPanel, "2, 2, 8, 8, 0, hw, 5");
  125. inputTypeBox.addItemListener(new ItemListener(){
  126. public void itemStateChanged(ItemEvent evt) {
  127. String newInputType = (String)inputTypeBox.getSelectedItem();
  128. inputOptionsLayout.show(inputOptionsPanel, (String)evt.getItem());
  129. for(Options o:outputOptions.values()){
  130. o.inputTypeChanged(newInputType);
  131. }
  132. }
  133. });
  134. String _guessed = TrangTranslator.guessInputType(buffer);
  135. if(_guessed == null){
  136. _guessed = "rng";
  137. }
  138. final String guessed = _guessed;
  139. inputTypeBox.setSelectedItem(guessed);
  140. l = new JLabel("Output:");
  141. c.add(l, "0, 10, 2, 1, E, 0, 5");
  142. String outputType = jEdit.getProperty(OUTPUT_TYPE_PROP,"rng");
  143. String output;
  144. if(buffer.getPath().endsWith(guessed)){
  145. output = buffer.getPath().replaceAll(guessed+"$",outputType);
  146. }else{
  147. output = buffer.getPath() + "." + outputType;
  148. }
  149. outputField = new VFSFileTextField(view,"xml.translate.output");
  150. outputField.setFile(buffer.getPath());
  151. c.add(outputField, "2, 10, 7, 1, W, w, 5");
  152. l = new JLabel("Output Type:");
  153. c.add(l, "0, 11, 2, 1, E, 0, 5");
  154. outputTypeBox = new JComboBox(TrangTranslator.outputTypes);
  155. outputTypeBox.setName("output-type");
  156. c.add(outputTypeBox, "2, 11, 7, 1, W, w, 5");
  157. final CardLayout outputOptionsLayout = new CardLayout();
  158. final JPanel outputOptionsPanel = new JPanel(outputOptionsLayout);
  159. for(Map.Entry<String,Options> options: outputOptions.entrySet()){
  160. outputOptionsPanel.add(options.getValue(),options.getKey());
  161. }
  162. c.add(outputOptionsPanel, "2, 12, 8, 8, 0, hw, 5");
  163. outputTypeBox.addItemListener(new ItemListener(){
  164. private String oldOutputType = guessed;
  165. public void itemStateChanged(ItemEvent evt) {
  166. String newOutputType = (String)outputTypeBox.getSelectedItem();
  167. outputOptionsLayout.show(outputOptionsPanel, newOutputType);
  168. for(Options o:inputOptions.values()){
  169. o.outputTypeChanged(newOutputType);
  170. }
  171. if(outputField.getFile().endsWith(oldOutputType)){
  172. String out = outputField.getFile();
  173. outputField.setFile(out.substring(0,out.length()-3)+newOutputType);
  174. oldOutputType = newOutputType;
  175. }
  176. }
  177. });
  178. outputTypeBox.setSelectedItem(guessed);
  179. c.add(new OkCancelButtons(this),"0, 20, 10, 1, S, 5");
  180. pack();
  181. }
  182. public void ok(){
  183. List<String> inputs;
  184. List<String> inputParams;
  185. List<String> outputParams;
  186. Options selectedInputOptions = inputOptions.get((String)inputTypeBox.getSelectedItem());
  187. Options selectedOutputOptions = outputOptions.get((String)outputTypeBox.getSelectedItem());
  188. if(selectedInputOptions instanceof XMLOptions){
  189. XMLOptions xo = (XMLOptions)selectedInputOptions;
  190. inputs = new ArrayList<String>();
  191. inputs.add(inputField.getFile());
  192. inputs.addAll(xo.getOptions());
  193. inputParams = Collections.<String>emptyList();
  194. }else{
  195. inputs = Collections.singletonList(inputField.getFile());
  196. inputParams = selectedInputOptions.getOptions();
  197. }
  198. outputParams = selectedOutputOptions.getOptions();
  199. jEdit.setProperty(OUTPUT_TYPE_PROP,(String)outputTypeBox.getSelectedItem());
  200. selectedInputOptions.saveOptions();
  201. selectedOutputOptions.saveOptions();
  202. TrangTranslator.translate(view,
  203. (String)inputTypeBox.getSelectedItem(),
  204. inputs,
  205. inputParams,
  206. (String)outputTypeBox.getSelectedItem(),
  207. outputField.getFile(),
  208. outputParams);
  209. setVisible(false);
  210. }
  211. public void cancel(){
  212. setVisible(false);
  213. }
  214. class Options extends JPanel{
  215. private int y;
  216. private String propertyPrefix;
  217. protected Map<String,Option> options;
  218. Options(String propertyPrefix){
  219. super(new KappaLayout());
  220. this.propertyPrefix=propertyPrefix;
  221. options = new HashMap<String,Option>();
  222. }
  223. protected final void addStringOption(String name){
  224. JLabel l = new JLabel(jEdit.getProperty(propertyPrefix+name+".label"));
  225. add(l,"0, "+y+", 1, 1, E, 0, 5");
  226. StringOption option = new StringOption(name);
  227. option.setToolTipText(jEdit.getProperty(propertyPrefix+name+".tooltip"));
  228. option.setParamValue(jEdit.getProperty(propertyPrefix+name));
  229. options.put(name,option);
  230. add(option, "1, "+y+", 8, 1, W, w, 5");
  231. y++;
  232. }
  233. protected final void addCustomOption(String name,JComponent comp, int h){
  234. JLabel l = new JLabel(jEdit.getProperty(propertyPrefix+name+".label"));
  235. add(l,"0, "+y+", 1, 1, E, 0, 5");
  236. add(comp, "1, "+y+", 8, "+h+", W, w, 5");
  237. y+=h;
  238. }
  239. protected final void addCheckOption(String name, boolean isNoOption){
  240. CheckOption option = new CheckOption(name
  241. ,jEdit.getProperty(propertyPrefix+name+".label")
  242. ,isNoOption);
  243. option.setToolTipText(jEdit.getProperty(propertyPrefix+name+".tooltip"));
  244. option.setParamValue(jEdit.getProperty(propertyPrefix+name));
  245. options.put(name,option);
  246. add(option, "1, "+y+", 8, 1, W, 0, 5");
  247. y++;
  248. }
  249. protected final void addComboOption(String name, String[] values){
  250. JLabel l = new JLabel(jEdit.getProperty(name+".label"));
  251. add(l,"0, "+y+", 1, 1, E, 0, 5");
  252. ComboOption option = new ComboOption(name,values);
  253. option.setToolTipText(jEdit.getProperty(propertyPrefix+name+".tooltip"));
  254. option.setParamValue(jEdit.getProperty(propertyPrefix+name));
  255. options.put(name,option);
  256. add(option, "1, "+y+", 8, 1, W, w, 5");
  257. y++;
  258. }
  259. public List<String> getOptions(){
  260. List<String> res = new ArrayList<String>();
  261. for(Option o: options.values()){
  262. if(o.hasValue()){
  263. res.add(o.getParamValue());
  264. }
  265. }
  266. return res;
  267. }
  268. public void saveOptions(){
  269. for(Option o: options.values()){
  270. jEdit.setProperty(propertyPrefix+o.getName(),o.getParamValue());
  271. }
  272. }
  273. public void inputTypeChanged(String newInputType){}
  274. public void outputTypeChanged(String newOutputType){}
  275. }
  276. class XMLOptions extends Options{
  277. private VFSFileList list;
  278. XMLOptions(){
  279. super("xml.translate.xml.");
  280. setLayout(new BorderLayout());
  281. JLabel l = new JLabel(jEdit.getProperty("xml.translate.xml-inputs.label"));
  282. l.setAlignmentX(l.LEFT_ALIGNMENT);
  283. add(l,BorderLayout.NORTH);
  284. list = new VFSFileList(view,"xml.translate.xml-inputs");
  285. add(list, BorderLayout.CENTER);
  286. }
  287. public List<String> getOptions(){
  288. Object[] paths = list.getItems();
  289. ArrayList<String> al = new ArrayList<String>();
  290. for(int i=0;i<paths.length;i++){
  291. al.add((String)paths[i]);
  292. }
  293. return al;
  294. }
  295. }
  296. class DTDOptions extends Options{
  297. JTextArea namespaces;
  298. DTDOptions(){
  299. super("xml.translate.dtd.");
  300. addStringOption("xmlns");
  301. addCustomOption("namespaces",initNamespaces(),2);
  302. addStringOption("colon-replacement");
  303. addStringOption("element-define");
  304. addCheckOption("inline-attlist",true);
  305. addStringOption("attlist-define");
  306. addStringOption("any-name");
  307. addCheckOption("strict-any",false);
  308. addStringOption("annotation-prefix");
  309. addCheckOption("generate-start",false);
  310. }
  311. private JComponent initNamespaces(){
  312. namespaces = new JTextArea(3,30);
  313. namespaces.setName("namespaces");
  314. namespaces.setText(jEdit.getProperty("xml.translate.dtd.namespaces",""));
  315. namespaces.setToolTipText(jEdit.getProperty("xml.translate.dtd.namespaces.tooltip"));
  316. namespaces.addKeyListener(new KeyAdapter(){
  317. public void keyPressed(KeyEvent e){
  318. if(KeyEvent.VK_ENTER == e.getKeyCode()){
  319. namespaces.setText(namespaces.getText()+"\n");
  320. e.consume();
  321. }
  322. }
  323. public void keyReleased(KeyEvent e){
  324. if(KeyEvent.VK_ENTER == e.getKeyCode()){
  325. e.consume();
  326. }
  327. }
  328. });
  329. JScrollPane scr = new JScrollPane(namespaces);
  330. //scr.setVerticalScrollBarPolicy(scr.VERTICAL_SCROLLBAR_NEVER);
  331. return scr;
  332. }
  333. public void outputTypeChanged(String newOutputType){
  334. options.get("inline-attlist").setParamValue(
  335. "xsd".equals(newOutputType)?
  336. "inline-attlist" : "no-inline-attlist");
  337. }
  338. @Override
  339. public List<String> getOptions(){
  340. List<String> opts = super.getOptions();
  341. String[] nsa = namespaces.getText().split("\\s+");
  342. for(String ns : nsa){
  343. if(!"".equals(ns))opts.add(ns);
  344. }
  345. return opts;
  346. }
  347. @Override
  348. public void saveOptions(){
  349. super.saveOptions();
  350. jEdit.setProperty("xml.translate.dtd.namespaces",namespaces.getText());
  351. }
  352. }
  353. class XSDOptions extends Options{
  354. XSDOptions(){
  355. super("xml.translate.xsd.");
  356. String[] process = {"strict","lax","skip"};
  357. addCheckOption("disable-abstract-elements",false);
  358. addComboOption("any-process-contents",process);
  359. addComboOption("any-attribute-process-contents",process);
  360. }
  361. public void inputTypeChanged(String newInputType){
  362. options.get("any-process-contents")
  363. .setParamValue("dtd".equals(newInputType) ? "strict" :"skip");
  364. }
  365. }
  366. interface Option {
  367. public String getParamValue();
  368. public void setParamValue(String value);
  369. public boolean hasValue();
  370. public String getName();
  371. }
  372. class StringOption extends JTextField implements Option{
  373. StringOption(String name){
  374. super(20);
  375. setName(name);
  376. }
  377. public String getParamValue(){
  378. return getName()+"="+getText();
  379. }
  380. public void setParamValue(String value){
  381. if(value.startsWith(getName()+"=")){
  382. setText(value.substring(getName().length()+1));
  383. }else{
  384. setText(value);
  385. }
  386. }
  387. public boolean hasValue(){
  388. return getText().length()>0;
  389. }
  390. }
  391. class CheckOption extends JCheckBox implements Option{
  392. private boolean noOption;
  393. CheckOption(String name, String label, boolean noOption){
  394. super(label);
  395. setName(name);
  396. this.noOption = noOption;
  397. }
  398. public String getParamValue(){
  399. if(isSelected()){
  400. return getName();
  401. }else{
  402. if(noOption){
  403. return "no-"+getName();
  404. }else{
  405. return null;
  406. }
  407. }
  408. }
  409. public void setParamValue(String value){
  410. setSelected(getName().equals(value));
  411. }
  412. public boolean hasValue(){
  413. // if xxx doesn't have a no-xxx variant, then don't use it if it's not selected
  414. return noOption || isSelected();
  415. }
  416. }
  417. class ComboOption extends JComboBox implements Option{
  418. ComboOption(String name, String[] values){
  419. super(values);
  420. setName(name);
  421. }
  422. public String getParamValue(){
  423. return getName()+"="+getSelectedItem();
  424. }
  425. public void setParamValue(String value){
  426. if(value.startsWith(getName()+"=")){
  427. setSelectedItem(value.substring(getName().length()+1));
  428. }else{
  429. setSelectedItem(value);
  430. }
  431. }
  432. public boolean hasValue(){
  433. return true;
  434. }
  435. }
  436. }