| /******************************************************************************* |
| * Copyright (c) 2003, 2012 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 org.eclipse.swt.SWT; |
| import org.eclipse.swt.browser.Browser; |
| import org.eclipse.swt.internal.cocoa.*; |
| import org.eclipse.swt.internal.mozilla.*; |
| import org.eclipse.swt.widgets.*; |
| |
| class MozillaDelegate { |
| Browser browser; |
| Shell eventShell; |
| Listener listener; |
| boolean hasFocus; |
| |
| static final String MOZILLA_RUNNING = "org.eclipse.swt.internal.mozillaRunning"; //$NON-NLS-1$ |
| |
| MozillaDelegate (Browser browser) { |
| super (); |
| this.browser = browser; |
| } |
| |
| static Browser findBrowser (long /*int*/ handle) { |
| Display display = Display.getCurrent (); |
| return (Browser)display.findWidget (handle); |
| } |
| |
| static String getCacheParentPath () { |
| if (OS.VERSION >= 0x1060) { |
| NSArray array = NSFileManager.defaultManager ().URLsForDirectory (OS.NSCachesDirectory, OS.NSUserDomainMask); |
| if (array.count () > 0) { |
| NSURL url = new NSURL (array.objectAtIndex (0)); |
| return url.path ().getString () + Mozilla.SEPARATOR_OS + "eclipse"; //$NON-NLS-1$ |
| } |
| } |
| String baseDir = System.getProperty ("user.home"); //$NON-NLS-1$ |
| return baseDir + "/Library/Caches/eclipse"; //$NON-NLS-1$ |
| } |
| |
| static String[] getJSLibraryNames () { |
| return new String[] {"libxpcom.dylib"}; //$NON-NLS-1$ |
| } |
| |
| static String getJSLibraryName_Pre4 () { |
| return "libmozjs.dylib"; //$NON-NLS-1$ |
| } |
| |
| static String getLibraryName () { |
| return "libxpcom.dylib"; //$NON-NLS-1$ |
| } |
| |
| static String getProfilePath () { |
| String baseDir = System.getProperty ("user.home"); //$NON-NLS-1$ |
| return baseDir + Mozilla.SEPARATOR_OS + ".mozilla" + Mozilla.SEPARATOR_OS + "eclipse"; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| static String getSWTInitLibraryName () { |
| return "swt-xulrunner"; //$NON-NLS-1$ |
| } |
| |
| static void loadAdditionalLibraries (String mozillaPath) { |
| // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=727616 |
| String utilsPath = mozillaPath + Mozilla.SEPARATOR_OS + "libmozutils.dylib"; //$NON-NLS-1$ |
| byte[] bytes = MozillaDelegate.wcsToMbcs (null, utilsPath, true); |
| OS.NSAddImage (bytes, OS.NSADDIMAGE_OPTION_RETURN_ON_ERROR | OS.NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME); |
| } |
| |
| 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; |
| // TODO implement mbcsToWcs |
| return new String(buffer).toCharArray(); |
| } |
| |
| static boolean needsSpinup () { |
| return false; |
| } |
| |
| 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; |
| // TODO implement wcsToMbcs |
| if (terminate) string += "\0"; |
| return string.getBytes(); |
| } |
| |
| void addWindowSubclass () { |
| } |
| |
| int createBaseWindow (nsIBaseWindow baseWindow) { |
| browser.getDisplay ().setData (MOZILLA_RUNNING, Boolean.TRUE); |
| |
| /* |
| * Feature of Mozilla on OSX. Mozilla replaces the OSX application menu whenever |
| * a browser's base window is created. The workaround is to restore the previous |
| * menu after creating the base window. |
| */ |
| NSApplication application = NSApplication.sharedApplication (); |
| NSMenu mainMenu = application.mainMenu (); |
| if (mainMenu != null) mainMenu.retain (); |
| int rc = baseWindow.Create (); |
| application.setMainMenu (mainMenu); |
| if (mainMenu != null) mainMenu.release (); |
| ((Mozilla)browser.webBrowser).Activate (); |
| return rc; |
| } |
| |
| long /*int*/ getHandle () { |
| return browser.view.id; |
| } |
| |
| long /*int*/ getSiteWindow () { |
| return browser.view.id; |
| } |
| |
| void handleFocus () { |
| if (hasFocus) return; |
| hasFocus = true; |
| ((Mozilla)browser.webBrowser).Activate (); |
| browser.setFocus (); |
| listener = new Listener () { |
| public void handleEvent (Event event) { |
| if (event.widget == browser) return; |
| if (event.type != SWT.Dispose) { |
| ((Mozilla)browser.webBrowser).Deactivate (); |
| hasFocus = false; |
| } |
| eventShell.getDisplay ().removeFilter (SWT.FocusIn, this); |
| eventShell.removeListener (SWT.Deactivate, this); |
| eventShell.removeListener (SWT.Dispose, this); |
| eventShell = null; |
| listener = null; |
| } |
| |
| }; |
| eventShell = browser.getShell (); |
| eventShell.getDisplay ().addFilter (SWT.FocusIn, listener); |
| eventShell.addListener (SWT.Deactivate, listener); |
| eventShell.addListener (SWT.Dispose, listener); |
| } |
| |
| void handleMouseDown () { |
| Mozilla mozilla = (Mozilla)browser.webBrowser; |
| if (!mozilla.isActive) mozilla.Activate (); |
| } |
| |
| boolean hookEnterExit () { |
| return true; |
| } |
| |
| void init () { |
| } |
| |
| void onDispose (long /*int*/ embedHandle) { |
| if (listener != null) { |
| eventShell.getDisplay ().removeFilter (SWT.FocusIn, listener); |
| eventShell.removeListener (SWT.Deactivate, listener); |
| eventShell.removeListener (SWT.Dispose, listener); |
| eventShell = null; |
| listener = null; |
| } |
| browser = null; |
| } |
| |
| void removeWindowSubclass () { |
| } |
| |
| boolean sendTraverse () { |
| return true; |
| } |
| |
| void setSize (long /*int*/ embedHandle, int width, int height) { |
| // TODO |
| } |
| |
| } |