package com.aincc.seoulexcursion.ui.widget; import java.util.ArrayList; import java.util.List; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.util.Pair; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.aincc.seoulexcursion.R; import com.aincc.seoulexcursion.ui.Constants; import com.aincc.seoulexcursion.ui.control.OpenAdapter; import com.aincc.seoulexcursion.ui.widget.Navibar.NavibarStyle; import com.aincc.seoulexcursion.util.SeoulFont; /** * * <h3><b>Navisheet</b></h3></br> * * Navibar 에서 옵션기능 선택시 표시할 다이얼로그 * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ public class Navisheet extends Dialog implements android.view.View.OnClickListener { private ListView optionlistview1; private ListView optionlistview2; private ImageButton optionOk; private ImageButton optionCancel; private OptionSelected listener; private List<Pair<String, List<String>>> options; private int optionSelected1 = Constants.OPTION_INVALID_INDEX; private int optionSelected2 = Constants.OPTION_INVALID_INDEX; private boolean isCanceled = true; private WindowManager.LayoutParams param; private NavibarStyle style; /** * * @since 1.0.0 * @param context */ private Navisheet(Context context, NavibarStyle style, List<Pair<String, List<String>>> options, int optionSelected1, int optionSelected2, OptionSelected listener) { super(context); getWindow().setBackgroundDrawableResource(android.R.color.transparent); param = new WindowManager.LayoutParams(); param.copyFrom(getWindow().getAttributes()); param.width = WindowManager.LayoutParams.MATCH_PARENT; param.height = WindowManager.LayoutParams.MATCH_PARENT; param.gravity = Gravity.TOP; param.windowAnimations = R.style.option_dialog_animation; // param.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND; getWindow().setAttributes(param); View view = getLayoutInflater().inflate(R.layout.widget_navisheet, null); optionlistview1 = (ListView) view.findViewById(R.id.sheet_optionlist1); optionlistview2 = (ListView) view.findViewById(R.id.sheet_optionlist2); optionOk = (ImageButton) view.findViewById(R.id.sheet_ok); optionOk.setOnClickListener(this); optionCancel = (ImageButton) view.findViewById(R.id.sheet_cancel); optionCancel.setOnClickListener(this); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(view, param); this.listener = listener; this.options = options; this.style = style; switch (style) { case OPTION2: { setOption1(optionSelected1); setOption2(optionSelected2); optionlistview1.setSelection(optionSelected1); optionlistview2.setSelection(optionSelected2); } break; case OPTION1: { setOption1(optionSelected1); optionlistview1.setSelection(optionSelected1); optionlistview2.setVisibility(View.GONE); } break; default: break; } setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (!isCanceled && null != Navisheet.this.listener) { Navisheet.this.listener.OnOptionSelected(Navisheet.this.optionSelected1, Navisheet.this.optionSelected2); } } }); } /** * * @since 1.0.0 * @param optionSelected1 * @return */ private OptionAdapter setOption1(int optionSelected1) { this.optionSelected1 = optionSelected1; ArrayList<String> optionlist1 = new ArrayList<String>(); int size = options.size(); for (int ii = 0; ii < size; ii++) { optionlist1.add(options.get(ii).first); } OptionAdapter adapter = new OptionAdapter(getContext(), optionlist1, 1); optionlistview1.setAdapter(adapter); return adapter; } /** * * @since 1.0.0 * @param optionSelected2 * @return */ private OptionAdapter setOption2(int optionSelected2) { this.optionSelected2 = optionSelected2; ArrayList<String> optionlist2 = new ArrayList<String>(); int size = options.get(optionSelected1).second.size(); if (0 == size) { this.optionSelected2 = Constants.OPTION_INVALID_INDEX; } for (int ii = 0; ii < size; ii++) { optionlist2.add(options.get(optionSelected1).second.get(ii)); } OptionAdapter adapter = new OptionAdapter(getContext(), optionlist2, 2); optionlistview2.setAdapter(adapter); return adapter; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.sheet_ok: isCanceled = false; dismiss(); break; case R.id.sheet_cancel: isCanceled = true; cancel(); break; } } /** * * @since 1.0.0 * @param context * @param style * @param options * @param optionSelected1 * @param optionSelected2 * @param cancelable * @param cancelListener * @param listener * @return */ public static Navisheet show(Context context, NavibarStyle style, List<Pair<String, List<String>>> options, int optionSelected1, int optionSelected2, OptionSelected listener) { Navisheet dialog = new Navisheet(context, style, options, optionSelected1, optionSelected2, listener); dialog.setTitle(null); dialog.setCancelable(true); dialog.show(); return dialog; } /** * * <h3><b>OptionAdapter</b></h3></br> * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ class OptionAdapter extends OpenAdapter<String> { // 1, 2 int option; protected OptionAdapter(Context context, List<String> listData, int option) { super(context, listData); this.option = option; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder viewHolder = null; if (null == convertView) { LayoutInflater inflater = LayoutInflater.from(context); view = inflater.inflate(R.layout.cell_option, parent, false); viewHolder = new ViewHolder(); viewHolder.cellSelector = (LinearLayout) view.findViewById(R.id.cellSelector); viewHolder.name = (TextView) view.findViewById(R.id.name); viewHolder.name.setTypeface(SeoulFont.getInstance().getSeoulHangang()); viewHolder.check = (CheckBox) view.findViewById(R.id.selected); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } viewHolder.cellSelector.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (option) { case 1: optionSelected1 = position; switch (style) { case OPTION2: { setOption2(Constants.OPTION_START_INDEX).notifyDataSetChanged(); } break; default: break; } break; case 2: optionSelected2 = position; break; } notifyDataSetChanged(); } }); String name = listData.get(position); viewHolder.name.setText(name); switch (option) { case 1: viewHolder.check.setChecked(position == optionSelected1); break; case 2: viewHolder.check.setChecked(position == optionSelected2); break; } return view; } /** * * <h3><b>ViewHolder</b></h3></br> * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ class ViewHolder { LinearLayout cellSelector; TextView name; CheckBox check; } } /** * * <h3><b>OptionSelected</b></h3></br> * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ public interface OptionSelected { public void OnOptionSelected(int optionSelected1, int optionSelected2); } }