1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.launcher2;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.graphics.PointF;
22import android.graphics.Rect;
23import android.graphics.drawable.Drawable;
24import android.util.AttributeSet;
25import android.view.View;
26import android.widget.TextView;
27
28import com.android.launcher.R;
29
30
31/**
32 * Implements a DropTarget.
33 */
34public class ButtonDropTarget extends TextView implements DropTarget, DragController.DragListener {
35
36    protected final int mTransitionDuration;
37
38    protected Launcher mLauncher;
39    private int mBottomDragPadding;
40    protected TextView mText;
41    protected SearchDropTargetBar mSearchDropTargetBar;
42
43    /** Whether this drop target is active for the current drag */
44    protected boolean mActive;
45
46    /** The paint applied to the drag view on hover */
47    protected int mHoverColor = 0;
48
49    public ButtonDropTarget(Context context, AttributeSet attrs) {
50        this(context, attrs, 0);
51    }
52
53    public ButtonDropTarget(Context context, AttributeSet attrs, int defStyle) {
54        super(context, attrs, defStyle);
55
56        Resources r = getResources();
57        mTransitionDuration = r.getInteger(R.integer.config_dropTargetBgTransitionDuration);
58        mBottomDragPadding = r.getDimensionPixelSize(R.dimen.drop_target_drag_padding);
59    }
60
61    void setLauncher(Launcher launcher) {
62        mLauncher = launcher;
63    }
64
65    public boolean acceptDrop(DragObject d) {
66        return false;
67    }
68
69    public void setSearchDropTargetBar(SearchDropTargetBar searchDropTargetBar) {
70        mSearchDropTargetBar = searchDropTargetBar;
71    }
72
73    protected Drawable getCurrentDrawable() {
74        Drawable[] drawables = getCompoundDrawablesRelative();
75        for (int i = 0; i < drawables.length; ++i) {
76            if (drawables[i] != null) {
77                return drawables[i];
78            }
79        }
80        return null;
81    }
82
83    public void onDrop(DragObject d) {
84    }
85
86    public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
87        // Do nothing
88    }
89
90    public void onDragEnter(DragObject d) {
91        d.dragView.setColor(mHoverColor);
92    }
93
94    public void onDragOver(DragObject d) {
95        // Do nothing
96    }
97
98    public void onDragExit(DragObject d) {
99        d.dragView.setColor(0);
100    }
101
102    public void onDragStart(DragSource source, Object info, int dragAction) {
103        // Do nothing
104    }
105
106    public boolean isDropEnabled() {
107        return mActive;
108    }
109
110    public void onDragEnd() {
111        // Do nothing
112    }
113
114    @Override
115    public void getHitRect(android.graphics.Rect outRect) {
116        super.getHitRect(outRect);
117        outRect.bottom += mBottomDragPadding;
118    }
119
120    private boolean isRtl() {
121        return (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);
122    }
123
124    Rect getIconRect(int viewWidth, int viewHeight, int drawableWidth, int drawableHeight) {
125        DragLayer dragLayer = mLauncher.getDragLayer();
126
127        // Find the rect to animate to (the view is center aligned)
128        Rect to = new Rect();
129        dragLayer.getViewRectRelativeToSelf(this, to);
130
131        final int width = drawableWidth;
132        final int height = drawableHeight;
133
134        final int left;
135        final int right;
136
137        if (isRtl()) {
138            right = to.right - getPaddingRight();
139            left = right - width;
140        } else {
141            left = to.left + getPaddingLeft();
142            right = left + width;
143        }
144
145        final int top = to.top + (getMeasuredHeight() - height) / 2;
146        final int bottom = top +  height;
147
148        to.set(left, top, right, bottom);
149
150        // Center the destination rect about the trash icon
151        final int xOffset = (int) -(viewWidth - width) / 2;
152        final int yOffset = (int) -(viewHeight - height) / 2;
153        to.offset(xOffset, yOffset);
154
155        return to;
156    }
157
158    @Override
159    public DropTarget getDropTargetDelegate(DragObject d) {
160        return null;
161    }
162
163    public void getLocationInDragLayer(int[] loc) {
164        mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
165    }
166}
167