/* * Copyright (C) 2009 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 android.webkit; import android.content.Context; import android.view.View; import android.widget.AbsoluteLayout; import java.util.ArrayList; class ViewManager { private final WebView mWebView; private final ArrayList<ChildView> mChildren = new ArrayList<ChildView>(); private boolean mHidden; class ChildView { int x; int y; int width; int height; View mView; // generic view to show ChildView() { } void setBounds(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } void attachView(int x, int y, int width, int height) { if (mView == null) { return; } setBounds(x, y, width, height); final AbsoluteLayout.LayoutParams lp = new AbsoluteLayout.LayoutParams(ctvD(width), ctvD(height), ctvX(x), ctvY(y)); mWebView.mPrivateHandler.post(new Runnable() { public void run() { // This method may be called multiple times. If the view is // already attached, just set the new LayoutParams, // otherwise attach the view and add it to the list of // children. if (mView.getParent() != null) { mView.setLayoutParams(lp); } else { attachViewOnUIThread(lp); } } }); } void attachViewOnUIThread(AbsoluteLayout.LayoutParams lp) { mWebView.addView(mView, lp); mChildren.add(this); } void removeView() { if (mView == null) { return; } mWebView.mPrivateHandler.post(new Runnable() { public void run() { removeViewOnUIThread(); } }); } void removeViewOnUIThread() { mWebView.removeView(mView); mChildren.remove(this); } } ViewManager(WebView w) { mWebView = w; } ChildView createView() { return new ChildView(); } /** * Shorthand for calling mWebView.contentToViewDimension. Used when * obtaining a view dimension from a content dimension, whether it be in x * or y. */ private int ctvD(int val) { return mWebView.contentToViewDimension(val); } /** * Shorthand for calling mWebView.contentToViewX. Used when obtaining a * view x coordinate from a content x coordinate. */ private int ctvX(int val) { return mWebView.contentToViewX(val); } /** * Shorthand for calling mWebView.contentToViewY. Used when obtaining a * view y coordinate from a content y coordinate. */ private int ctvY(int val) { return mWebView.contentToViewY(val); } void scaleAll() { for (ChildView v : mChildren) { View view = v.mView; AbsoluteLayout.LayoutParams lp = (AbsoluteLayout.LayoutParams) view.getLayoutParams(); lp.width = ctvD(v.width); lp.height = ctvD(v.height); lp.x = ctvX(v.x); lp.y = ctvY(v.y); view.setLayoutParams(lp); } } void hideAll() { if (mHidden) { return; } for (ChildView v : mChildren) { v.mView.setVisibility(View.GONE); } mHidden = true; } void showAll() { if (!mHidden) { return; } for (ChildView v : mChildren) { v.mView.setVisibility(View.VISIBLE); } mHidden = false; } }