OSDN Git Service

履歴ウインドウにタッチバーを付けた
[kcd/KCD.git] / KCD / HMHistoryWindowController.m
1 //
2 //  HMHistoryWindowController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/03/24.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMHistoryWindowController.h"
10
11 #import "HMLocalDataStore.h"
12
13 #import "HMKaihatuHistory.h"
14 #import "HMKenzoHistory.h"
15 #import "HMDropShipHistory.h"
16
17
18 typedef NS_ENUM(NSUInteger, HMHistoryWindowTabIndex) {
19         kKaihatuHistoryIndex = 0,
20         kKenzoHistoryIndex = 1,
21         kDropHistoryIndex = 2,
22 };
23
24 @interface HMHistoryWindowController () <NSTabViewDelegate, NSTableViewDelegate>
25
26 @property (readonly) NSManagedObjectContext *manageObjectContext;
27
28 @property NSInteger selectedTabIndex;
29
30 @property (nonatomic, strong) IBOutlet NSArrayController *kaihatuHistoryController;
31 @property (nonatomic, strong) IBOutlet NSArrayController *kenzoHistoryController;
32 @property (nonatomic, strong) IBOutlet NSArrayController *dropHistoryController;
33
34 @property (nonatomic, weak) IBOutlet NSTableView *kaihatuHistoryTableView;
35 @property (nonatomic, weak) IBOutlet NSTableView *kenzoHistoryTableView;
36 @property (nonatomic, weak) IBOutlet NSTableView *dropHistoryTableView;
37
38 @property (nonatomic, weak) IBOutlet NSSearchField *searchField;
39
40 @property (nonatomic, strong) IBOutlet NSTouchBar *myTouchBar;
41 @property (nonatomic, weak) IBOutlet NSButton *searchButton;
42
43 @end
44
45 @implementation HMHistoryWindowController
46
47 - (id)init
48 {
49         self = [super initWithWindowNibName:NSStringFromClass([self class])];
50         
51         return self;
52 }
53
54 - (void)windowDidLoad
55 {
56     [super windowDidLoad];
57     
58         NSString *predicateFormat = @"";
59         NSArrayController *target = nil;
60         switch (self.selectedTabIndex) {
61                 case kKaihatuHistoryIndex:
62                         target = self.kaihatuHistoryController;
63                         predicateFormat = @"name contains $value";
64                         break;
65                 case kKenzoHistoryIndex:
66                         target = self.kenzoHistoryController;
67                         predicateFormat = @"name contains $value";
68                         break;
69                 case kDropHistoryIndex:
70                         target = self.dropHistoryController;
71                         predicateFormat = @"shipName contains $value";
72                         break;
73                         
74         }
75         
76         if(!target) return;
77         
78         [self.searchField bind:NSPredicateBinding
79                                   toObject:target
80                            withKeyPath:NSFilterPredicateBinding
81                                    options:@{
82                                                          NSPredicateFormatBindingOption : predicateFormat,
83                                                          }];
84 }
85
86 - (NSManagedObjectContext *)manageObjectContext
87 {
88         return [[HMLocalDataStore defaultManager] managedObjectContext];
89 }
90
91 - (IBAction)delete:(id)sender
92 {
93         NSArrayController *target = nil;
94         switch (self.selectedTabIndex) {
95                 case kKaihatuHistoryIndex:
96                         target = self.kaihatuHistoryController;
97                         break;
98                 case kKenzoHistoryIndex:
99                         target = self.kenzoHistoryController;
100                         break;
101                 case kDropHistoryIndex:
102                         target = self.dropHistoryController;
103                         break;
104                         
105         }
106         
107         if(!target) return;
108         
109         NSArray *original = [target selectedObjects];
110         NSMutableArray *objectIds = [NSMutableArray new];
111         for(NSManagedObject *object in original) {
112                 [objectIds addObject:object.objectID];
113         }
114         
115         HMLocalDataStore *store = [HMLocalDataStore oneTimeEditor];
116         NSManagedObjectContext *moc = store.managedObjectContext;
117         
118         for(NSManagedObjectID *objectID in objectIds) {
119                 NSManagedObject *object = [moc objectWithID:objectID];
120                 [moc deleteObject:object];
121         }
122 }
123
124 - (IBAction)addMark:(id)sender
125 {
126         NSArrayController *target = nil;
127         NSTableView *targetView = nil;
128         switch (self.selectedTabIndex) {
129                 case kKaihatuHistoryIndex:
130                         target = self.kaihatuHistoryController;
131                         targetView = self.kaihatuHistoryTableView;
132                         break;
133                 case kKenzoHistoryIndex:
134                         target = self.kenzoHistoryController;
135                         targetView = self.kenzoHistoryTableView;
136                         break;
137                 case kDropHistoryIndex:
138                         target = self.dropHistoryController;
139                         targetView = self.dropHistoryTableView;
140                         break;
141                         
142         }
143         
144         if(!target) return;
145         
146         NSArray *a = target.arrangedObjects;
147         id o = a[targetView.clickedRow];
148         
149         NSString *entityName = nil;
150         NSPredicate *predicate = nil;
151         switch (self.selectedTabIndex) {
152                 case kKaihatuHistoryIndex:
153                 {
154                         HMKaihatuHistory *obj = o;
155                         entityName = @"KaihatuHistory";
156                         predicate = [NSPredicate predicateWithFormat:@"date = %@ AND name = %@", obj.date, obj.name];
157                         break;
158                 }
159                 case kKenzoHistoryIndex:
160                 {
161                         HMKenzoHistory *obj = o;
162                         entityName = @"KenzoHistory";
163                         predicate = [NSPredicate predicateWithFormat:@"date = %@ AND name = %@", obj.date, obj.name];
164                         break;
165                 }
166                 case kDropHistoryIndex:
167                 {
168                         HMDropShipHistory *obj = o;
169                         entityName = @"DropShipHistory";
170                         predicate = [NSPredicate predicateWithFormat:@"date = %@ AND mapCell = %@", obj.date, obj.mapCell];
171                         break;
172                 }
173                         
174         }
175         
176         HMLocalDataStore *store = [HMLocalDataStore oneTimeEditor];
177         NSError *error = nil;
178         NSArray<HMDropShipHistory *> *array = [store objectsWithEntityName:entityName predicate:predicate error:&error];
179         if(array.count == 0) {
180                 NSLog(@"%s: ERROR", __PRETTY_FUNCTION__);
181                 return;
182         }
183         
184         BOOL mark = array[0].mark.boolValue;
185         array[0].mark = mark ? @NO : @YES;
186         [store saveAction:nil];
187 }
188
189 - (IBAction)selectSearchField:(id)sender
190 {
191     [self.window makeFirstResponder:self.searchField];
192 }
193
194 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
195 {
196         SEL action = menuItem.action;
197         if(action == @selector(addMark:)) {
198                 NSArrayController *target = nil;
199                 NSTableView *targetView = nil;
200                 switch (self.selectedTabIndex) {
201                         case kKaihatuHistoryIndex:
202                                 target = self.kaihatuHistoryController;
203                                 targetView = self.kaihatuHistoryTableView;
204                                 break;
205                         case kKenzoHistoryIndex:
206                                 target = self.kenzoHistoryController;
207                                 targetView = self.kenzoHistoryTableView;
208                                 break;
209                         case kDropHistoryIndex:
210                                 target = self.dropHistoryController;
211                                 targetView = self.dropHistoryTableView;
212                                 break;
213                                 
214                 }
215                 
216                 if(target) {
217                         NSArray<HMDropShipHistory *> *a = target.arrangedObjects;
218                         HMDropShipHistory *o = a[targetView.clickedRow];
219                         
220                         if(o.mark.boolValue) {
221                                 menuItem.title = NSLocalizedString(@"Remove mark", @"Remove history mark.");
222                         } else {
223                                 menuItem.title = NSLocalizedString(@"Add mark", @"Add history mark.");
224                         }
225                 }
226         }
227         
228         return YES;
229 }
230
231 - (NSTouchBar *)touchBar
232 {
233     if(NSClassFromString(@"NSTouchBar") == Nil) return nil;
234     
235     if(self.myTouchBar) return self.myTouchBar;
236     
237     NSArray *toplevel = nil;
238     NSBundle *mainBundle = [NSBundle mainBundle];
239     [mainBundle loadNibNamed:@"HistoryWindowTouchBar"
240                        owner:self
241              topLevelObjects:&toplevel];
242     
243     return self.myTouchBar;
244 }
245
246 #pragma mark - NSTableViewDelegate & NSTableViewDataSource
247
248 - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
249 {
250         NSView *itemView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
251         return itemView;
252 }
253
254 #pragma mark - NSTabViewDelegate
255 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem
256 {
257         [self.searchField unbind:NSPredicateBinding];
258         
259         NSString *predicateFormat = @"";
260         NSArrayController *target = nil;
261         switch (self.selectedTabIndex) {
262                 case kKaihatuHistoryIndex:
263                         target = self.kaihatuHistoryController;
264                         predicateFormat = @"name contains $value";
265                         break;
266                 case kKenzoHistoryIndex:
267                         target = self.kenzoHistoryController;
268                         predicateFormat = @"name contains $value";
269                         break;
270                 case kDropHistoryIndex:
271                         target = self.dropHistoryController;
272                         predicateFormat = @"shipName contains $value";
273                         break;
274                         
275         }
276         
277         if(!target) return;
278         
279         [self.searchField bind:NSPredicateBinding
280                                  toObject:target
281                           withKeyPath:NSFilterPredicateBinding
282                                   options:@{
283                                                         NSPredicateFormatBindingOption : predicateFormat,
284                                                         }];
285 }
286
287
288 @end