package nliveroid.nlr.main; import java.util.Iterator; import java.util.Map; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.ScrollView; import android.widget.TextView; public class TableWidthDialog extends DialogPreference { private NumberPicker np; private int beforNum; private boolean isPortLaytSetting; private String key; private Context context; public TableWidthDialog(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; //Attrの他の値を変える(追加)だけで、attrsの並びが変わる(不明)+nullのわけがないでOK? key = attrs.getAttributeValue(3); isPortLaytSetting = attrs.getAttributeValue(0).equals("0")? true:false; } public TableWidthDialog(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; key = attrs.getAttributeValue(3); isPortLaytSetting = attrs.getAttributeValue(0).equals("0")? true:false; } @Override protected View onCreateDialogView() { super.onCreateDialogView(); ScrollView sv = new ScrollView(context); try{ beforNum = Integer.parseInt(Details.getPref().getDetailMapValue(key)); }catch(NumberFormatException e){ e.printStackTrace(); TextView tv = new TextView(context); tv.setText("設定値の初期化に失敗"); sv.addView(tv); return sv; } np = new NumberPicker(this.getContext()); np.setRange(0, 100); np.setCurrent(beforNum); np.setClickable(true); np.setLongClickable(true); sv.addView(np); return sv; } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); Log.d("NLiveRoid"," CURRENT KEY " + key + " NUM " + np.getCurrent()); if(positiveResult){ int limitCount = 10; //値が増えたらその他の列に均等に分散する Map<String,Integer> wlist = null; if(isPortLaytSetting){ wlist = Details.getPref().getPWidthList(); }else{ wlist = Details.getPref().getLWidthList(); } //自分自身の値を更新 wlist.put(key, np.getCurrent()); double diff = (100-np.getCurrent()); // Log.d("log","DIFF A " + diff); int loop = 0; int ammount = 0; while(loop < limitCount){ wlist = calculateWidth(wlist,diff); //足して100前後10になるまで繰り返す Iterator<String> repeatKey = wlist.keySet().iterator(); while(repeatKey.hasNext()){ ammount += wlist.get(repeatKey.next()); } if(ammount>=95&&ammount<=105){ break; } loop ++; } //100に満たなかったらあまりを全てcommentに( 色を変えたときに右が白くなるのを防ぐ) if(ammount<100){ int reast = 100-ammount; if(isPortLaytSetting){ wlist.put("comment_width_p",wlist.get("comment_width_p")+reast); }else{ wlist.put("comment_width_l",wlist.get("comment_width_l")+reast); } } //設定値を保存 Iterator<String> it = wlist.keySet().iterator(); String listkey = ""; while(it.hasNext()){ listkey = it.next(); // Log.d("log","RESULT " + listkey + " val " + wlist.get(listkey)); Details.getPref().setPreferenceKeyValue(listkey, wlist.get(listkey)); if(isPortLaytSetting){ Details.getPref().updatePSummary(); }else{ Details.getPref().updateLSummary(); } } } } private Map<String,Integer> calculateWidth(Map<String,Integer> wlist,double diff){ // Log.d("log","Befor " + beforNum + " np " + np.getCurrent()); String nextKey = ""; Iterator<String> it = wlist.keySet().iterator(); while(it.hasNext()){ nextKey = it.next(); if(!nextKey.equals(key)){//このキー以外の要素に設定値と100との差から引いたあまりを求める diff -= wlist.get(nextKey); } } diff /= 5;//あまりとして足す値を平均化 // Log.d("log","DIFF " + diff); it = wlist.keySet().iterator(); while(it.hasNext()){ nextKey = it.next(); if(!nextKey.equals(key)){//このキー以外の要素に均等に足していく wlist.put(nextKey, (int) (wlist.get(nextKey)+diff)); if(wlist.get(nextKey)<0){ // Log.d("log","NEGATIVE " + nextKey + " val " +wlist.get(nextKey)); //マイナスになる時は0にしてマイナス値を平均化して足していって繰り返す wlist = negativeRecursive(wlist,wlist.keySet().iterator(),nextKey,wlist.get(nextKey)/5); } } // Log.d("log","KEY " + nextKey + " value " + wlist.get(nextKey)); } return wlist; } private Map<String,Integer> negativeRecursive(Map<String , Integer> wlist, Iterator<String> it,String myKey,double negative){ String nextKey = ""; wlist.put(myKey,0); while(it.hasNext()){ nextKey = it.next(); // Log.d("log"," NEG " + nextKey + " val " + wlist.get(nextKey) + " negative " + negative); if(!nextKey.equals(myKey)&&!nextKey.equals(key)){ wlist.put(nextKey,(int) (wlist.get(nextKey)+negative)); if(wlist.get(nextKey)<0){ // Log.d("log"," TIVE " + nextKey + " val " + wlist.get(nextKey) + " negative " + negative); wlist = negativeRecursive(wlist,wlist.keySet().iterator(),nextKey,wlist.get(nextKey)/5); } } } return wlist; } }