// // RichTextEditor.h // RichTextEdtor // // Created by Aryan Gh on 7/21/13. // Copyright (c) 2013 Aryan Ghassemi. All rights reserved. // Heavily modified for macOS by Deadpikle // Copyright (c) 2016 Deadpikle. All rights reserved. // // https://github.com/aryaxt/iOS-Rich-Text-Editor -- Original // https://github.com/Deadpikle/macOS-Rich-Text-Editor -- Fork // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // TODO: better documentation // TODO: Clean up, clean up, everybody do your share! #import @class RichTextEditor; // These values will always start from 0 and go up. If you want to add your own // preview changes via a subclass, start from 9999 and go down (or similar) and // override convertPreviewChangeTypeToString:withNonSpecialChangeText: typedef NS_ENUM(NSInteger, RichTextEditorPreviewChange) { RichTextEditorPreviewChangeBold = 0, RichTextEditorPreviewChangeItalic = 1, RichTextEditorPreviewChangeUnderline = 2, RichTextEditorPreviewChangeFontResize = 3, RichTextEditorPreviewChangeHighlight = 4, RichTextEditorPreviewChangeFontSize = 5, RichTextEditorPreviewChangeFontColor = 6, RichTextEditorPreviewChangeIndentIncrease = 7, RichTextEditorPreviewChangeIndentDecrease = 8, RichTextEditorPreviewChangeCut = 9, RichTextEditorPreviewChangePaste = 10, RichTextEditorPreviewChangeSpace = 11, RichTextEditorPreviewChangeEnter = 12, RichTextEditorPreviewChangeBullet = 13, RichTextEditorPreviewChangeMouseDown = 14, RichTextEditorPreviewChangeArrowKey = 15, RichTextEditorPreviewChangeKeyDown = 16, RichTextEditorPreviewChangeDelete = 17, RichTextEditorPreviewChangeFindReplace = 18 }; typedef NS_OPTIONS(NSUInteger, RichTextEditorShortcut) { RichTextEditorShortcutAll = 0, RichTextEditorShortcutBold = 1 << 0, RichTextEditorShortcutItalic = 1 << 1, RichTextEditorShortcutUnderline = 1 << 2, RichTextEditorShortcutIncreaseFontSize = 1 << 3, RichTextEditorShortcutDecreaseFontSize = 1 << 4, RichTextEditorShortcutBulletedList = 1 << 6, RichTextEditorShortcutLeaveBulletedList = 1 << 7, RichTextEditorShortcutDecreaseIndent = 1 << 8, RichTextEditorShortcutIncreaseIndent = 1 << 9 }; @protocol RichTextEditorDataSource @optional - (NSUInteger)levelsOfUndo; /// If you do not want to enable all keyboard shortcuts (e.g. if you don't want users to resize font ever), /// then you can use this data source callback to selectively enable keyboard shortcuts. - (RichTextEditorShortcut)enabledKeyboardShortcuts; @end @protocol RichTextEditorDelegate @required -(void)selectionForEditor:(RichTextEditor*)editor changedTo:(NSRange)range isBold:(BOOL)isBold isItalic:(BOOL)isItalic isUnderline:(BOOL)isUnderline isInBulletedList:(BOOL)isInBulletedList textBackgroundColor:(NSColor*)textBackgroundColor textColor:(NSColor*)textColor; @optional - (BOOL)richTextEditor:(RichTextEditor*)editor keyDownEvent:(NSEvent*)event; // return YES if handled by delegate, NO if RTE should process it - (BOOL)handlesUndoRedoForText; - (void)userPerformedUndo; // TODO: remove? - (void)userPerformedRedo; // TODO: remove? - (void)richTextEditor:(RichTextEditor*)editor changeAboutToOccurOfType:(RichTextEditorPreviewChange)type; @end @interface RichTextEditor : NSTextView @property (assign) IBOutlet id rteDataSource; @property (assign) IBOutlet id rteDelegate; @property (nonatomic, assign) CGFloat defaultIndentationSize; @property (nonatomic, readonly) unichar lastSingleKeyPressed; /// If YES, only pastes text as rich text if the copy operation came from this class. /// Note: not this *object* -- this class (so other RichTextEditor boxes can paste /// between each other). If the text did not come from a RichTextEditor box, then /// pastes as plain text. /// If NO, performs the default paste: operation. /// Defaults to YES. @property BOOL allowsRichTextPasteOnlyFromThisClass; /// Amount to change font size on each increase/decrease font size call. /// Defaults to 10.0f @property CGFloat fontSizeChangeAmount; /// Maximum font size. Defaults to 128.0f. @property CGFloat maxFontSize; /// Minimum font size. Defaults to 10.0f. @property CGFloat minFontSize; /// true if tab should always indent and shift+tab should always outdent the current paragraph(s); /// false to let the tab key be used as normal @property BOOL tabKeyAlwaysIndentsOutdents; /// Pasteboard type string used when copying text from this NSTextView. +(NSString*)pasteboardDataType; /// Call the following methods when the user does the given action (clicks bold button, etc.) /// Toggle bold. - (void)userSelectedBold; /// Toggle italic. - (void)userSelectedItalic; /// Toggle underline. - (void)userSelectedUnderline; /// Toggle bulleted list. - (void)userSelectedBullet; /// Increase the total indentation of the current paragraph. - (void)userSelectedIncreaseIndent; /// Decrease the total indentation of the current paragraph. - (void)userSelectedDecreaseIndent; /// Change the text background (highlight) color for the currently selected text. - (void)userSelectedTextBackgroundColor:(NSColor*)color; /// Change the text color for the currently selected text. - (void)userSelectedTextColor:(NSColor*)color; /// Perform an undo operation if one is available. - (void)undo; /// Perform a redo operation if one is available. - (void)redo; /// Convert the font for all text to the given font while keeping bold/italic attributes - (void)changeToFont:(NSFont*)font; /// Change the currently selected text to the given font name. - (void)userChangedToFontName:(NSString*)fontName; /// Change the currently selected text to the specified font size. - (void)userChangedToFontSize:(NSNumber*)fontSize; /// Increases the font size of the currently selected text by self.fontSizeChangeAmount. - (void)increaseFontSize; /// Decreases the font size of the currently selected text by self.fontSizeChangeAmount. - (void)decreaseFontSize; /// Toggles whether or not the paragraphs in the currently selected text have a first /// line head indent value of self.defaultIndentationSize. - (void)userSelectedParagraphFirstLineHeadIndent; /// Change the text alignment for the paragraphs in the currently selected text. - (void)userSelectedTextAlignment:(NSTextAlignment)textAlignment; /// Convenience method; YES if user has something selected (selection length > 0). - (BOOL)hasSelection; /// Changes the editor's contents to the given attributed string. - (void)changeToAttributedString:(NSAttributedString*)string; /// Convenience method to set the editor's border color. - (void)setBorderColor:(NSColor*)borderColor; /// Convenience method to set the editor's border width. - (void)setBorderWidth:(CGFloat)borderWidth; /// Converts the current NSAttributedString to an HTML string. - (NSString *)htmlString; /// Converts the provided htmlString into an NSAttributedString and then /// sets the editor's text to the attributed string. - (void)setHtmlString:(NSString *)htmlString; /// Grabs the NSString used as the bulleted list prefix. - (NSString*)bulletString; /// Converts the provided NSAttributedString into an HTML string. + (NSString *)htmlStringFromAttributedText:(NSAttributedString*)text; /// Converts the given HTML string into an NSAttributedString. + (NSAttributedString*)attributedStringFromHTMLString:(NSString *)htmlString; /// Converts a given RichTextEditorPreviewChange to a human-readable string + (NSString *)convertPreviewChangeTypeToString:(RichTextEditorPreviewChange)changeType withNonSpecialChangeText:(BOOL)shouldReturnStringForNonSpecialType; // // // // // // // // // // // // // // // // // // // // // I'm not sure why you'd call these externally, but subclasses can make use of this for custom toolbar items or what have you. // It's just easier to put these in the public header than to have a protected/subclasses-only header. -(void)sendDelegatePreviewChangeOfType:(RichTextEditorPreviewChange)type; -(void)sendDelegateTVChanged; @end