diff options
Diffstat (limited to 'cocoa/ScintillaView.mm')
-rw-r--r-- | cocoa/ScintillaView.mm | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index 5ff3de720..1f428c017 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -19,6 +19,8 @@ static NSCursor* waitCursor; // The scintilla indicator used for keyboard input. #define INPUT_INDICATOR INDIC_MAX - 1 +NSString *SCIUpdateUINotification = @"SCIUpdateUI"; + @implementation InnerView @synthesize owner = mOwner; @@ -638,35 +640,42 @@ static void notification(intptr_t windowid, unsigned int iMessage, uintptr_t wPa switch (scn->nmhdr.code) { case SCN_MARGINCLICK: + { if (scn->margin == 2) { // Click on the folder margin. Toggle the current line if possible. int line = [editor getGeneralProperty: SCI_LINEFROMPOSITION parameter: scn->position]; [editor setGeneralProperty: SCI_TOGGLEFOLD parameter: line value: 0]; - }; + } break; + }; case SCN_MODIFIED: + { // Decide depending on the modification type what to do. // There can be more than one modification carried by one notification. if (scn->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) [editor sendNotification: NSTextDidChangeNotification]; break; + } case SCN_ZOOM: - { + { // A zoom change happend. Notify info bar if there is one. float zoom = [editor getGeneralProperty: SCI_GETZOOM parameter: 0]; int fontSize = [editor getGeneralProperty: SCI_STYLEGETSIZE parameter: STYLE_DEFAULT]; float factor = (zoom / fontSize) + 1; [editor->mInfoBar notify: IBNZoomChanged message: nil location: NSZeroPoint value: factor]; - } - break; + break; + } case SCN_UPDATEUI: + { // Triggered whenever changes in the UI state need to be reflected. // These can be: caret changes, selection changes etc. NSPoint caretPosition = editor->mBackend->GetCaretPosition(); [editor->mInfoBar notify: IBNCaretChanged message: nil location: caretPosition value: 0]; + [editor sendNotification: SCIUpdateUINotification]; break; } + } break; } case WM_COMMAND: @@ -979,19 +988,20 @@ static void notification(intptr_t windowid, unsigned int iMessage, uintptr_t wPa /** * Getter for the current text in raw form (no formatting information included). + * If there is no text available an empty string is returned. */ -- (NSString*) string +- (NSString*) selectedString { NSString *result = nil; char *buffer(0); - const int length = mBackend->WndProc(SCI_GETLENGTH, 0, 0); + const int length = mBackend->WndProc(SCI_GETSELTEXT, 0, 0); if (length > 0) { buffer = new char[length + 1]; try { - mBackend->WndProc(SCI_GETTEXT, length + 1, (sptr_t) buffer); + mBackend->WndProc(SCI_GETSELTEXT, length + 1, (sptr_t) buffer); mBackend->WndProc(SCI_SETSAVEPOINT, 0, 0); result = [NSString stringWithUTF8String: buffer]; @@ -1003,15 +1013,45 @@ static void notification(intptr_t windowid, unsigned int iMessage, uintptr_t wPa buffer = 0; } } + else + result = [NSString stringWithUTF8String: ""]; return result; } //-------------------------------------------------------------------------------------------------- -- (void) setEditable: (BOOL) editable +/** + * Getter for the current text in raw form (no formatting information included). + * If there is no text available an empty string is returned. + */ +- (NSString*) string { - mBackend->WndProc(SCI_SETREADONLY, editable ? 0 : 1, 0); + NSString *result = nil; + + char *buffer(0); + const int length = mBackend->WndProc(SCI_GETLENGTH, 0, 0); + if (length > 0) + { + buffer = new char[length + 1]; + try + { + mBackend->WndProc(SCI_GETTEXT, length + 1, (sptr_t) buffer); + mBackend->WndProc(SCI_SETSAVEPOINT, 0, 0); + + result = [NSString stringWithUTF8String: buffer]; + delete[] buffer; + } + catch (...) + { + delete[] buffer; + buffer = 0; + } + } + else + result = [NSString stringWithUTF8String: ""]; + + return result; } //-------------------------------------------------------------------------------------------------- @@ -1027,6 +1067,13 @@ static void notification(intptr_t windowid, unsigned int iMessage, uintptr_t wPa //-------------------------------------------------------------------------------------------------- +- (void) setEditable: (BOOL) editable +{ + mBackend->WndProc(SCI_SETREADONLY, editable ? 0 : 1, 0); +} + +//-------------------------------------------------------------------------------------------------- + - (InnerView*) content { return mContent; |