This commit is contained in:
adrianvic 2023-12-21 10:35:36 -03:00
commit 17e64af413
39 changed files with 17673 additions and 0 deletions

2
AppxBlockMap.xml Normal file

File diff suppressed because one or more lines are too long

25
AppxManifest.xml Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
<Identity Name="Microsoft.InkPad" Version="1.0.0.5" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" ProcessorArchitecture="neutral" />
<Properties>
<DisplayName>InkPad</DisplayName>
<PublisherDisplayName>Microsoft Corporation</PublisherDisplayName>
<Description>InkPad - A sample of modern inking</Description>
<Logo>images\inkPad_56x-store.png</Logo>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Prerequisites>
<OSMinVersion>6.2</OSMinVersion>
<OSMaxVersionTested>6.2</OSMaxVersionTested>
</Prerequisites>
<Applications>
<Application Id="Microsoft.SDKSamples.InkPad" StartPage="default.html">
<VisualElements DisplayName="InkPad" Logo="images\inkpad-tile.png" SmallLogo="images\inkPad-time_30x30.png" Description="SDK Sample" ForegroundText="dark" BackgroundColor="#b2815a" ToastCapable="false">
<DefaultTile ShortName="InkPad" ShowName="false" />
<SplashScreen BackgroundColor="white" Image="images\inkPad_splash.png" />
</VisualElements>
</Application>
</Applications>
</Package>

BIN
AppxSignature.p7x Normal file

Binary file not shown.

1296
animations.js Normal file

File diff suppressed because it is too large Load diff

1482
base.js Normal file

File diff suppressed because it is too large Load diff

1347
binding.js Normal file

File diff suppressed because it is too large Load diff

5603
controls.js vendored Normal file

File diff suppressed because it is too large Load diff

2109
css/Ui-light.css Normal file

File diff suppressed because it is too large Load diff

195
css/program.css Normal file
View file

@ -0,0 +1,195 @@

*
{
overflow: hidden;
-ms-scroll-rails: none;
-ms-content-zooming: none;
}
@media screen and (-ms-view-state: full-screen)
{
#canvasGroup
{
display: block;
position: fixed;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
width: 100%;
height: 100%;
}
}
@media screen and (-ms-view-state: fill)
{
#HighlightColors
{
display:none;
}
#HighlightWidth
{
display:none;
}
#bottomAppBar hr
{
display:none;
}
#canvasGroup
{
display: block;
position: fixed;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
width: 100%;
height: 100%;
}
}
@media screen and (-ms-view-state: snapped)
{
/* Docked */
#ModeErase
{
display:none;
}
#ModeSelect
{
display:none;
}
#InkColors
{
display:none;
}
#InkWidth
{
display:none;
}
#HighlightColors
{
display:none;
}
#HighlightWidth
{
display:none;
}
#More
{
display:none;
}
button.color
{
display:none;
}
#bottomAppBar hr
{
display:none;
}
#canvasGroup
{
display: block;
position: fixed;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
width: 100%;
height: 100%;
}
}
@media screen and (-ms-view-state: device-portrait)
{
#HighlightColors
{
display:none;
}
#HighlightWidth
{
display:none;
}
#bottomAppBar hr
{
display:none;
}
#canvasGroup
{
display: block;
position: fixed;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
width: 100%;
height: 100%;
}
}
/* ISSUE: Perhaps we can have a border on color buttons when in high contrast? */
@media screen and (-ms-high-contrast)
{
button.color, canvas.surface
{
-ms-high-contrast-adjust: none;
}
}
#statusMessage
{
position: relative;
z-index: 1000;
color: black;
font-size: 18pt;
height: 24px;
}
#canvasGroup
{
overflow: scroll;
z-index: 0;
}
canvas.surface
{
display: block;
position: absolute;
width: 100%;
height: 100%;
}
#HighlightCanvas
{
background-color: White;
z-index: 1;
}
#InkCanvas
{
background-color: rgba(0, 0, 0, 0.075);
z-index: 2;
}
#SelectCanvas
{
background-color: rgba(0, 0, 0, 0.0);
cursor: "url(images/erase.cur)";
z-index: 3;
}
.color-choice
{
float: left;
position: relative;
margin-bottom: 10px;
margin-right: 10px;
width: 73px;
height: 48px;
border: 1px solid #ffffff;
}
#RecoFlyout
{
color: black;
/* display: block; */
}

