adding wp7
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugman/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugman/commit/f66a1715 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugman/tree/f66a1715 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugman/diff/f66a1715 Branch: refs/heads/master Commit: f66a171576c3b32b571d3ad6a5bd3300e01552bd Parents: 33d79ba Author: Jesse MacFadyen <[email protected]> Authored: Fri Apr 12 01:16:15 2013 -0700 Committer: Anis Kadri <[email protected]> Committed: Mon Apr 22 16:28:05 2013 -0700 ---------------------------------------------------------------------- platforms/wp7.js | 117 +++++++++ plugman.js | 3 +- test/plugins/ChildBrowser/plugin.xml | 21 ++ .../ChildBrowser/src/wp7/ChildBrowserCommand.cs | 197 +++++++++++++++ .../src/wp7/Images/appbar.back.rest.png | Bin 0 -> 375 bytes .../src/wp7/Images/appbar.close.rest.png | Bin 0 -> 359 bytes .../src/wp7/Images/appbar.next.rest.png | Bin 0 -> 388 bytes 7 files changed, 337 insertions(+), 1 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/platforms/wp7.js ---------------------------------------------------------------------- diff --git a/platforms/wp7.js b/platforms/wp7.js new file mode 100644 index 0000000..2889f87 --- /dev/null +++ b/platforms/wp7.js @@ -0,0 +1,117 @@ +/* + * + * Copyright 2013 Jesse MacFadyen + * + * 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. + * +*/ + +/* +$ node plugman --platform wp7 + --project '/c//users/jesse/documents/visual studio 2012/Projects/TestPlugin7/' + --plugin '.\test\plugins\ChildBrowser\' +*/ + +var fs = require('fs'), + path = require('path'), + glob = require('glob'), + shell = require('shelljs'), + et = require('elementtree'), + assetsDir = 'www'; // relative path to project's web assets + +function copyFileSync(srcPath, destPath) { + + var stats = fs.statSync(srcPath); + if(stats.isDirectory()) { + shell.mkdir('-p', destPath); + // without the added slash at the end, we will get an extra folder inside destination + shell.cp('-r', srcPath + "/" , destPath); + } + else if(fs.existsSync(srcPath)) { + shell.cp(srcPath, destPath); + } + else { + console.log("File does not exist :: " + srcPath); + return; + } + + var msg = shell.error(); + if(msg) { + console.log("msg" + msg); + throw { name: "ShellError", message: msg}; + } +} + +function install(project_dir, plugin_dir, plugin_et, variables) { + + var unix_projPath = project_dir.split("\\").join("/"); + var project_file = glob.sync('*.csproj',{nocase:true,cwd:unix_projPath})[0]; + var projPath = path.join(unix_projPath,project_file); + var assets = plugin_et.findall('./asset'); + var platformTag = plugin_et.find('./platform[@name="wp7"]'); + var sourceFiles = platformTag.findall('./source-file'); + var projectChanges = platformTag.findall('./config-file[@target=".csproj"]'); + + + // move asset files + assets && assets.forEach(function (asset) { + var srcPath = path.resolve(plugin_dir, asset.attrib['src']); + var targetPath = path.resolve(project_dir, assetsDir, asset.attrib['target']); + copyFileSync(srcPath, targetPath); + }); + + // move source files + sourceFiles && sourceFiles.forEach(function (sourceFile) { + var srcFilePath = path.resolve(plugin_dir, sourceFile.attrib['src']); + var destDir = path.resolve(project_dir, sourceFile.attrib['target-dir']); + var destFilePath = path.resolve(destDir, path.basename(sourceFile.attrib['src'])); + copyFileSync(srcFilePath, destFilePath); + }); + + et.register_namespace("csproj", "http://schemas.microsoft.com/developer/msbuild/2003"); + projectChanges && projectChanges.forEach(function (configNode) { + + var docStr = fs.readFileSync(projPath,"utf8"); + + // child is the configNode child that we will insert into csproj + var child = configNode.find('*'); + + var newNodeText = new et.ElementTree(child).write({xml_declaration:false}); + newNodeText = newNodeText.split("
").join("\n").split("
").join("\r"); + // insert text right before closing tag + var newDocStr = docStr.replace("</Project>",newNodeText + "\n</Project>"); + // save it, and get out + fs.writeFileSync(projPath, newDocStr); + }); +} + +function uninstall(project_dir, plugin_dir, plugin_et, variables) { + // uninstall would be : shell.rm('-rf', targetPath); +} + +exports.handlePlugin = function (action, project_dir, plugin_dir, plugin_et, variables) { + + switch(action) { + case 'install' : + //console.log('installing'); + install(project_dir, plugin_dir, plugin_et, variables); + break; + case 'uninstall' : + console.log('uninstalling'); + break; + default : + throw 'error unknown action'; + break; + } +} http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/plugman.js ---------------------------------------------------------------------- diff --git a/plugman.js b/plugman.js index a422dab..fd8e0dd 100755 --- a/plugman.js +++ b/plugman.js @@ -30,10 +30,11 @@ var fs = require('fs') 'android': require('./platforms/android'), 'ios': require('./platforms/ios'), 'blackberry': require('./platforms/blackberry'), + 'wp7': require('./platforms/wp7'), 'www': require('./platforms/www') }; -var known_opts = { 'platform' : [ 'ios', 'android', 'blackberry' ,'www' ] +var known_opts = { 'platform' : [ 'ios', 'android', 'blackberry' ,'wp7' , 'www' ] , 'project' : path , 'plugin' : [String, path, url] , 'remove' : Boolean http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/test/plugins/ChildBrowser/plugin.xml ---------------------------------------------------------------------- diff --git a/test/plugins/ChildBrowser/plugin.xml b/test/plugins/ChildBrowser/plugin.xml index 25524e2..e166870 100644 --- a/test/plugins/ChildBrowser/plugin.xml +++ b/test/plugins/ChildBrowser/plugin.xml @@ -101,4 +101,25 @@ <framework src="social.framework" weak="true" /> <framework src="music.framework" weak="rabbit" /> </platform> + + <!-- wp7 --> + <platform name="wp7"> + <resource-file src="src\wp7\Images\appbar.back.rest.png" /> + <config-file target="config.xml" parent="/widget/plugins"> + <plugin name="ChildBrowser" + value="ChildBrowser"/> + </config-file> + + <source-file src="src\wp7\ChildBrowserCommand.cs" + target-dir="Plugins\" /> + + <!-- modify the project file to include the added files --> + <config-file target=".csproj" parent="."> + <ItemGroup> + <Compile Include="Plugins\\ChildBrowserCommand.cs"/> + <Content Include="www\\childbrowser.js" /> + </ItemGroup> + </config-file> + + </platform> </plugin> http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/test/plugins/ChildBrowser/src/wp7/ChildBrowserCommand.cs ---------------------------------------------------------------------- diff --git a/test/plugins/ChildBrowser/src/wp7/ChildBrowserCommand.cs b/test/plugins/ChildBrowser/src/wp7/ChildBrowserCommand.cs new file mode 100644 index 0000000..f56c7e5 --- /dev/null +++ b/test/plugins/ChildBrowser/src/wp7/ChildBrowserCommand.cs @@ -0,0 +1,197 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using Microsoft.Phone.Controls; +using System.Diagnostics; +using System.Runtime.Serialization; +using Microsoft.Phone.Shell; + +namespace WPCordovaClassLib.Cordova.Commands +{ + [DataContract] + public class BrowserOptions + { + [DataMember] + public string url; + + [DataMember] + public bool isGeolocationEnabled; + } + + public class ChildBrowserCommand : BaseCommand + { + + private static WebBrowser browser; + private static ApplicationBarIconButton backButton; + private static ApplicationBarIconButton fwdButton; + + // Display an inderminate progress indicator + public void showWebPage(string options) + { + BrowserOptions opts = JSON.JsonHelper.Deserialize<BrowserOptions>(options); + + Uri loc = new Uri(opts.url); + + Deployment.Current.Dispatcher.BeginInvoke(() => + { + if (browser != null) + { + browser.IsGeolocationEnabled = opts.isGeolocationEnabled; + browser.Navigate(loc); + } + else + { + PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame; + if (frame != null) + { + PhoneApplicationPage page = frame.Content as PhoneApplicationPage; + if (page != null) + { + Grid grid = page.FindName("LayoutRoot") as Grid; + if (grid != null) + { + browser = new WebBrowser(); + browser.Navigate(loc); + + browser.LoadCompleted += new System.Windows.Navigation.LoadCompletedEventHandler(browser_LoadCompleted); + + browser.Navigating += new EventHandler<NavigatingEventArgs>(browser_Navigating); + browser.NavigationFailed += new System.Windows.Navigation.NavigationFailedEventHandler(browser_NavigationFailed); + browser.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(browser_Navigated); + browser.IsScriptEnabled = true; + browser.IsGeolocationEnabled = opts.isGeolocationEnabled; + grid.Children.Add(browser); + } + + ApplicationBar bar = new ApplicationBar(); + bar.BackgroundColor = Colors.Black; + bar.IsMenuEnabled = false; + + backButton = new ApplicationBarIconButton(); + backButton.Text = "Back"; + backButton.IconUri = new Uri("/Images/appbar.back.rest.png", UriKind.Relative); + backButton.Click += new EventHandler(backButton_Click); + backButton.IsEnabled = false; + bar.Buttons.Add(backButton); + + + fwdButton = new ApplicationBarIconButton(); + fwdButton.Text = "Forward"; + fwdButton.IconUri = new Uri("/Images/appbar.next.rest.png", UriKind.Relative); + fwdButton.Click += new EventHandler(fwdButton_Click); + fwdButton.IsEnabled = false; + bar.Buttons.Add(fwdButton); + + ApplicationBarIconButton closeBtn = new ApplicationBarIconButton(); + closeBtn.Text = "Close"; + closeBtn.IconUri = new Uri("/Images/appbar.close.rest.png", UriKind.Relative); + closeBtn.Click += new EventHandler(closeBtn_Click); + bar.Buttons.Add(closeBtn); + + page.ApplicationBar = bar; + } + + } + } + }); + } + + void browser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) + { + + } + + void fwdButton_Click(object sender, EventArgs e) + { + if (browser != null) + { + try + { + browser.InvokeScript("execScript", "history.forward();"); + } + catch(Exception) + { + + } + } + } + + void backButton_Click(object sender, EventArgs e) + { + if (browser != null) + { + try + { + browser.InvokeScript("execScript", "history.back();"); + } + catch (Exception) + { + + } + } + } + + void closeBtn_Click(object sender, EventArgs e) + { + this.close(); + } + + + public void close(string options="") + { + if (browser != null) + { + Deployment.Current.Dispatcher.BeginInvoke(() => + { + PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame; + if (frame != null) + { + PhoneApplicationPage page = frame.Content as PhoneApplicationPage; + if (page != null) + { + Grid grid = page.FindName("LayoutRoot") as Grid; + if (grid != null) + { + grid.Children.Remove(browser); + } + page.ApplicationBar = null; + } + } + browser = null; + }); + } + } + + void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) + { + string message = "{\"type\":\"locationChanged\", \"location\":\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.OK, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + void browser_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e) + { + string message = "{\"type\":\"navigationError\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.ERROR, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + void browser_Navigating(object sender, NavigatingEventArgs e) + { + string message = "{\"type\":\"locationAboutToChange\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.OK, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + } +} http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/test/plugins/ChildBrowser/src/wp7/Images/appbar.back.rest.png ---------------------------------------------------------------------- diff --git a/test/plugins/ChildBrowser/src/wp7/Images/appbar.back.rest.png b/test/plugins/ChildBrowser/src/wp7/Images/appbar.back.rest.png new file mode 100644 index 0000000..4bc2b92 Binary files /dev/null and b/test/plugins/ChildBrowser/src/wp7/Images/appbar.back.rest.png differ http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/test/plugins/ChildBrowser/src/wp7/Images/appbar.close.rest.png ---------------------------------------------------------------------- diff --git a/test/plugins/ChildBrowser/src/wp7/Images/appbar.close.rest.png b/test/plugins/ChildBrowser/src/wp7/Images/appbar.close.rest.png new file mode 100644 index 0000000..8166a1c Binary files /dev/null and b/test/plugins/ChildBrowser/src/wp7/Images/appbar.close.rest.png differ http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/f66a1715/test/plugins/ChildBrowser/src/wp7/Images/appbar.next.rest.png ---------------------------------------------------------------------- diff --git a/test/plugins/ChildBrowser/src/wp7/Images/appbar.next.rest.png b/test/plugins/ChildBrowser/src/wp7/Images/appbar.next.rest.png new file mode 100644 index 0000000..ed577d7 Binary files /dev/null and b/test/plugins/ChildBrowser/src/wp7/Images/appbar.next.rest.png differ
