From 244ada61bceb3ab3f4c4be0ee31f9466d91c49db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastia=CC=81n=20Katzer?= Date: Sat, 10 Aug 2013 09:50:42 +0200 Subject: [PATCH] =?UTF-8?q?Printer=20Plugin=20f=C3=BCr=20iOS=20funktionier?= =?UTF-8?q?t=20f=C3=BCr=20cordova=203.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.xml | 2 +- src/ios/CDVPrinter.h | 51 +++++----- src/ios/CDVPrinter.m | 223 +++++++++++++++++++------------------------ www/printer.js | 114 +++++++--------------- 4 files changed, 158 insertions(+), 232 deletions(-) diff --git a/plugin.xml b/plugin.xml index 8c3063f..fcaffd1 100644 --- a/plugin.xml +++ b/plugin.xml @@ -15,7 +15,7 @@ - + diff --git a/src/ios/CDVPrinter.h b/src/ios/CDVPrinter.h index 0b67ee6..76d7b8e 100755 --- a/src/ios/CDVPrinter.h +++ b/src/ios/CDVPrinter.h @@ -1,38 +1,33 @@ -// -// PrintPlugin.h -// Print Plugin -// -// Created by Ian Tipton (github.com/itip) on 02/07/2011. -// Copyright 2011 Ian Tipton. All rights reserved. -// MIT licensed -// +/** + * Printer.m + * Cordova Printer Plugin + * + * Created by Sebastian Katzer (github.com/katzer) on 10/08/2013. + * Copyright 2013 Sebastian Katzer. All rights reserved. + * GPL v2 licensed + */ #import #import @interface CDVPrinter : CDVPlugin { - NSString* successCallback; - NSString* failCallback; - NSString* printHTML; - - //Options - NSInteger dialogLeftPos; - NSInteger dialogTopPos; + } -@property (nonatomic, copy) NSString* successCallback; -@property (nonatomic, copy) NSString* failCallback; -@property (nonatomic, copy) NSString* printHTML; - -//Print Settings -@property NSInteger dialogLeftPos; -@property NSInteger dialogTopPos; - -//Print HTML -- (void) print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - -//Find out whether printing is supported on this platform. -- (void) isPrintingAvailable:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +// Prints the content +- (void) print:(CDVInvokedUrlCommand*)command; +// Find out whether printing is supported on this platform +- (void) isServiceAvailable:(CDVInvokedUrlCommand*)command; @end + + +@interface CDVPrinter (Private) + +// Bereitet den Drucker-Kontroller vor +- (UIPrintInteractionController *) prepareController:(NSString*)content; +// Überprüft, ob der Drucker-Dienst verfügbar ist +- (BOOL) isPrintServiceAvailable; + +@end \ No newline at end of file diff --git a/src/ios/CDVPrinter.m b/src/ios/CDVPrinter.m index 10f46a7..6fdb8a0 100755 --- a/src/ios/CDVPrinter.m +++ b/src/ios/CDVPrinter.m @@ -1,153 +1,124 @@ -// -// PrintPlugin.m -// Print Plugin -// -// Created by Ian Tipton (github.com/itip) on 02/07/2011. -// Copyright 2011 Ian Tipton. All rights reserved. -// MIT licensed -// +/** + * Printer.m + * Cordova Printer Plugin + * + * Created by Sebastian Katzer (github.com/katzer) on 10/08/2013. + * Copyright 2013 Sebastian Katzer. All rights reserved. + * GPL v2 licensed + */ #import "CDVPrinter.h" -@interface CDVPrinter (Private) --(void) doPrint; --(void) callbackWithFuntion:(NSString *)function withData:(NSString *)value; -- (BOOL) isPrintServiceAvailable; -@end @implementation CDVPrinter -@synthesize successCallback, failCallback, printHTML, dialogTopPos, dialogLeftPos; - /* - Is printing available. Callback returns true/false if printing is available/unavailable. + * Is printing available. + * Callback returns true/false if printing is available/unavailable. */ -- (void) isPrintingAvailable:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options{ - NSUInteger argc = [arguments count]; - - if (argc < 1) { - return; - } - - - NSString *callBackFunction = [arguments objectAtIndex:0]; - [self callbackWithFuntion:callBackFunction withData: - [NSString stringWithFormat:@"{available: %@}", ([self isPrintServiceAvailable] ? @"true" : @"false")]]; - +- (void) isServiceAvailable:(CDVInvokedUrlCommand*)command { + CDVPluginResult *pluginResult = nil; + + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK + messageAsBool:[self isPrintServiceAvailable]]; + + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } -- (void) print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options{ - NSUInteger argc = [arguments count]; - - if (argc < 1) { - return; - } - self.printHTML = [arguments objectAtIndex:0]; - - if (argc >= 2){ - self.successCallback = [arguments objectAtIndex:1]; - } - - if (argc >= 3){ - self.failCallback = [arguments objectAtIndex:2]; - } - - if (argc >= 4){ - self.dialogLeftPos = [[arguments objectAtIndex:3] intValue]; - } - - if (argc >= 5){ - self.dialogTopPos = [[arguments objectAtIndex:4] intValue]; - } - - - - - [self doPrint]; +/** + * Öffnet den Drucker-Kontroller zur Auswahl des Druckers. + * Callback gibt Meta-Informationen an. + */ +- (void) print:(CDVInvokedUrlCommand*)command { + NSArray *arguments = [command arguments]; + CDVPluginResult *pluginResult = nil; -} + if (![self isPrintServiceAvailable]) { + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR + messageAsString:@"{success: false, available: false}"]; + + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; -- (void) doPrint{ - if (![self isPrintServiceAvailable]){ - [self callbackWithFuntion:self.failCallback withData: @"{success: false, available: false}"]; - return; } - - UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; - - if (!controller){ + + if ([arguments count] == 0) { + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR + messageAsString:@"{success: false, available: true}"]; + + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + return; } - - if ([UIPrintInteractionController isPrintingAvailable]){ - //Set the priner settings - UIPrintInfo *printInfo = [UIPrintInfo printInfo]; - printInfo.outputType = UIPrintInfoOutputGeneral; - controller.printInfo = printInfo; - controller.showsPageRange = YES; - - - //Set the base URL to be the www directory. - NSString *dbFilePath = [[NSBundle mainBundle] pathForResource:@"www" ofType:nil ]; - NSURL *baseURL = [NSURL fileURLWithPath:dbFilePath]; - - //Load page into a webview and use its formatter to print the page - UIWebView *webViewPrint = [[UIWebView alloc] init]; - [webViewPrint loadHTMLString:printHTML baseURL:baseURL]; - - //Get formatter for web (note: margin not required - done in web page) - UIViewPrintFormatter *viewFormatter = [webViewPrint viewPrintFormatter]; - controller.printFormatter = viewFormatter; - controller.showsPageRange = YES; - - - void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = - ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { - if (!completed || error) { - [self callbackWithFuntion:self.failCallback withData: - [NSString stringWithFormat:@"{success: false, available: true, error: \"%@\"}", error.localizedDescription]]; - - } - else{ - [self callbackWithFuntion:self.successCallback withData: @"{success: true, available: true}"]; - } - }; - - /* - If iPad, and if button offsets passed, then show dilalog originating from offset - */ - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && - dialogTopPos != 0 && dialogLeftPos != 0) { - [controller presentFromRect:CGRectMake(self.dialogLeftPos, self.dialogTopPos, 0, 0) inView:self.webView animated:YES completionHandler:completionHandler]; + + NSString *content = [arguments objectAtIndex:0]; + UIPrintInteractionController *controller = [self prepareController:content]; + + void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = + ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { + CDVPluginResult *pluginResult = nil; + + if (!completed || error) { + NSString *result = [NSString stringWithFormat:@"{success: false, available: true, error: \"%@\"}", error.localizedDescription]; + + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR + messageAsString:result]; + } else { - [controller presentAnimated:YES completionHandler:completionHandler]; + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK + messageAsString:@"{success: true, available: true}"]; } - } + + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }; + + [controller presentAnimated:YES completionHandler:completionHandler]; } --(BOOL) isPrintServiceAvailable{ - - Class myClass = NSClassFromString(@"UIPrintInteractionController"); - if (myClass) { +/** + * Bereitet den Drucker-Kontroller vor. + * + * @param {NSString} content Der zu druckende Inhalt + */ +- (UIPrintInteractionController *) prepareController:(NSString *)content { + UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; + + //Set the priner settings + UIPrintInfo *printInfo = [UIPrintInfo printInfo]; + printInfo.outputType = UIPrintInfoOutputGeneral; + controller.printInfo = printInfo; + controller.showsPageRange = YES; + + //Set the base URL to be the www directory. + NSString *wwwFilePath = [[NSBundle mainBundle] pathForResource:@"www" ofType:nil ]; + NSURL *baseURL = [NSURL fileURLWithPath:wwwFilePath]; + + //Load page into a webview and use its formatter to print the page + UIWebView *webViewPrint = [[UIWebView alloc] init]; + [webViewPrint loadHTMLString:content baseURL:baseURL]; + + //Get formatter for web (note: margin not required - done in web page) + UIViewPrintFormatter *viewFormatter = [webViewPrint viewPrintFormatter]; + controller.printFormatter = viewFormatter; + controller.showsPageRange = YES; + + return controller; +} + +/** + * Überprüft, ob der Drucker-Dienst verfügbar ist. + */ +- (BOOL) isPrintServiceAvailable { + Class printController = NSClassFromString(@"UIPrintInteractionController"); + + if (printController) { UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; + return (controller != nil) && [UIPrintInteractionController isPrintingAvailable]; } - - + + return NO; } -#pragma mark - -#pragma mark Return messages - --(void) callbackWithFuntion:(NSString *)function withData:(NSString *)value{ - if (!function || [@"" isEqualToString:function]){ - return; - } - - NSString* jsCallBack = [NSString stringWithFormat:@"%@(%@);", function, value]; - [self writeJavascript: jsCallBack]; -} - @end diff --git a/www/printer.js b/www/printer.js index 41005a5..43eba77 100755 --- a/www/printer.js +++ b/www/printer.js @@ -1,86 +1,46 @@ - /** - * Printer Plugin - * Copyright (c) 2011 Ian Tipton (github.com/itip) - * MIT licensed + * Printer.m + * Cordova Printer Plugin + * + * Created by Sebastian Katzer (github.com/katzer) on 10/08/2013. + * Copyright 2013 Sebastian Katzer. All rights reserved. + * GPL v2 licensed */ -var PrintPlugin = function() { +var Printer = function () { -} - -PrintPlugin.prototype.callbackMap = {}; -PrintPlugin.prototype.callbackIdx = 0; - -/* - print - html string or DOM node (if latter, innerHTML is used to get the contents). REQUIRED. - success - callback function called if print successful. {success: true} - fail - callback function called if print unsuccessful. If print fails, {error: reason}. If printing not available: {available: false} - options - {dialogOffset:{left: 0, right: 0}}. Position of popup dialog (iPad only). - */ -PrintPlugin.prototype.print = function(printHTML, success, fail, options) { - if (typeof printHTML != 'string'){ - console.log("Print function requires an HTML string. Not an object"); - return; - } - - - //var printHTML = ""; - - var dialogLeftPos = 0; - var dialogTopPos = 0; - - - if (options){ - if (options.dialogOffset){ - if (options.dialogOffset.left){ - dialogLeftPos = options.dialogOffset.left; - if (isNaN(dialogLeftPos)){ - dialogLeftPos = 0; - } - } - if (options.dialogOffset.top){ - dialogTopPos = options.dialogOffset.top; - if (isNaN(dialogTopPos)){ - dialogTopPos = 0; - } - } - } - } - - var key = 'print' + this.callbackIdx++; - window.plugins.printPlugin.callbackMap[key] = { - success: function(result) { - delete window.plugins.printPlugin.callbackMap[key]; - success(result); - }, - fail: function(result) { - delete window.plugins.printPlugin.callbackMap[key]; - fail(result); - } - }; - - var callbackPrefix = 'window.plugins.printPlugin.callbackMap.' + key; - return cordova.exec("PrintPlugin.print", printHTML, callbackPrefix + '.success', callbackPrefix + '.fail', dialogLeftPos, dialogTopPos); }; -/* - * Callback function returns {available: true/false} - */ -PrintPlugin.prototype.isPrintingAvailable = function(callback) { - var key = 'isPrintingAvailable' + this.callbackIdx++; - window.plugins.printPlugin.callbackMap[key] = function(result) { - delete window.plugins.printPlugin.callbackMap[key]; - callback(result); - }; +Printer.prototype = { + /** + * Überprüft, ob der Drucker-Dienst verfügbar ist. + * + * @param {Function} callback + * @return {Boolean} + */ + isServiceAvailable: function (callback) { + cordova.exec(callback, null, 'Printer', 'isServiceAvailable', []); + }, - var callbackName = 'window.plugins.printPlugin.callbackMap.' + key; - cordova.exec("PrintPlugin.isPrintingAvailable", callbackName); + /** + * Übergibt den HTML-Content an den Drucker-Dienst. + * + * @param {String} content html string or DOM node (if latter, innerHTML is used to get the contents) + * @param {Function?} success callback function called if print successful. {success: true} + * @param {Function?} failure callback function called if print unsuccessful. If print fails, {error: reason}. If printing not available: {available: false} + */ + print: function (content, success, failure) { + content = content.innerHTML || content; + + if (typeof content != 'string') { + console.log('Print function requires an HTML string. Not an object'); + return; + } + + cordova.exec(success, failure, 'Printer', 'print', [content]); + } }; -cordova.addConstructor(function() { - if(!window.plugins){ - window.plugins = {}; - } - window.plugins.printPlugin = new PrintPlugin(); -}); \ No newline at end of file +var printer = new Printer(); + +module.exports = printer; \ No newline at end of file