/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { page.clear.WhenClicked( delegate { //page.search.Clear(); page.search.value = ""; } ); new IHTMLButton { innerText = "Install" }.AttachToDocument().With( btn => { // http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.html btn.onclick += delegate { service.Install("assets/AndroidListApplications/foo.apk"); }; } ); var items = new { div = default(IHTMLDiv), packageName = "", name = "", Remove = default(IHTMLButton), Launch = default(IHTMLButton) }.ToEmptyList(); Action queryIntentActivities = async delegate { var a = new List<string>(); // Send data from JavaScript to the server tier await service.queryIntentActivities( yield: (packageName, name, icon_base64, label) => { #region yield a.Add(packageName); // already have it if (items.Any(k => k.packageName == packageName)) return; var div = new IHTMLDiv(); div.style.margin = "1em"; if (Native.Document.body.firstChild == null) div.AttachToDocument(); else Native.Document.body.insertBefore(div, Native.Document.body.firstChild); new IHTMLImage { src = "data:image/png;base64," + icon_base64 }.AttachTo(div); new IHTMLSpan { innerText = label }.AttachTo(div); var Remove = new IHTMLButton { innerText = "Remove" }.AttachTo(div).WhenClicked( btn => { // http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.html if (!Native.window.confirm("Remove " + name + "?")) return; service.Remove(packageName, name); } ); //div.appendChild(new { icon_base64.Length }.ToString()); var Launch = new IHTMLButton { innerText = "Launch" }.AttachTo(div).WhenClicked( btn => { // http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.html service.Launch(packageName, name); } ); var LaunchFloat = new IHTMLButton { innerText = "Launch Float" }.AttachTo(div).WhenClicked( btn => { service.Launch(packageName, name, ExtraKey: "Float", ExtraValue: "Float" ); } ); // var LaunchWebService = new IHTMLButton { innerText = "Launch WebService" }.AttachTo(div).WhenClicked( // btn => // { // //service.Launch(packageName, name); // } //); var item = new { div, packageName, name, Remove, Launch }; items.Add(item); //https://play.google.com/store/apps/details?id=com.abstractatech.battery new IHTMLAnchor { href = "https://play.google.com/store/apps/details?id=" + packageName, innerText = name }.AttachTo(div); #endregion } ); items.WithEach( item => { if (a.Contains(item.packageName)) return; item.div.style.color = "red"; item.Launch.disabled = true; item.Remove.disabled = true; } ); // remove others! }; queryIntentActivities(); new Timer( delegate { items.WithEach( item => { if (string.IsNullOrEmpty(page.search.value)) { item.div.Show(); } else { if (item.packageName.Contains(page.search.value)) { item.div.Show(); } else { item.div.Hide(); } } } ); queryIntentActivities(); } ).StartInterval(2000); }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { var random = new Random(); device_id = random.Next(); #region con var con = new ConsoleForm(); con.InitializeConsoleFormWriter(); con.StartPosition = FormStartPosition.Manual; con.Show(); // make it slim con.Height = 100; // TopMost con.GetHTMLTarget().style.zIndex = 20002; con.Opacity = 0.9; Action Toggle = delegate { if (con.WindowState == FormWindowState.Minimized) { con.WindowState = FormWindowState.Normal; } else { con.WindowState = FormWindowState.Minimized; } // put the console far right bottom con.MoveTo( Native.window.Width - con.Width, Native.window.Height - con.Height ); }; Action<int> AtKeyCode = KeyCode => { Console.WriteLine( new { KeyCode } ); // US if (KeyCode == 222) { Toggle(); } // EE if (KeyCode == 192) { Toggle(); } }; #if onorientationchange Native.window.onorientationchange += e => { Toggle(); }; #endif Native.document.onkeyup += e => { AtKeyCode(e.KeyCode); }; Toggle(); #endregion Console.WriteLine("console ready for " + new { id = device_id }); var x = 0; var y = 0; #region Virtual Screen FormStyler.AtFormCreated = LikeDesktop; var fs = new Form { }; //fs.FormBorderStyle = FormBorderStyle.None; fs.BackColor = Color.FromArgb(0, 148, 155); fs.Width = Native.screen.width / 4; fs.Height = Native.screen.height / 4; fs.Show(); fs.Opacity = 0.5; FormStyler.AtFormCreated = LikeVirtualScreen; var fvs = new Form { Text = "Virtual Screen" }; fvs.BackColor = Color.Transparent; FormStyler.AtFormCreated = FormStyler.LikeWindowsClassic; fvs.Width = Native.screen.width / 4; fvs.Height = Native.screen.height / 4; fvs.Show(); fvs.Owner = fs; var fw = new Form { }; fw.Width = Native.window.Width / 4; fw.Height = Native.window.Height / 4; fw.Show(); fw.Owner = fvs; fw.Opacity = 0.8; KeepOwnedFormsLinkedToOwnerLocation(fs); KeepOwnedFormsLinkedToOwnerLocation(fvs); KeepOwnedFormsLinkedToOwnerLocation(fw); #endregion // doesnt work yet? //fw.SizeGripStyle = SizeGripStyle.Hide; var svg = new ISVGSVGElement().AttachTo(page.content); svg.style.SetLocation(0, 0); var vsvg = new ISVGSVGElement().AttachTo(fvs.GetHTMLTarget()); vsvg.style.SetLocation(0, 0); #region VirtualScreenUpdate Action VirtualScreenUpdate = delegate { if (fs.Capture) return; // dragging it? if (fvs.Capture) return; var max_right = fvs.OwnedForms.Max(k => k.Right); var min_left = fvs.OwnedForms.Min(k => k.Left); var max_bottom = fvs.OwnedForms.Max(k => k.Bottom); var min_top = fvs.OwnedForms.Min(k => k.Top); DisableKeepOwnedFormsLinkedToOwnerLocation = true; fvs.Left = min_left; fvs.Top = min_top; fvs.Width = max_right - min_left; fvs.Height = max_bottom - min_top; page.content.style.SetLocation( (min_left - fw.Left) * 4, (min_top - fw.Top) * 4, (max_right - min_left) * 4, (max_bottom - min_top) * 4 ); DisableKeepOwnedFormsLinkedToOwnerLocation = false; }; #endregion fw.LocationChanged += delegate { VirtualScreenUpdate(); }; #region AtResize Action AtResize = delegate { // screen can change, but only once, when window is moved to the other monitor? fs.Text = "Screen " + new { Native.screen.width, Native.screen.height }; fs.Width = Native.screen.width / 4; fs.Height = Native.screen.height / 4; fw.Text = " " + new { Native.window.Width, Native.window.Height #if onorientationchange , Native.window.orientation #endif }; fw.Width = Native.window.Width / 4; fw.Height = Native.window.Height / 4; VirtualScreenUpdate(); }; Native.window.onresize += delegate { AtResize(); }; Native.window.onfocus += delegate { AtResize(); }; Native.window.onblur += delegate { AtResize(); }; new ScriptCoreLib.JavaScript.Runtime.Timer( delegate { AtResize(); } ).StartInterval(1000 / 2); #endregion // what is attaching what? // what about await var svgcursor1ghost = new cursor1().AttachTo(page.content).ToSVG(); var svgcursor1 = new cursor1().AttachTo(page.content).ToSVG(); svgcursor1.fill += svgcursor1ghost.fill; var vcursor = new cursor1().AttachTo(fvs.GetHTMLTarget()).ToSVG(); var Shadows = new List<Form>(); Func<Form, Form> CreateShadow = _fw => { FormStyler.AtFormCreated = LikeVirtualWindow; var fwshadow = new Form(); Shadows.Add(fwshadow); fwshadow.BackColor = Color.Transparent; FormStyler.AtFormCreated = FormStyler.LikeWindowsClassic; fwshadow.Width = Native.screen.width / 4; fwshadow.Height = Native.screen.height / 4; fwshadow.Show(); Action fwshadow_update = delegate { fwshadow.MoveTo(_fw.Left, _fw.Top); fwshadow.SizeTo(_fw.Width, _fw.Height); }; _fw.LocationChanged += delegate { fwshadow_update(); }; _fw.SizeChanged += delegate { fwshadow_update(); }; fwshadow_update(); _fw.BringToFront(); return fwshadow; }; Shadows.Add(CreateShadow(fw)); bool canexit = false; bool canenter = true; Action at_exit_MultiMouseMode = delegate { //Console.WriteLine("at_exit_MultiMouseMode"); }; Action at_enter_MultiMouseMode = delegate { //Console.WriteLine("at_enter_MultiMouseMode"); }; Action<IEvent.MouseButtonEnum> at_mousedown = button => { //Console.WriteLine("at_enter_mousedown: " + button); }; Action at_mouseup = delegate { //Console.WriteLine("at_enter_mouseup"); }; var path = new ISVGPathElement().AttachTo(svg); path.setAttribute("style", "stroke: black; stroke-width: 4; fill: none;"); var path_d = ""; var vpath = new ISVGPathElement().AttachTo(vsvg); vpath.setAttribute("style", "stroke: black; stroke-width: 1; fill: none;"); var vpath_d = ""; bool internal_ismousedown = false; Action<IEvent.MouseButtonEnum> internal_mousedown = button => { internal_ismousedown = true; path = new ISVGPathElement().AttachTo(svg); if (button == IEvent.MouseButtonEnum.Left) path.setAttribute("style", "stroke: black; stroke-width: 4; fill: none;"); else path.setAttribute("style", "stroke: rgb(0, 108, 115); stroke-width: 32; fill: none;"); path_d = ""; vpath = new ISVGPathElement().AttachTo(vsvg); if (button == IEvent.MouseButtonEnum.Left) vpath.setAttribute("style", "stroke: black; stroke-width: 1; fill: none;"); else vpath.setAttribute("style", "stroke: rgb(0, 108, 115); stroke-width: 8; fill: none;"); vpath_d = ""; svgcursor1.fill(0, 0, 255); vcursor.fill(0, 0, 255); //path.d = " M100,50 L10,10 L200,200 "; path_d += " M" + x + "," + y; path.d = path_d; vpath_d += " M" + (x / 4) + "," + (y / 4); vpath.d = vpath_d; }; Action<IEvent.MouseButtonEnum> mousedown = button => { at_mousedown(button); internal_mousedown(button); }; Action internal_mouseup = delegate { internal_ismousedown = false; svgcursor1.fill(0, 255, 0); vcursor.fill(0, 255, 0); }; Action mouseup = delegate { at_mouseup(); internal_mouseup(); }; #region exit_MultiMouseMode Action internal_exit_MultiMouseMode = delegate { svgcursor1.fill(0, 0, 0); vcursor.fill(0, 0, 0); con.Opacity = 0.9; page.content.style.Opacity = 0.3; page.content.style.zIndex = 0; page.content.style.backgroundColor = "rgba(0, 148, 155, 1)"; Native.Document.body.style.backgroundColor = "black"; page.content.style.With( (dynamic s) => { s.webkitFilter = "blur(3px)"; } ); page.info.style.With( (dynamic s) => { s.webkitFilter = ""; } ); Shadows.WithEach( f => f.GetHTMLTarget().style.With( (dynamic s) => { s.webkitFilter = ""; } ) ); fs.FormsByOwnership().WithEach( f => f.GetHTMLTarget().style.With( (dynamic s) => { s.webkitFilter = ""; } ) ); fvs.OwnedForms.WithEach( k => { k.GetHTMLTarget().style.display = IStyle.DisplayEnum.block; } ); }; Action exit_MultiMouseMode = delegate { if (!canexit) return; canexit = false; canenter = true; at_exit_MultiMouseMode(); internal_exit_MultiMouseMode(); }; #endregion #region enter_MultiMouseMode Action internal_enter_MultiMouseMode = delegate { svgcursor1.fill(255, 0, 0); vcursor.fill(255, 0, 0); con.Opacity = 0.5; page.content.style.Opacity = 1.0; page.content.style.backgroundColor = ""; Native.Document.body.style.backgroundColor = "rgba(0, 148, 155, 1)"; page.content.style.zIndex = 20000; con.GetHTMLTarget().style.zIndex = 20002; page.content.style.With( (dynamic s) => { s.webkitFilter = ""; } ); page.info.style.With( (dynamic s) => { s.webkitFilter = "blur(3px)"; } ); fvs.OwnedForms.WithEach( k => { k.GetHTMLTarget().style.display = IStyle.DisplayEnum.none; } ); Shadows.WithEach( f => f.GetHTMLTarget().style.With( (dynamic s) => { s.webkitFilter = "blur(3px)"; } ) ); fs.FormsByOwnership().WithEach( f => f.GetHTMLTarget().style.With( (dynamic s) => { s.webkitFilter = "blur(3px)"; } ) ); }; Action enter_MultiMouseMode = delegate { if (!canenter) return; canexit = true; canenter = false; at_enter_MultiMouseMode(); internal_enter_MultiMouseMode(); }; #endregion #region onmousemove Native.Document.body.onmouseup += e => { if (Native.Document.pointerLockElement == Native.Document.body) { mouseup(); return; } }; Native.Document.body.onmousedown += e => { if (Native.Document.pointerLockElement == Native.Document.body) { mousedown(e.MouseButton); return; } Console.WriteLine("requesting MultiMouse mode!"); x = e.CursorX; y = e.CursorY; e.preventDefault(); Native.Document.body.requestPointerLock(); }; Action<int, int> at_set_cursor_position = delegate { }; var pxx = 0; var pyy = 0; var ghost_busy = false; Action<int, int> internal_set_cursor_position = (xx, yy) => { // already set to that exact location! if (pxx == xx) if (pyy == yy) return; pxx = xx; pyy = yy; vcursor.Element.style.SetSize( cursor1.ImageDefaultWidth / 4, cursor1.ImageDefaultHeight / 4 ); vcursor.Element.style.SetLocation( (xx - 14) / 4, (yy - (64 - 56)) / 4 ); svgcursor1.Element.style.SetLocation( xx - 14, // inscaope/svg Y is upside down! yy - (64 - 56) ); if (!ghost_busy) { ghost_busy = true; svgcursor1ghost.Element.style.Opacity = 0.2; svgcursor1ghost.Element.style.With( (dynamic s) => s.webkitTransition = "all 0.5s linear" ); svgcursor1ghost.Element.style.SetLocation( pxx - 14, // inscaope/svg Y is upside down! pyy - (64 - 56) ); new ScriptCoreLib.JavaScript.Runtime.Timer( delegate { svgcursor1ghost.Element.style.SetLocation( pxx - 14, // inscaope/svg Y is upside down! pyy - (64 - 56) ); ghost_busy = false; } ).StartTimeout(500); } // if this window will be activated next time we can continue where we were // told to.. x = xx; y = yy; if (internal_ismousedown) { path_d += " L" + x + "," + y; path.d = path_d; vpath_d += " L" + (x / 4) + "," + (y / 4); vpath.d = vpath_d; } }; Action<int, int> set_cursor_position = (xx, yy) => { at_set_cursor_position(xx, yy); internal_set_cursor_position(xx, yy); }; Native.Document.body.onmousemove += e => { if (Native.Document.pointerLockElement == Native.Document.body) { enter_MultiMouseMode(); x += e.movementX; y += e.movementY; // clip it // fullscreen behaves differently? x = x.Min(fvs.Width * 4).Max(0); y = y.Min(fvs.Height * 4).Max(0); set_cursor_position(x, y); } else { exit_MultiMouseMode(); } }; #endregion internal_exit_MultiMouseMode(); internal_set_cursor_position(0, 0); Native.document.body.ontouchstart += e => { e.preventDefault(); e.stopPropagation(); e.touches[0].With( touch => { // how do we enter? enter_MultiMouseMode(); // exit by broswer history move? set_cursor_position(touch.clientX, touch.clientY); // ipad has 11 touchpoints. multiply that with the number of devices/ // for now we support 1 pointer per session :) if (e.touches.length == 1) mousedown(IEvent.MouseButtonEnum.Left); else mousedown(IEvent.MouseButtonEnum.Right); } ); }; Native.document.body.ontouchend += e => { e.preventDefault(); e.stopPropagation(); // ipad has 11 touchpoints. multiply that with the number of devices/ // for now we support 1 pointer per session :) if (e.touches.length == 0) mouseup(); else mousedown(IEvent.MouseButtonEnum.Left); }; Native.document.body.ontouchmove += e => { e.preventDefault(); e.stopPropagation(); e.touches[0].With( touch => { set_cursor_position(touch.clientX, touch.clientY); } ); }; #region onmessage bool disable_bind_reconfigure = false; Action<int, int> internal_reconfigure = delegate { }; Action<MessageEvent, XElement> internal_onmessage = (e, xml) => { device_onmessage(0, xml); }; Native.window.onmessage += e => { // who sent this? :P var source = (string)e.data; //var now = DateTime.Now; //Console.WriteLine(now + " " + source); var xml = XElement.Parse(source); internal_onmessage(e, xml); }; var friendly_devices = new { source_device_id = 0, f = default(Form), children = new { child_id = 0, fc = default(Form) }.ToEmptyList() }.ToEmptyList(); #region device_onmessage this.device_onmessage = (source_device_id, xml) => { // mothership to local network? // source_device_id = 0 means it came from one of our virtual screens? if (xml.Name.LocalName == "at_mousedown") { int button = int.Parse(xml.Attribute("button").Value); internal_mousedown((IEvent.MouseButtonEnum)button); } if (xml.Name.LocalName == "at_mouseup") { internal_mouseup(); } if (xml.Name.LocalName == "at_enter_MultiMouseMode") { internal_enter_MultiMouseMode(); } if (xml.Name.LocalName == "at_exit_MultiMouseMode") { internal_exit_MultiMouseMode(); } if (xml.Name.LocalName == "at_set_cursor_position") { int xx = int.Parse(xml.Attribute("x").Value); int yy = int.Parse(xml.Attribute("y").Value); internal_set_cursor_position(xx, yy); } }; #endregion var ListOfChildren = new { child_id = 0, fc = default(Form) }.ToEmptyList(); // when is this called? this.device_bind = (mothership_postXElement) => { // we might now be able to invoke the server, and via that any other device Console.WriteLine("device_bind"); #region at_enter_MultiMouseMode at_enter_MultiMouseMode += delegate { var xml = new XElement("at_enter_MultiMouseMode"); mothership_postXElement(xml); }; #endregion #region at_exit_MultiMouseMode at_exit_MultiMouseMode += delegate { mothership_postXElement(new XElement("at_exit_MultiMouseMode")); }; #endregion #region at_mousedown at_mousedown += button => { mothership_postXElement(new XElement("at_mousedown", new XAttribute("button", "" + (int)button))); }; #endregion #region at_mouseup at_mouseup += delegate { mothership_postXElement(new XElement("at_mouseup")); }; #endregion #region at_set_cursor_position at_set_cursor_position += (xx, yy) => { var xml = new XElement("at_set_cursor_position", // int not yet supported? new XAttribute("x", "" + xx), new XAttribute("y", "" + yy) ); mothership_postXElement( xml ); }; #endregion // now we can reply.. this.device_onmessage += (source_device_id, xml) => { #region at_virtualwindowsync_reconfigure if (source_device_id != 0) if (xml.Name.LocalName == "at_virtualwindowsync_reconfigure") { int __device_id = int.Parse(xml.Attribute("device_id").Value); if (__device_id == device_id) { // are we being reconfigured? friendly_devices.Where(k => k.source_device_id == source_device_id).WithEach( q => { int dx = int.Parse(xml.Attribute("dx").Value); int dy = int.Parse(xml.Attribute("dy").Value); disable_bind_reconfigure = true; q.f.MoveTo( fw.Left - dx, fw.Top - dy ); disable_bind_reconfigure = false; } ); } } #endregion #region at_virtualwindowsync if (source_device_id != 0) if (xml.Name.LocalName == "at_virtualwindowsync") { Console.WriteLine("got at_virtualwindowsync"); // do we know this device? var q = friendly_devices.FirstOrDefault(k => k.source_device_id == source_device_id); int w = int.Parse(xml.Attribute("w").Value); int h = int.Parse(xml.Attribute("h").Value); Action reposition = delegate { }; if (q == null) { var fc = new Form { Text = new { source_device_id }.ToString() }; q = new { source_device_id, f = fc, children = new { child_id = 0, fc = default(Form) }.ToEmptyList() }; friendly_devices.Add(q); q.f.StartPosition = FormStartPosition.Manual; q.f.Show(); // show should respect opacity? q.f.Opacity = 0.3; // where to put it? // left or right? var max_right = fvs.OwnedForms.Max(k => k.Right); var min_left = fvs.OwnedForms.Min(k => k.Left); if (source_device_id < device_id) q.f.Left = min_left - w; else q.f.Left = max_right; q.f.Top = fw.Top; q.f.Owner = fvs; var fcShadow = CreateShadow(q.f); Shadows.Add(fcShadow); #region from now on if we move any of our screens // in relation to this source_device_id we have to notify it Action SendDelta = delegate { var pdx = fc.Left - fw.Left; var pdy = fc.Top - fw.Top; mothership_postXElement( new XElement("at_virtualwindowsync_reconfigure", new XAttribute("device_id", "" + source_device_id), new XAttribute("dx", "" + pdx), new XAttribute("dy", "" + pdy) ) ); }; fw.LocationChanged += delegate { if (disable_bind_reconfigure) return; SendDelta(); }; fc.LocationChanged += delegate { if (disable_bind_reconfigure) return; SendDelta(); }; #endregion } // thanks for letting us know that you changed your size... q.f.Width = w; q.f.Height = h; xml.Elements("child").WithEach( cxml => { // any new children? int child_id = int.Parse(cxml.Attribute("child_id").Value); int pdx = int.Parse(cxml.Attribute("pdx").Value); int pdy = int.Parse(cxml.Attribute("pdy").Value); int cw = int.Parse(cxml.Attribute("w").Value); int ch = int.Parse(cxml.Attribute("h").Value); var cq = q.children.FirstOrDefault(k => k.child_id == child_id); if (cq == null) { var fc = new Form { Text = new { source_device_id, child_id }.ToString() }; cq = new { child_id, fc }; q.children.Add(cq); cq.fc.StartPosition = FormStartPosition.Manual; cq.fc.Show(); // show should respect opacity? cq.fc.Opacity = 0.2; // if this child needs to be between then add it // before reposition cq.fc.Owner = fvs; var fcShadow = CreateShadow(cq.fc); Shadows.Add(fcShadow); } cq.fc.Left = q.f.Left + pdx; cq.fc.Top = q.f.Top + pdy; // thanks for letting us know that you changed your size... cq.fc.Width = cw; cq.fc.Height = ch; } ); } #endregion }; // lets tell the world about virtual screens owned by us. // lets start by advertising our size. #region at_virtualwindowsync var t = new ScriptCoreLib.JavaScript.Runtime.Timer( delegate { // do we know whats the dx to other windows? var xml = new XElement("at_virtualwindowsync", // int not yet supported? new XAttribute("w", "" + fw.Width), new XAttribute("h", "" + fw.Height) ); #region what about children? ListOfChildren.WithEach( c => { var pdx = c.fc.Left - fw.Left; var pdy = c.fc.Top - fw.Top; xml.Add( new XElement("child", new XAttribute("child_id", "" + c.child_id), // int not yet supported? new XAttribute("pdx", "" + pdx), new XAttribute("pdy", "" + pdy), new XAttribute("w", "" + c.fc.Width), new XAttribute("h", "" + c.fc.Height) ) ); } ); #endregion mothership_postXElement( xml ); Console.WriteLine("sent at_virtualwindowsync"); } ); t.StartInterval(5000); #endregion }; Action<IWindow, Form> bind = (w, fc) => { this.device_bind(w.postXElement); internal_onmessage += (e, xml) => { if (xml.Name.LocalName == "reconfigure") { // how do we know this reconfigrue event is for us? if (e.source == w) { disable_bind_reconfigure = true; int dx = int.Parse(xml.Attribute("dx").Value); int dy = int.Parse(xml.Attribute("dy").Value); //Console.WriteLine("reconfigure " + new { dx, dy, fw.Left }); //fw.Left += dx; //fw.Top += dy; fc.MoveTo( fw.Left - dx, fw.Top - dy ); disable_bind_reconfigure = false; } } }; Action SendDelta = delegate { var pdx = fc.Left - fw.Left; var pdy = fc.Top - fw.Top; w.postXElement( new XElement("reconfigure", new XAttribute("dx", "" + pdx), new XAttribute("dy", "" + pdy) ) ); }; fw.LocationChanged += delegate { if (disable_bind_reconfigure) return; SendDelta(); }; fc.LocationChanged += delegate { if (disable_bind_reconfigure) return; SendDelta(); }; }; #endregion #region opener Native.window.opener.With( w => { // disable features page.info.Hide(); Console.WriteLine("we have opener: " + w.document.location.href); var fc = new Form { Text = "opener" }; fc.Owner = fvs; Action cAtResize = delegate { fc.Text = "Opener " + new { w.Width, w.Height }; fc.Width = w.Width / 4; fc.Height = w.Height / 4; }; w.onresize += delegate { cAtResize(); }; var ct = new ScriptCoreLib.JavaScript.Runtime.Timer( delegate { cAtResize(); } ); ct.StartInterval(1000 / 15); cAtResize(); fc.StartPosition = FormStartPosition.Manual; fc.Show(); fc.Opacity = 0.7; fc.BackColor = Color.Transparent; var fcShadow = CreateShadow(fc); Shadows.Add(fcShadow); Native.window.requestAnimationFrame += delegate { // ScriptCoreLib Windows Forms has a few bugs:P fc.MoveTo(fw.Left - fc.Width, fw.Top); bind(w, fc); }; } ); #endregion #region make info clickable page.info.onmousedown += e => { if (internal_ismousedown) return; e.stopPropagation(); }; page.info.ontouchstart += e => { if (internal_ismousedown) return; e.stopPropagation(); }; page.info.ontouchmove += e => { if (internal_ismousedown) return; e.stopPropagation(); }; page.info.ontouchend += e => { if (internal_ismousedown) return; e.stopPropagation(); }; #endregion #region OpenChildSession page.OpenChildSession.onclick += e => { e.preventDefault(); Console.WriteLine("open child session..."); Native.window.open( Native.Document.location.href, "_blank", 400, 400, true).With( w => { w.onload += delegate { if (w.document.location.href == "about:blank") return; Console.WriteLine("child onload " + w.document.location.href); var fc = new Form { Text = "child" }; Action cAtResize = delegate { fc.Text = "Child " + new { w.Width, w.Height }; fc.Width = w.Width / 4; fc.Height = w.Height / 4; VirtualScreenUpdate(); }; w.onresize += delegate { cAtResize(); }; var ct = new ScriptCoreLib.JavaScript.Runtime.Timer( delegate { cAtResize(); } ); ct.StartInterval(1000 / 2); //cAtResize(); fc.StartPosition = FormStartPosition.Manual; fc.Show(); fc.Opacity = 0.5; // first child could be a monitor to our right fc.MoveTo(fw.Right, fw.Top); fc.Owner = fvs; fc.BackColor = Color.Transparent; fc.Width = 400 / 4; fc.Height = 400 / 4; VirtualScreenUpdate(); fc.LocationChanged += delegate { VirtualScreenUpdate(); }; var fcShadow = CreateShadow(fc); Shadows.Add(fcShadow); var token = new { child_id = random.Next(), fc }; ListOfChildren.Add(token); #region FormClosing w.onbeforeunload += delegate { if (fc == null) return; w = null; ct.Stop(); fc.Close(); fc = null; }; Native.window.onbeforeunload += delegate { if (w == null) return; w.close(); w = null; }; fc.FormClosing += delegate { if (w == null) return; ListOfChildren.Remove(token); Shadows.Remove(fcShadow); fc = null; w.close(); w = null; }; #endregion bind(w, fc); }; } ); }; #endregion Native.document.documentElement.style.overflow = IStyle.OverflowEnum.hidden; }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { // Z:\jsc.svn\examples\javascript\io\DropLESTToDisplay\DropLESTToDisplay\Application.cs // http://xgis.maaamet.ee/xGIS/XGis?app_id=UU82&user_id=at&bbox=529464.185181536,6581178.67615528,549196.965601648,6593508.79911233&LANG=1 // http://www.maaamet.ee/rr/geo-lest/files/geo-lest_function_vba.txt // can we have a list of cities on ? var Helsinki = new { x = 6671069.664199971, y = 552396.6626611819 }; var Tallinn = new { x = 6589000.065127177, y = 542791.0230507818 }; var Haapsalu = new { x = 6533398.0, y = 480832.0 }; var Narva = new { x = 6589333.658324879, y = 737954.1228769943 }; var Tartu = new { x = 6474047.4766877275, y = 659622.4604005406 }; // alright lets do this. new { }.With( async delegate { await google.maps.api; var div = new IHTMLDiv { }.AttachToDocument(); div.style.border = "1px dashed red"; div.style.height = "300px"; div.style.left = "0px"; div.style.right = "0px"; // Z:\jsc.svn\examples\javascript\io\DropLESTToDisplay\DropLESTToDisplay\Application.cs var map = new google.maps.Map(div, new { center = new { lat = 59.4329527, lng = 24.7023564 }, zoom = 6.0 } ); var all = new[] { Helsinki, Tallinn, Haapsalu, Narva, Tartu }; all.WithEach( data => { var marker = new google.maps.Marker( new { position = new { lat = LEST97.lest_function_vba.lest_geo(data.x, data.y, 0), lng = LEST97.lest_function_vba.lest_geo(data.x, data.y, 1) }, //label = "T", //title = "Tallinn", map } ); } ); new IHTMLPre { () => new { map.getCenter().lat, map.getCenter().lng, x = LEST97.lest_function_vba.geo_lest( map.getCenter().lat, map.getCenter().lng, 0), y = LEST97.lest_function_vba.geo_lest( map.getCenter().lat, map.getCenter().lng, 1), } }.AttachToDocument(); // Cannot read property 'getSouthWest' of undefined new IHTMLPre { // rectangle.addListener('bounds_changed', showNewRect); delegate { if (map.getBounds() == null) { return "n/a"; } var getSouthWest_lat = map.getBounds().getSouthWest().lat; var getSouthWest_lng = map.getBounds().getSouthWest().lng; var getNorthEast_lat = map.getBounds().getNorthEast().lat; var getNorthEast_lng = map.getBounds().getNorthEast().lng; var count = ( from data in all let lat = (double)LEST97.lest_function_vba.lest_geo(data.x, data.y, 0) let lng = (double)LEST97.lest_function_vba.lest_geo(data.x, data.y, 1) // lng left to right // lng bottom to top where lat <= getNorthEast_lat where lng <= getNorthEast_lng where lat >= getSouthWest_lat where lng >= getSouthWest_lng select data ).Count(); return new { getSouthWest_lat, getSouthWest_lng, getNorthEast_lat, getNorthEast_lng, count }.ToString(); } }.AttachToDocument(); // http://stackoverflow.com/questions/2472957/how-can-i-change-the-color-of-a-google-maps-marker #region Add new IHTMLButton { "Add" }.AttachToDocument().onclick += delegate { var data = new { map.getCenter().lat, map.getCenter().lng, x = LEST97.lest_function_vba.geo_lest(map.getCenter().lat, map.getCenter().lng, 0), y = LEST97.lest_function_vba.geo_lest(map.getCenter().lat, map.getCenter().lng, 1), }; new IHTMLPre { "new { x = " + data.x + ", y = " + data.y + " }" }.AttachToDocument(); var marker = new google.maps.Marker( new { position = new { lat = LEST97.lest_function_vba.lest_geo(data.x, data.y, 0), lng = LEST97.lest_function_vba.lest_geo(data.x, data.y, 1) }, //label = "H", title = data.ToString(), map } ); }; #endregion #region Add Bounds new IHTMLButton { "Add Bounds" }.AttachToDocument().onclick += delegate { new google.maps.Marker( new { position = new { map.getBounds().getSouthWest().lat, map.getBounds().getSouthWest().lng, }, map } ); new google.maps.Marker( new { position = new { map.getBounds().getNorthEast().lat, map.getBounds().getNorthEast().lng, }, map } ); new google.maps.Marker( new { position = new { map.getBounds().getSouthWest().lat, map.getBounds().getNorthEast().lng, }, map } ); new google.maps.Marker( new { position = new { map.getBounds().getNorthEast().lat, map.getBounds().getSouthWest().lng, }, map } ); }; #endregion } ); }
public void Handler(WebServiceHandler h) { var HostUri = new { Host = h.Context.Request.Headers["Host"].TakeUntilIfAny(":"), Port = h.Context.Request.Headers["Host"].SkipUntilIfAny(":") }; if (HostUri.Port == "") HostUri = new { HostUri.Host, Port = "80" }; #region Authorization var Authorization = h.Context.Request.Headers["Authorization"]; var AuthorizationLiteralEncoded = Authorization.SkipUntilOrEmpty("Basic "); var AuthorizationLiteral = Encoding.ASCII.GetString( Convert.FromBase64String(AuthorizationLiteralEncoded) ); var AuthorizationLiteralCredentials = new { user = AuthorizationLiteral.TakeUntilOrEmpty(":"), password = AuthorizationLiteral.SkipUntilOrEmpty(":"), }; #endregion #if DEBUG Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(h.Context.Request.HttpMethod + " " + h.Context.Request.Path); Console.ForegroundColor = ConsoleColor.Red; if (!string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { Console.WriteLine(new { AuthorizationLiteralCredentials }.ToString()); } Console.ForegroundColor = ConsoleColor.Green; h.Context.Request.Headers.AllKeys.WithEach( k => Console.WriteLine(k + ": " + h.Context.Request.Headers[k]) ); h.Context.Request.Form.AllKeys.WithEach( k => Console.WriteLine(k + ": " + h.Context.Request.Form[k]) ); #endif #region WWWAuthenticate Action WWWAuthenticate = delegate { #if DEBUG Console.ForegroundColor = ConsoleColor.Magenta; Console.WriteLine("Hey, who are you?"); Console.ForegroundColor = ConsoleColor.Green; #endif h.Context.Response.StatusCode = 401; h.Context.Response.AddHeader( "WWW-Authenticate", "Basic realm=\"[email protected]\"" ); h.CompleteRequest(); }; #endregion #region /nuget if (h.Context.Request.Path == "/nuget") { if (string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { WWWAuthenticate(); return; } h.Context.Response.ContentType = "application/xml"; h.Context.Response.Write(@" <service xmlns:atom='http://www.w3.org/2005/Atom' xmlns:app='http://www.w3.org/2007/app' xmlns='http://www.w3.org/2007/app' xml:base='http://*****:*****@" <edmx:Edmx xmlns:edmx='http://schemas.microsoft.com/ado/2007/06/edmx' Version='1.0'> <edmx:DataServices xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' m:DataServiceVersion='2.0'> <Schema xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' xmlns='http://schemas.microsoft.com/ado/2006/04/edm' Namespace='NuGet.Server.DataServices'> <EntityType Name='Package' m:HasStream='true'> <Key> <PropertyRef Name='Id'/> <PropertyRef Name='Version'/> </Key> <Property Name='Id' Type='Edm.String' Nullable='false' m:FC_TargetPath='SyndicationTitle' m:FC_ContentKind='text' m:FC_KeepInContent='false'/> <Property Name='Version' Type='Edm.String' Nullable='false'/> <Property Name='Title' Type='Edm.String' Nullable='true'/> <Property Name='Authors' Type='Edm.String' Nullable='true' m:FC_TargetPath='SyndicationAuthorName' m:FC_ContentKind='text' m:FC_KeepInContent='false'/> <Property Name='IconUrl' Type='Edm.String' Nullable='true'/> <Property Name='LicenseUrl' Type='Edm.String' Nullable='true'/> <Property Name='ProjectUrl' Type='Edm.String' Nullable='true'/> <Property Name='DownloadCount' Type='Edm.Int32' Nullable='false'/> <Property Name='RequireLicenseAcceptance' Type='Edm.Boolean' Nullable='false'/> <Property Name='Description' Type='Edm.String' Nullable='true'/> <Property Name='Summary' Type='Edm.String' Nullable='true' m:FC_TargetPath='SyndicationSummary' m:FC_ContentKind='text' m:FC_KeepInContent='false'/> <Property Name='ReleaseNotes' Type='Edm.String' Nullable='true'/> <Property Name='Published' Type='Edm.DateTime' Nullable='false'/> <Property Name='LastUpdated' Type='Edm.DateTime' Nullable='false' m:FC_TargetPath='SyndicationUpdated' m:FC_ContentKind='text' m:FC_KeepInContent='false'/> <Property Name='Dependencies' Type='Edm.String' Nullable='true'/> <Property Name='PackageHash' Type='Edm.String' Nullable='true'/> <Property Name='PackageHashAlgorithm' Type='Edm.String' Nullable='true'/> <Property Name='PackageSize' Type='Edm.Int64' Nullable='false'/> <Property Name='Copyright' Type='Edm.String' Nullable='true'/> <Property Name='Tags' Type='Edm.String' Nullable='true'/> <Property Name='IsAbsoluteLatestVersion' Type='Edm.Boolean' Nullable='false'/> <Property Name='IsLatestVersion' Type='Edm.Boolean' Nullable='false'/> <Property Name='Listed' Type='Edm.Boolean' Nullable='false'/> <Property Name='VersionDownloadCount' Type='Edm.Int32' Nullable='false'/> </EntityType> <EntityContainer Name='PackageContext' m:IsDefaultEntityContainer='true'> <EntitySet Name='Packages' EntityType='NuGet.Server.DataServices.Package'/> <FunctionImport Name='Search' EntitySet='Packages' ReturnType='Collection(NuGet.Server.DataServices.Package)' m:HttpMethod='GET'> <Parameter Name='searchTerm' Type='Edm.String' Mode='In'/> <Parameter Name='targetFramework' Type='Edm.String' Mode='In'/> <Parameter Name='includePrerelease' Type='Edm.Boolean' Mode='In'/> </FunctionImport> <FunctionImport Name='FindPackagesById' EntitySet='Packages' ReturnType='Collection(NuGet.Server.DataServices.Package)' m:HttpMethod='GET'> <Parameter Name='id' Type='Edm.String' Mode='In'/> </FunctionImport> <FunctionImport Name='GetUpdates' EntitySet='Packages' ReturnType='Collection(NuGet.Server.DataServices.Package)' m:HttpMethod='GET'> <Parameter Name='packageIds' Type='Edm.String' Mode='In'/> <Parameter Name='versions' Type='Edm.String' Mode='In'/> <Parameter Name='includePrerelease' Type='Edm.Boolean' Mode='In'/> <Parameter Name='includeAllVersions' Type='Edm.Boolean' Mode='In'/> <Parameter Name='targetFrameworks' Type='Edm.String' Mode='In'/> </FunctionImport> </EntityContainer> </Schema> </edmx:DataServices> </edmx:Edmx> "); h.CompleteRequest(); return; } #endregion // linkedassets? var nugetoutput = new[] { new { TargetName = "TestNuGetSupport.Foo", Version = "0.0.0.1"}, new { TargetName = "TestNuGetSupport.FooForm", Version = "0.0.0.1"} }; #region /nuget/Search()/$count if (h.Context.Request.Path == "/nuget/Search()/$count") { if (string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { WWWAuthenticate(); return; } /* GET /nuget/Search()/$count?$filter=IsAbsoluteLatestVersion&searchTerm=''&targetFramework='net40'&includePrerelease=true HTTP/1.1 DataServiceVersion: 2.0;NetFx MaxDataServiceVersion: 2.0;NetFx User-Agent: NuGet Add Package Dialog/2.0.30625.9003 (Microsoft Windows NT 6.1.7601 Service Pack 1) Accept-Charset: UTF-8 Accept: text/plain Host: localhost:29019 Accept-Encoding: gzip, deflate ?< 0007 0x0103 bytes HTTP/1.1 200 OK Server: ASP.NET Development Server/11.0.0.0 Date: Sun, 21 Oct 2012 12:42:05 GMT X-AspNet-Version: 4.0.30319 DataServiceVersion: 2.0; Content-Length: 1 Cache-Control: no-cache Content-Type: text/plain;charset=utf-8 Connection: Close ?< 0007 0x0001 bytes 1 */ h.Context.Response.ContentType = "text/plain"; h.Context.Response.Write("" + nugetoutput.Length); h.CompleteRequest(); return; } #endregion #region /nuget/Search() if (h.Context.Request.Path == "/nuget/Search()") { if (string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { WWWAuthenticate(); return; } /* ?> 0008 0x01cf bytes GET /nuget/Search()?$filter=IsAbsoluteLatestVersion&$orderby=DownloadCount%20desc,Id&$skip=0&$top=30&searchTerm=''&targetFramework='net40'&includePrerelease=true HTTP/1.1 DataServiceVersion: 1.0;NetFx MaxDataServiceVersion: 2.0;NetFx User-Agent: NuGet Add Package Dialog/2.0.30625.9003 (Microsoft Windows NT 6.1.7601 Service Pack 1) Accept: application/atom+xml,application/xml Accept-Charset: UTF-8 Host: localhost:29019 Accept-Encoding: gzip, deflate ?< 0007 0x0001 bytes 1 */ h.Context.Response.ContentType = "application/atom+xml"; h.Context.Response.Write( @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?> <feed xml:base=""http://*****:*****@" <entry> <id>http://localhost:59019/nuget/Packages(Id='" + nupkg.TargetName + @"',Version='" + nupkg.Version + @"')</id> <title type=""text"">" + nupkg.TargetName + @"</title> <summary type=""text""></summary> <updated>2012-10-21T12:25:55Z</updated> <author> <name>jsc-solutions.net</name> </author> <link rel=""edit-media"" title=""Package"" href=""Packages(Id='" + nupkg.TargetName + @"',Version='" + nupkg.Version + @"')/$value"" /> <link rel=""edit"" title=""Package"" href=""Packages(Id='" + nupkg.TargetName + @"',Version='" + nupkg.Version + @"')"" /> <category term=""NuGet.Server.DataServices.Package"" scheme=""http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"" /> <content type=""application/zip"" src=""http://*****:*****@""" /> <m:properties xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"" xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices""> <d:Version>" + nupkg.Version + @"</d:Version> <d:Title m:null=""true"">foo x</d:Title> <d:IconUrl m:null=""true"">http://localhost:59019/assets/ScriptCoreLib/jsc.png</d:IconUrl> <d:LicenseUrl m:null=""true"">>http://jsc-solutions.net/license</d:LicenseUrl> <d:ProjectUrl m:null=""true"">>http://jsc-solutions.net/project</d:ProjectUrl> <d:DownloadCount m:type=""Edm.Int32"">200</d:DownloadCount> <d:RequireLicenseAcceptance m:type=""Edm.Boolean"">false</d:RequireLicenseAcceptance> <d:Description>$59.99 jsc-solutions.net</d:Description> <d:ReleaseNotes m:null=""true"">notes</d:ReleaseNotes> <d:Published m:type=""Edm.DateTime"">2012-10-21T10:55:45.4825886Z</d:Published> <d:Dependencies></d:Dependencies> <d:PackageHash>H0LvR29MtBUeY8bPDkTW6lHhQfixAGjxScIIC97XUJyu7wPmrdQQmbV3cgAelyBEWpn38kTtg8xVMe0ujhChGg==</d:PackageHash> <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm> <d:PackageSize m:type=""Edm.Int64"">4495</d:PackageSize> <d:Copyright m:null=""true""></d:Copyright> <d:Tags m:null=""true""></d:Tags> <d:IsAbsoluteLatestVersion m:type=""Edm.Boolean"">true</d:IsAbsoluteLatestVersion> <d:IsLatestVersion m:type=""Edm.Boolean"">true</d:IsLatestVersion> <d:Listed m:type=""Edm.Boolean"">false</d:Listed> <d:VersionDownloadCount m:type=""Edm.Int32"">100</d:VersionDownloadCount> <d:Summary m:null=""true""></d:Summary> </m:properties> </entry> ").Replace("localhost:59019", HostUri.Host + ":" + HostUri.Port); Console.WriteLine(u); h.Context.Response.Write( u ); } ); h.Context.Response.Write( @" </feed> ".Replace("localhost:59019", HostUri.Host + ":" + HostUri.Port) ); h.CompleteRequest(); return; } #endregion #region TestNuGetSupport.Foo.0.0.0.1.nupkg var x = "/api/v2/package/testnugetsupport.foo/0.0.0.1"; // anonymous extensions? var xx = nugetoutput.FirstOrDefault(k => h.Context.Request.Path == "/io/" + k.TargetName + "." + k.Version); if (xx != null) { #region AuthorizationLiteralCredentials if (string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { if (string.IsNullOrEmpty(AuthorizationLiteralCredentials.user)) { WWWAuthenticate(); return; } return; } #endregion var f = "assets/TestNuGetSupport.FeedServer/" + xx.TargetName + "." + xx.Version + ".nupkg"; // Could not find a part of the path 'V:\staging.net.debug\api\v2\package\testnugetsupport.foo\assets\TestNuGetSupport.FeedServer\TestNuGetSupport.Foo.0.0.0.1.nupkg'. // WebDev is relativet to request. h.Context.Response.WriteFile("/" + f); h.CompleteRequest(); return; } #endregion if (h.IsDefaultPath) { if (h.Context.Request.Headers["User-Agent"].StartsWith("NuGet/")) { // redirect that guy! h.Context.Response.Redirect("/nuget"); h.CompleteRequest(); } return; } if (h.Context.Request.Path == "/jsc") return; h.Context.Response.StatusCode = 500; h.CompleteRequest(); }