• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag
 

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images


  • Subject: Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images
  • From: "Chunk 1978" <email@hidden>
  • Date: Sun, 7 Dec 2008 07:25:12 -0500

nevermind, i managed to get it right... not sure how efficient this
code is, but at least it works :)

-=-=-=-=-

@interface AppController : NSObject
	{
	IBOutlet NSMenu *theMenu;
	}

- (void)launchFileOrFolder:(id)sender;

@end

-=-=-=-=-=-

#import "AppController.h"


@implementation AppController


- (void)awakeFromNib
	{
	NSMenu *desktopMenu = [[NSMenu alloc] initWithTitle:@""];
	NSMenuItem *desktopItem = [[NSMenuItem alloc] initWithTitle:@"Desktop
Files" action:nil keyEquivalent:@""];
	[desktopItem setSubmenu:desktopMenu];

	NSFileManager *fileManager = [NSFileManager defaultManager];
	NSString *desktopDirectory = [@"~/Desktop" stringByExpandingTildeInPath];
	NSDirectoryEnumerator *directoryCount = [fileManager
enumeratorAtPath:desktopDirectory];
	NSDirectoryEnumerator *directoryEnumerator = [fileManager
enumeratorAtPath:desktopDirectory];
	NSString *fileOrFolder;

	int hiddenFIles = 0;
	while ((fileOrFolder = [directoryCount nextObject]))
		{
		if ([fileOrFolder hasPrefix:@"."])
			{
			hiddenFIles++;
			}
		}
	NSLog(@"hiddenfiles = %d", hiddenFIles);

	NSArray *directoryContents = [fileManager
directoryContentsAtPath:desktopDirectory];
	int allFiles = [directoryContents count];
	NSLog(@"totalfiles = %d", allFiles);


	if ((allFiles - hiddenFIles) == 0)
		{
		NSLog(@"directory contains only hidden files");
		NSMenuItem *noFilesItem = [[NSMenuItem alloc] initWithTitle:@"Empty"
action:nil keyEquivalent:@""];
		[desktopMenu addItem:noFilesItem];
		[noFilesItem release];

  //or alternatively just disable the item
  //with this line of code:  [desktopItem setEnabled:NO];

		}
		else
		{
		while ((fileOrFolder = [directoryEnumerator nextObject]))
			{
			//ignore invisible files
			if ([fileOrFolder hasPrefix:@"."])
				{
				continue;
				}

			[directoryEnumerator skipDescendents];

			NSMenuItem *desktopItems = [[NSMenuItem alloc]
initWithTitle:fileOrFolder action:@selector(launchFileOrFolder:)
keyEquivalent:@""];
			[desktopItems setTarget:self];
			[desktopItems setRepresentedObject:[desktopDirectory
stringByAppendingPathComponent:fileOrFolder]];

			NSImage *fileOrFolderIcons = [[NSWorkspace sharedWorkspace]
iconForFile:[desktopDirectory
stringByAppendingPathComponent:fileOrFolder]];
			[fileOrFolderIcons setScalesWhenResized:YES];
			NSSize mySize; mySize.width=16; mySize.height=16;
			[fileOrFolderIcons setSize:mySize];
			[desktopItems setImage:fileOrFolderIcons];

			[desktopMenu addItem:desktopItems];
			[desktopItems release];
			}
		}
	[theMenu insertItem:desktopItem atIndex:1];
	[desktopMenu release];
	[desktopItem release];
	}

- (void)launchFileOrFolder:(id)sender
	{
	NSString *filePath = [sender representedObject];
	[[NSWorkspace sharedWorkspace] openFile:filePath];
	}

- (void)dealloc
	{
	[super dealloc];
	}

@end

-=-=-=-=-

On Sat, Dec 6, 2008 at 6:01 AM, Chunk 1978 <email@hidden> wrote:
> thanks ashley, you cleared up a lot for me. however, i'm now presented
> with two (seemingly) small issues.  the first is determining whether
> the directory is empty.  i've added an array with
> directoryContentsAtPath, and an if statement counting the array, but
> it doesn't seem to work.
>
> second, how is it possible to change the size of the iconForFile(s)
> using setSize:NSMakeSize(16, 16), or any other way?
>
> my updated code follows:
>
> -=-=-=-=-
>
> - (void)awakeFromNib
>        {
>        NSMenu *desktopMenu = [[NSMenu alloc] initWithTitle:@""];
>        NSMenuItem *desktopItem = [[NSMenuItem alloc] initWithTitle:@"Desktop
> Files" action:nil keyEquivalent:@""];
>        [desktopItem setSubmenu:desktopMenu];
>
>        NSFileManager *fileManager = [NSFileManager defaultManager];
>        NSString *desktopDirectory = [@"~/Desktop/9" stringByExpandingTildeInPath];
>        NSDirectoryEnumerator *directoryEnumerator = [fileManager
> enumeratorAtPath:desktopDirectory];
>        NSString *fileOrFolder;
>        NSArray *theFolderContents = [fileManager
> directoryContentsAtPath:desktopDirectory];
>
>        if ([theFolderContents count] == 0)
>                {
>                NSLog(@"no files");
>                NSMenuItem *noFilesItem = [[NSMenuItem alloc] initWithTitle:@"No
> Files" action:nil keyEquivalent:@""];
>                [desktopMenu addItem:noFilesItem];
>                [noFilesItem release];
>                }
>                else
>                {
>                while ((fileOrFolder = [directoryEnumerator nextObject]))
>                        {
>                        //ignore invisible files
>                        if ([fileOrFolder hasPrefix:@"."])
>                                {
>                                continue;
>                                }
>
>                        [directoryEnumerator skipDescendents];
>
>                        NSMenuItem *desktopItems = [[NSMenuItem alloc]
> initWithTitle:fileOrFolder action:@selector(launchFileOrFolder:)
> keyEquivalent:@""];
>                        [desktopItems setTarget:self];
>                        [desktopItems setRepresentedObject:[desktopDirectory
> stringByAppendingPathComponent:fileOrFolder]];
>
>                        [desktopItems setImage:[[NSWorkspace sharedWorkspace]
> iconForFile:[desktopDirectory
> stringByAppendingPathComponent:fileOrFolder]]];
>
>                        [desktopMenu addItem:desktopItems];
>                        [desktopItems release];
>                        }
>                }
>
>        [theMenu insertItem:desktopItem atIndex:1];
>        [desktopMenu release];
>        [desktopItem release];
>        }
>
> - (void)launchFileOrFolder:(id)sender
>        {
>        NSString *filePath = [sender representedObject];
>        [[NSWorkspace sharedWorkspace] openFile:filePath];
>        }
>
> - (void)dealloc
>        {
>        [super dealloc];
>        }
>
> -=-=-=-=-
>
>
>
>
>
>
>
>
>
> On Fri, Dec 5, 2008 at 3:07 PM, Ashley Clark <email@hidden> wrote:
>> On Dec 5, 2008, at 9:44 AM, Chunk 1978 wrote:
>>
>>> hi.
>>
>> Hi.
>>
>>> i've been on this task for almost a week, and i still can't get it
>>> right.  basically, i would like to have an NSMenu populated with all
>>> the files and folders of a specific directory.  for this example i'll
>>> use ~/Documents.  the code below only partially works.  it will list
>>> files and folders from Documents in an NSMenu, but they are not
>>> selectable.  i've added a @selector, but it doesn't seem to be called.
>>> the selector if just an example method - i don't want to really
>>> terminate the app when an item is selected, i simply want the item to
>>> launch.
>>
>> You have to also call setTarget: on the menu items so it knows which object
>> to send the message to. In your case you'd probably pass self as the object.
>> Also if you want to access the path again during your selector it would
>> probably be easiest to set the path for the item as the representedObject.
>>
>> NSMenuItem *item = /* your item with @selector */
>> [item setTarget:self];
>> [item setRepresentedObject:[documentsDirectory
>> stringByAppendingPathComponent:fileOrFolder]];
>>
>> Then in your method:
>>
>> - (void)actionMethod:(id)sender {
>>        id fullPath = [sender representedObject];
>>
>>        /* do something with fullPath */
>> }
>>
>>> second, it would be ideal to have the folders also produce their own
>>> NSMenu list of files contained in them - i have no idea how to do
>>> this.
>>
>> You'll have to do some refactoring to accomplish this. Essentially, break
>> apart your method into one that creates a menu for a directory's items and
>> returns the resulting menu. That method will call itself to create menus for
>> subfolders which you would add as subitems to your menu. You would then just
>> call that method on your root directory, Documents in your case, and add the
>> resulting tree of menus wherever you're interested in.
>>
>>> third, the code below codes the NSMenuItem to be titled "Documents",
>>> but it's title is not displayed when it's inserted at index:1 of
>>> NSMenu *theMenu.  however, if i insert it into [NSApp mainMenu], the
>>> title "Documents" will display.  this doesn't make sense to me.
>>
>> I believe this is a consequence of how you're setting the title and where
>> you're adding the menu. If you set the title on the documentsItem as well as
>> the documentsMenu it should appear regardless of where you attach the menu.
>>
>>> and finally, i would love to have each of the files and folders to be
>>> added to the NSMenu with their respected icons.  my attempts to do
>>> this have failed because i do not know how to get the path of each
>>> file or folder that is being enumerated.  the code below will warn
>>> that NSString does not respond to Path.
>>
>> You can get the icon for the path with this:
>>
>> [[NSWorkspace sharedWorkspace] iconForFile:[documentsDirectory
>> stringByAppendingPathComponent:fileOrFolder]];
>>
>>
>> Ashley
>>
>>
>
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

References: 
 >Fix Populated NSMenu Of Files, Folders And Their Respected Images (From: "Chunk 1978" <email@hidden>)
 >Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images (From: Ashley Clark <email@hidden>)
 >Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images (From: "Chunk 1978" <email@hidden>)

  • Prev by Date: Re: core data + undo + to-many relationship
  • Next by Date: Re: core data + undo + to-many relationship
  • Previous by thread: Re: Fix Populated NSMenu Of Files, Folders And Their Respected Images
  • Next by thread: Not getting KeyDown events (and other peculiar things)
  • Index(es):
    • Date
    • Thread