package com.csound.wizard.fragment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.app.Fragment;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.NumberPicker;
import android.widget.NumberPicker.OnValueChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Spinner;
import android.widget.TextView;
import com.csound.wizard.Const;
import com.csound.wizard.Settings;
import com.csound.wizard.Utils;
import com.csound.wizard.layout.Layout;
import com.example.proglayout.R;
public class SettingsFragment extends Fragment {
private Settings settings;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
settings = Utils.getSettings(getActivity());
final View res = inflater.inflate(R.layout.fragment_settings, container, false);
// Main menu
int[] allIds = { R.id.set_text, R.id.set_color, R.id.set_layout };
int[] allIdUnits = { R.id.set_text_container, R.id.set_color_container, R.id.set_layout_container };
setPrimaryToggleMenu(res, allIds, allIdUnits);
// Text menu
int[] allTextIds = { R.id.set_text_size, R.id.set_text_scale, R.id.set_text_color, R.id.set_text_align };
int[] allTextIdUnits = { R.id.set_text_size_unit, R.id.set_text_scale_unit, R.id.set_text_color_unit, R.id.set_text_align_unit };
setSecondaryToggleMenu(res, allTextIds, allTextIdUnits);
setupTextSize(res);
setupTextScale(res);
setupTextColor(res);
setupTextAlign(res);
// Color menu
int[] allColorIds = { R.id.set_fst_color, R.id.set_snd_color, R.id.set_bkg_color };
int[] allColorIdUnits = { R.id.set_fst_color_unit, R.id.set_snd_color_unit, R.id.set_bkg_color_unit };
setSecondaryToggleMenu(res, allColorIds, allColorIdUnits);
setupFstColor(res);
setupSndColor(res);
setupBkgColor(res);
// Layout menu
int[] allLayoutIds = { R.id.set_layout_margin };
int[] allLayoutIdUnits = { R.id.set_layout_margin_unit };
setSecondaryToggleMenu(res, allLayoutIds, allLayoutIdUnits);
setupMarginLeft(res);
setupMarginRight(res);
setupMarginTop(res);
setupMarginBottom(res);
TextView tv = (TextView) res.findViewById(R.id.set_text_scale_show_value);
Layout.setTextProperties(tv, settings.getParam().getText());
return res;
}
private void setPrimaryToggleMenu(final View res, final int[] allIds, final int[] allIdUnits) {
int highlightColor = Color.parseColor("#7FDBFF");
int bkgColor = Color.parseColor("#DDDDDD");
setToggleMenu(res, allIds, allIdUnits, highlightColor, bkgColor);
}
private void setSecondaryToggleMenu(final View res, final int[] allIds, final int[] allIdUnits) {
int highlightColor = Color.parseColor("#3D9970");
int bkgColor = Color.TRANSPARENT;
setToggleMenu(res, allIds, allIdUnits, highlightColor, bkgColor);
}
private void setToggleMenu(final View res, final int[] allIds, final int[] allIdUnits, final int color, final int bkgColor) {
for (int i = 0; i < allIds.length; i++) {
setToggle(res, allIds[i], allIdUnits[i], allIds, allIdUnits, color, bkgColor);
}
for (int i: allIds) {
res.findViewById(i).setBackgroundColor(bkgColor);
}
}
private void setToggle(final View res, final int id, final int idUnit, final int[] allIds, final int[] allIdUnits, final int color, final int bkgColor) {
View tv = res.findViewById(id);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
View v = res.findViewById(idUnit);
if (v.getVisibility() != View.VISIBLE) {
for (int i: allIds) {
res.findViewById(i).setBackgroundColor(bkgColor);
}
for (int i: allIdUnits) {
res.findViewById(i).setVisibility(View.GONE);
}
v.setVisibility(View.VISIBLE);
res.findViewById(id).setBackgroundColor(color);
} else {
v.setVisibility(View.GONE);
res.findViewById(id).setBackgroundColor(bkgColor);
}
}
});
}
// Setup fields
// -----------------------------------------------------
// Text
private void setupTextSize(View root) {
setupNumberPicker((NumberPicker) root.findViewById(R.id.set_text_size_unit),
12, 40, settings.getTextSize(), new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
settings.setTextSize(newVal);
}
});
}
private void setupTextScale(final View root) {
final TextView tv = (TextView) root.findViewById(R.id.set_text_scale_show_value);
tv.setText(Float.toString(settings.getTextScale()));
setupSeekBar((SeekBar) root.findViewById(R.id.set_text_scale_unit_value), Const.minTextScale, Const.maxTextScale, settings.getTextScale(), new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
float val = Const.minTextScale + (Const.maxTextScale - Const.minTextScale) * (float) progress / 100f;
settings.setTextScale(val);
tv.setText(Float.toString(val));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
private void setupTextColor(View root) {
setupColor((Spinner) root.findViewById(R.id.set_text_color_unit), getColorPosition(settings.getTextColor()), new OnSetColor() {
@Override
public void apply(int n) {
settings.setTextColor(n);
}
});
}
private void setupTextAlign(View root) {
List<String> alignNameList = new ArrayList<String>(Arrays.asList(alignNames));
setupSpinner((Spinner) root.findViewById(R.id.set_text_align_unit),
alignNameList, getAlignPosition(settings.getTextAlign()), new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View v,
int position, long arg3) {
settings.setTextAlign(positionToAlign(position));
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
// -----------------------------------------------------
// Color
private void setupFstColor(View root) {
setupColor((Spinner) root.findViewById(R.id.set_fst_color_unit), getColorPosition(settings.getFstColor()), new OnSetColor() {
@Override
public void apply(int n) {
settings.setFstColor(n);
}
});
}
private void setupSndColor(View root) {
setupColor((Spinner) root.findViewById(R.id.set_snd_color_unit), getColorPosition(settings.getSndColor()), new OnSetColor() {
@Override
public void apply(int n) {
settings.setSndColor(n);
}
});
}
private void setupBkgColor(View root) {
setupColor((Spinner) root.findViewById(R.id.set_bkg_color_unit), getColorPosition(settings.getBkgColor()), new OnSetColor() {
@Override
public void apply(int n) {
settings.setBkgColor(n);
}
});
}
// -----------------------------------------------------
// Layout
private void setupMargin(NumberPicker np, int val, OnValueChangeListener listener) {
setupNumberPicker(np, 0, 50, val, listener);
}
private void setupMarginLeft(View root) {
setupMargin((NumberPicker) root.findViewById(R.id.set_margin_left_unit), settings.getMarginLeft(), new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
settings.setMarginLeft(newVal);
}
});
}
private void setupMarginRight(View root) {
setupMargin((NumberPicker) root.findViewById(R.id.set_margin_right_unit), settings.getMarginRight(), new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
settings.setMarginRight(newVal);
}
});
}
private void setupMarginTop(View root) {
setupMargin((NumberPicker) root.findViewById(R.id.set_margin_top_unit), settings.getMarginTop(), new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
settings.setMarginTop(newVal);
}
});
}
private void setupMarginBottom(View root) {
setupMargin((NumberPicker) root.findViewById(R.id.set_margin_bottom_unit), settings.getMarginBottom(), new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
settings.setMarginBottom(newVal);
}
});
}
// -----------------------------------------------------
// Utils
private void setupColor(Spinner sp, int pos, OnSetColor setColor) {
setupColorSpinner(sp, pos, setColor);
}
private interface OnSetColor {
public void apply(int n);
}
private int faintColor(int col) {
return Color.argb(100, Color.red(col), Color.green(col), Color.blue(col));
}
private void setupColorSpinner(Spinner x, int pos, final OnSetColor setColor) {
final List<String> names = Const.colorNameList;
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, names) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return applyColor(super.getView(position, convertView, parent));
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return applyColor(applyTextParam(super.getDropDownView(position, convertView, parent)));
}
private View applyTextParam(View x) {
TextView res = (TextView) x;
Layout.setTextProperties(res, settings.getParam().getText());
return res;
}
private View applyColor(View v) {
TextView res = (TextView) v;
int col = Const.getColor(res.getText().toString());
res.setBackgroundColor(faintColor(col));
return res;
}
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
x.setAdapter(adapter);
x.setSelection(pos);
x.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View view,
int position, long arg3) {
setColor.apply(Const.getColor(names.get(position)));
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
private void setupSpinner(Spinner x, List<String> names, int pos, OnItemSelectedListener listener) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, names) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return applyTextParam(super.getView(position, convertView, parent));
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return applyTextParam(super.getDropDownView(position, convertView, parent));
}
private View applyTextParam(View x) {
TextView res = (TextView) x;
Layout.setTextProperties(res, settings.getParam().getText());
return res;
}
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
x.setAdapter(adapter);
x.setSelection(pos);
x.setOnItemSelectedListener(listener);
}
private int getColorPosition(int color) {
return Const.getColorPosition(color);
}
private static final String[] alignNames = { "left", "center", "right" };
private int getAlignPosition(Align n) {
if (n.equals(Align.LEFT)) {
return 0;
}
if (n.equals(Align.CENTER)) {
return 1;
}
if (n.equals(Align.RIGHT)) {
return 2;
}
return 0;
}
private Align positionToAlign(int n) {
switch (n) {
case 0:
return Align.LEFT;
case 1:
return Align.CENTER;
case 2:
return Align.RIGHT;
default:
return Align.CENTER;
}
}
private void setupSeekBar(SeekBar x, float minVal, float maxVal, float val, OnSeekBarChangeListener listener) {
x.setProgress(Math.round(100 * (val - minVal) / (maxVal - minVal)));
x.setOnSeekBarChangeListener(listener);
}
private void setupNumberPicker(NumberPicker np, int minVal, int maxVal, int val, OnValueChangeListener listener) {
np.setMinValue(minVal);
np.setMaxValue(maxVal);
np.setValue(val);
np.setWrapSelectorWheel(false);
np.setOnValueChangedListener(listener);
}
}