1package com.android.gallery3d.filtershow.controller;
2
3import android.app.ActionBar.LayoutParams;
4import android.content.Context;
5import android.content.res.Resources;
6import android.graphics.Color;
7import android.graphics.drawable.GradientDrawable;
8import android.view.LayoutInflater;
9import android.view.View;
10import android.view.ViewGroup;
11import android.widget.Button;
12import android.widget.LinearLayout;
13
14import com.android.gallery3d.R;
15import com.android.gallery3d.filtershow.colorpicker.ColorListener;
16import com.android.gallery3d.filtershow.colorpicker.ColorPickerDialog;
17import com.android.gallery3d.filtershow.editors.Editor;
18
19import java.util.Arrays;
20import java.util.Vector;
21
22public class ColorChooser implements Control {
23    private final String LOGTAG = "StyleChooser";
24    protected ParameterColor mParameter;
25    protected LinearLayout mLinearLayout;
26    protected Editor mEditor;
27    private View mTopView;
28    private Vector<Button> mIconButton = new Vector<Button>();
29    protected int mLayoutID = R.layout.filtershow_control_color_chooser;
30    Context mContext;
31    private int mTransparent;
32    private int mSelected;
33    private static final int OPACITY_OFFSET = 3;
34    private int[] mButtonsID = {
35            R.id.draw_color_button01,
36            R.id.draw_color_button02,
37            R.id.draw_color_button03,
38            R.id.draw_color_button04,
39            R.id.draw_color_button05,
40    };
41    private Button[] mButton = new Button[mButtonsID.length];
42
43    int mSelectedButton = 0;
44
45    @Override
46    public void setUp(ViewGroup container, Parameter parameter, Editor editor) {
47        container.removeAllViews();
48        Resources res = container.getContext().getResources();
49        mTransparent  = res.getColor(R.color.color_chooser_unslected_border);
50        mSelected    = res.getColor(R.color.color_chooser_slected_border);
51        mEditor = editor;
52        mContext = container.getContext();
53        int iconDim = res.getDimensionPixelSize(R.dimen.draw_style_icon_dim);
54        mParameter = (ParameterColor) parameter;
55        LayoutInflater inflater =
56                (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
57        mTopView = inflater.inflate(mLayoutID, container, true);
58        mLinearLayout = (LinearLayout) mTopView.findViewById(R.id.listStyles);
59        mTopView.setVisibility(View.VISIBLE);
60
61        mIconButton.clear();
62        LayoutParams lp = new LayoutParams(iconDim, iconDim);
63        int [] palette = mParameter.getColorPalette();
64        for (int i = 0; i < mButtonsID.length; i++) {
65            final Button button = (Button) mTopView.findViewById(mButtonsID[i]);
66            mButton[i] = button;
67            float[] hsvo = new float[4];
68            Color.colorToHSV(palette[i], hsvo);
69            hsvo[OPACITY_OFFSET] = (0xFF & (palette[i] >> 24)) / (float) 255;
70            button.setTag(hsvo);
71            GradientDrawable sd = ((GradientDrawable) button.getBackground());
72            sd.setColor(palette[i]);
73            sd.setStroke(3, (mSelectedButton == i) ? mSelected : mTransparent);
74
75            final int buttonNo = i;
76            button.setOnClickListener(new View.OnClickListener() {
77                @Override
78                public void onClick(View arg0) {
79                    selectColor(arg0, buttonNo);
80                }
81            });
82        }
83        Button button = (Button) mTopView.findViewById(R.id.draw_color_popupbutton);
84
85        button.setOnClickListener(new View.OnClickListener() {
86            @Override
87            public void onClick(View arg0) {
88                showColorPicker();
89            }
90        });
91
92    }
93
94    public void setColorSet(int[] basColors) {
95        int []palette = mParameter.getColorPalette();
96        for (int i = 0; i < palette.length; i++) {
97            palette[i] = basColors[i];
98            float[] hsvo = new float[4];
99            Color.colorToHSV(palette[i], hsvo);
100            hsvo[OPACITY_OFFSET] = (0xFF & (palette[i] >> 24)) / (float) 255;
101            mButton[i].setTag(hsvo);
102            GradientDrawable sd = ((GradientDrawable) mButton[i].getBackground());
103            sd.setColor(palette[i]);
104        }
105
106    }
107
108    public int[] getColorSet() {
109        return  mParameter.getColorPalette();
110    }
111
112    private void resetBorders() {
113        int []palette = mParameter.getColorPalette();
114        for (int i = 0; i < mButtonsID.length; i++) {
115            final Button button = mButton[i];
116            GradientDrawable sd = ((GradientDrawable) button.getBackground());
117            sd.setColor(palette[i]);
118            sd.setStroke(3, (mSelectedButton == i) ? mSelected : mTransparent);
119        }
120    }
121
122    public void selectColor(View button, int buttonNo) {
123        mSelectedButton = buttonNo;
124        float[] hsvo = (float[]) button.getTag();
125        mParameter.setValue(Color.HSVToColor((int) (hsvo[OPACITY_OFFSET] * 255), hsvo));
126        resetBorders();
127        mEditor.commitLocalRepresentation();
128    }
129
130    @Override
131    public View getTopView() {
132        return mTopView;
133    }
134
135    @Override
136    public void setPrameter(Parameter parameter) {
137        mParameter = (ParameterColor) parameter;
138        updateUI();
139    }
140
141    @Override
142    public void updateUI() {
143        if (mParameter == null) {
144            return;
145        }
146    }
147
148    public void changeSelectedColor(float[] hsvo) {
149        int []palette = mParameter.getColorPalette();
150        int c = Color.HSVToColor((int) (hsvo[3] * 255), hsvo);
151        final Button button = mButton[mSelectedButton];
152        GradientDrawable sd = ((GradientDrawable) button.getBackground());
153        sd.setColor(c);
154        palette[mSelectedButton] = c;
155        mParameter.setValue(Color.HSVToColor((int) (hsvo[OPACITY_OFFSET] * 255), hsvo));
156        button.setTag(hsvo);
157        mEditor.commitLocalRepresentation();
158        button.invalidate();
159    }
160
161    public void showColorPicker() {
162        ColorListener cl = new ColorListener() {
163            @Override
164            public void setColor(float[] hsvo) {
165                changeSelectedColor(hsvo);
166            }
167            @Override
168            public void addColorListener(ColorListener l) {
169            }
170        };
171        ColorPickerDialog cpd = new ColorPickerDialog(mContext, cl);
172        float[] c = (float[]) mButton[mSelectedButton].getTag();
173        cpd.setColor(Arrays.copyOf(c, 4));
174        cpd.setOrigColor(Arrays.copyOf(c, 4));
175        cpd.show();
176    }
177}
178