/* WordList.java - main list of words in the dictionary. * * Copyright (c) 2009-2011 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com> * Distributed under EPL/LGPL/GPL/AL/BSD multi-license. */ package wiwordik.search_window; import wikokit.base.wikt.sql.TLang; import wikokit.base.wikt.sql.TPage; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.EventHandler; import wikokit.base.wikipedia.sql.Connect; import wikokit.base.wikipedia.language.LanguageType; import wikokit.base.wikt.sql.index.IndexForeign; //import wiwordik.word_card.WC; import javafx.scene.control.ListView; //import javafx.ext.swing.SwingListItem; import javafx.scene.input.MouseEvent; import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyCode; import javafx.scene.Scene; import javafx.scene.control.Control; import javafx.scene.control.ListCell; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.util.Callback; import wiwordik.WConstants; import wiwordik.word_card.WC; //import java.util.Map; //import java.util.LinkedHashMap; /** List of words in the dictionary. */ public class WordList { public Float height; // reference to the parent Window QueryTextString query_text_string; LangChoice lang_choice; FilterMeanSemRelTrans filter_mean_sem_transl; LanguageType native_lang; /** Is equal to page_array_string (global search) * or to foreign_array_string (index search). */ ObservableList<String> word_list_lines = FXCollections.observableArrayList(); /** Page titles from 'page_array' */ String[] page_array_string; /** Words extracted by several letters (prefix). */ TPage[] page_array; private final static TPage[] NULL_TPAGE_ARRAY = new TPage[0]; /** Page titles from 'index_foreign' */ String[] foreign_array_string; /** Foreign words extracted by several letters (prefix). */ IndexForeign[] index_foreign; // //var foreign_word_to_index : Map<String, IndexForeign>; //var page_listItems: SwingListItem[] = SwingListItem{}; Connect wikt_parsed_conn; /** Number of words visible in the list */ int n_words_list; /** Skips #REDIRECT words if true. */ boolean b_skip_redirects; public WordList () { page_array = NULL_TPAGE_ARRAY; } public ListView<String> word_listview = new ListView(); /** Set parameters of the class. * @param word0 initial user query search string * @param n_words_list number of words visible in the list */ public void initialize( Connect _wikt_parsed_conn, QueryTextString _query_text_string, LangChoice _lang_choice, FilterMeanSemRelTrans _filter_mean_sem_transl, LanguageType _native_lang, //_word0 : String, Integer _n_words_list ) { wikt_parsed_conn = _wikt_parsed_conn; query_text_string = _query_text_string; lang_choice = _lang_choice; filter_mean_sem_transl = _filter_mean_sem_transl; //word0 = _word0; n_words_list = _n_words_list; native_lang = _native_lang; //VBox.setVgrow(word_listview, Priority.ALWAYS); //word_listview.setMaxHeight(Control.USE_PREF_SIZE); //word_listview.setManaged(true); word_listview.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call(ListView<String> list) { return new wiwordik.search_window.WordCell(); } }); word_listview.setOnMouseClicked(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { String word_in_list = getSelectedWordInList(); if(word_in_list.length() > 0) // there is a word to search in Wiktionary { QueryTextString q = query_text_string; q.setWordValue(word_in_list); q.setWordValueOld(word_in_list); //System.out.println("word_listview.setOnMouseClicked: me.getClickCount()=" + me.getClickCount()); if(me.getClickCount() < 2) return; // OK. It's a double click - let's open WordCard for this word if( q.word_value_last_open_card.length() == 0 || // if 0 word cards are opened !q.word_value_last_open_card.equals(word_in_list) // if user trying to open the same card ) { q.word_value_last_open_card = word_in_list; openWordCard(); /*WC wc = new WC(); TPage _tpage = TPage.get(wikt_parsed_conn, word_in_list); wc.createCXLangList (wikt_parsed_conn, _tpage);*/ } } } }); } /* var l = word_ListView; if (l.selectedItem != "" and l.selectedItem != null) { def s : String = (l.selectedItem).toString(); query_text_string.setWordValue(s); // word_Text.text = s; query_text_string.setWordValueOld(s); // word_value_old = s; if (me.clickCount >= 2) openWordCard(); } } */ /** Whether to skip #REDIRECT words. */ public void setSkipRedirects(boolean _b_skip_redirects) { b_skip_redirects = _b_skip_redirects; } /** Whether to skip #REDIRECT words. */ public boolean getSkipRedirects() { return b_skip_redirects; } public TPage[] getPageArray() { return page_array; } /** Gets first word from the WordList or empty "" String if it is absent. */ public String getFirstWordInList() { if(null == page_array_string || 0 == page_array_string.length) return ""; return page_array_string[0]; } /** Gets selected item from the list else the first word from the WordList, * or empty string "" if the list is empty. */ String getSelectedWordInList() { String selected_item = ""; // currently selected item ReadOnlyObjectProperty<String> cur = word_listview.getSelectionModel().selectedItemProperty(); if (cur != null && cur.getValue()!= null && cur.getValue().length() > 0) { selected_item = cur.getValue(); } return selected_item; } /** Gets selected item from the list else the first word from the WordList, * or empty string "" if the list is empty. */ public String getSelectedOrFirstWordInList() { String selected_item = getSelectedWordInList(); if(selected_item.length() == 0) return getFirstWordInList(); return selected_item; } /* List of words related to the user query string */ /*public var word_ListView: ListView = ListView { layoutInfo: LayoutInfo { height: bind height } // getTranslationBoxHeight(trans_entry_items_size) } //layoutInfo: LayoutInfo { width: 222 } //height: bind scene.height // items: bind page_array_string //items: bind for(_tpage in page_array) { _tpage.getPageTitle() } items: bind for(_w in word_list_lines) { _w } onKeyPressed: function (e: KeyEvent) { var l = word_ListView; //println("WordList.onKeyPressed(), KeyEvent={e}, e.text={e.text}"); if (l.selectedItem != "" and l.selectedItem != null) query_text_string.setWordValue( (word_ListView.selectedItem).toString() ); // word_Text.text = (word_ListView.selectedItem).toString(); if(e.code == KeyCode.VK_ENTER) openWordCard(); } onMouseClicked: function (me: MouseEvent) { var l = word_ListView; //println("WordList.onMouseClicked(), MouseEvent={me}"); if (l.selectedItem != "" and l.selectedItem != null) { def s : String = (l.selectedItem).toString(); query_text_string.setWordValue(s); // word_Text.text = s; query_text_string.setWordValueOld(s); // word_value_old = s; if (me.clickCount >= 2) openWordCard(); } } }*/ /** Checks whether the word list is filled from the table 'page', * or from the table 'index_XX', where XX is a foreign language code. */ public boolean isActiveIndexForeign() { return lang_choice.getNumberSourceLang() == 1; } /** Copies data from TPagŠµ[].text page_array to SwingListItem[] page_listItems */ public void updateWordList( boolean b_skip_redirects, String word ) { //System.out.println("WordList.updateWordList(), word_value=" + word); //System.out.println("WordList.updateWordList(), number of source languagues="+ lang_choice.getNumberSourceLang()); // wheather to filter words by destination language code (destination language filter check box) // todo boolean lang_dest_selected = lang_choice.getDestLangSelected(); if(!isActiveIndexForeign()){ page_array = TPage.getByPrefix ( wikt_parsed_conn, word, n_words_list, // any (first) N words, since "" == prefix b_skip_redirects, lang_choice.getSourceLang(), // lang_source_value, filter_mean_sem_transl.filterByMeaning(), //meaning_checkbox_value, filter_mean_sem_transl.filterBySemanticRelation()); //sem_rel_CheckBox_value); // page_array = TPage.getByPrefix(wikt_parsed_conn, word_value.trim(), // n_words_list, b_skip_redirects, // source_lang,meaning_CheckBox_value, // sem_rel_CheckBox_value); page_array_string = copyWordsToStringArray(page_array); printTextLinesToListView(page_array_string, word_list_lines, word_listview); } else { TLang foreign_lang = lang_choice.getSourceLang()[0]; index_foreign = IndexForeign.getByPrefixForeign( wikt_parsed_conn, word, n_words_list, native_lang, foreign_lang.getLanguage(), filter_mean_sem_transl.filterByMeaning(), filter_mean_sem_transl.filterBySemanticRelation()); foreign_array_string = copyForeignWordsToStringArray(index_foreign); printTextLinesToListView(foreign_array_string, word_list_lines, word_listview); } } /** Copies data from words (string array _word_list_lines) to items of ListView. */ private static void printTextLinesToListView(String[] _page_array_string, ObservableList<String> _word_list_lines, ListView<String> _word_ListView) { _word_list_lines.clear(); _word_list_lines.addAll(_page_array_string); _word_ListView.setItems(_word_list_lines); } /** Opens new word card. */ public void openWordCard() { WC wc = new WC (); ListView<String> l = word_listview; int selected_index = l.getSelectionModel().getSelectedIndex(); if(selected_index < 0) selected_index = 0; // selected first word, when user pressed 'Enter' // native_lang : LanguageType if(!isActiveIndexForeign()){ // get data for "page_array[l.selectedIndex]" wc.getDataForSelectedWordByTPage(wikt_parsed_conn, page_array[ selected_index ]); wc.createCXLangList(wikt_parsed_conn, page_array[ selected_index ]); //getDataForSelectedWord(word_value, l.selectedIndex); } else { //System.out.println( "WordList.openWordCard(): index_foreign.length=" + index_foreign.length + // "; selected_index=" + selected_index); // if index_foreign has .native_page_title != null // then take it // else open .foreign_word IndexForeign i = index_foreign [ selected_index ]; TPage native_page = i.getNativePage(); if(null != native_page) { wc.getDataForSelectedWordByTPage(wikt_parsed_conn, native_page); wc.createCXLangList(wikt_parsed_conn, native_page); } else { TPage foreign_page = i.getForeignPage(); if(null == foreign_page) { System.out.println("Error (WordList.openWordCard()): native_page and foreign_page are NULL, where foreign_word={i.getForeignWord()}"); return; } wc.getDataForSelectedWordByTPage(wikt_parsed_conn, foreign_page); wc.createCXLangList(wikt_parsed_conn, foreign_page); } } } /** Copies data from page_array to page_array_string */ public String[] copyWordsToStringArray(TPage[] pp) { //var list: SwingListItem[] = SwingListItem{}; String[] result = new String[pp.length]; for(int i=0; i<pp.length; i++) { TPage p = pp [i]; result[i] = p.getPageTitle(); //System.out.println("copyWordsToStringArray. p.title = {p.getPageTitle()}"); } return result; }; /** Copies data from the index of foreign words to string array */ public String[] copyForeignWordsToStringArray(IndexForeign[] index) { String[] result = new String[index.length]; for(int i=0; i<index.length; i++) { //println(" ->: {index[i].getConcatForeignAndNativeWords(" -> ")}"); result[i] = index[i].getConcatForeignAndNativeWords(" -> "); } return result; }; }