org.de.jmg.learn._MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.de.jmg.learn._MainActivity.java

Source

/*
 * Copyright (c) 2015 GPL by J.M.Goebel. Distributed under the GNU GPL v3.
 * 
 * 08.06.2015
 * 
 * This file is part of learnforandroid.
 *
 * learnforandroid is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  learnforandroid is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.de.jmg.learn;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.speech.tts.TextToSpeech;
import android.support.v4.app.Fragment;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.SpannedString;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.ForegroundColorSpan;
import android.text.style.URLSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.ViewTreeObserver.OnWindowFocusChangeListener;
import android.view.Window;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

import org.de.jmg.learn.vok.Vokabel;
import org.de.jmg.learn.vok.Vokabel.Bewertung;
import org.de.jmg.learn.vok.Vokabel.EnumSprachen;
import org.de.jmg.lib.BorderedEditText;
import org.de.jmg.lib.BorderedTextView;
import org.de.jmg.lib.ColorSetting.ColorItems;
import org.de.jmg.lib.OnTouchListenerScroll;
import org.de.jmg.lib.RemoveCallbackListener;
import org.de.jmg.lib.ScrollGestureListener;
import org.de.jmg.lib.lib;
import org.de.jmg.lib.lib.Sounds;
import org.de.jmg.lib.lib.libString;
import org.de.jmg.lib.lib.yesnoundefined;
import org.de.jmg.lib.urlclickablespan;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

public class _MainActivity extends Fragment implements RemoveCallbackListener {

    public final static int fragID = 0;
    public View mainView;
    public BorderedEditText _txtMeaning1;
    private BorderedTextView _txtWord;
    private BorderedEditText _txtedKom;
    private BorderedTextView _txtStatus;
    private BorderedEditText _txtMeaning2;
    private BorderedEditText _txtMeaning3;
    private BorderedTextView _txtKom;
    private BorderedEditText _txtedWord;
    public ScrollView _scrollView; //= (ScrollView) findViewById(R.id.layoutMain);
    Handler handler = new Handler();
    Vokabel _vok;
    MainActivity _main;
    Double ScaleWidth = 0d;
    Double ScaleTextButtons = 0d;
    boolean blnWrongWidth = false;
    int width;
    OnTouchListenerScroll OnTouchListenerScrollWord;
    OnTouchListenerScroll OnTouchListenerScrolledWord;
    OnTouchListenerScroll OnTouchListenerScrollKom;
    OnTouchListenerScroll OnTouchListenerScrolledKom;
    OnTouchListenerScroll OnTouchListenerScrollMeaning1;
    ScrollGestureListener ListenerEdKom = new ScrollGestureListener(_txtedKom, OnTouchListenerScrolledKom);
    ScrollGestureListener ListenerWord = new ScrollGestureListener(_txtWord, OnTouchListenerScrollWord);
    ScrollGestureListener ListenerKom = new ScrollGestureListener(_txtKom, OnTouchListenerScrollKom);
    ScrollGestureListener ListenerEdWord = new ScrollGestureListener(_txtedWord, OnTouchListenerScrolledWord);
    GestureDetector detectorWord = new GestureDetector(_main, ListenerWord);
    GestureDetector detectoredWord = new GestureDetector(_main, ListenerEdWord);
    ScrollGestureListener ListenerMeaning1 = new ScrollGestureListener(_txtMeaning1, OnTouchListenerScrollMeaning1);
    GestureDetector detectorMeaning1 = new GestureDetector(_main, ListenerMeaning1);
    GestureDetector detectorKom = new GestureDetector(_main, ListenerKom);
    GestureDetector detectoredKom = new GestureDetector(_main, ListenerEdKom);
    MovementMethod _originalMovementmethod = null;
    int _OriginalWidth = 0;
    private Context context;
    private Button _btnRight;
    private Button _btnWrong;
    private Button _btnSkip;
    private Button _btnView;
    private Button _btnEdit;
    OnLongClickListener textlongclicklistener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {

            TextView txt = (TextView) v;
            Intent intent = null;
            if (libString.IsNullOrEmpty(txt.getText().toString()) || _txtedWord.getVisibility() == View.VISIBLE) {
                return false;
            }
            try {
                if (_main.prefs.getBoolean("translate", true)) {
                    intent = new Intent();
                    intent.setAction(Intent.ACTION_SEND);
                    intent.setType("text/plain");
                    intent.setPackage("com.google.android.apps.translate");
                }
                if (intent != null && intent.resolveActivity(context.getPackageManager()) != null) {
                    intent.putExtra(Intent.EXTRA_TEXT, txt.getText().toString());
                    _main.startActivity(intent);
                } else if (_main.prefs.getBoolean("fora", true)) {
                    intent = new Intent("com.ngc.fora.action.LOOKUP");
                }
                if (intent != null && intent.resolveActivity(context.getPackageManager()) != null) {
                    // parameters are optional
                    intent.putExtra("HEADWORD", txt.getText().toString());
                    //intent.putExtra(EXTRA_DICID, 1);
                    _main.startActivity(intent);
                } else {
                    final String SEARCH_ACTION = "nghs.intent.action.SEARCH";
                    final String EXTRA_QUERY = "EXTRA_QUERY";
                    //final String EXTRA_DICID   = "dicID";
                    if (_main.prefs.getBoolean("nghs", true)) {
                        intent = new Intent(SEARCH_ACTION);
                    }

                    if (intent != null && intent.resolveActivity(context.getPackageManager()) != null) {
                        // parameters are optional
                        intent.putExtra(EXTRA_QUERY, txt.getText().toString());
                        //intent.putExtra(EXTRA_DICID, 1);
                        _main.startActivity(intent);
                    } else {
                        //_main.startSearch(txt.getText().toString(), true, null, true);
                        intent = new Intent(Intent.ACTION_SEARCH);
                        intent.putExtra(SearchManager.QUERY, txt.getText().toString());
                        _main.startActivity(intent);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return false;
        }
    };
    private double scale = 1;
    private Drawable _MeaningBG;
    private boolean _firstFocus = true;
    public OnFocusChangeListener FocusListenerMeaning1 = (new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if (hasFocus && _firstFocus) {
                hideKeyboard();
                _firstFocus = false;
            }
        }
    });
    private boolean _isSmallDevice = false;
    private int _lastIsWrongVokID;
    private Drawable _mBackgroundBack = null;
    /*
     * private Runnable runnableGetVok = new Runnable() {
     *
     * @Override public void run() { // do what you need to do
     * getVokabel(false,true); } };
     */
    private Runnable runnableFalse = new Runnable() {
        @Override
        public void run() {
            /* do what you need to do */
            try {
                getVokabel(false, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    private Runnable runnableGetVok = new Runnable() {
        @Override
        public void run() {
            /* do what you need to do */
            try {
                getVokabel(false, false, false, true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    /*
     * private void runFlashWords() { new Thread(new Runnable() {
     *
     * @Override public void run() {  try {
     * flashwords(); } catch (Exception e) {
     * e.printStackTrace(); } } }).start(); }
     */
    private ArrayList<Runnable> rFlashs = new ArrayList<>();
    @SuppressLint("ClickableViewAccessibility")
    OnTouchListener OnTouchListenerRemoveCallbacks = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            removeCallbacks();
            return false;
        }
    };
    private OnEditorActionListener EditorActionListener = new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            if (event == null) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    hideKeyboard();
                    String[] Antworten;
                    org.de.jmg.learn.vok.Vokabel.Bewertung Bew;
                    String meaning1 = _txtMeaning1.getText().toString();
                    String meaning2 = _txtMeaning2.getVisibility() == View.VISIBLE
                            ? _txtMeaning2.getText().toString()
                            : null;
                    String meaning3 = _txtMeaning3.getVisibility() == View.VISIBLE
                            ? _txtMeaning3.getText().toString()
                            : null;
                    if (_txtWord.getVisibility() == View.VISIBLE) {
                        Antworten = new String[] { meaning1, meaning2, meaning3 };
                        try {
                            Bew = _vok.CheckAntwort(Antworten);
                            if (Bew == Bewertung.AllesRichtig) {
                                lib.ShowToast(_main, getString(R.string.AnswerCorrect));
                                _btnRight.performClick();
                            } else if (Bew == Bewertung.AllesFalsch) {
                                try {
                                    _vok.AntwortFalsch();
                                    lib.playSound(_main, _vok.getZaehler());
                                    _lastIsWrongVokID = _vok.getIndex();
                                    getVokabel(true, false);
                                    if (!_vok.getCardMode()) {
                                        setBtnsEnabled(false);
                                        flashwords();

                                    }
                                } catch (Exception e) {

                                    lib.ShowException(_main, e);
                                }
                            } else if (Bew == Bewertung.aehnlich) {
                                lib.ShowMessage(_main, getString(R.string.MeaningSimilar), "");
                            } else if (Bew == Bewertung.TeilweiseRichtig) {
                                lib.ShowMessage(_main, getString(R.string.MeaningPartiallyCorrect), "");
                            } else if (Bew == Bewertung.enthalten) {
                                lib.ShowMessage(_main, getString(R.string.MeaningIsSubstring), "");
                            } else if (Bew == Bewertung.AehnlichEnthalten) {
                                lib.ShowMessage(_main, getString(R.string.MeaningIsSubstringSimilar), "");
                            } else if (Bew == Bewertung.TeilweiseRichtigAehnlich) {
                                lib.ShowMessage(_main, getString(R.string.MeaningIsPartiallyCorrectSimilar), "");
                            } else if (Bew == Bewertung.TeilweiseRichtigAehnlichEnthalten) {
                                lib.ShowMessage(_main,
                                        getString(R.string.MeaningIsPartiallyCorrectSimilarSubstring), "");
                            } else if (Bew == Bewertung.TeilweiseRichtigEnthalten) {
                                lib.ShowMessage(_main, getString(R.string.MeaningIsPartiallyCorrectSubstring), "");
                            }

                        } catch (Exception e) {

                            lib.ShowException(_main, e);
                        }
                    } else {
                        try {
                            EndEdit(false);
                        } catch (Exception e) {

                            lib.ShowException(_main, e);
                        }

                    }
                    return true;
                }
                // Capture soft enters in a singleLine EditText that is the last
                // EditText.
                else if (actionId == EditorInfo.IME_ACTION_NEXT)
                    return false;
                // Capture soft enters in other singleLine EditTexts

                else
                    return false; // Let system handle all other null KeyEvents

            } else if (actionId == EditorInfo.IME_NULL) {
                // Capture most soft enters in multi-line EditTexts and all hard
                // enters.
                // They supply a zero actionId and a valid KeyEvent rather than
                // a non-zero actionId and a null event like the previous cases.
                if (event.getAction() == KeyEvent.ACTION_DOWN)
                    return false;
                // We capture the event when key is first pressed.
                else
                    return false; // We consume the event when the key is
                // released.
            } else
                return false;
        }
    };
    RelativeLayout rellayoutMain;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        //if (mainView!=null)return mainView;

        mainView = inflater.inflate(R.layout.activity_main, container, false);
        rellayoutMain = (RelativeLayout) mainView.findViewById(R.id.rellayoutMain);
        _main = (MainActivity) getActivity();
        context = _main;
        _vok = _main.vok;
        iv = null;
        libLearn.gStatus = "onCreate InitButtons";
        try {
            InitControls();
            libLearn.gStatus = "onCreate InitMeanings";
            InitMeanings();

            try {
                this.SetActionBarTitle();
                if (_vok.getCardMode()) {
                    SetViewsToCardmode();
                } else {
                    SetViewsToVokMode();
                }
                if (_vok.getGesamtzahl() > 0) {
                    setBtnsEnabled(true);
                }
                //getVokabel(false, false);
            } catch (Exception e1) {

                lib.ShowException(_main, e1);
                //getVokabel(true, true);
            }
            mainView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    // Ensure you call it only once :
                    lib.removeLayoutListener(mainView.getViewTreeObserver(), this);
                    // Here you can get the size :)
                    resize();

                    /*
                    try
                    {
                    getVokabel(false, false);
                    }
                    catch (Exception e1)
                    {
                        
                    lib.ShowException(_main, e1);
                    try {
                       getVokabel(true, true);
                    } catch (Exception e) {
                       lib.ShowException(_main, e);
                    }
                    }
                    */
                    //_scrollView.fullScroll(View.FOCUS_UP);
                }
            });
        } catch (Exception e) {
            lib.ShowException(_main, e);
        }

        return mainView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mainView = null;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainView = null;
        if (savedInstanceState != null) {
            _lastIsWrongVokID = savedInstanceState.getInt("lastIsWrongVokID");
        }

    }

    @Override
    public void onSaveInstanceState(Bundle outState)

    {
        super.onSaveInstanceState(outState);
        outState.putInt("lastIsWrongVokID", _lastIsWrongVokID);
        if (lib.YesNoHandler != null)
            lib.YesNoHandler.sendMessage(lib.YesNoHandler.obtainMessage());
        removeCallbacks();
    }

    public void removeCallbacks() {
        ArrayList<Runnable> runs = new ArrayList<>();
        //handler.removeCallbacks(runnableFalse);
        if (rFlashs != null) {
            if (rFlashs.size() > 0) {
                for (Runnable r : rFlashs) {
                    handler.removeCallbacks(r);
                    if (r instanceof resetLayoutTask || r instanceof hideBedBordersTask
                            || r instanceof hideWordBordersTask) {
                        runs.add(r);
                        //handler.post(r);
                    }
                }
                rFlashs.clear();
                //runs.add(runnableFalse);
            }
        }
        for (Runnable r : runs) {
            r.run();
        }
    }

    private void resize() {

        RelativeLayout.LayoutParams params;
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        int height = metrics.heightPixels;
        width = metrics.widthPixels;
        int viewTop = _main.findViewById(Window.ID_ANDROID_CONTENT).getTop();
        height = height - viewTop;
        scale = (double) height / (double) 950;
        double ratio = Math.pow((double) width / (double) height, .5d);
        boolean blnHorizontal = width > height;
        if (scale < .5f) {
            _isSmallDevice = true;
            _main.isSmallDevice = true;
            if (scale < .4f) {
                scale = .4f;
            }
        }
        /*
         * lib.ShowMessage(this, "Meaning3 Bottom: " +_txtMeaning3.getBottom() +
         * "\nbtnRight.Top: " + _btnRight.getTop() + "\nDisplayHeight: " +
         * height);
         */
        if (scale != 1) {
            // lib.ShowToast(_main, "Scaling font by " + scale + " Screenheight = "
            //+ height);

            float tSize = _txtMeaning1.getTextSize();
            if (tSize == 40 || (_vok.getCardMode() && tSize == 25)) {
                _txtMeaning1.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtMeaning1.getTextSize() * scale));
            }
            params = (android.widget.RelativeLayout.LayoutParams) _txtMeaning1.getLayoutParams();
            if (params.topMargin == 120) {
                if (!_isSmallDevice) {
                    params.topMargin = (int) (params.topMargin * scale);
                } else {
                    params.topMargin = (int) (params.topMargin * .1f);
                }
                _txtMeaning1.setLayoutParams(params);
            }

            if (_txtMeaning2.getTextSize() == 40) {
                _txtMeaning2.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtMeaning2.getTextSize() * scale));
            }
            params = (android.widget.RelativeLayout.LayoutParams) _txtMeaning2.getLayoutParams();
            if (params.topMargin == 56) {
                params.topMargin = (int) (params.topMargin * scale);
                _txtMeaning2.setLayoutParams(params);
            }

            if (_txtMeaning3.getTextSize() == 40) {
                _txtMeaning3.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtMeaning3.getTextSize() * scale));
            }
            params = (android.widget.RelativeLayout.LayoutParams) _txtMeaning3.getLayoutParams();
            if (params.topMargin == 56) {
                params.topMargin = (int) (params.topMargin * scale);
                _txtMeaning3.setLayoutParams(params);
            }

            float size = _txtWord.getTextSize();
            if (size == 60) {
                size *= scale;
                _txtWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
            }
            if (_txtKom.getTextSize() == 35) {
                _txtKom.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtKom.getTextSize() * scale));
            }
            if (_txtedWord.getTextSize() == 60) {
                _txtedWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtedWord.getTextSize() * scale));
            }
            if (_txtedKom.getTextSize() == 35) {
                _txtedKom.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_txtedKom.getTextSize() * scale));
            }
            if (_vok != null && _vok.getCardMode()) {
                SetViewsToCardmode();
            } else {
                SetViewsToVokMode();
            }

            /*
             * _txtMeaning1.setOnFocusChangeListener(new
             * View.OnFocusChangeListener() {
             *
             * @Override public void onFocusChange(View v, boolean hasFocus) {
             *  if (_firstFocus && hasFocus) {
             * hideKeyboard(); _firstFocus = false; } } });
             */
        }
        if (scale != 1) {
            int widthButtons = _btnEdit.getRight() - _btnSkip.getLeft();
            int allButtonsWidth = 520; /*_btnEdit.getWidth()
                                       +_btnRight.getWidth()
                                       +_btnView.getWidth()
                                       +_btnWrong.getWidth()
                                       +_btnEdit.getWidth();
                                       */
            if (widthButtons < allButtonsWidth) {
                widthButtons = allButtonsWidth;
                blnWrongWidth = true;
            }
            ScaleWidth = (width - 50) / (double) widthButtons;
            if (ScaleWidth < .7) {
                _btnEdit.setVisibility(View.GONE);
                _btnSkip.setVisibility(View.GONE);
                widthButtons = _btnWrong.getRight() - _btnRight.getLeft();
                if (widthButtons < 330) {
                    widthButtons = 330;
                    blnWrongWidth = true;
                }
                ScaleWidth = ((double) (_txtMeaning1.getRight() - _txtMeaning1.getLeft())) / (double) widthButtons;
                if (ScaleWidth < .4d)
                    ScaleWidth = .4d;
                ScaleTextButtons = ((scale > ScaleWidth) ? scale : ScaleWidth);
            } else {
                ScaleTextButtons = ((scale < ScaleWidth) ? scale : ScaleWidth);

            }

            RelativeLayout layoutButtons = (RelativeLayout) findViewById(R.id.layoutButtonsInner);
            params = (android.widget.RelativeLayout.LayoutParams) layoutButtons.getLayoutParams();
            if (!blnWrongWidth) {
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.bottomMargin = (int) (0 * ScaleWidth);
            }
            layoutButtons.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _btnRight.getLayoutParams();
            if (!blnWrongWidth) {
                params.height = (int) (params.height * scale);
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.height = (int) (60 * ScaleWidth);
                params.bottomMargin = (int) (0 * ScaleWidth);
                _btnRight.setPadding((int) (_btnRight.getPaddingLeft() * ScaleWidth),
                        (int) (_btnRight.getPaddingTop() * ScaleWidth),
                        (int) (_btnRight.getPaddingRight() * ScaleWidth),
                        (int) (_btnRight.getPaddingBottom() * ScaleWidth));
            }
            params.width = (int) (params.width * ScaleWidth);
            double ScaleTextButtonsOrig = ScaleTextButtons;

            if (blnHorizontal) {
                params.height *= ratio;
                ScaleTextButtons *= ratio;
            }
            _btnRight.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _btnWrong.getLayoutParams();
            if (!blnWrongWidth) {
                params.height = (int) (params.height * scale);
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.height = (int) (60 * ScaleWidth);
                params.bottomMargin = (int) (0 * ScaleWidth);
                _btnWrong.setPadding((int) (_btnWrong.getPaddingLeft() * ScaleWidth),
                        (int) (_btnWrong.getPaddingTop() * ScaleWidth),
                        (int) (_btnWrong.getPaddingRight() * ScaleWidth),
                        (int) (_btnWrong.getPaddingBottom() * ScaleWidth));
            }
            params.width = (int) (params.width * ScaleWidth);
            if (blnHorizontal)
                params.height *= ratio;
            _btnWrong.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _btnSkip.getLayoutParams();
            if (!blnWrongWidth) {
                params.height = (int) (params.height * scale);
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.height = (int) (60 * ScaleWidth);
                params.bottomMargin = (int) (0 * ScaleWidth);
            }
            params.width = (int) (params.width * ScaleWidth);
            if (blnHorizontal)
                params.height *= ratio;
            _btnSkip.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _btnView.getLayoutParams();
            if (!blnWrongWidth) {
                params.height = (int) (params.height * scale);
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.height = (int) (60 * ScaleWidth);
                params.bottomMargin = (int) (0 * ScaleWidth);
                _btnView.setPadding((int) (_btnView.getPaddingLeft() * ScaleWidth),
                        (int) (_btnView.getPaddingTop() * ScaleWidth),
                        (int) (_btnView.getPaddingRight() * ScaleWidth),
                        (int) (_btnView.getPaddingBottom() * ScaleWidth));
            }
            params.width = (int) (params.width * ScaleWidth);
            if (blnHorizontal)
                params.height *= ratio;
            _btnView.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _btnEdit.getLayoutParams();
            if (!blnWrongWidth) {
                params.height = (int) (params.height * scale);
                params.bottomMargin = (int) (params.bottomMargin * scale);
            } else {
                params.height = (int) (60 * ScaleWidth);
                params.bottomMargin = (int) (0 * ScaleWidth);
            }
            params.width = (int) (params.width * ScaleWidth);
            if (blnHorizontal)
                params.height *= ratio;
            _btnEdit.setLayoutParams(params);

            params = (android.widget.RelativeLayout.LayoutParams) _txtStatus.getLayoutParams();
            if (!blnWrongWidth) {
                params.topMargin = (int) (params.topMargin * scale);
            } else {
                params.topMargin = (int) (0 * ScaleWidth);
            }
            _txtStatus.setLayoutParams(params);

            _btnRight.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_btnRight.getTextSize() * ScaleTextButtons));
            _btnSkip.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_btnSkip.getTextSize() * ScaleTextButtons));
            _btnView.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_btnView.getTextSize() * ScaleTextButtons));
            _btnWrong.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_btnWrong.getTextSize() * ScaleTextButtons));
            _btnEdit.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (_btnEdit.getTextSize() * ScaleTextButtons));
            _txtStatus.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                    (float) (_txtStatus.getTextSize() * ScaleTextButtonsOrig));

            //_main.ActionBarOriginalTextSize = 0;
            resizeActionbar(0);
            Runnable r = new resetLayoutTask(null);
            rFlashs.add(r);
            handler.post(r);

        }
    }

    public void getVokabelDelayed(int ms) {
        handler.postDelayed(runnableGetVok, ms);
    }

    private View findViewById(int id) {

        if (mainView == null)
            return null;
        return this.mainView.findViewById(id);
    }

    public void getVokabel(boolean showBeds, boolean LoadNext) throws Exception {
        getVokabel(showBeds, LoadNext, false, false);
    }

    public void getVokabel(boolean showBeds, boolean LoadNext, boolean requestFocusEdWord) throws Exception {
        getVokabel(showBeds, LoadNext, requestFocusEdWord, false);
    }

    ImageView iv = null;
    ImageView iv2 = null;

    public void getVokabel(final boolean showBeds, boolean LoadNext, boolean requestFocusEdWord, boolean DontPrompt)
            throws Exception {

        if (iv != null) {
            iv.setVisibility(View.GONE);
        }
        if (iv2 != null)
            iv2.setVisibility(View.GONE);
        try {
            if (_btnRight == null)
                return;
            EndEdit(DontPrompt);
            setBtnsEnabled(true);
            if (showBeds && _vok.getIndex() >= 1) {
                _btnRight.setEnabled(true);
                _btnWrong.setEnabled(true);
                _btnEdit.setEnabled(true);
                _btnSkip.setEnabled(true);
                _btnView.setEnabled(true);
            } else {
                _btnRight.setEnabled(false);
                _btnWrong.setEnabled(false);
                if (_vok.getIndex() < 1) {
                    _btnEdit.setEnabled(false);
                    _btnSkip.setEnabled(false);
                    _btnView.setEnabled(false);
                }
            }
            if (LoadNext)
                _vok.setLernIndex((short) (_vok.getLernIndex() + 1));

            View v;
            TextView t;
            String txtBed = getString(R.string.cloze);

            if (showBeds) {
                v = findViewById(R.id.txtMeaning1);
                t = (TextView) v;
                assert t != null;
                t.setText(lib.getSpanableString(_vok.getBedeutung1()));
                txtBed = t.getText().toString();
            }

            v = findViewById(R.id.word);
            t = (TextView) v;
            assert t != null;
            String txtWord = getString(R.string.cloze);
            if (!_vok.reverse || showBeds) {
                t.setText(lib.getSpanableString(_vok.getWort()), TextView.BufferType.SPANNABLE);
                txtWord = t.getText().toString();
                txtWord = replaceClozes(txtWord, txtBed);
                speak(txtWord, _vok.getLangWord(), "word", true);
            } else {
                t.setText("");
            }

            if (_vok.getSprache() == EnumSprachen.Hebrew || _vok.getSprache() == EnumSprachen.Griechisch
                    || (_vok.getFontWort().getName().equalsIgnoreCase("Cardo"))) {
                t.setTypeface(_vok.TypefaceCardo);
                _txtedWord.setTypeface(_vok.TypefaceCardo);
            } else {
                t.setTypeface(Typeface.DEFAULT);
                _txtedWord.setTypeface(Typeface.DEFAULT);
            }
            t.scrollTo(0, 0);

            v = findViewById(R.id.Comment);
            t = (TextView) v;
            assert t != null;
            t.setVisibility(View.VISIBLE);

            SpannableString tspanKom = lib.getSpanableString(_vok.getKommentar());
            URLSpan[] urlSpans = tspanKom.getSpans(0, tspanKom.length(), URLSpan.class);
            for (final URLSpan span : urlSpans) {
                int start = tspanKom.getSpanStart(span);
                int end = tspanKom.getSpanEnd(span);
                String txt = tspanKom.toString().substring(start, end);
                if (txtIsPicture(txt)) {
                    tspanKom.removeSpan(span);
                    tspanKom.setSpan(new urlclickablespan(span.getURL()) {
                        @Override
                        public void onClick(View widget) {
                            Bitmap b;
                            try {
                                b = lib.downloadpicture(this.url);
                            } catch (Exception ex) {
                                b = null;
                            }
                            if (b != null) {
                                if (iv == null) {
                                    iv = new ImageView(context);
                                    SetTouchListener(iv);
                                }
                                b = resizeBM(b);
                                iv.setImageBitmap(b);
                                if (iv.getParent() == null) {
                                    try {
                                        LayoutParams p = _txtMeaning1.getLayoutParams();
                                        //p.width = LayoutParams.WRAP_CONTENT;
                                        //p.height = LayoutParams.WRAP_CONTENT;
                                        rellayoutMain.addView(iv, p);
                                    } catch (Exception ex) {
                                        Log.e("addImageView", ex.getMessage(), ex);
                                    }
                                } else {
                                    Log.d("ImageView", "exists");
                                }
                                _txtMeaning1.setVisibility(View.GONE);
                                iv.setVisibility(View.VISIBLE);
                            }
                        }
                    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
            t.setText(tspanKom, TextView.BufferType.SPANNABLE);

            if (_vok.getSprache() == EnumSprachen.Hebrew || _vok.getSprache() == EnumSprachen.Griechisch
                    || (_vok.getFontKom().getName().equalsIgnoreCase("Cardo"))) {
                t.setTypeface(_vok.TypefaceCardo);
                _txtedKom.setTypeface(_vok.TypefaceCardo);
            } else {
                t.setTypeface(Typeface.DEFAULT);
                _txtedKom.setTypeface(Typeface.DEFAULT);
            }
            if (_isSmallDevice && libString.IsNullOrEmpty(t.getText().toString())) {
                t.setVisibility(View.GONE);
            } else {
                t.setVisibility(View.VISIBLE);
            }
            t.scrollTo(0, 0);

            v = findViewById(R.id.txtMeaning1);
            t = (TextView) v;
            assert t != null;
            if (!libString.IsNullOrEmpty(_vok.getBedeutung2())) {
                t.setImeOptions(EditorInfo.IME_ACTION_NEXT);
            }
            if (_vok.reverse || showBeds) {
                SpannableString tspan = lib.getSpanableString(_vok.getBedeutung1());
                //final String picname = _main.getString(R.string.picture);
                t.setVisibility(View.VISIBLE);
                if (txtIsPicture(tspan.toString())) {
                    URLSpan urlspn[] = tspan.getSpans(0, tspan.length(), URLSpan.class);
                    for (URLSpan url : urlspn) {
                        Bitmap b;
                        try {
                            b = lib.downloadpicture(url.getURL());
                        } catch (Exception ex) {
                            b = null;
                        }
                        if (b != null) {
                            if (iv == null) {
                                iv = new ImageView(context);
                                SetTouchListener(iv);
                            }
                            b = resizeBM(b);
                            iv.setImageBitmap(b);
                            if (iv.getParent() == null) {
                                try {
                                    LayoutParams p = t.getLayoutParams();
                                    //p.width = LayoutParams.WRAP_CONTENT;
                                    //p.height = LayoutParams.WRAP_CONTENT;
                                    rellayoutMain.addView(iv, p);
                                } catch (Exception ex) {
                                    Log.e("Imagview", ex.getMessage(), ex);
                                }
                            } else {
                                Log.d("ImageView", "exists");
                            }
                            t.setVisibility(View.GONE);
                            iv.setVisibility(View.VISIBLE);
                        }
                    }

                } else {
                    // iv.setVisibility(View.GONE);
                    t.setVisibility(View.VISIBLE);
                }

                t.setText(tspan);
            } else {
                t.setText(Vokabel.getComment(_vok.getBedeutung1()));
            }
            if (_vok.reverse || showBeds) {
                String txt = t.getText().toString();
                txt = replaceClozes(txt, txtWord);
                speak(txt, _vok.getLangMeaning(), "meaning1", _vok.reverse);
            }
            if (_vok.getFontBed().getName().equalsIgnoreCase("Cardo")) {
                t.setTypeface(_vok.TypefaceCardo);
            } else {
                t.setTypeface(Typeface.DEFAULT);
            }
            t.setOnFocusChangeListener(FocusListenerMeaning1);
            t.scrollTo(0, 0);

            v = findViewById(R.id.txtMeaning2);
            t = (TextView) v;
            assert t != null;
            t.setText((_vok.reverse || showBeds ? _vok.getBedeutung2() : Vokabel.getComment(_vok.getBedeutung2())));
            if (_vok.getFontBed().getName().equalsIgnoreCase("Cardo")) {
                t.setTypeface(_vok.TypefaceCardo);
            } else {
                t.setTypeface(Typeface.DEFAULT);
            }
            if (libString.IsNullOrEmpty(_vok.getBedeutung2()) || _vok.getCardMode()) {
                t.setVisibility(View.GONE);
                _txtMeaning1.setImeOptions(EditorInfo.IME_ACTION_DONE);
            } else {
                t.setVisibility(View.VISIBLE);
                _txtMeaning1.setImeOptions(EditorInfo.IME_ACTION_NEXT);
                if (_vok.reverse || showBeds) {
                    String txt = t.getText().toString();
                    //if (txtWord != null)
                    //   txt = txt.replaceAll("_{2,}", txtWord).replaceAll("\\.{4,}", txtWord);
                    speak(txt, _vok.getLangMeaning(), "meaning2");
                }
            }

            v = findViewById(R.id.txtMeaning3);
            t = (TextView) v;
            assert t != null;
            t.setText((_vok.reverse || showBeds ? _vok.getBedeutung3() : Vokabel.getComment(_vok.getBedeutung3())));
            if (_vok.getFontBed().getName().equalsIgnoreCase("Cardo")) {
                t.setTypeface(_vok.TypefaceCardo);
            } else {
                t.setTypeface(Typeface.DEFAULT);
            }
            if (libString.IsNullOrEmpty(_vok.getBedeutung3()) || _vok.getCardMode()) {
                t.setVisibility(View.GONE);
                _txtMeaning2.setImeOptions(EditorInfo.IME_ACTION_DONE);
            } else {
                t.setVisibility(View.VISIBLE);
                _txtMeaning2.setImeOptions(EditorInfo.IME_ACTION_NEXT);
                _txtMeaning3.setImeOptions(EditorInfo.IME_ACTION_DONE);
                if (_vok.reverse || showBeds) {
                    String txt = t.getText().toString();
                    //if (txtWord != null)
                    //   txt = txt.replaceAll("_{2,}", txtWord).replaceAll("\\.{4,}", txtWord);
                    speak(txt, _vok.getLangMeaning(), "meaning3");
                }
            }

            if (_vok.reverse && showBeds)
                speak(txtWord, _vok.getLangWord(), "word");

            lib.setBgEditText(_txtMeaning1, _MeaningBG);
            lib.setBgEditText(_txtMeaning2, _MeaningBG);
            lib.setBgEditText(_txtMeaning3, _MeaningBG);
            if (!_isSmallDevice && !requestFocusEdWord) {
                _txtMeaning1.requestFocus();
            } else {
                if (!requestFocusEdWord)
                    _txtWord.requestFocus();
                else
                    _txtedWord.requestFocus();
            }
            SetActionBarTitle();

            _scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    lib.removeLayoutListener(_scrollView.getViewTreeObserver(), this);
                    hideKeyboard();
                    if (showBeds) {
                        _scrollView.scrollTo(0, _txtMeaning1.getTop());
                    } else {
                        _txtWord.requestFocus();
                        _scrollView.fullScroll(View.FOCUS_UP);
                    }
                }
            });

        } catch (Exception e) {

            lib.ShowException(_main, e);
        }

    }

    private boolean txtIsPicture(String txt) {
        return txt.equalsIgnoreCase("Bild") || txt.equalsIgnoreCase("picture")
                || txt.equalsIgnoreCase(getString(R.string.picture));
    }

    private Bitmap resizeBM(Bitmap b) {
        if (b != null) {
            int width = Math.max(b.getWidth(), b.getHeight());
            int widthScreen = this.width;
            widthScreen -= lib.dpToPx(40);
            float fact = (float) widthScreen / (float) width;
            Matrix matrix = new Matrix();
            matrix.postScale(fact, fact);
            return Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
        }
        return null;
    }

    private void SetTouchListener(ImageView iv) {
        if (iv != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
            iv.setOnTouchListener(new OnTouchListener() {
                @TargetApi(Build.VERSION_CODES.FROYO)
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return mScaleDetector.onTouchEvent(event);
                }
            });
        }
    }

    private ScaleGestureDetector mScaleDetector;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            iv.setScaleX(iv.getScaleX() * detector.getScaleFactor());
            iv.setScaleY(iv.getScaleY() * detector.getScaleFactor());
            // Don't let the object get too small or too large.
            return true;
        }
    }

    private String replaceClozes(String txt, String txtClozes) {
        final String regexCloze = "_{2,}|\\.{4,}|(_ ){2,}|(\\. ){4,}";
        txt = " " + txt + "  ";
        if (txtClozes != null) {

            txtClozes = txtClozes.trim();
            String clozes[] = (txt).split(regexCloze);
            String repl[] = txtClozes.split(", *|; *"); //|\\s");

            if (clozes.length > 1 && clozes.length - 1 == repl.length) {
                txt = "";
                for (int i = 0; i < clozes.length - 1; i++) {
                    txt += clozes[i] + repl[i];
                }
                txt += clozes[clozes.length - 1];
            } else {
                txt = txt.replaceAll(regexCloze, txtClozes);
            }
        } else {
            txt = txt.replaceAll(regexCloze, getString(R.string.cloze));
        }
        txt = txt.trim();
        return txt;
    }

    public void speak(String t, Locale l, String ID) {
        speak(t, l, ID, false);
    }

    public void speak(String t, Locale l, String ID, boolean blnFlush) {
        try {
            if (!_main.blnTextToSpeech || l.toString().equalsIgnoreCase("_off"))
                return;
            String ts[] = (" " + t + " ").split(getString(R.string.cloze));
            if (!t.equalsIgnoreCase(getString(R.string.cloze)) && ts.length > 1) {
                for (int i = 0; i < ts.length; i++) {
                    String s = ts[i];
                    speak(s, l, ID, (i == 0) ? blnFlush : false);
                    if (i < ts.length - 1) {
                        if (Build.VERSION.SDK_INT < 21) {
                            HashMap<String, String> h = new HashMap<>();
                            h.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "cloze");
                            //noinspection deprecation
                            _main.tts.playSilence(2500, TextToSpeech.QUEUE_ADD, h);
                        } else {
                            _main.tts.playSilentUtterance(2500, TextToSpeech.QUEUE_ADD, "cloze");
                        }
                        //speak(getString(R.string.cloze), Locale.getDefault(), ID, false);
                    }
                }
            } else {
                int res = _main.tts.setLanguage(l);
                if (res < 0) {
                    if (_main.tts.setLanguage(Locale.US) < 0)
                        return;
                }
                int flags;
                if (blnFlush) {
                    flags = TextToSpeech.QUEUE_FLUSH;
                } else {
                    flags = TextToSpeech.QUEUE_ADD;
                }
                if (Build.VERSION.SDK_INT < 21) {
                    HashMap<String, String> h = new HashMap<>();
                    h.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, ID);

                    //noinspection deprecation
                    _main.tts.speak(t, flags, h);
                } else {
                    _main.tts.speak(t, flags, null, ID);
                }
            }
        } catch (Exception ex) {
            lib.setgstatus("speak: " + t + " " + l.toString());
            lib.ShowException(_main, ex);
        }
    }

    @Override
    public void RemoveCallback() {
        removeCallbacks();
    }

    @SuppressLint("ClickableViewAccessibility")
    private void InitControls() throws Exception {
        View v = findViewById(R.id.btnRight);
        Button b = (Button) v;
        _btnRight = b;
        assert b != null;
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    if (_lastIsWrongVokID == _vok.getIndex()) {
                        lib.playSound(_main, Sounds.Beep);
                        getVokabel(false, true);
                    } else {

                        int Zaehler = _vok.AntwortRichtig();
                        lib.playSound(_main, Zaehler);

                        getVokabel(false, false);
                    }
                    _lastIsWrongVokID = -1;

                } catch (Exception e) {

                    lib.ShowException(_main, e);

                }

            }
        });
        v = findViewById(R.id.btnWrong);
        b = (Button) v;
        _btnWrong = b;
        assert b != null;
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    _vok.AntwortFalsch();
                    lib.playSound(_main, _vok.getZaehler());
                    _lastIsWrongVokID = _vok.getIndex();

                    if (!_vok.getCardMode()) {
                        setBtnsEnabled(false);
                        flashwords();

                    } else {
                        getVokabel(false, false);
                    }
                } catch (Exception e) {

                    lib.ShowException(_main, e);
                }

            }
        });
        v = findViewById(R.id.btnSkip);
        b = (Button) v;
        _btnSkip = b;
        assert b != null;
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    _vok.SkipVokabel();
                    getVokabel(false, false);
                } catch (Exception e) {

                    lib.ShowException(_main, e);
                }

            }
        });
        v = findViewById(R.id.btnView);
        b = (Button) v;
        _btnView = b;
        assert b != null;
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    getVokabel(true, false);

                } catch (Exception e) {

                    lib.ShowException(_main, e);
                }

            }
        });

        v = findViewById(R.id.btnEdit);
        b = (Button) v;
        _btnEdit = b;
        assert b != null;
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    edit();
                } catch (Exception e) {

                    lib.ShowException(_main, e);
                }

            }
        });

        _txtMeaning1 = (BorderedEditText) findViewById(R.id.txtMeaning1);
        //int bottom = (_txtMeaning1.getPaddingBottom() == 0 ? 5 : _txtMeaning1.getPaddingBottom());
        /*_txtMeaning1.setPadding(_txtMeaning1.getPaddingLeft()
        , 0
        , _txtMeaning1.getPaddingRight()
        , 0);
        */
        OnTouchListenerScrollMeaning1 = new OnTouchListenerScroll(detectorMeaning1, this);
        ListenerMeaning1.l = OnTouchListenerScrollMeaning1;
        ListenerMeaning1.t = _txtMeaning1;
        _txtMeaning1.setOnTouchListener(OnTouchListenerScrollMeaning1);
        _txtMeaning1.setOnLongClickListener(textlongclicklistener);
        //_txtMeaning1.setBackgroundColor(Color.BLACK);
        _MeaningBG = _txtMeaning1.getBackground();
        //_txtMeaning1.setBackgroundResource(0);
        //_txtMeaning1.setOnTouchListener(OnTouchListenerRemoveCallbacks);

        _txtMeaning2 = (BorderedEditText) findViewById(R.id.txtMeaning2);
        assert _txtMeaning2 != null;
        _txtMeaning2.setOnLongClickListener(textlongclicklistener);
        //_txtMeaning2.setBackgroundResource(0);
        _txtMeaning2.setOnTouchListener(OnTouchListenerRemoveCallbacks);

        _txtMeaning3 = (BorderedEditText) findViewById(R.id.txtMeaning3);
        assert _txtMeaning3 != null;
        _txtMeaning3.setOnLongClickListener(textlongclicklistener);
        //_txtMeaning3.setBackgroundResource(0);
        _txtMeaning3.setOnTouchListener(OnTouchListenerRemoveCallbacks);

        _txtWord = (BorderedTextView) findViewById(R.id.word);
        assert _txtWord != null;
        _txtWord.setOnLongClickListener(textlongclicklistener);
        //_txtWord.setOnTouchListener(OnTouchListenerRemoveCallbacks);
        OnTouchListenerScrollWord = new OnTouchListenerScroll(detectorWord, this);
        ListenerWord.l = OnTouchListenerScrollWord;
        ListenerWord.t = _txtWord;
        _txtWord.setOnTouchListener(OnTouchListenerScrollWord);

        _txtedWord = (BorderedEditText) findViewById(R.id.edword);
        assert _txtedWord != null;
        _txtedWord.setOnLongClickListener(textlongclicklistener);
        OnTouchListenerScrolledWord = new OnTouchListenerScroll(detectoredWord, this);
        ListenerEdWord.l = OnTouchListenerScrolledWord;
        ListenerEdWord.t = _txtedWord;
        _txtedWord.setOnTouchListener(OnTouchListenerScrolledWord);

        _txtedKom = (BorderedEditText) findViewById(R.id.edComment);
        assert _txtedKom != null;
        _txtedKom.setOnLongClickListener(textlongclicklistener);
        OnTouchListenerScrolledKom = new OnTouchListenerScroll(detectoredKom, this);
        ListenerEdKom.l = OnTouchListenerScrolledKom;
        ListenerEdKom.t = _txtedKom;
        _txtedKom.setOnTouchListener(OnTouchListenerScrolledKom);

        _txtKom = (BorderedTextView) findViewById(R.id.Comment);
        assert _txtKom != null;
        _txtKom.setOnLongClickListener(textlongclicklistener);
        OnTouchListenerScrollKom = new OnTouchListenerScroll(detectorKom, this);
        ListenerKom.l = OnTouchListenerScrollKom;
        ListenerKom.t = _txtKom;
        _txtKom.setOnTouchListener(OnTouchListenerScrollKom);
        _txtKom.setMovementMethod(LinkMovementMethod.getInstance());

        _txtStatus = (BorderedTextView) findViewById(R.id.txtStatus);

        _scrollView = (ScrollView) findViewById(R.id.layoutMain);
        assert _scrollView != null;
        _scrollView.setOnTouchListener(OnTouchListenerRemoveCallbacks);

        setBtnsEnabled(false);
        setTextColors();
    }

    public void edit() throws Exception {
        if (_txtWord.getVisibility() == View.VISIBLE) {
            StartEdit();
        } else {
            EndEdit(false);
        }
    }

    void StartEdit() throws Exception {
        _txtWord.setText(lib.getSpanableString(_vok.getWort()), TextView.BufferType.SPANNABLE);
        _txtWord.setVisibility(View.GONE);
        _txtKom.setVisibility(View.GONE);
        _txtedWord.setVisibility(View.VISIBLE);
        _txtedWord.setText(_txtWord.getText());
        /*
        if (_vok.getSprache() == EnumSprachen.Hebrew)
        {
           try
           {
        lib.setLocale(context, "he");
           }
           catch (Exception ex)
           {
        try
        {
           lib.setLocale(context, "iw");
        }
        catch (Exception eex)
        {
           lib.ShowException(_main,eex);
        }
           }
        }
        */
        _txtedWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, _txtWord.getTextSize());
        View LayWord = findViewById(R.id.LayWord);
        assert LayWord != null;
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) LayWord.getLayoutParams();
        params.width = LayoutParams.MATCH_PARENT;
        LayWord.setLayoutParams(params);
        _txtedKom.setVisibility(View.VISIBLE);
        _txtedKom.setText(_vok.getKommentar());
        _txtedKom.setTextSize(TypedValue.COMPLEX_UNIT_PX, _txtKom.getTextSize());
        _txtedWord.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        _txtedKom.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        _txtedWord.setSingleLine(false);
        _txtedWord.setMaxLines(3);
        _txtedKom.setSingleLine(false);
        _txtedKom.setMaxLines(3);
        if (!_vok.getCardMode()) {
            _txtMeaning1.setImeOptions(EditorInfo.IME_ACTION_NEXT);
            _txtMeaning2.setVisibility(View.VISIBLE);
            _txtMeaning2.setImeOptions(EditorInfo.IME_ACTION_NEXT);
            _txtMeaning3.setVisibility(View.VISIBLE);
            _txtMeaning3.setImeOptions(EditorInfo.IME_ACTION_DONE);
            _txtMeaning2.setText(_vok.getBedeutung2());
            _txtMeaning3.setText(_vok.getBedeutung3());
            lib.setBgEditText(_txtMeaning1, _MeaningBG);
            lib.setBgEditText(_txtMeaning2, _MeaningBG);
            lib.setBgEditText(_txtMeaning3, _MeaningBG);
            _txtMeaning1.setLines(1);
            _txtMeaning1.setSingleLine();
            _txtMeaning2.setLines(1);
            _txtMeaning2.setSingleLine();
            _txtMeaning3.setLines(1);
            _txtMeaning3.setSingleLine();

        } else {
            lib.setBgEditText(_txtMeaning1, _MeaningBG);
            _txtMeaning1.setImeOptions(EditorInfo.IME_ACTION_DONE);
            //_originalMovementmethod = _txtMeaning1.getMovementMethod();
            //_txtMeaning1.setAutoLinkMask(0);
            if (_originalMovementmethod != null
                    && _txtMeaning1.getMovementMethod() == LinkMovementMethod.getInstance()) {
                _txtMeaning1.setMovementMethod(_originalMovementmethod);
            }
            //_txtMeaning1.requestFocus();
            //InputMethodManager Imn = (InputMethodManager) _main.getSystemService(Context.INPUT_METHOD_SERVICE);
            //Imn.showSoftInputFromInputMethod(_txtMeaning1.getWindowToken(), 0);
        }
        //_txtMeaning1.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        _txtMeaning1.setText(_vok.getBedeutung1());
        setBtnsEnabled(false);
        _btnEdit.setEnabled(true);
        _txtMeaning1.clearFocus();
        _txtedWord.clearFocus();
        //_txtedWord.requestFocusFromTouch();
        _txtedWord.requestFocus();
        mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                lib.removeLayoutListener(mainView.getViewTreeObserver(), this);
                _txtedWord.requestFocus();
            }
        });
    }

    boolean EndEdit(boolean dontPrompt) throws Exception {
        if (_txtedWord == null)
            return true;
        if (_txtedWord.getVisibility() == View.VISIBLE) {

            try {
                if ((!libString.IsNullOrEmpty(_txtedWord.getText().toString())
                        && !libString.IsNullOrEmpty(_txtMeaning1.getText().toString()))) {
                    _vok.setWort(_txtedWord.getText().toString(), dontPrompt);
                    _vok.setKommentar(_txtedKom.getText().toString());
                    _vok.setBedeutung1(_txtMeaning1.getText().toString(), dontPrompt);
                    _vok.setBedeutung2(_txtMeaning2.getText().toString());
                    _vok.setBedeutung3(_txtMeaning3.getText().toString());
                } else {
                    if (dontPrompt || lib.ShowMessageYesNo(context,
                            context.getString(R.string.WordOrMeaningMissing), "") == yesnoundefined.yes) {
                        _vok.DeleteVokabel();
                    } else {
                        try {
                            _vok.setWort(_txtedWord.getText().toString(), false);
                            _vok.setKommentar(_txtedKom.getText().toString());
                            _vok.setBedeutung1(_txtMeaning1.getText().toString(), false);
                            _vok.setBedeutung2(_txtMeaning2.getText().toString());
                            _vok.setBedeutung3(_txtMeaning3.getText().toString());
                        } catch (Exception eex) {
                            Log.e("EndEdit", eex.getMessage(), eex);
                            return false;
                        }
                    }
                }

                EndEdit2();
            } catch (Exception ex) {
                lib.ShowMessage(context, ex.getMessage(), null);
                return false;
            }

        }
        return true;
    }

    void EndEdit2() throws Exception {
        if (_txtedWord == null)
            return;
        if (_txtedWord.getVisibility() == View.VISIBLE) {
            _txtWord.setVisibility(View.VISIBLE);
            _txtKom.setVisibility(View.VISIBLE);
            _txtedWord.setVisibility(View.GONE);
            _txtWord.setText(lib.getSpanableString(_txtedWord.getText().toString()));
            View LayWord = findViewById(R.id.LayWord);
            assert LayWord != null;
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) LayWord.getLayoutParams();
            assert params != null;
            params.width = LayoutParams.WRAP_CONTENT;
            LayWord.setLayoutParams(params);
            _txtedKom.setVisibility(View.GONE);
            _txtKom.setText(lib.getSpanableString(_txtedKom.getText().toString()));
            _txtedWord.setImeOptions(EditorInfo.IME_ACTION_NONE);
            _txtedKom.setImeOptions(EditorInfo.IME_ACTION_NONE);
            _txtMeaning1.setImeOptions(EditorInfo.IME_ACTION_DONE);
            _txtMeaning2.setImeOptions(EditorInfo.IME_ACTION_DONE);
            _txtMeaning3.setImeOptions(EditorInfo.IME_ACTION_DONE);
            lib.setBgEditText(_txtMeaning1, _MeaningBG);
            lib.setBgEditText(_txtMeaning2, _MeaningBG);
            lib.setBgEditText(_txtMeaning3, _MeaningBG);
            /*_txtMeaning1.setBackgroundResource(0);
            _txtMeaning2.setBackgroundResource(0);
            _txtMeaning3.setBackgroundResource(0);*/
            if (!_vok.getCardMode()) {
                _txtMeaning1.setLines(1);
                _txtMeaning1.setSingleLine();
                _txtMeaning2.setLines(1);
                _txtMeaning2.setSingleLine();
                _txtMeaning2.setVisibility(View.VISIBLE);
                _txtMeaning3.setLines(1);
                _txtMeaning3.setSingleLine();
                _txtMeaning3.setVisibility(View.VISIBLE);
            } else {
                _originalMovementmethod = _txtMeaning1.getMovementMethod();
                //_txtMeaning1.setAutoLinkMask(Linkify.ALL);
                _txtMeaning1.setMovementMethod(LinkMovementMethod.getInstance());
                //_txtMeaning1.setInputType(InputType.TYPE_NULL);
                //_txtMeaning1.requestFocus();
                //InputMethodManager Imn = (InputMethodManager) _main.getSystemService(Context.INPUT_METHOD_SERVICE);
                //Imn.hideSoftInputFromInputMethod(_txtMeaning1.getWindowToken(), 0);
            }
        }
        getVokabel(false, false);
    }

    private void InitMeanings() {
        _txtMeaning1.setOnEditorActionListener(EditorActionListener);
        _txtMeaning2.setOnEditorActionListener(EditorActionListener);
        _txtMeaning3.setOnEditorActionListener(EditorActionListener);
    }

    private void hideKeyboard() {
        // Check if no view has focus:
        View view = _main.getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) _main
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    void setTextColors() {
        libLearn.gStatus = "setTextColors";
        if (_txtMeaning1 == null)
            return;
        _txtMeaning1.setTextColor(_main.Colors.get(ColorItems.meaning).ColorValue);
        _txtMeaning2.setTextColor(_main.Colors.get(ColorItems.meaning).ColorValue);
        _txtMeaning3.setTextColor(_main.Colors.get(ColorItems.meaning).ColorValue);
        _txtWord.setTextColor(_main.Colors.get(ColorItems.word).ColorValue);
        _txtKom.setTextColor(_main.Colors.get(ColorItems.comment).ColorValue);
        /*
         * _txtMeaning1.setBackgroundColor(_main.Colors.get(ColorItems.background).
         * ColorValue);
         * _txtMeaning2.setBackgroundColor(_main.Colors.get(ColorItems.background
         * ).ColorValue);
         * _txtMeaning3.setBackgroundColor(_main.Colors.get(ColorItems.background
         * ).ColorValue);
         * _txtWord.setBackgroundColor(_main.Colors.get(ColorItems.background
         * ).ColorValue);
         * _txtKom.setBackgroundColor(_main.Colors.get(ColorItems.background
         * ).ColorValue);
         */
        View v = findViewById(R.id.layoutMain);
        if (v != null)
            v.setBackgroundColor(_main.Colors.get(ColorItems.background).ColorValue);
    }

    public void setBtnsEnabled(boolean enable) {
        libLearn.gStatus = "setBtnsEnabled";
        _btnEdit.setEnabled(enable);
        _btnRight.setEnabled(enable);
        _btnSkip.setEnabled(enable);
        _btnView.setEnabled(enable);
        _btnWrong.setEnabled(enable);

    }

    public void SetViewsToVokMode() {
        if (_mBackgroundBack != null)
            _MeaningBG = _mBackgroundBack;
        // _txtWord.setMaxLines(3);
        // _txtWord.setLines(1);
        _txtWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (60 * scale));
        _txtWord.setHorizontallyScrolling(false);

        // _txtKom.setMaxLines(3);
        // _txtKom.setLines(2);
        _txtKom.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (35 * scale));
        _txtKom.setHorizontallyScrolling(false);

        _txtMeaning1.setLines(1);
        _txtMeaning1.setSingleLine();
        _txtMeaning1.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (40 * scale));
        _txtMeaning1.setMaxLines(3);
        _txtMeaning1.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
        _txtMeaning1.setHorizontallyScrolling(false);
        //_txtMeaning1.setAutoLinkMask(0);
        if (_originalMovementmethod != null
                && _txtMeaning1.getMovementMethod() == LinkMovementMethod.getInstance()) {
            _txtMeaning1.setMovementMethod(_originalMovementmethod);
        }
        //_txtMeaning1.setVerticalScrollBarEnabled(false);

        //_txtMeaning1.requestFocus();
        //InputMethodManager Imn = (InputMethodManager) _main.getSystemService(Context.INPUT_METHOD_SERVICE);
        //Imn.showSoftInputFromInputMethod(_txtMeaning1.getWindowToken(), 0);

        //_txtMeaning1.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);

        _txtMeaning2.setVisibility(View.VISIBLE);
        _txtMeaning2.setLines(1);
        _txtMeaning2.setSingleLine();
        _txtMeaning2.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (40 * scale));
        _txtMeaning2.setMaxLines(3);
        _txtMeaning2.setHorizontallyScrolling(false);

        _txtMeaning3.setVisibility(View.VISIBLE);
        _txtMeaning3.setLines(1);
        _txtMeaning3.setSingleLine();
        _txtMeaning3.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (40 * scale));
        _txtMeaning3.setMaxLines(3);
        _txtMeaning3.setHorizontallyScrolling(false);

    }

    public void SetViewsToCardmode() {
        // _txtWord.setMaxLines(3);
        // _txtWord.setLines(2);
        // _txtKom.setMaxLines(3);
        // _txtKom.setLines(2);

        _txtWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (40 * scale));
        _txtKom.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (30 * scale));

        _txtMeaning1.setSingleLine(false);
        _txtMeaning1.setMaxLines(1000);
        _txtMeaning1.setLines(16);
        //_txtMeaning1.setMinLines(2);
        _txtMeaning1.setGravity(Gravity.TOP | Gravity.START);
        _txtMeaning1.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (25 * scale));
        //_txtMeaning1.requestFocus();
        //InputMethodManager Imn = (InputMethodManager) _main.getSystemService(Context.INPUT_METHOD_SERVICE);
        //Imn.hideSoftInputFromInputMethod(_txtMeaning1.getWindowToken(), 0);
        if (_originalMovementmethod == null)
            _originalMovementmethod = _txtMeaning1.getMovementMethod();
        //_txtMeaning1.setAutoLinkMask(Linkify.ALL);
        if (_txtMeaning1.getMovementMethod() != LinkMovementMethod.getInstance())
            _txtMeaning1.setMovementMethod(LinkMovementMethod.getInstance());
        //_txtMeaning1.setVerticalScrollBarEnabled(true);
        //_txtMeaning1.setInputType(InputType.TYPE_NULL);
        // _txtMeaning1.setImeOptions(EditorInfo.IME_NULL);
        // _txtMeaning1.setImeActionLabel(null, KeyEvent.KEYCODE_ENTER);
        // _txtMeaning1.setImeActionLabel("Custom text",
        // KeyEvent.KEYCODE_ENTER);
        _txtMeaning2.setVisibility(View.GONE);
        _txtMeaning3.setVisibility(View.GONE);

        if (_MeaningBG != null)
            _mBackgroundBack = _MeaningBG;
        _MeaningBG = null;
        //if (_mBackgroundBack!=null) _MeaningBG = _mBackgroundBack;

    }

    private void flashwords() throws Exception {
        Runnable r;
        final RelativeLayout layout = (RelativeLayout) findViewById(R.id.layoutMainParent);
        assert layout != null;
        layout.setBackgroundColor(_main.Colors.get(ColorItems.background_wrong).ColorValue);
        final ScrollView layoutScroll = (ScrollView) findViewById(R.id.layoutMain);
        assert layoutScroll != null;
        layoutScroll.setBackgroundColor(_main.Colors.get(ColorItems.background_wrong).ColorValue);
        final RelativeLayout layoutButtons = (RelativeLayout) findViewById(R.id.layoutButtons);
        assert layoutButtons != null;
        layoutButtons.setVisibility(View.GONE);
        View tb = _main.findViewById(R.id.action_bar);
        tb.setVisibility(View.GONE);

        _txtMeaning1.setBackgroundResource(0);
        _txtMeaning2.setBackgroundResource(0);
        _txtMeaning3.setBackgroundResource(0);

        if (_isSmallDevice) {
            _txtKom.setVisibility(View.GONE);
        }
        _txtWord.requestFocus();
        long delay = 0;
        for (int i = 0; i < _main.PaukRepetitions; i++) {
            // _txtWord.setBackgroundResource(R.layout.roundedbox);
            r = new showWordBordersTask();
            rFlashs.add(r);
            handler.postDelayed(r, delay);
            delay += _main.DisplayDurationWord * 1000 * (_main.blnTextToSpeech ? 20 : 1);
            r = new hideWordBordersTask();
            rFlashs.add(r);
            handler.postDelayed(r, delay);
            BorderedEditText Beds[] = { _txtMeaning1, _txtMeaning2, _txtMeaning3 };
            for (int ii = 0; ii < _vok.getAnzBed(); ii++) {
                if (!libString.IsNullOrEmpty(_vok.getBedeutungen()[ii])) {
                    r = new showBedBordersTask(Beds[ii]);
                    rFlashs.add(r);
                    handler.postDelayed(r, delay);
                    delay += _main.DisplayDurationBed * 1000 * (_main.blnTextToSpeech ? 20 : 1);
                    r = new hideBedBordersTask(Beds[ii]);
                    rFlashs.add(r);
                    handler.postDelayed(r, delay);
                }
            }

        }
        r = new resetLayoutTask(layout);
        rFlashs.add(r);
        handler.postDelayed(r, delay);
        delay += 1000;

    }

    /*
     * private class CancelTimerTask extends TimerTask { public Timer T; public
     * CancelTimerTask(Timer T) {  this.T
     * = T; }
     *
     * @Override public void run() {
     * T.cancel(); }
     *
     * }
     */
    private void showWordBorders() {

        // _txtWord.setPadding(5, 5, 5, 5);
        _txtWord.setShowBorders(true, _main.Colors.get(ColorItems.box_word).ColorValue);
    }

    private void hideWordBorders() {

        // _txtWord.setPadding(0, 0, 0, 0);
        _txtWord.setShowBorders(false, _main.Colors.get(ColorItems.background).ColorValue);
    }

    public void SetActionBarTitle() throws Exception {
        if (mainView == null)
            return;
        if (_vok.getGesamtzahl() > 0) {
            String FName = "";
            if (!libString.IsNullOrEmpty(_vok.getFileName())) {
                FName = new File(_vok.getFileName()).getName();
            } else if (_vok.getURI() != null) {
                String path = lib.dumpUriMetaData(_main, _vok.getURI());
                if (path.contains(":"))
                    path = path.split(":")[0];
                int li = path.lastIndexOf("/");
                if (li > -1) {
                    FName = path.substring(path.lastIndexOf("/"));
                } else {
                    FName = "/" + path;
                }
            } else if (!libString.IsNullOrEmpty(_vok.getURIName())) {
                FName = _vok.getURIName();
            }
            if (FName.length() > 15 && _isSmallDevice) {
                FName = FName.substring(0, 15);
            } else if (FName.length() > 30) {
                FName = FName.substring(0, 30);
            }
            String title = "" + FName + " " + getString(R.string.number) + ": " + _vok.getIndex() + "/"
                    + (_vok.getVokabeln().size() - 1) + " " + getString(R.string.counter) + ": "
                    + _vok.getZaehler();
            String Right = " " + _vok.AnzRichtig;
            String Wrong = " " + _vok.AnzFalsch;
            SpannableString spnTitle = new SpannableString(title);
            SpannableString spnRight = new SpannableString(Right);
            SpannableString spnWrong = new SpannableString(Wrong);
            spnRight.setSpan(new ForegroundColorSpan(Color.GREEN), 0, spnRight.length(),
                    SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
            spnWrong.setSpan(new ForegroundColorSpan(Color.RED), 0, spnWrong.length(),
                    SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
            TextView txtStatus = (TextView) (findViewById(R.id.txtStatus));
            if (txtStatus != null)
                txtStatus.setText(TextUtils.concat(spnTitle, spnRight, spnWrong));
            //getSupportActionBar().setTitle(
            //      TextUtils.concat(spnTitle, spnRight, spnWrong));

        } else {
            Log.d("Vok", "empty");
            /*
             * String title = "Learn " + "empty._vok" + " " +
             * getString(R.string.number) + ": " + _vok.getIndex() + " " +
             * getString(R.string.counter) + ": " + _vok.getZaehler(); String
             * Right = " " + _vok.AnzRichtig; String Wrong = " " + _vok.AnzFalsch;
             * SpannableString spnTitle = new SpannableString(title);
             * SpannableString spnRight = new SpannableString(Right);
             * SpannableString spnWrong = new SpannableString(Wrong);
             * spnRight.setSpan(new ForegroundColorSpan(Color.GREEN), 0,
             * spnRight.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
             * spnWrong.setSpan(new ForegroundColorSpan(Color.RED), 0,
             * spnWrong.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
             *
             * getSupportActionBar().setTitle( TextUtils.concat(spnTitle,
             * spnRight, spnWrong));
             */
        }
        resizeActionbar(0);
    }

    public MainActivity get_main() {
        return _main;
    }

    public void resizeActionbar(final int width) {
        /*
        View tb = this.findViewById(R.id.action_bar);
        Paint p = new Paint();
        int SizeOther = 0;
        if (tb != null) {
           if (width == 0)
        width = tb.getWidth();
           if (width > 0) {
        ViewGroup g = (ViewGroup) tb;
        for (int i = 0; i < g.getChildCount(); i++) {
           View v = g.getChildAt(i);
           if (!(v instanceof TextView)) {
              SizeOther += v.getWidth();
           }
        }
        if (SizeOther == 0) SizeOther=lib.dpToPx(50);
        for (int i = 0; i < g.getChildCount(); i++) {
           View v = g.getChildAt(i);
           if (v instanceof TextView) {
              TextView t = (TextView) v;
              if (_main.ActionBarOriginalTextSize[i] == 0 )
              {
                 _main.ActionBarOriginalTextSize[i] = t.getTextSize();
              }
              else
              {
                 t.setTextSize(TypedValue.COMPLEX_UNIT_PX,_main.ActionBarOriginalTextSize[i]);
              }
              if (t.getText() instanceof SpannedString) {
                 p.setTextSize(t.getTextSize());
                 SpannedString s = (SpannedString) t.getText();
                 width = width - SizeOther - lib.dpToPx(50);
                 float measuredWidth = p.measureText(s.toString());
                 if (measuredWidth > width)
                 {
                    float scaleA = (float)width / (float)measuredWidth;
                    if (scaleA < .5f) scaleA = .5f;
            
                    t.setTextSize(
                          TypedValue.COMPLEX_UNIT_PX,
                          (float) (t.getTextSize() * (scaleA)));
                 }
            
              }
           }
        }
            
           }
            
        }
        */
        if (mainView == null)
            return;
        TextView t = _txtStatus;
        if (_main.ActionBarOriginalTextSize == 0) {
            _main.ActionBarOriginalTextSize = t.getTextSize();
            SetTxtStatusSize(width);
        } else if (t.getTextSize() != _main.ActionBarOriginalTextSize) {
            t.setTextSize(TypedValue.COMPLEX_UNIT_PX, _main.ActionBarOriginalTextSize);
            SetTxtStatusSize(width);
        } else {
            SetTxtStatusSize(width);
        }

    }

    void SetTxtStatusSize(int width) {
        if (width == 0)
            width = mainView.getWidth();
        if (width == 0 && _OriginalWidth == 0)
            return;
        if (width == 0)
            width = _OriginalWidth;
        _OriginalWidth = width;
        TextView t = _txtStatus;
        Paint p = new Paint();
        if (t.getText() instanceof SpannedString) {
            p.setTextSize(t.getTextSize());
            SpannedString s = (SpannedString) t.getText();
            width = width - width / (_isSmallDevice ? 4 : 5);
            float measuredWidth = p.measureText(s.toString());
            if (measuredWidth != width) {
                float scaleA = (float) width / measuredWidth;
                if (libString.IsNullOrEmpty(_vok.getFileName()))
                    scaleA *= .75f;
                if (scaleA < .5f)
                    scaleA = .5f;
                if (scaleA > 2.0f)
                    scaleA = 2.0f;
                float size = t.getTextSize();
                t.setTextSize(TypedValue.COMPLEX_UNIT_PX, size * scaleA);
            }

        }
    }

    @SuppressLint("NewApi")
    private class wfcListener implements OnWindowFocusChangeListener {

        @Override
        public void onWindowFocusChanged(boolean hasFocus) {

            if (hasFocus) {
                lib.removewfcListener(_scrollView.getViewTreeObserver(), this);
                hideKeyboard();
                _scrollView.fullScroll(View.FOCUS_UP);
            }
        }

    }

    private class resetLayoutTask implements Runnable {
        public View view;

        public resetLayoutTask(View layout) {

            if (layout == null)
                layout = findViewById(R.id.layoutMainParent);
            this.view = layout;
        }

        public void run() {
            if (view != null) {
                view.setBackgroundColor(_main.Colors.get(ColorItems.background).ColorValue);
                if (_isSmallDevice) {
                    _txtKom.setVisibility(View.VISIBLE);
                }
                final RelativeLayout layoutButtons = (RelativeLayout) findViewById(R.id.layoutButtons);
                assert layoutButtons != null;
                layoutButtons.setVisibility(View.VISIBLE);
                View tb = _main.findViewById(R.id.action_bar);
                tb.setVisibility(View.VISIBLE);
                final ScrollView layoutScroll = (ScrollView) findViewById(R.id.layoutMain);
                assert layoutScroll != null;
                layoutScroll.setBackgroundColor(_main.Colors.get(ColorItems.background).ColorValue);
                runnableFalse.run();

            }
            rFlashs.clear();
        }
    }

    private class showWordBordersTask implements Runnable {
        public void run() {
            try {
                lib.playSound(_main, org.de.jmg.lib.lib.Sounds.Beep);
                speak(_txtWord.getText().toString(), _vok.getLangWord(), "wordflash", true);
                _main.tts.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() {
                    @Override
                    public void onUtteranceCompleted(String utteranceId) {
                        if (!(utteranceId.equalsIgnoreCase("wordflash")))
                            return;
                        boolean found = false;
                        int count = 0;
                        int delay = 500;
                        for (Runnable r : rFlashs) {
                            if (found) {
                                handler.removeCallbacks(r);
                                handler.postDelayed(r, delay);
                                count += 1;
                                if (count == 1)
                                    delay += 100;
                                if (count == 2)
                                    delay += _main.DisplayDurationBed * 1000 * (_main.blnTextToSpeech ? 20 : 1);
                                if (count == 3)
                                    break;
                            }
                            if (r == showWordBordersTask.this) {
                                found = true;
                            }
                        }

                    }
                });

            } catch (Exception e) {

                e.printStackTrace();
            }
            showWordBorders();
        }
    }

    private class hideWordBordersTask implements Runnable {

        public void run() {

            hideWordBorders();
        }

    }

    private class showBedBordersTask implements Runnable {
        public BorderedEditText Bed;

        public showBedBordersTask(BorderedEditText Bed) {

            this.Bed = Bed;
        }

        public void run() {

            // Bed.setPadding(5, 5, 5, 5);
            Bed.setShowBorders(true, _main.Colors.get(ColorItems.box_meaning).ColorValue);
            try {
                lib.playSound(_main, org.de.jmg.lib.lib.Sounds.Beep);
                speak(Bed.getText().toString(), _vok.getLangMeaning(), "Bedflash");
                _main.tts.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() {
                    @Override
                    public void onUtteranceCompleted(String utteranceId) {
                        if (!(utteranceId.equalsIgnoreCase("Bedflash")))
                            return;
                        boolean found = false;
                        int count = 0;
                        int delay = 500;
                        for (Runnable r : rFlashs) {
                            if (r instanceof resetLayoutTask) {
                                handler.removeCallbacks(r);
                                handler.postDelayed(r, delay + 500);
                                break;
                            }
                            if (found) {
                                handler.removeCallbacks(r);
                                handler.postDelayed(r, delay);
                                count += 1;
                                if (count == 1)
                                    delay += 100;
                                if (count == 2)
                                    delay += _main.DisplayDurationBed * 1000 * (_main.blnTextToSpeech ? 20 : 1);
                                if (count == 3)
                                    break;
                            }
                            if (r == showBedBordersTask.this) {
                                found = true;
                            }
                        }

                    }
                });

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

    }

    private class hideBedBordersTask implements Runnable {
        public BorderedEditText Bed;

        public hideBedBordersTask(BorderedEditText Bed) {

            this.Bed = Bed;
        }

        @Override
        public void run() {

            // Bed.setPadding(0, 0, 0, 0);
            Bed.setShowBorders(false, _main.Colors.get(ColorItems.background).ColorValue);
        }

    }

}