package org.tyszecki.rozkladpkp.widgets;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Iterator;
import org.tyszecki.rozkladpkp.SerializableNameValuePair;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.AttributeSet;
import android.widget.Button;
public class AttributesButton extends Button implements DialogControl {
public static String join(AbstractCollection<String> s, String delimiter) {
if (s.isEmpty()) return "";
Iterator<String> iter = s.iterator();
StringBuffer buffer = new StringBuffer(iter.next());
while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
return buffer.toString();
}
public class Attribute{
String name;
String field = null;
String code = null;
boolean exclude = false;
public boolean checked = false;
public Attribute(String name, String code, boolean excludeWhenSelected)
{
this.name = name;
this.code = code;
exclude = excludeWhenSelected;
}
public Attribute(String name, String code)
{
this(name,code,false);
}
public Attribute(String name, String field, String code, boolean excludeWhenSelected)
{
this(name,code,excludeWhenSelected);
this.field = field;
}
public SerializableNameValuePair value()
{
if(field != null)
return new SerializableNameValuePair(field, code);
else
return new SerializableNameValuePair(exclude ? "REQ0HafasAttrExc" : "REQ0HafasAttrInc", code);
}
};
protected ArrayList<Attribute> items = new ArrayList<Attribute>();
public AttributesButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DialogFragment getDialog() {
return new AttributePickerFragment();
}
public void setParameters(ArrayList<SerializableNameValuePair> list) {
for(SerializableNameValuePair pair : list)
{
for(int j = 0; j < items.size(); ++j)
{
Attribute a = items.get(j);
if(a.field != null)
{
if(a.field.equals(pair.getName()))
a.checked = true;
}
else if(a.code != null && a.code.equals(pair.getValue()))
a.checked = true;
}
}
updateText();
}
public ArrayList<SerializableNameValuePair> getParameters() {
ArrayList<SerializableNameValuePair> ret = new ArrayList<SerializableNameValuePair>();
for(int i = 0; i < items.size(); ++i)
if(items.get(i).checked)
ret.add(items.get(i).value());
return ret;
}
protected void updateText() {
ArrayList<String> l = new ArrayList<String>();
for(int i = 0; i < items.size(); ++i)
if(items.get(i).checked)
l.add(items.get(i).name);
setText(l.size() == 0?"Wszystkie połączenia":join(l,","));
}
public int settingsCode() {
int s = 0;
int f = 1;
for(int i = 0; i < items.size(); ++i)
{
if(items.get(i).checked)
s += f;
f = f << 1;
}
return s;
}
public void readSettings(int code) {
for(int i = 0; i < items.size(); ++i)
{
items.get(i).checked = (code % 2 == 1);
code /= 2;
}
updateText();
}
public class AttributePickerFragment extends DialogFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Szczegóły połączenia");
final boolean[] dial = new boolean[items.size()];
for(int i = 0; i < items.size(); i++)
dial[i] = items.get(i).checked;
CharSequence[] titles = new CharSequence[items.size()];
for(int i = 0; i < items.size(); ++i)
titles[i] = items.get(i).name;
builder.setMultiChoiceItems(titles, dial, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1, boolean arg2) {
dial[arg1] = arg2;
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
for(int i = 0; i < items.size(); i++)
items.get(i).checked = dial[i];
updateText();
dialog.cancel();
}
})
.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
return builder.create();
}
}
}