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.graphics.Rect;
21import android.view.View;
22import android.view.ViewGroup;
23
24/**
25 * An abstraction of the original CellLayout which supports laying out items
26 * which span multiple cells into a grid-like layout.  Also supports dimming
27 * to give a preview of its contents.
28 */
29public class PagedViewCellLayoutChildren extends ViewGroup {
30    static final String TAG = "PagedViewCellLayout";
31
32    private boolean mCenterContent;
33
34    private int mCellWidth;
35    private int mCellHeight;
36    private int mWidthGap;
37    private int mHeightGap;
38
39    public PagedViewCellLayoutChildren(Context context) {
40        super(context);
41    }
42
43    @Override
44    public void cancelLongPress() {
45        super.cancelLongPress();
46
47        // Cancel long press for all children
48        final int count = getChildCount();
49        for (int i = 0; i < count; i++) {
50            final View child = getChildAt(i);
51            child.cancelLongPress();
52        }
53    }
54
55    public void setGap(int widthGap, int heightGap) {
56        mWidthGap = widthGap;
57        mHeightGap = heightGap;
58        requestLayout();
59    }
60
61    public void setCellDimensions(int width, int height) {
62        mCellWidth = width;
63        mCellHeight = height;
64        requestLayout();
65    }
66
67    @Override
68    public void requestChildFocus(View child, View focused) {
69        super.requestChildFocus(child, focused);
70        if (child != null) {
71            Rect r = new Rect();
72            child.getDrawingRect(r);
73            requestRectangleOnScreen(r);
74        }
75    }
76
77    @Override
78    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
79        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
80        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
81
82        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
83        int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
84
85        if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) {
86            throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions");
87        }
88
89        final int count = getChildCount();
90        for (int i = 0; i < count; i++) {
91            View child = getChildAt(i);
92            PagedViewCellLayout.LayoutParams lp =
93                (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
94            lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
95                    getPaddingLeft(),
96                    getPaddingTop());
97
98            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
99                    MeasureSpec.EXACTLY);
100            int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
101                    MeasureSpec.EXACTLY);
102
103            child.measure(childWidthMeasureSpec, childheightMeasureSpec);
104        }
105
106        setMeasuredDimension(widthSpecSize, heightSpecSize);
107    }
108
109    @Override
110    protected void onLayout(boolean changed, int l, int t, int r, int b) {
111        int count = getChildCount();
112
113        int offsetX = 0;
114        if (mCenterContent && count > 0) {
115            // determine the max width of all the rows and center accordingly
116            int maxRowX = 0;
117            int minRowX = Integer.MAX_VALUE;
118            for (int i = 0; i < count; i++) {
119                View child = getChildAt(i);
120                if (child.getVisibility() != GONE) {
121                    PagedViewCellLayout.LayoutParams lp =
122                        (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
123                    minRowX = Math.min(minRowX, lp.x);
124                    maxRowX = Math.max(maxRowX, lp.x + lp.width);
125                }
126            }
127            int maxRowWidth = maxRowX - minRowX;
128            offsetX = (getMeasuredWidth() - maxRowWidth) / 2;
129        }
130
131        for (int i = 0; i < count; i++) {
132            View child = getChildAt(i);
133            if (child.getVisibility() != GONE) {
134                PagedViewCellLayout.LayoutParams lp =
135                    (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
136
137                int childLeft = offsetX + lp.x;
138                int childTop = lp.y;
139                child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
140            }
141        }
142    }
143
144    public void enableCenteredContent(boolean enabled) {
145        mCenterContent = enabled;
146    }
147
148    @Override
149    protected void setChildrenDrawingCacheEnabled(boolean enabled) {
150        final int count = getChildCount();
151        for (int i = 0; i < count; i++) {
152            final View view = getChildAt(i);
153            view.setDrawingCacheEnabled(enabled);
154            // Update the drawing caches
155            if (!view.isHardwareAccelerated()) {
156                view.buildDrawingCache(true);
157            }
158        }
159    }
160}
161