1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.filtershow.editors;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.graphics.Color;
22import android.graphics.drawable.GradientDrawable;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26import android.widget.Button;
27import android.widget.LinearLayout;
28import android.widget.SeekBar;
29import android.widget.TextView;
30
31import com.android.gallery3d.R;
32import com.android.gallery3d.filtershow.colorpicker.ColorCompareView;
33import com.android.gallery3d.filtershow.colorpicker.ColorHueView;
34import com.android.gallery3d.filtershow.colorpicker.ColorListener;
35import com.android.gallery3d.filtershow.colorpicker.ColorOpacityView;
36import com.android.gallery3d.filtershow.colorpicker.ColorSVRectView;
37import com.android.gallery3d.filtershow.controller.BasicParameterInt;
38import com.android.gallery3d.filtershow.controller.ParameterColor;
39import com.android.gallery3d.filtershow.filters.FilterColorBorderRepresentation;
40
41import java.util.Arrays;
42
43public class EditorColorBorderTabletUI {
44    private EditorColorBorder mEditorDraw;
45    private static int sIconDim = 120;
46    private int mSelectedColorButton;
47    private FilterColorBorderRepresentation mRep;
48    private Button[] mColorButton;
49    private ColorHueView mHueView;
50    private ColorSVRectView mSatValView;
51    private ColorOpacityView mOpacityView;
52    private ColorCompareView mColorCompareView;
53
54    private int[] mBasColors;
55    private int mSelected;
56    private int mTransparent;
57    private SeekBar mCBSizeSeekBar;
58    private SeekBar mCBCornerSizeSeekBar;
59    TextView mCBCornerSizeValue;
60    TextView mCBSizeValue;
61
62    private int[] ids = {
63            R.id.draw_color_button01,
64            R.id.draw_color_button02,
65            R.id.draw_color_button03,
66            R.id.draw_color_button04,
67            R.id.draw_color_button05,
68    };
69
70    public void setColorBorderRepresentation(FilterColorBorderRepresentation rep) {
71        mRep = rep;
72        BasicParameterInt size;
73        size = (BasicParameterInt) mRep.getParam(FilterColorBorderRepresentation.PARAM_SIZE);
74        mCBSizeSeekBar.setMax(size.getMaximum() - size.getMinimum());
75        mCBSizeSeekBar.setProgress(size.getValue());
76
77        BasicParameterInt radius;
78        radius = (BasicParameterInt) mRep.getParam(FilterColorBorderRepresentation.PARAM_RADIUS);
79        mCBCornerSizeSeekBar.setMax(radius.getMaximum() - radius.getMinimum());
80        mCBCornerSizeSeekBar.setProgress(radius.getValue());
81
82        ParameterColor color;
83        color = (ParameterColor) mRep.getParam(FilterColorBorderRepresentation.PARAM_COLOR);
84        mBasColors = color.getColorPalette();
85        color.setValue(mBasColors[mSelectedColorButton]);
86    }
87
88    public EditorColorBorderTabletUI(EditorColorBorder editorDraw, Context context, View base) {
89        mEditorDraw = editorDraw;
90        mBasColors = editorDraw.mBasColors;
91        LayoutInflater inflater =
92                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
93        LinearLayout lp = (LinearLayout) inflater.inflate(
94                R.layout.filtershow_color_border_ui, (ViewGroup) base, true);
95
96        Resources res = context.getResources();
97        sIconDim = res.getDimensionPixelSize(R.dimen.draw_style_icon_dim);
98        LinearLayout buttonContainer = (LinearLayout) lp.findViewById(R.id.listStyles);
99
100        mCBCornerSizeSeekBar = (SeekBar) lp.findViewById(R.id.colorBorderCornerSizeSeekBar);
101        mCBCornerSizeValue = (TextView) lp.findViewById(R.id.colorBorderCornerValue);
102        mCBSizeSeekBar = (SeekBar) lp.findViewById(R.id.colorBorderSizeSeekBar);
103
104        mCBSizeValue = (TextView) lp.findViewById(R.id.colorBorderSizeValue);
105        setupCBSizeSeekBar(lp);
106        setupCBCornerSizeSeekBar(lp);
107        setupColor(lp, res);
108    }
109
110    private void setupCBSizeSeekBar(LinearLayout lp) {
111        mCBSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
112            @Override
113            public void onStopTrackingTouch(SeekBar seekBar) {
114            }
115            @Override
116            public void onStartTrackingTouch(SeekBar seekBar) {
117            }
118            @Override
119            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
120                int type = FilterColorBorderRepresentation.PARAM_SIZE;
121                BasicParameterInt size = (BasicParameterInt) mRep.getParam(type);
122                size.setValue(progress + size.getMinimum());
123                mCBSizeValue.setText(Integer.toString(size.getValue()));
124                mEditorDraw.commitLocalRepresentation();
125            }
126        });
127
128    }
129
130    private void setupCBCornerSizeSeekBar(LinearLayout lp) {
131        mCBCornerSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
132            @Override
133            public void onStopTrackingTouch(SeekBar seekBar) {
134            }
135            @Override
136            public void onStartTrackingTouch(SeekBar seekBar) {
137            }
138            @Override
139            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
140                int type = FilterColorBorderRepresentation.PARAM_RADIUS;
141                BasicParameterInt size = (BasicParameterInt) mRep.getParam(type);
142                size.setValue(progress + size.getMinimum());
143                mCBCornerSizeValue.setText(size.getValue() + "");
144                mEditorDraw.commitLocalRepresentation();
145            }
146        });
147
148    }
149
150    private void setupColor(LinearLayout lp, Resources res) {
151        final LinearLayout ctls = (LinearLayout) lp.findViewById(R.id.controls);
152        final LinearLayout pick = (LinearLayout) lp.findViewById(R.id.colorPicker);
153        Button b = (Button) lp.findViewById(R.id.draw_color_popupbutton);
154        b.setOnClickListener(new View.OnClickListener() {
155
156            @Override
157            public void onClick(View view) {
158                boolean b = ctls.getVisibility() == View.VISIBLE;
159                ctls.setVisibility((b) ? View.GONE : View.VISIBLE);
160                pick.setVisibility((!b) ? View.GONE : View.VISIBLE);
161            }
162        }
163        );
164
165        mTransparent = res.getColor(R.color.color_chooser_unslected_border);
166        mSelected = res.getColor(R.color.color_chooser_slected_border);
167
168        mColorButton = new Button[ids.length];
169        for (int i = 0; i < ids.length; i++) {
170            mColorButton[i] = (Button) lp.findViewById(ids[i]);
171            float[] hsvo = new float[4];
172            Color.colorToHSV(mBasColors[i], hsvo);
173            hsvo[3] = (0xFF & (mBasColors[i] >> 24)) / (float) 255;
174            mColorButton[i].setTag(hsvo);
175            GradientDrawable sd = ((GradientDrawable) mColorButton[i].getBackground());
176            sd.setColor(mBasColors[i]);
177            sd.setStroke(3, (0 == i) ? mSelected : mTransparent);
178            final int buttonNo = i;
179            mColorButton[i].setOnClickListener(new View.OnClickListener() {
180                @Override
181                public void onClick(View arg0) {
182                    mSelectedColorButton = buttonNo;
183                    float[] hsvo = Arrays.copyOf((float[]) mColorButton[buttonNo].getTag(), 4);
184                    resetBorders();
185                    if (mRep == null) {
186                        return;
187                    }
188                    int type = FilterColorBorderRepresentation.PARAM_COLOR;
189                    ParameterColor pram = (ParameterColor) mRep.getParam(type);
190                    pram.setValue(mBasColors[mSelectedColorButton]);
191                    mEditorDraw.commitLocalRepresentation();
192                    mHueView.setColor(hsvo);
193                    mSatValView.setColor(hsvo);
194                    mOpacityView.setColor(hsvo);
195                    mColorCompareView.setOrigColor(hsvo);
196
197                }
198            });
199        }
200        mHueView = (ColorHueView) lp.findViewById(R.id.ColorHueView);
201        mSatValView = (ColorSVRectView) lp.findViewById(R.id.colorRectView);
202        mOpacityView = (ColorOpacityView) lp.findViewById(R.id.colorOpacityView);
203        mColorCompareView = (ColorCompareView) lp.findViewById(R.id.btnSelect);
204
205        float[] hsvo = new float[4];
206        Color.colorToHSV(mBasColors[0], hsvo);
207        hsvo[3] = (0xFF & (mBasColors[0] >> 24)) / (float) 255;
208        mColorCompareView.setOrigColor(hsvo);
209
210        ColorListener[] colorViews = {mHueView, mSatValView, mOpacityView, mColorCompareView};
211        for (int i = 0; i < colorViews.length; i++) {
212            colorViews[i].setColor(hsvo);
213            for (int j = 0; j < colorViews.length; j++) {
214                if (i == j) {
215                    continue;
216                }
217                colorViews[i].addColorListener(colorViews[j]);
218            }
219        }
220
221        ColorListener colorListener = new ColorListener() {
222            @Override
223            public void setColor(float[] hsvo) {
224                int color = Color.HSVToColor((int) (hsvo[3] * 255), hsvo);
225                Button b = mColorButton[mSelectedColorButton];
226                float[] f = (float[]) b.getTag();
227                System.arraycopy(hsvo, 0, f, 0, 4);
228                mBasColors[mSelectedColorButton] = color;
229                GradientDrawable sd = ((GradientDrawable) b.getBackground());
230                sd.setColor(color);
231                resetBorders();
232                ParameterColor pram;
233                pram = (ParameterColor) mRep.getParam(FilterColorBorderRepresentation.PARAM_COLOR);
234                pram.setValue(color);
235                mEditorDraw.commitLocalRepresentation();
236            }
237            @Override
238            public void addColorListener(ColorListener l) {
239            }
240        };
241
242        for (int i = 0; i < colorViews.length; i++) {
243            colorViews[i].addColorListener(colorListener);
244        }
245    }
246
247    private void resetBorders() {
248        for (int i = 0; i < ids.length; i++) {
249            final Button button = mColorButton[i];
250            GradientDrawable sd = ((GradientDrawable) button.getBackground());
251            sd.setColor(mBasColors[i]);
252            sd.setStroke(3, (mSelectedColorButton == i) ? mSelected : mTransparent);
253        }
254    }
255}
256