package com.aincc.seoulexcursion.ui.widget; import java.util.List; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.aincc.seoulexcursion.R; import com.aincc.seoulexcursion.ui.Constants; import com.aincc.seoulexcursion.ui.widget.Navisheet.OptionSelected; /** * * <h3><b>Navibar</b></h3></br> * * 상단 네비게이션 바 * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 * @see widget_navibar.xml */ public class Navibar extends LinearLayout implements OnClickListener, OptionSelected { private Context context; /** * 뒤로가기 버튼 */ private ImageButton backBtn; /** * 기능 버튼 (기본 검색아이콘) */ private ImageButton funcBtn; /** * 제목 */ private TextView titleView; /** * 하단 구분선 */ @SuppressWarnings("unused") private View underline; /** * 옵션기능 레이아웃 */ private LinearLayout optionLayout; /** * 옵션기능1 */ private TextView option1; /** * 옵션기능2 */ private TextView option2; /** * 분리선 */ private ImageView divider; /** * 펼치기/접기 표시 */ private ImageView arrow; /** * 스타일 */ private NavibarStyle style; /** * 옵션 데이터 */ private List<Pair<String, List<String>>> options; /** * 옵션1 선택인덱스 */ private int optionSelected1; /** * 옵션2 선택인덱스 */ private int optionSelected2; /** * 옵션선택 리스너 */ private OptionSelected listener; /** * * @since 1.0.0 * @param context */ public Navibar(Context context) { super(context); initialize(context, null); } /** * * @since 1.0.0 * @param context * @param attrs */ public Navibar(Context context, AttributeSet attrs) { super(context, attrs); initialize(context, attrs); } /** * * @since 1.0.0 * @param context * @param attrs * @param defStyle */ public Navibar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(context, attrs); } /** * 초기화 * * @since 1.0.0 * @param context * @param attrs */ private void initialize(Context context, AttributeSet attrs) { this.context = context; LayoutInflater.from(context).inflate(R.layout.widget_navibar, this); backBtn = (ImageButton) findViewById(R.id.navibar_back); funcBtn = (ImageButton) findViewById(R.id.navibar_func); titleView = (TextView) findViewById(R.id.navibar_title); optionLayout = (LinearLayout) findViewById(R.id.navibar_option); optionLayout.setOnClickListener(this); option1 = (TextView) findViewById(R.id.navibar_option1); option2 = (TextView) findViewById(R.id.navibar_option2); divider = (ImageView) findViewById(R.id.navibar_divider); arrow = (ImageView) findViewById(R.id.navibar_arrow); underline = findViewById(R.id.navibar_underline); if (null != attrs) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.Navibar, 0, 0); int n = array.getIndexCount(); for (int i = 0; i < n; i++) { int attr = array.getIndex(i); switch (attr) { case R.styleable.Navibar_style: int style = array.getInt(attr, NavibarStyle.TITLE.getStyle()); setStyle(style); break; } } array.recycle(); } else { setStyle(NavibarStyle.TITLE.getStyle()); } } /** * * @since 1.0.0 * @param tf */ public void setTypeface(Typeface tf) { titleView.setTypeface(tf); option1.setTypeface(tf); option2.setTypeface(tf); } /** * 뒤로가기 버튼 클릭리스너 등록 * * @since 1.0.0 * @param l */ public void setActionBack(OnClickListener l) { backBtn.setOnClickListener(l); } /** * 기능 버튼 클릭리스너 등록 * * @since 1.0.0 * @param l */ public void setActionFunc(OnClickListener l) { funcBtn.setOnClickListener(l); } /** * 기능 버튼 이미지 등록 * * @since 1.0.0 * @param d */ public void setActionFuncIcon(Drawable d) { funcBtn.setImageDrawable(d); } /** * 네비게이션바 제목 설정 * * @since 1.0.0 * @param title */ public void setTitle(String title) { titleView.setText(title); } /** * 뒤로가기 버튼 표시 설정 * * @since 1.0.0 * @param visibility */ public void setActionBackVisible(int visibility) { backBtn.setVisibility(visibility); } /** * 기능 버튼 표시 설정 * * @since 1.0.0 * @param visibility */ public void setActionFuncVisible(int visibility) { funcBtn.setVisibility(visibility); } /** * 스타일 지정 * * @since 1.0.0 * @param style */ public void setStyle(int style) { switch (style) { case 0x01: optionLayout.setVisibility(VISIBLE); option1.setVisibility(VISIBLE); arrow.setVisibility(VISIBLE); option2.setVisibility(GONE); divider.setVisibility(GONE); titleView.setVisibility(GONE); this.style = NavibarStyle.OPTION1; break; case 0x02: optionLayout.setVisibility(VISIBLE); option1.setVisibility(VISIBLE); arrow.setVisibility(VISIBLE); option2.setVisibility(VISIBLE); divider.setVisibility(VISIBLE); titleView.setVisibility(GONE); this.style = NavibarStyle.OPTION2; break; default: case 0x00: optionLayout.setVisibility(GONE); titleView.setVisibility(VISIBLE); this.style = NavibarStyle.TITLE; break; } } /** * * @since 1.0.0 * @param listener */ public void setOptionListener(OptionSelected listener) { this.listener = listener; } /** * 옵션기능 문구 설정 * * @since 1.0.0 * @param optionStr1 * @param optionStr2 */ public void setOptionText(String optionStr1, String optionStr2) { if (null != optionStr1) { option1.setText(optionStr1); } if (null != optionStr2) { option2.setText(optionStr2); } } /** * 옵션기능 문구 설정 * * @since 1.0.0 * @param optionSelected1 * @param optionSelected2 */ public void setOptionText(int optionSelected1, int optionSelected2) { setOptionText(Constants.OPTION_INVALID_INDEX < optionSelected1 ? options.get(optionSelected1).first : "", Constants.OPTION_INVALID_INDEX < optionSelected2 ? options.get(optionSelected1).second.get(optionSelected2) : ""); } /** * 옵션 데이터 설정 * * @since 1.0.0 * @param options * @param optionSelected1 * @param optionSelected2 */ public void setOptionData(List<Pair<String, List<String>>> options, int optionSelected1, int optionSelected2) { this.options = options; this.optionSelected1 = optionSelected1; this.optionSelected2 = optionSelected2; setOptionText(Constants.OPTION_INVALID_INDEX < optionSelected1 ? options.get(optionSelected1).first : "", Constants.OPTION_INVALID_INDEX < optionSelected2 ? options.get(optionSelected1).second.get(optionSelected2) : ""); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.navibar_option: Navisheet.show(context, style, options, optionSelected1, NavibarStyle.OPTION1 == style ? Constants.OPTION_INVALID_INDEX : optionSelected2, this); break; } } @Override public void OnOptionSelected(int optionSelected1, int optionSelected2) { this.optionSelected1 = optionSelected1; this.optionSelected2 = optionSelected2; setOptionText(Constants.OPTION_INVALID_INDEX < optionSelected1 ? options.get(optionSelected1).first : "", Constants.OPTION_INVALID_INDEX < optionSelected2 ? options.get(optionSelected1).second.get(optionSelected2) : ""); if (null != listener) { listener.OnOptionSelected(optionSelected1, optionSelected2); } } /** * * <h3><b>NavibarStyle</b></h3></br> * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ public enum NavibarStyle { /** * 제목만.. */ TITLE(0x00), /** * 옵션기능1 */ OPTION1(0x01), /** * 옵션기능2 */ OPTION2(0x02); private int style; NavibarStyle(int style) { this.style = style; } public int getStyle() { return style; } } }