[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Re: How to access Mac About, Preferences and Quit from SWT

Here is a Snippet that Andre Weinand once sent me as example on how to create those Menus, maybe that helps:

import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.Callback;
import org.eclipse.swt.internal.carbon.HICommand;
import org.eclipse.swt.internal.carbon.OS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

public class AppMenu {

   private static final int kHICommandPreferences=
               ('p' << 24) + ('r' << 16) + ('e' << 8) + 'f';
   private static final int kHICommandAbout=
               ('a' << 24) + ('b' << 16) + ('o' << 8) + 'u';
   private static final int kHICommandServices=
               ('s' << 24) + ('e' << 16) + ('r' << 8) + 'v';

public static void main(String[] arg) {
Display.setAppName("AppMenu"); // sets name in Dock


       Display display= Display.getDefault();

       hookApplicationMenu(display, "About AppMenu");

       Shell shell= new Shell(display);
       shell.setText("Main Window");
       shell.open();

while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}


   static void hookApplicationMenu(Display display, final String aboutName)
{

       // Callback target
       Object target= new Object() {
           int commandProc(int nextHandler, int theEvent, int userData) {
               if (OS.GetEventKind(theEvent) == OS.kEventProcessCommand) {
                   HICommand command= new HICommand();
                   OS.GetEventParameter(theEvent,
                       OS.kEventParamDirectObject, OS.typeHICommand, null,
                           HICommand.sizeof, null, command);
                   switch (command.commandID) {
                   case kHICommandPreferences:
                       return handleCommand("Preferences"); //$NON-NLS-1$
                   case kHICommandAbout:
                       return handleCommand(aboutName);
                   default:
                       break;
                   }
               }
               return OS.eventNotHandledErr;
           }

           int handleCommand(String command) {
               Shell shell= new Shell();
               MessageBox preferences= new MessageBox(shell,
                       SWT.ICON_WARNING);
               preferences.setText(command);
               preferences.open();
               shell.dispose();
               return OS.noErr;
           }
       };

       final Callback commandCallback= new Callback(target,
                       "commandProc", 3); //$NON-NLS-1$
       int commandProc= commandCallback.getAddress();
       if (commandProc == 0) {
           commandCallback.dispose();
           return; // give up
       }

       // Install event handler for commands
       int[] mask= new int[] { OS.kEventClassCommand,
                                   OS.kEventProcessCommand};
       OS.InstallEventHandler(OS.GetApplicationEventTarget(), commandProc,
                   mask.length / 2, mask, 0, null);

       // create About ... menu command
       int[] outMenu= new int[1];
       short[] outIndex= new short[1];
       if (OS.GetIndMenuItemWithCommandID(0, kHICommandPreferences, 1,
                   outMenu, outIndex) == OS.noErr && outMenu[0] != 0) {
           int menu= outMenu[0];

           int l= aboutName.length();
           char buffer[]= new char[l];
           aboutName.getChars(0, l, buffer, 0);
           int str= OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault,
                   buffer, l);
           OS.InsertMenuItemTextWithCFString(menu, str, (short) 0, 0,
                   kHICommandAbout);
           OS.CFRelease(str);

           // add separator between About & Preferences
           OS.InsertMenuItemTextWithCFString(menu, 0, (short) 1,
                   OS.kMenuItemAttrSeparator, 0);

           // enable pref menu
           OS.EnableMenuCommand(menu, kHICommandPreferences);

           // disable services menu
           OS.DisableMenuCommand(menu, kHICommandServices);
       }

       // schedule disposal of callback object
       display.disposeExec(new Runnable() {
           public void run() {
               commandCallback.dispose();
           }
       });
   }

Ben
}


Not from SWT proper. You have to use the classes in the com.apple.cocoa.awt (very rough, it's something to that effect, use content assist to find it). I suggest digging around in the classes using content assist to find the one you need. The methods are pretty self explanatory.

Daniel

Ivan wrote:

Hi all,

Is there anyway to link the About, Preferences and Quit into Mac menu ?

Thanks