blob: 028053469127c669dee56f7172ceb6f1d78d59b4 [file] [log] [blame]
/*
* Copyright (C) 2008 Esmertec AG.
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.mms.model;
import java.util.ArrayList;
import android.util.Config;
import android.util.Log;
import com.android.mms.layout.LayoutManager;
import com.android.mms.layout.LayoutParameters;
public class LayoutModel extends Model {
private static final String TAG = SlideModel.TAG;
private static final boolean DEBUG = false;
private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
public static final String IMAGE_REGION_ID = "Image";
public static final String TEXT_REGION_ID = "Text";
public static final int LAYOUT_BOTTOM_TEXT = 0;
public static final int LAYOUT_TOP_TEXT = 1;
public static final int DEFAULT_LAYOUT_TYPE = LAYOUT_BOTTOM_TEXT;
private int mLayoutType = DEFAULT_LAYOUT_TYPE;
private RegionModel mRootLayout;
private RegionModel mImageRegion;
private RegionModel mTextRegion;
private ArrayList<RegionModel> mNonStdRegions;
private LayoutParameters mLayoutParams;
public LayoutModel() {
mLayoutParams = LayoutManager.getInstance().getLayoutParameters();
// Create default root-layout and regions.
createDefaultRootLayout();
createDefaultImageRegion();
createDefaultTextRegion();
}
public LayoutModel(RegionModel rootLayout, ArrayList<RegionModel> regions) {
mLayoutParams = LayoutManager.getInstance().getLayoutParameters();
mRootLayout = rootLayout;
mNonStdRegions = new ArrayList<RegionModel>();
for (RegionModel r : regions) {
String rId = r.getRegionId();
if (rId.equals(IMAGE_REGION_ID)) {
mImageRegion = r;
} else if (rId.equals(TEXT_REGION_ID)) {
mTextRegion = r;
} else {
if (LOCAL_LOGV) {
Log.v(TAG, "Found non-standard region: " + rId);
}
mNonStdRegions.add(r);
}
}
validateLayouts();
}
private void createDefaultRootLayout() {
mRootLayout = new RegionModel(null, 0, 0, mLayoutParams.getWidth(),
mLayoutParams.getHeight());
}
private void createDefaultImageRegion() {
if (mRootLayout == null) {
throw new IllegalStateException("Root-Layout uninitialized.");
}
mImageRegion = new RegionModel(IMAGE_REGION_ID, 0, 0,
mRootLayout.getWidth(), mLayoutParams.getImageHeight());
}
private void createDefaultTextRegion() {
if (mRootLayout == null) {
throw new IllegalStateException("Root-Layout uninitialized.");
}
mTextRegion = new RegionModel(
TEXT_REGION_ID, 0, mLayoutParams.getImageHeight(),
mRootLayout.getWidth(), mLayoutParams.getTextHeight());
}
private void validateLayouts() {
if (mRootLayout == null) {
createDefaultRootLayout();
}
if (mImageRegion == null) {
createDefaultImageRegion();
}
if (mTextRegion == null) {
createDefaultTextRegion();
}
// LayoutModel will re-construct when orientation changes, so we need to
// initialize mLayoutType here. Otherwise, the mLayoutType is alway default
// value (LAYOUT_BOTTOM_TEXT) after LayoutModel re-construct.
mLayoutType =
(mImageRegion.getTop() == 0) ? LAYOUT_BOTTOM_TEXT : LAYOUT_TOP_TEXT;
}
public RegionModel getRootLayout() {
return mRootLayout;
}
public void setRootLayout(RegionModel rootLayout) {
mRootLayout = rootLayout;
}
public RegionModel getImageRegion() {
return mImageRegion;
}
public void setImageRegion(RegionModel imageRegion) {
mImageRegion = imageRegion;
}
public RegionModel getTextRegion() {
return mTextRegion;
}
public void setTextRegion(RegionModel textRegion) {
mTextRegion = textRegion;
}
/**
* Get all regions except root-layout. The result is READ-ONLY.
*/
public ArrayList<RegionModel> getRegions() {
ArrayList<RegionModel> regions = new ArrayList<RegionModel>();
if (mImageRegion != null) {
regions.add(mImageRegion);
}
if (mTextRegion != null) {
regions.add(mTextRegion);
}
return regions;
}
public RegionModel findRegionById(String rId) {
if (IMAGE_REGION_ID.equals(rId)) {
return mImageRegion;
} else if (TEXT_REGION_ID.equals(rId)) {
return mTextRegion;
} else {
for (RegionModel r : mNonStdRegions) {
if (r.getRegionId().equals(rId)) {
return r;
}
}
if (LOCAL_LOGV) {
Log.v(TAG, "Region not found: " + rId);
}
return null;
}
}
public int getLayoutWidth() {
return mRootLayout.getWidth();
}
public int getLayoutHeight() {
return mRootLayout.getHeight();
}
public String getBackgroundColor() {
return mRootLayout.getBackgroundColor();
}
public void changeTo(int layout) {
if (mRootLayout == null) {
throw new IllegalStateException("Root-Layout uninitialized.");
}
if (mLayoutParams == null) {
mLayoutParams = LayoutManager.getInstance().getLayoutParameters();
}
if (mLayoutType != layout) {
switch (layout) {
case LAYOUT_BOTTOM_TEXT: {
mImageRegion.setTop(0);
mTextRegion.setTop(mLayoutParams.getImageHeight());
mLayoutType = layout;
notifyModelChanged(true);
}
break;
case LAYOUT_TOP_TEXT: {
mImageRegion.setTop(mLayoutParams.getTextHeight());
mTextRegion.setTop(0);
mLayoutType = layout;
notifyModelChanged(true);
}
break;
default: {
Log.w(TAG, "Unknown layout type: " + layout);
}
}
} else {
if (LOCAL_LOGV) {
Log.v(TAG, "Skip changing layout.");
}
}
}
public int getLayoutType() {
return mLayoutType;
}
@Override
protected void registerModelChangedObserverInDescendants(
IModelChangedObserver observer) {
if (mRootLayout != null) {
mRootLayout.registerModelChangedObserver(observer);
}
if (mImageRegion != null) {
mImageRegion.registerModelChangedObserver(observer);
}
if (mTextRegion != null) {
mTextRegion.registerModelChangedObserver(observer);
}
}
@Override
protected void unregisterModelChangedObserverInDescendants(
IModelChangedObserver observer) {
if (mRootLayout != null) {
mRootLayout.unregisterModelChangedObserver(observer);
}
if (mImageRegion != null) {
mImageRegion.unregisterModelChangedObserver(observer);
}
if (mTextRegion != null) {
mTextRegion.unregisterModelChangedObserver(observer);
}
}
@Override
protected void unregisterAllModelChangedObserversInDescendants() {
if (mRootLayout != null) {
mRootLayout.unregisterAllModelChangedObservers();
}
if (mImageRegion != null) {
mImageRegion.unregisterAllModelChangedObservers();
}
if (mTextRegion != null) {
mTextRegion.unregisterAllModelChangedObservers();
}
}
}