171
default.html Normal file
View file

@ -0,0 +1,171 @@
<!DOCTYPE html>
<html>
<head>
<title>InkPad</title>
<meta content="IE=10" http-equiv="X-UA-Compatible"/>
<!-- Include AppBar component -->
<link href="css/ui-light.css" rel="stylesheet" type="text/css"/>
<script src="base.js" type="text/javascript"></script>
<script src="ui.js" type="text/javascript"></script>
<script src="binding.js" type="text/javascript"></script>
<script src="controls.js" type="text/javascript"></script>
<script src="animations.js" type="text/javascript"></script>
<script src="wwaapp.js" type="text/javascript"></script>
<link href="css/program.css" rel="stylesheet" type="text/css"/>
<script src="program.js" type="text/javascript"></script>
<script>
// Stock appbar initialization
document.addEventListener("DOMContentLoaded", function() {WinJS.UI.processAll();}, false);
// Helper function to toggle the flyout
function toggleFlyout(flyoutElement, buttonElement)
{
var flyout = WinJS.UI.getControl(flyoutElement);
if (flyout && flyout.element.style.visibility !== "visible")
{
flyout.show(buttonElement, "top");
}
// else it will light-dismiss
}
</script>
</head>
<body role="application">
<div id="rootGrid">
<div id="content" aria-labelledby="featureLabel" role="main">
<!-- These 3 canvases are displayed directly on top of each other. -->
<div id="canvasGroup" aria-label="Ink canvas" role="img" >
<canvas id="HighlightCanvas" class="surface"></canvas>
<canvas id="InkCanvas" class="surface"></canvas>
<canvas id="SelectCanvas" class="surface"></canvas>
</div>
<!-- The statusMessage item displays status and error messages, and also the recognition results. -->
<div id="statusMessage" aria-label="Recognition results" aria-live="polite" role="region"></div>
<!-- The Reco Flyout contains 5 submit buttons laid out vertically.
At the time the form is displayed, we set the values of the buttons to the recognition alternates
for a specific word. All 5 buttons execute the same function, recoClipboard(), which
copies that value into the clipboard. -->
<div id="RecoFlyout" class="win-menu" aria-label="Reco options" data-win-control="WinJS.UI.Flyout" role="dialog">
<h4>Copy to clipboard:</h4>
<button id="Reco0" role="menuitem"></button>
<button id="Reco1" role="menuitem"></button>
<button id="Reco2" role="menuitem"></button>
<button id="Reco3" role="menuitem"></button>
<button id="Reco4" role="menuitem"></button>
</div>
<!-- This toolbar is displayed across the bottom of the screen.
The bottons are shown as cirles with icons in the middle. The color buttons have IDs
which are the names of colors; the ID of each one is fed directly into the strokeStyle
of the corresponding canvas. -->
<div id="bottomAppBar" aria-label="Command Bar" data-win-control="WinJS.UI.AppBar" data-win-options="{position:'bottom',transient:true,autoHide:0,lightDismiss:true}">
<div class="win-right">
<button id="Reco" class="win-command" >
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/Reco.png')"></span>
<span class="win-label">Recognize</span>
</button>
<button id="Find" class="win-command" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/Find.png')"></span>
<span class="win-label">Find</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="FindFlyout" class="win-menu" aria-label="Find" data-win-control="WinJS.UI.Flyout">
<h3>Find:</h3>
<input id="FindString" aria-label="Search string" maxlength="100" size="40" type="text" value=""/>
<br />
<button id="FindButton">Find</button>
</div>
<hr />
<button id="ModeErase" class="win-command" >
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/Eraser.png')"></span>
<span class="win-label">Erase</span>
</button>
<button id="ModeSelect" class="win-command" >
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/Lasso.png')"></span>
<span class="win-label">Select</span>
</button>
<hr />
<button id="InkColors" class="win-command" aria-haspopup="true" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/InkColors.png')"></span>
<span class="win-label">Color</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="InkColorFlyout" class="win-menu" aria-label="Ink Colors" data-win-control="WinJS.UI.Flyout">
<div id="Black" class="color-choice" style="background-color: Black;"></div>
<div id="Blue" class="color-choice" style="background-color: Blue;" ></div>
<div id="Red" class="color-choice" style="background-color: Red;" ></div>
<div id="Green" class="color-choice" style="background-color: Green;"></div>
</div>
<button id="InkWidth" class="win-command" aria-haspopup="true" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/InkWidth.png')"></span>
<span class="win-label">Width</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="InkWidthFlyout" class="win-menu" aria-label="Ink Widths" data-win-control="WinJS.UI.Flyout">
<button id="IW2" role="menuitem" value="2" >Smallest</button>
<button id="IW4" role="menuitem" value="4" >Small</button>
<button id="IW6" role="menuitem" value="6" >Medium</button>
<button id="IW8" role="menuitem" value="8" >Large</button>
<button id="IW10" role="menuitem" value="10">Largest</button>
</div>
<hr />
<button id="HighlightColors" class="win-command" aria-haspopup="true" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/HighlightColors.png')"></span>
<span class="win-label">Highlight Color</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="HighlightColorFlyout" class="win-menu" aria-label="Highlighter Colors" data-win-control="WinJS.UI.Flyout">
<div id="Yellow" class="color-choice" style="background-color: Yellow;"></div>
<div id="Aqua" class="color-choice" style="background-color: Aqua;" ></div>
<div id="Lime" class="color-choice" style="background-color: Lime;" ></div>
</div>
<button id="HighlightWidth" class="win-command" aria-haspopup="true" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/HighlightWidth.png')"></span>
<span class="win-label">Highlight Width</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="HighlightWidthFlyout" class="win-menu" aria-label="Highlighter Widths" data-win-control="WinJS.UI.Flyout">
<button id="HW10" role="menuitem" value="10">Small</button>
<button id="HW20" role="menuitem" value="20">Medium</button>
<button id="HW30" role="menuitem" value="30">Large</button>
</div>
<hr />
<button id="More" class="win-command" aria-haspopup="true" onclick="toggleFlyout(this.nextElementSibling, this);">
<span class="win-spritestates win-commandicon win-large" style="background-image:url('images/More.png')"></span>
<span class="win-label">More</span>
</button>
<!-- The onclick above expects this to immediately follow the button -->
<div id="MoreFlyout" class="win-menu" aria-label="More Commands" data-win-control="WinJS.UI.Flyout">
<button id="CopySelected" role="menuitem">Copy</button>
<button id="Paste" role="menuitem">Paste</button>
<button id="Load" role="menuitem">Load</button>
<button id="Save" role="menuitem">Save</button>
<button id="Clear" role="menuitem">Clear</button>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

