Added humanized Date formatting (simple)

Fixed errors that would occur if undo was mixed with emptying the trash
Updated localizations
Added localized descriptions
Fixed #31 Database name is displayed, if none is given fallback is used
This commit is contained in:
michael starke
2013-07-10 03:37:31 +02:00
parent 75c9aa6873
commit 515190a74e
14 changed files with 174 additions and 77 deletions

View File

@@ -10,6 +10,7 @@
4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */; }; 4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */; };
4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */; }; 4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */; };
4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */; }; 4C01C245176500C40016D5D0 /* HNHLevelIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */; };
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C10412B178CDD44001B5239 /* NSDate+Humanized.m */; };
4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */; }; 4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */; };
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; }; 4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; };
4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C22040C1746ED160054C916 /* KdbGroup+Undo.m */; }; 4C22040D1746ED160054C916 /* KdbGroup+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C22040C1746ED160054C916 /* KdbGroup+Undo.m */; };
@@ -209,6 +210,8 @@
4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextMenuHelper.m; sourceTree = "<group>"; }; 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPContextMenuHelper.m; sourceTree = "<group>"; };
4C01C243176500C40016D5D0 /* HNHLevelIndicatorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHLevelIndicatorCell.h; sourceTree = "<group>"; }; 4C01C243176500C40016D5D0 /* HNHLevelIndicatorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHLevelIndicatorCell.h; sourceTree = "<group>"; };
4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHLevelIndicatorCell.m; sourceTree = "<group>"; }; 4C01C244176500C40016D5D0 /* HNHLevelIndicatorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHLevelIndicatorCell.m; sourceTree = "<group>"; };
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Humanized.h"; sourceTree = "<group>"; };
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Humanized.m"; sourceTree = "<group>"; };
4C16BA6017879A3C002B42BD /* MPPasswordStringFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordStringFormatter.h; sourceTree = "<group>"; }; 4C16BA6017879A3C002B42BD /* MPPasswordStringFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordStringFormatter.h; sourceTree = "<group>"; };
4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordStringFormatter.m; sourceTree = "<group>"; }; 4C16BA6117879A3C002B42BD /* MPPasswordStringFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordStringFormatter.m; sourceTree = "<group>"; };
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; }; 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; };
@@ -614,6 +617,15 @@
name = Views; name = Views;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4C104129178CDD26001B5239 /* Categories */ = {
isa = PBXGroup;
children = (
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */,
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */,
);
name = Categories;
sourceTree = "<group>";
};
4C16BA5F1787997E002B42BD /* ValueTransformer */ = { 4C16BA5F1787997E002B42BD /* ValueTransformer */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1050,6 +1062,7 @@
4C77E36C15B84A240093A587 /* MacPass */ = { 4C77E36C15B84A240093A587 /* MacPass */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4C104129178CDD26001B5239 /* Categories */,
4C245C11176E22150086100E /* KeepassHttp */, 4C245C11176E22150086100E /* KeepassHttp */,
4C46B8821706397A0046109A /* Security Additions */, 4C46B8821706397A0046109A /* Security Additions */,
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */, 4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */,
@@ -1535,6 +1548,7 @@
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */, 4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */, 4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */,
4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */, 4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */,
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@@ -18,32 +18,32 @@
tree.root = rootGroup; tree.root = rootGroup;
KdbGroup *parentGroup = [tree createGroup:rootGroup]; KdbGroup *parentGroup = [tree createGroup:rootGroup];
parentGroup.name = @"General"; parentGroup.name = NSLocalizedString(@"GENERAL", "General");
parentGroup.image = 48; parentGroup.image = 48;
[rootGroup addGroup:parentGroup]; [rootGroup addGroup:parentGroup];
KdbGroup *group = [tree createGroup:parentGroup]; KdbGroup *group = [tree createGroup:parentGroup];
group.name = @"Windows"; group.name = NSLocalizedString(@"WINDOWS", "Windows");
group.image = 38; group.image = 38;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Network"; group.name = NSLocalizedString(@"NETWORK", "Network");
group.image = 3; group.image = 3;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Internet"; group.name = NSLocalizedString(@"INTERNET", "Internet");
group.image = 1; group.image = 1;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"eMail"; group.name = NSLocalizedString(@"EMAIL", "EMail");
group.image = 19; group.image = 19;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Homebanking"; group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
group.image = 37; group.image = 37;
[parentGroup addGroup:group]; [parentGroup addGroup:group];

View File

@@ -15,7 +15,7 @@
Kdb4Tree *tree = [[Kdb4Tree alloc] init]; Kdb4Tree *tree = [[Kdb4Tree alloc] init];
tree.generator = @"MacPass"; tree.generator = @"MacPass";
tree.databaseName = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database"); tree.databaseName = NSLocalizedString(@"DATABASE", "");
tree.databaseNameChanged = currentTime; tree.databaseNameChanged = currentTime;
tree.databaseDescription = @""; tree.databaseDescription = @"";
tree.databaseDescriptionChanged = currentTime; tree.databaseDescriptionChanged = currentTime;
@@ -42,32 +42,32 @@
tree.lastTopVisibleGroup = [UUID nullUuid]; tree.lastTopVisibleGroup = [UUID nullUuid];
KdbGroup *parentGroup = [tree createGroup:nil]; KdbGroup *parentGroup = [tree createGroup:nil];
parentGroup.name = @"General"; parentGroup.name = NSLocalizedString(@"GENERAL", "General");
parentGroup.image = 48; parentGroup.image = 48;
tree.root = parentGroup; tree.root = parentGroup;
KdbGroup *group = [tree createGroup:parentGroup]; KdbGroup *group = [tree createGroup:parentGroup];
group.name = @"Windows"; group.name = NSLocalizedString(@"WINDOWS", "Windows");
group.image = 38; group.image = 38;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Network"; group.name = NSLocalizedString(@"NETWORK", "Network");
group.image = 3; group.image = 3;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Internet"; group.name = NSLocalizedString(@"INTERNET", "Internet");
group.image = 1; group.image = 1;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"eMail"; group.name = NSLocalizedString(@"EMAIL", "EMail");
group.image = 19; group.image = 19;
[parentGroup addGroup:group]; [parentGroup addGroup:group];
group = [tree createGroup:parentGroup]; group = [tree createGroup:parentGroup];
group.name = @"Homebanking"; group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
group.image = 37; group.image = 37;
[parentGroup addGroup:group]; [parentGroup addGroup:group];

View File

@@ -122,7 +122,7 @@ if(![[self undoManager] isUndoing]) {\
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_ENTRY", "Set Title")]; [[self undoManager] setActionName:NSLocalizedString(@"DELETE_ENTRY", "Set Title")];
} }
[[NSNotificationCenter defaultCenter] postNotificationName:@"" object:self userInfo:nil]; //[[NSNotificationCenter defaultCenter] postNotificationName:@"" object:self userInfo:nil];
[self.parent removeObjectFromEntriesAtIndex:oldIndex]; [self.parent removeObjectFromEntriesAtIndex:oldIndex];
} }
@@ -131,7 +131,7 @@ if(![[self undoManager] isUndoing]) {\
} }
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index { - (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"MOVE_ENTRY_TO_TRASH", "Move Entryo to Trash")]; [self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
} }
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)name { - (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)name {
@@ -149,6 +149,8 @@ if(![[self undoManager] isUndoing]) {\
} }
[self.parent removeObjectFromEntriesAtIndex:oldIndex]; [self.parent removeObjectFromEntriesAtIndex:oldIndex];
// Old indices might be wrong, correct them if necessary
index = MIN(index, [group.entries count]);
[group insertObject:self inEntriesAtIndex:index]; [group insertObject:self inEntriesAtIndex:index];
} }

