1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Rect;
21a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millarimport android.util.TypedValue;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas;
24a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.NinePatchTexture;
25a4eae1abb4f2547dfbda84301ee764ce35464881John Reck
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ScrollBarView extends GLView {
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "ScrollBarView";
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mBarHeight;
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mGripHeight;
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mGripPosition;  // left side of the grip
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mGripWidth;     // zero if the grip is disabled
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mGivenGripWidth;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mContentPosition;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mContentTotal;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private NinePatchTexture mScrollBarTexture;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ScrollBarView(Context context, int gripHeight, int gripWidth) {
43a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar        TypedValue outValue = new TypedValue();
44a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar        context.getTheme().resolveAttribute(
45a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar                android.R.attr.scrollbarThumbHorizontal, outValue, true);
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mScrollBarTexture = new NinePatchTexture(
47a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar                context, outValue.resourceId);
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGripPosition = 0;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGripWidth = 0;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGivenGripWidth = gripWidth;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGripHeight = gripHeight;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onLayout(
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            boolean changed, int left, int top, int right, int bottom) {
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!changed) return;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mBarHeight = bottom - top;
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // The content position is between 0 to "total". The current position is
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // in "position".
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setContentPosition(int position, int total) {
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (position == mContentPosition && total == mContentTotal) {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        invalidate();
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mContentPosition = position;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mContentTotal = total;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // If the grip cannot move, don't draw it.
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mContentTotal <= 0) {
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGripPosition = 0;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGripWidth = 0;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // Map from the content range to scroll bar range.
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        //
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // mContentTotal --> getWidth() - mGripWidth
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // mContentPosition --> mGripPosition
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGripWidth = mGivenGripWidth;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        float r = (getWidth() - mGripWidth) / (float) mContentTotal;
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGripPosition = Math.round(r * mContentPosition);
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void render(GLCanvas canvas) {
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.render(canvas);
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGripWidth == 0) return;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Rect b = bounds();
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int y = (mBarHeight - mGripHeight) / 2;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mScrollBarTexture.draw(canvas, mGripPosition, y, mGripWidth, mGripHeight);
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
98