package wikokit.kiwidict.wordlist;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import wikokit.base.wikipedia.language.LanguageType;
import wikokit.base.wikt.sql.TLang;
import wikokit.base.wikt.sql.TPage;
import wikokit.base.wikt.sql.index.IndexForeign;
import wikokit.base.wikt.sql.index.IndexNative;
import wikokit.kiwidict.lang.LangChoice;
import wikokit.kiwidict.search_window.QueryTextString;
import wikokit.kiwidict.word_card.WCActivity;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;
public class WordList extends ListActivity {
public Context context;
QueryTextString query_text_string;
ProgressBar spinning_wheel;
LangChoice lang_choice;
// todo FilterMeanSemRelTrans filter_mean_sem_transl;
LanguageType native_lang;
SQLiteDatabase db;
/** 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>;
/** Number of words visible in the list */
int n_words_list;
/** Skips #REDIRECT words if true. */
boolean b_skip_redirects;
ListView word_listview;
WordListArrayAdapter word_list_adapter;
AsyncTask<Void, Void, TPage[]> wordlist_async;
public WordList (Context _context) {
page_array = NULL_TPAGE_ARRAY;
context = _context;
}
/** 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( SQLiteDatabase _db,
QueryTextString _query_text_string,
ProgressBar _spinning_wheel,
LangChoice _lang_choice,
// todo FilterMeanSemRelTrans _filter_mean_sem_transl,
LanguageType _native_lang,
//_word0 : String,
int _n_words_list,
ListView _word_listview, // GUI
Activity main_activity
) {
db = _db;
query_text_string = _query_text_string;
spinning_wheel = _spinning_wheel;
lang_choice = _lang_choice;
//filter_mean_sem_transl = _filter_mean_sem_transl;
n_words_list = _n_words_list;
native_lang = _native_lang;
word_listview = _word_listview;
//ListView listView = getListView();
//listView.setTextFilterEnabled(true);
// some initial values
String[] page_array_string = new String[]{"line1"}; // , "line test 2", "endline", "line4"};
List<String> _list = new ArrayList<String>( page_array_string.length );
_list.addAll(Arrays.asList(page_array_string));
word_list_adapter = new WordListArrayAdapter(
main_activity, //this,
_list, // page_array_string,
getPageArray());
word_listview.setOnItemClickListener(new ListView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Toast.makeText(context, // getApplicationContext(),
// "Click ListItem Number " + position, Toast.LENGTH_LONG)
// .show();
String word_in_list = getSelectedWordInList( position );
if(word_in_list.length() > 0) // there is a word to search in Wiktionary
{
QueryTextString q = query_text_string;
q.enableUpdateWordList(false);
q.setWordValue(word_in_list);
q.setWordValueOld(word_in_list);
q.word_textfield.setSelection(word_in_list.length()); // move cursor to the end of the word
q.enableUpdateWordList(true);
/* // meaningless for Android application with only one open window
* 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(position); // selected_index
//}
}
}
});
word_listview.setAdapter(word_list_adapter);
}
/*public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setListAdapter(new WordListArrayAdapter(this, page_array_string)); // , page_array));
}*/
/** 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;
}
/** 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() {
System.out.println("WordList.isActiveIndexForeign(), lang_choice.getNumberSourceLang() = " + lang_choice.getNumberSourceLang());
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
)
{
// no, since it could be interrupted: page_array = null;
//? String[] page_titles = TPage.getPageTitles(page_array);
//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( lang_choice.isNativeLanguageActive() ) {
TPage[] page_array_new = IndexNative.getByPrefixNative( db, word,
n_words_list,
native_lang,
false);//todo filter_mean_sem_transl.filterBySemanticRelation());
page_array = page_array_new;
page_array_string = copyWordsToStringArray(page_array);
word_list_adapter.updateData(page_array_string, page_array);
} else {
if(!isActiveIndexForeign()){ // all words of all languages
if(null != wordlist_async)
wordlist_async.cancel(true);
wordlist_async = new WordListAsyncUpdater(
db, word,
n_words_list, // any (first) N words, since "" == prefix
b_skip_redirects,
lang_choice.getSourceLang(), // lang_source_value,
false,//todo filter_mean_sem_transl.filterByMeaning(), //meaning_checkbox_value,
false,
this,
word_list_adapter,
spinning_wheel).execute();
/*
TPage[] page_array_new = TPage.getByPrefix ( db, word,
n_words_list, // any (first) N words, since "" == prefix
b_skip_redirects,
lang_choice.getSourceLang(), // lang_source_value,
false,//todo filter_mean_sem_transl.filterByMeaning(), //meaning_checkbox_value,
false); //todo filter_mean_sem_transl.filterBySemanticRelation()); //sem_rel_CheckBox_value);
*/
}
else {
TLang foreign_lang = lang_choice.getSourceLang()[0];
if(null == foreign_lang) {
Toast.makeText(context,
"Error in WordList.updateWordList(): foreign_lang is NULL!", Toast.LENGTH_LONG).show();
return;
}
index_foreign = IndexForeign.getByPrefixForeign( db, word,
n_words_list,
native_lang,
foreign_lang.getLanguage(),
false, //todo filter_mean_sem_transl.filterByMeaning(),
false);//todo filter_mean_sem_transl.filterBySemanticRelation());
foreign_array_string = copyForeignWordsToStringArray(index_foreign);
word_list_adapter.updateData(foreign_array_string, index_foreign);
}
}
}
/** Copies data from page_array to page_array_string
*/
public String[] copyWordsToStringArray(TPage[] pp) {
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;
};
/** 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.
* @param position the position of the clicked-upon item in the list - currently selected item.
**/
String getSelectedWordInList(int position) {
if (ListView.INVALID_POSITION == position)
return "";
String selected_item = "";
// all languages or native language
if(!isActiveIndexForeign() || lang_choice.isNativeLanguageActive()){
if(null != page_array_string && position < page_array_string.length ) {
// cur != null && cur.getValue()!= null && cur.getValue().length() > 0) {
selected_item = page_array_string[position];
}
} else {
if( position < foreign_array_string.length ) {
selected_item = foreign_array_string[position];
}
}
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;
}
*/
/** Opens new word card.
*/
public void openWordCard(int selected_index) {
//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() || lang_choice.isNativeLanguageActive()){
// get data for "page_array[l.selectedIndex]"
runWordCardActivity(page_array[ selected_index ]);
} 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) {
runWordCardActivity( 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;
}
runWordCardActivity( foreign_page );
}
}
}
/** Opens new word card.
*/
private void runWordCardActivity(TPage _tpage) // String page_title)
{
if(null == _tpage)
return;
Bundle b = new Bundle();
b.putInt("page_id", _tpage.getID()); // pass parameter: TPage _tpage by page_id
Intent i = new Intent(context, WCActivity.class); // this == _context
i.putExtras(b);
context.startActivity(i);
//System.out.println("runWordCardActivity: I am trying to start WCActivity...");
}
}