#include "ScintillaCocoa.h" #include "ScintillaListBox.h" using namespace Scintilla; const CFStringRef ScintillaListBox::kScintillaListBoxClassID = CFSTR( "org.scintilla.listbox" ); const ControlKind ScintillaListBox::kScintillaListBoxKind = { 'ejon', 'Sclb' }; ScintillaListBox::ScintillaListBox( void* windowid ) : TView( reinterpret_cast( windowid ) ) { ActivateInterface( kMouse ); // debugPrint = true; } void ScintillaListBox::Draw( RgnHandle /*inLimitRgn*/, CGContextRef inContext ) { Rect contentBounds; GetControlBounds(GetViewRef(), &contentBounds); HIRect controlFrame; HIViewGetFrame( GetViewRef(), &controlFrame ); // what is the global pos? Surface *surfaceWindow = Surface::Allocate(); if (surfaceWindow) { surfaceWindow->Init(inContext, GetViewRef()); // TODO: Implement or find workaround // ctip->PaintCT(surfaceWindow); surfaceWindow->Release(); delete surfaceWindow; } } ControlPartCode ScintillaListBox::HitTest( const HIPoint& where ) { if ( CGRectContainsPoint( Bounds(), where ) ) return 1; else return kControlNoPart; } OSStatus ScintillaListBox::MouseDown(HIPoint& location, UInt32 /*inKeyModifiers*/, EventMouseButton button, UInt32 /*inClickCount*/ ) { if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; ListBox* ctip = NULL; ScintillaCocoa *sciThis = NULL; OSStatus err = GetControlProperty( GetViewRef(), scintillaListBoxType, 0, sizeof( ctip ), NULL, &ctip ); err = GetControlProperty( GetViewRef(), scintillaMacOSType, 0, sizeof( sciThis ), NULL, &sciThis ); // TODO: Implement of find work around. // ctip->MouseClick( Scintilla::Point( static_cast( location.x ), static_cast( location.y ) )); // TODO: still needed? // sciThis->ListBoxClick(); return noErr; } OSStatus ScintillaListBox::MouseUp(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton button, UInt32 /*inClickCount*/ ) { if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; return noErr; } HIViewRef ScintillaListBox::Create() { // Register the HIView, if needed static bool registered = false; if ( not registered ) { TView::RegisterSubclass( kScintillaListBoxClassID, Construct ); registered = true; } OSStatus err = noErr; EventRef event = CreateInitializationEvent(); assert( event != NULL ); HIViewRef control = NULL; err = HIObjectCreate( kScintillaListBoxClassID, event, reinterpret_cast( &control ) ); ReleaseEvent( event ); if ( err == noErr ) { Platform::DebugPrintf("ScintillaListBox::Create control %08X\n",control); return control; } return NULL; } OSStatus ScintillaListBox::Construct( HIViewRef inControl, TView** outView ) { *outView = new ScintillaListBox( inControl ); Platform::DebugPrintf("ScintillaListBox::Construct scintilla %08X\n",*outView); if ( *outView != NULL ) return noErr; else return memFullErr; } extern "C" { HIViewRef scintilla_listbox_new() { return ScintillaListBox::Create(); } }