package org.basex.gui.dialog; import static org.basex.core.Text.*; import static org.basex.util.Token.*; import java.awt.BorderLayout; import java.awt.Dimension; import org.basex.core.Context; import org.basex.data.Data; import org.basex.gui.GUI; import org.basex.gui.GUIConstants.Msg; import org.basex.gui.layout.BaseXBack; import org.basex.gui.layout.BaseXLabel; import org.basex.gui.layout.BaseXLayout; import org.basex.gui.layout.BaseXEditor; import org.basex.gui.layout.BaseXTextField; import org.basex.util.Util; import org.basex.util.XMLToken; import org.basex.util.list.StringList; /** * Dialog window for editing XML nodes. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class DialogEdit extends Dialog { /** Resulting update arguments. */ public final StringList result = new StringList(); /** Node kind. */ public final int kind; /** Button panel. */ private final BaseXBack buttons; /** Info label. */ private final BaseXLabel info; /** Text area. */ private BaseXTextField input1; /** Text area. */ private BaseXTextField input2; /** Text area. */ private BaseXEditor input3; /** Old content. */ private String old1; /** Old content. */ private String old2; /** Old content. */ private byte[] old3; /** * Default constructor. * @param main reference to main frame * @param p pre value */ public DialogEdit(final GUI main, final int p) { super(main, EDIT_DATA); // create checkboxes BaseXBack pp = new BaseXBack(new BorderLayout()); final Context context = gui.context; final Data data = context.data(); kind = data.kind(p); final String title = Util.info(EDIT_X, NODE_KINDS[kind]); final BaseXLabel label = new BaseXLabel(title, true, true); pp.add(label, BorderLayout.NORTH); if(kind == Data.ELEM) { old1 = string(data.name(p, kind)); } else if(kind == Data.DOC) { old1 = string(data.text(p, true)); } else if(kind == Data.TEXT || kind == Data.COMM) { old3 = data.atom(p); } else if(kind == Data.ATTR) { old1 = string(data.name(p, kind)); old2 = string(data.atom(p)); } else { old1 = string(data.name(p, kind)); old3 = data.atom(p); } final BaseXBack b = new BaseXBack(new BorderLayout(0, 4)); if(old1 != null) { input1 = new BaseXTextField(old1, this); input1.addKeyListener(keys); BaseXLayout.setWidth(input1, 320); b.add(input1, BorderLayout.NORTH); } if(old2 != null) { input2 = new BaseXTextField(old2, this); input2.addKeyListener(keys); b.add(input2, BorderLayout.CENTER); } if(old3 != null) { input3 = new BaseXEditor(true, this); input3.setText(old3); input3.addKeyListener(keys); input3.setPreferredSize(new Dimension(320, 200)); b.add(input3, BorderLayout.CENTER); setResizable(true); } pp.add(b, BorderLayout.CENTER); set(pp, BorderLayout.CENTER); pp = new BaseXBack(new BorderLayout()); info = new BaseXLabel(" ").border(12, 0, 6, 0); pp.add(info, BorderLayout.WEST); // create buttons buttons = okCancel(); pp.add(buttons, BorderLayout.EAST); set(pp, BorderLayout.SOUTH); finish(null); } @Override public void action(final Object cmp) { String msg = null; ok = kind != Data.TEXT || input3.getText().length != 0; if(kind != Data.TEXT && kind != Data.COMM) { ok = XMLToken.isQName(token(input1.getText())); if(!ok && !input1.getText().isEmpty()) msg = Util.info(INVALID_X, NAME); } info.setText(msg, Msg.ERROR); enableOK(buttons, B_OK, ok); } @Override public void close() { super.close(); ok = false; if(old1 != null) { result.add(input1.getText()); ok |= !input1.getText().equals(old1); } if(old2 != null) { result.add(input2.getText()); ok |= !input2.getText().equals(old2); } if(old3 != null) { result.add(string(input3.getText())); ok |= !eq(input3.getText(), old3); } } }