/* LangChoice.java - Selection of source and target (destination) languages. * * Copyright (c) 2009-2012 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com> * Distributed under EPL/LGPL/GPL/AL/BSD multi-license. */ /** GUI element LangChoice contains checkboxes and text field with * language codes. Source and target languages. */ package wikokit.kiwidict.lang; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; import wikokit.base.wikipedia.language.LanguageType; import wikokit.base.wikt.sql.TLang; import wikokit.kiwidict.search_window.QueryTextString; import wikokit.kiwidict.wordlist.WordList; /** GUI element LangChoice contains checkboxes and editable text field with * language codes. Source and target languages. */ public class LangChoice { /** Language codes for words filtering, e.g. "ru en fr" */ TLang[] source_lang; LanguageType native_lang; WordList word_list; QueryTextString query_text_string; LanguageSpinner lspinner; /* outdated: LangChoiceBox lang_choicebox; */ /** Source language checkbox */ CheckBox lang_source_checkbox; /** Source language text with list of codes */ EditText lang_source_text; /** Language codes for words filtering by translation, e.g. "ru en fr" */ TLang[] dest_lang; /** Whether list only articles which have these language codes */ boolean lang_source_checkbox_value = false; /** Whether list only articles (in native language) which have translations * into these language codes */ boolean lang_dest_checkbox_value = false; /** Gets language codes for words filtering, e.g. "ru en fr". */ public TLang[] getSourceLang() { return source_lang; } private final static TLang[] NULL_TLANG_ARRAY = new TLang[0]; /** Gets number of source languages for words filtering, e.g. 3 for "ru en fr". */ public int getNumberSourceLang() { if(null == source_lang) return 0; return source_lang.length; } /** Is native language selected by user? */ public boolean isNativeLanguageActive() { if(null == source_lang) return false; if(source_lang.length > 0 && null != source_lang[0]) return source_lang[0].getLanguage() == native_lang; return false; } /** Checks whether the check box "Destination language" is selected. */ public boolean getDestLangSelected () { return lang_dest_checkbox_value; } /** Interface to the real function updateWordList(). */ public void updateWordList() { if(null == word_list) { System.out.println("Error: LangChoice.updateWordList(): word_list is empty, non-initialized"); return; } word_list.updateWordList( word_list.getSkipRedirects(), query_text_string.getWordValue() ); query_text_string.saveWordValue(); } public LangChoice () { source_lang = NULL_TLANG_ARRAY; dest_lang = NULL_TLANG_ARRAY; } public void enableLangSource() { lang_source_text.setEnabled(true); //lang_source_text.setFocusable(true); lang_source_text.setFocusableInTouchMode(true); } public void disableLangSource() { lang_source_text.setEnabled(false); lang_source_text.setFocusable(false); //lang_source_text.setFocusableInTouchMode(false); lang_source_checkbox.setChecked(false); lang_source_checkbox_value = false; } /** Set parameters of the class. * @param _word_list list of words in the dictionary (ListView) * @param _query_text_string field with a user search text query * @param _native_lang */ public void initialize(WordList _word_list, QueryTextString _query_text_string, LanguageSpinner _lspinner, //outdated: LangChoiceBox _lang_choicebox, String source_lang_codes, LanguageType _native_lang, // GUI CheckBox _lang_source_checkbox, EditText _lang_source_text ) { native_lang = _native_lang; word_list = _word_list; query_text_string = _query_text_string; lspinner = _lspinner; // GUI lang_source_checkbox = _lang_source_checkbox; lang_source_text = _lang_source_text; lang_source_text.setText(source_lang_codes); disableLangSource(); addListener(); source_lang = TLang.parseLangCode(source_lang_codes); /* todo someday lang_dest_checkbox.setText("Translation language"); Tooltip tp2 = new Tooltip(); tp2.setText( "List words only with translation\n" + "to the languages defined\n" + "by language code (e.g. de, fr)"); lang_dest_checkbox.setTooltip(tp2); enable(lang_dest_text, false); */ // If user clicks CheckBox and select filtering language codes, e.g.: uk de fr lang_source_checkbox.setOnClickListener(new OnClickListener() { public void onClick(View v) { boolean b_selected = ((CheckBox) v).isChecked(); //todo destination lang code // if(b_selected) { // disable destination (target, translation) language check box and text field // lang_dest_checkbox.setSelected(false); // lang_dest_text.setDisable(true); //} //lang_source_text.setDisable(!b_selected); if(b_selected) enableLangSource(); else disableLangSource(); if (lang_source_checkbox_value != b_selected) { lang_source_checkbox_value = b_selected; //System.out.println("lang_source_checkbox changed"); if(!b_selected) { source_lang = NULL_TLANG_ARRAY; // without filter, all languages updateWordList(); } else { updateWordListIfLangSourceChanged(); } } } }); /* // If user clicks destination CheckBox (only words with translations to the select filtering language codes, e.g.: uk de fr) lang_dest_checkbox.selectedProperty().addListener(new ChangeListener<Boolean>() { public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) { boolean b_selected = lang_dest_checkbox.isSelected(); lang_dest_text.setDisable(!b_selected); if(b_selected) { // disable source language check box and text field lang_source_checkbox.setSelected(false); lang_source_text.setDisable(true); } if (lang_dest_checkbox_value != b_selected) { lang_dest_checkbox_value = b_selected; if(!b_selected) { dest_lang = NULL_TLANG_ARRAY; // without filter, with translations to all languages updateWordList(); } else { updateWordListIfLangDestChanged(); } } } }); */ /** User can edit text line with desination (i.e. with translation) filtering language codes, e.g.: uk de fr */ /* lang_dest_text.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent event) { updateWordListIfLangDestChanged(); } }); */ } /** User can edit text line with source filtering language codes, e.g.: uk de fr */ public void addListener() { // add a listener to keep track user input lang_source_text.addTextChangedListener(new TextWatcher() { public void afterTextChanged (Editable s){ // Toast.makeText(context, "afterTextChanged " + word_textfield.getText(), Toast.LENGTH_LONG).show(); } public void beforeTextChanged (CharSequence s, int start, int count, int after){ // Toast.makeText(context, "beforeTextChanged " + word_textfield.getText(), Toast.LENGTH_LONG).show(); } public void onTextChanged (CharSequence s, int start, int before, int count) { //Toast.makeText(context, "onTextChanged " + word_textfield.getText(), Toast.LENGTH_LONG).show(); //System.out.println("lang_source_text.handle"); updateWordListIfLangSourceChanged(); } }); } private boolean language_source_is_passive = false; public boolean isLanguageSourcePassive() { return language_source_is_passive; } public void setLanguageSourceActive( boolean language_source_is_active) { language_source_is_passive = !language_source_is_active; } public void updateWordListIfLangSourceChanged () { //System.out.println("LangChoice::updateWordListIfLangSourceChanged()"); if(language_source_is_passive) return; String s = lang_source_text.getText().toString(); // if list of source languages is the same then skip any changes if(TLang.isEquals(source_lang, s)) return; source_lang = TLang.parseLangCode(s); // update ChoiceBox, let's select in dropdown menu the same language as user types in text field if(source_lang.length > 0) { /*if(source_lang[0].getLanguage() == native_lang) { lspinner.selectAllLanguagesInDropdownMenu(); source_lang = NULL_TLANG_ARRAY; // without filter, all languages // todo: list only native words // lspinner.selectLanguageInDropdownMenu( source_lang[0].getLanguage() ); // ... } else {*/ lspinner.selectLanguageInDropdownMenu( source_lang[0].getLanguage() ); //} } else { //lspinner.selectAllLanguagesInDropdownMenu(); // let's select search within "All languages" words lspinner.selectLanguageInDropdownMenu(native_lang); // let's native lang by default - it will be more faster than "All lang" } updateWordList(); } public void updateWordListIfLangDestChanged () { /* * todo * String s = lang_dest_text.getText(); // if list of dest languages is the same then skip any changes if(TLang.isEquals(dest_lang, s)) return; dest_lang = TLang.parseLangCode(s); updateWordList(); */ } }