package org.basex.gui.dialog; import static org.basex.core.Text.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.border.*; import org.basex.core.Prop; import org.basex.gui.GUI; import org.basex.gui.GUIProp; 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.BaseXTextField; import org.basex.gui.layout.TableLayout; import org.basex.io.IO; import org.basex.util.ft.FTLexer; import org.basex.util.ft.Language; import org.basex.util.list.StringList; /** * Full-text creation dialog. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ final class DialogFT extends BaseXBack { /** Language flag. */ private static final int F_LANG = 0; /** Wildcards flag. */ private static final int F_WILD = 1; /** Stemming flag. */ private static final int F_STEM = 2; /** Case flag. */ private static final int F_CASE = 3; /** Diacritics flag. */ private static final int F_DIA = 4; /** Scoring flag. */ private static final int F_SCORE = 5; /** Stopwords flag. */ private static final int F_STOP = 6; /** Number of flags. */ private static final int FLAGS = 7; /** Dialog reference. */ private final Dialog dialog; /** Full-text indexing. */ private final BaseXCheckBox[] check = new BaseXCheckBox[FLAGS]; /** Full-text labels. */ private final BaseXLabel[] labels = new BaseXLabel[FLAGS]; /** Full-text language. */ private final BaseXCombo language; /** Full-text scoring type. */ private final BaseXCombo scoring; /** Path for Full-text stopword list. */ private final BaseXTextField swpath; /** Path button for full-text stopword list path. */ private final BaseXButton swbrowse; /** * Constructor. * @param d dialog reference * @param create create dialog */ DialogFT(final Dialog d, final boolean create) { dialog = d; layout(new TableLayout(create ? 9 : 16, 1)); final Prop prop = d.gui.context.prop; add(new BaseXLabel(H_FULLTEXT_INDEX, true, false).border(0, 0, 12, 0)); final String sw = prop.get(Prop.STOPWORDS); final String[] cb = { LANGUAGE, SUPPORT_WILDCARDS, STEMMING, CASE_SENSITIVITY, DIACRITICS, TFIDF_SCORING, STOPWORD_LIST }; final String[] desc = { H_LANGUAGE, H_WILDCARD, H_STEMMING, H_CASE, H_DIACRITICS, H_SCORING, H_STOPWORDS }; final boolean[] val = { !prop.get(Prop.LANGUAGE).isEmpty(), prop.is(Prop.WILDCARDS), prop.is(Prop.STEMMING), prop.is(Prop.CASESENS), prop.is(Prop.DIACRITICS), prop.num(Prop.SCORING) > 0, !sw.isEmpty() }; for(int f = 0; f < check.length; ++f) { check[f] = new BaseXCheckBox(cb[f], val[f], create ? 1 : 0, d); if(!create) { labels[f] = new BaseXLabel(desc[f], true, false); } else { check[f].setToolTipText(desc[f]); } } final BaseXBack b1 = new BaseXBack(new TableLayout(1, 2, 8, 0)); b1.add(check[F_LANG]); final StringList langs = FTLexer.languages(); language = new BaseXCombo(d, langs.toArray()); final Language ln = Language.get(prop); for(final String l : langs) { final String s = l.replaceFirst(" \\(.*", ""); if(s.equals(ln.toString())) language.setSelectedItem(l); } b1.add(language); add(b1); if(!create) add(labels[F_LANG]); for(int f = 1; f < F_SCORE; ++f) { add(check[f]); if(!create) add(labels[f]); } final BaseXBack b2 = new BaseXBack(new TableLayout(1, 2, 8, 0)); b2.add(check[F_SCORE]); scoring = new BaseXCombo(d, DOCUMENTS, TEXT_NODES); b2.add(scoring); add(b2); if(!create) add(labels[F_SCORE]); add(check[F_STOP]); check[F_STOP].setBorder(new EmptyBorder(0, 0, 4, 0)); final BaseXBack b3 = new BaseXBack(new TableLayout(1, 2, 8, 0)); swpath = new BaseXTextField(sw.isEmpty() ? d.gui.gprop.get(GUIProp.STOPPATH) : sw, d); b3.add(swpath); swbrowse = new BaseXButton(BROWSE_D, d); swbrowse.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { chooseStop(); } }); b3.add(swbrowse); add(b3); if(!create) add(labels[F_STOP]); } /** * Opens a file dialog to choose a stopword list. */ void chooseStop() { final GUIProp gprop = dialog.gui.gprop; final BaseXFileChooser fc = new BaseXFileChooser(FILE_OR_DIR, gprop.get(GUIProp.STOPPATH), dialog.gui); final IO file = fc.select(Mode.FOPEN); if(file != null) { swpath.setText(file.path()); gprop.set(GUIProp.STOPPATH, file.path()); } } /** * Reacts on user input. */ void action() { /* for(int f = 0; f < check.length; ++f) { check[f].setEnabled(ftx); if(labels[f] != null) labels[f].setEnabled(ftx); } */ language.setEnabled(check[F_LANG].isSelected()); scoring.setEnabled(check[F_SCORE].isSelected()); swbrowse.setEnabled(check[F_STOP].isSelected()); swpath.setEnabled(check[F_STOP].isSelected()); final String sw = swpath.getText().trim(); final IO file = IO.get(sw); final boolean exists = !sw.isEmpty() && file.exists(); if(exists) dialog.gui.gprop.set(GUIProp.STOPPATH, sw); } /** * Sets the chosen options. */ void setOptions() { final GUI gui = dialog.gui; final String lang = language.getSelectedItem().toString(); gui.set(Prop.LANGUAGE, check[F_LANG].isSelected() ? Language.get(lang.replaceFirst(" \\(.*", "")).toString() : ""); gui.set(Prop.STEMMING, check[F_STEM].isSelected()); gui.set(Prop.CASESENS, check[F_CASE].isSelected()); gui.set(Prop.DIACRITICS, check[F_DIA].isSelected()); gui.set(Prop.WILDCARDS, check[F_WILD].isSelected()); gui.set(Prop.SCORING, check[F_SCORE].isSelected() ? scoring.getSelectedIndex() + 1 : 0); gui.set(Prop.STOPWORDS, check[F_STOP].isSelected() ? swpath.getText() : ""); } }