Revision: 440 http://trac.macosforge.org/projects/ruby/changeset/440 Author: rich@infoether.com Date: 2008-08-14 14:37:35 -0700 (Thu, 14 Aug 2008) Log Message: ----------- add menu and menu_item and defualt application to load the menu, also add the template builder Modified Paths: -------------- MacRuby/trunk/lib/hotcocoa/mappings/application.rb Added Paths: ----------- MacRuby/trunk/lib/hotcocoa/mappings/menu.rb MacRuby/trunk/lib/hotcocoa/mappings/menu_item.rb MacRuby/trunk/lib/hotcocoa/template.rb Modified: MacRuby/trunk/lib/hotcocoa/mappings/application.rb =================================================================== --- MacRuby/trunk/lib/hotcocoa/mappings/application.rb 2008-08-14 21:27:19 UTC (rev 439) +++ MacRuby/trunk/lib/hotcocoa/mappings/application.rb 2008-08-14 21:37:35 UTC (rev 440) @@ -6,6 +6,14 @@ def handle_block(application, &block) block.call(application) + unless application.menu + begin + require 'lib/menu' + application.menu = application_menu(application) + rescue LoadError => e + puts "No menu specified" + end + end application.run end @@ -19,6 +27,14 @@ @name end + def menu=(menu) + setMainMenu(menu) + end + + def menu + mainMenu + end + end end \ No newline at end of file Added: MacRuby/trunk/lib/hotcocoa/mappings/menu.rb =================================================================== --- MacRuby/trunk/lib/hotcocoa/mappings/menu.rb (rev 0) +++ MacRuby/trunk/lib/hotcocoa/mappings/menu.rb 2008-08-14 21:37:35 UTC (rev 440) @@ -0,0 +1,69 @@ +HotCocoa::Mappings.map :menu => :NSMenu do + + defaults :title => "" + + def alloc_with_options(options) + NSMenu.alloc.initWithTitle(options.delete(:title)) + end + + custom_methods do + + def submenu(symbol, options={}, &block) + item = addItemWithTitle((options[:title] || titleize(symbol)), :action => nil, :keyEquivalent => "") + submenu = builder.menu :title => (options[:title] || titleize(symbol)) + case symbol + when :apple + app.setAppleMenu(submenu) + when :services + app.setServicesMenu(submenu) + when :window + app.setWindowsMenu(submenu) + end + item_map[symbol] = submenu + block.call(submenu) if block + setSubmenu submenu, :forItem => item + submenu + end + + def item(symbol, options={}) + options[:title] ||= titleize(symbol) + item = builder.menu_item(options) + item_map[symbol] = item + addItem item + item + end + + def separator + addItem NSMenuItem.separatorItem + end + + def [](symbol) + item_map[symbol] + end + + private + + def builder + @builder || create_builder + end + + def create_builder + @builder = Object.new + @builder.extend HotCocoa + @builder + end + + def item_map + @item_map ||= {} + end + + def titleize(symbol) + symbol.to_s.split("_").collect(&:capitalize).join(" ") + end + + def app + @app ||= NSApplication.sharedApplication + end + end + +end \ No newline at end of file Added: MacRuby/trunk/lib/hotcocoa/mappings/menu_item.rb =================================================================== --- MacRuby/trunk/lib/hotcocoa/mappings/menu_item.rb (rev 0) +++ MacRuby/trunk/lib/hotcocoa/mappings/menu_item.rb 2008-08-14 21:37:35 UTC (rev 440) @@ -0,0 +1,32 @@ +HotCocoa::Mappings.map :menu_item => :NSMenuItem do + + defaults :title => "", :key => "", :action => nil + + constant :modifiers, { + :control => NSControlKeyMask, + :alt => NSAlternateKeyMask, + :command => NSCommandKeyMask, + :shift => NSShiftKeyMask + } + + def alloc_with_options(options) + NSMenuItem.alloc.initWithTitle options.delete(:title), :action => options.delete(:action), :keyEquivalent => options.delete(:key) + end + + custom_methods do + + def key + keyEquivalent + end + + def key=(value) + setKeyEquivalent(value) + end + + def modifiers=(value) + setKeyEquivalentModifierMask(value) + end + + end + +end \ No newline at end of file Added: MacRuby/trunk/lib/hotcocoa/template.rb =================================================================== --- MacRuby/trunk/lib/hotcocoa/template.rb (rev 0) +++ MacRuby/trunk/lib/hotcocoa/template.rb 2008-08-14 21:37:35 UTC (rev 440) @@ -0,0 +1,22 @@ +require 'fileutils' +require 'rbconfig' + +module HotCocoa + class Template + def self.copy_to(directory, app_name) + dir = Config::CONFIG['datadir'] + Dir.glob(File.join(dir, "hotcocoa_template", "**/*")).each do |file| + short_name = file[(dir.length+19)..-1] + if File.directory?(file) + FileUtils.mkdir_p File.join(directory, short_name) + else + File.open(File.join(directory, short_name), "w") do |out| + input = File.read(file) + input.gsub!(/__APPLICATION_NAME__/, app_name) + out.write input + end + end + end + end + end +end \ No newline at end of file