diff options
Diffstat (limited to 'cocoa/ScintillaTest/AppController.mm')
-rw-r--r-- | cocoa/ScintillaTest/AppController.mm | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/cocoa/ScintillaTest/AppController.mm b/cocoa/ScintillaTest/AppController.mm new file mode 100644 index 000000000..37192163b --- /dev/null +++ b/cocoa/ScintillaTest/AppController.mm @@ -0,0 +1,215 @@ +/** + * AppController.m + * ScintillaTest + * + * Created by Mike Lischke on 01.04.09. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * This file is dual licensed under LGPL v2.1 and the Scintilla license (http://www.scintilla.org/License.txt). + */ + +#import "AppController.h" +#import "ScintillaView.h" + +#include "Scintilla.h" + +using namespace Scintilla; + +const char major_keywords[] = + "accessible add all alter analyze and as asc asensitive " + "before between bigint binary blob both by " + "call cascade case change char character check collate column condition connection constraint " + "continue convert create cross current_date current_time current_timestamp current_user cursor " + "database databases day_hour day_microsecond day_minute day_second dec decimal declare default " + "delayed delete desc describe deterministic distinct distinctrow div double drop dual " + "each else elseif enclosed escaped exists exit explain " + "false fetch float float4 float8 for force foreign from fulltext " + "goto grant group " + "having high_priority hour_microsecond hour_minute hour_second " + "if ignore in index infile inner inout insensitive insert int int1 int2 int3 int4 int8 integer " + "interval into is iterate " + "join " + "key keys kill " + "label leading leave left like limit linear lines load localtime localtimestamp lock long " + "longblob longtext loop low_priority " + "master_ssl_verify_server_cert match mediumblob mediumint mediumtext middleint minute_microsecond " + "minute_second mod modifies " + "natural not no_write_to_binlog null numeric " + "on optimize option optionally or order out outer outfile " + "precision primary procedure purge " + "range read reads read_only read_write real references regexp release rename repeat replace " + "require restrict return revoke right rlike " + "schema schemas second_microsecond select sensitive separator set show smallint spatial specific " + "sql sqlexception sqlstate sqlwarning sql_big_result sql_calc_found_rows sql_small_result ssl " + "starting straight_join " + "table terminated then tinyblob tinyint tinytext to trailing trigger true " + "undo union unique unlock unsigned update upgrade usage use using utc_date utc_time utc_timestamp " + "values varbinary varchar varcharacter varying " + "when where while with write " + "xor " + "year_month " + "zerofill"; + +const char procedure_keywords[] = // Not reserved words but intrinsic part of procedure definitions. + "begin comment end"; + +const char client_keywords[] = // Definition of keywords only used by clients, not the server itself. + "delimiter"; + +const char user_keywords[] = // Definition of own keywords, not used by MySQL. + "edit"; + +//-------------------------------------------------------------------------------------------------- + +@implementation AppController + +- (void) awakeFromNib +{ + // Manually set up the scintilla editor. Create an instance and dock it to our edit host. + // Leave some free space around the new view to avoid overlapping with the box borders. + NSRect newFrame = mEditHost.frame; + newFrame.size.width -= 2 * newFrame.origin.x; + newFrame.size.height -= 3 * newFrame.origin.y; + + mEditor = [[[ScintillaView alloc] initWithFrame: newFrame] autorelease]; + + [mEditHost.contentView addSubview: mEditor]; + [mEditor setAutoresizesSubviews: YES]; + [mEditor setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; + + // Let's load some text for the editor, as initial content. + NSError* error = nil; + + NSString* path = [[NSBundle mainBundle] pathForResource: @"TestData" + ofType: @"sql" inDirectory: nil]; + + NSString* sql = [NSString stringWithContentsOfFile: path + encoding: NSUTF8StringEncoding + error: &error]; + if (error && [[error domain] isEqual: NSCocoaErrorDomain]) + NSLog(@"%@", error); + + [mEditor setString: sql]; + + [self setupEditor]; +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Initialize scintilla editor (styles, colors, markers, folding etc.]. + */ +- (void) setupEditor +{ + // Lexer type is MySQL. + [mEditor setGeneralProperty: SCI_SETLEXER parameter: SCLEX_MYSQL value: 0]; + // alternatively: [mEditor setEditorProperty: SCI_SETLEXERLANGUAGE parameter: nil value: (sptr_t) "mysql"]; + + // Number of styles we use with this lexer. + [mEditor setGeneralProperty: SCI_SETSTYLEBITS parameter: 5 value: 0]; + + // Keywords to highlight. Indices are: + // 0 - Major keywords (reserved keywords) + // 1 - Normal keywords (everything not reserved but integral part of the language) + // 2 - Database objects + // 3 - Function keywords + // 4 - System variable keywords + // 5 - Procedure keywords (keywords used in procedures like "begin" and "end") + // 6..8 - User keywords 1..3 + [mEditor setReferenceProperty: SCI_SETKEYWORDS parameter: 0 value: major_keywords]; + [mEditor setReferenceProperty: SCI_SETKEYWORDS parameter: 5 value: procedure_keywords]; + [mEditor setReferenceProperty: SCI_SETKEYWORDS parameter: 6 value: client_keywords]; + [mEditor setReferenceProperty: SCI_SETKEYWORDS parameter: 7 value: user_keywords]; + + // Colors and styles for various syntactic elements. First the default style. + [mEditor setStringProperty: SCI_STYLESETFONT parameter: STYLE_DEFAULT value: @"Andale Mono"]; + // [mEditor setStringProperty: SCI_STYLESETFONT parameter: STYLE_DEFAULT value: @"Monospac821 BT"]; // Very pleasing programmer's font. + [mEditor setGeneralProperty: SCI_STYLESETSIZE parameter: STYLE_DEFAULT value: 14]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: STYLE_DEFAULT value: [NSColor blackColor]]; + + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_DEFAULT value: [NSColor blackColor]]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_COMMENT fromHTML: @"#097BF7"]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_COMMENTLINE fromHTML: @"#097BF7"]; + // [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_HIDDENCOMMAND fromHTML: @"#097BF7"]; + // [mEditor setColorProperty: SCI_STYLESETBACK parameter: SCE_MYSQL_HIDDENCOMMAND fromHTML: @"#F0F0F0"]; + + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_VARIABLE fromHTML: @"378EA5"]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_SYSTEMVARIABLE fromHTML: @"378EA5"]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_KNOWNSYSTEMVARIABLE fromHTML: @"#3A37A5"]; + + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_NUMBER fromHTML: @"#7F7F00"]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_SQSTRING fromHTML: @"#FFAA3E"]; + + // Note: if we were using ANSI quotes we would set the DQSTRING to the same color as the + // the back tick string. + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_DQSTRING fromHTML: @"#274A6D"]; + + // Keyword highlighting. + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_MAJORKEYWORD fromHTML: @"#007F00"]; + [mEditor setGeneralProperty: SCI_STYLESETBOLD parameter: SCE_MYSQL_MAJORKEYWORD value: 1]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_KEYWORD fromHTML: @"#007F00"]; + [mEditor setGeneralProperty: SCI_STYLESETBOLD parameter: SCE_MYSQL_KEYWORD value: 1]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_PROCEDUREKEYWORD fromHTML: @"#56007F"]; + [mEditor setGeneralProperty: SCI_STYLESETBOLD parameter: SCE_MYSQL_PROCEDUREKEYWORD value: 1]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_USER1 fromHTML: @"#808080"]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_USER2 fromHTML: @"#808080"]; + [mEditor setColorProperty: SCI_STYLESETBACK parameter: SCE_MYSQL_USER2 fromHTML: @"#F0E0E0"]; + + // The following 3 styles have no impact as we did not set a keyword list for any of them. + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_DATABASEOBJECT value: [NSColor redColor]]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_FUNCTION value: [NSColor redColor]]; + + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_IDENTIFIER value: [NSColor blackColor]]; + [mEditor setColorProperty: SCI_STYLESETFORE parameter: SCE_MYSQL_QUOTEDIDENTIFIER fromHTML: @"#274A6D"]; + [mEditor setGeneralProperty: SCI_STYLESETBOLD parameter: SCE_SQL_OPERATOR value: 1]; + + // Line number style. + [mEditor setColorProperty: SCI_STYLESETFORE parameter: STYLE_LINENUMBER fromHTML: @"#F0F0F0"]; + [mEditor setColorProperty: SCI_STYLESETBACK parameter: STYLE_LINENUMBER fromHTML: @"#808080"]; + + [mEditor setGeneralProperty: SCI_SETMARGINTYPEN parameter: 0 value: SC_MARGIN_NUMBER]; + [mEditor setGeneralProperty: SCI_SETMARGINWIDTHN parameter: 0 value: 35]; + + // Markers. + [mEditor setGeneralProperty: SCI_SETMARGINWIDTHN parameter: 1 value: 16]; + + // Some special lexer properties. + [mEditor setLexerProperty: @"fold" value: @"1"]; + [mEditor setLexerProperty: @"fold.compact" value: @"0"]; + [mEditor setLexerProperty: @"fold.comment" value: @"1"]; + [mEditor setLexerProperty: @"fold.preprocessor" value: @"1"]; + + // Folder setup. + [mEditor setGeneralProperty: SCI_SETMARGINWIDTHN parameter: 2 value: 16]; + [mEditor setGeneralProperty: SCI_SETMARGINMASKN parameter: 2 value: SC_MASK_FOLDERS]; + [mEditor setGeneralProperty: SCI_SETMARGINSENSITIVEN parameter: 2 value: 1]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDEROPEN value: SC_MARK_BOXMINUS]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDER value: SC_MARK_BOXPLUS]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDERSUB value: SC_MARK_VLINE]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDERTAIL value: SC_MARK_LCORNER]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDEREND value: SC_MARK_BOXPLUSCONNECTED]; + [mEditor setGeneralProperty: SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDEROPENMID value: SC_MARK_BOXMINUSCONNECTED]; + [mEditor setGeneralProperty + : SCI_MARKERDEFINE parameter: SC_MARKNUM_FOLDERMIDTAIL value: SC_MARK_TCORNER]; + for (int n= 25; n < 32; ++n) // Markers 25..31 are reserved for folding. + { + [mEditor setColorProperty: SCI_MARKERSETFORE parameter: n value: [NSColor whiteColor]]; + [mEditor setColorProperty: SCI_MARKERSETBACK parameter: n value: [NSColor blackColor]]; + } + + // Init markers & indicators for highlighting of syntax errors. + [mEditor setColorProperty: SCI_INDICSETFORE parameter: 0 value: [NSColor redColor]]; + [mEditor setGeneralProperty: SCI_INDICSETUNDER parameter: 0 value: 1]; + [mEditor setGeneralProperty: SCI_INDICSETSTYLE parameter: 0 value: INDIC_SQUIGGLE]; + + [mEditor setColorProperty: SCI_MARKERSETBACK parameter: 0 fromHTML: @"#B1151C"]; + + [mEditor setColorProperty: SCI_SETSELBACK parameter: 1 value: [NSColor selectedTextBackgroundColor]]; + + // Uncomment if you wanna see auto wrapping in action. + //[mEditor setGeneralProperty: SCI_SETWRAPMODE parameter: SC_WRAP_WORD value: 0]; +} + +@end + +//-------------------------------------------------------------------------------------------------- + |