package com.algobase.share.dialog;

import java.util.List;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Handler;
import android.content.Context;

import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View.OnTouchListener;
import android.view.ContextThemeWrapper;

import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.StateListDrawable;
import android.graphics.drawable.shapes.RectShape;

import android.app.AlertDialog;

import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ListPopupWindow;
import android.widget.PopupWindow;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;

import android.content.Context;

import com.algobase.share.compat.*;


public class MyPopupMenu {
                                  
  public static int STYLE_TRADITIONAL   = 0;
  public static int STYLE_HOLO_DARK     = 1;
  public static int STYLE_HOLO_LIGHT    = 2;
  public static int STYLE_MATERIAL_DARK  = 3;
  public static int STYLE_MATERIAL_LIGHT = 4;

  public static int[] menu_styles = { 
                          StyleCompat.Theme_Traditional,
                          StyleCompat.Theme_Holo,
                          StyleCompat.Theme_Holo_Light,
                          StyleCompat.Theme_Material,
                          StyleCompat.Theme_Material_Light
                        };

  public static int def_style = STYLE_HOLO_LIGHT;

  public static void setStyle(int i) { def_style = i; }
  public static int getStyle() { return def_style; }

  public static int getBackgroundColor() {
    if (def_style == STYLE_HOLO_DARK || def_style == STYLE_MATERIAL_DARK)
      return 0xff333333;
    else
      return 0xffffffff;
  }

  public static int getTextColor() {
    if (def_style == STYLE_HOLO_DARK || def_style == STYLE_MATERIAL_DARK) 
      return 0xffdddddd;
    else
      return 0xff000000;
  }

  int style = def_style;

  int anim_style = 0;

  List<CharSequence> name_list;
  List<Integer> icon_list;
  List<Integer> id_list;
  List<Integer> clr_list;

  Context context;
  Handler handler;
  ListPopupWindow  popup;

  boolean auto_dismiss = true;

  View anchor;
  View selected_view;
  long selected_id;

  int width;
  int height;
  int h_offset;
  int v_offset;
  int textSize;
  int padding;

  int bg_clr = 0xffffffff;
  int txt_clr = 0xff000000;

  Drawable bg_drawable = null;

  ArrayAdapter<CharSequence> adapter = null;
  CharSequence[] items = null;


  public MyPopupMenu(Context ctxt)
  { context = new ContextThemeWrapper(ctxt,menu_styles[style]);
    handler = new Handler();

    name_list = new ArrayList<CharSequence>();
    icon_list = new ArrayList<Integer>();
    id_list   = new ArrayList<Integer>();
    clr_list  = new ArrayList<Integer>();

    width    = pix(200);
    height   = ListPopupWindow.WRAP_CONTENT;

    h_offset = 0;
    v_offset = 0;

    textSize = 18;
    padding  = pix(7);
    bg_clr = getBackgroundColor();
    txt_clr = getTextColor();
   }


  int pix(float dp)
  { float dpi = context.getResources().getDisplayMetrics().densityDpi;
    return (int)(0.5 + dp * (dpi/160f));
   }

  public void callMenuAction(View view, int pos, int id) {}
  public void dismissHandler() {}


  public View getSelectedView() { return selected_view; }
  public long getSelectedItemId() { return selected_id; }

  public void setTextSize(int sz) { textSize = sz; }
  public void setAutoDismiss(boolean b) { auto_dismiss = b; }
  public void setAnchorView(View v) { anchor = v; }
  public void setAnimationStyle(int s) { anim_style = s; }
  public void setHorizontalOffset(int x) { h_offset = x; }
  public void setVerticalOffset(int x) { v_offset = x; }

  public void setBackgroundDrawable(Drawable d) { bg_drawable = d; }

  public void setPadding(int p)  { padding = pix(p); }

  public void setBackgroundColor(int clr)  { bg_clr = clr; }
  public void setTextColor(int clr)  { txt_clr = clr; }

  public void setWidth(int w) { width = pix(w); }
  public void setHeight(int h) { 
      height = (h == 0) ? ListPopupWindow.WRAP_CONTENT : pix(h);
  }

