/* * Copyright (C) 2011 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.browser.view; import android.database.DataSetObserver; import android.graphics.Canvas; import android.view.MotionEvent; import android.view.View; import android.widget.Adapter; import java.util.ArrayList; /** * common code for pie views */ public abstract class BasePieView implements PieMenu.PieView { protected Adapter mAdapter; private DataSetObserver mObserver; protected ArrayList<View> mViews; protected OnLayoutListener mListener; protected int mCurrent; protected int mChildWidth; protected int mChildHeight; protected int mWidth; protected int mHeight; protected int mLeft; protected int mTop; public BasePieView() { } public void setLayoutListener(OnLayoutListener l) { mListener = l; } public void setAdapter(Adapter adapter) { mAdapter = adapter; if (adapter == null) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(mObserver); } mViews = null; mCurrent = -1; } else { mObserver = new DataSetObserver() { @Override public void onChanged() { buildViews(); } @Override public void onInvalidated() { mViews.clear(); } }; mAdapter.registerDataSetObserver(mObserver); setCurrent(0); } } public void setCurrent(int ix) { mCurrent = ix; } public Adapter getAdapter() { return mAdapter; } protected void buildViews() { if (mAdapter != null) { final int n = mAdapter.getCount(); if (mViews == null) { mViews = new ArrayList<View>(n); } else { mViews.clear(); } mChildWidth = 0; mChildHeight = 0; for (int i = 0; i < n; i++) { View view = mAdapter.getView(i, null, null); view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mChildWidth = Math.max(mChildWidth, view.getMeasuredWidth()); mChildHeight = Math.max(mChildHeight, view.getMeasuredHeight()); mViews.add(view); } } } /** * this will be called before the first draw call * needs to set top, left, width, height */ @Override public void layout(int anchorX, int anchorY, boolean left, float angle) { if (mListener != null) { mListener.onLayout(anchorX, anchorY, left); } } @Override public abstract void draw(Canvas canvas); protected void drawView(View view, Canvas canvas) { final int state = canvas.save(); canvas.translate(view.getLeft(), view.getTop()); view.draw(canvas); canvas.restoreToCount(state); } protected abstract int findChildAt(int y); @Override public boolean onTouchEvent(MotionEvent evt) { int action = evt.getActionMasked(); int evtx = (int) evt.getX(); int evty = (int) evt.getY(); if ((evtx < mLeft) || (evtx >= mLeft + mWidth) || (evty < mTop) || (evty >= mTop + mHeight)) { return false; } switch (action) { case MotionEvent.ACTION_MOVE: View v = mViews.get(mCurrent); setCurrent(Math.max(0, Math.min(mViews.size() -1, findChildAt(evty)))); View v1 = mViews.get(mCurrent); if (v != v1) { v.setPressed(false); v1.setPressed(true); } break; case MotionEvent.ACTION_UP: mViews.get(mCurrent).performClick(); mViews.get(mCurrent).setPressed(false); break; default: break; } return true; } }