Skip to content

Commit

Permalink
Merge pull request #521 from barijaona/bugfixes
Browse files Browse the repository at this point in the history
Fix issue #520
  • Loading branch information
barijaona committed Oct 24, 2015
2 parents 9af82e5 + a2126d7 commit 03078fc
Show file tree
Hide file tree
Showing 11 changed files with 74 additions and 26 deletions.
4 changes: 2 additions & 2 deletions Interfaces/MainMenu.nib/designable.nib

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified Interfaces/MainMenu.nib/keyedobjects.nib
Binary file not shown.
2 changes: 1 addition & 1 deletion src/AppController.h
Expand Up @@ -48,7 +48,6 @@
{
IBOutlet BJRWindowWithToolbar * mainWindow;
IBOutlet ArticleController * articleController;
IBOutlet FoldersTree * foldersTree;
IBOutlet NSSplitView * splitView1;
IBOutlet NSView * exportSaveAccessory;
IBOutlet NSView * searchView;
Expand Down Expand Up @@ -104,6 +103,7 @@

@property (weak, nonatomic, readonly) NSWindowController *preferencesWindowController;
@property(nonatomic, strong) NewSubscription *rssFeed;
@property(nonatomic, strong) IBOutlet FoldersTree * foldersTree;

// Menu action items
-(IBAction)handleAbout:(id)sender;
Expand Down
4 changes: 2 additions & 2 deletions src/AppController.m
Expand Up @@ -133,6 +133,7 @@ -(IBAction)cancelAllRefreshesToolbar:(id)sender;
@implementation AppController

@synthesize rssFeed = _rssFeed;
@synthesize foldersTree;

/* init
* Class instance initialisation.
Expand Down Expand Up @@ -1449,8 +1450,7 @@ -(IBAction)exportSubscriptions:(id)sender
{
[panel orderOut:self];

NSArray * foldersArray = ([exportSelected state] == NSOnState) ? [foldersTree selectedFolders] : [db arrayOfFolders:MA_Root_Folder];
int countExported = [Export exportToFile:[[panel URL] path] from:foldersArray withGroups:([exportWithGroups state] == NSOnState)];
int countExported = [Export exportToFile:[[panel URL] path] fromFoldersTree:foldersTree selection:([exportSelected state] == NSOnState) withGroups:([exportWithGroups state] == NSOnState)];

if (countExported < 0)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Database.m
Expand Up @@ -1841,7 +1841,7 @@ -(NSArray *)arrayOfFolders:(NSInteger)parentId
[newArray addObject:folder];
}
}
return [newArray sortedArrayUsingSelector:@selector(folderNameCompare:)];
return newArray;
}

/* arrayOfSubFolders
Expand Down
5 changes: 4 additions & 1 deletion src/Export.h
Expand Up @@ -19,10 +19,13 @@
//

#import <Cocoa/Cocoa.h>
@class FoldersTree;

@interface Export : NSObject

+(int)exportToFile:(NSString *)exportFileName from:(NSArray *)foldersArray
withGroups:(BOOL)groupFlag;
inFoldersTree:(FoldersTree *)foldersTree withGroups:(BOOL)groupFlag;
+(int)exportToFile:(NSString *)exportFileName fromFoldersTree:(FoldersTree *)foldersTree
selection:(BOOL)selectionFlag withGroups:(BOOL)groupFlag;

@end
50 changes: 38 additions & 12 deletions src/Export.m
Expand Up @@ -22,10 +22,9 @@
#import "FoldersTree.h"
#import "StringExtensions.h"
#import "BJRWindowWithToolbar.h"
#import "Database.h"

@interface Export()
+ (NSXMLDocument *)opmlDocumentFromFolders:(NSArray *)folders withGroups:(BOOL)groupFlag exportCount:(int *)countExported;
+ (NSXMLDocument *)opmlDocumentFromFolders:(NSArray *)folders inFoldersTree:(FoldersTree *)foldersTree withGroups:(BOOL)groupFlag exportCount:(int *)countExported;
@end

@implementation Export
Expand All @@ -34,28 +33,27 @@ @implementation Export
* Export one group of folders.
*/
+(int)exportSubscriptionGroup:(NSXMLElement *)parentElement fromArray:(NSArray *)feedArray
withGroups:(BOOL)groupFlag
inFoldersTree:(FoldersTree *)foldersTree withGroups:(BOOL)groupFlag
{
int countExported = 0;
Database *db = [Database sharedManager];
for (Folder * folder in feedArray)
{
NSMutableDictionary * itemDict = [[NSMutableDictionary alloc] init];
NSString * name = [folder name];
if (IsGroupFolder(folder))
{
NSArray * subFolders = [db arrayOfFolders:[folder itemId]];
NSArray * subFolders = [foldersTree children:[folder itemId]];

if (!groupFlag) {
countExported += [Export exportSubscriptionGroup:parentElement fromArray:subFolders withGroups:groupFlag];
countExported += [Export exportSubscriptionGroup:parentElement fromArray:subFolders inFoldersTree:foldersTree withGroups:groupFlag];
}
else
{
[itemDict setObject:[NSString stringByConvertingHTMLEntities:(name ? name : @"")] forKey:@"text"];
NSXMLElement *outlineElement = [NSXMLElement elementWithName:@"outline"];
[outlineElement setAttributesWithDictionary:itemDict];
[parentElement addChild:outlineElement];
countExported += [Export exportSubscriptionGroup:outlineElement fromArray:subFolders withGroups:groupFlag];
countExported += [Export exportSubscriptionGroup:outlineElement fromArray:subFolders inFoldersTree:foldersTree withGroups:groupFlag];
}
}
else if (IsRSSFolder(folder) || IsGoogleReaderFolder(folder))
Expand All @@ -79,14 +77,42 @@ +(int)exportSubscriptionGroup:(NSXMLElement *)parentElement fromArray:(NSArray *
}

/* exportToFile
* Export a list of RSS subscriptions to the specified file. If onlySelected is set then only those
* Export a list of RSS subscriptions to the specified file.
* Returns the number of subscriptions exported, or -1 on error.
*/
+(int)exportToFile:(NSString *)exportFileName from:(NSArray *)foldersArray inFoldersTree:(FoldersTree *)foldersTree withGroups:(BOOL)groupFlag
{
int countExported = 0;
NSXMLDocument *opmlDocument = [Export opmlDocumentFromFolders:foldersArray inFoldersTree:foldersTree withGroups:groupFlag exportCount:&countExported];
// Now write the complete XML to the file

NSString * fqFilename = [exportFileName stringByExpandingTildeInPath];
if (![[NSFileManager defaultManager] createFileAtPath:fqFilename contents:nil attributes:nil])
{
return -1; // Indicate an error condition (impossible number of exports)
}

NSData *xmlData = [opmlDocument XMLDataWithOptions:NSXMLNodePrettyPrint | NSXMLNodeCompactEmptyElement];
[xmlData writeToFile:fqFilename atomically:YES];


return countExported;
}

/* exportToFile
* Export a list of RSS subscriptions to the specified file. If selectionFlag is set then only those
* folders selected in the folders tree are exported. Otherwise all RSS folders are exported.
* Returns the number of subscriptions exported, or -1 on error.
*/
+(int)exportToFile:(NSString *)exportFileName from:(NSArray *)foldersArray withGroups:(BOOL)groupFlag
+(int)exportToFile:(NSString *)exportFileName fromFoldersTree:(FoldersTree *)foldersTree selection:(BOOL)selectionFlag withGroups:(BOOL)groupFlag
{
int countExported = 0;
NSXMLDocument *opmlDocument = [Export opmlDocumentFromFolders:foldersArray withGroups:groupFlag exportCount:&countExported];
NSArray * folders;
if (selectionFlag)
folders = [foldersTree selectedFolders];
else
folders = [foldersTree children:0];
NSXMLDocument *opmlDocument = [Export opmlDocumentFromFolders:folders inFoldersTree:foldersTree withGroups:groupFlag exportCount:&countExported];
// Now write the complete XML to the file

NSString * fqFilename = [exportFileName stringByExpandingTildeInPath];
Expand All @@ -111,7 +137,7 @@ +(int)exportToFile:(NSString *)exportFileName from:(NSArray *)foldersArray withG
*
* @return NSXMLDocument with OPML containing the exported folders
*/
+ (NSXMLDocument *)opmlDocumentFromFolders:(NSArray *)folders withGroups:(BOOL)groupFlag exportCount:(int *)countExported {
+ (NSXMLDocument *)opmlDocumentFromFolders:(NSArray *)folders inFoldersTree:(FoldersTree *)foldersTree withGroups:(BOOL)groupFlag exportCount:(int *)countExported {
*countExported = 0;
NSXMLDocument *opmlDocument = [[NSXMLDocument alloc] initWithKind:NSXMLDocumentKind options:NSXMLNodePreserveEmptyElements];
[opmlDocument setCharacterEncoding:@"UTF-8"];
Expand All @@ -130,7 +156,7 @@ + (NSXMLDocument *)opmlDocumentFromFolders:(NSArray *)folders withGroups:(BOOL)g
[opmlElement addChild:headElement];

NSXMLElement *bodyElement = [NSXMLElement elementWithName:@"body"];
*countExported = [Export exportSubscriptionGroup:bodyElement fromArray:folders withGroups:groupFlag];
*countExported = [Export exportSubscriptionGroup:bodyElement fromArray:folders inFoldersTree:foldersTree withGroups:groupFlag];


[opmlElement addChild:bodyElement];
Expand Down
1 change: 1 addition & 0 deletions src/FoldersTree.h
Expand Up @@ -59,6 +59,7 @@
-(int)firstFolderWithUnread;
-(int)nextFolderWithUnread:(int)currentFolderId;
-(NSArray *)folders:(int)folderId;
-(NSArray *)children:(int)folderId;
-(NSView *)mainView;
-(void)outlineViewWillBecomeFirstResponder;
@end
24 changes: 23 additions & 1 deletion src/FoldersTree.m
Expand Up @@ -286,7 +286,7 @@ -(BOOL)loadTree:(NSArray *)listOfFolders rootNode:(TreeNode *)node
for (folder in listOfFolders)
{
int itemId = [folder itemId];
NSArray * listOfSubFolders = [[Database sharedManager] arrayOfFolders:itemId];
NSArray * listOfSubFolders = [[[Database sharedManager] arrayOfFolders:itemId] sortedArrayUsingSelector:@selector(folderNameCompare:)];
int count = [listOfSubFolders count];
TreeNode * subNode;

Expand Down Expand Up @@ -358,6 +358,28 @@ -(NSArray *)folders:(int)folderId
return array;
}

/* children
* Returns an array that contains the children folders in the database
* ordered by the order in which they appear in the folders list view.
*/
-(NSArray *)children:(int)folderId
{
NSMutableArray * array = [NSMutableArray array];
TreeNode * node;

if (!folderId)
node = rootNode;
else
node = [rootNode nodeFromID:folderId];
node = [node firstChild];
while (node != nil)
{
[array addObject:[node folder]];
node = [node nextSibling];
}
return array;
}

/* updateAlternateMenuTitle
* Sets the appropriate title for the alternate item in the contextual menu
* when user changes preferences for opening pages in external browser
Expand Down
2 changes: 1 addition & 1 deletion src/SearchFolder.m
Expand Up @@ -242,7 +242,7 @@ -(void)initSearchSheet:(NSString *)folderName
*/
-(void)initFolderValueField:(int)fromId atIndent:(int)indentation
{
for (Folder * folder in [db arrayOfFolders:fromId])
for (Folder * folder in [[db arrayOfFolders:fromId] sortedArrayUsingSelector:@selector(folderNameCompare:)])
{
if (IsRSSFolder(folder)||IsGoogleReaderFolder(folder)||IsGroupFolder(folder))
{
Expand Down
6 changes: 1 addition & 5 deletions src/ViennaApp.m
Expand Up @@ -20,16 +20,12 @@

#import "ViennaApp.h"
#import "AppController.h"
#import "ArticleListView.h"
#import "Preferences.h"
#import "Import.h"
#import "Export.h"
#import "RefreshManager.h"
#import "Constants.h"
#import "FoldersTree.h"
#import "BrowserPane.h"
#import "UnifiedDisplayView.h"
#import <WebKit/WebKit.h>

@implementation ViennaApp

Expand Down Expand Up @@ -189,7 +185,7 @@ -(id)handleExportSubscriptions:(NSScriptCommand *)cmd

int countExported = 0;
if (argArray != nil)
countExported = [Export exportToFile:[args objectForKey:@"FileName"] from:argArray withGroups:YES];
countExported = [Export exportToFile:[args objectForKey:@"FileName"] from:argArray inFoldersTree:[(AppController*)[self delegate] foldersTree] withGroups:YES];
return [NSNumber numberWithInt:countExported];
}

Expand Down

0 comments on commit 03078fc

Please sign in to comment.