/*
DroidFish - An Android chess program.
Copyright (C) 2014 Peter Ă–sterlund, peterosterlund2@gmail.com
This program 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.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.petero.droidfish.activities;
import java.util.Locale;
import java.util.TreeMap;
import org.petero.droidfish.R;
import org.petero.droidfish.Util;
import org.petero.droidfish.engine.UCIOptions;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.ToggleButton;
/** Edit UCI options. */
public class EditOptions extends Activity {
private UCIOptions uciOpts = null;
private String engineName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
Util.setFullScreenMode(this, settings);
Intent i = getIntent();
uciOpts = (UCIOptions)i.getSerializableExtra("org.petero.droidfish.ucioptions");
engineName = (String)i.getSerializableExtra("org.petero.droidfish.enginename");
if (uciOpts != null) {
initUI();
} else {
setResult(RESULT_CANCELED);
finish();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
initUI();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
sendBackResult();
return true;
}
return super.onKeyDown(keyCode, event);
}
private final void initUI() {
String title = getString(R.string.edit_options_title);
if (engineName != null)
title = title + ": " + engineName;
setTitle(title);
View view = View.inflate(this, R.layout.editoptions, null);
if (uciOpts != null) {
LinearLayout content = (LinearLayout)view.findViewById(R.id.eo_content);
for (String name : uciOpts.getOptionNames()) {
UCIOptions.OptionBase o = uciOpts.getOption(name);
if (!o.visible)
continue;
switch (o.type) {
case CHECK: {
View v = View.inflate(this, R.layout.uci_option_check, null);
CheckBox checkBox = (CheckBox)v.findViewById(R.id.eo_value);
checkBox.setText(o.name);
final UCIOptions.CheckOption co = (UCIOptions.CheckOption)o;
checkBox.setChecked(co.value);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
co.set(isChecked);
}
});
content.addView(v);
break;
}
case SPIN: {
View v = View.inflate(this, R.layout.uci_option_spin, null);
TextView label = (TextView)v.findViewById(R.id.eo_label);
EditText value = (EditText)v.findViewById(R.id.eo_value);
final UCIOptions.SpinOption so = (UCIOptions.SpinOption)o;
String labelText = String.format(Locale.US, "%s (%d\u2013%d)", so.name, so.minValue, so.maxValue);
label.setText(labelText);
value.setText(so.getStringValue());
if (so.minValue >= 0)
value.setInputType(android.text.InputType.TYPE_CLASS_NUMBER);
value.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) {
try {
int newVal = Integer.parseInt(s.toString());
if (newVal < so.minValue)
so.set(so.minValue);
else if (newVal > so.maxValue)
so.set(so.maxValue);
else
so.set(newVal);
} catch (NumberFormatException ex) {
}
}
});
content.addView(v);
break;
}
case COMBO: {
View v = View.inflate(this, R.layout.uci_option_combo, null);
TextView label = (TextView)v.findViewById(R.id.eo_label);
Spinner value = (Spinner)v.findViewById(R.id.eo_value);
label.setText(o.name);
final UCIOptions.ComboOption co = (UCIOptions.ComboOption)o;
ArrayAdapter<CharSequence> adapter =
new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item,
co.allowedValues);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
value.setAdapter(adapter);
value.setSelection(adapter.getPosition(co.value));
value.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> av, View view, int position, long id) {
if ((position >= 0) && (position < co.allowedValues.length))
co.set(co.allowedValues[position]);
}
public void onNothingSelected(AdapterView<?> arg0) { }
});
content.addView(v);
break;
}
case BUTTON: {
View v = View.inflate(this, R.layout.uci_option_button, null);
ToggleButton button = (ToggleButton)v.findViewById(R.id.eo_label);
final UCIOptions.ButtonOption bo = (UCIOptions.ButtonOption)o;
bo.trigger = false;
button.setText(o.name);
button.setTextOn(o.name);
button.setTextOff(o.name);
button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
bo.trigger = isChecked;
}
});
content.addView(v);
break;
}
case STRING: {
View v = View.inflate(this, R.layout.uci_option_string, null);
TextView label = (TextView)v.findViewById(R.id.eo_label);
EditText value = (EditText)v.findViewById(R.id.eo_value);
label.setText(o.name + " ");
final UCIOptions.StringOption so = (UCIOptions.StringOption)o;
value.setText(so.value);
value.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) {
so.set(s.toString());
}
});
content.addView(v);
break;
}
}
}
}
setContentView(view);
Util.overrideViewAttribs(findViewById(android.R.id.content));
Button okButton = (Button)findViewById(R.id.eo_ok);
Button cancelButton = (Button)findViewById(R.id.eo_cancel);
Button resetButton = (Button)findViewById(R.id.eo_reset);
okButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendBackResult();
}
});
cancelButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_CANCELED);
finish();
}
});
resetButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (uciOpts != null) {
boolean modified = false;
for (String name : uciOpts.getOptionNames()) {
UCIOptions.OptionBase o = uciOpts.getOption(name);
if (!o.visible)
continue;
switch (o.type) {
case CHECK: {
UCIOptions.CheckOption co = (UCIOptions.CheckOption)o;
if (co.set(co.defaultValue))
modified = true;
break;
}
case SPIN: {
UCIOptions.SpinOption so = (UCIOptions.SpinOption)o;
if (so.set(so.defaultValue))
modified = true;
break;
}
case COMBO: {
UCIOptions.ComboOption co = (UCIOptions.ComboOption)o;
if (co.set(co.defaultValue))
modified = true;
break;
}
case STRING: {
UCIOptions.StringOption so = (UCIOptions.StringOption)o;
if (so.set(so.defaultValue))
modified = true;
break;
}
case BUTTON:
break;
}
}
if (modified)
initUI();
}
}
});
}
private final void sendBackResult() {
if (uciOpts != null) {
TreeMap<String, String> uciMap = new TreeMap<String,String>();
for (String name : uciOpts.getOptionNames()) {
UCIOptions.OptionBase o = uciOpts.getOption(name);
if (o != null) {
if (o instanceof UCIOptions.ButtonOption) {
UCIOptions.ButtonOption bo = (UCIOptions.ButtonOption)o;
if (bo.trigger)
uciMap.put(name, "");
} else {
uciMap.put(name, o.getStringValue());
}
}
}
Intent i = new Intent();
i.putExtra("org.petero.droidfish.ucioptions", uciMap);
setResult(RESULT_OK, i);
finish();
} else {
setResult(RESULT_CANCELED);
finish();
}
}
}