home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2008 January / Mac_easy_01_08.iso / Software / Office / papers.dmg / Papers.app / Contents / Headers / PapersExporterPluginProtocol.h next >
Encoding:
Text File  |  2007-11-01  |  16.7 KB  |  501 lines

  1. //
  2. //  PapersExporterPluginProtocol.h
  3. //
  4. //  Created by Alexander Griekspoor on Fri Jan 23 2007.
  5. //  Copyright (c) 2007 Mekentosj.com. All rights reserved.
  6. // 
  7. //  For use outside of the Papers application structure, please contact
  8. //  feedback@mekentosj.com
  9. //  DO NOT REDISTRIBUTE WITHOUT ALL THE FILES THAT ARE CONTAINED IN THE PACKAGE THAT INCLUDED THIS FILE
  10.  
  11. #import <Cocoa/Cocoa.h>
  12.  
  13.  
  14. /////////////////////////////////////////////////////////////
  15. /*  Exporting records
  16. Papers allows you through this protocol to write your own exporter plugins.
  17. These can not only be used to export files but to any kind of data or to any kind of medium.
  18. It's important to note that the plugin's method performExportOfRecords:toURL: runs in 
  19. its own thread, although you normally would not have to worry about that, keep 
  20. in mind that if you do fancy stuff you use "performMethodOnMainThread: to prevent
  21. trouble. The plugin signals it's progress to the delegate using a number of delegate 
  22. methods. Make sure you ALWAYS call the delegate methods to signal your progress.
  23. A normal cycle of the plugin would be:
  24.  
  25. Delegate -> Plugin        - (BOOL) readyToPerformExport;                        // Is the plugin Ready, if not importPreparationError is retrieved.
  26.  
  27. Delegate -> Plugin        - (void) performExportOfRecords: (NSDictionary *)records toURL: (NSURL *)url;    // Delegate provides plugin with records, initiates export.
  28.     
  29.         Delegate <- Plugin        - (void)didBeginExport:(id)sender;                // Plugin informs delegate that it has started.
  30.  
  31.         Delegate <- Plugin        - (void)updateStatus:(id)sender;                // Plugin informs delegate about status change (optional).
  32.  
  33.         Delegate <- Plugin        - (void)didEndExport:(id)sender;                // Plugin signals it's done.
  34.  
  35. Delegate -> Plugin        - (BOOL) successfulCompletion;                        // Delegate asks plugin if success, if not exportCompletionError is retrieved.
  36.  
  37. Delegate -> Plugin        - (void) performCleanup;                            // Allows the plugin to cleanup and reset for next export.
  38.  
  39. The structure of the dictionary containing objects to be exported is as follows. Note that not all fields maybe present except those marked as obligatory
  40.  
  41. Note that at the root of the dictionary contains one or more arrays named:
  42. - papers, an array containing dictionaries representing a paper.
  43. - authors, an array containing dictionaries representing an author.
  44. - journals, an array containing dictionaries representing a journal.
  45. - keywords, an array containing dictionaries representing a keyword.
  46. - publicationTypes, an array containing dictionaries representing a publication type.
  47.  
  48. And if you return YES on - (BOOL) shouldOpenSavePanel; you also get:
  49. - url, an NSURL object that was selected in the save panel
  50.  
  51. Each can only occur once and contains an array of the corresponding model dictionaries below.
  52. In the method - (NSArray *) exportableTypes; you have to indicate what you would like to export.
  53.  
  54. You can using the uri to uniquely identify an object within papers. The uri looks something like
  55. x-coredata://078EEF81-1736-4FA9-B794-18E70DD6FFA2/Paper/p599; 
  56. By replacing the x-coredata scheme by papers:// you can create a link from anywhere on the system
  57. back to this object, for instance by adding it to a custom exported HTML webpage.
  58. NOTE: these uris are not cross system compatible and only work for a particular library. To create
  59. true cross machine compatibility use the doi's or other identifiers. Papers also accepts urls
  60. like papers://doi/10.123/jem23.23 Only when those are unavailable you can use the uri.
  61.  
  62. Below follows an example for each category
  63. Unless otherwise noted NSStrings are expected for all field  
  64.  
  65. AUTHORS
  66. - correspondence
  67. - email
  68. - firstName
  69. - homepage
  70. - initials
  71. - lastName - required
  72. - mugshot (NSImage)
  73. - nickName
  74. - notes
  75. - uri
  76.  
  77. Example: 
  78.  
  79. <key>authors</key>
  80. <array>
  81.     <dict>
  82.         <key>correspondence</key>
  83.         <string>The European Bioinformatics Institute</string>
  84.         <key>email</key>
  85.         <string>mek@mekentosj.com</string>
  86.         <key>firstName</key>
  87.         <string>Alexander</string>
  88.         <key>homepage</key>
  89.         <string>http://mekentosj.com</string>
  90.         <key>initials</key>
  91.         <string>AC</string>
  92.         <key>lastName</key>
  93.         <string>Griekspoor</string>
  94.         <key>mugshot</key>
  95.         NSImage object
  96.         <key>nickName</key>
  97.         <string>Mek</string>
  98.         <key>notes</key>
  99.         <string>These are example notes</string>
  100.         <key>uri</key>
  101.         <string>A UNIQUE ID THAT CAN BE USED TO POINT TO THIS OBJECT WITHIN PAPERS</string>
  102.     </dict>
  103.     <dict>
  104.         .. next author ..
  105.     </dict>
  106. </array>
  107.  
  108.  
  109. JOURNALS
  110. - abbreviation
  111. - archives
  112. - authorGuidelines
  113. - cover (NSImage)
  114. - currentissue
  115. - etoc
  116. - homepage
  117. - impactFactor (NSNumber - Float)
  118. - issn
  119. - language
  120. - name - required
  121. - nlmID
  122. - notes
  123. - openAccess (NSNumber - BOOL)
  124. - publisher
  125. - startYear (NSNumber - Int)
  126. - summary
  127. - uri
  128.  
  129. Example: 
  130.  
  131. <key>journals</key>
  132. <array>
  133.     <dict>
  134.         <key>abbreviation</key>
  135.         <string>PLoS Biol.</string>
  136.         <key>archives</key>
  137.         <string>http://biology.plosjournals.org/perlserv/?request=get-archive&issn=1545-7885</string>
  138.         <key>authorGuidelines</key>
  139.         <string>http://journals.plos.org/plosbiology/guidelines.php</string>
  140.         <key>cover</key>
  141.         NSImage object
  142.         <key>currentissue</key>
  143.         <string>Vol. 4(12) December 2006</string>
  144.         <key>etoc</key>
  145.         <string>http://biology.plosjournals.org/perlserv/?request=get-toc&issn=1545-7885</string>
  146.         <key>homepage</key>
  147.         <string>http://biology.plosjournals.org/</string>
  148.         <key>impactFactor</key>
  149.         <real>14.2</real>
  150.         <key>issn</key>
  151.         <string>1545-7885</string>
  152.         <key>language</key>
  153.         <string>eng</string>
  154.         <key>name</key>
  155.         <string>PLoS Biology</string>
  156.         <key>nlmID</key>
  157.         <string>101183755</string>
  158.         <key>notes</key>
  159.         <string>More info here...</string>
  160.         <key>openAccess</key>
  161.         <true/>
  162.         <key>publisher</key>
  163.         <string>Public Library of Science</string>
  164.         <key>startYear</key>
  165.         <integer>2003</integer>
  166.         <key>summary</key>
  167.         <string>PLoS Biology is an open-access, peer-reviewed general biology journal published by the Public Library of Science (PLoS), a nonprofit organization of scientists and physicians committed to making the world's scientific and medical literature a public resource. New articles are published online weekly; issues are published monthly.</string>
  168.         <key>uri</key>
  169.         <string>A UNIQUE ID THAT CAN BE USED TO POINT TO THIS OBJECT WITHIN PAPERS</string>
  170.     </dict>
  171.     <dict>
  172.         .. next journal ..
  173.     </dict>
  174. </array>
  175.  
  176.  
  177. KEYWORDS
  178. - identifier
  179. - name - required
  180. - qualifier
  181. - type
  182. - subtype
  183. - uri
  184.  
  185. Example: 
  186.  
  187. <key>keywords</key>
  188. <array>
  189.     <dict>
  190.         <key>identifier</key>
  191.         <string>an identifier</string>
  192.         <key>name</key>
  193.         <string>Breast Cancer</string>
  194.         <key>qualifier</key>
  195.         <string>a qualifier</string>
  196.         <key>subtype</key>
  197.         <string>Major Topic</string>
  198.         <key>type</key>
  199.         <string>MeSH Heading</string>
  200.         <key>uri</key>
  201.         <string>A UNIQUE ID THAT CAN BE USED TO POINT TO THIS OBJECT WITHIN PAPERS</string>
  202.     </dict>
  203.     <dict>
  204.     .. next keyword ..
  205.     </dict>
  206. </array>
  207.  
  208.  
  209. PUBLICATION TYPES
  210. - name - required
  211. - uri
  212.  
  213. Example: 
  214.  
  215. <key>publicationTypes</key>
  216. <array>
  217.     <dict>
  218.         <key>name</key>
  219.         <string>Journal Article</string>
  220.         <key>uri</key>
  221.         <string>A UNIQUE ID THAT CAN BE USED TO POINT TO THIS OBJECT WITHIN PAPERS</string>
  222.     </dict>
  223.     <dict>
  224.     .. next publication type ..
  225.     </dict>
  226. </array>
  227.  
  228.  
  229. PAPERS
  230. -abstract
  231. -acceptedDate (NSDate)
  232. -affiliation
  233. -authors (NSArray of author dictionaries - see above)
  234. -category
  235. -doi
  236. -image (NSImage)
  237. -issue
  238. -journal (NSArray with a single journal dictionaries - see above)
  239. -keywords (NSArray of keywords dictionaries - see above)
  240. -label
  241. -language
  242. -notes
  243. -openAccess (NSNumber - BOOL)
  244. -pages
  245. -path (NOTE that providing a path to a pdf file will automatically invoke auto-archiving if enabled)
  246. -pii
  247. -pmid
  248. -publicationTypes (NSArray of publication type dictionaries - see above)
  249. -publishedDate (NSDate)
  250. -receivedDate (NSDate)
  251. -revisedDate (NSDate)
  252. -status
  253. -timesCited (NSNumber - Int)
  254. -title
  255. -uri
  256. -url
  257. -volume
  258. -year (NSNumber - Int)
  259.  
  260. Example: 
  261.  
  262. <key>Papers</key>
  263. <array>
  264.     <dict>
  265.         <key>abstract</key>
  266.         <string>MicroRNAs (miRNAs) interact with target...</string>
  267.         <key>acceptedDate</key>
  268.         NSDate object
  269.         <key>affiliation</key>
  270.         <string>Computational Biology Center</string>
  271.         <key>authors</key>
  272.             ... HERE AN ARRAY OF AUTHOR DICTIONARIES LIKE ABOVE ...
  273.         <array/>
  274.         <key>category</key>
  275.         <string>Journal Article</string>
  276.         <key>doi</key>
  277.         <string>10.1371/journal.pbio.0020363</string>
  278.         <key>image</key>
  279.         NSImage object
  280.         <key>issue</key>
  281.         <string>3</string>
  282.         <key>journal</key>
  283.             ... HERE AN ARRAY WITH A SINGLE JOURNAL DICTIONARY LIKE ABOVE ...
  284.         <array/>
  285.         <key>keywords</key>
  286.             ... HERE AN ARRAY OF KEYWORD DICTIONARIES LIKE ABOVE ...
  287.         <array/>
  288.         <key>label</key>
  289.         <string>Cell Biology</string>
  290.         <key>language</key>
  291.         <string>eng</string>
  292.         <key>notes</key>
  293.         <string>Here more info...</string>
  294.         <key>openAccess</key>
  295.         <true/>
  296.         <key>pages</key>
  297.         <string>e363</string>
  298.         <key>path</key>
  299.         <string>/Users/griek/Documents/Papers/1550875.pdf</string>
  300.         <key>pii</key>
  301.         <string>0020363</string>
  302.         <key>pmid</key>
  303.         <string>15502875</string>
  304.         <key>publicationTypes</key>
  305.             ... HERE AN ARRAY OF PUBLICATION TYPE DICTIONARIES LIKE ABOVE ...
  306.         <array/>
  307.         <key>publishedDate</key>
  308.         NSDate object
  309.         <key>receivedDate</key>
  310.         NSDate object
  311.         <key>revisedDate</key>
  312.         NSDate object
  313.         <key>status</key>
  314.         <string>In press</string>
  315.         <key>timesCited</key>
  316.         <integer>12</integer>
  317.         <key>title</key>
  318.         <string>Human MicroRNA targets</string>
  319.         <key>uri</key>
  320.         <string>A UNIQUE ID THAT CAN BE USED TO POINT TO THIS OBJECT WITHIN PAPERS</string>
  321.         <key>url</key>
  322.         <string>http://biology.plosjournals.org/perlserv/?request=get-document&doi=10.1371/journal.pbio.0020363</string>
  323.         <key>volume</key>
  324.         <string>2</string>
  325.         <key>year</key>
  326.         <integer>2006</integer>
  327.     </dict>
  328. </array>
  329.  
  330. SEE THE COMPLETE EXAMPLE PLIST THAT CAME WITH THIS PACKAGE. 
  331.  
  332. */
  333.  
  334. /////////////////////////////////////////////////////////////
  335.  
  336.  
  337.  
  338. /////////////////////////////////////////////////////////////
  339. /*  USING NSERRORS
  340. NSErrors are returned by two of the methods below in order to allow
  341. the main application to inform the user of problems that occur while 
  342. trying to use the plugin.  
  343. The domain should always be "Papers Exporter Error"
  344.  
  345. The user dictionary should have two keys:
  346. "title" and "description".  By default, they will be used to create
  347.  the text of an informative dialog as: "title:  description"
  348.  So design your messages accordingly.  
  349.  
  350.  PLEASE LOCALIZE YOUR MESSAGES WITHIN YOUR PLUGIN
  351.  Make sure the "title" and "description" keys are in an appropriate language by
  352.  the time the application gets the NSError.  This will allow the bundle to be
  353.  entirely self-contained.
  354.  Even if you don't know any other languages, provide the structure within your
  355.  plugin to allow others to do the localization.
  356.  
  357. ///////////////////////////////////////////////////////////// 
  358.     DEFINED ERROR CODES
  359.     use these for creating NSErrors that help inform the user 
  360.     why things aren't working (more may be added in response to
  361.     developer feedback)
  362.                                
  363. 0 - an unknown error                               
  364.                                
  365. // 1 series - problems with file/data
  366. 1 = Destination not writable
  367. 2 = No sufficient diskspace error
  368. 3 = Error parsing data
  369. 4 = Error writing file
  370.  
  371. // 100 series - networking problems
  372. 100 = No network available
  373. 101 = required host unreachable
  374. 102 = network timeout
  375. 103 = response format error
  376. 104 = URL opening error (NSWorkspace openURL: method returned NO)
  377.                     
  378. */
  379. /////////////////////////////////////////////////////////////
  380.  
  381.  
  382. /////////////////////////////////////////////////////////////
  383.  
  384.  
  385. // THESE ARE METHODS THE PLUGIN DELEGATE IMPLEMENTS AND YOU SHOULD CALL
  386.  
  387. @protocol PapersExporterPluginDelegate <NSObject>
  388.  
  389. // Signal the delegate that you started the export process
  390. // Allows the delegate to prepare the interface before displaying new data
  391. - (void)didBeginExport:(id)sender;    
  392.  
  393. // Signal the delegate that you are done. The delegate will inform how things went so be sure to set any errors and be ready
  394. // to answer didCompleteSuccessfully.
  395. - (void)didEndExport:(id)sender;                    
  396.  
  397. // Inform the delegate of a status change, use when statusString, exportedItems or itemsToExport changes.
  398. // Status updates are automatically issued by calling any of the methods above
  399. - (void)updateStatus:(id)sender;
  400.  
  401. @end
  402.  
  403.  
  404.  
  405.  
  406. typedef enum MTExportLimit
  407. {
  408.     MTExportLimitLibrary = 0,
  409.     MTExportLimitGroup = 1,
  410.     MTExportLimitSelection = 2
  411. } MTExportLimit;
  412.  
  413.  
  414. // THESE ARE METHODS YOUR PLUGIN SHOULD IMPLEMENT
  415. @protocol  PapersExporterPluginProtocol
  416.  
  417. // gives you a handle to the delegate object to which you deliver results and notify progress (see above)
  418. // do not retain the delegate
  419. - (id)delegate;
  420. - (void)setDelegate: (id)del;
  421.  
  422. // this should return an array of all menu items as strings.  Menu titles should be as descriptive as possible,
  423. // so that we don't have naming collisions.
  424. - (NSArray *) menuTitles;
  425.  
  426. // if your plugin writes files return YES, Papers will run the save panel for you (with the
  427. // accessoryView if required.
  428. // 
  429. // NOTE: that your plugin can import anything you like and doesn't have to start with a file. 
  430. // You can open a sheet, interact with a website, fetch data etc. Just return NO here in that case.
  431. - (BOOL) shouldShowSavePanel;
  432.  
  433. // indicate what filetypes your plugin can save, only relevant when you return YES to the above method.
  434. // return only 1 to set as a requiredFileType to be more strict
  435. - (NSArray *) allowedFileTypes;
  436.  
  437. // indicate what type of modelobjects you wish/can to export. Return an array with one or more of the following strings:
  438. // @"papers", @"authors", @"journals", @"keywords", @"publicationTypes". NOTE that you usually want to get @"Papers" only 
  439. // these do include the associated authors, journals, keywords and publication types. If only or in addition you wish to 
  440. // receive a separate array of these objects add the corresponding key to the array return by exportableTypes.
  441. - (NSArray *) exportableTypes;
  442.  
  443. // indicate the limit of objects you want to export. Return MTExportLimitLibrary to export the whole Papers library, MTExportLimitGroup
  444. // to select the currently selected group only, or MTExportLimitSelection to only export the selected papers. Note that you could
  445. // dynamically return this on the basis of a popup in your accessory view.
  446. - (MTExportLimit) exportLimit;
  447.  
  448. // if you would like to show options while the save panel is shown, return a custom view here and it will
  449. // be used as accessoryView. Otherwise return nil.
  450. - (NSView *) accessoryView;
  451.  
  452. // if you would like to customize the savepanel even further, set one up and return your own. 
  453. // Otherwise return nil for the default one.
  454. - (NSSavePanel *) savePanel;
  455.  
  456. // indicate whether this plugins needs an internet connection, if so Papers will check first if there is one.
  457. - (BOOL) requiresInternetConnection;
  458.  
  459. // the interface can be as complex as you wish, but please always show some form of progress and allow the
  460. // user to cancel the export. If you do not wish to show anything, at least show a minimum UI to show 
  461. // the progress (see example plugins).
  462.  
  463. // a method to make sure everything's set to go before starting, do some setup or tests here if necessary.
  464. // and a method to find out what the problems are if things aren't set. See above for usage of errorCodes.
  465. - (BOOL) readyToPerformExport;
  466. - (NSError *) exportPreparationError;
  467.  
  468. // Return YES if you support cancelling the current import session (strongly advised).
  469. - (BOOL)canCancelExport;
  470.  
  471. // this method is the main worker method and launches the export process, here you are handed over
  472. // the dictionary containing the exported objects. It also contains a key "url" with the URL that was selected in the save panel, 
  473. // this can be nil if you return NO to shouldShowOpenPanel, in case you want to ignore this argument anyway.
  474. // NOTE that this method runs in a separate thread. Signal your progress to the delegate.
  475. - (void) performExportOfRecords: (NSDictionary *)records;
  476.  
  477. // informs us that we should stop exporting. Since we're running in a thread we should check regularly
  478. // if we have been cancelled
  479. - (void) cancelExport;
  480.  
  481. // return the number of items you are about to export. As long as this value is nil an indeterminate
  482. // progress bar is shown, the moment you return a non-nil value for both the progress will be shown to the user. 
  483. // use in combination with the delegate method updateStatus: to push changes to the delegate and force an update.
  484. - (NSNumber *)itemsToExport;
  485. - (NSNumber *)exportedItems;
  486.  
  487. // return the current status of your plugin to inform the user. make sure these strings are localizable!
  488. // use in combination with the delegate method updateStatus: to push changes to the delegate and force an update.
  489. - (NSString *)statusString;
  490.  
  491. // A method to check whether the export finished properly
  492. // and one to get at any errors that resulted. See above for usage of errorCodes.
  493. - (BOOL) successfulCompletion;
  494. - (NSError *) exportCompletionError;
  495.  
  496. // let the plugin get rid of any data that needs to be reset for a new export.
  497. - (void) performCleanup;
  498.  
  499. @end
  500.  
  501.