forked from phonegap/phonegap-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2bd48df
commit 4e65f55
Showing
5 changed files
with
546 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.