- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / android / java / src / org / chromium / chrome / browser / infobar / TranslateOptions.java
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chrome.browser.infobar;
6
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.List;
11
12
13 /**
14  * A class that keeps the state of the different translation options and
15  * languages.
16  */
17 public class TranslateOptions {
18
19     // This would be an enum but they are not good for mobile.
20     // The checkBoundaries method below needs to be updated if new options are added.
21     private static final int NEVER_LANGUAGE = 0;
22     private static final int NEVER_DOMAIN = 1;
23     private static final int ALWAYS_LANGUAGE = 2;
24
25     private final String[] mAllLanguages;
26
27     // Will reflect the state before the object was ever modified
28     private final boolean[] mOriginalOptions;
29     private final int mOriginalSourceLanguageIndex;
30     private final int mOriginalTargetLanguageIndex;
31
32     private boolean[] mOptions;
33     private int mSourceLanguageIndex;
34     private int mTargetLanguageIndex;
35
36     private TranslateOptions(int sourceLanguageCode, int targetLanguageCode, String[] allLanguages,
37             boolean neverLanguage, boolean neverDomain, boolean alwaysLanguage,
38             boolean[] originalOptions) {
39         mAllLanguages = allLanguages;
40         mSourceLanguageIndex = sourceLanguageCode;
41         mTargetLanguageIndex = targetLanguageCode;
42
43         mOptions = new boolean[3];
44         mOptions[NEVER_LANGUAGE] = neverLanguage;
45         mOptions[NEVER_DOMAIN] = neverDomain;
46         mOptions[ALWAYS_LANGUAGE] = alwaysLanguage;
47
48
49         if (originalOptions == null) {
50             mOriginalOptions = mOptions.clone();
51         } else {
52             mOriginalOptions = originalOptions.clone();
53         }
54
55         mOriginalSourceLanguageIndex = mSourceLanguageIndex;
56         mOriginalTargetLanguageIndex = mTargetLanguageIndex;
57     }
58
59     public TranslateOptions(int sourceLanguageCode, int targetLanguageCode, String[] allLanguages,
60             boolean alwaysTranslate) {
61         this(sourceLanguageCode, targetLanguageCode, allLanguages, false, false, alwaysTranslate,
62                 null);
63     }
64
65     /**
66      * Copy constructor
67      */
68     public TranslateOptions(TranslateOptions other) {
69         this(other.mSourceLanguageIndex, other.mTargetLanguageIndex, other.mAllLanguages,
70                 other.mOptions[NEVER_LANGUAGE], other.mOptions[NEVER_DOMAIN],
71                 other.mOptions[ALWAYS_LANGUAGE], other.mOriginalOptions);
72     }
73
74     public String sourceLanguage() {
75         if (checkLanguageBoundaries(mSourceLanguageIndex))
76             return mAllLanguages[mSourceLanguageIndex];
77         return "";
78     }
79
80     public String targetLanguage() {
81         if (checkLanguageBoundaries(mTargetLanguageIndex))
82             return mAllLanguages[mTargetLanguageIndex];
83         return "";
84     }
85
86     public int sourceLanguageIndex() {
87         return checkLanguageBoundaries(mSourceLanguageIndex) ? mSourceLanguageIndex : 0;
88     }
89
90     public int targetLanguageIndex() {
91         return checkLanguageBoundaries(mTargetLanguageIndex) ? mTargetLanguageIndex : 0;
92     }
93
94     public boolean optionsChanged() {
95         return (mSourceLanguageIndex != mOriginalSourceLanguageIndex) ||
96                 (mTargetLanguageIndex != mOriginalTargetLanguageIndex) ||
97                 (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE]) ||
98                 (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN]) ||
99                 (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAGE]);
100     }
101
102
103     public List<String> allLanguages() {
104         return Collections.unmodifiableList(Arrays.asList(mAllLanguages));
105     }
106
107     public boolean neverTranslateLanguageState() {
108         return mOptions[NEVER_LANGUAGE];
109     }
110
111     public boolean alwaysTranslateLanguageState() {
112         return mOptions[ALWAYS_LANGUAGE];
113     }
114
115     public boolean neverTranslateDomainState() {
116         return mOptions[NEVER_DOMAIN];
117     }
118
119     public boolean setSourceLanguage(int languageIndex) {
120         boolean canSet = canSetLanguage(languageIndex, mTargetLanguageIndex);
121         if (canSet) {
122             mSourceLanguageIndex = languageIndex;
123         }
124         return canSet;
125     }
126
127     public boolean setTargetLanguage(int languageIndex) {
128         boolean canSet = canSetLanguage(mSourceLanguageIndex, languageIndex);
129         if (canSet) {
130             mTargetLanguageIndex = languageIndex;
131         }
132         return canSet;
133     }
134
135     /**
136      * Sets the new state of never translate domain.
137      *
138      * @return true if the toggling was possible
139      */
140     public boolean toggleNeverTranslateDomainState(boolean value) {
141         return toggleState(NEVER_DOMAIN, value);
142     }
143
144     /**
145      * Sets the new state of never translate language.
146      *
147      * @return true if the toggling was possible
148      */
149     public boolean toggleNeverTranslateLanguageState(boolean value) {
150         // Do not toggle if we are activating NeverLanguge but AlwaysTranslate
151         // for a language pair with the same source language is already active.
152         if (mOptions[ALWAYS_LANGUAGE] && value) {
153             return false;
154         }
155         return toggleState(NEVER_LANGUAGE, value);
156     }
157
158     /**
159      * Sets the new state of never translate a language pair.
160      *
161      * @return true if the toggling was possible
162      */
163     public boolean toggleAlwaysTranslateLanguageState(boolean value) {
164         // Do not toggle if we are activating AlwaysLanguge but NeverLanguage is active already.
165         if (mOptions[NEVER_LANGUAGE] && value) {
166             return false;
167         }
168         return toggleState(ALWAYS_LANGUAGE, value);
169     }
170
171     private boolean toggleState(int element, boolean newValue) {
172         if (!checkElementBoundaries(element))
173             return false;
174
175         mOptions[element] = newValue;
176         return true;
177     }
178
179
180     private boolean checkLanguageBoundaries(int index) {
181         return index >= 0 && index < mAllLanguages.length;
182     }
183
184     private boolean canSetLanguage(int sourceIndex, int targetIndex) {
185         if (sourceIndex == targetIndex)
186             return false;
187         return checkLanguageBoundaries(sourceIndex) && checkLanguageBoundaries(targetIndex);
188     }
189
190
191     private static boolean checkElementBoundaries(int element) {
192         return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE;
193     }
194
195     @Override
196     public String toString() {
197         return new StringBuilder()
198                 .append(sourceLanguage())
199                 .append(" -> ")
200                 .append(targetLanguage())
201                 .append(" - ")
202                 .append("Never Language:")
203                 .append(mOptions[NEVER_LANGUAGE])
204                 .append(" Always Language:")
205                 .append(mOptions[ALWAYS_LANGUAGE])
206                 .append(" Never Domain:")
207                 .append(mOptions[NEVER_DOMAIN])
208                 .toString();
209     }
210 }