  public void add(CharSequence name, int icon, int id)
  { name_list.add(name);
    icon_list.add(icon);
    id_list.add(id);
    clr_list.add(txt_clr);
   }

  public void add(CharSequence name, int icon, int clr,int id)
  { name_list.add(name);
    icon_list.add(icon);
    clr_list.add(clr);
    id_list.add(id);
   }

 public int getSize() { return name_list.size(); }

 public String getName(int i) { return name_list.get(i).toString(); }
 public int    getIcon(int i) { return icon_list.get(i); }
 public int    getId(int i)   { return id_list.get(i); }


  public void finish()
  {
    if (adapter != null) return;

    items =  name_list.toArray(new CharSequence[0]);
                      
    adapter = 
     new ArrayAdapter<CharSequence>(context,0,items)
        { @Override
          public View getView(final int pos, View view, ViewGroup parent)
          { 
            final LinearLayout line = new LinearLayout(context);
            line.setPadding(padding,padding,padding,padding);

            line.setBackgroundColor(bg_clr);

            line.setGravity(Gravity.CENTER_VERTICAL);

            int res = icon_list.get(pos);
            int clr = clr_list.get(pos);

            if (res != 0)
            { ImageView iv = new ImageView(context);
              iv.setImageResource(res);
              line.addView(iv);
              ((LayoutParams)iv.getLayoutParams()).rightMargin = pix(12);
             }

            final TextView tv  = new TextView(context);
            tv.setTextSize(textSize);
            tv.setSingleLine(true);
            tv.setTextColor(clr);
            tv.setText(items[pos]);

            line.addView(tv);
            tv.getLayoutParams().width = -1;

            line.setOnTouchListener(new OnTouchListener() {
              @Override
              public boolean onTouch(final View v, MotionEvent event) {
                 if (event.getAction() == MotionEvent.ACTION_DOWN)
                 { 
                   v.setBackgroundColor(0xffdddddd);
                   tv.setTextColor(0xff000000);

                   TimerTask task = new TimerTask() {
                    public void run() { 
                      handler.post(new Runnable() {
                        public void run() { v.setBackgroundColor(bg_clr); }
                      });
                    }
                   };

                  new Timer().schedule(task,1000);
                 }
                 return false;
              }
            });

            return line;
           }
         };

         popup = new ListPopupWindow(context) {
/*
          @Override
          protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
          { 
            int height = MeasureSpec.makeMeasureSpec(300,MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec,height);               
           }
*/
         };

         popup.setAdapter(adapter);
         popup.setModal(true);

         popup.setWidth(width);
         popup.setHeight(height);


         popup.setAnchorView(anchor);
         popup.setHorizontalOffset(h_offset);
         popup.setVerticalOffset(v_offset);

         if (bg_drawable != null) popup.setBackgroundDrawable(bg_drawable);

         if (anim_style != 0) popup.setAnimationStyle(anim_style);

         popup.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
               public void onItemClick(AdapterView<?> parent, View view, 
                                                              int p, long id)
               { if (auto_dismiss) popup.dismiss();
                 selected_id = id;
                 selected_view = view;
                 callMenuAction(view, p, id_list.get(p));
                }
            });

         popup.setOnDismissListener( new PopupWindow.OnDismissListener() {
              @Override
              public void onDismiss() { dismissHandler(); }
         });
       

     }



     public void show(int h_off, int v_off,int anim_style) 
     { finish(); 
       if (h_off != 0) popup.setHorizontalOffset(h_off);
       if (v_off != 0) popup.setVerticalOffset(v_off);
       if (anim_style != 0) popup.setAnimationStyle(anim_style);
       popup.show(); 
     }

     public void show(int h_off, int v_off) { show(h_off,v_off,0); }

     public void show(int anim_style) { show(0,0,anim_style); }

     public void show() { show(0,0,0); } 


     public void dismiss(int anim_style) 
     { popup.setAnimationStyle(anim_style);
       popup.dismiss(); 
      }

     public void dismiss() { popup.dismiss(); }
    
}
