/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.gallery3d.ui;

import android.content.Context;
import android.graphics.Rect;
import android.util.TypedValue;

public class ScrollBarView extends GLView {
    @SuppressWarnings("unused")
    private static final String TAG = "ScrollBarView";

    private int mBarHeight;

    private int mGripHeight;
    private int mGripPosition;  // left side of the grip
    private int mGripWidth;     // zero if the grip is disabled
    private int mGivenGripWidth;

    private int mContentPosition;
    private int mContentTotal;

    private NinePatchTexture mScrollBarTexture;

    public ScrollBarView(Context context, int gripHeight, int gripWidth) {
        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute(
                android.R.attr.scrollbarThumbHorizontal, outValue, true);
        mScrollBarTexture = new NinePatchTexture(
                context, outValue.resourceId);
        mGripPosition = 0;
        mGripWidth = 0;
        mGivenGripWidth = gripWidth;
        mGripHeight = gripHeight;
    }

    @Override
    protected void onLayout(
            boolean changed, int left, int top, int right, int bottom) {
        if (!changed) return;
        mBarHeight = bottom - top;
    }

    // The content position is between 0 to "total". The current position is
    // in "position".
    public void setContentPosition(int position, int total) {
        if (position == mContentPosition && total == mContentTotal) {
            return;
        }

        invalidate();

        mContentPosition = position;
        mContentTotal = total;

        // If the grip cannot move, don't draw it.
        if (mContentTotal <= 0) {
            mGripPosition = 0;
            mGripWidth = 0;
            return;
        }

        // Map from the content range to scroll bar range.
        //
        // mContentTotal --> getWidth() - mGripWidth
        // mContentPosition --> mGripPosition
        mGripWidth = mGivenGripWidth;
        float r = (getWidth() - mGripWidth) / (float) mContentTotal;
        mGripPosition = Math.round(r * mContentPosition);
    }

    @Override
    protected void render(GLCanvas canvas) {
        super.render(canvas);
        if (mGripWidth == 0) return;
        Rect b = bounds();
        int y = (mBarHeight - mGripHeight) / 2;
        mScrollBarTexture.draw(canvas, mGripPosition, y, mGripWidth, mGripHeight);
    }
}
