From 2e782aecc5d3ca56ddde3de88d85b4e7c1c570fe Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Fri, 13 Mar 2015 15:23:04 +0200 Subject: [PATCH 1/5] initial commit --- apps/TelerikNEXT/main-page.xml | 2 +- ui/list-view/list-view-common.ts | 15 +++++++++++++++ ui/list-view/list-view.android.ts | 23 +++++++++++++++++++++++ ui/list-view/list-view.d.ts | 6 ++++++ ui/list-view/list-view.ios.ts | 17 +++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/apps/TelerikNEXT/main-page.xml b/apps/TelerikNEXT/main-page.xml index 141904a3f..46498d55c 100644 --- a/apps/TelerikNEXT/main-page.xml +++ b/apps/TelerikNEXT/main-page.xml @@ -45,7 +45,7 @@ - + diff --git a/ui/list-view/list-view-common.ts b/ui/list-view/list-view-common.ts index 7b18128c2..b0de612ee 100644 --- a/ui/list-view/list-view-common.ts +++ b/ui/list-view/list-view-common.ts @@ -5,6 +5,7 @@ import definition = require("ui/list-view"); import dependencyObservable = require("ui/core/dependency-observable"); import builder = require("ui/builder"); import label = require("ui/label"); +import color = require("color"); var ITEMS = "items"; var ITEMTEMPLATE = "itemTemplate"; @@ -12,6 +13,7 @@ var ISSCROLLING = "isScrolling"; var LISTVIEW = "ListView"; var ITEMSCHANGED = "_itemsChanged"; var CHANGE = "change"; +var SEPARATORCOLOR = "separatorColor"; export module knownEvents { export var itemLoading = "itemLoading"; @@ -45,6 +47,11 @@ function onItemTemplatePropertyChanged(data: dependencyObservable.PropertyChange export class ListView extends view.View implements definition.ListView { + public static separatorColorProperty = new dependencyObservable.Property( + SEPARATORCOLOR, + LISTVIEW, + new proxy.PropertyMetadata(undefined)); + public static itemsProperty = new dependencyObservable.Property( ITEMS, LISTVIEW, @@ -102,6 +109,14 @@ export class ListView extends view.View implements definition.ListView { this._setValue(ListView.isScrollingProperty, value); } + get separatorColor(): color.Color { + return this._getValue(ListView.separatorColorProperty); + } + set separatorColor(value: color.Color) { + this._setValue(ListView.separatorColorProperty, + value instanceof color.Color ? value : new color.Color(value)); + } + public refresh() { // } diff --git a/ui/list-view/list-view.android.ts b/ui/list-view/list-view.android.ts index cf043c171..c94fb8af1 100644 --- a/ui/list-view/list-view.android.ts +++ b/ui/list-view/list-view.android.ts @@ -3,6 +3,10 @@ import common = require("ui/list-view/list-view-common"); import viewModule = require("ui/core/view"); import layout = require("ui/layouts/layout"); import stackLayout = require("ui/layouts/stack-layout"); +import proxy = require("ui/core/proxy"); +import dependencyObservable = require("ui/core/dependency-observable"); +import color = require("color"); +import utils = require("utils/utils"); var ITEMLOADING = common.knownEvents.itemLoading; var LOADMOREITEMS = common.knownEvents.loadMoreItems; @@ -13,6 +17,21 @@ var REALIZED_INDEX = "realizedIndex"; declare var exports; require("utils/module-merge").merge(common, exports); +function onSeparatorColorPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var bar = data.object; + if (!bar.android) { + return; + } + + if (data.newValue instanceof color.Color) { + bar.android.setDivider(new android.graphics.drawable.ColorDrawable((data.newValue).android)); + bar.android.setDividerHeight(1); + } +} + +// register the setNativeValue callbacks +(common.ListView.separatorColorProperty.metadata).onSetNativeValue = onSeparatorColorPropertyChanged; + export class ListView extends common.ListView { private _android: android.widget.ListView; public _realizedItems = {}; @@ -161,6 +180,10 @@ class ListViewAdapter extends android.widget.BaseAdapter { return true; } + public areAllItemsEnabled (): boolean { + return true; + } + public getView(index: number, convertView: android.view.View, parent: any): android.view.View { if (!this._listView) { return null; diff --git a/ui/list-view/list-view.d.ts b/ui/list-view/list-view.d.ts index da3e5743e..c66a56be8 100644 --- a/ui/list-view/list-view.d.ts +++ b/ui/list-view/list-view.d.ts @@ -5,6 +5,7 @@ declare module "ui/list-view" { import observable = require("data/observable"); import dependencyObservable = require("ui/core/dependency-observable"); import view = require("ui/core/view"); + import color = require("color"); /** * Known event names. @@ -81,6 +82,11 @@ declare module "ui/list-view" { */ itemTemplate: string; + /** + * Gets or set the items separator line color of the ListView. + */ + separatorColor: color.Color; + /** * Forces the ListView to reload all its items. */ diff --git a/ui/list-view/list-view.ios.ts b/ui/list-view/list-view.ios.ts index ea4276b0a..4a2bb8ba2 100644 --- a/ui/list-view/list-view.ios.ts +++ b/ui/list-view/list-view.ios.ts @@ -3,6 +3,9 @@ import definition = require("ui/list-view"); import common = require("ui/list-view/list-view-common"); import utils = require("utils/utils"); import view = require("ui/core/view"); +import proxy = require("ui/core/proxy"); +import dependencyObservable = require("ui/core/dependency-observable"); +import color = require("color"); var CELLIDENTIFIER = "cell"; var ITEMLOADING = common.knownEvents.itemLoading; @@ -116,6 +119,20 @@ class UITableViewDelegateImpl extends NSObject implements UITableViewDelegate { } } +function onSeparatorColorPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var bar = data.object; + if (!bar.ios) { + return; + } + + if (data.newValue instanceof color.Color) { + bar.ios.separatorColor = (data.newValue).ios; + } +} + +// register the setNativeValue callbacks +(common.ListView.separatorColorProperty.metadata).onSetNativeValue = onSeparatorColorPropertyChanged; + export class ListView extends common.ListView { private _ios: UITableView; private _dataSource; From ae8b285fc03cd32a508ca636fb436be778903ed4 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Fri, 13 Mar 2015 15:03:18 +0200 Subject: [PATCH 2/5] Image-source modules refactoring --- CrossPlatformModules.csproj | 21 ++-- apps/tests/image-source-tests.ts | 7 +- apps/tests/ui/image/image-tests.ts | 1 - image-source/image-source-common.ts | 37 ++++++ image-source/image-source-native.android.ts | 68 ----------- image-source/image-source-native.d.ts | 11 -- image-source/image-source-native.ios.ts | 55 --------- image-source/image-source.android.ts | 112 +++++++++++++++++ image-source/image-source.d.ts | 27 ++-- image-source/image-source.ios.ts | 100 +++++++++++++++ image-source/image-source.ts | 129 -------------------- ui/enums/enums.d.ts | 30 +++-- ui/enums/enums.ts | 8 +- ui/image/image-common.ts | 33 ++--- 14 files changed, 309 insertions(+), 330 deletions(-) create mode 100644 image-source/image-source-common.ts delete mode 100644 image-source/image-source-native.android.ts delete mode 100644 image-source/image-source-native.d.ts delete mode 100644 image-source/image-source-native.ios.ts create mode 100644 image-source/image-source.android.ts create mode 100644 image-source/image-source.ios.ts delete mode 100644 image-source/image-source.ts diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index a2e24d433..17eab5445 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -135,6 +135,15 @@ + + image-source.d.ts + + + image-source.d.ts + + + image-source.d.ts + platform.d.ts @@ -198,14 +207,7 @@ http-request.d.ts - - image-source-native.d.ts - - - image-source-native.d.ts - - @@ -651,9 +653,6 @@ file-system.d.ts - - image-source.d.ts - location.d.ts @@ -1467,7 +1466,7 @@ False - + \ No newline at end of file diff --git a/apps/tests/image-source-tests.ts b/apps/tests/image-source-tests.ts index e819ec408..cf7cbfd4e 100644 --- a/apps/tests/image-source-tests.ts +++ b/apps/tests/image-source-tests.ts @@ -14,6 +14,7 @@ import imageSource = require("image-source"); import fs = require("file-system"); +import enums = require("ui/enums"); import app = require("application"); import TKUnit = require("./TKUnit"); import platform = require("platform"); @@ -73,7 +74,7 @@ export function testSaveToFile() { var img = imageSource.fromFile(imagePath); var folder = fs.knownFolders.documents(); var path = fs.path.join(folder.path, "Test.png"); - var saved = img.saveToFile(path, imageSource.ImageFormat.PNG); + var saved = img.saveToFile(path, enums.ImageFormat.png); // ``` // TKUnit.assert(saved, "Image not saved to file"); @@ -130,7 +131,7 @@ export function testBase64Encode_PNG() { } } - var result = img.toBase64String(imageSource.ImageFormat.PNG); + var result = img.toBase64String(enums.ImageFormat.png); TKUnit.assertEqual( result, expected, @@ -152,7 +153,7 @@ export function testBase64Encode_JPEG() { } } - var result = img.toBase64String(imageSource.ImageFormat.JPEG); + var result = img.toBase64String(enums.ImageFormat.jpeg); TKUnit.assertEqual( result, expected, diff --git a/apps/tests/ui/image/image-tests.ts b/apps/tests/ui/image/image-tests.ts index 9f2a88e40..3f491dcbd 100644 --- a/apps/tests/ui/image/image-tests.ts +++ b/apps/tests/ui/image/image-tests.ts @@ -36,7 +36,6 @@ var imagePath = __dirname + "../../logo.png"; export var test_Image_Members = function () { var image = new ImageModule.Image(); TKUnit.assert(types.isDefined(image.src), "Image.src is not defined"); - TKUnit.assert(types.isDefined(image.imageSource), "Image.imageSource is not defined"); TKUnit.assert(types.isDefined(image.isLoading), "Image.isLoading is not defined"); } diff --git a/image-source/image-source-common.ts b/image-source/image-source-common.ts new file mode 100644 index 000000000..2bbff7b3c --- /dev/null +++ b/image-source/image-source-common.ts @@ -0,0 +1,37 @@ +import http = require("http"); + +// This is used for definition purposes only, it does not generate JavaScript for it. +import definition = require("image-source"); + +var RESOURCE_PREFIX = "res://"; + +export function fromResource(name: string): definition.ImageSource { + var image = new definition.ImageSource(); + return image.loadFromResource(name) ? image : null; +} + +export function fromFile(path: string): definition.ImageSource { + var image = new definition.ImageSource(); + return image.loadFromFile(path) ? image : null; +} + +export function fromData(data: any): definition.ImageSource { + var image = new definition.ImageSource(); + return image.loadFromData(data) ? image : null; +} + +export function fromNativeSource(source: any): definition.ImageSource { + var image = new definition.ImageSource(); + return image.setNativeSource(source) ? image : null; +} + +export function fromUrl(url: string): Promise { + return http.getImage(url); +} + +export function fromFileOrResource(path: string): definition.ImageSource { + if (path.indexOf(RESOURCE_PREFIX) === 0) { + return fromResource(path.substr(RESOURCE_PREFIX.length)); + } + return fromFile(path); +} \ No newline at end of file diff --git a/image-source/image-source-native.android.ts b/image-source/image-source-native.android.ts deleted file mode 100644 index 53919ed2a..000000000 --- a/image-source/image-source-native.android.ts +++ /dev/null @@ -1,68 +0,0 @@ -import appModule = require("application"); - -export function fromResource(name: string) { - var androidApp = appModule.android; - var res = androidApp.context.getResources(); - if (res) { - var identifier: number = res.getIdentifier(name, 'drawable', androidApp.packageName); - if (0 < identifier) { - // Load BitmapDrawable with getDrawable to make use of Android internal caching - var bitmapDrawable = res.getDrawable(identifier); - if (bitmapDrawable && bitmapDrawable.getBitmap) { - return bitmapDrawable.getBitmap(); - } - } - } - - return null; -} - -export function fromFile(path: string) { - return android.graphics.BitmapFactory.decodeFile(path, null); -} - -export function fromData(data: any) { - return android.graphics.BitmapFactory.decodeStream(data); -} - -export function saveToFile(instance: android.graphics.Bitmap, path: string, format: number, quality = 100): boolean { - if (!instance) { - return false; - } - - var targetFormat = getTargetFromat(format); - - // TODO add exception handling - var outputStream = new java.io.BufferedOutputStream(new java.io.FileOutputStream(path)); - - var res = instance.compress(targetFormat, quality, outputStream); - outputStream.close(); - return res; -} - -export function toBase64String(instance: android.graphics.Bitmap, format: number, quality = 100): string { - if (!instance) { - return null;; - } - - var targetFormat = getTargetFromat(format); - - var outputStream = new java.io.ByteArrayOutputStream(); - var base64Stream = new android.util.Base64OutputStream(outputStream, android.util.Base64.NO_WRAP); - - instance.compress(targetFormat, quality, base64Stream); - - base64Stream.close(); - outputStream.close(); - - return outputStream.toString(); -} - -function getTargetFromat(format: number): android.graphics.Bitmap.CompressFormat { - switch (format) { - case 1: // JPEG - return android.graphics.Bitmap.CompressFormat.JPEG; - default: - return android.graphics.Bitmap.CompressFormat.PNG; - } -} \ No newline at end of file diff --git a/image-source/image-source-native.d.ts b/image-source/image-source-native.d.ts deleted file mode 100644 index 1b52383fa..000000000 --- a/image-source/image-source-native.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -//@private -/** - * This module is used as a native implementation for each of the underlying platforms. - * Users will not typically require it as it supports the module infrastructure. - */ -// -export declare function fromResource(name: string): any; -export declare function fromFile(path: string): any; -export declare function fromData(data: any): any; -export declare function saveToFile(instance: any, path: string, format: number, quality?: number): boolean; -export declare function toBase64String(instance: any, format: number, quality?: number): string; \ No newline at end of file diff --git a/image-source/image-source-native.ios.ts b/image-source/image-source-native.ios.ts deleted file mode 100644 index c88d9c095..000000000 --- a/image-source/image-source-native.ios.ts +++ /dev/null @@ -1,55 +0,0 @@ -export var fromResource = function (name: string) { - return UIImage.imageNamed(name); -} - -export var fromFile = function (path: string) { - return UIImage.imageWithContentsOfFile(path); -} - -export var fromData = function (data: any) { - return UIImage.imageWithData(data); -} - -export var saveToFile = function (instance: UIImage, path: string, format: number, quality?: number): boolean { - var res = false; - if (!instance) { - return res; - } - - var data = getImageData(instance, format, quality); - - if (data) { - res = data.writeToFileAtomically(path, true); - } - - return res; -} - -export function toBase64String(instance: UIImage, format: number, quality?: number): string { - var res = null; - if (!instance) { - return res; - } - - var data = getImageData(instance, format, quality); - - if (data) { - res = data.base64Encoding(); - } - - return res; -} - -function getImageData(instance: UIImage, format: number, quality: number): NSData { - var data = null; - switch (format) { - case 0: // PNG - data = UIImagePNGRepresentation(instance); - break; - case 1: // JPEG - data = UIImageJPEGRepresentation(instance, ('undefined' === typeof quality) ? 1.0 : quality); - break; - - } - return data; -} diff --git a/image-source/image-source.android.ts b/image-source/image-source.android.ts new file mode 100644 index 000000000..5c85f73f2 --- /dev/null +++ b/image-source/image-source.android.ts @@ -0,0 +1,112 @@ +import types = require("utils/types"); +import fs = require("file-system"); +import appModule = require("application"); +import definition = require("image-source"); +import common = require("image-source/image-source-common"); +import enums = require("ui/enums"); + +// merge the exports of the common file with the exports of this file +declare var exports; +require("utils/module-merge").merge(common, exports); + +export class ImageSource implements definition.ImageSource { + public android: android.graphics.Bitmap; + public ios: UIImage; + + public loadFromResource(name: string): boolean { + this.android = null; + + var androidApp = appModule.android; + var res = androidApp.context.getResources(); + if (res) { + var identifier: number = res.getIdentifier(name, 'drawable', androidApp.packageName); + if (0 < identifier) { + // Load BitmapDrawable with getDrawable to make use of Android internal caching + var bitmapDrawable = res.getDrawable(identifier); + if (bitmapDrawable && bitmapDrawable.getBitmap) { + this.android = bitmapDrawable.getBitmap(); + } + } + } + + return this.android != null; + } + + public loadFromFile(path: string): boolean { + var fileName = types.isString(path) ? path.trim() : ""; + if (fileName.indexOf("~/") === 0) { + fileName = fs.path.join(fs.knownFolders.currentApp().path, fileName.replace("~/", "")); + } + + this.android = android.graphics.BitmapFactory.decodeFile(fileName, null); + return this.android != null; + } + + public loadFromData(data: any): boolean { + this.android = android.graphics.BitmapFactory.decodeStream(data); + return this.android != null; + } + + public setNativeSource(source: any): boolean { + this.android = source; + return source != null; + } + + public saveToFile(path: string, format: string, quality = 100): boolean { + if (!this.android) { + return false; + } + + var targetFormat = getTargetFromat(format); + + // TODO add exception handling + var outputStream = new java.io.BufferedOutputStream(new java.io.FileOutputStream(path)); + + var res = this.android.compress(targetFormat, quality, outputStream); + outputStream.close(); + return res; + } + + public toBase64String(format: string, quality = 100): string { + if (!this.android) { + return null;; + } + + var targetFormat = getTargetFromat(format); + + var outputStream = new java.io.ByteArrayOutputStream(); + var base64Stream = new android.util.Base64OutputStream(outputStream, android.util.Base64.NO_WRAP); + + this.android.compress(targetFormat, quality, base64Stream); + + base64Stream.close(); + outputStream.close(); + + return outputStream.toString(); + } + + get height(): number { + if (this.android) { + return this.android.getHeight(); + } + + return NaN; + } + + get width(): number { + if (this.android) { + return this.android.getWidth(); + } + + return NaN; + } +} + +function getTargetFromat(format: string): android.graphics.Bitmap.CompressFormat { + switch (format) { + case enums.ImageFormat.jpeg: + return android.graphics.Bitmap.CompressFormat.JPEG; + default: + return android.graphics.Bitmap.CompressFormat.PNG; + } +} \ No newline at end of file diff --git a/image-source/image-source.d.ts b/image-source/image-source.d.ts index b4deaba7b..9ae5df5f5 100644 --- a/image-source/image-source.d.ts +++ b/image-source/image-source.d.ts @@ -3,22 +3,7 @@ */ declare module "image-source" { - /** - * Defines the recognized image formats. - */ - export enum ImageFormat { - /** - * The W3C Portable Network Graphics (PNG) image format. - */ - PNG, - - /** - * The Joint Photographic Experts Group (JPEG) image format. - */ - JPEG, - } - - /** + /** * Encapsulates the common abstraction behind a platform specific object (typically a Bitmap) that is used as a source for images. */ export class ImageSource { @@ -73,14 +58,14 @@ declare module "image-source" { * @param format The format (encoding) of the image. * @param quality Optional parameter, specifying the quality of the encoding. Defaults to the maximum available quality. */ - saveToFile(path: string, format: ImageFormat, quality?: number): boolean; + saveToFile(path: string, format: string, quality?: number): boolean; /** * Converts the image to base64 encoded string, using the provided image format and quality. * @param format The format (encoding) of the image. * @param quality Optional parameter, specifying the quality of the encoding. Defaults to the maximum available quality. */ - toBase64String(format: ImageFormat, quality?: number): string; + toBase64String(format: string, quality?: number): string; } /** @@ -113,4 +98,10 @@ declare module "image-source" { * @param url The link to the remote image object. This operation will download and decode the image. */ export function fromUrl(url: string): Promise; + + /** + * Creates a new ImageSource instance and loads it from the specified local file or resource(if spexified with "res://" prefix) + * @param path The location of the file on the file system. + */ + export function fromFileOrResource(path: string): ImageSource; } \ No newline at end of file diff --git a/image-source/image-source.ios.ts b/image-source/image-source.ios.ts new file mode 100644 index 000000000..3b191f6e8 --- /dev/null +++ b/image-source/image-source.ios.ts @@ -0,0 +1,100 @@ +import definition = require("image-source"); +import types = require("utils/types"); +import fs = require("file-system"); +import common = require("image-source/image-source-common"); +import enums = require("ui/enums"); + +// merge the exports of the common file with the exports of this file +declare var exports; +require("utils/module-merge").merge(common, exports); + +export class ImageSource implements definition.ImageSource { + public android: android.graphics.Bitmap; + public ios: UIImage; + + public loadFromResource(name: string): boolean { + this.ios = UIImage.imageNamed(name); + return this.ios != null; + } + + public loadFromFile(path: string): boolean { + var fileName = types.isString(path) ? path.trim() : ""; + + if (fileName.indexOf("~/") === 0) { + fileName = fs.path.join(fs.knownFolders.currentApp().path, fileName.replace("~/", "")); + } + + this.ios = UIImage.imageWithContentsOfFile(fileName); + return this.ios != null; + } + + public loadFromData(data: any): boolean { + this.ios = UIImage.imageWithData(data); + return this.ios != null; + } + + public setNativeSource(source: any): boolean { + this.ios = source; + return source != null; + } + + public saveToFile(path: string, format: string, quality?: number): boolean { + if (!this.ios) { + return false; + } + + var data = getImageData(this.ios, format, quality); + + if (data) { + return data.writeToFileAtomically(path, true); + } + + return false; + } + + public toBase64String(format: string, quality?: number): string { + var res = null; + if (!this.ios) { + return res; + } + + var data = getImageData(this.ios, format, quality); + + if (data) { + res = data.base64Encoding(); + } + + return res; + + } + + get height(): number { + if (this.ios) { + return this.ios.size.height; + } + + return NaN; + } + + get width(): number { + if (this.ios) { + return this.ios.size.width; + } + + return NaN; + } +} + +function getImageData(instance: UIImage, format: string, quality = 1.0): NSData { + var data = null; + switch (format) { + case enums.ImageFormat.png: // PNG + data = UIImagePNGRepresentation(instance); + break; + case enums.ImageFormat.jpeg: // JPEG + data = UIImageJPEGRepresentation(instance, quality); + break; + + } + return data; +} diff --git a/image-source/image-source.ts b/image-source/image-source.ts deleted file mode 100644 index 75a250408..000000000 --- a/image-source/image-source.ts +++ /dev/null @@ -1,129 +0,0 @@ -import native = require("image-source/image-source-native"); -import platform = require("platform"); -import types = require("utils/types"); -import fs = require("file-system"); -import http = require("http"); - -// This is used for definition purposes only, it does not generate JavaScript for it. -import definition = require("image-source"); - -export enum ImageFormat { - PNG, - JPEG, -} - -// TODO: Refactor into two files (.android.ts & .ios.ts); -export class ImageSource { - public android: android.graphics.Bitmap; - public ios: UIImage; - - constructor() { - this.setNativeInstance(null); - } - - public loadFromResource(name: string): boolean { - var nativeInstance = native.fromResource(name); - this.setNativeInstance(nativeInstance); - return nativeInstance != null; - } - - public loadFromFile(path: string): boolean { - var fileName = types.isString(path) ? path.trim() : ""; - - if (fileName.indexOf("~/") === 0) { - fileName = fs.path.join(fs.knownFolders.currentApp().path, fileName.replace("~/", "")); - } - - var nativeInstance = native.fromFile(fileName); - this.setNativeInstance(nativeInstance); - return (nativeInstance != null); - } - - public loadFromData(data: any): boolean { - var nativeInstance = native.fromData(data); - this.setNativeInstance(nativeInstance); - return (nativeInstance != null); - } - - public setNativeSource(source: any): boolean { - this.setNativeInstance(source); - return source != null; - } - - public saveToFile(path: string, format: ImageFormat, quality?: number): boolean { - return native.saveToFile(this.getNativeInstance(), path, format, quality); - } - - public toBase64String(format: ImageFormat, quality?: number): string { - return native.toBase64String(this.getNativeInstance(), format, quality); - } - - get height(): number { - // TODO: Refactor this, use class inheritance to overcome these switches - if (this.android) { - return this.android.getHeight(); - } - if (this.ios) { - return this.ios.size.height; - } - - return NaN; - } - - get width(): number { - // TODO: Refactor this, use class inheritance to overcome these switches - if (this.android) { - return this.android.getWidth(); - } - if (this.ios) { - return this.ios.size.width; - } - - return NaN; - } - - private setNativeInstance(instance: any) { - // TODO: Refactor this, use class inheritance to overcome these switches - if (platform.device.os === platform.platformNames.android) { - this.android = instance; - } else if (platform.device.os === platform.platformNames.ios) { - this.ios = instance; - } - } - - private getNativeInstance(): any { - // TODO: Refactor this, use class inheritance to overcome these switches - if (this.android) { - return this.android; - } - if (this.ios) { - return this.ios; - } - - return undefined; - } -} - -export function fromResource(name: string): ImageSource { - var image = new ImageSource(); - return image.loadFromResource(name) ? image : null; -} - -export function fromFile(path: string): ImageSource { - var image = new ImageSource(); - return image.loadFromFile(path) ? image : null; -} - -export function fromData(data: any): ImageSource { - var image = new ImageSource(); - return image.loadFromData(data) ? image : null; -} - -export function fromNativeSource(source: any): ImageSource { - var image = new ImageSource(); - return image.setNativeSource(source) ? image : null; -} - -export function fromUrl(url: string): Promise { - return http.getImage(url); -} \ No newline at end of file diff --git a/ui/enums/enums.d.ts b/ui/enums/enums.d.ts index 835945852..32a5b864a 100644 --- a/ui/enums/enums.d.ts +++ b/ui/enums/enums.d.ts @@ -9,25 +9,25 @@ * iOS: [UIKeyboardTypeNumbersAndPunctuation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIKeyboardType) */ export var datetime: string; - + /** * Android: [TYPE_CLASS_PHONE](http://developer.android.com/reference/android/text/InputType.html#TYPE_CLASS_PHONE) * iOS: [UIKeyboardTypePhonePad](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIKeyboardType) */ export var phone: string; - + /** * Android: [TYPE_CLASS_NUMBER](http://developer.android.com/reference/android/text/InputType.html#TYPE_CLASS_NUMBER) | android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL | [TYPE_NUMBER_FLAG_SIGNED](http://developer.android.com/reference/android/text/InputType.html#TYPE_NUMBER_FLAG_SIGNED) | [TYPE_NUMBER_FLAG_DECIMAL](http://developer.android.com/reference/android/text/InputType.html#TYPE_NUMBER_FLAG_DECIMAL) * iOS: [UIKeyboardTypeNumbersAndPunctuation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIKeyboardType) */ export var number: string; - + /** * Android: [TYPE_CLASS_TEXT](http://developer.android.com/reference/android/text/InputType.html#TYPE_CLASS_TEXT) | [TYPE_TEXT_VARIATION_URI](http://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_VARIATION_URI) * iOS: [UIKeyboardTypeURL](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIKeyboardType) */ export var url: string; - + /** * Android: [TYPE_CLASS_TEXT](http://developer.android.com/reference/android/text/InputType.html#TYPE_CLASS_TEXT) | [TYPE_TEXT_VARIATION_EMAIL_ADDRESS](http://developer.android.com/reference/android/text/InputType.html#TYPE_TEXT_VARIATION_EMAIL_ADDRESS) * iOS: [UIKeyboardTypeEmailAddress](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIKeyboardType) @@ -56,13 +56,13 @@ * iOS: [UIReturnKeyGo](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIReturnKeyType) */ export var go: string; - + /** * Android: [IME_ACTION_SEARCH](http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEARCH) * iOS: [UIReturnKeySearch](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIReturnKeyType) */ export var search: string; - + /** * Android: [IME_ACTION_SEND](http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEND) * iOS: [UIReturnKeySend](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/index.html#//apple_ref/c/tdef/UIReturnKeyType) @@ -304,11 +304,27 @@ * Capitalize the first letter of each sentence automatically. */ export var sentences: string; - + /** * Capitalize all characters automatically. */ export var allCharacters: string; } + + + /** + * Defines the recognized image formats. + */ + module ImageFormat { + /** + * The W3C Portable Network Graphics (PNG) image format. + */ + export var png: string; + + /** + * The Joint Photographic Experts Group (JPEG) image format. + */ + export var jpeg: string; + } } diff --git a/ui/enums/enums.ts b/ui/enums/enums.ts index 2b8e62bd9..e16a6082e 100644 --- a/ui/enums/enums.ts +++ b/ui/enums/enums.ts @@ -84,4 +84,10 @@ export module AutocapitalizationType { export var words: string = "words"; export var sentences: string = "sentences"; export var allCharacters: string = "allCharacters"; -} \ No newline at end of file +} + + +export module ImageFormat { + export var png: string = "png"; + export var jpeg: string = "jpeg"; +} diff --git a/ui/image/image-common.ts b/ui/image/image-common.ts index 6478fab01..e14b0fb50 100644 --- a/ui/image/image-common.ts +++ b/ui/image/image-common.ts @@ -15,54 +15,35 @@ var IMAGE = "Image"; var ISLOADING = "isLoading"; var STRETCH = "stretch"; -var RESOURCE_PREFIX = "res://"; - -function isResource(value: string): boolean { - return value.indexOf(RESOURCE_PREFIX) === 0; -} - function isUrl(value: string): boolean { return value.indexOf("http://") === 0 || value.indexOf("https://") === 0; } -function isAppFile(value: string): boolean { - return value.indexOf("~/") === 0; -} - -function isValidUrl(url: any): boolean { - if (!types.isString(url)) { - return false; - } - - var value = url ? url.trim() : ""; - return value !== "" && (isResource(value) || isAppFile(value) || isUrl(value)); +function isValidSrc(src: any): boolean { + return types.isString(src); } function onSrcPropertyChanged(data: dependencyObservable.PropertyChangeData) { var image = data.object; var value = data.newValue; - if (isValidUrl(value)) { + if (isValidSrc(value)) { value = value.trim(); image.imageSource = null; image["_url"] = value; image._setValue(Image.isLoadingProperty, true); - if (isResource(value)) { - image.imageSource = imageSource.fromResource(value.substr(RESOURCE_PREFIX.length)); - image._setValue(Image.isLoadingProperty, false); - } - else if (isAppFile(value)) { - image.imageSource = imageSource.fromFile(value); - image._setValue(Image.isLoadingProperty, false); - } else { + if (isUrl(value)) { imageSource.fromUrl(value).then((r) => { if (image["_url"] === value) { image.imageSource = r; image._setValue(Image.isLoadingProperty, false); } }); + } else { + image.imageSource = imageSource.fromFileOrResource(value); + image._setValue(Image.isLoadingProperty, false); } } else if (value instanceof imageSource.ImageSource) { From 047893a18bdce9cf81f875c00344da8af5766ca5 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Fri, 13 Mar 2015 16:56:29 +0200 Subject: [PATCH 3/5] Imporvements and lint fix --- image-source/image-source-common.ts | 15 +++++++++++++++ image-source/image-source.d.ts | 10 ++++++++-- ui/enums/enums.d.ts | 2 -- ui/enums/enums.ts | 1 - ui/image/image-common.ts | 12 ++++-------- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/image-source/image-source-common.ts b/image-source/image-source-common.ts index 2bbff7b3c..06f7f6028 100644 --- a/image-source/image-source-common.ts +++ b/image-source/image-source-common.ts @@ -1,4 +1,5 @@ import http = require("http"); +import types = require("utils/types"); // This is used for definition purposes only, it does not generate JavaScript for it. import definition = require("image-source"); @@ -30,8 +31,22 @@ export function fromUrl(url: string): Promise { } export function fromFileOrResource(path: string): definition.ImageSource { + if (!isFileOrResourcePath(path)) { + throw new Error("Path \"" + "\" is not a valid file or resource."); + } + if (path.indexOf(RESOURCE_PREFIX) === 0) { return fromResource(path.substr(RESOURCE_PREFIX.length)); } return fromFile(path); +} + +export function isFileOrResourcePath(path: string): boolean { + if (!types.isString(path)) { + return false; + } + + return path.indexOf("~/") === 0 || // relative to AppRoot + path.indexOf("/") === 0 || // absolute path + path.indexOf(RESOURCE_PREFIX) === 0; // resource } \ No newline at end of file diff --git a/image-source/image-source.d.ts b/image-source/image-source.d.ts index 9ae5df5f5..9d78e6451 100644 --- a/image-source/image-source.d.ts +++ b/image-source/image-source.d.ts @@ -4,8 +4,8 @@ declare module "image-source" { /** - * Encapsulates the common abstraction behind a platform specific object (typically a Bitmap) that is used as a source for images. - */ + * Encapsulates the common abstraction behind a platform specific object (typically a Bitmap) that is used as a source for images. + */ export class ImageSource { /** * Gets the height of this instance. This is a read-only property. @@ -104,4 +104,10 @@ declare module "image-source" { * @param path The location of the file on the file system. */ export function fromFileOrResource(path: string): ImageSource; + + /** + * Returns true if the specified path points to a resource or local file. + * @param path The path. + */ + export function isFileOrResourcePath(path: string): boolean } \ No newline at end of file diff --git a/ui/enums/enums.d.ts b/ui/enums/enums.d.ts index 32a5b864a..4d736060b 100644 --- a/ui/enums/enums.d.ts +++ b/ui/enums/enums.d.ts @@ -311,8 +311,6 @@ export var allCharacters: string; } - - /** * Defines the recognized image formats. */ diff --git a/ui/enums/enums.ts b/ui/enums/enums.ts index e16a6082e..1e0547bf9 100644 --- a/ui/enums/enums.ts +++ b/ui/enums/enums.ts @@ -86,7 +86,6 @@ export module AutocapitalizationType { export var allCharacters: string = "allCharacters"; } - export module ImageFormat { export var png: string = "png"; export var jpeg: string = "jpeg"; diff --git a/ui/image/image-common.ts b/ui/image/image-common.ts index e14b0fb50..b719f7a09 100644 --- a/ui/image/image-common.ts +++ b/ui/image/image-common.ts @@ -15,10 +15,6 @@ var IMAGE = "Image"; var ISLOADING = "isLoading"; var STRETCH = "stretch"; -function isUrl(value: string): boolean { - return value.indexOf("http://") === 0 || value.indexOf("https://") === 0; -} - function isValidSrc(src: any): boolean { return types.isString(src); } @@ -34,16 +30,16 @@ function onSrcPropertyChanged(data: dependencyObservable.PropertyChangeData) { image._setValue(Image.isLoadingProperty, true); - if (isUrl(value)) { + if (imageSource.isFileOrResourcePath(value)) { + image.imageSource = imageSource.fromFileOrResource(value); + image._setValue(Image.isLoadingProperty, false); + } else { imageSource.fromUrl(value).then((r) => { if (image["_url"] === value) { image.imageSource = r; image._setValue(Image.isLoadingProperty, false); } }); - } else { - image.imageSource = imageSource.fromFileOrResource(value); - image._setValue(Image.isLoadingProperty, false); } } else if (value instanceof imageSource.ImageSource) { From d19f5dfc4d07375903419fb60e739ebb9e01ac4b Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Mon, 16 Mar 2015 09:49:33 +0200 Subject: [PATCH 4/5] tslint error fixed --- ui/list-view/list-view.android.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/list-view/list-view.android.ts b/ui/list-view/list-view.android.ts index c94fb8af1..d3dea8145 100644 --- a/ui/list-view/list-view.android.ts +++ b/ui/list-view/list-view.android.ts @@ -6,7 +6,6 @@ import stackLayout = require("ui/layouts/stack-layout"); import proxy = require("ui/core/proxy"); import dependencyObservable = require("ui/core/dependency-observable"); import color = require("color"); -import utils = require("utils/utils"); var ITEMLOADING = common.knownEvents.itemLoading; var LOADMOREITEMS = common.knownEvents.loadMoreItems; From 64ecc682e028dee21ae191f1be05d11e3320ee5c Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Mon, 16 Mar 2015 09:56:28 +0200 Subject: [PATCH 5/5] obsolete adapter method removed --- ui/list-view/list-view.android.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/list-view/list-view.android.ts b/ui/list-view/list-view.android.ts index d3dea8145..80d3e6f8b 100644 --- a/ui/list-view/list-view.android.ts +++ b/ui/list-view/list-view.android.ts @@ -179,10 +179,6 @@ class ListViewAdapter extends android.widget.BaseAdapter { return true; } - public areAllItemsEnabled (): boolean { - return true; - } - public getView(index: number, convertView: android.view.View, parent: any): android.view.View { if (!this._listView) { return null;