/*
* Copyright (C) 2012 Wu Tong
*
* 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 org.cocoa4android.ui;
import org.cocoa4android.cg.CGRect;
import org.cocoa4android.ns.NSError;
import org.cocoa4android.ns.NSURLRequest;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public class UIWebView extends UIView {
private WebView webView = null;
private WebViewSizeChangeLisener webViewSizeChangeLisener = null;
private boolean enableMutipleScroll = NO;
private UIWebViewDelegate delegate;
public UIWebViewDelegate delegate() {
return delegate;
}
public void setDelegate(UIWebViewDelegate delegate) {
this.delegate = delegate;
}
public boolean isEnableMutipleScroll() {
return enableMutipleScroll;
}
public void setEnableMutipleScroll(boolean enableMutipleScroll) {
this.enableMutipleScroll = enableMutipleScroll;
}
public WebViewSizeChangeLisener getWebViewSizeChangeLisener() {
return webViewSizeChangeLisener;
}
public void setWebViewSizeChangeLisener(
WebViewSizeChangeLisener webViewSizeChangeLisener) {
this.webViewSizeChangeLisener = webViewSizeChangeLisener;
}
public UIWebView(){
webView = new ResizableWebView(context);
webView.getSettings().setBuiltInZoomControls(true);
CocoaWebViewClient client = new CocoaWebViewClient();
webView.setWebViewClient(client);
this.setView(webView);
}
public UIWebView(CGRect frame){
this();
this.setFrame(frame);
}
public void setFrame(CGRect frame){
this.frame = frame;
LayoutParams params = new LayoutParams((int)(frame.size().width()*scaleDensityX), LayoutParams.WRAP_CONTENT);
params.alignWithParent = true;
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params.leftMargin = (int)(frame.origin().x()*scaleDensityX);
params.topMargin = (int)(frame.origin().y()*scaleDensityY);
this.getView().setLayoutParams(params);
}
public void loadHTMLString(String string,String baseUrl){
webView.loadDataWithBaseURL(baseUrl, string, "text/html", "utf-8", null);
}
public void loadRequest(NSURLRequest request){
webView.loadUrl(request.URL().absoluteString());
}
public class ResizableWebView extends WebView{
public ResizableWebView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){
super.onSizeChanged(xNew, yNew, xOld, yOld);
if(webViewSizeChangeLisener!=null){
webViewSizeChangeLisener.webViewDidChangeSize(xNew/scaleDensityX, yNew/scaleDensityY);
}
}
}
public interface WebViewSizeChangeLisener{
public void webViewDidChangeSize(float width,float height);
}
public interface UIWebViewDelegate{
public void webViewDidFinishLoad(UIWebView webView);
public void webViewDidStartLoad(UIWebView webView);
public void webViewDidFailLoadWithError(UIWebView webView,NSError error);
}
public class CocoaWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (UIWebView.this.delegate!=null) {
UIWebView.this.delegate.webViewDidStartLoad(UIWebView.this);
}
}
@Override
public void onPageFinished(WebView webView, String url) {
if (UIWebView.this.delegate!=null) {
UIWebView.this.delegate.webViewDidFinishLoad(UIWebView.this);
}
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
if (UIWebView.this.delegate!=null) {
//FIXME nserror description
UIWebView.this.delegate.webViewDidFailLoadWithError(UIWebView.this,NSError.errorWithDomain("", errorCode,null));
}
}
}
}