@@ -2,24 +2,15 @@

import static org.basex.core.Text.*;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;

import org.basex.core.cmd.InfoDB;
import org.basex.data.Data;
import org.basex.data.DiskData;
import org.basex.gui.GUI;
import org.basex.gui.layout.BaseXBack;
import org.basex.gui.layout.BaseXButton;
import org.basex.gui.layout.BaseXCheckBox;
import org.basex.gui.layout.BaseXEditor;
import org.basex.gui.layout.BaseXLabel;
import org.basex.gui.layout.BaseXLayout;
import org.basex.gui.layout.BaseXTabs;
import java.awt.*;

import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.data.*;
import org.basex.gui.*;
import org.basex.gui.layout.*;
import org.basex.index.IndexToken.IndexType;
import org.basex.util.Token;
import org.basex.util.TokenBuilder;
import org.basex.util.*;

/**
* Database properties dialog.
@@ -28,23 +19,37 @@
* @author Christian Gruen
*/
public final class DialogProps extends Dialog {
/** Index checkboxes. */
private final BaseXCheckBox[] indexes = new BaseXCheckBox[4];
/** Button panel. */
private final BaseXBack buttons;
/** Optimize button. */
private final BaseXButton optimize;
/** Index types. */
private static final String[] HELP = {
"", "", H_PATH_INDEX, H_TEXT_INDEX, H_ATTR_INDEX, ""
};
/** Index types. */
private static final IndexType[] TYPES = {
IndexType.TAG, IndexType.ATTNAME, IndexType.PATH,
IndexType.TEXT, IndexType.ATTRIBUTE, IndexType.FULLTEXT
};
/** Label strings. */
private static final String[] LABELS = {
ELEMENTS, ATTRIBUTES, PATH_INDEX, TEXT_INDEX,
ATTRIBUTE_INDEX, FULLTEXT_INDEX };
/** Index labels. */
private final BaseXLabel[] labels = new BaseXLabel[LABELS.length];
/** Index buttons. */
private final BaseXButton[] indxs = new BaseXButton[LABELS.length];
/** Index information. */
private final BaseXEditor[] infos = new BaseXEditor[LABELS.length];
/** Index panels. */
private final BaseXBack[] panels = new BaseXBack[LABELS.length];
/** Full-text tab. */
private final BaseXBack tabFT;
/** Editable full-text options. */
private final DialogFT ft;

/** Resource panel. */
final DialogResources resources;
/** Add panel. */
final DialogAdd add;

/** Editable full-text options. */
private DialogFT ft;
/** Optimize flag. */
private boolean opt;

/**
* Default constructor.
* @param main reference to the main window
@@ -53,9 +58,6 @@ public DialogProps(final GUI main) {
super(main, DB_PROPS);
panel.setLayout(new BorderLayout(5, 0));

optimize = new BaseXButton(OPTIMIZE_D, this);
buttons = newButtons(optimize, B_OK, B_CANCEL);

// resource tree
resources = new DialogResources(this);

@@ -80,52 +82,41 @@ public DialogProps(final GUI main) {

// tab: resources
add = new DialogAdd(this);
ft = new DialogFT(this, false);
final BaseXBack tabRes = add.border(8);

for(int i = 0; i < LABELS.length; ++i) {
String lbl = LABELS[i];
if(!data.meta.uptodate) lbl += " (" + OUT_OF_DATE + ')';
labels[i] = new BaseXLabel(lbl).large();
panels[i] = new BaseXBack(new BorderLayout());
infos[i] = new BaseXEditor(false, this);
BaseXLayout.setHeight(infos[i], 200);
if(i >= 2) {
indxs[i] = new BaseXButton("", this);
indxs[i].setEnabled(data instanceof DiskData);
}
}

// tab: name indexes
final BaseXBack tabNames =
new BaseXBack(new GridLayout(2, 1, 0, 8)).border(8);
tabNames.add(addIndex(true, data));
tabNames.add(addIndex(false, data));

final String[] cb = {
PATH_INDEX, TEXT_INDEX, ATTRIBUTE_INDEX, FULLTEXT_INDEX };
final boolean[] val = { data.meta.pathindex, data.meta.textindex,
data.meta.attrindex, data.meta.ftxtindex };

final BaseXBack[] panels = new BaseXBack[indexes.length];
for(int i = 0; i < indexes.length; ++i) {
indexes[i] = new BaseXCheckBox(cb[i], val[i], 0, this).large();
indexes[i].setEnabled(data instanceof DiskData);
panels[i] = new BaseXBack(new BorderLayout());
}
add(0, tabNames, null);
add(1, tabNames, null);

// tab: path index
final BaseXBack tabPath = new BaseXBack(new GridLayout(1, 1)).border(8);
panels[0].add(indexes[0], BorderLayout.NORTH);
panels[0].add(text(val[0] ? data.info(IndexType.PATH) :
Token.token(H_PATH_INDEX)), BorderLayout.CENTER);
tabPath.add(panels[0]);
add(2, tabPath, null);

// tab: value indexes
final BaseXBack tabValues = new BaseXBack(new GridLayout(2, 1)).border(8);
panels[1].add(indexes[1], BorderLayout.NORTH);
panels[1].add(text(val[1] ? data.info(IndexType.TEXT) :
Token.token(H_TEXT_INDEX)), BorderLayout.CENTER);
tabValues.add(panels[1]);

panels[2].add(indexes[2], BorderLayout.NORTH);
panels[2].add(text(val[2] ? data.info(IndexType.ATTRIBUTE) :
Token.token(H_ATTR_INDEX)), BorderLayout.CENTER);
tabValues.add(panels[2]);
final BaseXBack tabValues =
new BaseXBack(new GridLayout(2, 1, 0, 8)).border(8);
add(3, tabValues, null);
add(4, tabValues, null);

// tab: full-text index
final BaseXBack tabFT = new BaseXBack(new GridLayout(1, 1)).border(8);
panels[3].add(indexes[3], BorderLayout.NORTH);
if(!val[3]) ft = new DialogFT(this, false);
panels[3].add(val[3] ? text(data.info(IndexType.FULLTEXT)) : ft,
BorderLayout.CENTER);
tabFT.add(panels[3]);
tabFT = new BaseXBack(new GridLayout(1, 1)).border(8);
add(5, tabFT, null);

final BaseXTabs tabs = new BaseXTabs(this);
tabs.addTab(GENERAL, tabInfo);
@@ -135,33 +126,28 @@ public DialogProps(final GUI main) {
tabs.addTab(INDEXES, tabValues);
tabs.addTab(FULLTEXT, tabFT);

final BaseXBack back = new BaseXBack(new BorderLayout());
back.add(tabs, BorderLayout.CENTER);
back.add(buttons, BorderLayout.SOUTH);

set(resources, BorderLayout.WEST);
set(back, BorderLayout.CENTER);
set(tabs, BorderLayout.CENTER);

action(null);
action(this);
setResizable(true);
setMinimumSize(getPreferredSize());
finish(null);
}

/**
* Adds an index panel.
* @param elem element/attribute flag
* @param data data reference
* @return panel
* Adds index information to the specified panel and tab.
* @param p index offset
* @param tab panel tab
* @param info optional info to display
*/
private BaseXBack addIndex(final boolean elem, final Data data) {
final BaseXBack p = new BaseXBack(new BorderLayout());
String lbl = elem ? ELEMENTS : ATTRIBUTES;
if(!data.meta.uptodate) lbl += " (" + OUT_OF_DATE + ')';
p.add(new BaseXLabel(lbl, false, true), BorderLayout.NORTH);
final IndexType index = elem ? IndexType.TAG : IndexType.ATTNAME;
p.add(text(data.info(index)), BorderLayout.CENTER);
return p;
private void add(final int p, final BaseXBack tab, final BaseXBack info) {
final BaseXBack idx = new BaseXBack(new BorderLayout());
idx.add(labels[p], BorderLayout.WEST);
if(indxs[p] != null) idx.add(indxs[p], BorderLayout.EAST);
panels[p].add(idx, BorderLayout.NORTH);
panels[p].add(info != null ? info : infos[p], BorderLayout.CENTER);
tab.add(panels[p]);
}

/**
@@ -176,38 +162,47 @@ private BaseXEditor text(final byte[] txt) {
return text;
}

/**
* Returns an array with the chosen indexes.
* @return check box
*/
public boolean[] indexes() {
final boolean[] in = new boolean[indexes.length];
for(int i = 0; i < indexes.length; ++i) in[i] = indexes[i].isSelected();
return in;
}

@Override
public void action(final Object cmp) {
for(int i = 0; i < LABELS.length; i++) {
if(indxs[i] == null || cmp != indxs[i]) continue;
final Command cmd = indxs[i].getText().equals(DROP) ?
new DropIndex(TYPES[i]) : new CreateIndex(TYPES[i]);
DialogProgress.execute(this, "", cmd);
return;
}

resources.action(cmp);
add.action(cmp);

opt = cmp == optimize;
if(opt) close();
if(ft != null) ft.action(indexes[3].isSelected());
enableOK(buttons, OPTIMIZE_D, !gui.context.data().meta.uptodate);
final Data data = gui.context.data();
final boolean[] val = {
true, true, data.meta.pathindex, data.meta.textindex,
data.meta.attrindex, data.meta.ftxtindex
};

if(cmp == this) {
for(int i = 0; i < LABELS.length; ++i) {
String lbl = LABELS[i];
if(i < 3 && !data.meta.uptodate) lbl += " (" + OUT_OF_DATE + ')';
labels[i].setText(lbl);
infos[i].setText(val[i] ? data.info(TYPES[i]) : Token.token(HELP[i]));
if(indxs[i] != null) indxs[i].setText(val[i] ? DROP : CREATE);
}
// full-text options
tabFT.removeAll();
panels[5].removeAll();
add(5, tabFT, val[5] ? null : ft);
panels[5].revalidate();
panels[5].repaint();
}

ft.action();
}

@Override
public void close() {
super.close();
if(ft != null) ft.setOptions();
}

/**
* Returns the optimize flag.
* @return flag
*/
public boolean optimize() {
return opt;
ft.setOptions();
}
}
@@ -90,7 +90,7 @@ final class DialogUser extends BaseXBack {
pass.addKeyListener(dia.keys);
BaseXLayout.setWidth(pass, 100);
alter = new BaseXButton(S_ALTER, dia);
drop = new BaseXButton(DROP_D, dia);
drop = new BaseXButton(DROP + DOTS, dia);
info = new BaseXLabel(" ");

add(new BaseXLabel(S_CREATEU + COLS, false, true));