BIN
images/Erase.cur Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

BIN
images/Eraser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

BIN
images/Find.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
images/HighlightColors.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

BIN
images/HighlightWidth.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
images/InkColors.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

BIN
images/InkWidth.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
images/Lasso.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
images/More.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
images/Reco.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
images/Select.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

BIN
images/Trash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
images/Width10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

BIN
images/Width2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

BIN
images/Width20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

BIN
images/Width30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,018 B

BIN
images/Width4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

BIN
images/Width6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

BIN
images/Width8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

BIN
images/inkPad_56x-store.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
images/inkPad_splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
images/inkpad-tile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

1798
program.js Normal file

File diff suppressed because it is too large Load diff

BIN
resources.pri Normal file

Binary file not shown.

2929
ui.js Normal file

File diff suppressed because it is too large Load diff

716
wwaapp.js Normal file
View file

@ -0,0 +1,716 @@
/// <loc filename="metadata\wwaapp_loc_oam.xml" format="messagebundle" />
/// <reference path='base.js' />
/// <reference path='wwaapp.js' />
/// <reference winrt='true' />
/*
© Microsoft. All rights reserved.
This library is supported for use in Windows Tailored Apps only.
Build: 6.2.8054.0
Version: 0.5
*/
(function (global, WinJS, undefined) {
var checkpointET = "checkpoint",
unloadET = "unload",
mainwindowactivatedET = "mainwindowactivated",
activatedET = "activated",
loadedET = "loaded",
readyET = "ready",
errorET = "error";
var pendingDrain;
function dispatchEvent(eventRecord) {
var promise = WinJS.Promise.as();
eventRecord.setPromise = function (p) {
promise = promise.then(function() { return p; });
};
eventRecord.detail = eventRecord.detail || {};
if (typeof(eventRecord.detail) === "object") {
eventRecord.detail.setPromise = eventRecord.setPromise;
}
try {
if (listeners._listeners) {
l = listeners._listeners[eventRecord.type];
if (l) {
l.forEach(function dispatchOne(e) { e.listener(eventRecord); });
}
}
// Fire built in listeners last, for checkpoint this is important
// as it lets our built in serialization see any mutations to
// app.sessionState
//
var l = builtInListeners[eventRecord.type];
if (l) {
l.forEach(function dispatchOne(e) { e(eventRecord); });
}
}
catch (err) {
queueEvent({type:errorET, detail:err});
}
return promise.then(function() {
if (eventRecord._deferral) {
eventRecord._deferral.complete();
}
});
}
function drainQueue(queue) {
pendingDrain = true;
if (queue.length === 0) {
if (eventQueue.length > 0) {
return drainQueue(copyAndClearQueue());
}
pendingDrain = false;
return WinJS.Promise.as(queue);
}
function drainNext() {
return drainQueue(queue.slice(1));
}
function drainError(err) {
queueEvent({type:errorET, detail:err});
return drainNext();
}
return dispatchEvent(queue[0]).
then(drainNext, drainError);
}
function queueEvent(eventRecord) {
/// <summary locid="1">
/// Queue an event to be processed by the WinJS.Application
/// </summary>
/// <param name="eventRecord" type="object" locid="2">
/// The event record is expected to have a type property which will be
/// used as the event name when dispatching on the WinJS.Application
/// event queue. The entire object will be provided to event listeners
/// in the detail property of the event.
/// </param>
eventQueue.push(eventRecord);
if (running && !pendingDrain) {
drainQueue(copyAndClearQueue());
}
}
function copyAndClearQueue() {
var queue = eventQueue;
eventQueue = [];
return queue;
}
var ListenerType = WinJS.Class.mix(WinJS.Class.define(null), WinJS.Utilities.eventMixin);
var listeners = new ListenerType();
var builtInListeners = {
mainwindowactivated: [
function (e) {
queueEvent({type: activatedET, detail: e});
}
],
activated: [
function () {
queueEvent({ type: readyET });
}
],
checkpoint: [
function(e) {
// comes from state.js
WinJS.Application._oncheckpoint(e);
}
]
};
var eventQueue = [ ];
var running = false;
// loaded == DOMContentLoaded
// mainwindowactivated == after WinRT Activated
// ready == after all of the above
//
var useWinRT = false;
if (window.Windows && Windows.UI) {
useWinRT = true;
var wui = Windows.UI.WebUI.WebUIApplication;
wui.addEventListener("activated", function (e) {
WinJS.Application._loadState(e).then(function () {
queueEvent({type: mainwindowactivatedET, detail: e});
});
});
function suspendingHandler(e) {
WinJS.Application.queueEvent({type:checkpointET, _deferral: e.suspendingOperation.getDeferral() });
}
wui.addEventListener("suspending", suspendingHandler, false);
}
document.addEventListener("DOMContentLoaded", function (e) {
queueEvent({ type: loadedET });
if (!useWinRT) {
var activatedArgs = {
arguments: "",
kind: "Windows.Launch",
previousExecutionState: 0 //Windows.ApplicationModel.Activation.ApplicationExecutionState.NotRunning
// UNDONE: tileId: e.tileId,
// UNDONE: splashScreen: e.splashScreen,
};
WinJS.Application._loadState(activatedArgs).then(function () {
queueEvent({ type: mainwindowactivatedET, detail:activatedArgs});
});
}
}, false);
window.addEventListener("beforeunload", function (e) {
queueEvent({type:checkpointET});
queueEvent({type:unloadET});
}, false);
WinJS.Namespace.defineWithParent(WinJS, "Application", {
stop: function() {
/// <summary locid="3">
/// Stop application event processing and reset the WinJS.Application
/// to its initial state
/// </summary>
listeners = new ListenerType();
running = false;
sawActivated = false;
sawLoaded = false;
queuedReady = false;
copyAndClearQueue();
},
addEventListener: function (eventType, listener, capture) {
/// <summary locid="4">
/// Adds an event listener to the control.
/// </summary>
/// <param name="eventType" locid="5">
/// The type (name) of the event.
/// </param>
/// <param name="listener" locid="6">
/// The listener to invoke when the event gets raised.
/// </param>
/// <param name="capture" locid="7">
/// Specifies whether or not to initiate capture.
/// </param>
listeners.addEventListener(eventType, listener, capture);
},
removeEventListener: function (eventType, listener, capture) {
/// <summary locid="8">
/// Removes an event listener from the control.
/// </summary>
/// <param name="eventType" locid="5">
/// The type (name) of the event.
/// </param>
/// <param name="listener" locid="9">
/// The listener to remove from the invoke list.
/// </param>
/// <param name="capture" locid="7">
/// Specifies whether or not to initiate capture.
/// </param>
listeners.removeEventListener(eventType, listener, capture);
},
checkpoint: function() {
/// <summary locid="10">
/// Queue a checkpoint event
/// </summary>
queueEvent({type:checkpointET});
},
start: function () {
/// <summary locid="11">
/// Start processing items in the WinJS.Application event queue
/// </summary>
var queue = copyAndClearQueue();
running = true;
drainQueue(queue);
},
queueEvent : queueEvent
});
Object.defineProperties(WinJS.Application, WinJS.Utilities.createEventProperties(checkpointET, unloadET, mainwindowactivatedET, activatedET, loadedET, readyET));
})(this, WinJS);
(function (WinJS, undefined) {
var navigatedEventName = "navigated";
var navigatingEventName = "navigating";
var beforenavigateEventName = "beforenavigate";
var ListenerType = WinJS.Class.mix(WinJS.Class.define(null), WinJS.Utilities.eventMixin);
var listeners = new ListenerType();
var history = {
backStack: [],
current: {location:"", initialPlaceholder: true},
forwardStack: []
};
var raiseBeforeNavigate = function (proposed) {
return WinJS.Promise.as().
then(function () {
var promise = WinJS.Promise.as();
var defaultPrevented = listeners.dispatchEvent(beforenavigateEventName, {
setPromise: function(p) { promise = p; },
location: proposed.location,
state: proposed.state
});
return promise.then(function beforeNavComplete() {
return defaultPrevented;
});
});
};
var raiseNavigating = function (delta) {
return WinJS.Promise.as().
then(function () {
var promise = WinJS.Promise.as();
listeners.dispatchEvent(navigatingEventName, {
setPromise: function(p) { promise = p; },
location: history.current.location,
state: history.current.state,
delta: delta
});
return promise;
});
};
var raiseNavigated = function(value, err) {
var promise = WinJS.Promise.as();
var detail = {
value: value,
location: history.current.location,
state: history.current.state,
setPromise: function(p) { promise = p; }
};
if (!value && err) {
detail.error = err;
}
listeners.dispatchEvent(navigatedEventName, detail);
return promise;
};
var go = function (distance, fromStack, toStack, delta) {
distance = Math.min(distance, fromStack.length);
if (distance > 0) {
return raiseBeforeNavigate(fromStack[fromStack.length-distance]).
then(function goBeforeCompleted(cancel) {
if (!cancel) {
toStack.push(history.current);
while (distance-1 != 0) {
distance--;
toStack.push(fromStack.pop());
}
history.current = fromStack.pop();
return raiseNavigating(delta).then(
raiseNavigated,
function (err) {
raiseNavigated(undefined, err || true);
throw err;
}).then(function() { return true; });
}
else {
return false;
}
});
}
return WinJS.Promise.wrap(false);
}
WinJS.Namespace.defineWithParent(WinJS, "Navigation", {
/// <field name="state" type="Boolean" locid="12">
/// True if we can navigate forwards
/// </field>
canGoForward: {
get: function () {
return history.forwardStack.length > 0;
}
},
/// <field name="state" type="Boolean" locid="13">
/// True if we can navigate backwards
/// </field>
canGoBack: {
get: function () {
return history.backStack.length > 0;
}
},
/// <field name="state" locid="14">
/// Current location
/// </field>
location: {
get: function () {
return history.current.location;
}
},
/// <field name="state" locid="15">
/// Navigation state
/// </field>
state: {
get: function () {
return history.current.state;
},
set: function (value) {
history.current.state = value;
}
},
/// <field name="history" locid="16">
/// Navigation history
/// </field>
history: {
get: function() {
return history;
},
set: function(value) {
var s = history = value;
// ensure the require fields are present
//
s.backStack = s.backStack || [];
s.forwardStack = s.forwardStack || [];
s.current = s.current || {location:"", initialPlaceholder:true};
s.current.location = s.current.location || "";
}
},
forward: function(distance) {
/// <summary locid="17">
/// Navigate forwards
/// </summary>
/// <param name="distance" type="Number" optional="true" locid="18">
/// The number of entries forward to go
/// </param>
/// <returns type="Promise" locid="19">
/// Promise which is completed with a Boolean value indicating whether or not
/// the navigation was successful
/// </returns>
distance = distance || 1;
return go(distance, history.forwardStack, history.backStack, distance);
},
back: function(distance) {
/// <summary locid="20">
/// Navigate backwards
/// </summary>
/// <param name="distance" type="Number" optional="true" locid="21">
/// The number of entries back into the history to go
/// </param>
/// <returns type="Promise" locid="19">
/// Promise which is completed with a Boolean value indicating whether or not
/// the navigation was successful
/// </returns>
distance = distance || 1;
return go(distance, history.backStack, history.forwardStack, -distance);
},
navigate: function (location, initialState) {
/// <summary locid="22">
/// Navigate to a location
/// </summary>
/// <param name="location" locid="23">
/// The location to navigate to. Generally the location is a string, but
/// it may be anything.
/// </param>
/// <param name="initialState" locid="24">
/// Navigation state which may be accessed through WinJS.Navigation.state
/// </param>
/// <returns type="Promise" locid="19">
/// Promise which is completed with a Boolean value indicating whether or not
/// the navigation was successful
/// </returns>
var proposed = { location:location, state: initialState };
return raiseBeforeNavigate(proposed).
then(function navBeforeCompleted(cancel) {
if (!cancel) {
if (!history.current.initialPlaceholder) {
history.backStack.push(history.current);
}
history.forwardStack = [];
history.current = proposed;
// error or no, we go from navigating -> navigated
// cancelation should be handled with "beforenavigate"
//
return raiseNavigating().then(
raiseNavigated,
function (err) {
raiseNavigated(undefined, err || true);
throw err;
}).then(function () { return true; });
}
else {
return false;
}
});
},
addEventListener: function (eventType, listener, capture) {
/// <summary>
/// Adds an event listener to the control.
/// </summary>
/// <param name='eventType'>
/// The type (name) of the event.
/// </param>
/// <param name='listener'>
/// The listener to invoke when the event gets raised.
/// </param>
/// <param name='capture'>
/// Specifies whether or not to initiate capture.
/// </param>
listeners.addEventListener(eventType, listener, capture);
},
removeEventListener: function (eventType, listener, capture) {
/// <summary>
/// Removes an event listener from the control.
/// </summary>
/// <param name='eventType'>
/// The type (name) of the event.
/// </param>
/// <param name='listener'>
/// The listener to remove from the invoke list.
/// </param>
/// <param name='capture'>
/// Specifies whether or not to initiate capture.
/// </param>
listeners.removeEventListener(eventType, listener, capture);
}
});
Object.defineProperties(WinJS.Navigation, WinJS.Utilities.createEventProperties(navigatedEventName, navigatingEventName, beforenavigateEventName));
})(WinJS);
(function () {
function initWithWinRT() {
var sto = Windows.Storage;
var local, temp, roaming;
var IOHelper = WinJS.Class.define(
function (folder) {
this.folder = folder;
this._path = folder.path;
}, {
exists: function (fileName) {
/// <summary locid="25">
/// Determines if the specified file exists in the container
/// </summary>
/// <param name="fileName" type="String" locid="26">
/// The file which may exist within this folder
/// </param>
/// <returns locid="27">
/// Promise with either true (file exists) or false.
/// </returns>
return this.folder.getFileAsync(fileName).
then(
function () { return true; },
function () { return false; }
);
},
remove: function (fileName) {
/// <summary locid="28">
/// Delets a file in the container
/// </summary>
/// <param name="fileName" type="String" locid="29">
/// The file to be deleted
/// </param>
/// <returns locid="30">
/// Promise which is fulfilled when the file has been deleted
/// </returns>
var that = this;
return that.folder.getFileAsync(fileName).
then(
function (fileItem) {
return fileItem.deleteAsync();
},
function() { return false; }
);
},
writeText: function (fileName, str) {
/// <summary locid="31">
/// Writes a file to the container with the specified text
/// </summary>
/// <param name="fileName" type="String" locid="32">
/// The file to write to
/// </param>
/// <param name="str" type="String" locid="33">
/// Content to be written to the file
/// </param>
/// <returns locid="34">
/// Promise with the count of characters written
/// </returns>
var that = this;
return that.folder.createFileAsync(fileName, sto.CreationCollisionOption.replaceExisting).
then(function (fileItem) {
return fileItem.openAsync(sto.FileAccessMode.readWrite);
}).then(function (randomAccessStream) {
var outputStream = randomAccessStream.getOutputStreamAt(0);
var writer = new Windows.Storage.Streams.DataWriter(outputStream);
var count = writer.writeString(str);
return writer.storeAsync().then(function() {
return outputStream.flushAsync().then(function() {
return count;
});
});
});
},
readText: function (fileName, def) {
/// <summary locid="35">
/// Reads the contents of a file from the container, if the file
/// doesn't exist, def is returned.
/// </summary>
/// <param name="fileName" type="String" locid="36">
/// The file to read from
/// </param>
/// <param name="def" type="String" locid="37">
/// Default value to be returned if the file failed to open
/// </param>
/// <returns locid="38">
/// Promise containing the contents of the file, or def.
/// </returns>
var that = this;
function onerror() { return def; }
return that.folder.getFileAsync(fileName).
then(function (fileItem) {
return fileItem.openAsync(sto.FileAccessMode.read).
then(function (randomAccessStream) {
var reader = new Windows.Storage.Streams.DataReader(randomAccessStream.getInputStreamAt(0));
var size = randomAccessStream.size;
return reader.loadAsync(size).then(function () {
var fileContents = reader.readString(size);
return (fileContents);
}, onerror);
}, onerror);
}, onerror);
}
});
WinJS.Namespace.define("WinJS.Application", {
local: { get: function() {
if (!local) {
local = new IOHelper(sto.ApplicationData.current.localFolder);
}
return local;
}},
temp: { get: function() {
if (!temp) {
temp = new IOHelper(sto.ApplicationData.current.temporaryFolder);
}
return temp;
}},
roaming: { get: function() {
if (!roaming) {
roaming = new IOHelper(sto.ApplicationData.current.roamingFolder);
}
return roaming;
}}
});
};
function initWithStub() {
var InMemoryHelper = WinJS.Class.define(
function () {
this.storage = {};
}, {
exists: function (fileName) {
/// <summary locid="25">
/// Determines if the specified file exists in the container
/// </summary>
/// <param name="fileName" type="String" locid="39">
/// The filename which may exist within this folder
/// </param>
/// <returns locid="27">
/// Promise with either true (file exists) or false.
/// </returns>
// force conversion to boolean
//
return WinJS.Promise.as(this.storage[fileName] !== undefined);
},
remove: function (fileName) {
/// <summary>
/// Delets a file in the container
/// </summary>
/// <param name='fileName' type='String'>
/// The file to be deleted
/// </param>
/// <returns>
/// Promise which is fulfilled when the file has been deleted
/// </returns>
delete this.storage[fileName];
return WinJS.Promise.as();
},
writeText: function (fileName, str) {
/// <summary locid="31">
/// Writes a file to the container with the specified text
/// </summary>
/// <param name="fileName" type="String" locid="40">
/// The filename to write to
/// </param>
/// <param name="str" type="String" locid="33">
/// Content to be written to the file
/// </param>
/// <returns locid="34">
/// Promise with the count of characters written
/// </returns>
this.storage[fileName] = str;
return WinJS.Promise.as(str.length);
},
readText: function (fileName, def) {
/// <summary locid="35">
/// Reads the contents of a file from the container, if the file
/// doesn't exist, def is returned.
/// </summary>
/// <param name="fileName" type="String" locid="41">
/// The filename to read from
/// </param>
/// <param name="def" type="String" locid="37">
/// Default value to be returned if the file failed to open
/// </param>
/// <returns locid="38">
/// Promise containing the contents of the file, or def.
/// </returns>
return WinJS.Promise.as(this.storage[fileName] || def);
}
}
);
WinJS.Namespace.define("WinJS.Application", {
local: new InMemoryHelper(),
temp: new InMemoryHelper(),
roaming: new InMemoryHelper()
});
}
if (window.Windows && Windows.Storage && Windows.Storage.ApplicationData) {
initWithWinRT();
}
else {
initWithStub();
}
WinJS.Namespace.define("WinJS.Application", {
sessionState: { value: {}, writable: true, enumerable: true },
_loadState: function (e) {
var app = WinJS.Application;
// we don't restore the state if we are already running, or if we are
// booting for the first time
//
if (e.previousExecutionState !== 0 /* ApplicationExecutionState.NotRunning */ && e.previousExecutionState !== 1 /* ApplicationExecutionState.CurrentlyRunning */) {
return app.local.readText("_sessionState.json", "{}").
then(function (str) {
app.sessionState = JSON.parse(str);
});
}
else {
return WinJS.Promise.as();
}
},
_oncheckpoint: function (e) {
var app = WinJS.Application;
e.setPromise(app.local.writeText("_sessionState.json", JSON.stringify(app.sessionState)));
}
});
})();