// // UIControls.m // PhoneGap // // Created by Michael Nachbaur on 13/04/09. // Copyright 2009 Decaf Ninja Software. All rights reserved. // #import "UIControls.h" @implementation UIControls #ifndef __IPHONE_3_0 @synthesize webView; #endif -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView { self = (UIControls*)[super initWithWebView:theWebView]; if (self) { tabBarItems = [[NSMutableDictionary alloc] initWithCapacity:5]; } return self; } /** * Create a native tab bar at either the top or the bottom of the display. * @brief creates a tab bar * @param arguments unused * @param options unused */ - (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { tabBar = [UITabBar new]; [tabBar sizeToFit]; tabBar.delegate = self; tabBar.multipleTouchEnabled = NO; tabBar.autoresizesSubviews = YES; tabBar.hidden = YES; tabBar.userInteractionEnabled = YES; [self.webView.superview addSubview:tabBar]; } /** * Show the tab bar after its been created. * @brief show the tab bar * @param arguments unused * @param options used to indicate options for where and how the tab bar should be placed * - \c height integer indicating the height of the tab bar (default: \c 49) * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom) */ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; CGFloat height = 49.0f; BOOL atBottom = YES; NSDictionary* tabSettings = [settings objectForKey:@"TabBarSettings"]; if (tabSettings) { height = [[tabSettings objectForKey:@"height"] floatValue]; atBottom = [[tabSettings objectForKey:@"position"] isEqualToString:@"bottom"]; } tabBar.hidden = NO; CGRect webViewBounds = webView.bounds; CGRect tabBarBounds; if (atBottom) { tabBarBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y + webViewBounds.size.height - height, webViewBounds.size.width, height ); webViewBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y, webViewBounds.size.width, webViewBounds.size.height - height ); } else { tabBarBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y, webViewBounds.size.width, height ); webViewBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y + height, webViewBounds.size.width, webViewBounds.size.height - height ); } [tabBar setFrame:tabBarBounds]; [webView setFrame:webViewBounds]; } /** * Hide the tab bar * @brief hide the tab bar * @param arguments unused * @param options unused */ - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; tabBar.hidden = YES; } /** * Create a new tab bar item for use on a previously created tab bar. Use ::showTabBarItems to show the new item on the tab bar. * * If the supplied image name is one of the labels listed below, then this method will construct a tab button * using the standard system buttons. Note that if you use one of the system images, that the \c title you supply will be ignored. * - Tab Buttons * - tabButton:More * - tabButton:Favorites * - tabButton:Featured * - tabButton:TopRated * - tabButton:Recents * - tabButton:Contacts * - tabButton:History * - tabButton:Bookmarks * - tabButton:Search * - tabButton:Downloads * - tabButton:MostRecent * - tabButton:MostViewed * @brief create a tab bar item * @param arguments Parameters used to create the tab bar * -# \c name internal name to refer to this tab by * -# \c title title text to show on the tab, or null if no text should be shown * -# \c image image filename or internal identifier to show, or null if now image should be shown * -# \c tag unique number to be used as an internal reference to this button * @param options Options for customizing the individual tab item * - \c badge value to display in the optional circular badge on the item; if nil or unspecified, the badge will be hidden */ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; NSString *name = [arguments objectAtIndex:0]; NSString *title = [arguments objectAtIndex:1]; NSString *imageName = [arguments objectAtIndex:2]; int tag = [[arguments objectAtIndex:3] intValue]; UITabBarItem *item = nil; if ([imageName length] > 0) { UIBarButtonSystemItem systemItem = -1; if ([imageName isEqualToString:@"tabButton:More"]) systemItem = UITabBarSystemItemMore; if ([imageName isEqualToString:@"tabButton:Favorites"]) systemItem = UITabBarSystemItemFavorites; if ([imageName isEqualToString:@"tabButton:Featured"]) systemItem = UITabBarSystemItemFeatured; if ([imageName isEqualToString:@"tabButton:TopRated"]) systemItem = UITabBarSystemItemTopRated; if ([imageName isEqualToString:@"tabButton:Recents"]) systemItem = UITabBarSystemItemRecents; if ([imageName isEqualToString:@"tabButton:Contacts"]) systemItem = UITabBarSystemItemContacts; if ([imageName isEqualToString:@"tabButton:History"]) systemItem = UITabBarSystemItemHistory; if ([imageName isEqualToString:@"tabButton:Bookmarks"]) systemItem = UITabBarSystemItemBookmarks; if ([imageName isEqualToString:@"tabButton:Search"]) systemItem = UITabBarSystemItemSearch; if ([imageName isEqualToString:@"tabButton:Downloads"]) systemItem = UITabBarSystemItemDownloads; if ([imageName isEqualToString:@"tabButton:MostRecent"]) systemItem = UITabBarSystemItemMostRecent; if ([imageName isEqualToString:@"tabButton:MostViewed"]) systemItem = UITabBarSystemItemMostViewed; if (systemItem != -1) item = [[UITabBarItem alloc] initWithTabBarSystemItem:systemItem tag:tag]; } if (item == nil) { NSLog(@"Creating with custom image and title"); item = [[UITabBarItem alloc] initWithTitle:title image:[UIImage imageNamed:imageName] tag:tag]; } if ([options objectForKey:@"badge"]) item.badgeValue = [options objectForKey:@"badge"]; [tabBarItems setObject:item forKey:name]; [item release]; } /** * Update an existing tab bar item to change its badge value. * @brief update the badge value on an existing tab bar item * @param arguments Parameters used to identify the tab bar item to update * -# \c name internal name used to represent this item when it was created * @param options Options for customizing the individual tab item * - \c badge value to display in the optional circular badge on the item; if nil or unspecified, the badge will be hidden */ - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; NSString *name = [arguments objectAtIndex:0]; UITabBarItem *item = [tabBarItems objectForKey:name]; if (item) item.badgeValue = [options objectForKey:@"badge"]; } /** * Show previously created items on the tab bar * @brief show a list of tab bar items * @param arguments the item names to be shown * @param options dictionary of options, notable options including: * - \c animate indicates that the items should animate onto the tab bar * @see createTabBarItem * @see createTabBar */ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; int i, count = [arguments count]; NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:count]; for (i = 0; i < count; i++) { NSString *itemName = [arguments objectAtIndex:i]; UITabBarItem *item = [tabBarItems objectForKey:itemName]; if (item) [items addObject:item]; } BOOL animateItems = YES; if ([options objectForKey:@"animate"]) animateItems = [(NSString*)[options objectForKey:@"animate"] boolValue]; [tabBar setItems:items animated:animateItems]; [items release]; } /** * Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item. * @brief manually select a tab bar item * @param arguments the name of the tab bar item to select * @see createTabBarItem * @see showTabBarItems */ - (void)selectTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil withDict:nil]; NSString *itemName = [arguments objectAtIndex:0]; UITabBarItem *item = [tabBarItems objectForKey:itemName]; if (item) tabBar.selectedItem = item; else tabBar.selectedItem = nil; } /* * - Tool Buttons * - toolButton:Done * - toolButton:Cancel * - toolButton:Edit * - toolButton:Save * - toolButton:Add * - toolButton:FlexibleSpace * - toolButton:FixedSpace * - toolButton:Compose * - toolButton:Reply * - toolButton:Action * - toolButton:Organize * - toolButton:Bookmarks * - toolButton:Search * - toolButton:Refresh * - toolButton:Stop * - toolButton:Camera * - toolButton:Trash * - toolButton:Play * - toolButton:Pause * - toolButton:Rewind * - toolButton:FastForward */ /* -(UIBarButtonSystemItem) getSystemItemFromString:(NSString*)imageName { if ([[imageName substringWithRange:NSMakeRange(0, 10)] isEqualTo:@"tabButton:"]) { NSLog(@"Tab button!!"); if ([imageName isEqualTo:@"tabButton:More"]) return UITabBarSystemItemMore; if ([imageName isEqualTo:@"tabButton:Favorites"]) return UITabBarSystemItemFavorites; if ([imageName isEqualTo:@"tabButton:Featured"]) return UITabBarSystemItemFeatured; if ([imageName isEqualTo:@"tabButton:TopRated"]) return UITabBarSystemItemTopRated; if ([imageName isEqualTo:@"tabButton:Recents"]) return UITabBarSystemItemRecents; if ([imageName isEqualTo:@"tabButton:Contacts"]) return UITabBarSystemItemContacts; if ([imageName isEqualTo:@"tabButton:History"]) return UITabBarSystemItemHistory; if ([imageName isEqualTo:@"tabButton:Bookmarks"]) return UITabBarSystemItemBookmarks; if ([imageName isEqualTo:@"tabButton:Search"]) return UITabBarSystemItemSearch; if ([imageName isEqualTo:@"tabButton:Downloads"]) return UITabBarSystemItemDownloads; if ([imageName isEqualTo:@"tabButton:MostRecent"]) return UITabBarSystemItemMostRecent; if ([imageName isEqualTo:@"tabButton:MostViewed"]) return UITabBarSystemItemMostViewed; NSLog(@"Couldn't figure out what it was"); return -1; } else if ([[imageName substringWithRange:NSMakeRange(0, 11)] isEqualTo:@"toolButton:"]) { NSLog(@"Tool button!!"); if ([imageName isEqualTo:@"toolButton:Done"]) return UIBarButtonSystemItemDone; if ([imageName isEqualTo:@"toolButton:Cancel"]) return UIBarButtonSystemItemCancel; if ([imageName isEqualTo:@"toolButton:Edit"]) return UIBarButtonSystemItemEdit; if ([imageName isEqualTo:@"toolButton:Save"]) return UIBarButtonSystemItemSave; if ([imageName isEqualTo:@"toolButton:Add"]) return UIBarButtonSystemItemAdd; if ([imageName isEqualTo:@"toolButton:FlexibleSpace"]) return UIBarButtonSystemItemFlexibleSpace; if ([imageName isEqualTo:@"toolButton:FixedSpace"]) return UIBarButtonSystemItemFixedSpace; if ([imageName isEqualTo:@"toolButton:Compose"]) return UIBarButtonSystemItemCompose; if ([imageName isEqualTo:@"toolButton:Reply"]) return UIBarButtonSystemItemReply; if ([imageName isEqualTo:@"toolButton:Action"]) return UIBarButtonSystemItemAction; if ([imageName isEqualTo:@"toolButton:Organize"]) return UIBarButtonSystemItemOrganize; if ([imageName isEqualTo:@"toolButton:Bookmarks"]) return UIBarButtonSystemItemBookmarks; if ([imageName isEqualTo:@"toolButton:Search"]) return UIBarButtonSystemItemSearch; if ([imageName isEqualTo:@"toolButton:Refresh"]) return UIBarButtonSystemItemRefresh; if ([imageName isEqualTo:@"toolButton:Stop"]) return UIBarButtonSystemItemStop; if ([imageName isEqualTo:@"toolButton:Camera"]) return UIBarButtonSystemItemCamera; if ([imageName isEqualTo:@"toolButton:Trash"]) return UIBarButtonSystemItemTrash; if ([imageName isEqualTo:@"toolButton:Play"]) return UIBarButtonSystemItemPlay; if ([imageName isEqualTo:@"toolButton:Pause"]) return UIBarButtonSystemItemPause; if ([imageName isEqualTo:@"toolButton:Rewind"]) return UIBarButtonSystemItemRewind; if ([imageName isEqualTo:@"toolButton:FastForward"]) return UIBarButtonSystemItemFastForward; return -1; } else { return -1; } } */ - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { NSString * jsCallBack = [NSString stringWithFormat:@"uicontrols.tabBarItemSelected(%d);", item.tag]; [webView stringByEvaluatingJavaScriptFromString:jsCallBack]; } /*********************************************************************************/ - (void)createToolBar:(NSArray*)arguments withDict:(NSDictionary*)options { CGFloat height = 39.0f; BOOL atTop = YES; UIBarStyle style = UIBarStyleDefault; NSDictionary* toolBarSettings = [settings objectForKey:@"ToolBarSettings"]; if (toolBarSettings) { if ([toolBarSettings objectForKey:@"height"]) height = [[toolBarSettings objectForKey:@"height"] floatValue]; if ([toolBarSettings objectForKey:@"position"]) atTop = [[toolBarSettings objectForKey:@"position"] isEqualToString:@"top"]; #pragma unused(atTop) NSString *styleStr = [toolBarSettings objectForKey:@"style"]; if ([styleStr isEqualToString:@"Default"]) style = UIBarStyleDefault; else if ([styleStr isEqualToString:@"BlackOpaque"]) style = UIBarStyleBlackOpaque; else if ([styleStr isEqualToString:@"BlackTranslucent"]) style = UIBarStyleBlackTranslucent; } CGRect webViewBounds = webView.bounds; CGRect toolBarBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y, webViewBounds.size.width, height ); webViewBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y + height, webViewBounds.size.width, webViewBounds.size.height - height ); toolBar = [[UIToolbar alloc] initWithFrame:toolBarBounds]; [toolBar sizeToFit]; toolBar.hidden = NO; toolBar.multipleTouchEnabled = NO; toolBar.autoresizesSubviews = YES; toolBar.userInteractionEnabled = YES; toolBar.barStyle = style; [toolBar setFrame:toolBarBounds]; [webView setFrame:webViewBounds]; [self.webView.superview addSubview:toolBar]; } /* - (void)createToolBarButton:(NSArray*)arguments withDict:(NSDictionary*)options { } */ /* - (void)createToolBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { if (!toolBar) [self createToolBar:nil options:nil]; NSString *name = [arguments objectAtIndex:0]; NSString *title = [arguments objectAtIndex:1]; NSString *style = [arguments objectAtIndex:2]; UIBarButtonItemStyle styleRef = UIBarButtonItemStylePlain; if ([style isEqualTo:@"plain"]) styleRef = UIBarButtonItemStylePlain; else if ([style isEqualTo:@"border"]) styleRef = UIBarButtonItemStyleBordered; else if ([style isEqualTo: UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:title style:styleRef target:self action:@selector(clickedToolBarTitle)]; [toolBarItems setObject:item forKey:name]; } */ - (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options { if (!toolBar) [self createToolBar:nil withDict:nil]; NSString *title = [arguments objectAtIndex:0]; if (!toolBarTitle) { toolBarTitle = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStylePlain target:self action:@selector(toolBarTitleClicked)]; } else { toolBarTitle.title = title; } UIBarButtonItem *space1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *space2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; NSArray *items = [[NSArray alloc] initWithObjects:space1, toolBarTitle, space2, nil]; [space1 release]; [space2 release]; [toolBar setItems:items]; [items release]; } - (void)toolBarTitleClicked { NSLog(@"Toolbar clicked"); } - (void)dealloc { if (tabBar) [tabBar release]; [super dealloc]; } @end