1eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb/*
2eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Copyright (C) 2011 The Android Open Source Project
3eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb *
4eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
5eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * you may not use this file except in compliance with the License.
6eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * You may obtain a copy of the License at
7eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb *
8eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
9eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb *
10eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * Unless required by applicable law or agreed to in writing, software
11eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
12eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * See the License for the specific language governing permissions and
14eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * limitations under the License.
15eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb */
16eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
17eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbpackage com.android.browser.view;
18eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
19eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport com.android.browser.R;
20eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
21eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.content.Context;
22eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.graphics.Canvas;
23eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbimport android.view.View;
24eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
25eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb/**
26eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb * shows views in a stack
27eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb */
28eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolbpublic class PieStackView extends BasePieView {
29eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
30eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    private static final int SLOP = 5;
31eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
32eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    private OnCurrentListener mCurrentListener;
33eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    private int mMinHeight;
34eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
35eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    public interface OnCurrentListener {
36eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        public void onSetCurrent(int index);
37eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
38eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
39eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    public PieStackView(Context ctx) {
40eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mMinHeight = (int) ctx.getResources()
41eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                .getDimension(R.dimen.qc_tab_title_height);
42eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
43eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
44eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    public void setOnCurrentListener(OnCurrentListener l) {
45eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mCurrentListener = l;
46eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
47eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
48eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    @Override
49eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    public void setCurrent(int ix) {
50eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        super.setCurrent(ix);
51eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        if (mCurrentListener != null) {
52eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            mCurrentListener.onSetCurrent(ix);
53eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        }
54eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
55eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
56eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    /**
57eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb     * this will be called before the first draw call
58eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb     */
59eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    @Override
60a4befac241ec69791fd30e11355ed3dc10d7fb37Michael Kolb    public void layout(int anchorX, int anchorY, boolean left, float angle,
61a4befac241ec69791fd30e11355ed3dc10d7fb37Michael Kolb            int pHeight) {
62a4befac241ec69791fd30e11355ed3dc10d7fb37Michael Kolb        super.layout(anchorX, anchorY, left, angle, pHeight);
63eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        buildViews();
64eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mWidth = mChildWidth;
65eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mHeight = mChildHeight + (mViews.size() - 1) * mMinHeight;
66eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mLeft = anchorX + (left ? SLOP : -(SLOP + mChildWidth));
67eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        mTop = anchorY - mHeight / 2;
68eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        if (mViews != null) {
69eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            layoutChildrenLinear();
70eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        }
71eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
72eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
73eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    private void layoutChildrenLinear() {
74eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        final int n = mViews.size();
75eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        int top = mTop;
76eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        int dy = (n == 1) ? 0 : (mHeight - mChildHeight) / (n - 1);
77eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        for (View view : mViews) {
78565752e1025129ad16c030ceca9dee7a695ed73eMichael Kolb            int x = mLeft;
79565752e1025129ad16c030ceca9dee7a695ed73eMichael Kolb            view.layout(x, top, x + mChildWidth, top + mChildHeight);
80eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            top += dy;
81eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        }
82eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
83eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
84eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    @Override
85eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    public void draw(Canvas canvas) {
863241d1bd47d95e2c99168a70544c44af6287bc9eMichael Kolb        if ((mViews != null) && (mCurrent > -1)) {
87eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            final int n = mViews.size();
88eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            for (int i = 0; i < mCurrent; i++) {
89eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                drawView(mViews.get(i), canvas);
90eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            }
91eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            for (int i = n - 1; i > mCurrent; i--) {
92eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                drawView(mViews.get(i), canvas);
93eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            }
94eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            drawView(mViews.get(mCurrent), canvas);
95eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        }
96eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
97eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
98eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    @Override
99eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    protected int findChildAt(int y) {
100eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        final int ix = (y - mTop) * mViews.size() / mHeight;
101eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb        return ix;
102eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb    }
103eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb
104eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb}
105