mirror of
https://github.com/ksherlock/ample.git
synced 2024-11-15 06:09:34 +00:00
3d5a2951bb
commit 78c81626670fdf41fa6bdd71a4243a89a0746615 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Mon Jun 7 00:33:48 2021 -0400 check if software set has a particular entry. commit ef5ab6b6948dc3bbbe2947ea099fcacd08435e86 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 22:20:34 2021 -0400 fix scroller background on recent disk images window. commit dee56fa50e87299b396b48361bd0a780aaaaa768 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 21:26:23 2021 -0400 update cheat sheet javascript to work with 10.11 * => functions not supported * NodeList.prototype.forEach not supported. commit b00cc05413f4ebd6d6d58f96e24303008608f3a6 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 17:10:41 2021 -0400 default full machine name for bookmark entry. commit a671cafdc98051b56b12cdd3ccd13c22f54f605a Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 15:39:32 2021 -0400 loading a bookmark wasn't updating the media. commit 3000e0eb1b10bede3345aaab8478e9ec209f328c Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 15:38:53 2021 -0400 bump copyright year. commit 45222dacd4aa0047fae63a9112509de57139df63 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 13:38:23 2021 -0400 add reset w/ value for setting the item explicitely. commit cc7fde1253b71c4d8655eb4c010bbf4e61333a15 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sun Jun 6 13:37:48 2021 -0400 add checkboxes for bitbanger/share directory. The general idea is it's easier to toggle a checkbox than to type/retype a path. commit 5674b2d7f6b0e2f0b973197bf3493ad61bf46428 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sat Jun 5 19:11:43 2021 -0400 commentary on searches with diacritics. commit ec60634dcd9c573130dc34673b4d3fe597ea2b42 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sat Jun 5 19:11:22 2021 -0400 clean up auto-complete a little bit when setting a value directly. commit 1a182bbdab237c89d355d8294b5a4a64b785783a Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sat Jun 5 13:08:29 2021 -0400 fix text color when value is set. There are still some bugs relating to multiple copies of the value being stored. commit 49c0bc15c73446259d8cc151cf52d6058644db76 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sat Jun 5 12:09:44 2021 -0400 reset all controls first. commit 059797ad85b057e296cc707b4645f839bfccac13 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Sat Jun 5 10:52:06 2021 -0400 more bookmark loading. commit e5a612d9f8e7414dd15c66dbaa540b637765eeec Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Fri Jun 4 23:52:38 2021 -0400 bookmark - restore the software commit f9411a1e84df7bd46e352cc5ca995b585c2a0523 Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Fri Jun 4 23:52:25 2021 -0400 clean up software / name logic. commitf628d99e4a
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Fri Jun 4 00:21:08 2021 -0400 load bookmark... commit0b248e6aad
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Fri Jun 4 00:20:42 2021 -0400 stringValue can't be nil. commit94aac38af4
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Thu Jun 3 23:04:37 2021 -0400 add bookmark menu commit6215a0df12
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Thu Jun 3 23:03:29 2021 -0400 slot view needs to know the machine. commitd348c15dc5
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Thu Jun 3 23:02:58 2021 -0400 transformer to enable/disable control based on string length. commite14336a009
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Thu Jun 3 23:02:14 2021 -0400 shut up compiler warning. commit4baf545245
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Thu Jun 3 23:01:15 2021 -0400 bookmark manager commit0f3e6c8307
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Mon May 31 23:54:29 2021 -0400 more (untested) bookmark code commit8fdb149eb3
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Mon May 31 16:13:43 2021 -0400 start of bookmarking support. Untested. commit787eac87f6
Author: Kelvin Sherlock <ksherlock@gmail.com> Date: Mon May 31 16:12:45 2021 -0400 shut up warnings about content clipping. maybe it's a 10.11 thing. The size was chosen by interface builder.
215 lines
6.0 KiB
Objective-C
215 lines
6.0 KiB
Objective-C
//
|
|
// BookmarkManager.m
|
|
// Ample
|
|
//
|
|
// Created by Kelvin Sherlock on 6/1/2021.
|
|
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
|
|
//
|
|
|
|
#import "BookmarkManager.h"
|
|
#import "Ample.h"
|
|
|
|
@interface BookmarkManager () {
|
|
NSArray<NSURL *> *_urls;
|
|
NSURL *_bookmarkDirectory;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation BookmarkManager
|
|
|
|
static BookmarkManager *singleton = nil;
|
|
|
|
-(void)awakeFromNib {
|
|
if (!singleton) singleton = self;
|
|
}
|
|
|
|
+(instancetype)sharedManager {
|
|
if (!singleton) singleton = [BookmarkManager new];
|
|
return singleton;
|
|
}
|
|
|
|
-(instancetype)init {
|
|
if (singleton) return singleton;
|
|
return [super init];
|
|
}
|
|
|
|
-(NSURL *)bookmarkDirectory {
|
|
|
|
if (_bookmarkDirectory) return _bookmarkDirectory;
|
|
NSFileManager *fm = [NSFileManager defaultManager];
|
|
|
|
NSURL *url = SupportDirectory();
|
|
url = [url URLByAppendingPathComponent: @"Bookmarks"];
|
|
NSError *error = nil;
|
|
[fm createDirectoryAtURL: url withIntermediateDirectories: YES attributes: nil error: &error];
|
|
if (error) NSLog(@"%@", error);
|
|
_bookmarkDirectory = url;
|
|
return url;
|
|
}
|
|
|
|
/* disallow leading .
|
|
* disallow : or / characters.
|
|
*/
|
|
-(BOOL)validateName: (NSString *)name {
|
|
|
|
enum { kMaxLength = 128 };
|
|
unichar buffer[kMaxLength];
|
|
NSUInteger length = [name length];
|
|
if (length == 0 || length > kMaxLength) return NO;
|
|
[name getCharacters: buffer range: NSMakeRange(0, length)];
|
|
if (buffer[0] == '.') return NO;
|
|
for (unsigned i = 0; i < length; ++i) {
|
|
unichar c = buffer[i];
|
|
if (c == ':' || c == '/') return NO;
|
|
}
|
|
return YES;
|
|
}
|
|
|
|
|
|
-(NSDictionary *)loadDefault {
|
|
NSURL *url = [self bookmarkDirectory];
|
|
url = [url URLByAppendingPathComponent: @".Default"];
|
|
|
|
NSDictionary *d;
|
|
|
|
if (@available(macOS 10.13, *)) {
|
|
NSError *error = nil;
|
|
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
|
|
if (!d) NSLog(@"Error loading %@: %@", url, error);
|
|
} else {
|
|
d = [NSDictionary dictionaryWithContentsOfURL: url];
|
|
if (!d) NSLog(@"Error loading %@", url);
|
|
}
|
|
return d;
|
|
}
|
|
|
|
/* save as .Default */
|
|
-(BOOL)saveDefault: (NSDictionary *)bookmark {
|
|
|
|
NSURL *url = [self bookmarkDirectory];
|
|
url = [url URLByAppendingPathComponent: @".Default"];
|
|
|
|
NSError *error = nil;
|
|
BOOL ok = NO;
|
|
if (@available(macOS 10.13, *)) {
|
|
ok = [bookmark writeToURL: url error: &error];
|
|
if (!ok) NSLog(@"%@", error);
|
|
} else {
|
|
ok = [bookmark writeToURL: url atomically: YES];
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
-(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name {
|
|
|
|
NSError *error;
|
|
NSData *data = [NSPropertyListSerialization dataWithPropertyList: bookmark
|
|
format: NSPropertyListXMLFormat_v1_0
|
|
options: 0
|
|
error: &error];
|
|
|
|
|
|
|
|
NSURL *base = [self bookmarkDirectory];
|
|
|
|
NSURL *url = [base URLByAppendingPathComponent: name];
|
|
|
|
BOOL ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
|
|
|
|
if (!ok) {
|
|
for (unsigned i = 1 ; i < 100; ++i) {
|
|
NSString *tmp = [name stringByAppendingFormat: @"(%d)", i];
|
|
[base URLByAppendingPathComponent: tmp];
|
|
|
|
ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
|
|
if (ok) {
|
|
name = tmp;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!ok) return NO;
|
|
|
|
if (!_menu) return YES; // ?
|
|
|
|
NSUInteger ix = [_urls indexOfObjectPassingTest: ^BOOL(NSURL *object, NSUInteger index, BOOL *stop){
|
|
NSString *path = [object lastPathComponent];
|
|
return [name caseInsensitiveCompare: path] == NSOrderedAscending;
|
|
}];
|
|
|
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: name action: @selector(bookmarkMenu:) keyEquivalent: @""];
|
|
[item setRepresentedObject: url];
|
|
|
|
if (ix == NSNotFound) {
|
|
_urls = [_urls arrayByAddingObject: url];
|
|
[_menu addItem: item];
|
|
} else {
|
|
|
|
NSInteger n = [_menu numberOfItems];
|
|
[_menu insertItem: item atIndex: n - [_urls count] + ix];
|
|
NSMutableArray *tmp = [_urls mutableCopy];
|
|
|
|
[tmp insertObject: url atIndex: ix];
|
|
}
|
|
|
|
return YES;
|
|
}
|
|
|
|
-(NSDictionary *)loadBookmarkFromURL: (NSURL *)url {
|
|
|
|
NSDictionary *d;
|
|
|
|
if (@available(macOS 10.13, *)) {
|
|
NSError *error = nil;
|
|
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
|
|
if (!d) NSLog(@"Error loading %@: %@", url, error);
|
|
} else {
|
|
d = [NSDictionary dictionaryWithContentsOfURL: url];
|
|
if (!d) NSLog(@"Error loading %@", url);
|
|
}
|
|
return d;
|
|
}
|
|
|
|
|
|
-(void)loadBookmarks {
|
|
|
|
NSURL *url = [self bookmarkDirectory];
|
|
|
|
NSFileManager *fm = [NSFileManager defaultManager];
|
|
|
|
NSError *error = nil;
|
|
|
|
NSArray *files = [fm contentsOfDirectoryAtURL: url
|
|
includingPropertiesForKeys: nil
|
|
options: NSDirectoryEnumerationSkipsHiddenFiles
|
|
error: &error];
|
|
|
|
// bleh, has to create 2 new NSStrings for every comparison
|
|
files = [files sortedArrayUsingComparator: ^(NSURL *a, NSURL *b){
|
|
NSString *aa = [a lastPathComponent];
|
|
NSString *bb = [b lastPathComponent];
|
|
return [aa caseInsensitiveCompare: bb];
|
|
}];
|
|
|
|
|
|
_urls = files;
|
|
}
|
|
|
|
-(void)updateMenu {
|
|
|
|
NSArray *menus = [_menu itemArray];
|
|
for (NSMenuItem *item in [menus reverseObjectEnumerator]) {
|
|
if ([item tag] == 0xdeadbeef) [_menu removeItem: item];
|
|
}
|
|
for (NSURL *url in _urls) {
|
|
NSString *title = [url lastPathComponent]; // [[url lastPathComponent] stringByDeletingPathExtension];
|
|
|
|
NSMenuItem *item = [_menu addItemWithTitle: title action: @selector(bookmarkMenu:) keyEquivalent: @""];
|
|
[item setRepresentedObject: url];
|
|
[item setTag: 0xdeadbeef];
|
|
}
|
|
}
|
|
|
|
@end
|