package org.basex.gui.dialog; import static org.basex.core.Text.*; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.nio.charset.Charset; import java.util.Locale; import java.util.SortedMap; import org.basex.core.Prop; import org.basex.gui.GUI; import org.basex.gui.GUIConstants.Msg; import org.basex.gui.layout.BaseXBack; import org.basex.gui.layout.BaseXButton; import org.basex.gui.layout.BaseXCheckBox; import org.basex.gui.layout.BaseXCombo; import org.basex.gui.layout.BaseXFileChooser; import org.basex.gui.layout.BaseXFileChooser.Mode; import org.basex.gui.layout.BaseXLabel; import org.basex.gui.layout.BaseXLayout; import org.basex.gui.layout.BaseXTextField; import org.basex.gui.layout.TableLayout; import org.basex.io.IOFile; import org.basex.io.serial.SerializerProp; /** * Dialog window for changing some project's preferences. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class DialogExport extends Dialog { /** Available encodings. */ private static final String[] ENCODINGS; /** Directory path. */ private final BaseXTextField path; /** Database info. */ private final BaseXLabel info; /** XML formatting. */ private final BaseXCheckBox format; /** Encoding. */ private final BaseXCombo encoding; /** Buttons. */ private final BaseXBack buttons; // initialize encodings static { final SortedMap<String, Charset> cs = Charset.availableCharsets(); ENCODINGS = cs.keySet().toArray(new String[cs.size()]); } /** * Default constructor. * @param main reference to the main window */ public DialogExport(final GUI main) { super(main, EXPORT_XML); // create checkboxes final BaseXBack pp = new BaseXBack(new TableLayout(3, 1, 0, 4)); BaseXBack p = new BaseXBack(new TableLayout(2, 2, 8, 0)); /* Output label. */ final BaseXLabel out = new BaseXLabel( OUTPUT_DIR + COL, true, true).border(0, 0, 6, 0); p.add(out); p.add(new BaseXLabel()); final String dir = new IOFile(gui.context.data().meta.original).dir(); path = new BaseXTextField(dir, this); path.addKeyListener(keys); p.add(path); final BaseXButton browse = new BaseXButton(BROWSE_D, this); browse.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { choose(); } }); p.add(browse); pp.add(p); p = new BaseXBack(new TableLayout(2, 1)); p.add(new BaseXLabel(ENCODING + COL, true, true).border(0, 0, 6, 0)); final Prop prop = gui.context.prop; SerializerProp sp; try { sp = new SerializerProp(prop.get(Prop.EXPORTER)); } catch(final IOException ex) { // ignore invalid serialization parameters sp = new SerializerProp(); } encoding = new BaseXCombo(this, ENCODINGS); String enc = gui.context.data().meta.encoding; boolean f = false; for(final String s : ENCODINGS) f |= s.equals(enc); if(!f) { enc = enc.toUpperCase(Locale.ENGLISH); for(final String s : ENCODINGS) f |= s.equals(enc); } encoding.setSelectedItem(f ? enc : sp.get(SerializerProp.S_ENCODING)); encoding.addKeyListener(keys); BaseXLayout.setWidth(encoding, BaseXTextField.DWIDTH); p.add(encoding); pp.add(p); format = new BaseXCheckBox(INDENT_WITH_WS, sp.get(SerializerProp.S_INDENT).equals(YES), 0, this); pp.add(format); set(pp, BorderLayout.CENTER); // create buttons p = new BaseXBack(new BorderLayout()); info = new BaseXLabel(" ").border(18, 0, 0, 0); p.add(info, BorderLayout.WEST); buttons = okCancel(); p.add(buttons, BorderLayout.EAST); set(p, BorderLayout.SOUTH); action(null); finish(null); } /** * Creates an encoding combo box. * @param dialog dialog reference * @param encoding original encoding * @return encoding combo box */ static BaseXCombo encoding(final Dialog dialog, final String encoding) { final BaseXCombo cb = new BaseXCombo(dialog, ENCODINGS); boolean f = false; String enc = encoding; for(final String s : ENCODINGS) f |= s.equals(enc); if(!f) { enc = enc.toUpperCase(Locale.ENGLISH); for(final String s : ENCODINGS) f |= s.equals(enc); } cb.setSelectedItem(enc); cb.addKeyListener(dialog.keys); return cb; } /** * Opens a file dialog to choose an XML document or directory. */ void choose() { final IOFile io = new BaseXFileChooser(CHOOSE_DIR, path.getText(), gui). select(Mode.DOPEN); if(io != null) path.setText(io.path()); } /** * Returns the chosen XML file or directory path. * @return file or directory */ public String path() { return path.getText().trim(); } @Override public void action(final Object cmp) { final IOFile io = new IOFile(path()); ok = !path().isEmpty(); info.setText(io.children().length > 0 ? DIR_NOT_EMPTY : null, ok ? Msg.WARN : Msg.ERROR); enableOK(buttons, B_OK, ok); } @Override public void close() { if(!ok) return; super.close(); final boolean indent = format.isSelected(); gui.set(Prop.EXPORTER, SerializerProp.S_INDENT[0] + "=" + (indent ? YES : NO) + ',' + SerializerProp.S_ENCODING[0] + '=' + encoding.getSelectedItem() + ',' + SerializerProp.S_OMIT_XML_DECLARATION[0] + '=' + NO); } }