View File

@@ -22,6 +22,5 @@ APPKIT_EXTERN NSString *const MPGroupNameUndoableKey;
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index; - (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index;
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index; - (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index; - (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
- (void)restoreFromTrashUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
@end @end

View File

@@ -10,13 +10,6 @@
#import "KdbGroup+KVOAdditions.h" #import "KdbGroup+KVOAdditions.h"
#import "KdbEntry+Undo.h" #import "KdbEntry+Undo.h"
#ifndef MPSetActionName
#define MPSetActionName(key, comment) \
if(![[self undoManager] isUndoing]) {\
[[self undoManager] setActionName:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]];\
}
#endif
NSString *const MPGroupNameUndoableKey = @"nameUndoable"; NSString *const MPGroupNameUndoableKey = @"nameUndoable";
@implementation KdbGroup (Undo) @implementation KdbGroup (Undo)
@@ -31,7 +24,11 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
- (void)setNameUndoable:(NSString *)newName { - (void)setNameUndoable:(NSString *)newName {
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name]; [[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name];
MPSetActionName(@"SET_NAME", "Set Name")
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"SET_NAME", "Set Name")];
}
self.name = newName; self.name = newName;
} }
@@ -44,19 +41,26 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
return; // Inconsistent data return; // Inconsistent data
} }
[[[self undoManager] prepareWithInvocationTarget:self.parent] addGroupUndoable:self atIndex:oldIndex]; [[[self undoManager] prepareWithInvocationTarget:self.parent] addGroupUndoable:self atIndex:oldIndex];
MPSetActionName(@"DELETE_GROUP", "Delete Group")
[self.parent removeObjectFromGroupsAtIndex:[self.parent.groups indexOfObject:self]]; if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP", "Delete Group")];
}
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
} }
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index { - (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
if(!group) { if(!group) {
return; return;
} }
if(index < [group.groups count]) {
return; // Wrong index!
}
[[[self undoManager] prepareWithInvocationTarget:group] deleteUndoable]; [[[self undoManager] prepareWithInvocationTarget:group] deleteUndoable];
MPSetActionName(@"ADD_GROUP", "Add Group")
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"ADD_GROUP", "Add Group")];
}
index = MIN(index, [group.groups count]);
[self insertObject:group inGroupsAtIndex:index]; [self insertObject:group inGroupsAtIndex:index];
} }
@@ -64,53 +68,40 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
if(!entry) { if(!entry) {
return; return;
} }
if(index > [self.entries count]) { index = MIN(index, [self.entries count]);
return; // Wrong index!
}
[[[self undoManager] prepareWithInvocationTarget:entry] deleteUndoable]; [[[self undoManager] prepareWithInvocationTarget:entry] deleteUndoable];
MPSetActionName(@"ADD_ENTRY", "Add Entry")
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:NSLocalizedString(@"ADD_ENTRY", "Add Entry")];
}
[self insertObject:entry inEntriesAtIndex:index]; [self insertObject:entry inEntriesAtIndex:index];
} }
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index { - (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
if(!self.parent || !group) { [self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_GROUP", "Move Group" )];
return; // No target or origin
}
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
if(index == NSNotFound) {
return; // We aren't in our parents groups list.
}
[[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
MPSetActionName(@"MOVE_GROUP", "Move Group")
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
[group insertObject:self inGroupsAtIndex:index];
} }
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index { - (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
if(!self.parent || !trash) { [self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
return; // No target or origin
}
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
if(index == NSNotFound) {
return; // We aren't in our parents groups list.
}
[[[self undoManager] prepareWithInvocationTarget:self] restoreFromTrashUndoable:self.parent atIndex:oldIndex];
MPSetActionName(@"MOVE_TO_TRASH", @"Move to Trash")
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
[trash insertObject:self inGroupsAtIndex:index];
} }
- (void)restoreFromTrashUndoable:(KdbGroup *)group atIndex:(NSUInteger)index { - (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)actionName {
if(!self.parent || !group) { if(!self.parent || !group) {
return; // No target or origin return; // No target or origin
} }
NSUInteger oldIndex = [self.parent.groups indexOfObject:self]; NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
if(index == NSNotFound) { if(oldIndex == NSNotFound) {
return; // We aren't in our parents groups list. return; // We aren't in our parents groups list.
} }
[[[self undoManager] prepareWithInvocationTarget:self] moveToTrashUndoable:self.parent atIndex:oldIndex]; [[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
MPSetActionName(@"RESTORE_GROUP", "Restore from Trash")
if(![[self undoManager] isUndoing]) {
[[self undoManager] setActionName:actionName];
}
[self.parent removeObjectFromGroupsAtIndex:oldIndex]; [self.parent removeObjectFromGroupsAtIndex:oldIndex];
index = MIN(index, [group.groups count]);
[group insertObject:self inGroupsAtIndex:index]; [group insertObject:self inGroupsAtIndex:index];
} }

View File

@@ -408,14 +408,23 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
#pragma mark Actions #pragma mark Actions
- (void)emptyTrash:(id)sender { - (void)emptyTrash:(id)sender {
for(KdbEntry *entry in [self.trash childEntries]) { NSAlert *alert = [[NSAlert alloc] init];
[[self undoManager] removeAllActionsWithTarget:entry]; [alert setAlertStyle:NSWarningAlertStyle];
} [alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")];
for(KdbGroup *group in [self.trash childGroups]) { [alert setInformativeText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash")];
[[self undoManager] removeAllActionsWithTarget:group]; [alert addButtonWithTitle:NSLocalizedString(@"EMPTY_TRASH", "Empty Trash")];
} [alert addButtonWithTitle:NSLocalizedString(@"CANCEL", "Cancel")];
[self.trash clear]; [[alert buttons][1] setKeyEquivalent:[NSString stringWithFormat:@"%c", 0x1b]];
NSWindow *window = [[self windowControllers][0] window];
[alert beginSheetModalForWindow:window modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:NULL];
}
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
if(returnCode == NSAlertFirstButtonReturn) {
[self _emptyTrash];
}
} }
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
@@ -448,7 +457,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
} }
else if(self.version == MPDatabaseVersion4) { else if(self.version == MPDatabaseVersion4) {
KdbGroup *trash = [self.tree createGroup:self.tree.root]; KdbGroup *trash = [self.tree createGroup:self.tree.root];
trash.name = NSLocalizedString(@"TRASH_GROUP", @"Name for the trash group"); trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group");
trash.image = MPIconTrash; trash.image = MPIconTrash;
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]]; [self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]];
self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid; self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid;
@@ -460,4 +469,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
} }
} }
- (void)_emptyTrash {
for(KdbEntry *entry in [self.trash childEntries]) {
[[self undoManager] removeAllActionsWithTarget:entry];
}
for(KdbGroup *group in [self.trash childGroups]) {
[[self undoManager] removeAllActionsWithTarget:group];
}
[self.trash clear];
}
@end @end

View File

@@ -21,6 +21,8 @@
#import "MPCustomFieldTableCellView.h" #import "MPCustomFieldTableCellView.h"
#import "MPSelectedAttachmentTableCellView.h" #import "MPSelectedAttachmentTableCellView.h"
#import "NSDate+Humanized.h"
#import "KdbLib.h" #import "KdbLib.h"
#import "Kdb4Node.h" #import "Kdb4Node.h"
#import "Kdb3Node.h" #import "Kdb3Node.h"
@@ -128,6 +130,9 @@ enum {
NSString *modificationString = [NSDateFormatter localizedStringFromDate:modificationDate NSString *modificationString = [NSDateFormatter localizedStringFromDate:modificationDate
dateStyle:NSDateFormatterShortStyle dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterShortStyle]; timeStyle:NSDateFormatterShortStyle];
modificationString = [modificationDate humanized];
NSString *modifedAtTemplate = NSLocalizedString(@"MODIFED_AT_%@", @"Modifed at template string. %@ is replaced by locaized date and time"); NSString *modifedAtTemplate = NSLocalizedString(@"MODIFED_AT_%@", @"Modifed at template string. %@ is replaced by locaized date and time");
[self.modifiedTextField setStringValue:[NSString stringWithFormat:modifedAtTemplate, modificationString]]; [self.modifiedTextField setStringValue:[NSString stringWithFormat:modifedAtTemplate, modificationString]];
@@ -137,6 +142,7 @@ enum {
NSString *creationString = [NSDateFormatter localizedStringFromDate:creationDate NSString *creationString = [NSDateFormatter localizedStringFromDate:creationDate
dateStyle:NSDateFormatterShortStyle dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterShortStyle]; timeStyle:NSDateFormatterShortStyle];
creationString = [creationDate humanized];
NSString *createdAtTemplate = NSLocalizedString(@"CREATED_AT_%@", @"Created at template string. %@ is replaced by locaized date and time"); NSString *createdAtTemplate = NSLocalizedString(@"CREATED_AT_%@", @"Created at template string. %@ is replaced by locaized date and time");
[self.createdTextField setStringValue:[NSString stringWithFormat:createdAtTemplate, creationString]]; [self.createdTextField setStringValue:[NSString stringWithFormat:createdAtTemplate, creationString]];

View File

@@ -39,6 +39,8 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
@property (strong) MPOutlineDataSource *datasource; @property (strong) MPOutlineDataSource *datasource;
@property (strong) NSMenu *menu; @property (strong) NSMenu *menu;
@property (copy, nonatomic) NSString *databaseNameWrapper;
@end @end
@implementation MPOutlineViewController @implementation MPOutlineViewController
@@ -53,6 +55,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
_treeController = [[NSTreeController alloc] init]; _treeController = [[NSTreeController alloc] init];
_bindingEstablished = NO; _bindingEstablished = NO;
_datasource = [[MPOutlineDataSource alloc] init]; _datasource = [[MPOutlineDataSource alloc] init];
_databaseNameWrapper = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database");
} }
return self; return self;
@@ -76,6 +79,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
[_treeController setChildrenKeyPath:@"groups"]; [_treeController setChildrenKeyPath:@"groups"];
[_treeController bind:NSContentBinding toObject:document withKeyPath:@"rootAdapter" options:nil]; [_treeController bind:NSContentBinding toObject:document withKeyPath:@"rootAdapter" options:nil];
[_outlineView bind:NSContentBinding toObject:_treeController withKeyPath:@"arrangedObjects" options:nil]; [_outlineView bind:NSContentBinding toObject:_treeController withKeyPath:@"arrangedObjects" options:nil];
if([document.tree respondsToSelector:@selector(databaseName)]) {
[self bind:@"databaseNameWrapper" toObject:document.tree withKeyPath:@"databaseName" options:nil];
}
[_outlineView setDataSource:self.datasource]; [_outlineView setDataSource:self.datasource];
_bindingEstablished = YES; _bindingEstablished = YES;
} }
@@ -83,7 +89,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
[_outlineView expandItem:node expandChildren:YES]; [_outlineView expandItem:node expandChildren:YES];
} }
#pragma makr Notifications #pragma mark Notifications
- (void)setupNotifications:(MPDocumentWindowController *)windowController { - (void)setupNotifications:(MPDocumentWindowController *)windowController {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didCreateGroup:) name:MPDocumentDidAddGroupNotification object:[windowController document]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didCreateGroup:) name:MPDocumentDidAddGroupNotification object:[windowController document]];
} }
@@ -108,6 +114,17 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
} }
} }
- (void)setDatabaseNameWrapper:(NSString *)databaseNameWrapper {
if(![_databaseNameWrapper isEqualToString:databaseNameWrapper]) {
if([databaseNameWrapper length] == 0) {
_databaseNameWrapper = NSLocalizedString(@"DATABASE", "Default name database");
}
else {
_databaseNameWrapper= [databaseNameWrapper copy];
}
}
}
#pragma mark - #pragma mark -
#pragma mark Actions #pragma mark Actions
@@ -135,13 +152,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
if( [self _itemIsRootNodeAdapter:item] ) { if( [self _itemIsRootNodeAdapter:item] ) {
//NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] }; //NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] };
view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self]; view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self];
MPRootAdapter *rootNode = [item representedObject]; [view.textField bind:NSValueBinding toObject:self withKeyPath:@"databaseNameWrapper" options:nil];
if([rootNode.tree respondsToSelector:@selector(databaseName)]) {
[view.textField bind:NSValueBinding toObject:rootNode.tree withKeyPath:@"databaseName" options:nil];
}
else {
[view.textField setStringValue:NSLocalizedString(@"GROUPS", @"")];
}
} }
else { else {
KdbGroup *group = [item representedObject]; KdbGroup *group = [item representedObject];

View File

@@ -48,7 +48,7 @@
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2335</string> <string>2383</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string> <string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>

View File

@@ -0,0 +1,16 @@
//
// NSDate+Humanized.h
// MacPass
//
// Created by Michael Starke on 10.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSDate (Humanized)
+ (NSString *)humanizedDate:(NSDate *)date;
- (NSString *)humanized;
@end

View File

@@ -0,0 +1,39 @@
//
// NSDate+Humanized.m
// MacPass
//
// Created by Michael Starke on 10.07.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "NSDate+Humanized.h"
@implementation NSDate (Humanized)
+ (NSString *)humanizedDate:(NSDate *)date {
return [date humanized];
}
- (NSString *)humanized {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSMinuteCalendarUnit|NSHourCalendarUnit|NSDayCalendarUnit fromDate:self toDate:[NSDate date] options:0];
if([components day] > 1) {
return [NSDateFormatter localizedStringFromDate:self
dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterShortStyle];
}
if([components day] == 1) {
return NSLocalizedString(@"YESTERDAY", "Yesterday");
}
if([components hour] > 1) {
NSString *hourTemplate = NSLocalizedString(@"%ld_HOURS_AGO", "% Hours ago");
return [NSString stringWithFormat:hourTemplate, [components hour]];
}
NSInteger minutes = [components minute];
if(minutes > 1) {
NSString *minuteTemplate = NSLocalizedString(@"%ld_MINUTES_AGO", "% Minutes ago");
return [NSString stringWithFormat:minuteTemplate, minutes];
}
return NSLocalizedString(@"JUST_NOW", "Just now");
}
@end

Binary file not shown.

Binary file not shown.