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.app.ActionBar;
20import android.content.Context;
21import android.content.res.Resources;
22import android.graphics.Bitmap;
23import android.graphics.BitmapFactory;
24import android.graphics.Color;
25import android.graphics.drawable.GradientDrawable;
26import android.view.View;
27import android.widget.Button;
28import android.widget.ImageButton;
29import android.widget.ImageView;
30import android.widget.LinearLayout;
31import android.widget.SeekBar;
32import android.widget.TextView;
33
34import com.android.gallery3d.R;
35import com.android.gallery3d.filtershow.colorpicker.ColorCompareView;
36import com.android.gallery3d.filtershow.colorpicker.ColorHueView;
37import com.android.gallery3d.filtershow.colorpicker.ColorListener;
38import com.android.gallery3d.filtershow.colorpicker.ColorOpacityView;
39import com.android.gallery3d.filtershow.colorpicker.ColorSVRectView;
40import com.android.gallery3d.filtershow.controller.BasicParameterInt;
41import com.android.gallery3d.filtershow.controller.BasicParameterStyle;
42import com.android.gallery3d.filtershow.controller.ParameterColor;
43import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
44
45import java.util.Arrays;
46
47public class EditorDrawTabletUI {
48    private EditorDraw mEditorDraw;
49    private int[] mBrushIcons;
50    private static int sIconDim = 120;
51    private int mSelectedColorButton;
52    private int mSelectedStyleButton;
53    private FilterDrawRepresentation mRep;
54    private Button[] mColorButton;
55    private ImageButton[] mStyleButton;
56    private ColorHueView mHueView;
57    private ColorSVRectView mSatValView;
58    private ColorOpacityView mOpacityView;
59    private ColorCompareView mColorCompareView;
60    private TextView mDrawSizeValue;
61
62    private int[] mBasColors;
63    private int mSelected;
64    private int mTransparent;
65    private SeekBar mdrawSizeSeekBar;
66    private int[] ids = {
67            R.id.draw_color_button01,
68            R.id.draw_color_button02,
69            R.id.draw_color_button03,
70            R.id.draw_color_button04,
71            R.id.draw_color_button05,
72    };
73
74    public void setDrawRepresentation(FilterDrawRepresentation rep) {
75        mRep = rep;
76        BasicParameterInt size;
77        size = (BasicParameterInt) mRep.getParam(FilterDrawRepresentation.PARAM_SIZE);
78        mdrawSizeSeekBar.setMax(size.getMaximum() - size.getMinimum());
79        mdrawSizeSeekBar.setProgress(size.getValue());
80
81        ParameterColor color;
82        color = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
83        color.setValue(mBasColors[mSelectedColorButton]);
84        BasicParameterStyle style;
85        style = (BasicParameterStyle) mRep.getParam(FilterDrawRepresentation.PARAM_STYLE);
86        style.setSelected(mSelectedStyleButton);
87    }
88
89    public EditorDrawTabletUI(EditorDraw editorDraw, Context context, LinearLayout lp) {
90        mEditorDraw = editorDraw;
91        mBasColors = editorDraw.mBasColors;
92        mBrushIcons = editorDraw.brushIcons;
93        Resources res = context.getResources();
94        sIconDim = res.getDimensionPixelSize(R.dimen.draw_style_icon_dim);
95        LinearLayout buttonContainer = (LinearLayout) lp.findViewById(R.id.listStyles);
96
97        mdrawSizeSeekBar = (SeekBar) lp.findViewById(R.id.drawSizeSeekBar);
98        mDrawSizeValue = (TextView) lp.findViewById(R.id.drawSizeValue);
99
100        Button clearButton = (Button) lp.findViewById(R.id.clearButton);
101        clearButton.setOnClickListener(new View.OnClickListener() {
102            @Override
103            public void onClick(View view) {
104                mEditorDraw.clearDrawing();
105            }
106        });
107
108        mdrawSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
109
110            @Override
111            public void onStopTrackingTouch(SeekBar seekBar) {
112            }
113
114            @Override
115            public void onStartTrackingTouch(SeekBar seekBar) {
116            }
117
118            @Override
119            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
120                BasicParameterInt size;
121                size = (BasicParameterInt) mRep.getParam(FilterDrawRepresentation.PARAM_SIZE);
122                size.setValue(progress + size.getMinimum());
123                mEditorDraw.commitLocalRepresentation();
124                int val  = progress + size.getMinimum();
125                mDrawSizeValue.setText(((val>0)?"+":"")+val);
126            }
127        });
128
129        ActionBar.LayoutParams params = new ActionBar.LayoutParams(sIconDim, sIconDim);
130        mStyleButton = new ImageButton[mBrushIcons.length];
131        for (int i = 0; i < mBrushIcons.length; i++) {
132            final ImageButton button = new ImageButton(context);
133            mStyleButton[i] = button;
134            button.setScaleType(ImageView.ScaleType.CENTER_CROP);
135            button.setLayoutParams(params);
136            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), mBrushIcons[i]);
137            button.setImageBitmap(bitmap);
138            button.setBackgroundResource(android.R.color.transparent);
139            buttonContainer.addView(button);
140            final int current = i;
141            button.setOnClickListener(new View.OnClickListener() {
142                @Override
143                public void onClick(View view) {
144                    mSelectedStyleButton = current;
145                    if (mRep == null) {
146                        return;
147                    }
148                    BasicParameterStyle style = (BasicParameterStyle)
149                            mRep.getParam(FilterDrawRepresentation.PARAM_STYLE);
150                    style.setSelected(current);
151                    resetStyle();
152                    mEditorDraw.commitLocalRepresentation();
153                }
154            });
155        }
156
157        final LinearLayout ctls = (LinearLayout) lp.findViewById(R.id.controls);
158        final LinearLayout pick = (LinearLayout) lp.findViewById(R.id.colorPicker);
159        Button b = (Button) lp.findViewById(R.id.draw_color_popupbutton);
160        b.setOnClickListener(new View.OnClickListener() {
161            @Override
162            public void onClick(View view) {
163                boolean b = ctls.getVisibility() == View.VISIBLE;
164                ctls.setVisibility((b) ? View.GONE : View.VISIBLE);
165                pick.setVisibility((!b) ? View.GONE : View.VISIBLE);
166            }
167        }
168        );
169
170        mTransparent = res.getColor(R.color.color_chooser_unslected_border);
171        mSelected = res.getColor(R.color.color_chooser_slected_border);
172
173        mColorButton = new Button[ids.length];
174        for (int i = 0; i < ids.length; i++) {
175            mColorButton[i] = (Button) lp.findViewById(ids[i]);
176
177            float[] hsvo = new float[4];
178            Color.colorToHSV(mBasColors[i], hsvo);
179            hsvo[3] = (0xFF & (mBasColors[i] >> 24)) / (float) 255;
180            mColorButton[i].setTag(hsvo);
181            GradientDrawable sd = ((GradientDrawable) mColorButton[i].getBackground());
182
183            sd.setColor(mBasColors[i]);
184            sd.setStroke(3, (0 == i) ? mSelected : mTransparent);
185
186            final int buttonNo = i;
187            mColorButton[i].setOnClickListener(new View.OnClickListener() {
188                @Override
189                public void onClick(View arg0) {
190
191                    mSelectedColorButton = buttonNo;
192                    float[] hsvo = Arrays.copyOf((float[]) mColorButton[buttonNo].getTag(), 4);
193                    resetBorders();
194                    if (mRep == null) {
195                        return;
196                    }
197                    ParameterColor pram;
198                    pram = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
199                    pram.setValue(mBasColors[mSelectedColorButton]);
200                    mEditorDraw.commitLocalRepresentation();
201                    mHueView.setColor(hsvo);
202                    mSatValView.setColor(hsvo);
203                    mOpacityView.setColor(hsvo);
204                    mColorCompareView.setColor(hsvo);
205                    mColorCompareView.setOrigColor(hsvo);
206                }
207            });
208        }
209
210        mHueView = (ColorHueView) lp.findViewById(R.id.ColorHueView);
211        mSatValView = (ColorSVRectView) lp.findViewById(R.id.colorRectView);
212        mOpacityView = (ColorOpacityView) lp.findViewById(R.id.colorOpacityView);
213        mColorCompareView = (ColorCompareView) lp.findViewById(R.id.btnSelect);
214
215        float[] hsvo = new float[4];
216        Color.colorToHSV(mBasColors[0], hsvo);
217        hsvo[3] = (0xFF & (mBasColors[0] >> 24)) / (float) 255;
218
219        mColorCompareView.setOrigColor(hsvo);
220        ColorListener[] colorViews = {mHueView, mSatValView, mOpacityView, mColorCompareView};
221        for (int i = 0; i < colorViews.length; i++) {
222            colorViews[i].setColor(hsvo);
223
224            for (int j = 0; j < colorViews.length; j++) {
225                if (i == j) {
226                    continue;
227                }
228                colorViews[i].addColorListener(colorViews[j]);
229            }
230        }
231        ColorListener colorListener = new ColorListener() {
232
233            @Override
234            public void setColor(float[] hsvo) {
235                int color = Color.HSVToColor((int) (hsvo[3] * 255), hsvo);
236                Button b = mColorButton[mSelectedColorButton];
237                float[] f = (float[]) b.getTag();
238                System.arraycopy(hsvo, 0, f, 0, 4);
239                mBasColors[mSelectedColorButton] = color;
240                GradientDrawable sd = ((GradientDrawable) b.getBackground());
241                sd.setColor(color);
242                resetBorders();
243                ParameterColor pram;
244                pram = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
245                pram.setValue(color);
246                mEditorDraw.commitLocalRepresentation();
247            }
248
249            @Override
250            public void addColorListener(ColorListener l) {
251            }
252        };
253
254        for (int i = 0; i < colorViews.length; i++) {
255            colorViews[i].addColorListener(colorListener);
256        }
257
258    }
259
260    public void resetStyle() {
261        for (int i = 0; i < mStyleButton.length; i++) {
262            int rid = (i == mSelectedStyleButton) ? android.R.color.holo_blue_light :
263                    android.R.color.transparent;
264            mStyleButton[i].setBackgroundResource(rid);
265
266        }
267    }
268
269    private void resetBorders() {
270        for (int i = 0; i < ids.length; i++) {
271            final Button button = mColorButton[i];
272
273            GradientDrawable sd = ((GradientDrawable) button.getBackground());
274            sd.setColor(mBasColors[i]);
275            sd.setStroke(3, (mSelectedColorButton == i) ? mSelected : mTransparent);
276        }
277    }
278}
279