diff options
Diffstat (limited to 'cocoa/ScintillaView.mm')
| -rw-r--r-- | cocoa/ScintillaView.mm | 88 | 
1 files changed, 85 insertions, 3 deletions
| diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index 84362e1c2..6f4557c2b 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -287,10 +287,13 @@ NSString *SCIUpdateUINotification = @"SCIUpdateUI";      currentPosition = mMarkedTextRange.location;    } +  // Note: Scintilla internally works almost always with bytes instead chars, so we need to take +  //       this into account when determining selection ranges and such. +  std::string raw_text = [newText UTF8String];    mOwner.backend->InsertText(newText);    mMarkedTextRange.location = currentPosition; -  mMarkedTextRange.length = [newText length]; +  mMarkedTextRange.length = raw_text.size();    // Mark the just inserted text. Keep the marked range for later reset.    [mOwner setGeneralProperty: SCI_SETINDICATORCURRENT parameter: INPUT_INDICATOR value: 0]; @@ -298,7 +301,7 @@ NSString *SCIUpdateUINotification = @"SCIUpdateUI";                     parameter: mMarkedTextRange.location                         value: mMarkedTextRange.length]; -  // Select the part which is indicated in the given range. +  // Select the part which is indicated in the given range. It does not scroll the caret into view.    if (range.length > 0)    {      [mOwner setGeneralProperty: SCI_SETSELECTIONSTART @@ -558,6 +561,7 @@ NSString *SCIUpdateUINotification = @"SCIUpdateUI";  @implementation ScintillaView  @synthesize backend = mBackend; +@synthesize owner   = mOwner;  /**   * ScintiallView is a composite control made from an NSView and an embedded NSView that is @@ -1360,17 +1364,95 @@ static void notification(intptr_t windowid, unsigned int iMessage, uintptr_t wPa      [mInfoBar notify: IBNStatusChanged message: text location: NSZeroPoint value: 0];  } +//-------------------------------------------------------------------------------------------------- +  - (NSRange) selectedRange  {    return [mContent selectedRange];  } +//-------------------------------------------------------------------------------------------------- +  - (void)insertText: (NSString*)text  {    [mContent insertText: text];  } -@end +//-------------------------------------------------------------------------------------------------- + +/** + * Searches and marks the first occurance of the given text and optionally scrolls it into view. + */ +- (void) findAndHighlightText: (NSString*) searchText +                    matchCase: (BOOL) matchCase +                    wholeWord: (BOOL) wholeWord +                     scrollTo: (BOOL) scrollTo +                         wrap: (BOOL) wrap +{ +  // The current position is where we start searching. That is either the end of the current +  // (main) selection or the caret position. That ensures we do proper "search next" too. +  int currentPosition = [self getGeneralProperty: SCI_GETCURRENTPOS parameter: 0]; +  int length = [self getGeneralProperty: SCI_GETTEXTLENGTH parameter: 0]; + +  int searchFlags= 0; +  if (matchCase) +    searchFlags |= SCFIND_MATCHCASE; +  if (wholeWord) +    searchFlags |= SCFIND_WHOLEWORD; + +  Sci_TextToFind ttf; +  ttf.chrg.cpMin = currentPosition; +  ttf.chrg.cpMax = length; +  ttf.lpstrText = (char*) [searchText UTF8String]; +  int position = mBackend->WndProc(SCI_FINDTEXT, searchFlags, (sptr_t) &ttf); +   +  if (position < 0 && wrap) +  { +    ttf.chrg.cpMin = 0; +    ttf.chrg.cpMax = currentPosition; +    position = mBackend->WndProc(SCI_FINDTEXT, searchFlags, (sptr_t) &ttf); +  } +   +  if (position >= 0) +  { +    // Highlight the found text. +    [self setGeneralProperty: SCI_SETSELECTIONSTART +                   parameter: position +                       value: 0]; +    [self setGeneralProperty: SCI_SETSELECTIONEND +                   parameter: position + [searchText length] +                       value: 0]; +     +    if (scrollTo) +      [self setGeneralProperty: SCI_SCROLLCARET parameter: 0 value: 0]; +  } +}  //-------------------------------------------------------------------------------------------------- +- (void) setFontName: (NSString*) font +                size: (int) size +                bold: (BOOL) bold +                italic: (BOOL) italic +{ +  for (int i = 0; i < 32; i++) +  { +    [self setGeneralProperty: SCI_STYLESETFONT +                   parameter: i +                       value: (sptr_t)[font UTF8String]]; +    [self setGeneralProperty: SCI_STYLESETSIZE +                   parameter: i +                       value: size]; +    [self setGeneralProperty: SCI_STYLESETBOLD +                   parameter: i +                       value: bold]; +    [self setGeneralProperty: SCI_STYLESETITALIC +                   parameter: i +                       value: italic]; +  } +} + +//-------------------------------------------------------------------------------------------------- + +@end + | 
