package org.herac.tuxguitar.cocoa.toolbar;
import org.eclipse.swt.internal.C;
import org.eclipse.swt.internal.Callback;
import org.eclipse.swt.internal.cocoa.NSButton;
import org.eclipse.swt.internal.cocoa.NSString;
import org.eclipse.swt.internal.cocoa.NSToolbar;
import org.eclipse.swt.internal.cocoa.NSWindow;
import org.eclipse.swt.widgets.Shell;
import org.herac.tuxguitar.cocoa.TGCocoa;
public class MacToolbar {
private static final byte[] SWT_OBJECT = {'S', 'W', 'T', '_', 'O', 'B', 'J', 'E', 'C', 'T', '\0'};
private static final long NSWindowToolbarButton = 3;
private static final long sel_toolbarButtonClicked_ = TGCocoa.sel_registerName("toolbarButtonClicked:");
private boolean enabled;
private long delegateRef;
private MacToolbarDelegate delegate;
public MacToolbar(){
super();
}
public void init( Shell shell ) throws Throwable{
Callback callback = TGCocoa.newCallback( this , "callbackProc64", "callbackProc32", 3 );
long callbackProc = TGCocoa.getCallbackAddress( callback );
if( callbackProc != 0 ){
String classname = ("MacToolbarDelegate");
if( TGCocoa.objc_lookUpClass ( classname ) == 0 ) {
long cls = TGCocoa.objc_allocateClassPair( classname , 0 ) ;
TGCocoa.class_addIvar(cls, SWT_OBJECT, C.PTR_SIZEOF , (byte)(C.PTR_SIZEOF == 4 ? 2 : 3), new byte[]{'*','\0'} );
TGCocoa.class_addMethod(cls, sel_toolbarButtonClicked_, callbackProc , "@:@");
TGCocoa.objc_registerClassPair(cls);
}
this.delegate = TGCocoa.newMacToolbarDelegate();
this.delegate.alloc().init();
this.delegateRef = TGCocoa.NewGlobalRef( MacToolbar.this );
TGCocoa.object_setInstanceVariable( MacToolbarDelegate.class.getField("id").get( delegate ) , SWT_OBJECT , this.delegateRef );
NSToolbar dummyBar = new NSToolbar();
dummyBar.alloc();
dummyBar.initWithIdentifier(NSString.stringWith("SWTToolbar")); //$NON-NLS-1$
dummyBar.setVisible(false);
NSWindow nsWindow = shell.view.window();
nsWindow.setToolbar(dummyBar);
dummyBar.release();
nsWindow.setShowsToolbarButton(true);
NSButton toolbarButton = TGCocoa.getStandardWindowButton(nsWindow, NSWindowToolbarButton);
if (toolbarButton != null) {
toolbarButton.setTarget( delegate );
TGCocoa.setControlAction( toolbarButton , sel_toolbarButtonClicked_ );
}
}
}
public void finalize() throws Throwable{
if( this.delegateRef != 0 ){
TGCocoa.DeleteGlobalRef( this.delegateRef );
this.delegateRef = 0;
}
}
public long callbackProc( long id, long sel, long arg0 ) {
if ( this.isEnabled() ){
if ( sel == sel_toolbarButtonClicked_ ) {
return handleToogleToolbarCommand();
}
}
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 handleToogleToolbarCommand(){
MacToolbarAction.toogleToolbar();
return TGCocoa.noErr;
}
}