mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-03 09:49:19 +02:00
dictan integration (in progress)
This commit is contained in:
parent
448ce0fcd1
commit
26e157d06a
41 changed files with 458 additions and 74 deletions
|
@ -17,6 +17,16 @@
|
||||||
dataKey="query"
|
dataKey="query"
|
||||||
list="always"
|
list="always"
|
||||||
/>
|
/>
|
||||||
|
<dictionary
|
||||||
|
id="dictan"
|
||||||
|
title="Dictan"
|
||||||
|
package="info.softex.dictan"
|
||||||
|
category="info.softex.dictan.EXTERNAL_DISPATCHER"
|
||||||
|
action="android.intent.action.VIEW"
|
||||||
|
dataKey="article.word"
|
||||||
|
role="dictionary"
|
||||||
|
list="always"
|
||||||
|
/>
|
||||||
<dictionary
|
<dictionary
|
||||||
id="Fora Dictionary"
|
id="Fora Dictionary"
|
||||||
package="com.ngc.fora"
|
package="com.ngc.fora"
|
||||||
|
@ -42,15 +52,6 @@
|
||||||
role="dictionary"
|
role="dictionary"
|
||||||
supportsTargetLanguage="true"
|
supportsTargetLanguage="true"
|
||||||
/>
|
/>
|
||||||
<!--dictionary
|
|
||||||
id="dictan"
|
|
||||||
title="Dictan"
|
|
||||||
package="info.softex.dictan"
|
|
||||||
category="info.softex.dictan.EXTERNAL_DISPATCHER"
|
|
||||||
action="android.intent.action.VIEW"
|
|
||||||
dataKey="article.word"
|
|
||||||
role="dictionary"
|
|
||||||
/-->
|
|
||||||
<dictionary
|
<dictionary
|
||||||
id="Lingo Quiz Lite"
|
id="Lingo Quiz Lite"
|
||||||
package="mnm.lite.lingoquiz"
|
package="mnm.lite.lingoquiz"
|
||||||
|
|
|
@ -1147,4 +1147,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="Узор: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Узор: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Узор: 125%%"/>
|
<node name="percent" value="Узор: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1155,4 +1155,10 @@
|
||||||
<node name="length" value="Например: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Например: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Например: 125%%"/>
|
<node name="percent" value="Например: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1155,4 +1155,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1158,4 +1158,10 @@
|
||||||
<node name="length" value="Např.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Např.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Např.: 125%%"/>
|
<node name="percent" value="Např.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1148,4 +1148,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1154,4 +1154,10 @@
|
||||||
<node name="length" value="z.B.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="z.B.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="z.B.: 125%%"/>
|
<node name="percent" value="z.B.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1147,4 +1147,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="E.g.: 125%%"/>
|
<node name="percent" value="E.g.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1154,4 +1154,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1150,4 +1150,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1148,4 +1148,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1142,4 +1142,10 @@
|
||||||
<node name="length" value="i.e.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="i.e.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="i.e.: 125%%"/>
|
<node name="percent" value="i.e.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1154,4 +1154,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1140,4 +1140,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="例: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="例: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="例: 125%%"/>
|
<node name="percent" value="例: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1154,4 +1154,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="Bijv.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Bijv.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Bijv.: 125%%"/>
|
<node name="percent" value="Bijv.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1153,4 +1153,10 @@
|
||||||
<node name="length" value="Exemplo: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Exemplo: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Exemplo: 125%%"/>
|
<node name="percent" value="Exemplo: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1141,4 +1141,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="E.g.: 125%%"/>
|
<node name="percent" value="E.g.: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1158,4 +1158,10 @@
|
||||||
<node name="length" value="Например: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="Например: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="Например: 125%%"/>
|
<node name="percent" value="Например: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="неизвестная ошибка"/>
|
||||||
|
<node name="noArticle" value="нет статьи для «%s»"/>
|
||||||
|
<node name="cannotOpenDictionary" value="не удалось открыть словать"/>
|
||||||
|
<node name="noDictionarySelected" value="словарь не выбран; сделайте это в настроках Dictan"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1149,4 +1149,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1140,4 +1140,10 @@
|
||||||
<node name="length" value="VD: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
<node name="length" value="VD: -2px, 10pt, -0.8em, 1.1ex, -40%%"/>
|
||||||
<node name="percent" value="VD: 125%%"/>
|
<node name="percent" value="VD: 125%%"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1139,4 +1139,10 @@
|
||||||
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
<node name="length" value="E.g.: -2px, 10pt, -0.8em, 1.1ex, -40%%" toBeTranslated="true"/>
|
||||||
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
<node name="percent" value="E.g.: 125%%" toBeTranslated="true"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="dictanErrors">
|
||||||
|
<node name="unknown" value="unknown error" toBeTranslated="true"/>
|
||||||
|
<node name="noArticle" value="no artcle found for “%s”" toBeTranslated="true"/>
|
||||||
|
<node name="cannotOpenDictionary" value="cannot open dictionary" toBeTranslated="true"/>
|
||||||
|
<node name="noDictionarySelected" value="dictionary not selected; please fix in Dictan settings" toBeTranslated="true"/>
|
||||||
|
</node>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -26,12 +26,19 @@ import org.xml.sax.Attributes;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.xml.sax.helpers.DefaultHandler;
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import com.github.johnpersano.supertoasts.SuperActivityToast;
|
||||||
|
import com.github.johnpersano.supertoasts.SuperToast;
|
||||||
|
import com.github.johnpersano.supertoasts.util.OnClickWrapper;
|
||||||
|
import com.github.johnpersano.supertoasts.util.OnDismissWrapper;
|
||||||
|
|
||||||
import android.app.*;
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Xml;
|
import android.util.Xml;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
import com.abbyy.mobile.lingvo.api.MinicardContract;
|
import com.abbyy.mobile.lingvo.api.MinicardContract;
|
||||||
import com.paragon.dictionary.fbreader.OpenDictionaryFlyout;
|
import com.paragon.dictionary.fbreader.OpenDictionaryFlyout;
|
||||||
|
@ -56,6 +63,8 @@ public abstract class DictionaryUtil {
|
||||||
private static int FLAG_SHOW_AS_DICTIONARY = 2;
|
private static int FLAG_SHOW_AS_DICTIONARY = 2;
|
||||||
private static int FLAG_SHOW_AS_TRANSLATOR = 4;
|
private static int FLAG_SHOW_AS_TRANSLATOR = 4;
|
||||||
|
|
||||||
|
private static final int MAX_LENGTH_FOR_TOAST = 180;
|
||||||
|
|
||||||
private static ZLStringOption ourSingleWordTranslatorOption;
|
private static ZLStringOption ourSingleWordTranslatorOption;
|
||||||
private static ZLStringOption ourMultiWordTranslatorOption;
|
private static ZLStringOption ourMultiWordTranslatorOption;
|
||||||
|
|
||||||
|
@ -98,10 +107,6 @@ public abstract class DictionaryUtil {
|
||||||
intent.addCategory(category);
|
intent.addCategory(category);
|
||||||
}
|
}
|
||||||
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
|
|
||||||
final String key = get("dataKey");
|
final String key = get("dataKey");
|
||||||
if (key != null) {
|
if (key != null) {
|
||||||
return intent.putExtra(key, text);
|
return intent.putExtra(key, text);
|
||||||
|
@ -110,7 +115,7 @@ public abstract class DictionaryUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract void open(String text, Activity context, PopupFrameMetric frameMetrics);
|
abstract void open(String text, ZLTextRegion.Soul soulToSelect, FBReader fbreader, PopupFrameMetric frameMetrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class PlainPackageInfo extends PackageInfo {
|
private static class PlainPackageInfo extends PackageInfo {
|
||||||
|
@ -119,7 +124,7 @@ public abstract class DictionaryUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void open(String text, Activity context, PopupFrameMetric frameMetrics) {
|
void open(String text, ZLTextRegion.Soul soulToSelect, FBReader fbreader, PopupFrameMetric frameMetrics) {
|
||||||
final Intent intent = getDictionaryIntent(text);
|
final Intent intent = getDictionaryIntent(text);
|
||||||
try {
|
try {
|
||||||
if ("ABBYY Lingvo".equals(Id)) {
|
if ("ABBYY Lingvo".equals(Id)) {
|
||||||
|
@ -138,10 +143,35 @@ public abstract class DictionaryUtil {
|
||||||
final ZLAndroidLibrary zlibrary = (ZLAndroidLibrary)ZLAndroidLibrary.Instance();
|
final ZLAndroidLibrary zlibrary = (ZLAndroidLibrary)ZLAndroidLibrary.Instance();
|
||||||
intent.putExtra(ColorDict3.FULLSCREEN, !zlibrary.ShowStatusBarOption.getValue());
|
intent.putExtra(ColorDict3.FULLSCREEN, !zlibrary.ShowStatusBarOption.getValue());
|
||||||
}
|
}
|
||||||
context.startActivity(intent);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||||
context.overridePendingTransition(0, 0);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
fbreader.startActivity(intent);
|
||||||
|
fbreader.overridePendingTransition(0, 0);
|
||||||
} catch (ActivityNotFoundException e) {
|
} catch (ActivityNotFoundException e) {
|
||||||
installDictionaryIfNotInstalled(context, this);
|
installDictionaryIfNotInstalled(fbreader, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DictanPackageInfo extends PackageInfo {
|
||||||
|
DictanPackageInfo(String id, String title, boolean supportsTargetLanguageSetting) {
|
||||||
|
super(id, title, supportsTargetLanguageSetting);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void open(String text, ZLTextRegion.Soul soulToSelect, FBReader fbreader, PopupFrameMetric frameMetrics) {
|
||||||
|
final Intent intent = getDictionaryIntent(text);
|
||||||
|
try {
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
intent.putExtra("article.mode", 20);
|
||||||
|
intent.putExtra("article.text.size.max", MAX_LENGTH_FOR_TOAST);
|
||||||
|
fbreader.startActivityForResult(intent, FBReader.REQUEST_DICTIONARY);
|
||||||
|
fbreader.overridePendingTransition(0, 0);
|
||||||
|
fbreader.outlineRegion(soulToSelect);
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
fbreader.hideOutline();
|
||||||
|
installDictionaryIfNotInstalled(fbreader, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,8 +191,8 @@ public abstract class DictionaryUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void open(String text, Activity context, PopupFrameMetric frameMetrics) {
|
void open(String text, ZLTextRegion.Soul soulToSelect, FBReader fbreader, PopupFrameMetric frameMetrics) {
|
||||||
Flyout.showTranslation(context, text, frameMetrics);
|
Flyout.showTranslation(fbreader, text, frameMetrics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,11 +217,20 @@ public abstract class DictionaryUtil {
|
||||||
if (!"always".equals(attributes.getValue("list"))) {
|
if (!"always".equals(attributes.getValue("list"))) {
|
||||||
flags |= FLAG_INSTALLED_ONLY;
|
flags |= FLAG_INSTALLED_ONLY;
|
||||||
}
|
}
|
||||||
final PackageInfo info = new PlainPackageInfo(
|
final PackageInfo info;
|
||||||
id,
|
if ("dictan".equals(id)) {
|
||||||
title != null ? title : id,
|
info = new DictanPackageInfo(
|
||||||
"true".equals(attributes.getValue("supportsTargetLanguage"))
|
id,
|
||||||
);
|
title != null ? title : id,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
info = new PlainPackageInfo(
|
||||||
|
id,
|
||||||
|
title != null ? title : id,
|
||||||
|
"true".equals(attributes.getValue("supportsTargetLanguage"))
|
||||||
|
);
|
||||||
|
}
|
||||||
for (int i = attributes.getLength() - 1; i >= 0; --i) {
|
for (int i = attributes.getLength() - 1; i >= 0; --i) {
|
||||||
info.put(attributes.getLocalName(i), attributes.getValue(i));
|
info.put(attributes.getLocalName(i), attributes.getValue(i));
|
||||||
}
|
}
|
||||||
|
@ -375,10 +414,7 @@ public abstract class DictionaryUtil {
|
||||||
return ourMultiWordTranslatorOption;
|
return ourMultiWordTranslatorOption;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PackageInfo getCurrentDictionaryInfo(boolean singleWord) {
|
private static PackageInfo getInfo(String id) {
|
||||||
final ZLStringOption option = singleWord
|
|
||||||
? singleWordTranslatorOption() : multiWordTranslatorOption();
|
|
||||||
final String id = option.getValue();
|
|
||||||
synchronized (ourInfos) {
|
synchronized (ourInfos) {
|
||||||
for (PackageInfo info : ourInfos.keySet()) {
|
for (PackageInfo info : ourInfos.keySet()) {
|
||||||
if (info.Id.equals(id)) {
|
if (info.Id.equals(id)) {
|
||||||
|
@ -389,6 +425,12 @@ public abstract class DictionaryUtil {
|
||||||
return firstInfo();
|
return firstInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PackageInfo getCurrentDictionaryInfo(boolean singleWord) {
|
||||||
|
final ZLStringOption option = singleWord
|
||||||
|
? singleWordTranslatorOption() : multiWordTranslatorOption();
|
||||||
|
return getInfo(option.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
public static class PopupFrameMetric {
|
public static class PopupFrameMetric {
|
||||||
public final int Height;
|
public final int Height;
|
||||||
public final int Gravity;
|
public final int Gravity;
|
||||||
|
@ -407,7 +449,7 @@ public abstract class DictionaryUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void openTextInDictionary(final Activity activity, String text, boolean singleWord, int selectionTop, int selectionBottom) {
|
public static void openTextInDictionary(final FBReader fbreader, String text, boolean singleWord, int selectionTop, int selectionBottom, final ZLTextRegion.Soul soulToSelect) {
|
||||||
final String textToTranslate;
|
final String textToTranslate;
|
||||||
if (singleWord) {
|
if (singleWord) {
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
@ -423,21 +465,21 @@ public abstract class DictionaryUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
final DisplayMetrics metrics = new DisplayMetrics();
|
final DisplayMetrics metrics = new DisplayMetrics();
|
||||||
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
fbreader.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
final PopupFrameMetric frameMetrics =
|
final PopupFrameMetric frameMetrics =
|
||||||
new PopupFrameMetric(metrics, selectionTop, selectionBottom);
|
new PopupFrameMetric(metrics, selectionTop, selectionBottom);
|
||||||
|
|
||||||
final PackageInfo info = getCurrentDictionaryInfo(singleWord);
|
final PackageInfo info = getCurrentDictionaryInfo(singleWord);
|
||||||
activity.runOnUiThread(new Runnable() {
|
fbreader.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
info.open(textToTranslate, activity, frameMetrics);
|
info.open(textToTranslate, soulToSelect, fbreader, frameMetrics);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void openWordInDictionary(Activity activity, ZLTextWord word, ZLTextRegion region) {
|
public static void openWordInDictionary(FBReader fbreader, ZLTextWord word, ZLTextRegion region) {
|
||||||
openTextInDictionary(
|
openTextInDictionary(
|
||||||
activity, word.toString(), true, region.getTop(), region.getBottom()
|
fbreader, word.toString(), true, region.getTop(), region.getBottom(), region.getSoul()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,4 +512,111 @@ public abstract class DictionaryUtil {
|
||||||
UIUtil.showErrorMessage(activity, "cannotRunAndroidMarket", dictionaryInfo.Title);
|
UIUtil.showErrorMessage(activity, "cannotRunAndroidMarket", dictionaryInfo.Title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void onActivityResult(final FBReader fbreader, int resultCode, final Intent data) {
|
||||||
|
if (data == null) {
|
||||||
|
fbreader.hideOutline();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int errorCode = data.getIntExtra("error.code", -1);
|
||||||
|
if (resultCode != Activity.RESULT_OK || errorCode != -1) {
|
||||||
|
showDictanError(fbreader, errorCode, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String text = data.getStringExtra("article.text");
|
||||||
|
if (text == null) {
|
||||||
|
showDictanError(fbreader, -1, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final int index = text.indexOf("\000");
|
||||||
|
if (index >= 0) {
|
||||||
|
text = text.substring(0, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
final SuperActivityToast toast;
|
||||||
|
if (text.length() == MAX_LENGTH_FOR_TOAST) {
|
||||||
|
text = trimArticle(text);
|
||||||
|
toast = new SuperActivityToast(fbreader, SuperToast.Type.BUTTON);
|
||||||
|
toast.setButtonIcon(
|
||||||
|
android.R.drawable.ic_menu_more,
|
||||||
|
ZLResource.resource("footnoteToast").getResource("more").getValue()
|
||||||
|
);
|
||||||
|
toast.setOnClickWrapper(new OnClickWrapper("dict", new SuperToast.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view, Parcelable token) {
|
||||||
|
final String word = data.getStringExtra("article.word");
|
||||||
|
final PackageInfo info = getInfo("dictan");
|
||||||
|
final Intent intent = info.getDictionaryIntent(word);
|
||||||
|
try {
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
fbreader.startActivity(intent);
|
||||||
|
fbreader.overridePendingTransition(0, 0);
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
toast = new SuperActivityToast(fbreader, SuperToast.Type.STANDARD);
|
||||||
|
}
|
||||||
|
toast.setText(text);
|
||||||
|
toast.setDuration(20000);
|
||||||
|
toast.setOnDismissWrapper(new OnDismissWrapper("ftnt", new SuperToast.OnDismissListener() {
|
||||||
|
@Override
|
||||||
|
public void onDismiss(View view) {
|
||||||
|
fbreader.hideOutline();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
fbreader.showToast(toast);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void showDictanError(final FBReader fbreader, int code, Intent data) {
|
||||||
|
final ZLResource resource = ZLResource.resource("dictanErrors");
|
||||||
|
String message;
|
||||||
|
switch (code) {
|
||||||
|
default:
|
||||||
|
message = data.getStringExtra("error.message");
|
||||||
|
if (message == null) {
|
||||||
|
message = resource.getResource("unknown").getValue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
{
|
||||||
|
final String word = data.getStringExtra("article.word");
|
||||||
|
message = resource.getResource("noArticle").getValue().replaceAll("%s", word);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 130:
|
||||||
|
message = resource.getResource("cannotOpenDictionary").getValue();
|
||||||
|
break;
|
||||||
|
case 131:
|
||||||
|
message = resource.getResource("noDictionarySelected").getValue();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
final SuperActivityToast toast = new SuperActivityToast(fbreader, SuperToast.Type.STANDARD);
|
||||||
|
toast.setText("Dictan: " + message);
|
||||||
|
toast.setDuration(5000);
|
||||||
|
toast.setOnDismissWrapper(new OnDismissWrapper("ftnt", new SuperToast.OnDismissListener() {
|
||||||
|
@Override
|
||||||
|
public void onDismiss(View view) {
|
||||||
|
fbreader.hideOutline();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
fbreader.showToast(toast);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String trimArticle(String text) {
|
||||||
|
final int len = text.length();
|
||||||
|
final int eolIndex = text.lastIndexOf("\n");
|
||||||
|
final int spaceIndex = text.lastIndexOf(" ");
|
||||||
|
if (spaceIndex < eolIndex || eolIndex >= len * 2 / 3) {
|
||||||
|
return text.substring(0, eolIndex);
|
||||||
|
} else {
|
||||||
|
return text.substring(0, spaceIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ import org.geometerplus.zlibrary.core.options.Config;
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
import org.geometerplus.zlibrary.core.view.ZLViewWidget;
|
import org.geometerplus.zlibrary.core.view.ZLViewWidget;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.text.view.ZLTextRegion;
|
||||||
import org.geometerplus.zlibrary.text.view.ZLTextView;
|
import org.geometerplus.zlibrary.text.view.ZLTextView;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.ui.android.R;
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
@ -73,6 +74,7 @@ public final class FBReader extends Activity implements ZLApplicationWindow {
|
||||||
|
|
||||||
public static final int REQUEST_PREFERENCES = 1;
|
public static final int REQUEST_PREFERENCES = 1;
|
||||||
public static final int REQUEST_CANCEL_MENU = 2;
|
public static final int REQUEST_CANCEL_MENU = 2;
|
||||||
|
public static final int REQUEST_DICTIONARY = 3;
|
||||||
|
|
||||||
public static final int RESULT_DO_NOTHING = RESULT_FIRST_USER;
|
public static final int RESULT_DO_NOTHING = RESULT_FIRST_USER;
|
||||||
public static final int RESULT_REPAINT = RESULT_FIRST_USER + 1;
|
public static final int RESULT_REPAINT = RESULT_FIRST_USER + 1;
|
||||||
|
@ -708,6 +710,9 @@ public final class FBReader extends Activity implements ZLApplicationWindow {
|
||||||
case REQUEST_CANCEL_MENU:
|
case REQUEST_CANCEL_MENU:
|
||||||
runCancelAction(data);
|
runCancelAction(data);
|
||||||
break;
|
break;
|
||||||
|
case REQUEST_DICTIONARY:
|
||||||
|
DictionaryUtil.onActivityResult(this, resultCode, data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1071,4 +1076,14 @@ public final class FBReader extends Activity implements ZLApplicationWindow {
|
||||||
myToast = toast;
|
myToast = toast;
|
||||||
toast.show();
|
toast.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void outlineRegion(ZLTextRegion.Soul soul) {
|
||||||
|
myFBReaderApp.getTextView().outlineRegion(soul);
|
||||||
|
myFBReaderApp.getViewWidget().repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideOutline() {
|
||||||
|
myFBReaderApp.getTextView().hideOutline();
|
||||||
|
myFBReaderApp.getViewWidget().repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import android.view.View;
|
||||||
import com.github.johnpersano.supertoasts.SuperActivityToast;
|
import com.github.johnpersano.supertoasts.SuperActivityToast;
|
||||||
import com.github.johnpersano.supertoasts.SuperToast;
|
import com.github.johnpersano.supertoasts.SuperToast;
|
||||||
import com.github.johnpersano.supertoasts.util.OnClickWrapper;
|
import com.github.johnpersano.supertoasts.util.OnClickWrapper;
|
||||||
|
import com.github.johnpersano.supertoasts.util.OnDismissWrapper;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.network.ZLNetworkException;
|
import org.geometerplus.zlibrary.core.network.ZLNetworkException;
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
@ -50,19 +51,19 @@ class ProcessHyperlinkAction extends FBAndroidAction {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return Reader.getTextView().getSelectedRegion() != null;
|
return Reader.getTextView().getOutlinedRegion() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void run(Object ... params) {
|
protected void run(Object ... params) {
|
||||||
final ZLTextRegion region = Reader.getTextView().getSelectedRegion();
|
final ZLTextRegion region = Reader.getTextView().getOutlinedRegion();
|
||||||
if (region == null) {
|
if (region == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ZLTextRegion.Soul soul = region.getSoul();
|
final ZLTextRegion.Soul soul = region.getSoul();
|
||||||
if (soul instanceof ZLTextHyperlinkRegionSoul) {
|
if (soul instanceof ZLTextHyperlinkRegionSoul) {
|
||||||
Reader.getTextView().hideSelectedRegionBorder();
|
Reader.getTextView().hideOutline();
|
||||||
Reader.getViewWidget().repaint();
|
Reader.getViewWidget().repaint();
|
||||||
final ZLTextHyperlink hyperlink = ((ZLTextHyperlinkRegionSoul)soul).Hyperlink;
|
final ZLTextHyperlink hyperlink = ((ZLTextHyperlinkRegionSoul)soul).Hyperlink;
|
||||||
switch (hyperlink.Type) {
|
switch (hyperlink.Type) {
|
||||||
|
@ -115,6 +116,14 @@ class ProcessHyperlinkAction extends FBAndroidAction {
|
||||||
}
|
}
|
||||||
toast.setText(snippet.getText());
|
toast.setText(snippet.getText());
|
||||||
toast.setDuration(Reader.MiscOptions.FootnoteToastDuration.getValue().Value);
|
toast.setDuration(Reader.MiscOptions.FootnoteToastDuration.getValue().Value);
|
||||||
|
toast.setOnDismissWrapper(new OnDismissWrapper("ftnt", new SuperToast.OnDismissListener() {
|
||||||
|
@Override
|
||||||
|
public void onDismiss(View view) {
|
||||||
|
Reader.getTextView().hideOutline();
|
||||||
|
Reader.getViewWidget().repaint();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
Reader.getTextView().outlineRegion(region);
|
||||||
BaseActivity.showToast(toast);
|
BaseActivity.showToast(toast);
|
||||||
} else {
|
} else {
|
||||||
Reader.tryOpenFootnote(hyperlink.Id);
|
Reader.tryOpenFootnote(hyperlink.Id);
|
||||||
|
@ -123,7 +132,7 @@ class ProcessHyperlinkAction extends FBAndroidAction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (soul instanceof ZLTextImageRegionSoul) {
|
} else if (soul instanceof ZLTextImageRegionSoul) {
|
||||||
Reader.getTextView().hideSelectedRegionBorder();
|
Reader.getTextView().hideOutline();
|
||||||
Reader.getViewWidget().repaint();
|
Reader.getViewWidget().repaint();
|
||||||
final String url = ((ZLTextImageRegionSoul)soul).ImageElement.URL;
|
final String url = ((ZLTextImageRegionSoul)soul).ImageElement.URL;
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
|
|
|
@ -35,7 +35,8 @@ public class SelectionTranslateAction extends FBAndroidAction {
|
||||||
fbview.getSelectedSnippet().getText(),
|
fbview.getSelectedSnippet().getText(),
|
||||||
fbview.getCountOfSelectedWords() == 1,
|
fbview.getCountOfSelectedWords() == 1,
|
||||||
fbview.getSelectionStartY(),
|
fbview.getSelectionStartY(),
|
||||||
fbview.getSelectionEndY()
|
fbview.getSelectionEndY(),
|
||||||
|
fbview.getSelectionSoul()
|
||||||
);
|
);
|
||||||
fbview.clearSelection();
|
fbview.clearSelection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ public final class FBView extends ZLTextView {
|
||||||
|
|
||||||
final ZLTextRegion hyperlinkRegion = findRegion(x, y, maxSelectionDistance(), ZLTextRegion.HyperlinkFilter);
|
final ZLTextRegion hyperlinkRegion = findRegion(x, y, maxSelectionDistance(), ZLTextRegion.HyperlinkFilter);
|
||||||
if (hyperlinkRegion != null) {
|
if (hyperlinkRegion != null) {
|
||||||
selectRegion(hyperlinkRegion);
|
outlineRegion(hyperlinkRegion);
|
||||||
myReader.getViewWidget().reset();
|
myReader.getViewWidget().reset();
|
||||||
myReader.getViewWidget().repaint();
|
myReader.getViewWidget().repaint();
|
||||||
myReader.runAction(ActionCode.PROCESS_HYPERLINK);
|
myReader.runAction(ActionCode.PROCESS_HYPERLINK);
|
||||||
|
@ -108,7 +108,7 @@ public final class FBView extends ZLTextView {
|
||||||
|
|
||||||
final ZLTextRegion videoRegion = findRegion(x, y, 0, ZLTextRegion.VideoFilter);
|
final ZLTextRegion videoRegion = findRegion(x, y, 0, ZLTextRegion.VideoFilter);
|
||||||
if (videoRegion != null) {
|
if (videoRegion != null) {
|
||||||
selectRegion(videoRegion);
|
outlineRegion(videoRegion);
|
||||||
myReader.getViewWidget().reset();
|
myReader.getViewWidget().reset();
|
||||||
myReader.getViewWidget().repaint();
|
myReader.getViewWidget().repaint();
|
||||||
myReader.runAction(ActionCode.OPEN_VIDEO, (ZLTextVideoRegionSoul)videoRegion.getSoul());
|
myReader.runAction(ActionCode.OPEN_VIDEO, (ZLTextVideoRegionSoul)videoRegion.getSoul());
|
||||||
|
@ -139,9 +139,12 @@ public final class FBView extends ZLTextView {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onFingerDoubleTap(int x, int y) {
|
public boolean onFingerDoubleTap(int x, int y) {
|
||||||
|
myReader.runAction(ActionCode.HIDE_TOAST);
|
||||||
|
|
||||||
if (super.onFingerDoubleTap(x, y)) {
|
if (super.onFingerDoubleTap(x, y)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
myReader.runAction(getZoneMap().getActionByCoordinates(
|
myReader.runAction(getZoneMap().getActionByCoordinates(
|
||||||
x, y, getContextWidth(), getContextHeight(), TapZoneMap.Tap.doubleTap
|
x, y, getContextWidth(), getContextHeight(), TapZoneMap.Tap.doubleTap
|
||||||
), x, y);
|
), x, y);
|
||||||
|
@ -149,6 +152,8 @@ public final class FBView extends ZLTextView {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onFingerPress(int x, int y) {
|
public boolean onFingerPress(int x, int y) {
|
||||||
|
myReader.runAction(ActionCode.HIDE_TOAST);
|
||||||
|
|
||||||
if (super.onFingerPress(x, y)) {
|
if (super.onFingerPress(x, y)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -246,6 +251,8 @@ public final class FBView extends ZLTextView {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onFingerLongPress(int x, int y) {
|
public boolean onFingerLongPress(int x, int y) {
|
||||||
|
myReader.runAction(ActionCode.HIDE_TOAST);
|
||||||
|
|
||||||
if (super.onFingerLongPress(x, y)) {
|
if (super.onFingerLongPress(x, y)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -278,7 +285,7 @@ public final class FBView extends ZLTextView {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doSelectRegion) {
|
if (doSelectRegion) {
|
||||||
selectRegion(region);
|
outlineRegion(region);
|
||||||
myReader.getViewWidget().reset();
|
myReader.getViewWidget().reset();
|
||||||
myReader.getViewWidget().repaint();
|
myReader.getViewWidget().repaint();
|
||||||
return true;
|
return true;
|
||||||
|
@ -299,7 +306,7 @@ public final class FBView extends ZLTextView {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZLTextRegion region = getSelectedRegion();
|
ZLTextRegion region = getOutlinedRegion();
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
ZLTextRegion.Soul soul = region.getSoul();
|
ZLTextRegion.Soul soul = region.getSoul();
|
||||||
if (soul instanceof ZLTextHyperlinkRegionSoul ||
|
if (soul instanceof ZLTextHyperlinkRegionSoul ||
|
||||||
|
@ -311,7 +318,7 @@ public final class FBView extends ZLTextView {
|
||||||
soul = region.getSoul();
|
soul = region.getSoul();
|
||||||
if (soul instanceof ZLTextHyperlinkRegionSoul
|
if (soul instanceof ZLTextHyperlinkRegionSoul
|
||||||
|| soul instanceof ZLTextWordRegionSoul) {
|
|| soul instanceof ZLTextWordRegionSoul) {
|
||||||
selectRegion(region);
|
outlineRegion(region);
|
||||||
myReader.getViewWidget().reset();
|
myReader.getViewWidget().reset();
|
||||||
myReader.getViewWidget().repaint();
|
myReader.getViewWidget().repaint();
|
||||||
}
|
}
|
||||||
|
@ -333,7 +340,7 @@ public final class FBView extends ZLTextView {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ZLTextRegion region = getSelectedRegion();
|
final ZLTextRegion region = getOutlinedRegion();
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
final ZLTextRegion.Soul soul = region.getSoul();
|
final ZLTextRegion.Soul soul = region.getSoul();
|
||||||
|
|
||||||
|
|
|
@ -33,14 +33,14 @@ class MoveCursorAction extends FBAction {
|
||||||
@Override
|
@Override
|
||||||
protected void run(Object ... params) {
|
protected void run(Object ... params) {
|
||||||
final FBView fbView = Reader.getTextView();
|
final FBView fbView = Reader.getTextView();
|
||||||
ZLTextRegion region = fbView.getSelectedRegion();
|
ZLTextRegion region = fbView.getOutlinedRegion();
|
||||||
final ZLTextRegion.Filter filter =
|
final ZLTextRegion.Filter filter =
|
||||||
(region != null && region.getSoul() instanceof ZLTextWordRegionSoul)
|
(region != null && region.getSoul() instanceof ZLTextWordRegionSoul)
|
||||||
|| Reader.MiscOptions.NavigateAllWords.getValue()
|
|| Reader.MiscOptions.NavigateAllWords.getValue()
|
||||||
? ZLTextRegion.AnyRegionFilter : ZLTextRegion.ImageOrHyperlinkFilter;
|
? ZLTextRegion.AnyRegionFilter : ZLTextRegion.ImageOrHyperlinkFilter;
|
||||||
region = fbView.nextRegion(myDirection, filter);
|
region = fbView.nextRegion(myDirection, filter);
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
fbView.selectRegion(region);
|
fbView.outlineRegion(region);
|
||||||
} else {
|
} else {
|
||||||
switch (myDirection) {
|
switch (myDirection) {
|
||||||
case down:
|
case down:
|
||||||
|
|
|
@ -42,11 +42,14 @@ class ZLTextSelection extends ZLTextHighlighting {
|
||||||
|
|
||||||
private Scroller myScroller;
|
private Scroller myScroller;
|
||||||
|
|
||||||
|
|
||||||
ZLTextSelection(ZLTextView view) {
|
ZLTextSelection(ZLTextView view) {
|
||||||
myView = view;
|
myView = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ZLTextRegion.Soul getSoul() {
|
||||||
|
return myLeftMostRegionSoul != null && myLeftMostRegionSoul.equals(myRightMostRegionSoul) ? myLeftMostRegionSoul : null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return myLeftMostRegionSoul == null;
|
return myLeftMostRegionSoul == null;
|
||||||
|
|
|
@ -57,8 +57,8 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
|
|
||||||
private final HashMap<ZLTextLineInfo,ZLTextLineInfo> myLineInfoCache = new HashMap<ZLTextLineInfo,ZLTextLineInfo>();
|
private final HashMap<ZLTextLineInfo,ZLTextLineInfo> myLineInfoCache = new HashMap<ZLTextLineInfo,ZLTextLineInfo>();
|
||||||
|
|
||||||
private ZLTextRegion.Soul mySelectedRegionSoul;
|
private ZLTextRegion.Soul myOutlinedRegionSoul;
|
||||||
private boolean myHighlightSelectedRegion = true;
|
private boolean myShowOutline = true;
|
||||||
|
|
||||||
private final ZLTextSelection mySelection = new ZLTextSelection(this);
|
private final ZLTextSelection mySelection = new ZLTextSelection(this);
|
||||||
private final Set<ZLTextHighlighting> myHighlightings =
|
private final Set<ZLTextHighlighting> myHighlightings =
|
||||||
|
@ -543,9 +543,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final ZLTextRegion selectedElementRegion = getSelectedRegion(page);
|
final ZLTextRegion outlinedElementRegion = getOutlinedRegion(page);
|
||||||
if (selectedElementRegion != null && myHighlightSelectedRegion) {
|
if (outlinedElementRegion != null && myShowOutline) {
|
||||||
selectedElementRegion.draw(context);
|
outlinedElementRegion.draw(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
drawSelectionCursor(context, getSelectionCursorPoint(page, ZLTextSelectionCursor.Left));
|
drawSelectionCursor(context, getSelectionCursorPoint(page, ZLTextSelectionCursor.Left));
|
||||||
|
@ -1721,19 +1721,35 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
return myCurrentPage.TextElementMap.binarySearch(x, y);
|
return myCurrentPage.TextElementMap.binarySearch(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hideSelectedRegionBorder() {
|
public final void outlineRegion(ZLTextRegion region) {
|
||||||
myHighlightSelectedRegion = false;
|
outlineRegion(region != null ? region.getSoul() : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void outlineRegion(ZLTextRegion.Soul soul) {
|
||||||
|
myShowOutline = true;
|
||||||
|
myOutlinedRegionSoul = soul;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideOutline() {
|
||||||
|
myShowOutline = false;
|
||||||
Application.getViewWidget().reset();
|
Application.getViewWidget().reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ZLTextRegion getSelectedRegion(ZLTextPage page) {
|
private ZLTextRegion getOutlinedRegion(ZLTextPage page) {
|
||||||
return page.TextElementMap.getRegion(mySelectedRegionSoul);
|
return page.TextElementMap.getRegion(myOutlinedRegionSoul);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZLTextRegion getSelectedRegion() {
|
public ZLTextRegion getOutlinedRegion() {
|
||||||
return getSelectedRegion(myCurrentPage);
|
return getOutlinedRegion(myCurrentPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public void resetRegionPointer() {
|
||||||
|
myOutlinedRegionSoul = null;
|
||||||
|
myShowOutline = true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
protected ZLTextHighlighting findHighlighting(int x, int y, int maxDistance) {
|
protected ZLTextHighlighting findHighlighting(int x, int y, int maxDistance) {
|
||||||
final ZLTextRegion region = findRegion(x, y, maxDistance, ZLTextRegion.AnyRegionFilter);
|
final ZLTextRegion region = findRegion(x, y, maxDistance, ZLTextRegion.AnyRegionFilter);
|
||||||
if (region == null) {
|
if (region == null) {
|
||||||
|
@ -1757,14 +1773,6 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
return myCurrentPage.TextElementMap.findRegion(x, y, maxDistance, filter);
|
return myCurrentPage.TextElementMap.findRegion(x, y, maxDistance, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectRegion(ZLTextRegion region) {
|
|
||||||
final ZLTextRegion.Soul soul = region != null ? region.getSoul() : null;
|
|
||||||
if (soul == null || !soul.equals(mySelectedRegionSoul)) {
|
|
||||||
myHighlightSelectedRegion = true;
|
|
||||||
}
|
|
||||||
mySelectedRegionSoul = soul;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean initSelection(int x, int y) {
|
protected boolean initSelection(int x, int y) {
|
||||||
y -= getTextStyleCollection().getBaseStyle().getFontSize() / 2;
|
y -= getTextStyleCollection().getBaseStyle().getFontSize() / 2;
|
||||||
if (!mySelection.start(x, y)) {
|
if (!mySelection.start(x, y)) {
|
||||||
|
@ -1782,6 +1790,10 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ZLTextRegion.Soul getSelectionSoul() {
|
||||||
|
return mySelection.getSoul();
|
||||||
|
}
|
||||||
|
|
||||||
public int getSelectionStartY() {
|
public int getSelectionStartY() {
|
||||||
if (mySelection.isEmpty()) {
|
if (mySelection.isEmpty()) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1828,13 +1840,8 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
return mySelection.isEmpty();
|
return mySelection.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetRegionPointer() {
|
|
||||||
mySelectedRegionSoul = null;
|
|
||||||
myHighlightSelectedRegion = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ZLTextRegion nextRegion(Direction direction, ZLTextRegion.Filter filter) {
|
public ZLTextRegion nextRegion(Direction direction, ZLTextRegion.Filter filter) {
|
||||||
return myCurrentPage.TextElementMap.nextRegion(getSelectedRegion(), direction, filter);
|
return myCurrentPage.TextElementMap.nextRegion(getOutlinedRegion(), direction, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue