mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-14 00:02:28 +00:00
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:
@@ -10,6 +10,7 @@
|
||||
4C01C23F1764D2980016D5D0 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C23E1764D2980016D5D0 /* KdbEntry+Undo.m */; };
|
||||
4C01C2421764D8980016D5D0 /* MPContextMenuHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C01C2411764D8980016D5D0 /* MPContextMenuHelper.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 */; };
|
||||
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@@ -614,6 +617,15 @@
|
||||
name = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C104129178CDD26001B5239 /* Categories */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C10412A178CDD44001B5239 /* NSDate+Humanized.h */,
|
||||
4C10412B178CDD44001B5239 /* NSDate+Humanized.m */,
|
||||
);
|
||||
name = Categories;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4C16BA5F1787997E002B42BD /* ValueTransformer */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1050,6 +1062,7 @@
|
||||
4C77E36C15B84A240093A587 /* MacPass */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C104129178CDD26001B5239 /* Categories */,
|
||||
4C245C11176E22150086100E /* KeepassHttp */,
|
||||
4C46B8821706397A0046109A /* Security Additions */,
|
||||
4C2C4C2516D3BCEA00D49295 /* KeePassLib Categories */,
|
||||
@@ -1535,6 +1548,7 @@
|
||||
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
|
||||
4C16BA6217879A3C002B42BD /* MPPasswordStringFormatter.m in Sources */,
|
||||
4CD6C5AE1789FDE6000891F6 /* HNHRoundedSecureTextField.m in Sources */,
|
||||
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
@@ -18,32 +18,32 @@
|
||||
tree.root = rootGroup;
|
||||
|
||||
KdbGroup *parentGroup = [tree createGroup:rootGroup];
|
||||
parentGroup.name = @"General";
|
||||
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||
parentGroup.image = 48;
|
||||
[rootGroup addGroup:parentGroup];
|
||||
|
||||
KdbGroup *group = [tree createGroup:parentGroup];
|
||||
group.name = @"Windows";
|
||||
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||
group.image = 38;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Network";
|
||||
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||
group.image = 3;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Internet";
|
||||
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||
group.image = 1;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"eMail";
|
||||
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||
group.image = 19;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Homebanking";
|
||||
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||
group.image = 37;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
|
||||
tree.generator = @"MacPass";
|
||||
tree.databaseName = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database");
|
||||
tree.databaseName = NSLocalizedString(@"DATABASE", "");
|
||||
tree.databaseNameChanged = currentTime;
|
||||
tree.databaseDescription = @"";
|
||||
tree.databaseDescriptionChanged = currentTime;
|
||||
@@ -42,32 +42,32 @@
|
||||
tree.lastTopVisibleGroup = [UUID nullUuid];
|
||||
|
||||
KdbGroup *parentGroup = [tree createGroup:nil];
|
||||
parentGroup.name = @"General";
|
||||
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||
parentGroup.image = 48;
|
||||
tree.root = parentGroup;
|
||||
|
||||
KdbGroup *group = [tree createGroup:parentGroup];
|
||||
group.name = @"Windows";
|
||||
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||
group.image = 38;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Network";
|
||||
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||
group.image = 3;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Internet";
|
||||
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||
group.image = 1;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"eMail";
|
||||
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||
group.image = 19;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
group = [tree createGroup:parentGroup];
|
||||
group.name = @"Homebanking";
|
||||
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||
group.image = 37;
|
||||
[parentGroup addGroup:group];
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ if(![[self undoManager] isUndoing]) {\
|
||||
[[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];
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ if(![[self undoManager] isUndoing]) {\
|
||||
}
|
||||
|
||||
- (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 {
|
||||
@@ -149,6 +149,8 @@ if(![[self undoManager] isUndoing]) {\
|
||||
}
|
||||
|
||||
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||
// Old indices might be wrong, correct them if necessary
|
||||
index = MIN(index, [group.entries count]);
|
||||
[group insertObject:self inEntriesAtIndex:index];
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,5 @@ APPKIT_EXTERN NSString *const MPGroupNameUndoableKey;
|
||||
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index;
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
|
||||
- (void)restoreFromTrashUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||
|
||||
@end
|
||||
|
||||
@@ -10,13 +10,6 @@
|
||||
#import "KdbGroup+KVOAdditions.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";
|
||||
|
||||
@implementation KdbGroup (Undo)
|
||||
@@ -31,7 +24,11 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||
|
||||
- (void)setNameUndoable:(NSString *)newName {
|
||||
[[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;
|
||||
}
|
||||
|
||||
@@ -44,19 +41,26 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||
return; // Inconsistent data
|
||||
}
|
||||
[[[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 {
|
||||
if(!group) {
|
||||
return;
|
||||
}
|
||||
if(index < [group.groups count]) {
|
||||
return; // Wrong index!
|
||||
}
|
||||
|
||||
[[[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];
|
||||
}
|
||||
|
||||
@@ -64,53 +68,40 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||
if(!entry) {
|
||||
return;
|
||||
}
|
||||
if(index > [self.entries count]) {
|
||||
return; // Wrong index!
|
||||
}
|
||||
index = MIN(index, [self.entries count]);
|
||||
[[[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];
|
||||
}
|
||||
|
||||
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||
if(!self.parent || !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];
|
||||
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_GROUP", "Move Group" )];
|
||||
}
|
||||
|
||||
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
|
||||
if(!self.parent || !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];
|
||||
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
|
||||
}
|
||||
|
||||
- (void)restoreFromTrashUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)actionName {
|
||||
if(!self.parent || !group) {
|
||||
return; // No target or origin
|
||||
}
|
||||
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
|
||||
if(index == NSNotFound) {
|
||||
if(oldIndex == NSNotFound) {
|
||||
return; // We aren't in our parents groups list.
|
||||
}
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] moveToTrashUndoable:self.parent atIndex:oldIndex];
|
||||
MPSetActionName(@"RESTORE_GROUP", "Restore from Trash")
|
||||
[[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
|
||||
|
||||
if(![[self undoManager] isUndoing]) {
|
||||
[[self undoManager] setActionName:actionName];
|
||||
}
|
||||
|
||||
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||
index = MIN(index, [group.groups count]);
|
||||
[group insertObject:self inGroupsAtIndex:index];
|
||||
}
|
||||
|
||||
|
||||
@@ -408,14 +408,23 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
#pragma mark Actions
|
||||
|
||||
- (void)emptyTrash:(id)sender {
|
||||
for(KdbEntry *entry in [self.trash childEntries]) {
|
||||
[[self undoManager] removeAllActionsWithTarget:entry];
|
||||
}
|
||||
for(KdbGroup *group in [self.trash childGroups]) {
|
||||
[[self undoManager] removeAllActionsWithTarget:group];
|
||||
}
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
[alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")];
|
||||
[alert setInformativeText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash")];
|
||||
[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 {
|
||||
@@ -448,7 +457,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
||||
}
|
||||
else if(self.version == MPDatabaseVersion4) {
|
||||
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;
|
||||
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]];
|
||||
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
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
#import "MPCustomFieldTableCellView.h"
|
||||
#import "MPSelectedAttachmentTableCellView.h"
|
||||
|
||||
#import "NSDate+Humanized.h"
|
||||
|
||||
#import "KdbLib.h"
|
||||
#import "Kdb4Node.h"
|
||||
#import "Kdb3Node.h"
|
||||
@@ -128,6 +130,9 @@ enum {
|
||||
NSString *modificationString = [NSDateFormatter localizedStringFromDate:modificationDate
|
||||
dateStyle:NSDateFormatterShortStyle
|
||||
timeStyle:NSDateFormatterShortStyle];
|
||||
|
||||
modificationString = [modificationDate humanized];
|
||||
|
||||
NSString *modifedAtTemplate = NSLocalizedString(@"MODIFED_AT_%@", @"Modifed at template string. %@ is replaced by locaized date and time");
|
||||
[self.modifiedTextField setStringValue:[NSString stringWithFormat:modifedAtTemplate, modificationString]];
|
||||
|
||||
@@ -137,6 +142,7 @@ enum {
|
||||
NSString *creationString = [NSDateFormatter localizedStringFromDate:creationDate
|
||||
dateStyle:NSDateFormatterShortStyle
|
||||
timeStyle:NSDateFormatterShortStyle];
|
||||
creationString = [creationDate humanized];
|
||||
|
||||
NSString *createdAtTemplate = NSLocalizedString(@"CREATED_AT_%@", @"Created at template string. %@ is replaced by locaized date and time");
|
||||
[self.createdTextField setStringValue:[NSString stringWithFormat:createdAtTemplate, creationString]];
|
||||
|
||||
@@ -39,6 +39,8 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
@property (strong) MPOutlineDataSource *datasource;
|
||||
@property (strong) NSMenu *menu;
|
||||
|
||||
@property (copy, nonatomic) NSString *databaseNameWrapper;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPOutlineViewController
|
||||
@@ -53,6 +55,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
_treeController = [[NSTreeController alloc] init];
|
||||
_bindingEstablished = NO;
|
||||
_datasource = [[MPOutlineDataSource alloc] init];
|
||||
_databaseNameWrapper = NSLocalizedString(@"NEW_DATABASE", "Name for a newly created Database");
|
||||
}
|
||||
|
||||
return self;
|
||||
@@ -76,6 +79,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
[_treeController setChildrenKeyPath:@"groups"];
|
||||
[_treeController bind:NSContentBinding toObject:document withKeyPath:@"rootAdapter" 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];
|
||||
_bindingEstablished = YES;
|
||||
}
|
||||
@@ -83,7 +89,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
[_outlineView expandItem:node expandChildren:YES];
|
||||
}
|
||||
|
||||
#pragma makr Notifications
|
||||
#pragma mark Notifications
|
||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
||||
[[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 Actions
|
||||
|
||||
@@ -135,13 +152,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
||||
if( [self _itemIsRootNodeAdapter:item] ) {
|
||||
//NSDictionary *options = @{ NSValueTransformerBindingOption : [NSValueTransformer valueTransformerForName:MPUppsercaseStringValueTransformerName] };
|
||||
view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self];
|
||||
MPRootAdapter *rootNode = [item representedObject];
|
||||
if([rootNode.tree respondsToSelector:@selector(databaseName)]) {
|
||||
[view.textField bind:NSValueBinding toObject:rootNode.tree withKeyPath:@"databaseName" options:nil];
|
||||
}
|
||||
else {
|
||||
[view.textField setStringValue:NSLocalizedString(@"GROUPS", @"")];
|
||||
}
|
||||
[view.textField bind:NSValueBinding toObject:self withKeyPath:@"databaseNameWrapper" options:nil];
|
||||
}
|
||||
else {
|
||||
KdbGroup *group = [item representedObject];
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2335</string>
|
||||
<string>2383</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
||||
16
MacPass/NSDate+Humanized.h
Normal file
16
MacPass/NSDate+Humanized.h
Normal 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
|
||||
39
MacPass/NSDate+Humanized.m
Normal file
39
MacPass/NSDate+Humanized.m
Normal 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.
Reference in New Issue
Block a user