| /******************************************************************************* |
| * Copyright (c) 2003, 2007 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.swt.browser; |
| |
| import java.util.Hashtable; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.browser.Browser; |
| import org.eclipse.swt.internal.carbon.*; |
| import org.eclipse.swt.internal.cocoa.Cocoa; |
| import org.eclipse.swt.internal.cocoa.NSRect; |
| import org.eclipse.swt.widgets.*; |
| |
| class MozillaDelegate { |
| Browser browser; |
| static Hashtable handles = new Hashtable (); |
| |
| MozillaDelegate (Browser browser) { |
| super (); |
| this.browser = browser; |
| } |
| |
| static Browser findBrowser (int handle) { |
| LONG value = (LONG)handles.get (new LONG (handle)); |
| if (value != null) { |
| Display display = Display.getCurrent (); |
| return (Browser)display.findWidget (value.value); |
| } |
| return null; |
| } |
| |
| static char[] mbcsToWcs (String codePage, byte [] buffer) { |
| int encoding = OS.CFStringGetSystemEncoding (); |
| int cfstring = OS.CFStringCreateWithBytes (OS.kCFAllocatorDefault, buffer, buffer.length, encoding, false); |
| char[] chars = null; |
| if (cfstring != 0) { |
| int length = OS.CFStringGetLength (cfstring); |
| chars = new char [length]; |
| if (length != 0) { |
| CFRange range = new CFRange (); |
| range.length = length; |
| OS.CFStringGetCharacters (cfstring, range, chars); |
| } |
| OS.CFRelease (cfstring); |
| } |
| return chars; |
| } |
| |
| public static byte[] wcsToMbcs (String codePage, String string, boolean terminate) { |
| char[] chars = new char [string.length()]; |
| string.getChars (0, chars.length, chars, 0); |
| int cfstring = OS.CFStringCreateWithCharacters (OS.kCFAllocatorDefault, chars, chars.length); |
| byte[] buffer = null; |
| if (cfstring != 0) { |
| CFRange range = new CFRange (); |
| range.length = chars.length; |
| int encoding = OS.CFStringGetSystemEncoding (); |
| int[] size = new int[1]; |
| int numChars = OS.CFStringGetBytes (cfstring, range, encoding, (byte)'?', true, null, 0, size); |
| buffer = new byte [size[0] + (terminate ? 1 : 0)]; |
| if (numChars != 0) { |
| numChars = OS.CFStringGetBytes (cfstring, range, encoding, (byte)'?', true, buffer, size[0], size); |
| } |
| OS.CFRelease (cfstring); |
| } |
| return buffer; |
| } |
| |
| int getHandle () { |
| int embedHandle = Cocoa.objc_msgSend (Cocoa.C_NSImageView, Cocoa.S_alloc); |
| if (embedHandle == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| NSRect r = new NSRect(); |
| embedHandle = Cocoa.objc_msgSend (embedHandle, Cocoa.S_initWithFrame, r); |
| int rc; |
| int[] outControl = new int[1]; |
| if (OS.VERSION >= 0x1050) { |
| rc = Cocoa.HICocoaViewCreate(embedHandle, 0, outControl); |
| } else { |
| try { |
| System.loadLibrary("frameembedding"); |
| } catch (UnsatisfiedLinkError e) {} |
| rc = Cocoa.HIJavaViewCreateWithCocoaView(outControl, embedHandle); |
| } |
| if (rc != OS.noErr || outControl[0] == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| int subHIView = outControl[0]; |
| HILayoutInfo newLayoutInfo = new HILayoutInfo(); |
| newLayoutInfo.version = 0; |
| OS.HIViewGetLayoutInfo(subHIView, newLayoutInfo); |
| HISideBinding biding = newLayoutInfo.binding.top; |
| biding.toView = 0; |
| biding.kind = OS.kHILayoutBindMin; |
| biding.offset = 0; |
| biding = newLayoutInfo.binding.left; |
| biding.toView = 0; |
| biding.kind = OS.kHILayoutBindMin; |
| biding.offset = 0; |
| biding = newLayoutInfo.binding.bottom; |
| biding.toView = 0; |
| biding.kind = OS.kHILayoutBindMax; |
| biding.offset = 0; |
| biding = newLayoutInfo.binding.right; |
| biding.toView = 0; |
| biding.kind = OS.kHILayoutBindMax; |
| biding.offset = 0; |
| OS.HIViewSetLayoutInfo(subHIView, newLayoutInfo); |
| OS.HIViewChangeFeatures(subHIView, OS.kHIViewFeatureIsOpaque, 0); |
| OS.HIViewSetVisible(subHIView, true); |
| int parentHandle = browser.handle; |
| OS.HIViewAddSubview(browser.handle, subHIView); |
| CGRect rect = new CGRect(); |
| OS.HIViewGetFrame(parentHandle, rect); |
| rect.x = rect.y = 0; |
| OS.HIViewSetFrame(subHIView, rect); |
| handles.put (new LONG (embedHandle), new LONG (browser.handle)); |
| return embedHandle; |
| } |
| |
| String getLibraryName () { |
| return "libxpcom.dylib"; |
| } |
| |
| void onDispose (int embedHandle) { |
| handles.remove (new LONG (embedHandle)); |
| } |
| |
| void setSize (int embedHandle, int width, int height) { |
| // TODO |
| } |
| |
| } |