/core/externals/update-engine/externals/gdata-objectivec-client/Examples/MapsSample/MapsSampleWindowController.m

http://macfuse.googlecode.com/ · Objective C · 853 lines · 573 code · 221 blank · 59 comment · 80 complexity · 7801a40f9d98559296a8a30147bab742 MD5 · raw file

  1. /* Copyright (c) 2009 Google Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. //
  16. // MapSampleWindowController.m
  17. //
  18. #import "MapsSampleWindowController.h"
  19. @interface MapsSampleWindowController (PrivateMethods)
  20. - (void)updateUI;
  21. - (void)fetchFeedOfMaps;
  22. - (void)fetchFeaturesOfSelectedMap;
  23. - (void)addAMap;
  24. - (void)renameSelectedMap;
  25. - (void)deleteSelectedMap;
  26. - (void)addFeatureToSelectedMap;
  27. - (void)renameSelectedFeature;
  28. - (void)deleteSelectedFeature;
  29. - (GDataServiceGoogleMaps *)mapService;
  30. - (GDataEntryMap *)selectedMap;
  31. - (GDataEntryMapFeature *)selectedFeature;
  32. - (GDataFeedMap *)mapFeed;
  33. - (void)setMapFeed:(GDataFeedMap *)feed;
  34. - (NSError *)mapFetchError;
  35. - (void)setMapFetchError:(NSError *)error;
  36. - (GDataServiceTicket *)mapFeedTicket;
  37. - (void)setMapFeedTicket:(GDataServiceTicket *)obj;
  38. - (GDataServiceTicket *)mapEditTicket;
  39. - (void)setMapEditTicket:(GDataServiceTicket *)obj;
  40. - (GDataFeedMapFeature *)featureFeed;
  41. - (void)setFeatureFeed:(GDataFeedMapFeature *)feed;
  42. - (NSError *)featureFetchError;
  43. - (void)setFeatureFetchError:(NSError *)error;
  44. - (GDataServiceTicket *)featureFeedTicket;
  45. - (void)setFeatureFeedTicket:(GDataServiceTicket *)obj;
  46. - (GDataServiceTicket *)featureEditTicket;
  47. - (void)setFeatureEditTicket:(GDataServiceTicket *)obj;
  48. @end
  49. @implementation MapsSampleWindowController
  50. + (MapsSampleWindowController *)sharedWindowController {
  51. static MapsSampleWindowController* gWindowController = nil;
  52. if (!gWindowController) {
  53. gWindowController = [[MapsSampleWindowController alloc] init];
  54. }
  55. return gWindowController;
  56. }
  57. - (id)init {
  58. return [self initWithWindowNibName:@"MapsSampleWindow"];
  59. }
  60. - (void)windowDidLoad {
  61. }
  62. - (void)awakeFromNib {
  63. // Set the result text fields to have a distinctive color and mono-spaced font
  64. [mMapResultTextField setTextColor:[NSColor darkGrayColor]];
  65. [mFeatureResultTextField setTextColor:[NSColor darkGrayColor]];
  66. NSFont *resultTextFont = [NSFont fontWithName:@"Monaco" size:9];
  67. [mMapResultTextField setFont:resultTextFont];
  68. [mFeatureResultTextField setFont:resultTextFont];
  69. [self updateUI];
  70. }
  71. - (void)dealloc {
  72. [mMapFeed release];
  73. [mMapFeedTicket release];
  74. [mMapFetchError release];
  75. [mMapEditTicket release];
  76. [mFeatureFeed release];
  77. [mFeatureFeedTicket release];
  78. [mFeatureFetchError release];
  79. [mFeatureEditTicket release];
  80. [super dealloc];
  81. }
  82. #pragma mark -
  83. - (void)updateUI {
  84. // map list display
  85. [mMapTable reloadData];
  86. if (mMapFeedTicket != nil || mMapEditTicket != nil) {
  87. [mMapProgressIndicator startAnimation:self];
  88. } else {
  89. [mMapProgressIndicator stopAnimation:self];
  90. }
  91. // map fetch result or selected item
  92. NSString *resultStr = @"";
  93. if (mMapFetchError) {
  94. resultStr = [mMapFetchError description];
  95. } else {
  96. GDataEntryMap *map = [self selectedMap];
  97. if (map) {
  98. resultStr = [map description];
  99. }
  100. }
  101. [mMapResultTextField setString:resultStr];
  102. // enable map edit buttons
  103. BOOL isMapSelected = ([self selectedMap] != nil);
  104. BOOL isMapNamePresent = ([[mMapNameField stringValue] length] > 0);
  105. [mAddMapButton setEnabled:isMapNamePresent];
  106. [mRenameMapButton setEnabled:(isMapSelected && isMapNamePresent)];
  107. [mDeleteMapButton setEnabled:isMapSelected];
  108. // features list display
  109. [mFeatureTable reloadData];
  110. if (mFeatureFeedTicket != nil || mFeatureEditTicket != nil) {
  111. [mFeatureProgressIndicator startAnimation:self];
  112. } else {
  113. [mFeatureProgressIndicator stopAnimation:self];
  114. }
  115. // feature fetch result or selected item
  116. resultStr = @"";
  117. if (mFeatureFetchError) {
  118. resultStr = [mFeatureFetchError description];
  119. } else {
  120. GDataEntryMapFeature *feature = [self selectedFeature];
  121. if (feature) {
  122. resultStr = [feature description];
  123. }
  124. }
  125. [mFeatureResultTextField setString:resultStr];
  126. // enable feature edit buttons
  127. BOOL isFeatureSelected = ([self selectedFeature] != nil);
  128. BOOL isFeatureNamePresent = ([[mFeatureNameField stringValue] length] > 0);
  129. [mAddFeatureButton setEnabled:isFeatureNamePresent];
  130. [mRenameFeatureButton setEnabled:(isFeatureSelected && isFeatureNamePresent)];
  131. [mDeleteFeatureButton setEnabled:isFeatureSelected];
  132. }
  133. #pragma mark IBActions
  134. - (IBAction)getMapsClicked:(id)sender {
  135. NSCharacterSet *wsSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
  136. NSString *username = [mUsernameField stringValue];
  137. username = [username stringByTrimmingCharactersInSet:wsSet];
  138. if ([username rangeOfString:@"@"].location == NSNotFound) {
  139. // if no domain was supplied, add @gmail.com
  140. username = [username stringByAppendingString:@"@gmail.com"];
  141. }
  142. [mUsernameField setStringValue:username];
  143. [self fetchFeedOfMaps];
  144. }
  145. - (IBAction)spatialSearchClicked:(id)sender {
  146. [self fetchFeaturesOfSelectedMap];
  147. }
  148. - (IBAction)addMapClicked:(id)sender {
  149. [self addAMap];
  150. }
  151. - (IBAction)renameMapClicked:(id)sender {
  152. [self renameSelectedMap];
  153. }
  154. - (IBAction)deleteMapClicked:(id)sender {
  155. GDataEntryMap *map = [self selectedMap];
  156. NSBeginAlertSheet(@"Delete", nil, @"Cancel", nil,
  157. [self window], self,
  158. @selector(deleteMapSheetDidEnd:returnCode:contextInfo:),
  159. nil, nil, @"Delete map \"%@\"?",
  160. [[map title] stringValue]);
  161. }
  162. - (void)deleteMapSheetDidEnd:(NSWindow *)sheet
  163. returnCode:(int)returnCode
  164. contextInfo:(void *)contextInfo {
  165. if (returnCode == NSOKButton) {
  166. [self deleteSelectedMap];
  167. }
  168. }
  169. - (IBAction)addFeatureClicked:(id)sender {
  170. [self addFeatureToSelectedMap];
  171. }
  172. - (IBAction)renameFeatureClicked:(id)sender {
  173. [self renameSelectedFeature];
  174. }
  175. - (IBAction)deleteFeatureClicked:(id)sender {
  176. GDataEntryMapFeature *feature = [self selectedFeature];
  177. NSBeginAlertSheet(@"Delete", nil, @"Cancel", nil,
  178. [self window], self,
  179. @selector(deleteFeatureSheetDidEnd:returnCode:contextInfo:),
  180. nil, nil, @"Delete feature \"%@\"?",
  181. [[feature title] stringValue]);
  182. }
  183. - (void)deleteFeatureSheetDidEnd:(NSWindow *)sheet
  184. returnCode:(int)returnCode
  185. contextInfo:(void *)contextInfo {
  186. if (returnCode == NSOKButton) {
  187. [self deleteSelectedFeature];
  188. }
  189. }
  190. - (IBAction)loggingCheckboxClicked:(id)sender {
  191. [GTMHTTPFetcher setLoggingEnabled:[sender state]];
  192. }
  193. #pragma mark -
  194. // get a map service object with the current username/password
  195. //
  196. // A "service" object handles networking tasks. Service objects
  197. // contain user authentication information as well as networking
  198. // state information (such as cookies and the "last modified" date for
  199. // fetched data.)
  200. - (GDataServiceGoogleMaps *)mapService {
  201. static GDataServiceGoogleMaps* service = nil;
  202. if (!service) {
  203. service = [[GDataServiceGoogleMaps alloc] init];
  204. [service setShouldCacheResponseData:YES];
  205. [service setServiceShouldFollowNextLinks:YES];
  206. }
  207. // username/password may change
  208. NSString *username = [mUsernameField stringValue];
  209. NSString *password = [mPasswordField stringValue];
  210. [service setUserCredentialsWithUsername:username
  211. password:password];
  212. return service;
  213. }
  214. // get the map selected in the top list, or nil if none
  215. - (GDataEntryMap *)selectedMap {
  216. NSArray *maps = [mMapFeed entries];
  217. int rowIndex = [mMapTable selectedRow];
  218. if ([maps count] > 0 && rowIndex > -1) {
  219. GDataEntryMap *map = [maps objectAtIndex:rowIndex];
  220. return map;
  221. }
  222. return nil;
  223. }
  224. // get the feature selected in the second list, or nil if none
  225. - (GDataEntryMapFeature *)selectedFeature {
  226. NSArray *features = [mFeatureFeed entries];
  227. int rowIndex = [mFeatureTable selectedRow];
  228. if ([features count] > 0 && rowIndex > -1) {
  229. GDataEntryMapFeature *feature = [features objectAtIndex:rowIndex];
  230. return feature;
  231. }
  232. return nil;
  233. }
  234. #pragma mark Fetch feed of all of the user's maps
  235. // begin retrieving the list of the user's maps
  236. - (void)fetchFeedOfMaps {
  237. [self setMapFeed:nil];
  238. [self setMapFetchError:nil];
  239. [self setFeatureFeed:nil];
  240. [self setFeatureFeedTicket:nil];
  241. [self setFeatureFetchError:nil];
  242. GDataServiceGoogleMaps *service = [self mapService];
  243. NSURL *feedURL = [GDataServiceGoogleMaps mapsFeedURLForUserID:kGDataServiceDefaultUser
  244. projection:kGDataMapsProjectionFull];
  245. GDataServiceTicket *ticket;
  246. ticket = [service fetchFeedWithURL:feedURL
  247. delegate:self
  248. didFinishSelector:@selector(mapsTicket:finishedWithFeed:error:)];
  249. [self setMapFeedTicket:ticket];
  250. [self updateUI];
  251. }
  252. // map feed fetch callback
  253. - (void)mapsTicket:(GDataServiceTicket *)ticket
  254. finishedWithFeed:(GDataFeedMap *)feed
  255. error:(NSError *)error {
  256. [self setMapFeed:feed];
  257. [self setMapFetchError:error];
  258. [self setMapFeedTicket:nil];
  259. [self updateUI];
  260. }
  261. #pragma mark Fetch a map's features
  262. // for the map selected in the top list, begin retrieving the lists of
  263. // features and tables
  264. - (void)fetchFeaturesOfSelectedMap {
  265. GDataEntryMap *map = [self selectedMap];
  266. if (map) {
  267. GDataServiceGoogleMaps *service = [self mapService];
  268. // fetch the feed of features
  269. NSURL *featuresFeedURL = [map featuresFeedURL];
  270. if (featuresFeedURL) {
  271. GDataQueryMaps *query;
  272. if ([mSpatialSearchCheckbox state] == NSOffState) {
  273. // fetch all features of the selected map
  274. query = [GDataQueryMaps mapsQueryWithFeedURL:featuresFeedURL];
  275. } else {
  276. // The "In circle:" checkbox is selected, so do a snippet query with
  277. // the user's specified parameters
  278. // The Maps API does not provide a clean way to get the URL for the
  279. // snippets feed (bug 2335402)
  280. NSString *featuresStr = [featuresFeedURL absoluteString];
  281. NSString *snippetsStr = [featuresStr stringByReplacingOccurrencesOfString:@"/full"
  282. withString:@"/snippet"];
  283. NSURL *snippetsURL = [NSURL URLWithString:snippetsStr];
  284. query = [GDataQueryMaps mapsQueryWithFeedURL:snippetsURL];
  285. // put the user's spatial settings into the query
  286. double lat = [mLatitudeField doubleValue];
  287. double lon = [mLongitudeField doubleValue];
  288. double radius = [mRadiusField doubleValue];
  289. [query setLatitude:lat];
  290. [query setLongitude:lon];
  291. [query setRadius:radius];
  292. }
  293. [self setFeatureFeed:nil];
  294. [self setFeatureFetchError:nil];
  295. GDataServiceTicket *ticket;
  296. ticket = [service fetchFeedWithQuery:query
  297. delegate:self
  298. didFinishSelector:@selector(featuresTicket:finishedWithFeed:error:)];
  299. [self setFeatureFeedTicket:ticket];
  300. }
  301. [self updateUI];
  302. }
  303. }
  304. // features fetch callback
  305. - (void)featuresTicket:(GDataServiceTicket *)ticket
  306. finishedWithFeed:(GDataFeedMapFeature *)feed
  307. error:(NSError *)error {
  308. [self setFeatureFeed:feed];
  309. [self setFeatureFetchError:error];
  310. [self setFeatureFeedTicket:nil];
  311. [self updateUI];
  312. }
  313. #pragma mark Add a map
  314. - (void)addAMap {
  315. NSURL *postURL = [[mMapFeed postLink] URL];
  316. NSString *title = [mMapNameField stringValue];
  317. if (postURL != nil && [title length] > 0) {
  318. GDataEntryMap *newEntry = [GDataEntryMap mapEntryWithTitle:title];
  319. NSString *summaryStr = [NSString stringWithFormat:@"Map created %@",
  320. [NSDate date]];
  321. [newEntry setSummaryWithString:summaryStr];
  322. GDataServiceGoogleMaps *service = [self mapService];
  323. GDataServiceTicket *ticket;
  324. ticket = [service fetchEntryByInsertingEntry:newEntry
  325. forFeedURL:postURL
  326. delegate:self
  327. didFinishSelector:@selector(addMapTicket:finishedWithEntry:error:)];
  328. [self setMapEditTicket:ticket];
  329. [self updateUI];
  330. }
  331. }
  332. - (void)addMapTicket:(GDataServiceTicket *)ticket
  333. finishedWithEntry:(GDataEntryMap *)entry
  334. error:(NSError *)error {
  335. [self setMapEditTicket:nil];
  336. if (error == nil) {
  337. NSBeginAlertSheet(@"Map added", nil, nil, nil,
  338. [self window], nil, nil,
  339. nil, nil, @"Added map \"%@\"", [[entry title] stringValue]);
  340. [self fetchFeedOfMaps];
  341. } else {
  342. NSBeginAlertSheet(@"Add Map Error", nil, nil, nil,
  343. [self window], nil, nil,
  344. nil, nil, @"%@", error);
  345. [self updateUI];
  346. }
  347. }
  348. #pragma mark Rename a map
  349. - (void)renameSelectedMap {
  350. GDataEntryMap *selectedMap = [self selectedMap];
  351. NSString *newName = [mMapNameField stringValue];
  352. NSURL *editURL = [[selectedMap editLink] URL];
  353. if (editURL != nil && [newName length] > 0) {
  354. GDataServiceGoogleMaps *service = [self mapService];
  355. [selectedMap setTitleWithString:newName];
  356. GDataServiceTicket *ticket;
  357. ticket = [service fetchEntryByUpdatingEntry:selectedMap
  358. delegate:self
  359. didFinishSelector:@selector(renameMapTicket:finishedWithEntry:error:)];
  360. [self setMapEditTicket:ticket];
  361. [self updateUI];
  362. }
  363. }
  364. // rename map callback
  365. - (void)renameMapTicket:(GDataServiceTicket *)ticket
  366. finishedWithEntry:(GDataEntryMap *)entry
  367. error:(NSError *)error {
  368. [self setMapEditTicket:nil];
  369. if (error == nil) {
  370. NSBeginAlertSheet(@"Map renamed", nil, nil, nil,
  371. [self window], nil, nil,
  372. nil, nil, @"Renamed map to \"%@\"",
  373. [[entry title] stringValue]);
  374. [self fetchFeedOfMaps];
  375. } else {
  376. NSBeginAlertSheet(@"Rename Map Error", nil, nil, nil,
  377. [self window], nil, nil,
  378. nil, nil, @"%@", error);
  379. [self updateUI];
  380. }
  381. }
  382. #pragma mark Delete the map
  383. - (void)deleteSelectedMap {
  384. GDataEntryMap *selectedMap = [self selectedMap];
  385. if (selectedMap) {
  386. GDataServiceGoogleMaps *service = [self mapService];
  387. GDataServiceTicket *ticket;
  388. ticket = [service deleteEntry:selectedMap
  389. delegate:self
  390. didFinishSelector:@selector(deleteMapTicket:finishedWithNil:error:)];
  391. [self setMapEditTicket:ticket];
  392. // save the name in the ticket
  393. [ticket setProperty:[[selectedMap title] stringValue]
  394. forKey:@"mapName"];
  395. [self updateUI];
  396. }
  397. }
  398. - (void)deleteMapTicket:(GDataServiceTicket *)ticket
  399. finishedWithNil:(GDataObject *)nilObj
  400. error:(NSError *)error {
  401. [self setMapEditTicket:nil];
  402. if (error == nil) {
  403. NSString *name = [ticket propertyForKey:@"mapName"];
  404. NSBeginAlertSheet(@"Map deleted", nil, nil, nil,
  405. [self window], nil, nil,
  406. nil, nil, @"Deleted map \"%@\"", name);
  407. [self fetchFeedOfMaps];
  408. } else {
  409. NSBeginAlertSheet(@"Delete Map Error", nil, nil, nil,
  410. [self window], nil, nil,
  411. nil, nil, @"%@", error);
  412. [self updateUI];
  413. }
  414. }
  415. #pragma mark Add a feature
  416. - (void)addFeatureToSelectedMap {
  417. NSURL *postURL = [[mFeatureFeed postLink] URL];
  418. NSString *title = [mFeatureNameField stringValue];
  419. if (postURL != nil && [title length] > 0) {
  420. GDataEntryMapFeature *newEntry = [GDataEntryMapFeature featureEntryWithTitle:title];
  421. NSString *summaryStr = [NSString stringWithFormat:@"Feature created %@",
  422. [NSDate date]];
  423. [newEntry setSummaryWithString:summaryStr];
  424. NSString *kmlStr = @"<Placemark xmlns='http://earth.google.com/kml/2.2'>"
  425. "<name>Faulkner's Birthplace</name><Point><coordinates>"
  426. "-89.520753,34.360902,0.0</coordinates></Point></Placemark>";
  427. NSError *error = nil;
  428. NSXMLElement *kmlElem;
  429. kmlElem = [[[NSXMLElement alloc] initWithXMLString:kmlStr
  430. error:&error] autorelease];
  431. if (kmlElem) {
  432. [newEntry addKMLValue:kmlElem];
  433. } else {
  434. NSLog(@"cannot make kml element, %@", error);
  435. }
  436. GDataServiceGoogleMaps *service = [self mapService];
  437. GDataServiceTicket *ticket;
  438. ticket = [service fetchEntryByInsertingEntry:newEntry
  439. forFeedURL:postURL
  440. delegate:self
  441. didFinishSelector:@selector(addFeatureTicket:finishedWithEntry:error:)];
  442. [self setFeatureEditTicket:ticket];
  443. [self updateUI];
  444. }
  445. }
  446. - (void)addFeatureTicket:(GDataServiceTicket *)ticket
  447. finishedWithEntry:(GDataEntryMap *)entry
  448. error:(NSError *)error {
  449. [self setFeatureEditTicket:nil];
  450. if (error == nil) {
  451. NSBeginAlertSheet(@"Feature added", nil, nil, nil,
  452. [self window], nil, nil,
  453. nil, nil, @"Added feature \"%@\"",
  454. [[entry title] stringValue]);
  455. [self fetchFeaturesOfSelectedMap];
  456. } else {
  457. NSBeginAlertSheet(@"Add Feature Error", nil, nil, nil,
  458. [self window], nil, nil,
  459. nil, nil, @"%@", error);
  460. [self updateUI];
  461. }
  462. }
  463. #pragma mark Rename a feature
  464. - (void)renameSelectedFeature {
  465. GDataEntryMapFeature *selectedFeature = [self selectedFeature];
  466. NSString *newName = [mFeatureNameField stringValue];
  467. NSURL *editURL = [[selectedFeature editLink] URL];
  468. if (editURL != nil && [newName length] > 0) {
  469. GDataServiceGoogleMaps *service = [self mapService];
  470. // reuse the title object in the feature entry, since it has the proper
  471. // namespaces needed for editing features, as those are returned from
  472. // the server with a default namespace of kml
  473. //
  474. // if we called [selectedFeature setTitleWithString:] that would create
  475. // a new title object, without the namespacing expected when updating
  476. // feature entries
  477. [[selectedFeature title] setStringValue:newName];
  478. GDataServiceTicket *ticket;
  479. ticket = [service fetchEntryByUpdatingEntry:selectedFeature
  480. delegate:self
  481. didFinishSelector:@selector(renameFeatureTicket:finishedWithEntry:error:)];
  482. [self setFeatureEditTicket:ticket];
  483. [self updateUI];
  484. }
  485. }
  486. - (void)renameFeatureTicket:(GDataServiceTicket *)ticket
  487. finishedWithEntry:(GDataEntryMapFeature *)entry
  488. error:(NSError *)error {
  489. [self setFeatureEditTicket:nil];
  490. if (error == nil) {
  491. NSBeginAlertSheet(@"Feature renamed", nil, nil, nil,
  492. [self window], nil, nil,
  493. nil, nil, @"Renamed feature to \"%@\"",
  494. [[entry title] stringValue]);
  495. [self fetchFeaturesOfSelectedMap];
  496. } else {
  497. NSBeginAlertSheet(@"Rename Feature Error", nil, nil, nil,
  498. [self window], nil, nil,
  499. nil, nil, @"%@", error);
  500. [self updateUI];
  501. }
  502. }
  503. #pragma mark Delete the feature
  504. - (void)deleteSelectedFeature {
  505. GDataEntryMapFeature *selectedFeature = [self selectedFeature];
  506. if (selectedFeature) {
  507. GDataServiceGoogleMaps *service = [self mapService];
  508. GDataServiceTicket *ticket;
  509. ticket = [service deleteEntry:selectedFeature
  510. delegate:self
  511. didFinishSelector:@selector(deleteFeatureTicket:finishedWithNil:error:)];
  512. [self setFeatureEditTicket:ticket];
  513. // save the name in the ticket
  514. [ticket setProperty:[[selectedFeature title] stringValue]
  515. forKey:@"featureName"];
  516. [self updateUI];
  517. }
  518. }
  519. - (void)deleteFeatureTicket:(GDataServiceTicket *)ticket
  520. finishedWithNil:(GDataObject *)nilObj
  521. error:(NSError *)error {
  522. [self setFeatureEditTicket:nil];
  523. if (error == nil) {
  524. NSString *name = [ticket propertyForKey:@"featureName"];
  525. NSBeginAlertSheet(@"Feature deleted", nil, nil, nil,
  526. [self window], nil, nil,
  527. nil, nil, @"Deleted feature \"%@\"", name);
  528. [self fetchFeaturesOfSelectedMap];
  529. } else {
  530. NSBeginAlertSheet(@"Delete Feature Error", nil, nil, nil,
  531. [self window], nil, nil,
  532. nil, nil, @"%@", error);
  533. [self updateUI];
  534. }
  535. }
  536. #pragma mark Text field delegate methods
  537. - (void)controlTextDidChange:(NSNotification *)note {
  538. [self updateUI]; // enabled/disable buttons
  539. }
  540. #pragma mark TableView delegate and data source methods
  541. - (void)tableViewSelectionDidChange:(NSNotification *)notification {
  542. id obj = [notification object];
  543. if (obj == mMapTable) {
  544. // the user clicked on a map, so fetch its features and tables
  545. [self fetchFeaturesOfSelectedMap];
  546. } else {
  547. // just update the results view for the selected item
  548. [self updateUI];
  549. }
  550. }
  551. // table view data source methods
  552. - (GDataFeedBase *)feedForTableView:(NSTableView *)tableView {
  553. if (tableView == mMapTable) return mMapFeed;
  554. if (tableView == mFeatureTable) return mFeatureFeed;
  555. return nil;
  556. }
  557. - (int)numberOfRowsInTableView:(NSTableView *)tableView {
  558. GDataFeedBase *feed = [self feedForTableView:tableView];
  559. return [[feed entries] count];
  560. }
  561. - (id)tableView:(NSTableView *)tableView
  562. objectValueForTableColumn:(NSTableColumn *)tableColumn
  563. row:(int)row {
  564. GDataFeedBase *feed = [self feedForTableView:tableView];
  565. GDataEntryBase *entry = [feed entryAtIndex:row];
  566. NSString *title = [[entry title] stringValue];
  567. if ([entry isKindOfClass:[GDataEntryMap class]]) {
  568. BOOL isAPIVisible = [(GDataEntryMap *)entry isAPIVisible];
  569. if (!isAPIVisible) {
  570. title = [title stringByAppendingString:@" (not API visible)"];
  571. }
  572. }
  573. return title;
  574. }
  575. #pragma mark Setters and Getters
  576. - (GDataFeedMap *)mapFeed {
  577. return mMapFeed;
  578. }
  579. - (void)setMapFeed:(GDataFeedMap *)feed {
  580. [mMapFeed autorelease];
  581. mMapFeed = [feed retain];
  582. }
  583. - (NSError *)mapFetchError {
  584. return mMapFetchError;
  585. }
  586. - (void)setMapFetchError:(NSError *)error {
  587. [mMapFetchError release];
  588. mMapFetchError = [error retain];
  589. }
  590. - (GDataServiceTicket *)mapFeedTicket {
  591. return mMapFeedTicket;
  592. }
  593. - (void)setMapFeedTicket:(GDataServiceTicket *)obj {
  594. [mMapFeedTicket autorelease];
  595. mMapFeedTicket = [obj retain];
  596. }
  597. - (GDataServiceTicket *)mapEditTicket {
  598. return mMapEditTicket;
  599. }
  600. - (void)setMapEditTicket:(GDataServiceTicket *)obj {
  601. [mMapEditTicket autorelease];
  602. mMapEditTicket = [obj retain];
  603. }
  604. - (GDataFeedMapFeature *)featureFeed {
  605. return mFeatureFeed;
  606. }
  607. - (void)setFeatureFeed:(GDataFeedMapFeature *)feed {
  608. [mFeatureFeed autorelease];
  609. mFeatureFeed = [feed retain];
  610. }
  611. - (NSError *)featureFetchError {
  612. return mFeatureFetchError;
  613. }
  614. - (void)setFeatureFetchError:(NSError *)error {
  615. [mFeatureFetchError release];
  616. mFeatureFetchError = [error retain];
  617. }
  618. - (GDataServiceTicket *)featureFeedTicket {
  619. return mFeatureFeedTicket;
  620. }
  621. - (void)setFeatureFeedTicket:(GDataServiceTicket *)obj {
  622. [mFeatureFeedTicket autorelease];
  623. mFeatureFeedTicket = [obj retain];
  624. }
  625. - (GDataServiceTicket *)featureEditTicket {
  626. return mFeatureEditTicket;
  627. }
  628. - (void)setFeatureEditTicket:(GDataServiceTicket *)obj {
  629. [mFeatureEditTicket autorelease];
  630. mFeatureEditTicket = [obj retain];
  631. }
  632. @end