UndoBarView.java revision 6b891c6a3739f8c49d42f9db6fc76cb92c7c5f25
16b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang/*
26b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Copyright (C) 2012 The Android Open Source Project
36b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang *
46b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
56b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * you may not use this file except in compliance with the License.
66b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * You may obtain a copy of the License at
76b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang *
86b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
96b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang *
106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * See the License for the specific language governing permissions and
146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang * limitations under the License.
156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang */
166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changpackage com.android.gallery3d.ui;
186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport android.content.Context;
206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport android.view.MotionEvent;
216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.R;
236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.util.GalleryUtils;
246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changpublic class UndoBarView extends GLView {
266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private static final String TAG = "UndoBarView";
276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private static final int WHITE = 0xFFFFFFFF;
296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private static final int GRAY = 0xFFAAAAAA;
306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
316b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final NinePatchTexture mPanel;
326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final StringTexture mUndoText;
336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final StringTexture mDeletedText;
346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final ResourceTexture mUndoIcon;
356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mBarHeight;
366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mBarMargin;
376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mUndoTextMargin;
386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mIconSize;
396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mIconMargin;
406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mSeparatorTopMargin;
416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mSeparatorBottomMargin;
426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mSeparatorRightMargin;
436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mSeparatorWidth;
446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mDeletedTextMargin;
456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private final int mClickRegion;
466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private OnClickListener mOnClickListener;
486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDownOnButton;
496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // This is the layout of UndoBarView. The unit is dp.
516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //    +-+----+----------------+-+--+----+-+------+--+-+
536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // 48 | |    | Deleted        | |  | <- | | UNDO |  | |
546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //    +-+----+----------------+-+--+----+-+------+--+-+
556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //     4  16                   1 12  32  8        16 4
566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public UndoBarView(Context context) {
576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mBarHeight = (int) GalleryUtils.dpToPixel(48);
586b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mBarMargin = (int) GalleryUtils.dpToPixel(4);
596b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mUndoTextMargin = (int) GalleryUtils.dpToPixel(16);
606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mIconMargin = (int) GalleryUtils.dpToPixel(8);
616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mIconSize = (int) GalleryUtils.dpToPixel(32);
626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSeparatorRightMargin = (int) GalleryUtils.dpToPixel(12);
636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSeparatorTopMargin = (int) GalleryUtils.dpToPixel(10);
646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSeparatorBottomMargin = (int) GalleryUtils.dpToPixel(10);
656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSeparatorWidth = (int) GalleryUtils.dpToPixel(1);
666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletedTextMargin = (int) GalleryUtils.dpToPixel(16);
676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mPanel = new NinePatchTexture(context, R.drawable.panel_undo_holo);
696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mUndoText = StringTexture.newInstance(context.getString(R.string.undo),
706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                GalleryUtils.dpToPixel(12), GRAY, 0, true);
716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletedText = StringTexture.newInstance(
726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                context.getString(R.string.deleted),
736b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                GalleryUtils.dpToPixel(16), WHITE);
746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mUndoIcon = new ResourceTexture(
756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                context, R.drawable.ic_menu_revert_holo_dark);
766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mClickRegion = mBarMargin + mUndoTextMargin + mUndoText.getWidth()
776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                + mIconMargin + mIconSize + mSeparatorRightMargin;
786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void setOnClickListener(OnClickListener listener) {
816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mOnClickListener = listener;
826b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
836b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
856b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    protected void onMeasure(int widthSpec, int heightSpec) {
866b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        setMeasuredSize(0 /* unused */, mBarHeight);
876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    protected void render(GLCanvas canvas) {
916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        super.render(canvas);
926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int w = getWidth();
936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int h = getHeight();
946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mPanel.draw(canvas, mBarMargin, 0, w - mBarMargin * 2, mBarHeight);
956b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int x = w - mBarMargin;
976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int y;
986b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
996b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        x -= mUndoTextMargin + mUndoText.getWidth();
1006b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        y = (mBarHeight - mUndoText.getHeight()) / 2;
1016b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mUndoText.draw(canvas, x, y);
1026b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1036b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        x -= mIconMargin + mIconSize;
1046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        y = (mBarHeight - mIconSize) / 2;
1056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mUndoIcon.draw(canvas, x, y, mIconSize, mIconSize);
1066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1076b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        x -= mSeparatorRightMargin + mSeparatorWidth;
1086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        y = mSeparatorTopMargin;
1096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        canvas.fillRect(x, y, mSeparatorWidth,
1106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                mBarHeight - mSeparatorTopMargin - mSeparatorBottomMargin, GRAY);
1116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        x = mBarMargin + mDeletedTextMargin;
1136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        y = (mBarHeight - mDeletedText.getHeight()) / 2;
1146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletedText.draw(canvas, x, y);
1156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
1166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
1186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    protected boolean onTouch(MotionEvent event) {
1196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        switch (event.getAction()) {
1206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            case MotionEvent.ACTION_DOWN:
1216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                mDownOnButton = inUndoButton(event);
1226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                break;
1236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            case MotionEvent.ACTION_UP:
1246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                if (mDownOnButton) {
1256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    if (mOnClickListener != null && inUndoButton(event)) {
1266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                        mOnClickListener.onClick(this);
1276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    }
1286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    mDownOnButton = false;
1296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                }
1306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                break;
1316b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            case MotionEvent.ACTION_CANCEL:
1326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                mDownOnButton = false;
1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                break;
1346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        }
1356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        return true;
1366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
1376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // Check if the event is on the right of the separator
1396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean inUndoButton(MotionEvent event) {
1406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        float x = event.getX();
1416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        float y = event.getY();
1426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int w = getWidth();
1436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        int h = getHeight();
1446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        return (x >= w - mClickRegion && x < w && y >= 0 && y < h);
1456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
1466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang}
147