package org.herac.tuxguitar.cocoa.menu; import org.eclipse.swt.internal.Callback; import org.eclipse.swt.internal.cocoa.NSApplication; import org.eclipse.swt.internal.cocoa.NSMenu; import org.eclipse.swt.internal.cocoa.NSMenuItem; import org.herac.tuxguitar.cocoa.TGCocoa; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.actions.file.ExitAction; import org.herac.tuxguitar.gui.actions.help.ShowAboutAction; import org.herac.tuxguitar.gui.actions.settings.EditConfigAction; public class MacMenu { private static final long kAboutMenuItem = 0; private static final long kPreferencesMenuItem = 2; private static long sel_preferencesMenuItemSelected_ = TGCocoa.sel_registerName("preferencesMenuItemSelected:"); private static long sel_aboutMenuItemSelected_ = TGCocoa.sel_registerName("aboutMenuItemSelected:"); private boolean enabled; public MacMenu(){ super(); } public void init() throws Throwable{ long cls = TGCocoa.objc_lookUpClass ("SWTApplicationDelegate"); if( cls != 0 ){ Callback callback = TGCocoa.newCallback( this , "callbackProc64", "callbackProc32", 3 ); long callbackProc = TGCocoa.getCallbackAddress( callback ); if( callbackProc != 0 ){ TGCocoa.class_addMethod(cls, sel_preferencesMenuItemSelected_, callbackProc , "@:@"); TGCocoa.class_addMethod(cls, sel_aboutMenuItemSelected_, callbackProc , "@:@"); } } NSApplication app = NSApplication.sharedApplication(); NSMenu mainMenu = app.mainMenu(); if( TGCocoa.getMenuNumberOfItems( mainMenu ) > 0 ){ NSMenuItem appMenuItem = TGCocoa.getMenuItemAtIndex( mainMenu , 0 ); NSMenu appMenu = appMenuItem.submenu(); long itemCount = TGCocoa.getMenuNumberOfItems( appMenu ); if( itemCount > kPreferencesMenuItem ) { NSMenuItem menuItem = TGCocoa.getMenuItemAtIndex( appMenu , kPreferencesMenuItem ); menuItem.setEnabled( true ); TGCocoa.setControlAction(menuItem, sel_preferencesMenuItemSelected_); } if( itemCount > kAboutMenuItem ) { NSMenuItem menuItem = TGCocoa.getMenuItemAtIndex( appMenu , kAboutMenuItem ); menuItem.setEnabled( true ); TGCocoa.setControlAction(menuItem, sel_aboutMenuItemSelected_); } } } public long callbackProc( long id, long sel, long arg0 ) { if ( this.isEnabled() ){ if ( sel == sel_preferencesMenuItemSelected_ ) { return handlePreferencesCommand(); }else if ( sel == sel_aboutMenuItemSelected_ ) { return handleAboutCommand(); } } return TGCocoa.noErr; } public long callbackProc64( long id, long sel, long arg0 ) { return this.callbackProc(id, sel, arg0); } public int callbackProc32( int id, int sel, int arg0 ) { return (int)this.callbackProc( (long)id, (long)sel, (long)arg0); } public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public long handleQuitCommand(){ TuxGuitar.instance().getAction(ExitAction.NAME).process(null); return TGCocoa.noErr; } public long handleAboutCommand(){ TuxGuitar.instance().getAction(ShowAboutAction.NAME).process(null); return TGCocoa.noErr; } public long handlePreferencesCommand(){ TuxGuitar.instance().getAction(EditConfigAction.NAME).process(null); return TGCocoa.noErr; } }