package org.basex.gui.dialog;
import static org.basex.core.Text.*;
import static org.basex.util.Token.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import org.basex.data.Data;
import org.basex.gui.GUI;
import org.basex.gui.GUIConstants;
import org.basex.gui.GUIProp;
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.BaseXRadio;
import org.basex.gui.layout.BaseXEditor;
import org.basex.gui.layout.BaseXTextField;
import org.basex.gui.layout.TableLayout;
import org.basex.util.Util;
import org.basex.util.XMLToken;
import org.basex.util.list.StringList;
/**
* Dialog window for inserting new database nodes.
* @author BaseX Team 2005-12, BSD License
* @author Lukas Kircher
*/
public final class DialogInsert extends Dialog {
/** Resulting update arguments. */
public final StringList result = new StringList();
/** Node kind. */
public int kind;
/** Button panel. */
private final BaseXBack buttons;
/** Background panel. */
private final BaseXBack back;
/** Info label. */
private final BaseXLabel info;
/** Text area. */
private final BaseXTextField input1;
/** Text area. */
private final BaseXEditor input2;
/** First label. */
private final BaseXLabel label1;
/** Second label. */
private final BaseXLabel label2;
/** Insert kind selection buttons. */
private final BaseXRadio[] radio;
/**
* Default constructor.
* @param main reference to the main window
*/
public DialogInsert(final GUI main) {
super(main, INSERT_NEW_DATA);
label1 = new BaseXLabel(NAME + COLS, true, true).border(0, 0, 0, 0);
label2 = new BaseXLabel(VALUE + COLS, true, true).border(0, 0, 0, 0);
input1 = new BaseXTextField(this);
input1.addKeyListener(keys);
BaseXLayout.setWidth(input1, 320);
input2 = new BaseXEditor(true, this);
input2.setFont(GUIConstants.mfont);
input2.addKeyListener(keys);
BaseXLayout.setWidth(input2, 320);
final BaseXBack knd = new BaseXBack(new TableLayout(1, 5));
final ButtonGroup group = new ButtonGroup();
final ActionListener al = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
change(e.getSource());
}
};
final int lkind = gui.gprop.num(GUIProp.LASTINSERT);
radio = new BaseXRadio[NODE_KINDS.length];
for(int i = 1; i < NODE_KINDS.length; ++i) {
radio[i] = new BaseXRadio(NODE_KINDS[i], false, this);
radio[i].addActionListener(al);
radio[i].setSelected(i == lkind);
radio[i].addKeyListener(keys);
group.add(radio[i]);
knd.add(radio[i]);
}
set(knd, BorderLayout.NORTH);
back = new BaseXBack(10, 0, 0, 0);
set(back, BorderLayout.CENTER);
final BaseXBack pp = new BaseXBack(new BorderLayout());
info = new BaseXLabel(" ").border(12, 0, 6, 0);
pp.add(info, BorderLayout.WEST);
buttons = okCancel();
pp.add(buttons, BorderLayout.EAST);
set(pp, BorderLayout.SOUTH);
setResizable(true);
change(radio[lkind]);
action(null);
finish(null);
}
/**
* Activates the specified radio button.
* @param src button reference
*/
void change(final Object src) {
int n = 0;
for(int r = 0; r < radio.length; ++r) if(src == radio[r]) n = r;
BaseXLayout.setHeight(input2, n == Data.ATTR ? 25 : 200);
back.removeAll();
back.layout(new BorderLayout(0, 4));
if(n != Data.TEXT && n != Data.COMM) {
final BaseXBack b = new BaseXBack(new BorderLayout(0, 4));
b.add(label1, BorderLayout.NORTH);
b.add(input1, BorderLayout.CENTER);
back.add(b, BorderLayout.NORTH);
}
if(n != Data.ELEM) {
final BaseXBack b = new BaseXBack(new BorderLayout(0, 4));
b.add(label2, BorderLayout.NORTH);
b.add(input2, BorderLayout.CENTER);
back.add(b, BorderLayout.CENTER);
}
pack();
}
@Override
public void action(final Object cmp) {
for(int i = 1; i < NODE_KINDS.length; ++i) {
if(radio[i].isSelected()) kind = i;
}
gui.gprop.set(GUIProp.LASTINSERT, kind);
String msg = null;
ok = kind != Data.TEXT || input2.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();
final String in1 = input1.getText();
final String in2 = string(input2.getText());
switch(kind) {
case Data.ATTR: case Data.PI:
result.add(in1).add(in2);
break;
case Data.ELEM:
result.add(in1);
break;
case Data.TEXT: case Data.COMM:
result.add(in2);
break;
}
}
}