LayoutModel.java revision 150c4179995cc0a75f934ef194372f9295957ca2
1/* 2 * Copyright (C) 2008 Esmertec AG. 3 * Copyright (C) 2008 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package com.android.mms.model; 19 20import com.android.mms.layout.LayoutManager; 21import com.android.mms.layout.LayoutParameters; 22 23import android.util.Log; 24 25import java.util.ArrayList; 26 27public class LayoutModel extends Model { 28 private static final String TAG = SlideModel.TAG; 29 private static final boolean DEBUG = false; 30 private static final boolean LOCAL_LOGV = false; 31 32 public static final String IMAGE_REGION_ID = "Image"; 33 public static final String TEXT_REGION_ID = "Text"; 34 35 public static final int LAYOUT_BOTTOM_TEXT = 0; 36 public static final int LAYOUT_TOP_TEXT = 1; 37 public static final int DEFAULT_LAYOUT_TYPE = LAYOUT_BOTTOM_TEXT; 38 39 private int mLayoutType = DEFAULT_LAYOUT_TYPE; 40 private RegionModel mRootLayout; 41 private RegionModel mImageRegion; 42 private RegionModel mTextRegion; 43 private ArrayList<RegionModel> mNonStdRegions; 44 private LayoutParameters mLayoutParams; 45 46 public LayoutModel() { 47 mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); 48 // Create default root-layout and regions. 49 createDefaultRootLayout(); 50 createDefaultImageRegion(); 51 createDefaultTextRegion(); 52 } 53 54 public LayoutModel(RegionModel rootLayout, ArrayList<RegionModel> regions) { 55 mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); 56 mRootLayout = rootLayout; 57 mNonStdRegions = new ArrayList<RegionModel>(); 58 59 for (RegionModel r : regions) { 60 String rId = r.getRegionId(); 61 if (rId.equals(IMAGE_REGION_ID)) { 62 mImageRegion = r; 63 } else if (rId.equals(TEXT_REGION_ID)) { 64 mTextRegion = r; 65 } else { 66 if (LOCAL_LOGV) { 67 Log.v(TAG, "Found non-standard region: " + rId); 68 } 69 mNonStdRegions.add(r); 70 } 71 } 72 73 validateLayouts(); 74 } 75 76 private void createDefaultRootLayout() { 77 mRootLayout = new RegionModel(null, 0, 0, mLayoutParams.getWidth(), 78 mLayoutParams.getHeight()); 79 } 80 81 private void createDefaultImageRegion() { 82 if (mRootLayout == null) { 83 throw new IllegalStateException("Root-Layout uninitialized."); 84 } 85 86 mImageRegion = new RegionModel(IMAGE_REGION_ID, 0, 0, 87 mRootLayout.getWidth(), mLayoutParams.getImageHeight()); 88 } 89 90 private void createDefaultTextRegion() { 91 if (mRootLayout == null) { 92 throw new IllegalStateException("Root-Layout uninitialized."); 93 } 94 95 mTextRegion = new RegionModel( 96 TEXT_REGION_ID, 0, mLayoutParams.getImageHeight(), 97 mRootLayout.getWidth(), mLayoutParams.getTextHeight()); 98 } 99 100 private void validateLayouts() { 101 if (mRootLayout == null) { 102 createDefaultRootLayout(); 103 } 104 105 if (mImageRegion == null) { 106 createDefaultImageRegion(); 107 } 108 109 if (mTextRegion == null) { 110 createDefaultTextRegion(); 111 } 112 } 113 114 public RegionModel getRootLayout() { 115 return mRootLayout; 116 } 117 118 public void setRootLayout(RegionModel rootLayout) { 119 mRootLayout = rootLayout; 120 } 121 122 public RegionModel getImageRegion() { 123 return mImageRegion; 124 } 125 126 public void setImageRegion(RegionModel imageRegion) { 127 mImageRegion = imageRegion; 128 } 129 130 public RegionModel getTextRegion() { 131 return mTextRegion; 132 } 133 134 public void setTextRegion(RegionModel textRegion) { 135 mTextRegion = textRegion; 136 } 137 138 /** 139 * Get all regions except root-layout. The result is READ-ONLY. 140 */ 141 public ArrayList<RegionModel> getRegions() { 142 ArrayList<RegionModel> regions = new ArrayList<RegionModel>(); 143 if (mImageRegion != null) { 144 regions.add(mImageRegion); 145 } 146 if (mTextRegion != null) { 147 regions.add(mTextRegion); 148 } 149 return regions; 150 } 151 152 public RegionModel findRegionById(String rId) { 153 if (IMAGE_REGION_ID.equals(rId)) { 154 return mImageRegion; 155 } else if (TEXT_REGION_ID.equals(rId)) { 156 return mTextRegion; 157 } else { 158 for (RegionModel r : mNonStdRegions) { 159 if (r.getRegionId().equals(rId)) { 160 return r; 161 } 162 } 163 164 if (LOCAL_LOGV) { 165 Log.v(TAG, "Region not found: " + rId); 166 } 167 return null; 168 } 169 } 170 171 public int getLayoutWidth() { 172 return mRootLayout.getWidth(); 173 } 174 175 public int getLayoutHeight() { 176 return mRootLayout.getHeight(); 177 } 178 179 public String getBackgroundColor() { 180 return mRootLayout.getBackgroundColor(); 181 } 182 183 public void changeTo(int layout) { 184 if (mRootLayout == null) { 185 throw new IllegalStateException("Root-Layout uninitialized."); 186 } 187 188 if (mLayoutParams == null) { 189 mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); 190 } 191 192 if (mLayoutType != layout) { 193 switch (layout) { 194 case LAYOUT_BOTTOM_TEXT: { 195 mImageRegion.setTop(0); 196 mTextRegion.setTop(mLayoutParams.getImageHeight()); 197 mLayoutType = layout; 198 notifyModelChanged(true); 199 } 200 break; 201 case LAYOUT_TOP_TEXT: { 202 mImageRegion.setTop(mLayoutParams.getTextHeight()); 203 mTextRegion.setTop(0); 204 mLayoutType = layout; 205 notifyModelChanged(true); 206 } 207 break; 208 default: { 209 Log.w(TAG, "Unknown layout type: " + layout); 210 } 211 } 212 } else { 213 if (LOCAL_LOGV) { 214 Log.v(TAG, "Skip changing layout."); 215 } 216 } 217 } 218 219 public int getLayoutType() { 220 return mLayoutType; 221 } 222 223 @Override 224 protected void registerModelChangedObserverInDescendants( 225 IModelChangedObserver observer) { 226 if (mRootLayout != null) { 227 mRootLayout.registerModelChangedObserver(observer); 228 } 229 230 if (mImageRegion != null) { 231 mImageRegion.registerModelChangedObserver(observer); 232 } 233 234 if (mTextRegion != null) { 235 mTextRegion.registerModelChangedObserver(observer); 236 } 237 } 238 239 @Override 240 protected void unregisterModelChangedObserverInDescendants( 241 IModelChangedObserver observer) { 242 if (mRootLayout != null) { 243 mRootLayout.unregisterModelChangedObserver(observer); 244 } 245 246 if (mImageRegion != null) { 247 mImageRegion.unregisterModelChangedObserver(observer); 248 } 249 250 if (mTextRegion != null) { 251 mTextRegion.unregisterModelChangedObserver(observer); 252 } 253 } 254 255 @Override 256 protected void unregisterAllModelChangedObserversInDescendants() { 257 if (mRootLayout != null) { 258 mRootLayout.unregisterAllModelChangedObservers(); 259 } 260 261 if (mImageRegion != null) { 262 mImageRegion.unregisterAllModelChangedObservers(); 263 } 264 265 if (mTextRegion != null) { 266 mTextRegion.unregisterAllModelChangedObservers(); 267 } 268 } 269} 270