blob: 187a22d556b118bd7eb3a300e81fa83fbe93cd81 [file] [log] [blame]
Michael Jurka8245a862011-02-01 17:53:59 -08001/*
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;
Michael Jurka8245a862011-02-01 17:53:59 -080021import 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);
Michael Jurka8245a862011-02-01 17:53:59 -080041 }
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,
Michael Jurka9bfe2b22011-06-02 16:41:34 -070095 getPaddingLeft(),
96 getPaddingTop());
Michael Jurka8245a862011-02-01 17:53:59 -080097
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;
Michael Jurka9bfe2b22011-06-02 16:41:34 -0700114 if (mCenterContent && count > 0) {
Michael Jurka8245a862011-02-01 17:53:59 -0800115 // determine the max width of all the rows and center accordingly
Michael Jurka9bfe2b22011-06-02 16:41:34 -0700116 int maxRowX = 0;
117 int minRowX = Integer.MAX_VALUE;
Michael Jurka8245a862011-02-01 17:53:59 -0800118 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();
Michael Jurka9bfe2b22011-06-02 16:41:34 -0700123 minRowX = Math.min(minRowX, lp.x);
124 maxRowX = Math.max(maxRowX, lp.x + lp.width);
Michael Jurka8245a862011-02-01 17:53:59 -0800125 }
126 }
Michael Jurka9bfe2b22011-06-02 16:41:34 -0700127 int maxRowWidth = maxRowX - minRowX;
128 offsetX = (getMeasuredWidth() - maxRowWidth) / 2;
Michael Jurka8245a862011-02-01 17:53:59 -0800129 }
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
Michael Jurka8245a862011-02-01 17:53:59 -0800144 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 }
Michael Jurka8245a862011-02-01 17:53:59 -0800160}