Skip to content

Commit

Permalink
PrintPlugin CDV 1.5.0 support
Browse files Browse the repository at this point in the history
  • Loading branch information
RandyMcMillan committed Mar 26, 2012
1 parent 2bd48df commit 4e65f55
Show file tree
Hide file tree
Showing 5 changed files with 546 additions and 0 deletions.
43 changes: 43 additions & 0 deletions iOS/PrintPlugin/PrintPlugin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// PrintPlugin.h
// Print Plugin
//
// Created by Ian Tipton (github.com/itip) on 02/07/2011.
// Copyright 2011 Ian Tipton. All rights reserved.
// MIT licensed
//

#import <Foundation/Foundation.h>

#ifdef CORDOVA_FRAMEWORK
#import <Cordova/CDVPlugin.h>
#else
#import "CDVPlugin.h"
#endif


@interface PrintPlugin : 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;

@end
85 changes: 85 additions & 0 deletions iOS/PrintPlugin/PrintPlugin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Printer Plugin
* Copyright (c) 2011 Ian Tipton (github.com/itip)
* MIT licensed
*/

var PrintPlugin = 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);
};

var callbackName = 'window.plugins.printPlugin.callbackMap.' + key;
Cordova.exec("PrintPlugin.isPrintingAvailable", callbackName);
};

Cordova.addConstructor(function() {
if(!window.plugins){
window.plugins = {};
}
window.plugins.printPlugin = new PrintPlugin();
});
157 changes: 157 additions & 0 deletions iOS/PrintPlugin/PrintPlugin.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
//
// PrintPlugin.m
// Print Plugin
//
// Created by Ian Tipton (github.com/itip) on 02/07/2011.
// Copyright 2011 Ian Tipton. All rights reserved.
// MIT licensed
//

#import "PrintPlugin.h"

@interface PrintPlugin (Private)
-(void) doPrint;
-(void) callbackWithFuntion:(NSString *)function withData:(NSString *)value;
- (BOOL) isPrintServiceAvailable;
@end

@implementation PrintPlugin

@synthesize successCallback, failCallback, printHTML, dialogTopPos, dialogLeftPos;

/*
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) 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];

}

- (void) doPrint{
if (![self isPrintServiceAvailable]){
[self callbackWithFuntion:self.failCallback withData: @"{success: false, available: false}"];

return;
}

UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];

if (!controller){
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]];

[webViewPrint release];

}
else{
[self callbackWithFuntion:self.successCallback withData: @"{success: true, available: true}"];

[webViewPrint release];
}
};

/*
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];
} else {
[controller presentAnimated:YES completionHandler:completionHandler];
}
}
}

-(BOOL) isPrintServiceAvailable{

Class myClass = NSClassFromString(@"UIPrintInteractionController");
if (myClass) {
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
Loading

0 comments on commit 4e65f55

Please sign in to comment.